Open demo

CSS code

HTML
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
  <symbol id="neu-i-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 10.5 12 4l8 6.5V20h-5.5v-6h-5v6H4z"/></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-grid" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
  <symbol id="neu-i-sofa" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 11V8a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v2h10v-2a2 2 0 0 1 4 0v5H3z"/><path d="M5 17v2M19 17v2"/></symbol>
  <symbol id="neu-i-star" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m12 3.5 2.6 5.4 5.9.8-4.3 4.1 1 5.8L12 16.8l-5.2 2.8 1-5.8-4.3-4.1 5.9-.8z"/></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-bell" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M6 16v-5a6 6 0 0 1 12 0v5l1.5 2h-15zM10 20.5a2 2 0 0 0 4 0"/></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-logout" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4h4.5a1.5 1.5 0 0 1 1.5 1.5v13a1.5 1.5 0 0 1-1.5 1.5H14M10 16.5 5.5 12 10 7.5M5.5 12H16"/></symbol>
  <symbol id="neu-i-chevLeft" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m15 6-6 6 6 6"/></symbol>
  <symbol id="neu-i-chevRight" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m9 6 6 6-6 6"/></symbol>
  <symbol id="neu-i-bulb" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 18h5M10.5 21h3M12 3a6 6 0 0 0-3.6 10.8c.6.5 1 1.2 1 2v.2h5.2v-.2c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z"/></symbol>
  <symbol id="neu-i-film" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="5" width="17" height="14" rx="2"/><path d="M3.5 9.5h17M8 5l2 4.5M13 5l2 4.5"/></symbol>
  <symbol id="neu-i-fan" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1.8"/><path d="M12 10.2c-1.2-3.2-.2-6.7 2.8-6.7 2 0 2.6 3-.9 5.2M13.8 12c3.2-1.2 6.7-.2 6.7 2.8 0 2-3 2.6-5.2-.9M12 13.8c1.2 3.2.2 6.7-2.8 6.7-2 0-2.6-3 .9-5.2M10.2 12c-3.2 1.2-6.7.2-6.7-2.8 0-2 3-2.6 5.2.9"/></symbol>
  <symbol id="neu-i-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="10.5" width="14" height="10" rx="2"/><path d="M8 10.5V7.5a4 4 0 0 1 8 0v3"/></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-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-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M4.6 4.6 6 6M18 18l1.4 1.4M2.5 12h2M19.5 12h2M4.6 19.4 6 18M18 6l1.4-1.4"/></symbol>
