Open demo

CSS code

HTML
<div class="g-scene" aria-hidden="true"><i></i><i></i><i></i><i></i></div>
<div class="wrap">
<section class="g-glass g-panel" aria-labelledby="c1"><span class="lbl" id="c1">Glass buttons</span>
  <div class="g-row">
    <button type="button" class="g-btn g-btn--accent">Publish changes</button>
    <button type="button" class="g-btn">Save draft</button>
    <button type="button" class="g-btn"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 4v11M7 10l5 5 5-5M5 20h14"/></svg>Download report</button>
    <button type="button" class="g-btn g-btn--quiet">Discard</button>
  </div>
  <div class="g-row">
    <button type="button" class="g-btn g-btn--sm">Small</button>
    <button type="button" class="g-btn g-btn--lg g-btn--accent">Start free trial<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></button>
    <button type="button" class="g-btn" disabled>Archived</button>
  </div>
</section>
<section class="g-glass g-panel" aria-labelledby="c2"><span class="lbl" id="c2">Icon buttons</span>
  <div class="g-row">
    <button type="button" class="g-icon-btn g-icon-btn--accent g-icon-btn--lg" aria-label="Play"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.5v13l10.5-6.5z"/></svg></button>
    <button type="button" class="g-icon-btn" aria-label="Add to favourites"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"/></svg></button>
    <button type="button" class="g-icon-btn" aria-label="Share"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 13v6a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-6M12 3v12M7 8l5-5 5 5"/></svg></button>
    <button type="button" class="g-icon-btn" aria-label="More options"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg></button>
    <button type="button" class="g-btn"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>New project</button>
  </div>
</section>
<div class="grid2">
<section class="g-glass g-panel" aria-labelledby="c3"><span class="lbl" id="c3">Switches</span>
  <ul class="g-list">
    <li><label class="g-switch"><span>Wi-Fi<small>Connected to Harbour-5G</small></span><input type="checkbox" role="switch" checked></label></li>
    <li><label class="g-switch"><span>Focus mode<small>Silence notifications until 18:00</small></span><input type="checkbox" role="switch"></label></li>
    <li><label class="g-switch"><span>Share location<small>Only with your team</small></span><input type="checkbox" role="switch" checked></label></li>
  </ul>
</section>
<section class="g-glass g-panel" aria-labelledby="c4"><span class="lbl" id="c4">Segmented controls</span>
  <div class="g-stack">
  <fieldset class="g-seg"><legend class="sr-only">Calendar view</legend>
    <label><input type="radio" name="view" value="day"><span>Day</span></label>
    <label><input type="radio" name="view" value="week" checked><span>Week</span></label>
    <label><input type="radio" name="view" value="month"><span>Month</span></label>
  </fieldset>
  <fieldset class="g-seg"><legend class="sr-only">Billing period</legend>
    <label><input type="radio" name="billing" value="monthly" checked><span>Monthly</span></label>
    <label><input type="radio" name="billing" value="yearly"><span>Yearly, save 20%</span></label>
  </fieldset>
  </div>
</section>
</div>
</div>
CSS
/* ===== uiCookies Glassmorphism kit: design tokens (identical in every set) =====
   Retheme the whole kit here. Light scene on :root, dark scene on [data-scene="dark"]
   (or any [data-scene] holding a checked [data-scene-switch]). Selectors use :where()
   so the fallbacks below always win. */
