Open demo

CSS code

HTML
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
  <symbol id="neu-i-power" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v8"/><path d="M6.3 6.8a8 8 0 1 0 11.4 0"/></symbol>
  <symbol id="neu-i-plus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></symbol>
  <symbol id="neu-i-sliders" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h10M18 7h2M4 17h4M12 17h8"/><circle cx="16" cy="7" r="2"/><circle cx="10" cy="17" r="2"/></symbol>
  <symbol id="neu-i-phone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 4h3.3l1.7 4.4-2.2 1.4a10.5 10.5 0 0 0 5.9 5.9l1.4-2.2 4.4 1.7v3.3a1.5 1.5 0 0 1-1.6 1.5A15.5 15.5 0 0 1 4 5.6 1.5 1.5 0 0 1 5.5 4z"/></symbol>
  <symbol id="neu-i-message" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 0 1-12.4 7.5L3.5 20.5l1-4.4A8.5 8.5 0 1 1 20.5 12z"/></symbol>
  <symbol id="neu-i-more" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h.01M12 12h.01M19 12h.01" stroke-width="3"/></symbol>
  <symbol id="neu-i-wifi" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0"/><path d="M5.5 12.5a9.5 9.5 0 0 1 13 0"/><path d="M8.6 15.9a5 5 0 0 1 6.8 0"/><path d="M12 19.5h.01"/></symbol>
  <symbol id="neu-i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z"/></symbol>
  <symbol id="neu-i-leaf" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 20c0-9 5.5-14 15-15-.5 9.5-6 15-15 15z"/><path d="M5 20c3.5-4.5 6.5-7 10-8.5"/></symbol>
  <symbol id="neu-i-bluetooth" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m7 7 10 10-5 4V3l5 4L7 17"/></symbol>
  <symbol id="neu-i-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="6.5"/><path d="m16 16 4.5 4.5"/></symbol>
  <symbol id="neu-i-bolt" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3 5 13.5h6L10 21l8-10.5h-6z"/></symbol>
  <symbol id="neu-i-thermo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 14.5V5.5a2 2 0 0 0-4 0v9a4 4 0 1 0 4 0z"/><path d="M12 9.5V16"/></symbol>
  <symbol id="neu-i-arrowDown" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M6.5 13.5 12 19l5.5-5.5"/></symbol>
  <symbol id="neu-i-drop" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5s6 6.6 6 11a6 6 0 0 1-12 0c0-4.4 6-11 6-11z"/></symbol>
  <symbol id="neu-i-play" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" d="M8 5.2v13.6L19 12z"/></symbol>
  <symbol id="neu-i-pause" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" stroke="none" d="M7 5h3.6v14H7zM13.4 5H17v14h-3.6z"/></symbol>
</svg>
<section><span class="lbl">Buttons and icon buttons</span><div class="neu-cluster">
<button class="neu-btn neu-btn--accent" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-power"/></svg>Run Evening scene</button>
<button class="neu-btn" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-plus"/></svg>Add device</button>
<button class="neu-btn neu-btn--sm" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Adjust</button>
<button class="neu-btn neu-btn--icon" type="button" aria-label="Call the front door"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-phone"/></svg></button>
<button class="neu-btn neu-btn--icon" type="button" aria-label="Message household"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-message"/></svg></button>
<button class="neu-btn neu-btn--icon neu-btn--square" type="button" aria-label="More options"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-more"/></svg></button>
</div></section>
<section><span class="lbl">Quick toggles · on means pressed in, accent and the word On</span><div class="neu-tiles">
<label class="neu-toggle"><input class="neu-sr" type="checkbox" checked><span class="neu-toggle__face"><span class="neu-toggle__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-wifi"/></svg></span><span class="neu-toggle__name">Wi-Fi</span><span class="neu-toggle__state" aria-hidden="true"></span></span></label>
<label class="neu-toggle"><input class="neu-sr" type="checkbox" checked><span class="neu-toggle__face"><span class="neu-toggle__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-moon"/></svg></span><span class="neu-toggle__name">Night mode</span><span class="neu-toggle__state" aria-hidden="true"></span></span></label>
<label class="neu-toggle"><input class="neu-sr" type="checkbox"><span class="neu-toggle__face"><span class="neu-toggle__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-leaf"/></svg></span><span class="neu-toggle__name">Eco mode</span><span class="neu-toggle__state" aria-hidden="true"></span></span></label>
<label class="neu-toggle"><input class="neu-sr" type="checkbox"><span class="neu-toggle__face"><span class="neu-toggle__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bluetooth"/></svg></span><span class="neu-toggle__name">Bluetooth</span><span class="neu-toggle__state" aria-hidden="true"></span></span></label>
</div></section>
<div class="two">
<div class="col">
<section><span class="lbl">Switches</span><div class="neu-card"><div class="neu-stack">
<label class="neu-switch"><input class="neu-sr" type="checkbox" role="switch" checked><span class="neu-switch__text">Reading lamp<small>Warm white, 40%</small></span><span class="neu-switch__state" aria-hidden="true"></span><span class="neu-switch__track" aria-hidden="true"></span></label>
<label class="neu-switch"><input class="neu-sr" type="checkbox" role="switch"><span class="neu-switch__text">Floor heating<small>Bathroom, until 07:30</small></span><span class="neu-switch__state" aria-hidden="true"></span><span class="neu-switch__track" aria-hidden="true"></span></label>
<label class="neu-switch"><input class="neu-sr" type="checkbox" role="switch" checked><span class="neu-switch__text">Night camera<small>Garden, infrared</small></span><span class="neu-switch__state" aria-hidden="true"></span><span class="neu-switch__track" aria-hidden="true"></span></label>
</div></div></section>
<section><span class="lbl">Field and segmented control</span><div class="neu-stack"><div class="neu-field"><label class="neu-label" for="d-search">Find a device</label><div class="neu-control neu-control--icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg><input class="neu-input" id="d-search" type="search" placeholder="Lamp, lock, speaker…"></div></div><fieldset class="neu-seg"><legend class="neu-seg__legend">Fan speed</legend><div class="neu-seg__opts"><label class="neu-seg__opt"><input class="neu-sr" type="radio" name="dk-fan" value="low" checked><span>Low</span></label><label class="neu-seg__opt"><input class="neu-sr" type="radio" name="dk-fan" value="medium"><span>Medium</span></label><label class="neu-seg__opt"><input class="neu-sr" type="radio" name="dk-fan" value="high"><span>High</span></label><label class="neu-seg__opt"><input class="neu-sr" type="radio" name="dk-fan" value="auto"><span>Auto</span></label></div></fieldset></div></section>
</div>
<div class="col">
<section><span class="lbl">Stat tiles</span><div class="pair">
<article class="neu-stat"><span class="neu-stat__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><p class="neu-stat__label">Energy tonight</p><p class="neu-stat__value">3.1<small> kWh</small></p><p class="neu-stat__delta neu-stat__delta--good"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-arrowDown"/></svg>14% less than usual</p></article>
<article class="neu-stat"><span class="neu-stat__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><p class="neu-stat__label">Bedroom</p><p class="neu-stat__value">19.0<small> °C</small></p><p class="neu-stat__delta"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg>Humidity 51%</p></article>
</div></section>
<section><span class="lbl">Mini player</span><div class="neu-mini"><span class="neu-mini__art" aria-hidden="true"></span><div class="neu-mini__meta"><p class="neu-mini__title">Night Swim</p><p class="neu-mini__artist">Odile Varga · Bedroom speaker</p><div class="neu-mini__bar" style="--p:64%" role="progressbar" aria-label="Track position" aria-valuenow="64" aria-valuemin="0" aria-valuemax="100"></div></div><label class="neu-play"><input class="neu-sr" type="checkbox" aria-label="Play Night Swim"><span class="neu-play__face"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-play"/></svg><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-pause"/></svg></span></label></div></section>
<section><span class="lbl">Progress ring</span><div class="ringrow"><figure class="neu-ring-fig"><div class="neu-ring" style="--p:72;--size:120px" role="progressbar" aria-label="Robot vacuum" aria-valuenow="72" aria-valuemin="0" aria-valuemax="100"><span class="neu-ring__arc"></span><span class="neu-ring__core">72%</span></div><figcaption class="neu-ring-cap">Robot vacuum<small>72% charged, docked</small></figcaption></figure><figure class="neu-ring-fig"><div class="neu-ring" style="--p:35;--size:120px" role="progressbar" aria-label="Pellet hopper" aria-valuenow="35" aria-valuemin="0" aria-valuemax="100"><span class="neu-ring__arc"></span><span class="neu-ring__core">35%</span></div><figcaption class="neu-ring-cap">Pellet hopper<small>Refill by Sunday</small></figcaption></figure></div></section>
</div>
</div>
CSS
/* ── Neumorphism UI kit tokens (uiCookies) — identical in every set ──────────────
   Every component is moulded from --neu-bg and lit from the top left. Change a token and
   the whole kit follows; the shadow recipes below are built from these values. */
:root{
  --neu-bg:#e0e5ec;          /* the one surface colour */
  --neu-light:#ffffff;       /* highlight, top left */
  --neu-dark:#a3b1c6;        /* shade, bottom right */
  --neu-distance:6px;        /* how far a shape rises */
  --neu-blur:14px;           /* how soft its shadow is */
  --neu-radius:18px;         /* cards; buttons use .75 of it, fields .6 */
  --neu-accent:#4f46e5;      /* focus ring and on / selected / current states, 4.9:1 on --neu-bg */
  --neu-on-accent:#ffffff;   /* text and marks on accent fills, 6.3:1 */
  --neu-ink:#1f2937;         /* text, 11.6:1 */
  --neu-muted:#4a5568;       /* secondary text, 5.9:1 */
  --neu-edge:#74819a;        /* control boundary (fields, tracks, boxes, buttons), 3.1:1 */
  --neu-line:rgba(255,255,255,.6); /* decorative edge on cards and panels */
  --neu-bw:1px;              /* control border width */
  --neu-success:#126b35;--neu-warning:#8a5300;--neu-danger:#b42318;
}
/* Dark neumorphism: data-neu="dark" on any wrapper, or a checked .neu-theme-input inside a [data-neu] element.
   :is() is a forgiving list, so browsers without :has() still apply data-neu="dark" */