</svg>
<section><span class="lbl">Navbar</span><nav class="neu-navbar" aria-label="Main">
<a class="neu-brand" href="#"><span class="neu-brand__mark"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-home"/></svg></span>Hearth</a>
<ul class="neu-navbar__links"><li><a class="neu-navlink" href="#" aria-current="page">Overview</a></li><li><a class="neu-navlink" href="#">Rooms</a></li><li><a class="neu-navlink" href="#">Energy</a></li><li><a class="neu-navlink" href="#">Automations</a></li></ul>
<div class="neu-navbar__actions"><button class="neu-btn neu-btn--icon neu-btn--icon-sm" type="button" aria-label="Search devices"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg></button><button class="neu-avatar-btn neu-btn neu-btn--icon neu-btn--icon-sm" type="button" aria-label="Account: Ada Okafor">AO</button></div>
</nav></section>
<div class="layout">
<section><span class="lbl">Sidebar</span><nav class="neu-side" aria-label="Sidebar">
<h2 class="neu-side__heading" id="side-0">Home</h2><ul class="neu-side__list" aria-labelledby="side-0"><li><a class="neu-sidelink" href="#" aria-current="page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-grid"/></svg>Dashboard</a></li><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sofa"/></svg>Rooms</a></li><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-star"/></svg>Scenes</a></li><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg>Energy</a></li><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bell"/></svg>Alerts<span class="neu-count">3<span class="neu-sr"> new</span></span></a></li></ul>
<h2 class="neu-side__heading" id="side-1">Account</h2><ul class="neu-side__list" aria-labelledby="side-1"><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Settings</a></li><li><a class="neu-sidelink" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-logout"/></svg>Sign out</a></li></ul>
</nav></section>
<div class="main">
<section><span class="lbl">Tabs · arrow keys move between rooms</span><div class="neu-tablist" role="tablist" aria-label="Rooms"><button class="neu-tab" id="tab-living" type="button" role="tab" aria-controls="panel-living" aria-selected="true">Living room</button><button class="neu-tab" id="tab-kitchen" type="button" role="tab" aria-controls="panel-kitchen" aria-selected="false" tabindex="-1">Kitchen</button><button class="neu-tab" id="tab-bedroom" type="button" role="tab" aria-controls="panel-bedroom" aria-selected="false" tabindex="-1">Bedroom</button><button class="neu-tab" id="tab-garden" type="button" role="tab" aria-controls="panel-garden" aria-selected="false" tabindex="-1">Garden</button></div>
<div class="neu-tabpanel" id="panel-living" role="tabpanel" aria-labelledby="tab-living" tabindex="0"><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Ceiling light<small>Dimmed to 80%</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-film"/></svg></span><span class="neu-devices__name">Smart TV<small>Standby</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-fan"/></svg></span><span class="neu-devices__name">Air purifier<small>Auto, PM2.5 at 6</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div>
<div class="neu-tabpanel" id="panel-kitchen" role="tabpanel" aria-labelledby="tab-kitchen" tabindex="0" hidden><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Under-cabinet lights<small>Off since 21:40</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="neu-devices__name">Dishwasher<small>42 minutes left</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><span class="neu-devices__name">Kettle plug<small>Off</small></span><span class="neu-tag">Off</span></li></ul></div>
<div class="neu-tabpanel" id="panel-bedroom" role="tabpanel" aria-labelledby="tab-bedroom" tabindex="0" hidden><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Bedside lamp<small>Dimmed to 20%</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sun"/></svg></span><span class="neu-devices__name">Blinds<small>Closed</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><span class="neu-devices__name">Heater<small>Eco, 18 °C</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div>
<div class="neu-tabpanel" id="panel-garden" role="tabpanel" aria-labelledby="tab-garden" tabindex="0" hidden><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Path lights<small>Sunset to 23:00</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="neu-devices__name">Sprinkler<small>Next run 06:00</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-lock"/></svg></span><span class="neu-devices__name">Gate lock<small>Locked</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div></section>
<section><span class="lbl">Pagination</span><nav aria-label="Activity log pages"><ul class="neu-pages"><li><a class="neu-page" href="#" aria-label="Previous page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-chevLeft"/></svg></a></li><li><a class="neu-page" href="#" aria-label="Page 1">1</a></li><li><a class="neu-page" href="#" aria-label="Page 2">2</a></li><li><a class="neu-page" href="#" aria-label="Page 3" aria-current="page">3</a></li><li><a class="neu-page" href="#" aria-label="Page 4">4</a></li><li><span class="neu-page neu-page--gap" aria-hidden="true">…</span></li><li><a class="neu-page" href="#" aria-label="Page 12">12</a></li><li><a class="neu-page" href="#" aria-label="Next page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-chevRight"/></svg></a></li></ul></nav>
<p class="neu-pages-note">Showing events 41–60 of 236</p></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}
/* Navbar: current page = pressed in, accent edge and text, and an underline bar */
.neu-navbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px;padding:.75rem 1rem;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-brand{display:inline-flex;align-items:center;gap:.65rem;padding:.2rem .4rem .2rem .2rem;border-radius:999px;color:var(--neu-ink);font-size:1.1rem;font-weight:800;text-decoration:none}
.neu-brand__mark{display:grid;place-items:center;width:40px;height:40px;border-radius:50%;color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-navbar__links{display:flex;flex:1;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}
.neu-navlink{position:relative;display:inline-flex;align-items:center;min-height:42px;padding:.5rem 1rem;border:var(--neu-bw) solid transparent;border-radius:calc(var(--neu-radius)*.6);
  color:var(--neu-muted);font-size:.92rem;font-weight:600;text-decoration:none;transition:box-shadow .2s,color .2s}
.neu-navlink:hover{color:var(--neu-ink);box-shadow:var(--neu-raised-sm)}
.neu-navlink[aria-current="page"]{border-color:var(--neu-accent);color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-navlink[aria-current="page"]::after{content:"";position:absolute;left:1rem;right:1rem;bottom:5px;height:3px;border-radius:3px;background:currentColor}
.neu-navbar__actions{display:flex;align-items:center;gap:12px}
.neu-avatar-btn{font-size:.85rem;font-weight:700}
.neu-brand:focus-visible,.neu-navlink:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
@media (max-width:700px){.neu-navbar__actions{margin-left:auto}.neu-navbar__links{order:3;flex-basis:100%}}
/* Sidebar: current item = pressed in, accent edge and text, and a dot at the end */
.neu-side{display:grid;align-content:start;gap:.2rem;padding: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-side__heading{margin:.5rem .8rem .4rem;font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--neu-muted)}
.neu-side__list{display:grid;gap:6px;margin:0;padding:0;list-style:none}
.neu-sidelink{display:flex;align-items:center;gap:.75rem;min-height:44px;padding:.55rem .8rem;border:var(--neu-bw) solid transparent;border-radius:calc(var(--neu-radius)*.6);
  color:var(--neu-muted);font-weight:600;text-decoration:none;transition:box-shadow .2s,color .2s}
.neu-sidelink:hover{color:var(--neu-ink);box-shadow:var(--neu-raised-sm)}
.neu-sidelink[aria-current="page"]{border-color:var(--neu-accent);color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-sidelink[aria-current="page"]::after{content:"";width:8px;height:8px;margin-left:auto;border-radius:50%;background:currentColor}
.neu-sidelink:focus-visible{outline:3px solid var(--neu-accent);outline-offset:2px}
.neu-count{margin-left:auto;min-width:24px;padding:.1rem .45rem;border-radius:999px;background:var(--neu-accent);color:var(--neu-on-accent);font-size:.75rem;font-weight:700;text-align:center}
/* Tabs (ARIA tablist): raised tabs; the selected one is pressed in, accent and underlined. Arrow keys move between tabs */
.neu-tablist{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:1.25rem}
.neu-tab{position:relative;min-height:44px;padding:.55rem 1.1rem;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:.92rem;font-weight:600;cursor:pointer;box-shadow:var(--neu-raised-sm);transition:box-shadow .2s,color .2s}
.neu-tab[aria-selected="true"]{border-color:var(--neu-accent);color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-tab[aria-selected="true"]::after{content:"";position:absolute;left:1.1rem;right:1.1rem;bottom:5px;height:3px;border-radius:3px;background:currentColor}
.neu-tab:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-tabpanel{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-tabpanel:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-devices{display:grid;gap:.9rem;margin:0;padding:0;list-style:none}
.neu-devices li{display:flex;align-items:center;gap:.85rem}
.neu-devices__icon{display:grid;place-items:center;flex:none;width:42px;height:42px;border-radius:50%;color:var(--neu-muted);box-shadow:var(--neu-inset-sm)}
.neu-devices__name{flex:1;min-width:0;font-weight:600;line-height:1.3}
.neu-devices__name small{display:block;font-size:.82rem;font-weight:400;color:var(--neu-muted)}
.neu-tag{flex:none;padding:.15rem .65rem;border:var(--neu-bw) solid currentColor;border-radius:999px;font-size:.75rem;font-weight:700;color:var(--neu-muted)}
.neu-tag--on{color:var(--neu-accent)}
/* Pagination: raised page buttons; the current page is pressed in and filled with accent, with aria-current */
.neu-pages{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0;padding:0;list-style:none}
.neu-page{display:grid;place-items:center;min-width:44px;height:44px;padding:0 .6rem;border:var(--neu-bw) solid var(--neu-edge);border-radius:999px;background:var(--neu-bg);
  color:var(--neu-ink);font-weight:600;font-variant-numeric:tabular-nums;text-decoration:none;box-shadow:var(--neu-raised-sm);transition:box-shadow .2s}
.neu-page:hover{box-shadow:var(--neu-raised)}
.neu-page[aria-current="page"]{border-color:var(--neu-accent);background:var(--neu-accent);color:var(--neu-on-accent);box-shadow:var(--neu-inset-sm)}
.neu-page:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-page--gap{min-width:24px;padding:0;border-color:transparent;box-shadow:none;color:var(--neu-muted)}
.neu-pages-note{margin:.9rem 0 0;font-size:.85rem;color:var(--neu-muted)}
@media (prefers-reduced-motion:reduce){.neu-btn,.neu-navlink,.neu-sidelink,.neu-tab,.neu-page{transition:none}}
JavaScript
// Tabs: click or arrow keys / Home / End select a tab; only the selected tab is in the Tab order
document.querySelectorAll('[role="tablist"]').forEach(function (list) {
  var tabs = Array.prototype.slice.call(list.querySelectorAll('[role="tab"]'));
  function select(tab, focus) {
    tabs.forEach(function (t) {
      var on = t === tab;
      t.setAttribute('aria-selected', on);
      t.tabIndex = on ? 0 : -1;
      document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
    });
    if (focus) tab.focus();
  }
  tabs.forEach(function (t, i) {
    t.addEventListener('click', function () { select(t); });
    t.addEventListener('keydown', function (e) {
      var n = { ArrowRight: i + 1, ArrowLeft: i - 1, Home: 0, End: tabs.length - 1 }[e.key];
      if (n === undefined) return;
      e.preventDefault();
      select(tabs[(n + tabs.length) % tabs.length], true);
    });
  });
});

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS, Bootstrap 5.3.8 JS bundle

HTML
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
  <symbol id="neu-i-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 10.5 12 4l8 6.5V20h-5.5v-6h-5v6H4z"/></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-grid" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
  <symbol id="neu-i-sofa" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 11V8a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v2h10v-2a2 2 0 0 1 4 0v5H3z"/><path d="M5 17v2M19 17v2"/></symbol>
  <symbol id="neu-i-star" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m12 3.5 2.6 5.4 5.9.8-4.3 4.1 1 5.8L12 16.8l-5.2 2.8 1-5.8-4.3-4.1 5.9-.8z"/></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-bell" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M6 16v-5a6 6 0 0 1 12 0v5l1.5 2h-15zM10 20.5a2 2 0 0 0 4 0"/></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-logout" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4h4.5a1.5 1.5 0 0 1 1.5 1.5v13a1.5 1.5 0 0 1-1.5 1.5H14M10 16.5 5.5 12 10 7.5M5.5 12H16"/></symbol>
  <symbol id="neu-i-chevLeft" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m15 6-6 6 6 6"/></symbol>
  <symbol id="neu-i-chevRight" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m9 6 6 6-6 6"/></symbol>
  <symbol id="neu-i-bulb" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 18h5M10.5 21h3M12 3a6 6 0 0 0-3.6 10.8c.6.5 1 1.2 1 2v.2h5.2v-.2c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z"/></symbol>
  <symbol id="neu-i-film" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="5" width="17" height="14" rx="2"/><path d="M3.5 9.5h17M8 5l2 4.5M13 5l2 4.5"/></symbol>
  <symbol id="neu-i-fan" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1.8"/><path d="M12 10.2c-1.2-3.2-.2-6.7 2.8-6.7 2 0 2.6 3-.9 5.2M13.8 12c3.2-1.2 6.7-.2 6.7 2.8 0 2-3 2.6-5.2-.9M12 13.8c1.2 3.2.2 6.7-2.8 6.7-2 0-2.6-3 .9-5.2M10.2 12c-3.2 1.2-6.7.2-6.7-2.8 0-2 3-2.6 5.2.9"/></symbol>
  <symbol id="neu-i-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="10.5" width="14" height="10" rx="2"/><path d="M8 10.5V7.5a4 4 0 0 1 8 0v3"/></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-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-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M4.6 4.6 6 6M18 18l1.4 1.4M2.5 12h2M19.5 12h2M4.6 19.4 6 18M18 6l1.4-1.4"/></symbol>
</svg>
<section><span class="lbl">Navbar</span><nav class="navbar navbar-expand neu-navbar" aria-label="Main">
<a class="navbar-brand" href="#"><span class="neu-brand__mark"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-home"/></svg></span>Hearth</a>
<ul class="navbar-nav"><li class="nav-item"><a class="nav-link active" href="#" aria-current="page">Overview</a></li><li class="nav-item"><a class="nav-link" href="#">Rooms</a></li><li class="nav-item"><a class="nav-link" href="#">Energy</a></li><li class="nav-item"><a class="nav-link" href="#">Automations</a></li></ul>
<div class="neu-navbar__actions"><button class="btn btn-neu btn-neu-icon btn-neu-icon-sm" type="button" aria-label="Search devices"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg></button><button class="neu-avatar-btn btn btn-neu btn-neu-icon btn-neu-icon-sm" type="button" aria-label="Account: Ada Okafor">AO</button></div>
</nav></section>
<div class="layout">
<section><span class="lbl">Sidebar</span><nav class="card neu-card neu-side" aria-label="Sidebar"><div class="card-body">
<h2 class="neu-side__heading" id="side-0">Home</h2><ul class="nav nav-pills flex-column" aria-labelledby="side-0"><li class="nav-item"><a class="nav-link active" href="#" aria-current="page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-grid"/></svg>Dashboard</a></li><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sofa"/></svg>Rooms</a></li><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-star"/></svg>Scenes</a></li><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg>Energy</a></li><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bell"/></svg>Alerts<span class="badge rounded-pill">3<span class="visually-hidden"> new</span></span></a></li></ul>
<h2 class="neu-side__heading" id="side-1">Account</h2><ul class="nav nav-pills flex-column" aria-labelledby="side-1"><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Settings</a></li><li class="nav-item"><a class="nav-link" href="#"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-logout"/></svg>Sign out</a></li></ul>
</div></nav></section>
<div class="main">
<section><span class="lbl">Tabs · arrow keys move between rooms</span><ul class="nav nav-pills neu-tabs" role="tablist" aria-label="Rooms"><li class="nav-item" role="presentation"><button class="nav-link active" id="tab-living" data-bs-toggle="tab" data-bs-target="#panel-living" type="button" role="tab" aria-controls="panel-living" aria-selected="true">Living room</button></li><li class="nav-item" role="presentation"><button class="nav-link" id="tab-kitchen" data-bs-toggle="tab" data-bs-target="#panel-kitchen" type="button" role="tab" aria-controls="panel-kitchen" aria-selected="false" tabindex="-1">Kitchen</button></li><li class="nav-item" role="presentation"><button class="nav-link" id="tab-bedroom" data-bs-toggle="tab" data-bs-target="#panel-bedroom" type="button" role="tab" aria-controls="panel-bedroom" aria-selected="false" tabindex="-1">Bedroom</button></li><li class="nav-item" role="presentation"><button class="nav-link" id="tab-garden" data-bs-toggle="tab" data-bs-target="#panel-garden" type="button" role="tab" aria-controls="panel-garden" aria-selected="false" tabindex="-1">Garden</button></li></ul>
<div class="card neu-card neu-tabpanel"><div class="card-body tab-content"><div class="tab-pane fade show active" id="panel-living" role="tabpanel" aria-labelledby="tab-living" tabindex="0"><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Ceiling light<small>Dimmed to 80%</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-film"/></svg></span><span class="neu-devices__name">Smart TV<small>Standby</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-fan"/></svg></span><span class="neu-devices__name">Air purifier<small>Auto, PM2.5 at 6</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div><div class="tab-pane fade" id="panel-kitchen" role="tabpanel" aria-labelledby="tab-kitchen" tabindex="0"><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Under-cabinet lights<small>Off since 21:40</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="neu-devices__name">Dishwasher<small>42 minutes left</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><span class="neu-devices__name">Kettle plug<small>Off</small></span><span class="neu-tag">Off</span></li></ul></div><div class="tab-pane fade" id="panel-bedroom" role="tabpanel" aria-labelledby="tab-bedroom" tabindex="0"><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Bedside lamp<small>Dimmed to 20%</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-sun"/></svg></span><span class="neu-devices__name">Blinds<small>Closed</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><span class="neu-devices__name">Heater<small>Eco, 18 °C</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div><div class="tab-pane fade" id="panel-garden" role="tabpanel" aria-labelledby="tab-garden" tabindex="0"><ul class="neu-devices"><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="neu-devices__name">Path lights<small>Sunset to 23:00</small></span><span class="neu-tag neu-tag--on">On</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="neu-devices__name">Sprinkler<small>Next run 06:00</small></span><span class="neu-tag">Off</span></li><li><span class="neu-devices__icon"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-lock"/></svg></span><span class="neu-devices__name">Gate lock<small>Locked</small></span><span class="neu-tag neu-tag--on">On</span></li></ul></div></div></div></section>
<section><span class="lbl">Pagination</span><nav aria-label="Activity log pages"><ul class="pagination neu-pages"><li class="page-item"><a class="page-link" href="#" aria-label="Previous page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-chevLeft"/></svg></a></li><li class="page-item"><a class="page-link" href="#" aria-label="Page 1">1</a></li><li class="page-item"><a class="page-link" href="#" aria-label="Page 2">2</a></li><li class="page-item active"><a class="page-link" href="#" aria-label="Page 3" aria-current="page">3</a></li><li class="page-item"><a class="page-link" href="#" aria-label="Page 4">4</a></li><li class="page-item"><span class="neu-page--gap" aria-hidden="true">…</span></li><li class="page-item"><a class="page-link" href="#" aria-label="Page 12">12</a></li><li class="page-item"><a class="page-link" href="#" aria-label="Next page"><svg class="neu-ico" aria-hidden="true" focusable="false"><use href="#neu-i-chevRight"/></svg></a></li></ul></nav>
<p class="neu-pages-note">Showing events 41–60 of 236</p></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}
/* 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}
/* Navbar: .navbar.navbar-expand with .nav-link; .active + aria-current = pressed in, accent, underline bar */
.neu-navbar{--bs-navbar-padding-x:1rem;--bs-navbar-padding-y:.75rem;--bs-navbar-color:var(--neu-muted);--bs-navbar-hover-color:var(--neu-ink);--bs-navbar-active-color:var(--neu-accent);
  --bs-navbar-brand-color:var(--neu-ink);--bs-navbar-brand-hover-color:var(--neu-ink);--bs-navbar-nav-link-padding-x:1rem;
  flex-wrap:wrap!important;gap:12px 20px;border:var(--neu-bw) solid var(--neu-line);border-radius:var(--neu-radius);background:var(--neu-bg);box-shadow:var(--neu-raised)}
.neu-navbar .navbar-brand{display:inline-flex;align-items:center;gap:.65rem;margin:0;padding:.2rem .4rem .2rem .2rem;border-radius:999px;font-size:1.1rem;font-weight:800}
.neu-brand__mark{display:grid;place-items:center;width:40px;height:40px;border-radius:50%;color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-navbar .navbar-nav{flex:1;flex-wrap:wrap;gap:6px}
.neu-navbar .nav-link{position:relative;display:inline-flex;align-items:center;min-height:42px;padding-top:.5rem;padding-bottom:.5rem;border:var(--neu-bw) solid transparent;
  border-radius:calc(var(--neu-radius)*.6);font-size:.92rem;font-weight:600;transition:box-shadow .2s,color .2s}
.neu-navbar .nav-link:hover{box-shadow:var(--neu-raised-sm)}
.neu-navbar .nav-link.active{border-color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-navbar .nav-link.active::after{content:"";position:absolute;left:1rem;right:1rem;bottom:5px;height:3px;border-radius:3px;background:currentColor}
.neu-navbar .navbar-brand:focus-visible,.neu-navbar .nav-link:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px;box-shadow:none}
.neu-navbar__actions{display:flex;align-items:center;gap:12px}
.neu-avatar-btn{font-size:.85rem;font-weight:700}
@media (max-width:700px){.neu-navbar__actions{margin-left:auto}.neu-navbar .navbar-nav{order:3;flex-basis:100%}}
/* Sidebar: .card holding .nav.nav-pills.flex-column; .active + aria-current = pressed in, accent, a dot */
.neu-side .card-body{display:grid;align-content:start;gap:.2rem;padding:1.1rem}
.neu-side .neu-side__heading{margin:.5rem .8rem .4rem;font-size:.72rem;font-weight:700;line-height:1.5;letter-spacing:.1em;text-transform:uppercase;color:var(--neu-muted)}
.neu-side .nav{--bs-nav-link-padding-x:.8rem;--bs-nav-link-padding-y:.55rem;--bs-nav-link-color:var(--neu-muted);--bs-nav-link-hover-color:var(--neu-ink);--bs-nav-link-font-weight:600;
  --bs-nav-pills-border-radius:calc(var(--neu-radius)*.6);--bs-nav-pills-link-active-bg:var(--neu-bg);--bs-nav-pills-link-active-color:var(--neu-accent);gap:6px}
.neu-side .nav-link{display:flex;align-items:center;gap:.75rem;min-height:44px;border:var(--neu-bw) solid transparent;transition:box-shadow .2s,color .2s}
.neu-side .nav-link:hover{box-shadow:var(--neu-raised-sm)}
.neu-side .nav-link.active{border-color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-side .nav-link.active::after{content:"";width:8px;height:8px;margin-left:auto;border-radius:50%;background:currentColor}
.neu-side .nav-link:focus-visible{outline:3px solid var(--neu-accent);outline-offset:2px;box-shadow:none}
.neu-side .badge{--bs-badge-font-size:.75rem;--bs-badge-padding-x:.45rem;--bs-badge-padding-y:.25rem;--bs-badge-color:var(--neu-on-accent);margin-left:auto;min-width:24px;background:var(--neu-accent)}
/* Tabs: .nav.nav-pills with Bootstrap's tab plugin (arrow keys included). Selected = pressed in, accent, underlined */
.neu-tabs{--bs-nav-link-padding-x:1.1rem;--bs-nav-link-padding-y:.55rem;--bs-nav-link-color:var(--neu-ink);--bs-nav-link-hover-color:var(--neu-ink);--bs-nav-link-font-weight:600;
  --bs-nav-pills-border-radius:calc(var(--neu-radius)*.75);--bs-nav-pills-link-active-bg:var(--neu-bg);--bs-nav-pills-link-active-color:var(--neu-accent);gap:10px;margin-bottom:1.25rem}
.neu-tabs .nav-link{position:relative;min-height:44px;border:var(--neu-bw) solid var(--neu-edge);font-size:.92rem;box-shadow:var(--neu-raised-sm);transition:box-shadow .2s,color .2s}
.neu-tabs .nav-link.active{border-color:var(--neu-accent);box-shadow:var(--neu-inset-sm)}
.neu-tabs .nav-link.active::after{content:"";position:absolute;left:1.1rem;right:1.1rem;bottom:5px;height:3px;border-radius:3px;background:currentColor}
.neu-tabs .nav-link:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px;box-shadow:var(--neu-inset-sm)}
.neu-tabpanel .card-body{padding:1.25rem}
.neu-tabpanel .tab-pane:focus-visible{outline:3px solid var(--neu-accent);outline-offset:8px;border-radius:4px}
.neu-devices{display:grid;gap:.9rem;margin:0;padding:0;list-style:none}
.neu-devices li{display:flex;align-items:center;gap:.85rem}
.neu-devices__icon{display:grid;place-items:center;flex:none;width:42px;height:42px;border-radius:50%;color:var(--neu-muted);box-shadow:var(--neu-inset-sm)}
.neu-devices__name{flex:1;min-width:0;font-weight:600;line-height:1.3}
.neu-devices__name small{display:block;font-size:.82rem;font-weight:400;color:var(--neu-muted)}
.neu-tag{flex:none;padding:.15rem .65rem;border:var(--neu-bw) solid currentColor;border-radius:999px;font-size:.75rem;font-weight:700;color:var(--neu-muted)}
.neu-tag--on{color:var(--neu-accent)}
/* Pagination: Bootstrap .pagination via --bs-pagination-*; the current page is pressed in and filled with accent */
.neu-pages{--bs-pagination-padding-x:.6rem;--bs-pagination-padding-y:0;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--neu-ink);--bs-pagination-bg:var(--neu-bg);
  --bs-pagination-border-width:var(--neu-bw);--bs-pagination-border-color:var(--neu-edge);--bs-pagination-border-radius:999px;--bs-pagination-hover-color:var(--neu-ink);
  --bs-pagination-hover-bg:var(--neu-bg);--bs-pagination-hover-border-color:var(--neu-edge);--bs-pagination-focus-color:var(--neu-ink);--bs-pagination-focus-bg:var(--neu-bg);
  --bs-pagination-focus-box-shadow:var(--neu-raised-sm);--bs-pagination-active-color:var(--neu-on-accent);--bs-pagination-active-bg:var(--neu-accent);--bs-pagination-active-border-color:var(--neu-accent);
  flex-wrap:wrap;align-items:center;gap:10px;margin:0}
.neu-pages .page-link{display:grid;place-items:center;min-width:44px;height:44px;margin:0!important;border-radius:999px!important;font-weight:600;font-variant-numeric:tabular-nums;box-shadow:var(--neu-raised-sm);transition:box-shadow .2s}
.neu-pages .page-link:hover{box-shadow:var(--neu-raised)}
.neu-pages .active>.page-link{box-shadow:var(--neu-inset-sm)}
.neu-pages .page-link:focus-visible{outline:3px solid var(--neu-accent);outline-offset:3px}
.neu-pages .neu-page--gap{display:grid;place-items:center;min-width:24px;height:44px;color:var(--neu-muted)}
.neu-pages-note{margin:.9rem 0 0;font-size:.85rem;color:var(--neu-muted)}
@media (prefers-reduced-motion:reduce){.btn-neu,.neu-navbar .nav-link,.neu-side .nav-link,.neu-tabs .nav-link,.neu-pages .page-link{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-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 10.5 12 4l8 6.5V20h-5.5v-6h-5v6H4z"/></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-grid" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
  <symbol id="neu-i-sofa" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 11V8a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v2h10v-2a2 2 0 0 1 4 0v5H3z"/><path d="M5 17v2M19 17v2"/></symbol>
  <symbol id="neu-i-star" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m12 3.5 2.6 5.4 5.9.8-4.3 4.1 1 5.8L12 16.8l-5.2 2.8 1-5.8-4.3-4.1 5.9-.8z"/></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-bell" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M6 16v-5a6 6 0 0 1 12 0v5l1.5 2h-15zM10 20.5a2 2 0 0 0 4 0"/></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-logout" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4h4.5a1.5 1.5 0 0 1 1.5 1.5v13a1.5 1.5 0 0 1-1.5 1.5H14M10 16.5 5.5 12 10 7.5M5.5 12H16"/></symbol>
  <symbol id="neu-i-chevLeft" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m15 6-6 6 6 6"/></symbol>
  <symbol id="neu-i-chevRight" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m9 6 6 6-6 6"/></symbol>
  <symbol id="neu-i-bulb" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 18h5M10.5 21h3M12 3a6 6 0 0 0-3.6 10.8c.6.5 1 1.2 1 2v.2h5.2v-.2c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z"/></symbol>
  <symbol id="neu-i-film" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="5" width="17" height="14" rx="2"/><path d="M3.5 9.5h17M8 5l2 4.5M13 5l2 4.5"/></symbol>
  <symbol id="neu-i-fan" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1.8"/><path d="M12 10.2c-1.2-3.2-.2-6.7 2.8-6.7 2 0 2.6 3-.9 5.2M13.8 12c3.2-1.2 6.7-.2 6.7 2.8 0 2-3 2.6-5.2-.9M12 13.8c1.2 3.2.2 6.7-2.8 6.7-2 0-2.6-3 .9-5.2M10.2 12c-3.2 1.2-6.7.2-6.7-2.8 0-2 3-2.6 5.2.9"/></symbol>
  <symbol id="neu-i-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="10.5" width="14" height="10" rx="2"/><path d="M8 10.5V7.5a4 4 0 0 1 8 0v3"/></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-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-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M4.6 4.6 6 6M18 18l1.4 1.4M2.5 12h2M19.5 12h2M4.6 19.4 6 18M18 6l1.4-1.4"/></symbol>
</svg>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Navbar</span><nav class="flex flex-wrap items-center gap-x-5 gap-y-3 rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg px-4 py-3 shadow-neu" aria-label="Main">
<a class="inline-flex items-center gap-[.65rem] rounded-full py-[.2rem] pr-[.4rem] pl-[.2rem] text-[1.1rem] font-extrabold text-neu-ink no-underline focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" href="#"><span class="grid size-10 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-home"/></svg></span>Hearth</a>
<ul class="m-0 flex flex-1 list-none flex-wrap gap-1.5 p-0 max-[700px]:order-3 max-[700px]:basis-full"><li><a class="relative inline-flex min-h-[42px] items-center rounded-neu-field border-(length:--neu-bw) border-transparent px-4 py-2 text-[.92rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:absolute aria-[current=page]:after:inset-x-4 aria-[current=page]:after:bottom-[5px] aria-[current=page]:after:h-[3px] aria-[current=page]:after:rounded-[3px] aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" href="#" aria-current="page">Overview</a></li><li><a class="relative inline-flex min-h-[42px] items-center rounded-neu-field border-(length:--neu-bw) border-transparent px-4 py-2 text-[.92rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:absolute aria-[current=page]:after:inset-x-4 aria-[current=page]:after:bottom-[5px] aria-[current=page]:after:h-[3px] aria-[current=page]:after:rounded-[3px] aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" href="#">Rooms</a></li><li><a class="relative inline-flex min-h-[42px] items-center rounded-neu-field border-(length:--neu-bw) border-transparent px-4 py-2 text-[.92rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:absolute aria-[current=page]:after:inset-x-4 aria-[current=page]:after:bottom-[5px] aria-[current=page]:after:h-[3px] aria-[current=page]:after:rounded-[3px] aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" href="#">Energy</a></li><li><a class="relative inline-flex min-h-[42px] items-center rounded-neu-field border-(length:--neu-bw) border-transparent px-4 py-2 text-[.92rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:absolute aria-[current=page]:after:inset-x-4 aria-[current=page]:after:bottom-[5px] aria-[current=page]:after:h-[3px] aria-[current=page]:after:rounded-[3px] aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" href="#">Automations</a></li></ul>
<div class="flex items-center gap-3 max-[700px]:ml-auto"><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-[42px] rounded-full border-neu-edge bg-neu-bg text-neu-ink" type="button" aria-label="Search devices"><svg class="size-[22px] shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-search"/></svg></button><button class="text-[.85rem] font-bold 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-[42px] rounded-full border-neu-edge bg-neu-bg text-neu-ink" type="button" aria-label="Account: Ada Okafor">AO</button></div>
</nav></section>
<div class="grid items-start gap-10 min-[801px]:grid-cols-[270px_minmax(0,1fr)]">
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Sidebar</span><nav class="grid content-start gap-[.2rem] rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-[1.1rem] text-neu-ink shadow-neu" aria-label="Sidebar">
<h2 class="mx-[.8rem] mt-2 mb-[.4rem] text-[.72rem] font-bold tracking-[.1em] text-neu-muted uppercase" id="side-0">Home</h2><ul class="m-0 grid list-none gap-1.5 p-0" aria-labelledby="side-0"><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#" aria-current="page"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-grid"/></svg>Dashboard</a></li><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-sofa"/></svg>Rooms</a></li><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-star"/></svg>Scenes</a></li><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg>Energy</a></li><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bell"/></svg>Alerts<span class="ml-auto min-w-6 rounded-full bg-neu-accent px-[.45rem] py-[.1rem] text-center text-[.75rem] font-bold text-neu-on-accent">3<span class="sr-only"> new</span></span></a></li></ul>
<h2 class="mx-[.8rem] mt-2 mb-[.4rem] text-[.72rem] font-bold tracking-[.1em] text-neu-muted uppercase" id="side-1">Account</h2><ul class="m-0 grid list-none gap-1.5 p-0" aria-labelledby="side-1"><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-sliders"/></svg>Settings</a></li><li><a class="flex min-h-11 items-center gap-3 rounded-neu-field border-(length:--neu-bw) border-transparent px-[.8rem] py-[.55rem] font-semibold text-neu-muted no-underline transition-[box-shadow,color] duration-200 hover:text-neu-ink hover:shadow-neu-sm aria-[current=page]:border-neu-accent aria-[current=page]:text-neu-accent aria-[current=page]:shadow-neu-in-sm aria-[current=page]:after:ml-auto aria-[current=page]:after:size-2 aria-[current=page]:after:rounded-full aria-[current=page]:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-neu-accent" href="#"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-logout"/></svg>Sign out</a></li></ul>
</nav></section>
<div class="grid gap-[52px]">
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Tabs · arrow keys move between rooms</span><div class="mb-5 flex flex-wrap gap-2.5" role="tablist" aria-label="Rooms"><button class="relative min-h-11 cursor-pointer rounded-neu-btn border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-[.55rem] text-[.92rem] font-semibold text-neu-ink shadow-neu-sm transition-[box-shadow,color] duration-200 aria-selected:border-neu-accent aria-selected:text-neu-accent aria-selected:shadow-neu-in-sm aria-selected:after:absolute aria-selected:after:inset-x-[1.1rem] aria-selected:after:bottom-[5px] aria-selected:after:h-[3px] aria-selected:after:rounded-[3px] aria-selected:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="tab-living" type="button" role="tab" aria-controls="panel-living" aria-selected="true">Living room</button><button class="relative min-h-11 cursor-pointer rounded-neu-btn border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-[.55rem] text-[.92rem] font-semibold text-neu-ink shadow-neu-sm transition-[box-shadow,color] duration-200 aria-selected:border-neu-accent aria-selected:text-neu-accent aria-selected:shadow-neu-in-sm aria-selected:after:absolute aria-selected:after:inset-x-[1.1rem] aria-selected:after:bottom-[5px] aria-selected:after:h-[3px] aria-selected:after:rounded-[3px] aria-selected:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="tab-kitchen" type="button" role="tab" aria-controls="panel-kitchen" aria-selected="false" tabindex="-1">Kitchen</button><button class="relative min-h-11 cursor-pointer rounded-neu-btn border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-[.55rem] text-[.92rem] font-semibold text-neu-ink shadow-neu-sm transition-[box-shadow,color] duration-200 aria-selected:border-neu-accent aria-selected:text-neu-accent aria-selected:shadow-neu-in-sm aria-selected:after:absolute aria-selected:after:inset-x-[1.1rem] aria-selected:after:bottom-[5px] aria-selected:after:h-[3px] aria-selected:after:rounded-[3px] aria-selected:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="tab-bedroom" type="button" role="tab" aria-controls="panel-bedroom" aria-selected="false" tabindex="-1">Bedroom</button><button class="relative min-h-11 cursor-pointer rounded-neu-btn border-(length:--neu-bw) border-neu-edge bg-neu-bg px-[1.1rem] py-[.55rem] text-[.92rem] font-semibold text-neu-ink shadow-neu-sm transition-[box-shadow,color] duration-200 aria-selected:border-neu-accent aria-selected:text-neu-accent aria-selected:shadow-neu-in-sm aria-selected:after:absolute aria-selected:after:inset-x-[1.1rem] aria-selected:after:bottom-[5px] aria-selected:after:h-[3px] aria-selected:after:rounded-[3px] aria-selected:after:bg-current motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="tab-garden" type="button" role="tab" aria-controls="panel-garden" aria-selected="false" tabindex="-1">Garden</button></div>
<div class="rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="panel-living" role="tabpanel" aria-labelledby="tab-living" tabindex="0"><ul class="m-0 grid list-none gap-[.9rem] p-0"><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Ceiling light<small class="block text-[.82rem] font-normal text-neu-muted">Dimmed to 80%</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-film"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Smart TV<small class="block text-[.82rem] font-normal text-neu-muted">Standby</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-muted">Off</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-fan"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Air purifier<small class="block text-[.82rem] font-normal text-neu-muted">Auto, PM2.5 at 6</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li></ul></div>
<div class="rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="panel-kitchen" role="tabpanel" aria-labelledby="tab-kitchen" tabindex="0" hidden><ul class="m-0 grid list-none gap-[.9rem] p-0"><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Under-cabinet lights<small class="block text-[.82rem] font-normal text-neu-muted">Off since 21:40</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-muted">Off</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Dishwasher<small class="block text-[.82rem] font-normal text-neu-muted">42 minutes left</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bolt"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Kettle plug<small class="block text-[.82rem] font-normal text-neu-muted">Off</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-muted">Off</span></li></ul></div>
<div class="rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="panel-bedroom" role="tabpanel" aria-labelledby="tab-bedroom" tabindex="0" hidden><ul class="m-0 grid list-none gap-[.9rem] p-0"><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Bedside lamp<small class="block text-[.82rem] font-normal text-neu-muted">Dimmed to 20%</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-sun"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Blinds<small class="block text-[.82rem] font-normal text-neu-muted">Closed</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-muted">Off</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-thermo"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Heater<small class="block text-[.82rem] font-normal text-neu-muted">Eco, 18 °C</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li></ul></div>
<div class="rounded-neu border-(length:--neu-bw) border-neu-line bg-neu-bg p-5 shadow-neu focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent" id="panel-garden" role="tabpanel" aria-labelledby="tab-garden" tabindex="0" hidden><ul class="m-0 grid list-none gap-[.9rem] p-0"><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-bulb"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Path lights<small class="block text-[.82rem] font-normal text-neu-muted">Sunset to 23:00</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-drop"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Sprinkler<small class="block text-[.82rem] font-normal text-neu-muted">Next run 06:00</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-muted">Off</span></li><li class="flex items-center gap-[.85rem]"><span class="grid size-[42px] flex-none place-items-center rounded-full text-neu-muted shadow-neu-in-sm"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-lock"/></svg></span><span class="min-w-0 flex-1 leading-[1.3] font-semibold">Gate lock<small class="block text-[.82rem] font-normal text-neu-muted">Locked</small></span><span class="flex-none rounded-full border-(length:--neu-bw) border-current px-[.65rem] py-[.15rem] text-[.75rem] font-bold text-neu-accent">On</span></li></ul></div></section>
<section><span class="mb-[18px] block text-[.72rem] font-semibold tracking-[.12em] text-neu-muted uppercase">Pagination</span><nav aria-label="Activity log pages"><ul class="m-0 flex list-none flex-wrap items-center gap-2.5 p-0"><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Previous page"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-chevLeft"/></svg></a></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Page 1">1</a></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Page 2">2</a></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-accent bg-neu-accent text-neu-on-accent shadow-neu-in-sm" href="#" aria-label="Page 3" aria-current="page">3</a></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Page 4">4</a></li><li><span class="grid h-11 min-w-6 place-items-center text-neu-muted" aria-hidden="true">…</span></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Page 12">12</a></li><li><a class="grid h-11 min-w-11 place-items-center rounded-full border-(length:--neu-bw) px-[.6rem] font-semibold tabular-nums no-underline transition-shadow duration-200 motion-reduce:transition-none focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-neu-accent border-neu-edge bg-neu-bg text-neu-ink shadow-neu-sm hover:shadow-neu" href="#" aria-label="Next page"><svg class="size-5 shrink-0" aria-hidden="true" focusable="false"><use href="#neu-i-chevRight"/></svg></a></li></ul></nav>
<p class="mt-[.9rem] text-[.85rem] text-neu-muted">Showing events 41–60 of 236</p></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);
}
JavaScript
// Tabs: click or arrow keys / Home / End select a tab; only the selected tab is in the Tab order
document.querySelectorAll('[role="tablist"]').forEach(function (list) {
  var tabs = Array.prototype.slice.call(list.querySelectorAll('[role="tab"]'));
  function select(tab, focus) {
    tabs.forEach(function (t) {
      var on = t === tab;
      t.setAttribute('aria-selected', on);
      t.tabIndex = on ? 0 : -1;
      document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
    });
    if (focus) tab.focus();
  }
  tabs.forEach(function (t, i) {
    t.addEventListener('click', function () { select(t); });
    t.addEventListener('keydown', function (e) {
      var n = { ArrowRight: i + 1, ArrowLeft: i - 1, Home: 0, End: tabs.length - 1 }[e.key];
      if (n === undefined) return;
      e.preventDefault();
      select(tabs[(n + tabs.length) % tabs.length], true);
    });
  });
});

About this set

A navbar, a sidebar, tabs and pagination that share one rule for where you are: the current item is pressed into the surface, turns accent, gains an accent edge, and adds a mark that does not rely on colour, either an underline bar or a dot. The navbar carries a brand, four links and two round actions, and moves its links onto their own row on narrow screens. The sidebar groups links under Home and Account headings and shows an unread count as text. The tabs switch between four rooms, each panel listing devices with an On or Off tag, and follow the ARIA tabs pattern: arrow keys, Home and End move between tabs and only the selected tab sits in the Tab order. Pagination uses round page buttons with a filled current page and named previous and next buttons. Use the navbar and sidebar together for an app shell, and the tabs where several panels share one space. The plain and Tailwind tabs use about twenty lines of vanilla JavaScript; the Bootstrap version uses Bootstrap’s own tab plugin.

What’s included

  • Current item shown by pressed shape, accent colour and a bar or dot
  • aria-current on the navbar, sidebar and pagination
  • ARIA tabs with arrow key, Home and End support
  • Pagination with named previous, next and page links
  • Bootstrap version on .navbar, .nav-pills, .pagination and the tab plugin

Accessibility

Each navigation region is a nav element with its own label, the current page is marked with aria-current="page", and page links read as Page 3 rather than a bare number. Tabs use role="tablist", "tab" and "tabpanel" with aria-selected, aria-controls and a roving tabindex. Every link, tab and panel shows a 3px accent focus ring, and transitions stop under prefers-reduced-motion.

Customise it

Edit the --neu-* tokens for colour and depth. In Bootstrap the rules set --bs-navbar-*, --bs-nav-pills-* and --bs-pagination-* from the tokens; in Tailwind the current state uses aria-[current=page]: and aria-selected: variants with shadow-neu-in-sm and text-neu-accent.