:where(:root,[data-scene="light"]){
  color-scheme:light;
  /* background scene: the colour the glass frosts */
  --scene-base:linear-gradient(155deg,#eceffe 0%,#fbeef7 52%,#e6f6fb 100%);
  --scene-1:linear-gradient(140deg,#7c3aed,#c026d3);
  --scene-2:linear-gradient(140deg,#fb7185,#f97316);
  --scene-3:linear-gradient(140deg,#22d3ee,#3b82f6);
  --scene-4:linear-gradient(140deg,#fde047,#fb923c);
  /* glass */
  --glass-tint:255 255 255;
  --glass-border:rgb(255 255 255 / .8);
  --glass-edge:rgb(36 32 88 / .9);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .85);
  --glass-shadow:0 18px 40px -18px rgb(37 30 102 / .45);
  --glass-ink:#16133a;
  --glass-ink-soft:#3b3862;
  --glass-accent:#4338ca;
  --glass-accent-bg:rgb(67 56 202 / .92);
  --glass-on-accent:#fff;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#1e1b4b;
  --glass-good:#14532d;--glass-good-bg:rgb(220 252 231 / .9);
  --glass-bad:#991b1b;--glass-bad-bg:rgb(254 226 226 / .9);
  --glass-warn:#7c2d12;--glass-warn-bg:rgb(254 243 199 / .9);
  --glass-scrim:rgb(22 19 58 / .3);
}
:where([data-scene="dark"]),:where([data-scene]:has([data-scene-switch]:checked)){
  color-scheme:dark;
  --scene-base:linear-gradient(155deg,#0a0c22 0%,#170c2c 52%,#06171f 100%);
  --scene-1:linear-gradient(140deg,#6d28d9,#a21caf);
  --scene-2:linear-gradient(140deg,#e11d48,#ea580c);
  --scene-3:linear-gradient(140deg,#0891b2,#2563eb);
  --scene-4:linear-gradient(140deg,#ca8a04,#c2410c);
  --glass-tint:16 18 44;
  --glass-border:rgb(255 255 255 / .2);
  --glass-edge:rgb(214 220 255 / .72);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .16);
  --glass-shadow:0 18px 40px -18px rgb(0 0 0 / .75);
  --glass-ink:#f5f6ff;
  --glass-ink-soft:#d0d3ee;
  --glass-accent:#a5b4fc;
  --glass-accent-bg:rgb(165 180 252 / .96);
  --glass-on-accent:#14123a;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%2314123a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#c7d2fe;
  --glass-good:#bbf7d0;--glass-good-bg:rgb(20 83 45 / .7);
  --glass-bad:#fecaca;--glass-bad-bg:rgb(127 29 29 / .7);
  --glass-warn:#fde68a;--glass-warn-bg:rgb(120 53 15 / .7);
  --glass-scrim:rgb(0 0 0 / .5);
}
:where(:root){
  --glass-alpha:.6;          /* panels and cards */
  --glass-alpha-strong:.82;  /* menus, dialogs, toasts: they cover unknown content */
  --glass-alpha-control:.5;  /* buttons and fields sitting on a panel */
  --glass-blur:18px;
  --glass-saturate:150%;
  --glass-radius:20px;
}
/* derived: recomputed inside every scene so a dark scene gets dark glass */
:where(:root,[data-scene]){
  --glass-bg:rgb(var(--glass-tint) / var(--glass-alpha));
  --glass-bg-strong:rgb(var(--glass-tint) / var(--glass-alpha-strong));
  --glass-bg-control:rgb(var(--glass-tint) / var(--glass-alpha-control));
}
/* no backdrop-filter: frosting can't happen, so the glass turns nearly solid */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  :where(:root){--glass-alpha:.94;--glass-alpha-strong:.97;--glass-alpha-control:.9}
}
@media (prefers-reduced-transparency:reduce){
  :where(:root){--glass-alpha:.93;--glass-alpha-strong:.97;--glass-alpha-control:.9;--glass-blur:8px}
}
@media (prefers-contrast:more){
  :where(:root){--glass-alpha:.96;--glass-alpha-strong:.98;--glass-alpha-control:.96}
  :where(:root,[data-scene]){--glass-border:var(--glass-ink);--glass-edge:var(--glass-ink)}
}
/* ===== end of tokens ===== */
/* scene: fixed page background of four gradient orbs (decorative, aria-hidden) */
:where([data-scene]){color:var(--glass-ink)}
.g-scene{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none;background:var(--scene-base)}
.g-scene i{position:absolute;aspect-ratio:1;border-radius:50%;animation:g-drift 32s ease-in-out infinite alternate}
.g-scene i:nth-child(1){width:clamp(240px,40vw,520px);left:-7%;top:-9%;background:var(--scene-1)}
.g-scene i:nth-child(2){width:clamp(170px,26vw,360px);right:-5%;top:18%;background:var(--scene-2);animation-delay:-9s}
.g-scene i:nth-child(3){width:clamp(220px,34vw,460px);left:28%;bottom:-16%;background:var(--scene-3);animation-delay:-17s}
.g-scene i:nth-child(4){width:clamp(90px,13vw,180px);left:54%;top:7%;background:var(--scene-4);animation-delay:-4s}
@keyframes g-drift{to{transform:translate3d(3vw,4vh,0) scale(1.06)}}
/* glass surface */
.g-glass{background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));
  backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));border:1px solid var(--glass-border);
  border-radius:var(--glass-radius);box-shadow:var(--glass-highlight),var(--glass-shadow);color:var(--glass-ink)}
.g-glass--strong{background:var(--glass-bg-strong)}
.g-panel{padding:24px}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.g-muted{color:var(--glass-ink-soft)}
@media (prefers-reduced-motion:reduce){.g-scene i{animation:none}}
/* buttons: glass control, tinted accent glass, quiet text button, round icon button */
.g-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.g-row+.g-row{margin-top:14px}
.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:0 20px;
  border:1px solid var(--glass-edge);border-radius:999px;background:var(--glass-bg-control);
  -webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));box-shadow:var(--glass-highlight);
  color:var(--glass-ink);font:inherit;font-size:.95rem;font-weight:600;line-height:1;text-decoration:none;cursor:pointer;
  transition:background-color .2s,transform .2s}
.g-btn:hover{background:var(--glass-bg-strong)}
.g-btn:active{transform:translateY(1px)}
.g-btn:focus-visible,.g-icon-btn:focus-visible{outline:3px solid var(--glass-focus);outline-offset:3px}
.g-btn svg,.g-icon-btn svg{width:18px;height:18px;flex:none}
.g-btn--accent{border-color:transparent;background:var(--glass-accent-bg);color:var(--glass-on-accent);
  box-shadow:var(--glass-highlight)}
.g-btn--accent:hover{background:var(--glass-accent-bg);filter:brightness(1.08)}
.g-btn--quiet{border-color:transparent;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;
  text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.g-btn--quiet:hover{background:var(--glass-bg-control)}
.g-btn--strong{background:var(--glass-bg-strong)} /* for buttons placed straight on the scene */
.g-btn--sm{min-height:36px;padding:0 14px;font-size:.85rem}
.g-btn--lg{min-height:54px;padding:0 28px;font-size:1.05rem}
.g-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
.g-icon-btn{display:inline-grid;place-items:center;width:44px;height:44px;padding:0;border:1px solid var(--glass-edge);border-radius:50%;
  background:var(--glass-bg-control);-webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));
  box-shadow:var(--glass-highlight);color:var(--glass-ink);cursor:pointer;transition:background-color .2s,transform .2s}
.g-icon-btn:hover{background:var(--glass-bg-strong)}
.g-icon-btn:active{transform:scale(.96)}
.g-icon-btn--accent{border-color:transparent;background:var(--glass-accent-bg);color:var(--glass-on-accent)}
.g-icon-btn--accent:hover{background:var(--glass-accent-bg);filter:brightness(1.08)}
.g-icon-btn--lg{width:56px;height:56px}
.g-icon-btn--lg svg{width:22px;height:22px}
@media (prefers-reduced-motion:reduce){.g-btn,.g-icon-btn{transition:none}.g-btn:active,.g-icon-btn:active{transform:none}}
/* switch: the checkbox itself is restyled (appearance:none); the knob is a background gradient, dark when off, white when on */
.g-switch{display:flex;align-items:center;justify-content:space-between;gap:16px;cursor:pointer}
.g-switch small{display:block;font-size:.8rem;color:var(--glass-ink-soft)}
.g-switch input{-webkit-appearance:none;appearance:none;flex:none;width:52px;height:30px;margin:0;border:1px solid var(--glass-edge);
  border-radius:999px;cursor:pointer;
  background:radial-gradient(circle closest-side,var(--glass-ink-soft) 0 82%,transparent 88%) 3px 50% / 22px 22px no-repeat,var(--glass-bg-control);
  box-shadow:inset 0 1px 3px rgb(0 0 0 / .14);transition:background-position .2s,background-color .2s}
.g-switch input:checked{border-color:transparent;
  background:radial-gradient(circle closest-side,var(--glass-on-accent) 0 88%,transparent 94%) calc(100% - 3px) 50% / 24px 24px no-repeat,var(--glass-accent-bg)}