[data-neu]:is([data-neu="dark"],:has(.neu-theme-input:checked)){
  --neu-bg:#262b33;--neu-light:#323944;--neu-dark:#14171c;
  --neu-accent:#8f88ff;--neu-on-accent:#14161b;--neu-ink:#e7ebf2;--neu-muted:#aab4c3;--neu-edge:#717d90;
  --neu-line:rgba(255,255,255,.06);--neu-success:#6fdc9a;--neu-warning:#f3c164;--neu-danger:#ff8f84;color-scheme:dark}
/* More contrast requested: the soft shadows go, every control and panel gets a solid outline */
@media (prefers-contrast:more){:root,[data-neu]:is([data-neu],:has(.neu-theme-input:checked)){
  --neu-light:transparent;--neu-dark:transparent;--neu-edge:var(--neu-ink);--neu-line:var(--neu-ink);--neu-muted:var(--neu-ink);--neu-bw:2px}}
:root,[data-neu]{
  --neu-raised:var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-dark),calc(var(--neu-distance)*-1) calc(var(--neu-distance)*-1) var(--neu-blur) var(--neu-light);
  --neu-raised-sm:calc(var(--neu-distance)*.5) calc(var(--neu-distance)*.5) calc(var(--neu-blur)*.5) var(--neu-dark),calc(var(--neu-distance)*-.5) calc(var(--neu-distance)*-.5) calc(var(--neu-blur)*.5) var(--neu-light);
  --neu-inset:inset calc(var(--neu-distance)*.6) calc(var(--neu-distance)*.6) calc(var(--neu-blur)*.6) var(--neu-dark),inset calc(var(--neu-distance)*-.6) calc(var(--neu-distance)*-.6) calc(var(--neu-blur)*.6) var(--neu-light);
  --neu-inset-sm:inset calc(var(--neu-distance)*.35) calc(var(--neu-distance)*.35) calc(var(--neu-blur)*.35) var(--neu-dark),inset calc(var(--neu-distance)*-.35) calc(var(--neu-distance)*-.35) calc(var(--neu-blur)*.35) var(--neu-light);
}
[data-neu]{background:var(--neu-bg);color:var(--neu-ink)}
/* Components */
:where([class*="neu-"]),:where([class*="neu-"])::before,:where([class*="neu-"])::after{box-sizing:border-box}
.neu-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.neu-ico{width:20px;height:20px;flex:none}
/* Buttons: raised by default, pressed (inset) while held, accent ring on keyboard focus */
.neu-btn{display:inline-flex;align-items:center;justify-content:center;gap:.55rem;min-height:46px;padding:.65rem 1.35rem;
  border:var(--neu-bw) solid var(--neu-edge);border-radius:calc(var(--neu-radius)*.75);background:var(--neu-bg);color:var(--neu-ink);
  font-family:inherit;font-size:.95rem;font-weight:600;line-height:1.2;text-decoration:none;cursor:pointer;
  box-shadow:var(--neu-raised-sm);transition:box-shadow .2s,color .2s,background-color .2s}
.neu-btn:hover{box-shadow:var(--neu-raised)}
.neu-btn:active{box-shadow:var(--neu-inset-sm)}
.neu-btn:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-btn--accent{background:var(--neu-accent);border-color:var(--neu-accent);color:var(--neu-on-accent)}
.neu-btn--sm{min-height:38px;padding:.45rem 1rem;font-size:.85rem}
.neu-btn--block{width:100%}
.neu-btn--icon{width:50px;height:50px;min-height:0;padding:0;border-radius:50%}
.neu-btn--square{border-radius:calc(var(--neu-radius)*.75)}
.neu-btn--icon-sm{width:42px;height:42px}
.neu-btn--icon-lg{width:64px;height:64px}
.neu-btn--icon .neu-ico{width:22px;height:22px}
/* Toggle tiles: a visually hidden checkbox and a face. On = pressed in (inset), accent border,
   accent icon, a filled dot and the word On — never colour alone. */
.neu-toggle{position:relative;display:inline-flex;cursor:pointer}
.neu-toggle__face{display:flex;flex-direction:column;align-items:flex-start;gap:.4rem;width:100%;min-width:132px;padding:1rem 1.1rem;
  border:var(--neu-bw) solid var(--neu-edge);border-radius:var(--neu-radius);background:var(--neu-bg);color:var(--neu-ink);
  box-shadow:var(--neu-raised-sm);transition:box-shadow .25s,border-color .25s}
.neu-toggle__icon{display:grid;place-items:center;width:42px;height:42px;margin-bottom:.35rem;border-radius:50%;color:var(--neu-muted);box-shadow:var(--neu-inset-sm);transition:color .25s,background-color .25s}
.neu-toggle__icon .neu-ico{width:22px;height:22px}
.neu-toggle__name{font-weight:600;line-height:1.25}
.neu-toggle__state{display:flex;align-items:center;gap:.4rem;font-size:.8rem;font-weight:600;color:var(--neu-muted)}
.neu-toggle__state::before{content:"";width:9px;height:9px;border:2px solid currentColor;border-radius:50%}
.neu-toggle__state::after{content:"Off"}
.neu-toggle input:checked+.neu-toggle__face{box-shadow:var(--neu-inset);border-color:var(--neu-accent)}
.neu-toggle input:checked+.neu-toggle__face .neu-toggle__icon{color:var(--neu-on-accent);background:var(--neu-accent)}
.neu-toggle input:checked+.neu-toggle__face .neu-toggle__state{color:var(--neu-accent)}
.neu-toggle input:checked+.neu-toggle__face .neu-toggle__state::before{background:currentColor}
.neu-toggle input:checked+.neu-toggle__face .neu-toggle__state::after{content:"On"}
.neu-toggle input:focus-visible+.neu-toggle__face{outline:3px solid var(--neu-accent);outline-offset:3px}
/* Switches: a checkbox with role="switch". On = knob travels right, track fills with accent and the word On appears */
.neu-switch{position:relative;display:flex;align-items:center;gap:.9rem;cursor:pointer}
.neu-switch__text{flex:1;min-width:0;font-weight:600;line-height:1.3}
.neu-switch__text small{display:block;margin-top:.15rem;font-size:.82rem;font-weight:400;color:var(--neu-muted)}
.neu-switch__state{min-width:2.1em;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-align:right;text-transform:uppercase;color:var(--neu-muted)}
.neu-switch__state::after{content:"Off"}
.neu-switch__track{position:relative;flex:none;width:58px;height:32px;border:var(--neu-bw) solid var(--neu-edge);border-radius:999px;
  background:var(--neu-bg);box-shadow:var(--neu-inset-sm);transition:background-color .25s,border-color .25s}
.neu-switch__track::before{content:"";position:absolute;top:50%;left:3px;width:24px;height:24px;margin-top:-12px;border-radius:50%;
  border:var(--neu-bw) solid var(--neu-edge);background:var(--neu-bg);box-shadow:var(--neu-raised-sm);transition:transform .25s,background-color .25s}
.neu-switch input:checked~.neu-switch__track{background:var(--neu-accent);border-color:var(--neu-accent)}
.neu-switch input:checked~.neu-switch__track::before{transform:translateX(calc(28px - 2*var(--neu-bw)));background:var(--neu-on-accent);border-color:var(--neu-on-accent)}
.neu-switch input:checked~.neu-switch__state{color:var(--neu-accent)}
.neu-switch input:checked~.neu-switch__state::after{content:"On"}
.neu-switch input:focus-visible~.neu-switch__track{outline:3px solid var(--neu-accent);outline-offset:3px}
/* Segmented control: radios in a fieldset. The chosen option rises out of the well, turns accent and gains a dot */
.neu-seg{min-width:0;margin:0;padding:0;border:0}
.neu-seg__legend{margin-bottom:.6rem;padding:0;font-size:.88rem;font-weight:600}
.neu-seg__opts{display:flex;flex-wrap:wrap;gap:6px;padding:6px;border:var(--neu-bw) solid var(--neu-edge);border-radius:calc(var(--neu-radius)*.75);box-shadow:var(--neu-inset-sm)}
.neu-seg__opt{position:relative;flex:1 1 auto}
.neu-seg__opt span{display:flex;align-items:center;justify-content:center;gap:.4rem;min-height:40px;padding:.4rem .9rem;border:var(--neu-bw) solid transparent;
  border-radius:calc(var(--neu-radius)*.5);color:var(--neu-muted);font-size:.9rem;font-weight:600;cursor:pointer;transition:box-shadow .2s,color .2s}
.neu-seg__opt input:checked+span{border-color:var(--neu-accent);color:var(--neu-accent);box-shadow:var(--neu-raised-sm)}
.neu-seg__opt input:checked+span::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.neu-seg__opt input:focus-visible+span{outline:3px solid var(--neu-accent);outline-offset:2px}
/* Card: a raised panel with a faint highlight edge (a solid outline under prefers-contrast: more) */
.neu-card{padding:1.5rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);color:var(--neu-ink);box-shadow:var(--neu-raised)}
.neu-card h2,.neu-card h3,.neu-card p{margin:0}
/* Fields: pressed-in wells with a 3:1 edge. Focus adds the accent ring; errors add a red edge AND a message with an icon */
.neu-field{display:grid;gap:.45rem;min-width:0}
.neu-label{font-size:.88rem;font-weight:600;color:var(--neu-ink)}
.neu-input,.neu-select{display:block;width:100%;min-height:48px;margin:0;padding:.7rem 1rem;border:var(--neu-bw) solid var(--neu-edge);
  border-radius:calc(var(--neu-radius)*.6);background:var(--neu-bg);color:var(--neu-ink);font-family:inherit;font-size:1rem;line-height:1.4;box-shadow:var(--neu-inset-sm)}