.g-switch input:focus-visible{outline:3px solid var(--glass-focus);outline-offset:3px}
/* segmented control: a radio group */
.g-seg{display:inline-flex;margin:0;padding:4px;border:1px solid var(--glass-edge);border-radius:999px;background:var(--glass-bg-control);
  -webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur))}
.g-seg legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
.g-seg label{position:relative;cursor:pointer}
.g-seg input{position:absolute;inset:0;opacity:0;margin:0;cursor:pointer}
.g-seg span{display:block;padding:8px 18px;border-radius:999px;font-size:.9rem;font-weight:600;color:var(--glass-ink);transition:background-color .2s,color .2s}
.g-seg input:checked+span{background:var(--glass-accent-bg);color:var(--glass-on-accent)}
.g-seg input:focus-visible+span{outline:3px solid var(--glass-focus);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.g-switch input,.g-seg span{transition:none}}
.g-list{list-style:none;display:grid;gap:4px}
.g-list li+li{border-top:1px solid var(--glass-border);padding-top:12px;margin-top:8px}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="g-scene" aria-hidden="true"><i></i><i></i><i></i><i></i></div>
<div class="wrap">
<section class="card g-glass" aria-labelledby="c1"><div class="card-body"><span class="lbl" id="c1">Glass buttons</span>
  <div class="g-row">
    <button type="button" class="btn btn-glass btn-glass-accent">Publish changes</button>
    <button type="button" class="btn btn-glass">Save draft</button>
    <button type="button" class="btn btn-glass"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 4v11M7 10l5 5 5-5M5 20h14"/></svg>Download report</button>
    <button type="button" class="btn btn-glass btn-glass-quiet">Discard</button>
  </div>
  <div class="g-row mt-3">
    <button type="button" class="btn btn-glass btn-sm">Small</button>
    <button type="button" class="btn btn-glass btn-glass-accent btn-lg">Start free trial<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></button>
    <button type="button" class="btn btn-glass" disabled>Archived</button>
  </div>
</div></section>
<section class="card g-glass" aria-labelledby="c2"><div class="card-body"><span class="lbl" id="c2">Icon buttons</span>
  <div class="g-row">
    <button type="button" class="btn btn-glass btn-glass-accent btn-icon btn-lg rounded-circle" aria-label="Play"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.5v13l10.5-6.5z"/></svg></button>
    <button type="button" class="btn btn-glass btn-icon rounded-circle" aria-label="Add to favourites"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"/></svg></button>
    <button type="button" class="btn btn-glass btn-icon rounded-circle" aria-label="Share"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 13v6a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-6M12 3v12M7 8l5-5 5 5"/></svg></button>
    <button type="button" class="btn btn-glass btn-icon rounded-circle" aria-label="More options"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg></button>
    <button type="button" class="btn btn-glass"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>New project</button>
  </div>
</div></section>
<div class="row g-4">
<div class="col-md-6"><section class="card g-glass h-100" aria-labelledby="c3"><div class="card-body"><span class="lbl" id="c3">Switches</span>
  <ul class="list-unstyled m-0 g-list">
    <li><div class="form-check form-switch g-switch"><label class="form-check-label" for="sw1">Wi-Fi<small>Connected to Harbour-5G</small></label><input class="form-check-input" type="checkbox" role="switch" id="sw1" checked></div></li>
    <li><div class="form-check form-switch g-switch"><label class="form-check-label" for="sw2">Focus mode<small>Silence notifications until 18:00</small></label><input class="form-check-input" type="checkbox" role="switch" id="sw2"></div></li>
    <li><div class="form-check form-switch g-switch"><label class="form-check-label" for="sw3">Share location<small>Only with your team</small></label><input class="form-check-input" type="checkbox" role="switch" id="sw3" checked></div></li>
  </ul>
</div></section></div>
<div class="col-md-6"><section class="card g-glass h-100" aria-labelledby="c4"><div class="card-body"><span class="lbl" id="c4">Segmented controls</span>
  <div class="d-flex flex-column align-items-start gap-3">
  <fieldset class="g-seg"><legend class="visually-hidden">Calendar view</legend>
    <input type="radio" class="btn-check" name="view" id="v1" value="day"><label class="btn" for="v1">Day</label>
    <input type="radio" class="btn-check" name="view" id="v2" value="week" checked><label class="btn" for="v2">Week</label>
    <input type="radio" class="btn-check" name="view" id="v3" value="month"><label class="btn" for="v3">Month</label>
  </fieldset>
  <fieldset class="g-seg"><legend class="visually-hidden">Billing period</legend>
    <input type="radio" class="btn-check" name="billing" id="b1" value="monthly" checked><label class="btn" for="b1">Monthly</label>
    <input type="radio" class="btn-check" name="billing" id="b2" value="yearly"><label class="btn" for="b2">Yearly, save 20%</label>
  </fieldset>
  </div>
</div></section></div>
</div>
</div>
CSS
/* ===== uiCookies Glassmorphism kit: design tokens (identical in every set) =====
   Retheme the whole kit here. Light scene on :root, dark scene on [data-scene="dark"]
   (or any [data-scene] holding a checked [data-scene-switch]). Selectors use :where()
   so the fallbacks below always win. */
:where(:root,[data-scene="light"]){
  color-scheme:light;
  /* background scene: the colour the glass frosts */
  --scene-base:linear-gradient(155deg,#eceffe 0%,#fbeef7 52%,#e6f6fb 100%);
  --scene-1:linear-gradient(140deg,#7c3aed,#c026d3);
  --scene-2:linear-gradient(140deg,#fb7185,#f97316);
  --scene-3:linear-gradient(140deg,#22d3ee,#3b82f6);
  --scene-4:linear-gradient(140deg,#fde047,#fb923c);
  /* glass */
  --glass-tint:255 255 255;
  --glass-border:rgb(255 255 255 / .8);
  --glass-edge:rgb(36 32 88 / .9);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .85);
  --glass-shadow:0 18px 40px -18px rgb(37 30 102 / .45);
  --glass-ink:#16133a;
  --glass-ink-soft:#3b3862;
  --glass-accent:#4338ca;
  --glass-accent-bg:rgb(67 56 202 / .92);
  --glass-on-accent:#fff;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#1e1b4b;
  --glass-good:#14532d;--glass-good-bg:rgb(220 252 231 / .9);
  --glass-bad:#991b1b;--glass-bad-bg:rgb(254 226 226 / .9);
  --glass-warn:#7c2d12;--glass-warn-bg:rgb(254 243 199 / .9);
  --glass-scrim:rgb(22 19 58 / .3);
}
:where([data-scene="dark"]),:where([data-scene]:has([data-scene-switch]:checked)){
  color-scheme:dark;
  --scene-base:linear-gradient(155deg,#0a0c22 0%,#170c2c 52%,#06171f 100%);
  --scene-1:linear-gradient(140deg,#6d28d9,#a21caf);
  --scene-2:linear-gradient(140deg,#e11d48,#ea580c);
  --scene-3:linear-gradient(140deg,#0891b2,#2563eb);
  --scene-4:linear-gradient(140deg,#ca8a04,#c2410c);
  --glass-tint:16 18 44;
  --glass-border:rgb(255 255 255 / .2);
  --glass-edge:rgb(214 220 255 / .72);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .16);
  --glass-shadow:0 18px 40px -18px rgb(0 0 0 / .75);
  --glass-ink:#f5f6ff;
  --glass-ink-soft:#d0d3ee;
  --glass-accent:#a5b4fc;
  --glass-accent-bg:rgb(165 180 252 / .96);
  --glass-on-accent:#14123a;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%2314123a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#c7d2fe;
  --glass-good:#bbf7d0;--glass-good-bg:rgb(20 83 45 / .7);
  --glass-bad:#fecaca;--glass-bad-bg:rgb(127 29 29 / .7);
  --glass-warn:#fde68a;--glass-warn-bg:rgb(120 53 15 / .7);
  --glass-scrim:rgb(0 0 0 / .5);
}
:where(:root){
  --glass-alpha:.6;          /* panels and cards */
  --glass-alpha-strong:.82;  /* menus, dialogs, toasts: they cover unknown content */
  --glass-alpha-control:.5;  /* buttons and fields sitting on a panel */
  --glass-blur:18px;
  --glass-saturate:150%;
  --glass-radius:20px;
}
/* derived: recomputed inside every scene so a dark scene gets dark glass */
:where(:root,[data-scene]){
  --glass-bg:rgb(var(--glass-tint) / var(--glass-alpha));
  --glass-bg-strong:rgb(var(--glass-tint) / var(--glass-alpha-strong));
  --glass-bg-control:rgb(var(--glass-tint) / var(--glass-alpha-control));
}
/* no backdrop-filter: frosting can't happen, so the glass turns nearly solid */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  :where(:root){--glass-alpha:.94;--glass-alpha-strong:.97;--glass-alpha-control:.9}
}
@media (prefers-reduced-transparency:reduce){
  :where(:root){--glass-alpha:.93;--glass-alpha-strong:.97;--glass-alpha-control:.9;--glass-blur:8px}
}
@media (prefers-contrast:more){
  :where(:root){--glass-alpha:.96;--glass-alpha-strong:.98;--glass-alpha-control:.96}
  :where(:root,[data-scene]){--glass-border:var(--glass-ink);--glass-edge:var(--glass-ink)}
}
/* ===== end of tokens ===== */
/* scene: fixed page background of four gradient orbs (decorative, aria-hidden) */
:where([data-scene]){color:var(--glass-ink)}
.g-scene{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none;background:var(--scene-base)}
.g-scene i{position:absolute;aspect-ratio:1;border-radius:50%;animation:g-drift 32s ease-in-out infinite alternate}
.g-scene i:nth-child(1){width:clamp(240px,40vw,520px);left:-7%;top:-9%;background:var(--scene-1)}
.g-scene i:nth-child(2){width:clamp(170px,26vw,360px);right:-5%;top:18%;background:var(--scene-2);animation-delay:-9s}
.g-scene i:nth-child(3){width:clamp(220px,34vw,460px);left:28%;bottom:-16%;background:var(--scene-3);animation-delay:-17s}
.g-scene i:nth-child(4){width:clamp(90px,13vw,180px);left:54%;top:7%;background:var(--scene-4);animation-delay:-4s}
@keyframes g-drift{to{transform:translate3d(3vw,4vh,0) scale(1.06)}}
/* glass surface */
.g-glass{background:var(--glass-bg);-webkit-backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));
  backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-saturate));border:1px solid var(--glass-border);
  border-radius:var(--glass-radius);box-shadow:var(--glass-highlight),var(--glass-shadow);color:var(--glass-ink)}
.g-glass--strong{background:var(--glass-bg-strong)}
.g-panel{padding:24px}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.g-muted{color:var(--glass-ink-soft)}
@media (prefers-reduced-motion:reduce){.g-scene i{animation:none}}
/* Bootstrap: the glass tokens feed Bootstrap's own component variables */
.card.g-glass{--bs-card-bg:var(--glass-bg);--bs-card-border-color:var(--glass-border);--bs-card-border-radius:var(--glass-radius);
  --bs-card-inner-border-radius:calc(var(--glass-radius) - 1px);--bs-card-color:var(--glass-ink);--bs-card-spacer-x:24px;--bs-card-spacer-y:24px;
  --bs-card-title-color:var(--glass-ink);--bs-card-subtitle-color:var(--glass-ink-soft)}
:where([data-scene]){--bs-body-color:var(--glass-ink);--bs-secondary-color:var(--glass-ink-soft);--bs-border-color:var(--glass-edge);;--bs-emphasis-color:var(--glass-ink)}
.g-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.btn-glass{--bs-btn-padding-x:20px;--bs-btn-padding-y:0;--bs-btn-font-size:.95rem;--bs-btn-font-weight:600;--bs-btn-line-height:1;--bs-btn-border-radius:999px;
  --bs-btn-color:var(--glass-ink);--bs-btn-bg:var(--glass-bg-control);--bs-btn-border-color:var(--glass-edge);
  --bs-btn-hover-color:var(--glass-ink);--bs-btn-hover-bg:var(--glass-bg-strong);--bs-btn-hover-border-color:var(--glass-edge);
  --bs-btn-active-color:var(--glass-ink);--bs-btn-active-bg:var(--glass-bg-strong);--bs-btn-active-border-color:var(--glass-edge);
  --bs-btn-disabled-color:var(--glass-ink);--bs-btn-disabled-bg:var(--glass-bg-control);--bs-btn-disabled-border-color:var(--glass-edge);--bs-btn-disabled-opacity:.5;
  --bs-btn-focus-box-shadow:var(--glass-highlight);
  display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;
  -webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur));box-shadow:var(--glass-highlight);
  transition:background-color .2s,transform .2s}
.btn-glass:active{transform:translateY(1px)}
.btn-glass:focus-visible,.btn-check:focus-visible+.btn-glass{outline:3px solid var(--glass-focus);outline-offset:3px}
.btn-glass svg{width:18px;height:18px;flex:none}
.btn-glass-accent{--bs-btn-color:var(--glass-on-accent);--bs-btn-bg:var(--glass-accent-bg);--bs-btn-border-color:transparent;
  --bs-btn-hover-color:var(--glass-on-accent);--bs-btn-hover-bg:var(--glass-accent-bg);--bs-btn-hover-border-color:transparent;
  --bs-btn-active-color:var(--glass-on-accent);--bs-btn-active-bg:var(--glass-accent-bg);--bs-btn-active-border-color:transparent}
.btn-glass-accent:hover{filter:brightness(1.08)}
.btn-glass-quiet{--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-border-color:transparent;--bs-btn-hover-bg:var(--glass-bg-control);
  -webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;text-decoration:underline;text-underline-offset:4px}
.btn-glass-strong{--bs-btn-bg:var(--glass-bg-strong)} /* for buttons placed straight on the scene */
.btn-glass.btn-sm{--bs-btn-padding-x:14px;--bs-btn-font-size:.85rem;min-height:36px}
.btn-glass.btn-lg{--bs-btn-padding-x:28px;--bs-btn-font-size:1.05rem;min-height:54px}
.btn-glass.btn-icon{width:44px;height:44px;min-height:0;padding:0}
.btn-glass.btn-icon.btn-sm{width:36px;height:36px}
.btn-glass.btn-icon.btn-sm svg{width:16px;height:16px}
.btn-glass.btn-icon.btn-lg{width:56px;height:56px}
.btn-glass.btn-icon.btn-lg svg{width:22px;height:22px}
@media (prefers-reduced-motion:reduce){.btn-glass{transition:none}.btn-glass:active{transform:none}}
/* .form-switch: Bootstrap's knob image (--bs-form-switch-bg) becomes a gradient so it can follow the tokens */
.g-switch{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:0;margin:0;padding:0}
.g-switch .form-check-label{cursor:pointer}
.g-switch small{display:block;font-size:.8rem;color:var(--glass-ink-soft)}
.g-switch .form-check-input{flex:none;float:none;width:52px;height:30px;margin:0;border:1px solid var(--glass-edge);cursor:pointer;
  --bs-form-switch-bg:radial-gradient(circle closest-side,var(--glass-ink-soft) 0 82%,transparent 88%);
  background-color:var(--glass-bg-control);background-size:22px 22px;background-position:3px 50%;box-shadow:inset 0 1px 3px rgb(0 0 0 / .14);
  transition:background-position .2s,background-color .2s}
.g-switch .form-check-input:focus,.g-switch.form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:radial-gradient(circle closest-side,var(--glass-ink-soft) 0 82%,transparent 88%);
  border-color:var(--glass-edge);box-shadow:inset 0 1px 3px rgb(0 0 0 / .14)}