.neu-input::placeholder{color:var(--neu-muted);opacity:1}
.neu-input:focus,.neu-select:focus{outline:3px solid var(--neu-accent);outline-offset:2px}
.neu-input[aria-invalid="true"]{border-color:var(--neu-danger);border-width:2px}
.neu-help{margin:0;font-size:.82rem;color:var(--neu-muted)}
.neu-help--error{display:flex;align-items:center;gap:.4rem;font-weight:600;color:var(--neu-danger)}
.neu-help .neu-ico{width:16px;height:16px}
.neu-control{position:relative}
.neu-control>.neu-ico{position:absolute;top:50%;left:1rem;margin-top:-10px;color:var(--neu-muted);pointer-events:none}
.neu-control--icon .neu-input{padding-left:2.9rem}
.neu-control--select>.neu-ico{left:auto;right:1rem}
.neu-select{appearance:none;padding-right:2.9rem;cursor:pointer}
/* Stat tile: icon in a pressed well, label, a big value, and a change line that says which way in words */
.neu-stat{display:grid;gap:.2rem;padding:1.25rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-stat__icon{display:grid;place-items:center;width:44px;height:44px;margin-bottom:.6rem;border-radius:50%;color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-stat__label{margin:0;font-size:.85rem;font-weight:600;color:var(--neu-muted)}
.neu-stat__value{margin:0;font-size:1.9rem;font-weight:700;line-height:1.15;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.neu-stat__value small{font-size:.9rem;font-weight:600;letter-spacing:0;color:var(--neu-muted)}
.neu-stat__delta{display:flex;align-items:center;gap:.3rem;margin:.35rem 0 0;font-size:.82rem;font-weight:600;color:var(--neu-muted)}
.neu-stat__delta .neu-ico{width:16px;height:16px}
.neu-stat__delta--good{color:var(--neu-success)}
.neu-stat__delta--warn{color:var(--neu-warning)}
/* Mini player: art in a pressed well, title, a progress groove, and a play / pause toggle (checkbox) */
.neu-mini{display:flex;align-items:center;gap:1rem;padding:1rem 1.1rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-mini__art{flex:none;width:52px;height:52px;border-radius:calc(var(--neu-radius)*.6);box-shadow:var(--neu-inset-sm);
  background:radial-gradient(circle at 30% 30%,#f59e0b 0 18%,transparent 19%),linear-gradient(160deg,#4f46e5,#0e7490)}
.neu-mini__meta{flex:1;min-width:0}
.neu-mini__title{margin:0;font-weight:700;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.neu-mini__artist{margin:0;font-size:.82rem;color:var(--neu-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.neu-mini__bar{height:8px;margin-top:.55rem;border:var(--neu-bw) solid var(--neu-edge);border-radius:999px;box-shadow:var(--neu-inset-sm);
  background:linear-gradient(var(--neu-accent),var(--neu-accent)) 0 0/var(--p,40%) 100% no-repeat}
.neu-play{position:relative;flex:none;display:inline-flex}
.neu-play__face{display:grid;place-items:center;width:52px;height:52px;border:var(--neu-bw) solid var(--neu-accent);border-radius:50%;
  background:var(--neu-accent);color:var(--neu-on-accent);box-shadow:var(--neu-raised-sm);cursor:pointer;transition:box-shadow .2s}
.neu-play__face .neu-ico{width:24px;height:24px}
.neu-play__face .neu-ico+.neu-ico,.neu-play input:checked+.neu-play__face .neu-ico:first-child{display:none}
.neu-play input:checked+.neu-play__face .neu-ico+.neu-ico{display:block}
.neu-play input:checked+.neu-play__face{box-shadow:var(--neu-inset-sm)}
.neu-play input:focus-visible+.neu-play__face{outline:3px solid var(--neu-accent);outline-offset:3px}
/* Progress ring: role="progressbar"; a conic-gradient arc in a pressed groove around a raised core */
.neu-ring{--p:0;--size:128px;position:relative;display:grid;place-items:center;width:var(--size);aspect-ratio:1;border:var(--neu-bw) solid var(--neu-line);border-radius:50%;background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-ring__arc{position:absolute;inset:10px;border-radius:50%;box-shadow:var(--neu-inset-sm);
  background:conic-gradient(var(--neu-accent) calc(var(--p)*1%),transparent 0);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 12px),#000 calc(100% - 11.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 12px),#000 calc(100% - 11.5px))}
.neu-ring__core{position:relative;display:grid;place-items:center;width:calc(var(--size) - 58px);aspect-ratio:1;border-radius:50%;box-shadow:var(--neu-raised-sm);
  font-size:1.15rem;font-weight:700;font-variant-numeric:tabular-nums}
.neu-ring-cap{margin:.9rem 0 0;font-size:.88rem;font-weight:600;text-align:center}
.neu-ring-cap small{display:block;font-size:.8rem;font-weight:400;color:var(--neu-muted)}
.neu-ring-fig{display:grid;justify-items:center;margin:0}
.neu-cluster{display:flex;flex-wrap:wrap;align-items:center;gap:18px}
.neu-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:20px}
.neu-stack{display:grid;gap:1.35rem}
@media (prefers-reduced-motion:reduce){.neu-btn,.neu-toggle__face,.neu-toggle__icon,.neu-switch__track,.neu-switch__track::before,.neu-seg__opt span,.neu-play__face{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
  <symbol id="neu-i-power" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v8"/><path d="M6.3 6.8a8 8 0 1 0 11.4 0"/></symbol>
  <symbol id="neu-i-plus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></symbol>
  <symbol id="neu-i-sliders" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h10M18 7h2M4 17h4M12 17h8"/><circle cx="16" cy="7" r="2"/><circle cx="10" cy="17" r="2"/></symbol>
  <symbol id="neu-i-phone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 4h3.3l1.7 4.4-2.2 1.4a10.5 10.5 0 0 0 5.9 5.9l1.4-2.2 4.4 1.7v3.3a1.5 1.5 0 0 1-1.6 1.5A15.5 15.5 0 0 1 4 5.6 1.5 1.5 0 0 1 5.5 4z"/></symbol>
  <symbol id="neu-i-message" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 0 1-12.4 7.5L3.5 20.5l1-4.4A8.5 8.5 0 1 1 20.5 12z"/></symbol>
  <symbol id="neu-i-more" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h.01M12 12h.01M19 12h.01" stroke-width="3"/></symbol>
  <symbol id="neu-i-wifi" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0"/><path d="M5.5 12.5a9.5 9.5 0 0 1 13 0"/><path d="M8.6 15.9a5 5 0 0 1 6.8 0"/><path d="M12 19.5h.01"/></symbol>
  <symbol id="neu-i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z"/></symbol>
  <symbol id="neu-i-leaf" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 20c0-9 5.5-14 15-15-.5 9.5-6 15-15 15z"/><path d="M5 20c3.5-4.5 6.5-7 10-8.5"/></symbol>
  <symbol id="neu-i-bluetooth" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m7 7 10 10-5 4V3l5 4L7 17"/></symbol>
  <symbol id="neu-i-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="6.5"/><path d="m16 16 4.5 4.5"/></symbol>
  <symbol id="neu-i-bolt" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3 5 13.5h6L10 21l8-10.5h-6z"/></symbol>
  <symbol id="neu-i-thermo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 14.5V5.5a2 2 0 0 0-4 0v9a4 4 0 1 0 4 0z"/><path d="M12 9.5V16"/></symbol>
  <symbol id="neu-i-arrowDown" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M6.5 13.5 12 19l5.5-5.5"/></symbol>
  <symbol id="neu-i-drop" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5s6 6.6 6 11a6 6 0 0 1-12 0c0-4.4 6-11 6-11z"/></symbol>
  <symbol id="neu-i-play" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" d="M8 5.2v13.6L19 12z"/></symbol>
  <symbol id="neu-i-pause" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" stroke="none" d="M7 5h3.6v14H7zM13.4 5H17v14h-3.6z"/></symbol>
</svg>
<section><span class="lbl">Buttons and icon buttons</span><div class="d-flex flex-wrap align-items-center gap-3">
<button class="btn btn-neu btn-neu-accent" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-power"/></svg>Run Evening scene</button>
<button class="btn btn-neu" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-plus"/></svg>Add device</button>
<button class="btn btn-neu btn-sm" type="button"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Adjust</button>
<button class="btn btn-neu btn-neu-icon" type="button" aria-label="Call the front door"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-phone"/></svg></button>
<button class="btn btn-neu btn-neu-icon" type="button" aria-label="Message household"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-message"/></svg></button>
<button class="btn btn-neu btn-neu-icon btn-neu-square" type="button" aria-label="More options"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-more"/></svg></button>
</div></section>
<section><span class="lbl">Quick toggles · on means pressed in, accent and the word On</span><div class="row row-cols-2 row-cols-md-4 g-4">
<div class="col"><input class="btn-check" type="checkbox" id="dk-wifi" checked autocomplete="off"><label class="btn btn-neu btn-neu-tile" for="dk-wifi"><span class="neu-tile-icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-wifi"/></svg></span><span class="neu-tile-name">Wi-Fi</span><span class="neu-tile-state" aria-hidden="true"></span></label></div>
<div class="col"><input class="btn-check" type="checkbox" id="dk-night" checked autocomplete="off"><label class="btn btn-neu btn-neu-tile" for="dk-night"><span class="neu-tile-icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-moon"/></svg></span><span class="neu-tile-name">Night mode</span><span class="neu-tile-state" aria-hidden="true"></span></label></div>
<div class="col"><input class="btn-check" type="checkbox" id="dk-eco" autocomplete="off"><label class="btn btn-neu btn-neu-tile" for="dk-eco"><span class="neu-tile-icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-leaf"/></svg></span><span class="neu-tile-name">Eco mode</span><span class="neu-tile-state" aria-hidden="true"></span></label></div>
<div class="col"><input class="btn-check" type="checkbox" id="dk-bt" autocomplete="off"><label class="btn btn-neu btn-neu-tile" for="dk-bt"><span class="neu-tile-icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bluetooth"/></svg></span><span class="neu-tile-name">Bluetooth</span><span class="neu-tile-state" aria-hidden="true"></span></label></div>
</div></section>
<div class="two">
<div class="col">
<section><span class="lbl">Switches</span><div class="card neu-card card-body"><div class="neu-stack">
<div class="form-check form-switch neu-switch"><input class="form-check-input" type="checkbox" role="switch" id="dk-lamp" checked><label class="form-check-label" for="dk-lamp">Reading lamp<small>Warm white, 40%</small></label><span class="neu-switch-state" aria-hidden="true"></span></div>
<div class="form-check form-switch neu-switch"><input class="form-check-input" type="checkbox" role="switch" id="dk-heat"><label class="form-check-label" for="dk-heat">Floor heating<small>Bathroom, until 07:30</small></label><span class="neu-switch-state" aria-hidden="true"></span></div>
<div class="form-check form-switch neu-switch"><input class="form-check-input" type="checkbox" role="switch" id="dk-cam" checked><label class="form-check-label" for="dk-cam">Night camera<small>Garden, infrared</small></label><span class="neu-switch-state" aria-hidden="true"></span></div>
</div></div></section>
<section><span class="lbl">Field and segmented control</span><div class="neu-stack"><div class="neu-form"><label class="form-label" for="d-search">Find a device</label><div class="position-relative"><svg class="neu-ico neu-control-icon" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg><input class="form-control ps-neu" id="d-search" type="search" placeholder="Lamp, lock, speaker…"></div></div><fieldset class="neu-seg"><legend class="">Fan speed</legend><div class="btn-group"><input class="btn-check" type="radio" name="dk-fan" id="dk-fan-low" value="low" checked autocomplete="off"><label class="btn" for="dk-fan-low">Low</label><input class="btn-check" type="radio" name="dk-fan" id="dk-fan-medium" value="medium" autocomplete="off"><label class="btn" for="dk-fan-medium">Medium</label><input class="btn-check" type="radio" name="dk-fan" id="dk-fan-high" value="high" autocomplete="off"><label class="btn" for="dk-fan-high">High</label><input class="btn-check" type="radio" name="dk-fan" id="dk-fan-auto" value="auto" autocomplete="off"><label class="btn" for="dk-fan-auto">Auto</label></div></fieldset></div></section>
</div>
<div class="col">
<section><span class="lbl">Stat tiles</span><div class="pair">
<article class="neu-stat"><span class="neu-stat__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><p class="neu-stat__label">Energy tonight</p><p class="neu-stat__value">3.1<small> kWh</small></p><p class="neu-stat__delta neu-stat__delta--good"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-arrowDown"/></svg>14% less than usual</p></article>
<article class="neu-stat"><span class="neu-stat__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><p class="neu-stat__label">Bedroom</p><p class="neu-stat__value">19.0<small> °C</small></p><p class="neu-stat__delta"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg>Humidity 51%</p></article>
</div></section>
<section><span class="lbl">Mini player</span><div class="neu-mini"><span class="neu-mini__art" aria-hidden="true"></span><div class="neu-mini__meta"><p class="neu-mini__title">Night Swim</p><p class="neu-mini__artist">Odile Varga · Bedroom speaker</p><div class="neu-mini__bar" style="--p:64%" role="progressbar" aria-label="Track position" aria-valuenow="64" aria-valuemin="0" aria-valuemax="100"></div></div><label class="neu-play"><input class="visually-hidden" type="checkbox" aria-label="Play Night Swim"><span class="neu-play__face"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-play"/></svg><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-pause"/></svg></span></label></div></section>
<section><span class="lbl">Progress ring</span><div class="ringrow"><figure class="neu-ring-fig"><div class="neu-ring" style="--p:72;--size:120px" role="progressbar" aria-label="Robot vacuum" aria-valuenow="72" aria-valuemin="0" aria-valuemax="100"><span class="neu-ring__arc"></span><span class="neu-ring__core">72%</span></div><figcaption class="neu-ring-cap">Robot vacuum<small>72% charged, docked</small></figcaption></figure><figure class="neu-ring-fig"><div class="neu-ring" style="--p:35;--size:120px" role="progressbar" aria-label="Pellet hopper" aria-valuenow="35" aria-valuemin="0" aria-valuemax="100"><span class="neu-ring__arc"></span><span class="neu-ring__core">35%</span></div><figcaption class="neu-ring-cap">Pellet hopper<small>Refill by Sunday</small></figcaption></figure></div></section>
</div>
</div>
CSS
/* ── Neumorphism UI kit tokens (uiCookies) — identical in every set ──────────────
   Every component is moulded from --neu-bg and lit from the top left. Change a token and
   the whole kit follows; the shadow recipes below are built from these values. */
:root{
  --neu-bg:#e0e5ec;          /* the one surface colour */
  --neu-light:#ffffff;       /* highlight, top left */
  --neu-dark:#a3b1c6;        /* shade, bottom right */
  --neu-distance:6px;        /* how far a shape rises */
  --neu-blur:14px;           /* how soft its shadow is */
  --neu-radius:18px;         /* cards; buttons use .75 of it, fields .6 */
  --neu-accent:#4f46e5;      /* focus ring and on / selected / current states, 4.9:1 on --neu-bg */
  --neu-on-accent:#ffffff;   /* text and marks on accent fills, 6.3:1 */
  --neu-ink:#1f2937;         /* text, 11.6:1 */
  --neu-muted:#4a5568;       /* secondary text, 5.9:1 */
  --neu-edge:#74819a;        /* control boundary (fields, tracks, boxes, buttons), 3.1:1 */
  --neu-line:rgba(255,255,255,.6); /* decorative edge on cards and panels */
  --neu-bw:1px;              /* control border width */
  --neu-success:#126b35;--neu-warning:#8a5300;--neu-danger:#b42318;
}
/* Dark neumorphism: data-neu="dark" on any wrapper, or a checked .neu-theme-input inside a [data-neu] element.
   :is() is a forgiving list, so browsers without :has() still apply data-neu="dark" */
[data-neu]:is([data-neu="dark"],:has(.neu-theme-input:checked)){
  --neu-bg:#262b33;--neu-light:#323944;--neu-dark:#14171c;
  --neu-accent:#8f88ff;--neu-on-accent:#14161b;--neu-ink:#e7ebf2;--neu-muted:#aab4c3;--neu-edge:#717d90;
  --neu-line:rgba(255,255,255,.06);--neu-success:#6fdc9a;--neu-warning:#f3c164;--neu-danger:#ff8f84;color-scheme:dark}
/* More contrast requested: the soft shadows go, every control and panel gets a solid outline */
@media (prefers-contrast:more){:root,[data-neu]:is([data-neu],:has(.neu-theme-input:checked)){
  --neu-light:transparent;--neu-dark:transparent;--neu-edge:var(--neu-ink);--neu-line:var(--neu-ink);--neu-muted:var(--neu-ink);--neu-bw:2px}}
:root,[data-neu]{
  --neu-raised:var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-dark),calc(var(--neu-distance)*-1) calc(var(--neu-distance)*-1) var(--neu-blur) var(--neu-light);
  --neu-raised-sm:calc(var(--neu-distance)*.5) calc(var(--neu-distance)*.5) calc(var(--neu-blur)*.5) var(--neu-dark),calc(var(--neu-distance)*-.5) calc(var(--neu-distance)*-.5) calc(var(--neu-blur)*.5) var(--neu-light);
  --neu-inset:inset calc(var(--neu-distance)*.6) calc(var(--neu-distance)*.6) calc(var(--neu-blur)*.6) var(--neu-dark),inset calc(var(--neu-distance)*-.6) calc(var(--neu-distance)*-.6) calc(var(--neu-blur)*.6) var(--neu-light);
  --neu-inset-sm:inset calc(var(--neu-distance)*.35) calc(var(--neu-distance)*.35) calc(var(--neu-blur)*.35) var(--neu-dark),inset calc(var(--neu-distance)*-.35) calc(var(--neu-distance)*-.35) calc(var(--neu-blur)*.35) var(--neu-light);
}
[data-neu]{background:var(--neu-bg);color:var(--neu-ink)}
/* Bootstrap's own variables mapped onto the kit tokens */
:root,[data-neu]{--bs-body-bg:var(--neu-bg);--bs-body-color:var(--neu-ink);--bs-emphasis-color:var(--neu-ink);
  --bs-heading-color:var(--neu-ink);--bs-secondary-color:var(--neu-muted);--bs-tertiary-color:var(--neu-muted);
  --bs-border-color:var(--neu-edge);--bs-border-width:var(--neu-bw);--bs-border-radius:calc(var(--neu-radius)*.6);
  --bs-border-radius-lg:var(--neu-radius);--bs-focus-ring-color:var(--neu-accent)}
/* Components */
.neu-ico{width:20px;height:20px;flex:none}
/* Buttons: Bootstrap .btn with a .btn-neu variant set through --bs-btn-* variables */
.btn-neu{--bs-btn-padding-x:1.35rem;--bs-btn-padding-y:.65rem;--bs-btn-font-size:.95rem;--bs-btn-font-weight:600;--bs-btn-line-height:1.2;
  --bs-btn-border-width:var(--neu-bw);--bs-btn-border-radius:calc(var(--neu-radius)*.75);
  --bs-btn-bg:var(--neu-bg);--bs-btn-color:var(--neu-ink);--bs-btn-border-color:var(--neu-edge);
  --bs-btn-hover-bg:var(--neu-bg);--bs-btn-hover-color:var(--neu-ink);--bs-btn-hover-border-color:var(--neu-edge);
  --bs-btn-active-bg:var(--neu-bg);--bs-btn-active-color:var(--neu-ink);--bs-btn-active-border-color:var(--neu-edge);
  --neu-btn-shadow:var(--neu-raised-sm);
  display:inline-flex;align-items:center;justify-content:center;gap:.55rem;min-height:46px;
  box-shadow:var(--neu-btn-shadow);transition:box-shadow .2s,color .2s,background-color .2s}
.btn-neu:hover{--neu-btn-shadow:var(--neu-raised)}
.btn-neu:active{--neu-btn-shadow:var(--neu-inset-sm)}
.btn-neu:focus-visible,.btn-check:focus-visible+.btn-neu{box-shadow:var(--neu-btn-shadow);outline:3px solid var(--neu-accent);outline-offset:3px}
.btn-neu-accent{--bs-btn-bg:var(--neu-accent);--bs-btn-color:var(--neu-on-accent);--bs-btn-border-color:var(--neu-accent);
  --bs-btn-hover-bg:var(--neu-accent);--bs-btn-hover-color:var(--neu-on-accent);--bs-btn-hover-border-color:var(--neu-accent);
  --bs-btn-active-bg:var(--neu-accent);--bs-btn-active-color:var(--neu-on-accent);--bs-btn-active-border-color:var(--neu-accent)}
.btn-neu.btn-sm{--bs-btn-padding-x:1rem;--bs-btn-padding-y:.45rem;--bs-btn-font-size:.85rem;min-height:38px}
.btn-neu-icon{--bs-btn-padding-x:0;--bs-btn-padding-y:0;width:50px;height:50px;min-height:0;border-radius:50%}
.btn-neu-icon.btn-neu-square{border-radius:calc(var(--neu-radius)*.75)}
.btn-neu-icon-sm{width:42px;height:42px}
.btn-neu-icon-lg{width:64px;height:64px}
.btn-neu-icon .neu-ico{width:22px;height:22px}
/* Toggle tiles: Bootstrap .btn-check + .btn. On = pressed in, accent border and icon, a filled dot and the word On */
.btn-neu-tile{--bs-btn-padding-x:1.1rem;--bs-btn-padding-y:1rem;--bs-btn-border-radius:var(--neu-radius);--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-font-size:1rem;
  --bs-btn-active-color:var(--neu-ink);--bs-btn-active-border-color:var(--neu-accent);
  flex-direction:column;align-items:flex-start;gap:.4rem;width:100%;min-width:132px;text-align:start;transition:box-shadow .25s,border-color .25s}
.btn-neu-tile:hover{--neu-btn-shadow:var(--neu-raised-sm)}
.btn-check:checked+.btn-neu-tile{--neu-btn-shadow:var(--neu-inset)}
.btn-neu-tile .neu-tile-icon{display:grid;place-items:center;width:42px;height:42px;margin-bottom:.35rem;border-radius:50%;color:var(--neu-muted);box-shadow:var(--neu-inset-sm);transition:color .25s,background-color .25s}
.btn-neu-tile .neu-tile-icon .neu-ico{width:22px;height:22px}
.btn-neu-tile .neu-tile-name{font-weight:600;line-height:1.25}
.btn-neu-tile .neu-tile-state{display:flex;align-items:center;gap:.4rem;font-size:.8rem;font-weight:600;color:var(--neu-muted)}
.btn-neu-tile .neu-tile-state::before{content:"";width:9px;height:9px;border:2px solid currentColor;border-radius:50%}
.btn-neu-tile .neu-tile-state::after{content:"Off"}
.btn-check:checked+.btn-neu-tile .neu-tile-icon{color:var(--neu-on-accent);background:var(--neu-accent)}
.btn-check:checked+.btn-neu-tile .neu-tile-state{color:var(--neu-accent)}
.btn-check:checked+.btn-neu-tile .neu-tile-state::before{background:currentColor}
.btn-check:checked+.btn-neu-tile .neu-tile-state::after{content:"On"}
/* Switches: Bootstrap .form-check.form-switch. The knob is a token-coloured radial gradient so it follows light and dark */
.neu-switch{display:flex;align-items:center;gap:.9rem;min-height:0;margin:0;padding:0}
.neu-switch .form-check-label{flex:1;min-width:0;font-weight:600;line-height:1.3;cursor:pointer}
.neu-switch .form-check-label small{display:block;margin-top:.15rem;font-size:.82rem;font-weight:400;color:var(--neu-muted)}
.neu-switch .neu-switch-state{min-width:2.1em;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-align:right;text-transform:uppercase;color:var(--neu-muted)}
.neu-switch .neu-switch-state::after{content:"Off"}
.neu-switch.form-switch .form-check-input,.neu-switch.form-switch .form-check-input:focus,.neu-switch.form-switch .form-check-input:checked{
  --bs-form-switch-bg:radial-gradient(circle at 50% 50%,var(--neu-knob) 0 10.5px,var(--neu-knob-edge) 11px 12px,transparent 12.5px),radial-gradient(circle at 58% 60%,var(--neu-dark) 0 9px,transparent 14px)}
.neu-switch .form-check-input{--neu-knob:var(--neu-bg);--neu-knob-edge:var(--neu-edge);
  order:3;flex:none;float:none;width:58px;height:32px;margin:0;border:var(--neu-bw) solid var(--neu-edge);border-radius:999px;
  background-color:var(--neu-bg);background-size:30px 30px;background-position:left center;cursor:pointer;
  box-shadow:var(--neu-inset-sm);transition:background-position .25s,background-color .25s,border-color .25s}
.neu-switch .form-check-input:focus{border-color:var(--neu-edge);box-shadow:var(--neu-inset-sm)}
.neu-switch .form-check-input:checked{--neu-knob:var(--neu-on-accent);--neu-knob-edge:var(--neu-on-accent);background-color:var(--neu-accent);border-color:var(--neu-accent);background-position:right center}
.neu-switch .form-check-input:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-switch .form-check-input:checked~.neu-switch-state{color:var(--neu-accent)}
.neu-switch .form-check-input:checked~.neu-switch-state::after{content:"On"}
/* Segmented control: .btn-group of .btn-check radios. The chosen option rises, turns accent and gains a dot */
.neu-seg{min-width:0;margin:0;padding:0;border:0}
.neu-seg legend{float:none;width:auto;margin-bottom:.6rem;padding:0;font-size:.88rem;font-weight:600}
.neu-seg .btn-group{display:flex;flex-wrap:wrap;gap:6px;width:100%;padding:6px;border:var(--neu-bw) solid var(--neu-edge);border-radius:calc(var(--neu-radius)*.75);box-shadow:var(--neu-inset-sm)}
.neu-seg .btn{--bs-btn-padding-x:.9rem;--bs-btn-padding-y:.4rem;--bs-btn-font-size:.9rem;--bs-btn-font-weight:600;--bs-btn-color:var(--neu-muted);--bs-btn-border-color:transparent;
  --bs-btn-hover-color:var(--neu-ink);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--neu-accent);--bs-btn-active-border-color:var(--neu-accent);--bs-btn-active-bg:transparent;
  flex:1 1 auto;display:flex;align-items:center;justify-content:center;gap:.4rem;min-height:40px;border-radius:calc(var(--neu-radius)*.5)!important;margin:0!important;transition:box-shadow .2s,color .2s}
.neu-seg .btn-check:checked+.btn{box-shadow:var(--neu-raised-sm)}
.neu-seg .btn-check:checked+.btn::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.neu-seg .btn-check:focus-visible+.btn{outline:3px solid var(--neu-accent);outline-offset:2px;box-shadow:var(--neu-raised-sm)}
/* Card: Bootstrap .card restyled through --bs-card-* */
.card.neu-card{--bs-card-bg:var(--neu-bg);--bs-card-color:var(--neu-ink);--bs-card-border-color:var(--neu-line);--bs-card-border-width:var(--neu-bw);
  --bs-card-border-radius:var(--neu-radius);--bs-card-inner-border-radius:calc(var(--neu-radius) - var(--neu-bw));--bs-card-spacer-x:1.5rem;--bs-card-spacer-y:1.5rem;box-shadow:var(--neu-raised)}
.neu-card h2,.neu-card h3,.neu-card p{margin:0}
/* Fields: .form-control / .form-select as pressed-in wells with a 3:1 edge and the accent focus ring */
:root,[data-neu]{--bs-form-invalid-color:var(--neu-danger);--bs-form-invalid-border-color:var(--neu-danger)}
.neu-form .form-label{margin-bottom:.45rem;font-size:.88rem;font-weight:600}
.neu-form .form-control,.neu-form .form-select{min-height:48px;padding:.7rem 1rem;border:var(--neu-bw) solid var(--neu-edge);border-radius:calc(var(--neu-radius)*.6);
  background-color:var(--neu-bg);color:var(--neu-ink);line-height:1.4;box-shadow:var(--neu-inset-sm)}
.neu-form .form-select{padding-right:2.9rem;background-position:right 1rem center;cursor:pointer}
.neu-form .form-control::placeholder{color:var(--neu-muted);opacity:1}
.neu-form .form-control:focus,.neu-form .form-select:focus{border-color:var(--neu-edge);background-color:var(--neu-bg);color:var(--neu-ink);box-shadow:var(--neu-inset-sm);outline:3px solid var(--neu-accent);outline-offset:2px}
.neu-form .form-control.is-invalid{border-width:2px;border-color:var(--neu-danger);background-image:none;padding-right:1rem}
.neu-form .form-control.is-invalid:focus{border-color:var(--neu-danger);box-shadow:var(--neu-inset-sm)}
.neu-form .form-text{margin-top:.45rem;font-size:.82rem;color:var(--neu-muted)}
.neu-form .invalid-feedback{align-items:center;gap:.4rem;margin-top:.45rem;font-size:.82rem;font-weight:600}
.neu-form .form-text .neu-ico,.neu-form .invalid-feedback .neu-ico{width:16px;height:16px}
.neu-control-icon{position:absolute;top:50%;left:1rem;margin-top:-10px;color:var(--neu-muted);pointer-events:none}
.neu-form .ps-neu{padding-left:2.9rem}
/* Stat tile: icon in a pressed well, label, a big value, and a change line that says which way in words */
.neu-stat{display:grid;gap:.2rem;padding:1.25rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-stat__icon{display:grid;place-items:center;width:44px;height:44px;margin-bottom:.6rem;border-radius:50%;color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-stat__label{margin:0;font-size:.85rem;font-weight:600;color:var(--neu-muted)}
.neu-stat__value{margin:0;font-size:1.9rem;font-weight:700;line-height:1.15;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.neu-stat__value small{font-size:.9rem;font-weight:600;letter-spacing:0;color:var(--neu-muted)}
.neu-stat__delta{display:flex;align-items:center;gap:.3rem;margin:.35rem 0 0;font-size:.82rem;font-weight:600;color:var(--neu-muted)}
.neu-stat__delta .neu-ico{width:16px;height:16px}
.neu-stat__delta--good{color:var(--neu-success)}
.neu-stat__delta--warn{color:var(--neu-warning)}
/* Mini player: art in a pressed well, title, a progress groove, and a play / pause toggle (checkbox) */
.neu-mini{display:flex;align-items:center;gap:1rem;padding:1rem 1.1rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-mini__art{flex:none;width:52px;height:52px;border-radius:calc(var(--neu-radius)*.6);box-shadow:var(--neu-inset-sm);
  background:radial-gradient(circle at 30% 30%,#f59e0b 0 18%,transparent 19%),linear-gradient(160deg,#4f46e5,#0e7490)}
.neu-mini__meta{flex:1;min-width:0}
.neu-mini__title{margin:0;font-weight:700;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.neu-mini__artist{margin:0;font-size:.82rem;color:var(--neu-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.neu-mini__bar{height:8px;margin-top:.55rem;border:var(--neu-bw) solid var(--neu-edge);border-radius:999px;box-shadow:var(--neu-inset-sm);
  background:linear-gradient(var(--neu-accent),var(--neu-accent)) 0 0/var(--p,40%) 100% no-repeat}
.neu-play{position:relative;flex:none;display:inline-flex}
.neu-play__face{display:grid;place-items:center;width:52px;height:52px;border:var(--neu-bw) solid var(--neu-accent);border-radius:50%;
  background:var(--neu-accent);color:var(--neu-on-accent);box-shadow:var(--neu-raised-sm);cursor:pointer;transition:box-shadow .2s}
.neu-play__face .neu-ico{width:24px;height:24px}
.neu-play__face .neu-ico+.neu-ico,.neu-play input:checked+.neu-play__face .neu-ico:first-child{display:none}
.neu-play input:checked+.neu-play__face .neu-ico+.neu-ico{display:block}
.neu-play input:checked+.neu-play__face{box-shadow:var(--neu-inset-sm)}
.neu-play input:focus-visible+.neu-play__face{outline:3px solid var(--neu-accent);outline-offset:3px}
/* Progress ring: role="progressbar"; a conic-gradient arc in a pressed groove around a raised core */
.neu-ring{--p:0;--size:128px;position:relative;display:grid;place-items:center;width:var(--size);aspect-ratio:1;border:var(--neu-bw) solid var(--neu-line);border-radius:50%;background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-ring__arc{position:absolute;inset:10px;border-radius:50%;box-shadow:var(--neu-inset-sm);
  background:conic-gradient(var(--neu-accent) calc(var(--p)*1%),transparent 0);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 12px),#000 calc(100% - 11.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 12px),#000 calc(100% - 11.5px))}
.neu-ring__core{position:relative;display:grid;place-items:center;width:calc(var(--size) - 58px);aspect-ratio:1;border-radius:50%;box-shadow:var(--neu-raised-sm);
  font-size:1.15rem;font-weight:700;font-variant-numeric:tabular-nums}
.neu-ring-cap{margin:.9rem 0 0;font-size:.88rem;font-weight:600;text-align:center}
.neu-ring-cap small{display:block;font-size:.8rem;font-weight:400;color:var(--neu-muted)}
.neu-ring-fig{display:grid;justify-items:center;margin:0}
.neu-stack{display:grid;gap:1.35rem}
.neu-form .form-control.ps-neu{padding-left:2.9rem}
@media (prefers-reduced-motion:reduce){.btn-neu,.btn-neu-tile .neu-tile-icon,.neu-switch .form-check-input,.neu-seg .btn,.neu-play__face{transition:none}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
  <symbol id="neu-i-power" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v8"/><path d="M6.3 6.8a8 8 0 1 0 11.4 0"/></symbol>
  <symbol id="neu-i-plus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></symbol>
  <symbol id="neu-i-sliders" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h10M18 7h2M4 17h4M12 17h8"/><circle cx="16" cy="7" r="2"/><circle cx="10" cy="17" r="2"/></symbol>
  <symbol id="neu-i-phone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 4h3.3l1.7 4.4-2.2 1.4a10.5 10.5 0 0 0 5.9 5.9l1.4-2.2 4.4 1.7v3.3a1.5 1.5 0 0 1-1.6 1.5A15.5 15.5 0 0 1 4 5.6 1.5 1.5 0 0 1 5.5 4z"/></symbol>
  <symbol id="neu-i-message" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 0 1-12.4 7.5L3.5 20.5l1-4.4A8.5 8.5 0 1 1 20.5 12z"/></symbol>
  <symbol id="neu-i-more" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h.01M12 12h.01M19 12h.01" stroke-width="3"/></symbol>
  <symbol id="neu-i-wifi" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0"/><path d="M5.5 12.5a9.5 9.5 0 0 1 13 0"/><path d="M8.6 15.9a5 5 0 0 1 6.8 0"/><path d="M12 19.5h.01"/></symbol>
  <symbol id="neu-i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z"/></symbol>
  <symbol id="neu-i-leaf" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 20c0-9 5.5-14 15-15-.5 9.5-6 15-15 15z"/><path d="M5 20c3.5-4.5 6.5-7 10-8.5"/></symbol>
  <symbol id="neu-i-bluetooth" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m7 7 10 10-5 4V3l5 4L7 17"/></symbol>
  <symbol id="neu-i-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="6.5"/><path d="m16 16 4.5 4.5"/></symbol>
  <symbol id="neu-i-bolt" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3 5 13.5h6L10 21l8-10.5h-6z"/></symbol>
  <symbol id="neu-i-thermo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 14.5V5.5a2 2 0 0 0-4 0v9a4 4 0 1 0 4 0z"/><path d="M12 9.5V16"/></symbol>
  <symbol id="neu-i-arrowDown" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M6.5 13.5 12 19l5.5-5.5"/></symbol>
  <symbol id="neu-i-drop" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5s6 6.6 6 11a6 6 0 0 1-12 0c0-4.4 6-11 6-11z"/></symbol>
  <symbol id="neu-i-play" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" d="M8 5.2v13.6L19 12z"/></symbol>
  <symbol id="neu-i-pause" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path fill="currentColor" stroke="none" d="M7 5h3.6v14H7zM13.4 5H17v14h-3.6z"/></symbol>
</svg>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Buttons and icon buttons</span><div class="flex flex-wrap items-center gap-[18px]">
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent min-h-[46px] rounded-neu-btn px-[1.35rem] py-[.65rem] text-[.95rem] border-neu-accent bg-neu-accent text-neu-on-accent" type="button"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-power"/></svg>Run Evening scene</button>
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent min-h-[46px] rounded-neu-btn px-[1.35rem] py-[.65rem] text-[.95rem] border-neu-edge bg-neu-bg text-neu-ink" type="button"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-plus"/></svg>Add device</button>
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent min-h-[38px] rounded-neu-btn px-4 py-[.45rem] text-[.85rem] border-neu-edge bg-neu-bg text-neu-ink" type="button"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Adjust</button>
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent size-[50px] rounded-full border-neu-edge bg-neu-bg text-neu-ink" type="button" aria-label="Call the front door"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-phone"/></svg></button>
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent size-[50px] rounded-full border-neu-edge bg-neu-bg text-neu-ink" type="button" aria-label="Message household"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-message"/></svg></button>
<button class="inline-flex items-center justify-center gap-[.55rem] border-(length:--neu-bw) font-semibold leading-[1.2] no-underline cursor-pointer shadow-neu-sm transition-[box-shadow,color,background-color] duration-200 hover:shadow-neu active:shadow-neu-in-sm motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent size-[50px] rounded-neu-btn border-neu-edge bg-neu-bg text-neu-ink" type="button" aria-label="More options"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-more"/></svg></button>
</div></section>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Quick toggles · on means pressed in, accent and the word On</span><div class="grid grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-5">
<label class="group relative inline-flex cursor-pointer"><input class="peer sr-only" type="checkbox" checked><span class="flex w-full min-w-[132px] flex-col items-start gap-[.4rem] rounded-neu border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-4 text-neu-ink shadow-neu-sm transition-[box-shadow,border-color] duration-[250ms] peer-checked:border-neu-accent peer-checked:shadow-neu-in motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent"><span class="mb-[.35rem] grid size-[42px] place-items-center rounded-full text-neu-muted shadow-neu-in-sm transition-colors duration-[250ms] group-has-checked:bg-neu-accent group-has-checked:text-neu-on-accent motion-reduce:transition-none"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-wifi"/></svg></span><span class="leading-[1.25] font-semibold">Wi-Fi</span><span class="flex items-center gap-[.4rem] text-[.8rem] font-semibold text-neu-muted before:size-[9px] before:rounded-full before:border-2 before:border-current after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:before:bg-current group-has-checked:after:content-['On']" aria-hidden="true"></span></span></label>
<label class="group relative inline-flex cursor-pointer"><input class="peer sr-only" type="checkbox" checked><span class="flex w-full min-w-[132px] flex-col items-start gap-[.4rem] rounded-neu border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-4 text-neu-ink shadow-neu-sm transition-[box-shadow,border-color] duration-[250ms] peer-checked:border-neu-accent peer-checked:shadow-neu-in motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent"><span class="mb-[.35rem] grid size-[42px] place-items-center rounded-full text-neu-muted shadow-neu-in-sm transition-colors duration-[250ms] group-has-checked:bg-neu-accent group-has-checked:text-neu-on-accent motion-reduce:transition-none"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-moon"/></svg></span><span class="leading-[1.25] font-semibold">Night mode</span><span class="flex items-center gap-[.4rem] text-[.8rem] font-semibold text-neu-muted before:size-[9px] before:rounded-full before:border-2 before:border-current after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:before:bg-current group-has-checked:after:content-['On']" aria-hidden="true"></span></span></label>
<label class="group relative inline-flex cursor-pointer"><input class="peer sr-only" type="checkbox"><span class="flex w-full min-w-[132px] flex-col items-start gap-[.4rem] rounded-neu border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-4 text-neu-ink shadow-neu-sm transition-[box-shadow,border-color] duration-[250ms] peer-checked:border-neu-accent peer-checked:shadow-neu-in motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent"><span class="mb-[.35rem] grid size-[42px] place-items-center rounded-full text-neu-muted shadow-neu-in-sm transition-colors duration-[250ms] group-has-checked:bg-neu-accent group-has-checked:text-neu-on-accent motion-reduce:transition-none"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-leaf"/></svg></span><span class="leading-[1.25] font-semibold">Eco mode</span><span class="flex items-center gap-[.4rem] text-[.8rem] font-semibold text-neu-muted before:size-[9px] before:rounded-full before:border-2 before:border-current after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:before:bg-current group-has-checked:after:content-['On']" aria-hidden="true"></span></span></label>
<label class="group relative inline-flex cursor-pointer"><input class="peer sr-only" type="checkbox"><span class="flex w-full min-w-[132px] flex-col items-start gap-[.4rem] rounded-neu border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-4 text-neu-ink shadow-neu-sm transition-[box-shadow,border-color] duration-[250ms] peer-checked:border-neu-accent peer-checked:shadow-neu-in motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent"><span class="mb-[.35rem] grid size-[42px] place-items-center rounded-full text-neu-muted shadow-neu-in-sm transition-colors duration-[250ms] group-has-checked:bg-neu-accent group-has-checked:text-neu-on-accent motion-reduce:transition-none"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bluetooth"/></svg></span><span class="leading-[1.25] font-semibold">Bluetooth</span><span class="flex items-center gap-[.4rem] text-[.8rem] font-semibold text-neu-muted before:size-[9px] before:rounded-full before:border-2 before:border-current after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:before:bg-current group-has-checked:after:content-['On']" aria-hidden="true"></span></span></label>
</div></section>
<div class="grid items-start gap-11 min-[821px]:grid-cols-2">
<div class="grid grid-cols-[minmax(0,1fr)] gap-11">
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Switches</span><div class="rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg text-neu-ink shadow-neu p-6"><div class="grid gap-[1.35rem]">
<label class="group relative flex cursor-pointer items-center gap-[.9rem]"><input class="peer sr-only" type="checkbox" role="switch" checked><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Reading lamp<small class="mt-[.15rem] block text-[.82rem] font-normal text-neu-muted">Warm white, 40%</small></span><span class="min-w-[2.1em] text-right text-[.75rem] font-bold tracking-[.08em] text-neu-muted uppercase after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:after:content-['On']" aria-hidden="true"></span><span class="relative h-8 w-[58px] flex-none rounded-full border-(length:--neu-bw) border-neu-edge bg-neu-bg shadow-neu-in-sm transition-colors duration-[250ms] peer-checked:border-neu-accent peer-checked:bg-neu-accent motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent before:absolute before:top-1/2 before:left-[3px] before:-mt-3 before:size-6 before:rounded-full before:border-(length:--neu-bw) before:border-neu-edge before:bg-neu-bg before:shadow-neu-sm before:transition-[translate,background-color] before:duration-[250ms] peer-checked:before:translate-x-[calc(28px-2*var(--neu-bw))] peer-checked:before:border-neu-on-accent peer-checked:before:bg-neu-on-accent motion-reduce:before:transition-none" aria-hidden="true"></span></label>
<label class="group relative flex cursor-pointer items-center gap-[.9rem]"><input class="peer sr-only" type="checkbox" role="switch"><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Floor heating<small class="mt-[.15rem] block text-[.82rem] font-normal text-neu-muted">Bathroom, until 07:30</small></span><span class="min-w-[2.1em] text-right text-[.75rem] font-bold tracking-[.08em] text-neu-muted uppercase after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:after:content-['On']" aria-hidden="true"></span><span class="relative h-8 w-[58px] flex-none rounded-full border-(length:--neu-bw) border-neu-edge bg-neu-bg shadow-neu-in-sm transition-colors duration-[250ms] peer-checked:border-neu-accent peer-checked:bg-neu-accent motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent before:absolute before:top-1/2 before:left-[3px] before:-mt-3 before:size-6 before:rounded-full before:border-(length:--neu-bw) before:border-neu-edge before:bg-neu-bg before:shadow-neu-sm before:transition-[translate,background-color] before:duration-[250ms] peer-checked:before:translate-x-[calc(28px-2*var(--neu-bw))] peer-checked:before:border-neu-on-accent peer-checked:before:bg-neu-on-accent motion-reduce:before:transition-none" aria-hidden="true"></span></label>
<label class="group relative flex cursor-pointer items-center gap-[.9rem]"><input class="peer sr-only" type="checkbox" role="switch" checked><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Night camera<small class="mt-[.15rem] block text-[.82rem] font-normal text-neu-muted">Garden, infrared</small></span><span class="min-w-[2.1em] text-right text-[.75rem] font-bold tracking-[.08em] text-neu-muted uppercase after:content-['Off'] group-has-checked:text-neu-accent group-has-checked:after:content-['On']" aria-hidden="true"></span><span class="relative h-8 w-[58px] flex-none rounded-full border-(length:--neu-bw) border-neu-edge bg-neu-bg shadow-neu-in-sm transition-colors duration-[250ms] peer-checked:border-neu-accent peer-checked:bg-neu-accent motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent before:absolute before:top-1/2 before:left-[3px] before:-mt-3 before:size-6 before:rounded-full before:border-(length:--neu-bw) before:border-neu-edge before:bg-neu-bg before:shadow-neu-sm before:transition-[translate,background-color] before:duration-[250ms] peer-checked:before:translate-x-[calc(28px-2*var(--neu-bw))] peer-checked:before:border-neu-on-accent peer-checked:before:bg-neu-on-accent motion-reduce:before:transition-none" aria-hidden="true"></span></label>
</div></div></section>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Field and segmented control</span><div class="grid gap-[1.35rem]"><div class="grid gap-[.45rem]"><label class="text-[.88rem] font-semibold" for="d-search">Find a device</label><div class="relative"><svg class="pointer-events-none absolute top-1/2 left-4 -mt-2.5 size-5 text-neu-muted" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg><input class="block min-h-12 w-full rounded-neu-field border-(length:--neu-bw) border-neu-edge bg-neu-bg py-[.7rem] pr-4 pl-[2.9rem] text-base leading-[1.4] text-neu-ink shadow-neu-in-sm placeholder:text-neu-muted focus:outline-3 focus:outline-offset-2 focus:outline-neu-accent" id="d-search" type="search" placeholder="Lamp, lock, speaker…"></div></div><fieldset class="m-0 min-w-0 border-0 p-0"><legend class="mb-[.6rem] p-0 text-[.88rem] font-semibold">Fan speed</legend><div class="flex flex-wrap gap-1.5 rounded-neu-btn border-(length:--neu-bw) border-neu-edge p-1.5 shadow-neu-in-sm"><label class="relative flex-auto"><input class="peer sr-only" type="radio" name="dk-fan" value="low" checked><span class="flex min-h-10 cursor-pointer items-center justify-center gap-[.4rem] rounded-[calc(var(--neu-radius)*.5)] border-(length:--neu-bw) border-transparent px-[.9rem] py-[.4rem] text-[.9rem] font-semibold text-neu-muted transition-[box-shadow,color] duration-200 peer-checked:border-neu-accent peer-checked:text-neu-accent peer-checked:shadow-neu-sm peer-checked:before:size-[7px] peer-checked:before:rounded-full peer-checked:before:bg-current peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-neu-accent motion-reduce:transition-none">Low</span></label><label class="relative flex-auto"><input class="peer sr-only" type="radio" name="dk-fan" value="medium"><span class="flex min-h-10 cursor-pointer items-center justify-center gap-[.4rem] rounded-[calc(var(--neu-radius)*.5)] border-(length:--neu-bw) border-transparent px-[.9rem] py-[.4rem] text-[.9rem] font-semibold text-neu-muted transition-[box-shadow,color] duration-200 peer-checked:border-neu-accent peer-checked:text-neu-accent peer-checked:shadow-neu-sm peer-checked:before:size-[7px] peer-checked:before:rounded-full peer-checked:before:bg-current peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-neu-accent motion-reduce:transition-none">Medium</span></label><label class="relative flex-auto"><input class="peer sr-only" type="radio" name="dk-fan" value="high"><span class="flex min-h-10 cursor-pointer items-center justify-center gap-[.4rem] rounded-[calc(var(--neu-radius)*.5)] border-(length:--neu-bw) border-transparent px-[.9rem] py-[.4rem] text-[.9rem] font-semibold text-neu-muted transition-[box-shadow,color] duration-200 peer-checked:border-neu-accent peer-checked:text-neu-accent peer-checked:shadow-neu-sm peer-checked:before:size-[7px] peer-checked:before:rounded-full peer-checked:before:bg-current peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-neu-accent motion-reduce:transition-none">High</span></label><label class="relative flex-auto"><input class="peer sr-only" type="radio" name="dk-fan" value="auto"><span class="flex min-h-10 cursor-pointer items-center justify-center gap-[.4rem] rounded-[calc(var(--neu-radius)*.5)] border-(length:--neu-bw) border-transparent px-[.9rem] py-[.4rem] text-[.9rem] font-semibold text-neu-muted transition-[box-shadow,color] duration-200 peer-checked:border-neu-accent peer-checked:text-neu-accent peer-checked:shadow-neu-sm peer-checked:before:size-[7px] peer-checked:before:rounded-full peer-checked:before:bg-current peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-neu-accent motion-reduce:transition-none">Auto</span></label></div></fieldset></div></section>
</div>
<div class="grid grid-cols-[minmax(0,1fr)] gap-11">
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Stat tiles</span><div class="grid gap-[22px] min-[481px]:grid-cols-2">
<article class="grid gap-[.2rem] rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu"><span class="mb-[.6rem] grid size-11 place-items-center rounded-full text-neu-accent shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><p class="text-[.85rem] font-semibold text-neu-muted">Energy tonight</p><p class="text-[1.9rem] leading-[1.15] font-bold tracking-[-.02em] tabular-nums">3.1<small class="text-[.9rem] font-semibold tracking-normal text-neu-muted"> kWh</small></p><p class="mt-[.35rem] flex items-center gap-[.3rem] text-[.82rem] font-semibold text-neu-success"><svg class="size-4 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-arrowDown"/></svg>14% less than usual</p></article>
<article class="grid gap-[.2rem] rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu"><span class="mb-[.6rem] grid size-11 place-items-center rounded-full text-neu-accent shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><p class="text-[.85rem] font-semibold text-neu-muted">Bedroom</p><p class="text-[1.9rem] leading-[1.15] font-bold tracking-[-.02em] tabular-nums">19.0<small class="text-[.9rem] font-semibold tracking-normal text-neu-muted"> °C</small></p><p class="mt-[.35rem] flex items-center gap-[.3rem] text-[.82rem] font-semibold text-neu-muted"><svg class="size-4 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg>Humidity 51%</p></article>
</div></section>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Mini player</span><div class="flex items-center gap-4 rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg px-[1.1rem] py-4 shadow-neu"><span class="size-[52px] flex-none rounded-neu-field bg-[radial-gradient(circle_at_30%_30%,#f59e0b_0_18%,transparent_19%),linear-gradient(160deg,#4f46e5,#0e7490)] shadow-neu-in-sm" aria-hidden="true"></span><div class="min-w-0 flex-1"><p class="truncate leading-[1.25] font-bold">Night Swim</p><p class="truncate text-[.82rem] text-neu-muted">Odile Varga · Bedroom speaker</p><div class="mt-[.55rem] h-2 rounded-full border-(length:--neu-bw) border-neu-edge bg-[linear-gradient(var(--neu-accent),var(--neu-accent))] bg-no-repeat shadow-neu-in-sm" style="background-size:64% 100%" role="progressbar" aria-label="Track position" aria-valuenow="64" aria-valuemin="0" aria-valuemax="100"></div></div><label class="group relative inline-flex flex-none"><input class="peer sr-only" type="checkbox" aria-label="Play Night Swim"><span class="grid size-[52px] cursor-pointer place-items-center rounded-full border-(length:--neu-bw) border-neu-accent bg-neu-accent text-neu-on-accent shadow-neu-sm transition-shadow duration-200 peer-checked:shadow-neu-in-sm motion-reduce:transition-none peer-focus-visible:outline-3 peer-focus-visible:outline-offset-3 peer-focus-visible:outline-neu-accent"><svg class="size-6 shrink-0 group-has-checked:hidden" aria-hidden="true" focusable="false"><use href="#neu-i-play"/></svg><svg class="size-6 shrink-0 hidden group-has-checked:block" aria-hidden="true" focusable="false"><use href="#neu-i-pause"/></svg></span></label></div></section>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Progress ring</span><div class="flex flex-wrap items-center gap-7"><figure class="m-0 grid justify-items-center"><div class="relative grid aspect-square place-items-center rounded-full border-(length:--neu-bw) border-neu-line bg-neu-bg shadow-neu" style="--p:72;width:120px" role="progressbar" aria-label="Robot vacuum" aria-valuenow="72" aria-valuemin="0" aria-valuemax="100"><span class="absolute inset-2.5 rounded-full bg-[conic-gradient(var(--neu-accent)_calc(var(--p)*1%),transparent_0)] shadow-neu-in-sm [mask:radial-gradient(farthest-side,transparent_calc(100%-12px),#000_calc(100%-11.5px))]"></span><span class="relative grid aspect-square place-items-center rounded-full text-[1.15rem] font-bold tabular-nums shadow-neu-sm" style="width:62px">72%</span></div><figcaption class="mt-[.9rem] text-center text-[.88rem] font-semibold">Robot vacuum<small class="block text-[.8rem] font-normal text-neu-muted">72% charged, docked</small></figcaption></figure><figure class="m-0 grid justify-items-center"><div class="relative grid aspect-square place-items-center rounded-full border-(length:--neu-bw) border-neu-line bg-neu-bg shadow-neu" style="--p:35;width:120px" role="progressbar" aria-label="Pellet hopper" aria-valuenow="35" aria-valuemin="0" aria-valuemax="100"><span class="absolute inset-2.5 rounded-full bg-[conic-gradient(var(--neu-accent)_calc(var(--p)*1%),transparent_0)] shadow-neu-in-sm [mask:radial-gradient(farthest-side,transparent_calc(100%-12px),#000_calc(100%-11.5px))]"></span><span class="relative grid aspect-square place-items-center rounded-full text-[1.15rem] font-bold tabular-nums shadow-neu-sm" style="width:62px">35%</span></div><figcaption class="mt-[.9rem] text-center text-[.88rem] font-semibold">Pellet hopper<small class="block text-[.8rem] font-normal text-neu-muted">Refill by Sunday</small></figcaption></figure></div></section>
</div>
</div>
CSS
/* ── Neumorphism UI kit tokens (uiCookies) — identical in every set ──────────────
   Every component is moulded from --neu-bg and lit from the top left. Change a token and
   the whole kit follows; the shadow recipes below are built from these values. */
:root{
  --neu-bg:#e0e5ec;          /* the one surface colour */
  --neu-light:#ffffff;       /* highlight, top left */
  --neu-dark:#a3b1c6;        /* shade, bottom right */
  --neu-distance:6px;        /* how far a shape rises */
  --neu-blur:14px;           /* how soft its shadow is */
  --neu-radius:18px;         /* cards; buttons use .75 of it, fields .6 */
  --neu-accent:#4f46e5;      /* focus ring and on / selected / current states, 4.9:1 on --neu-bg */
  --neu-on-accent:#ffffff;   /* text and marks on accent fills, 6.3:1 */
  --neu-ink:#1f2937;         /* text, 11.6:1 */
  --neu-muted:#4a5568;       /* secondary text, 5.9:1 */
  --neu-edge:#74819a;        /* control boundary (fields, tracks, boxes, buttons), 3.1:1 */
  --neu-line:rgba(255,255,255,.6); /* decorative edge on cards and panels */
  --neu-bw:1px;              /* control border width */
  --neu-success:#126b35;--neu-warning:#8a5300;--neu-danger:#b42318;
}
/* Dark neumorphism: data-neu="dark" on any wrapper, or a checked .neu-theme-input inside a [data-neu] element.
   :is() is a forgiving list, so browsers without :has() still apply data-neu="dark" */
[data-neu]:is([data-neu="dark"],:has(.neu-theme-input:checked)){
  --neu-bg:#262b33;--neu-light:#323944;--neu-dark:#14171c;
  --neu-accent:#8f88ff;--neu-on-accent:#14161b;--neu-ink:#e7ebf2;--neu-muted:#aab4c3;--neu-edge:#717d90;
  --neu-line:rgba(255,255,255,.06);--neu-success:#6fdc9a;--neu-warning:#f3c164;--neu-danger:#ff8f84;color-scheme:dark}
/* More contrast requested: the soft shadows go, every control and panel gets a solid outline */
@media (prefers-contrast:more){:root,[data-neu]:is([data-neu],:has(.neu-theme-input:checked)){
  --neu-light:transparent;--neu-dark:transparent;--neu-edge:var(--neu-ink);--neu-line:var(--neu-ink);--neu-muted:var(--neu-ink);--neu-bw:2px}}
:root,[data-neu]{
  --neu-raised:var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-dark),calc(var(--neu-distance)*-1) calc(var(--neu-distance)*-1) var(--neu-blur) var(--neu-light);
  --neu-raised-sm:calc(var(--neu-distance)*.5) calc(var(--neu-distance)*.5) calc(var(--neu-blur)*.5) var(--neu-dark),calc(var(--neu-distance)*-.5) calc(var(--neu-distance)*-.5) calc(var(--neu-blur)*.5) var(--neu-light);
  --neu-inset:inset calc(var(--neu-distance)*.6) calc(var(--neu-distance)*.6) calc(var(--neu-blur)*.6) var(--neu-dark),inset calc(var(--neu-distance)*-.6) calc(var(--neu-distance)*-.6) calc(var(--neu-blur)*.6) var(--neu-light);
  --neu-inset-sm:inset calc(var(--neu-distance)*.35) calc(var(--neu-distance)*.35) calc(var(--neu-blur)*.35) var(--neu-dark),inset calc(var(--neu-distance)*-.35) calc(var(--neu-distance)*-.35) calc(var(--neu-blur)*.35) var(--neu-light);
}
[data-neu]{background:var(--neu-bg);color:var(--neu-ink)}
/* The tokens above, exposed as Tailwind utilities: bg-neu-bg, text-neu-muted, border-neu-edge,
   shadow-neu, shadow-neu-sm, shadow-neu-in, shadow-neu-in-sm, rounded-neu, rounded-neu-btn, rounded-neu-field… */
@theme inline {
  --color-neu-bg: var(--neu-bg); --color-neu-ink: var(--neu-ink); --color-neu-muted: var(--neu-muted);
  --color-neu-edge: var(--neu-edge); --color-neu-line: var(--neu-line);
  --color-neu-accent: var(--neu-accent); --color-neu-on-accent: var(--neu-on-accent);
  --color-neu-success: var(--neu-success); --color-neu-warning: var(--neu-warning); --color-neu-danger: var(--neu-danger);
  --shadow-neu: var(--neu-raised); --shadow-neu-sm: var(--neu-raised-sm);
  --shadow-neu-in: var(--neu-inset); --shadow-neu-in-sm: var(--neu-inset-sm);
  --radius-neu: var(--neu-radius); --radius-neu-btn: calc(var(--neu-radius) * .75); --radius-neu-field: calc(var(--neu-radius) * .6);
}

About this set

The same kit on a dark surface, switched by one attribute. Put data-neu=”dark” on any wrapper and the shared tokens change to a slate background, a soft highlight and a deep shade, a lavender accent with dark text on it, and lighter body and secondary text, so every component in the kit follows without its own dark rules. This set shows buttons and icon buttons, quick toggle tiles, switch rows, a search field, a segmented control, two stat tiles, a mini player with a progress groove and a play toggle, and two progress rings. Dark neumorphism tends to fail on contrast because the shadows that make it are close to the background; here the text keeps 4.5:1, control edges keep 3:1 against the dark surface, and the focus ring and on states use the lighter accent so they stay visible. Use it for night modes, media apps and dashboards that live in dim rooms. Bootstrap adds data-bs-theme=”dark” next to data-neu so its own components match, and Tailwind needs no dark: classes because the utilities read the tokens.

What’s included

  • One attribute, data-neu="dark", re-themes every component
  • Dark tokens checked for 4.5:1 text and 3:1 control edges
  • Buttons, toggles, switches, field, segmented control, tiles, player and rings
  • Accent fills switch to dark text to keep contrast
  • Works with Bootstrap's data-bs-theme="dark"

Accessibility

Every control keeps its native semantics and its name from the light kit, and the on state is still shown by shape, accent colour and text. The focus ring uses the lighter dark-mode accent, the mini player's play control is a named checkbox and its progress is a labelled progressbar. Transitions stop under prefers-reduced-motion and prefers-contrast: more draws solid outlines in light ink.

Customise it

Edit the [data-neu] dark token rule in the block at the top; the light values are on :root. Bootstrap reads the same tokens through the --bs-* mapping, and Tailwind's bg-neu-bg, text-neu-ink and shadow-neu utilities change with them.