.g-switch .form-check-input:checked{--bs-form-switch-bg:radial-gradient(circle closest-side,var(--glass-on-accent) 0 88%,transparent 94%);
  border-color:transparent;background-color:var(--glass-accent-bg);background-size:24px 24px;background-position:calc(100% - 3px) 50%}
.g-switch .form-check-input:focus-visible{outline:3px solid var(--glass-focus);outline-offset:3px}
/* segmented control: .btn-check radios */
.g-seg{display:inline-flex;margin:0;padding:4px;border:1px solid var(--glass-edge);border-radius:999px;background:var(--glass-bg-control);
  -webkit-backdrop-filter:blur(var(--glass-blur));backdrop-filter:blur(var(--glass-blur))}
.g-seg .btn{--bs-btn-padding-x:18px;--bs-btn-padding-y:8px;--bs-btn-font-size:.9rem;--bs-btn-font-weight:600;--bs-btn-border-radius:999px;
  --bs-btn-color:var(--glass-ink);--bs-btn-border-width:0;--bs-btn-hover-color:var(--glass-ink);--bs-btn-hover-bg:transparent;
  --bs-btn-active-color:var(--glass-on-accent);--bs-btn-active-bg:var(--glass-accent-bg);--bs-btn-focus-box-shadow:none;transition:background-color .2s,color .2s}
.g-seg .btn-check:focus-visible+.btn{outline:3px solid var(--glass-focus);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.g-switch .form-check-input,.g-seg .btn{transition:none}}
.g-list>li+li{border-top:1px solid var(--glass-border);padding-top:12px;margin-top:8px}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10 overflow-hidden bg-(image:--scene-base)">
  <i class="absolute -top-[9%] -left-[7%] aspect-square w-[clamp(240px,40vw,520px)] rounded-full bg-(image:--scene-1) motion-safe:animate-drift"></i>
  <i class="absolute top-[18%] -right-[5%] aspect-square w-[clamp(170px,26vw,360px)] rounded-full bg-(image:--scene-2) [animation-delay:-9s] motion-safe:animate-drift"></i>
  <i class="absolute -bottom-[16%] left-[28%] aspect-square w-[clamp(220px,34vw,460px)] rounded-full bg-(image:--scene-3) [animation-delay:-17s] motion-safe:animate-drift"></i>
  <i class="absolute top-[7%] left-[54%] aspect-square w-[clamp(90px,13vw,180px)] rounded-full bg-(image:--scene-4) [animation-delay:-4s] motion-safe:animate-drift"></i>
</div>
<div class="mx-auto flex max-w-[980px] flex-col gap-[26px]">
<section class="border border-glass-border bg-glass text-ink shadow-glass inset-shadow-glass backdrop-blur-glass backdrop-saturate-150 rounded-glass p-6" aria-labelledby="c1"><span class="mb-4 block text-[.72rem] font-bold tracking-[.12em] text-ink-soft uppercase" id="c1">Glass buttons</span>
  <div class="flex flex-wrap items-center gap-3">
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-transparent bg-accent-glass leading-none font-semibold text-on-accent no-underline inset-shadow-glass backdrop-blur-glass transition-[filter,translate] duration-200 hover:brightness-[1.08] active:translate-y-px focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-11 px-5 text-[.95rem]">Publish changes</button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-glass-edge bg-glass-control leading-none font-semibold text-ink no-underline inset-shadow-glass backdrop-blur-glass transition-[background-color,translate] duration-200 hover:bg-glass-strong active:translate-y-px disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-11 px-5 text-[.95rem]">Save draft</button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-glass-edge bg-glass-control leading-none font-semibold text-ink no-underline inset-shadow-glass backdrop-blur-glass transition-[background-color,translate] duration-200 hover:bg-glass-strong active:translate-y-px disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-11 px-5 text-[.95rem]"><svg class="size-[18px] flex-none" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 4v11M7 10l5 5 5-5M5 20h14"/></svg>Download report</button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-transparent bg-transparent leading-none font-semibold text-ink underline decoration-1 underline-offset-4 transition-[background-color] duration-200 hover:bg-glass-control focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none min-h-11 px-5 text-[.95rem]">Discard</button>
  </div>
  <div class="mt-[14px] flex flex-wrap items-center gap-3">
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-glass-edge bg-glass-control leading-none font-semibold text-ink no-underline inset-shadow-glass backdrop-blur-glass transition-[background-color,translate] duration-200 hover:bg-glass-strong active:translate-y-px disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-9 px-[14px] text-[.85rem]">Small</button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-transparent bg-accent-glass leading-none font-semibold text-on-accent no-underline inset-shadow-glass backdrop-blur-glass transition-[filter,translate] duration-200 hover:brightness-[1.08] active:translate-y-px focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-[54px] px-7 text-[1.05rem]">Start free trial<svg class="size-[18px] flex-none" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-glass-edge bg-glass-control leading-none font-semibold text-ink no-underline inset-shadow-glass backdrop-blur-glass transition-[background-color,translate] duration-200 hover:bg-glass-strong active:translate-y-px disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-11 px-5 text-[.95rem]" disabled>Archived</button>
  </div>
</section>
<section class="border border-glass-border bg-glass text-ink shadow-glass inset-shadow-glass backdrop-blur-glass backdrop-saturate-150 rounded-glass p-6" aria-labelledby="c2"><span class="mb-4 block text-[.72rem] font-bold tracking-[.12em] text-ink-soft uppercase" id="c2">Icon buttons</span>
  <div class="flex flex-wrap items-center gap-3">
    <button type="button" class="inline-grid cursor-pointer place-items-center rounded-full border border-transparent bg-accent-glass p-0 text-on-accent inset-shadow-glass backdrop-blur-glass transition-[filter,scale] duration-200 hover:brightness-[1.08] active:scale-96 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:scale-100 size-14" aria-label="Play"><svg class="size-[22px]" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.5v13l10.5-6.5z"/></svg></button>
    <button type="button" class="inline-grid cursor-pointer place-items-center rounded-full border border-glass-edge bg-glass-control p-0 text-ink inset-shadow-glass backdrop-blur-glass transition-[background-color,scale] duration-200 hover:bg-glass-strong active:scale-96 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:scale-100 size-11" aria-label="Add to favourites"><svg class="size-[18px]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z"/></svg></button>
    <button type="button" class="inline-grid cursor-pointer place-items-center rounded-full border border-glass-edge bg-glass-control p-0 text-ink inset-shadow-glass backdrop-blur-glass transition-[background-color,scale] duration-200 hover:bg-glass-strong active:scale-96 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:scale-100 size-11" aria-label="Share"><svg class="size-[18px]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 13v6a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-6M12 3v12M7 8l5-5 5 5"/></svg></button>
    <button type="button" class="inline-grid cursor-pointer place-items-center rounded-full border border-glass-edge bg-glass-control p-0 text-ink inset-shadow-glass backdrop-blur-glass transition-[background-color,scale] duration-200 hover:bg-glass-strong active:scale-96 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:scale-100 size-11" aria-label="More options"><svg class="size-[18px]" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg></button>
    <button type="button" class="inline-flex cursor-pointer items-center justify-center gap-2 rounded-full border border-glass-edge bg-glass-control leading-none font-semibold text-ink no-underline inset-shadow-glass backdrop-blur-glass transition-[background-color,translate] duration-200 hover:bg-glass-strong active:translate-y-px disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none motion-reduce:active:translate-y-0 min-h-11 px-5 text-[.95rem]"><svg class="size-[18px] flex-none" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>New project</button>
  </div>
</section>
<div class="grid grid-cols-[repeat(auto-fit,minmax(min(100%,300px),1fr))] gap-[26px]">
<section class="border border-glass-border bg-glass text-ink shadow-glass inset-shadow-glass backdrop-blur-glass backdrop-saturate-150 rounded-glass p-6" aria-labelledby="c3"><span class="mb-4 block text-[.72rem] font-bold tracking-[.12em] text-ink-soft uppercase" id="c3">Switches</span>
  <ul class="grid gap-1 [&>li+li]:mt-2 [&>li+li]:border-t [&>li+li]:border-glass-border [&>li+li]:pt-3">
    <li><label class="flex cursor-pointer items-center justify-between gap-4"><span>Wi-Fi<small class="block text-[.8rem] text-ink-soft">Connected to Harbour-5G</small></span><input type="checkbox" role="switch" class="h-[30px] w-[52px] flex-none cursor-pointer appearance-none rounded-full border border-glass-edge bg-glass-control bg-[radial-gradient(circle_closest-side,var(--glass-ink-soft)_0_82%,transparent_88%)] bg-size-[22px_22px] bg-position-[3px_50%] bg-no-repeat shadow-[inset_0_1px_3px_rgb(0_0_0/.14)] transition-[background-position,background-color] duration-200 checked:border-transparent checked:bg-accent-glass checked:bg-[radial-gradient(circle_closest-side,var(--glass-on-accent)_0_88%,transparent_94%)] checked:bg-size-[24px_24px] checked:bg-position-[calc(100%_-_3px)_50%] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none" checked></label></li>
    <li><label class="flex cursor-pointer items-center justify-between gap-4"><span>Focus mode<small class="block text-[.8rem] text-ink-soft">Silence notifications until 18:00</small></span><input type="checkbox" role="switch" class="h-[30px] w-[52px] flex-none cursor-pointer appearance-none rounded-full border border-glass-edge bg-glass-control bg-[radial-gradient(circle_closest-side,var(--glass-ink-soft)_0_82%,transparent_88%)] bg-size-[22px_22px] bg-position-[3px_50%] bg-no-repeat shadow-[inset_0_1px_3px_rgb(0_0_0/.14)] transition-[background-position,background-color] duration-200 checked:border-transparent checked:bg-accent-glass checked:bg-[radial-gradient(circle_closest-side,var(--glass-on-accent)_0_88%,transparent_94%)] checked:bg-size-[24px_24px] checked:bg-position-[calc(100%_-_3px)_50%] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none"></label></li>
    <li><label class="flex cursor-pointer items-center justify-between gap-4"><span>Share location<small class="block text-[.8rem] text-ink-soft">Only with your team</small></span><input type="checkbox" role="switch" class="h-[30px] w-[52px] flex-none cursor-pointer appearance-none rounded-full border border-glass-edge bg-glass-control bg-[radial-gradient(circle_closest-side,var(--glass-ink-soft)_0_82%,transparent_88%)] bg-size-[22px_22px] bg-position-[3px_50%] bg-no-repeat shadow-[inset_0_1px_3px_rgb(0_0_0/.14)] transition-[background-position,background-color] duration-200 checked:border-transparent checked:bg-accent-glass checked:bg-[radial-gradient(circle_closest-side,var(--glass-on-accent)_0_88%,transparent_94%)] checked:bg-size-[24px_24px] checked:bg-position-[calc(100%_-_3px)_50%] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-focus motion-reduce:transition-none" checked></label></li>
  </ul>
</section>
<section class="border border-glass-border bg-glass text-ink shadow-glass inset-shadow-glass backdrop-blur-glass backdrop-saturate-150 rounded-glass p-6" aria-labelledby="c4"><span class="mb-4 block text-[.72rem] font-bold tracking-[.12em] text-ink-soft uppercase" id="c4">Segmented controls</span>
  <div class="flex flex-col items-start gap-4">
  <fieldset class="inline-flex rounded-full border border-glass-edge bg-glass-control p-1 backdrop-blur-glass"><legend class="sr-only">Calendar view</legend>
    <label class="relative cursor-pointer"><input type="radio" name="view" value="day" class="peer absolute inset-0 m-0 cursor-pointer opacity-0"><span class="block rounded-full px-[18px] py-2 text-[.9rem] font-semibold text-ink transition-colors duration-200 peer-checked:bg-accent-glass peer-checked:text-on-accent peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus motion-reduce:transition-none">Day</span></label>
    <label class="relative cursor-pointer"><input type="radio" name="view" value="week" class="peer absolute inset-0 m-0 cursor-pointer opacity-0" checked><span class="block rounded-full px-[18px] py-2 text-[.9rem] font-semibold text-ink transition-colors duration-200 peer-checked:bg-accent-glass peer-checked:text-on-accent peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus motion-reduce:transition-none">Week</span></label>
    <label class="relative cursor-pointer"><input type="radio" name="view" value="month" class="peer absolute inset-0 m-0 cursor-pointer opacity-0"><span class="block rounded-full px-[18px] py-2 text-[.9rem] font-semibold text-ink transition-colors duration-200 peer-checked:bg-accent-glass peer-checked:text-on-accent peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus motion-reduce:transition-none">Month</span></label>
  </fieldset>
  <fieldset class="inline-flex rounded-full border border-glass-edge bg-glass-control p-1 backdrop-blur-glass"><legend class="sr-only">Billing period</legend>
    <label class="relative cursor-pointer"><input type="radio" name="billing" value="monthly" class="peer absolute inset-0 m-0 cursor-pointer opacity-0" checked><span class="block rounded-full px-[18px] py-2 text-[.9rem] font-semibold text-ink transition-colors duration-200 peer-checked:bg-accent-glass peer-checked:text-on-accent peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus motion-reduce:transition-none">Monthly</span></label>
    <label class="relative cursor-pointer"><input type="radio" name="billing" value="yearly" class="peer absolute inset-0 m-0 cursor-pointer opacity-0"><span class="block rounded-full px-[18px] py-2 text-[.9rem] font-semibold text-ink transition-colors duration-200 peer-checked:bg-accent-glass peer-checked:text-on-accent peer-focus-visible:outline-3 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus motion-reduce:transition-none">Yearly, save 20%</span></label>
  </fieldset>
  </div>
</section>
</div>
</div>
CSS
/* ===== uiCookies Glassmorphism kit: design tokens (identical in every set) =====
   Retheme the whole kit here. Light scene on :root, dark scene on [data-scene="dark"]
   (or any [data-scene] holding a checked [data-scene-switch]). Selectors use :where()
   so the fallbacks below always win. */
:where(:root,[data-scene="light"]){
  color-scheme:light;
  /* background scene: the colour the glass frosts */
  --scene-base:linear-gradient(155deg,#eceffe 0%,#fbeef7 52%,#e6f6fb 100%);
  --scene-1:linear-gradient(140deg,#7c3aed,#c026d3);
  --scene-2:linear-gradient(140deg,#fb7185,#f97316);
  --scene-3:linear-gradient(140deg,#22d3ee,#3b82f6);
  --scene-4:linear-gradient(140deg,#fde047,#fb923c);
  /* glass */
  --glass-tint:255 255 255;
  --glass-border:rgb(255 255 255 / .8);
  --glass-edge:rgb(36 32 88 / .9);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .85);
  --glass-shadow:0 18px 40px -18px rgb(37 30 102 / .45);
  --glass-ink:#16133a;
  --glass-ink-soft:#3b3862;
  --glass-accent:#4338ca;
  --glass-accent-bg:rgb(67 56 202 / .92);
  --glass-on-accent:#fff;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#1e1b4b;
  --glass-good:#14532d;--glass-good-bg:rgb(220 252 231 / .9);
  --glass-bad:#991b1b;--glass-bad-bg:rgb(254 226 226 / .9);
  --glass-warn:#7c2d12;--glass-warn-bg:rgb(254 243 199 / .9);
  --glass-scrim:rgb(22 19 58 / .3);
}
:where([data-scene="dark"]),:where([data-scene]:has([data-scene-switch]:checked)){
  color-scheme:dark;
  --scene-base:linear-gradient(155deg,#0a0c22 0%,#170c2c 52%,#06171f 100%);
  --scene-1:linear-gradient(140deg,#6d28d9,#a21caf);
  --scene-2:linear-gradient(140deg,#e11d48,#ea580c);
  --scene-3:linear-gradient(140deg,#0891b2,#2563eb);
  --scene-4:linear-gradient(140deg,#ca8a04,#c2410c);
  --glass-tint:16 18 44;
  --glass-border:rgb(255 255 255 / .2);
  --glass-edge:rgb(214 220 255 / .72);
  --glass-highlight:inset 0 1px 0 rgb(255 255 255 / .16);
  --glass-shadow:0 18px 40px -18px rgb(0 0 0 / .75);
  --glass-ink:#f5f6ff;
  --glass-ink-soft:#d0d3ee;
  --glass-accent:#a5b4fc;
  --glass-accent-bg:rgb(165 180 252 / .96);
  --glass-on-accent:#14123a;
  --glass-check-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%2314123a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --glass-focus:#c7d2fe;
  --glass-good:#bbf7d0;--glass-good-bg:rgb(20 83 45 / .7);
  --glass-bad:#fecaca;--glass-bad-bg:rgb(127 29 29 / .7);
  --glass-warn:#fde68a;--glass-warn-bg:rgb(120 53 15 / .7);
  --glass-scrim:rgb(0 0 0 / .5);
}
:where(:root){
  --glass-alpha:.6;          /* panels and cards */
  --glass-alpha-strong:.82;  /* menus, dialogs, toasts: they cover unknown content */
  --glass-alpha-control:.5;  /* buttons and fields sitting on a panel */
  --glass-blur:18px;
  --glass-saturate:150%;
  --glass-radius:20px;
}
/* derived: recomputed inside every scene so a dark scene gets dark glass */
:where(:root,[data-scene]){
  --glass-bg:rgb(var(--glass-tint) / var(--glass-alpha));
  --glass-bg-strong:rgb(var(--glass-tint) / var(--glass-alpha-strong));
  --glass-bg-control:rgb(var(--glass-tint) / var(--glass-alpha-control));
}
/* no backdrop-filter: frosting can't happen, so the glass turns nearly solid */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  :where(:root){--glass-alpha:.94;--glass-alpha-strong:.97;--glass-alpha-control:.9}
}
@media (prefers-reduced-transparency:reduce){
  :where(:root){--glass-alpha:.93;--glass-alpha-strong:.97;--glass-alpha-control:.9;--glass-blur:8px}
}
@media (prefers-contrast:more){
  :where(:root){--glass-alpha:.96;--glass-alpha-strong:.98;--glass-alpha-control:.96}
  :where(:root,[data-scene]){--glass-border:var(--glass-ink);--glass-edge:var(--glass-ink)}
}
/* ===== end of tokens ===== */
/* Tailwind theme: utilities such as bg-glass, border-glass-edge, backdrop-blur-glass and text-ink read the tokens above */
@theme inline {
  --color-glass: var(--glass-bg);
  --color-glass-strong: var(--glass-bg-strong);
  --color-glass-control: var(--glass-bg-control);
  --color-glass-border: var(--glass-border);
  --color-glass-edge: var(--glass-edge);
  --color-ink: var(--glass-ink);
  --color-ink-soft: var(--glass-ink-soft);
  --color-accent: var(--glass-accent);
  --color-accent-glass: var(--glass-accent-bg);
  --color-on-accent: var(--glass-on-accent);
  --color-focus: var(--glass-focus);
  --color-good: var(--glass-good);
  --color-good-glass: var(--glass-good-bg);
  --color-bad: var(--glass-bad);
  --color-bad-glass: var(--glass-bad-bg);
  --color-warn: var(--glass-warn);
  --color-warn-glass: var(--glass-warn-bg);
  --color-scrim: var(--glass-scrim);
  --blur-glass: var(--glass-blur);
  --radius-glass: var(--glass-radius);
  --shadow-glass: var(--glass-shadow);
  --inset-shadow-glass: var(--glass-highlight);
  --animate-drift: g-drift 32s ease-in-out infinite alternate;
}
@keyframes g-drift { to { transform: translate3d(3vw,4vh,0) scale(1.06); } }

About this set

The buttons and toggles of the uiCookies glassmorphism UI kit, shown on the kit’s signature scene of gradient orbs. Glass buttons come as a frosted default, a tinted accent button for the main action, a quiet text button, small and large sizes, a button with an icon and a disabled state. Icon buttons are round frosted controls with an accent play button. Switches are real checkboxes with role=”switch” in a settings list, each with a label and a line of help text, and the segmented controls are radio groups for a calendar view and a billing period. The frost is backdrop-filter: blur() with saturate() over a translucent white tint. What keeps it readable is the tint strength: panels are 60 percent opaque, so dark text stays above 4.5:1 even over the violet orb, and every control has a dark –glass-edge border that keeps a 3:1 boundary whatever colour sits behind it. The switch knob is dark when off and light when on, so the state never depends on colour alone. Every set starts with the same block of design tokens: –scene-base and –scene-1 to –scene-4 for the background, and –glass-tint, –glass-alpha, –glass-blur, –glass-border, –glass-edge, –glass-highlight, –glass-shadow, –glass-ink and –glass-accent for the glass.

What’s included

  • Frosted, accent, quiet, small, large, icon and disabled glass buttons
  • Round icon buttons with accessible names
  • Switches built on checkboxes with role="switch" and visible labels
  • Segmented controls built on native radio groups
  • Shared design tokens identical across all eight sets

Accessibility

Every button has visible text or an aria-label, and each switch is a native checkbox with role="switch" inside its label, so it is announced with its name and on or off state. All text was measured at 4.5:1 or more against the darkest and lightest orb colours behind the glass, and button and switch boundaries at 3:1. Focus shows a 3px outline, transitions stop under prefers-reduced-motion, the glass turns almost opaque under prefers-reduced-transparency or without backdrop-filter support, and borders turn solid under prefers-contrast: more.

Customise it

Change --glass-accent-bg, --glass-edge, --glass-alpha and --glass-blur in the token block to retheme every button and switch. In Bootstrap they feed the --bs-btn-* variables and --bs-form-switch-bg; in Tailwind use the bg-accent-glass, border-glass-edge and bg-glass-control utilities.