HTML
Copy
<div class="g-scene" aria-hidden="true"><i></i><i></i><i></i><i></i></div>
<div class="wrap"><div class="widgets">
<div><span class="lbl lbl--chip">Music player</span>
<section class="g-glass g-widget" aria-label="Now playing">
<div class="g-player-top">
<div class="g-cover" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V6l10-2v12"/><circle cx="6.5" cy="18" r="2.5"/><circle cx="16.5" cy="16" r="2.5"/></svg></div>
<div class="g-track"><h3>Night Drive</h3><p>Paloma Reyes · Coastline</p></div>
<button type="button" class="g-icon-btn g-icon-btn--sm" aria-label="Add to favourites"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.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>
</div>
<input class="g-range" type="range" min="0" max="232" value="84" aria-label="Seek" aria-valuetext="1 minute 24 seconds of 3 minutes 52 seconds">
<div class="g-times" aria-hidden="true"><span>1:24</span><span>3:52</span></div>
<div class="g-controls">
<button type="button" class="g-icon-btn" aria-label="Previous track"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M7 6h2v12H7zM19 6v12l-9-6z"/></svg></button>
<button type="button" class="g-icon-btn g-icon-btn--accent g-icon-btn--lg" aria-label="Pause"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M7 5h3.5v14H7zM13.5 5H17v14h-3.5z"/></svg></button>
<button type="button" class="g-icon-btn" aria-label="Next track"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15 6h2v12h-2zM5 6v12l9-6z"/></svg></button>
</div>
</section></div>
<div><span class="lbl lbl--chip">Weather widget</span>
<section class="g-glass g-widget" aria-labelledby="wx-city">
<div class="g-wx-top"><div><h3 id="wx-city">Lisbon</h3><p>Friday 16 October</p></div><p>Updated 13:05</p></div>
<div class="g-wx-now">
<svg class="g-wx-big" viewBox="0 0 64 64" aria-hidden="true"><circle cx="24" cy="24" r="12" fill="#fbbf24"/><path class="g-cloud" d="M22 54h26a10 10 0 0 0 1.5-19.9A14 14 0 0 0 22.4 38 8 8 0 0 0 22 54z"/></svg>
<p class="g-temp">21°</p>
<p><b>Partly cloudy</b>High 24°, low 15°</p>
</div>
<ol class="g-hours" aria-label="Next five hours">
<li><span>Now</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="9" r="3.2"/><path d="M9 2.8v1.4M3 9h1.4M4.8 4.8l1 1M13.2 4.8l-1 1M9.5 19.5h8a3.3 3.3 0 0 0 .4-6.6 4.6 4.6 0 0 0-8.8 1.2 2.7 2.7 0 0 0 .4 5.4z"/></svg><b>21°</b></li>
<li><span>14:00</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.3 5.3l1.4 1.4M17.3 17.3l1.4 1.4M5.3 18.7l1.4-1.4M17.3 6.7l1.4-1.4"/></svg><b>23°</b></li>
<li><span>15:00</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.3 5.3l1.4 1.4M17.3 17.3l1.4 1.4M5.3 18.7l1.4-1.4M17.3 6.7l1.4-1.4"/></svg><b>24°</b></li>
<li><span>16:00</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 18.5h10a4 4 0 0 0 .6-8 5.5 5.5 0 0 0-10.7 1.4A3.3 3.3 0 0 0 7 18.5z"/></svg><b>22°</b></li>
<li><span>17:00</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 15.5h10a4 4 0 0 0 .6-8 5.5 5.5 0 0 0-10.7 1.4A3.3 3.3 0 0 0 7 15.5zM8 18.5l-1 2.5M12 18.5l-1 2.5M16 18.5l-1 2.5"/></svg><b>19°</b></li>
</ol>
<dl class="g-wx-meta"><div><dt>Humidity</dt><dd>62%</dd></div><div><dt>Wind</dt><dd>14 km/h</dd></div><div><dt>UV index</dt><dd>4</dd></div></dl>
</section></div>
<div><span class="lbl lbl--chip">Mini calendar</span>
<section class="g-glass g-widget g-cal" aria-labelledby="cal-title">
<div class="g-cal-head"><h3 id="cal-title">October 2026</h3><div>
<button type="button" class="g-icon-btn g-icon-btn--sm" aria-label="Previous month"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 5l-7 7 7 7"/></svg></button>
<button type="button" class="g-icon-btn g-icon-btn--sm" aria-label="Next month"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 5l7 7-7 7"/></svg></button></div></div>
<table aria-labelledby="cal-title">
<thead><tr><th scope="col"><abbr title="Monday">Mo</abbr></th><th scope="col"><abbr title="Tuesday">Tu</abbr></th><th scope="col"><abbr title="Wednesday">We</abbr></th><th scope="col"><abbr title="Thursday">Th</abbr></th><th scope="col"><abbr title="Friday">Fr</abbr></th><th scope="col"><abbr title="Saturday">Sa</abbr></th><th scope="col"><abbr title="Sunday">Su</abbr></th></tr></thead>
<tbody>
<tr><td></td><td></td><td></td><td><span>1</span></td><td><span>2</span></td><td><span>3</span></td><td><span>4</span></td></tr>
<tr><td><span>5</span></td><td><span>6</span></td><td><span>7</span></td><td class="g-ev"><span>8<span class="sr-only">, Design review</span></span></td><td><span>9</span></td><td><span>10</span></td><td><span>11</span></td></tr>
<tr><td><span>12</span></td><td><span>13</span></td><td><span>14</span></td><td><span>15</span></td><td aria-current="date"><span>16<span class="sr-only">, today</span></span></td><td><span>17</span></td><td><span>18</span></td></tr>
<tr><td><span>19</span></td><td><span>20</span></td><td class="g-ev"><span>21<span class="sr-only">, Sprint planning</span></span></td><td><span>22</span></td><td><span>23</span></td><td><span>24</span></td><td><span>25</span></td></tr>
<tr><td><span>26</span></td><td class="g-ev"><span>27<span class="sr-only">, Quarterly report</span></span></td><td><span>28</span></td><td><span>29</span></td><td><span>30</span></td><td><span>31</span></td><td></td></tr>
</tbody>
</table>
<p class="g-next"><i aria-hidden="true"></i><b>Sprint planning</b><span>Wed 21 Oct, 10:00</span></p>
</section></div>
<div><span class="lbl lbl--chip">Progress rings</span>
<section class="g-glass g-widget" aria-label="This week">
<div class="g-rings">
<div><div class="g-ring" aria-hidden="true"><svg viewBox="0 0 120 120"><circle class="g-ring-track" cx="60" cy="60" r="50"/><circle class="g-ring-bar" cx="60" cy="60" r="50" pathLength="100" stroke-dasharray="72 100"/></svg><b>72%</b></div>
<h3>Weekly running goal</h3><p>72% done: 18 of 25 km</p></div>
<div><div class="g-ring g-ring--good" aria-hidden="true"><svg viewBox="0 0 120 120"><circle class="g-ring-track" cx="60" cy="60" r="50"/><circle class="g-ring-bar" cx="60" cy="60" r="50" pathLength="100" stroke-dasharray="92 100"/></svg><b>92%</b></div>
<h3>Sleep last night</h3><p>92%: 7 h 22 min of 8 h</p></div>
</div>
</section></div>
</div></div>
CSS
Copy
/* ===== 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}}
/* range slider: 3:1 track edge, accent thumb with a white ring */
.g-range{-webkit-appearance:none;appearance:none;display:block;width:100%;height:28px;margin:0;background:transparent;cursor:pointer}
.g-range::-webkit-slider-runnable-track{height:10px;border:1px solid var(--glass-edge);border-radius:999px;background:var(--glass-bg-control)}
.g-range::-moz-range-track{height:8px;border:1px solid var(--glass-edge);border-radius:999px;background:var(--glass-bg-control)}
.g-range::-webkit-slider-thumb{-webkit-appearance:none;width:24px;height:24px;margin-top:-8px;border:3px solid #fff;border-radius:50%;
background:var(--glass-accent-bg);box-shadow:0 0 0 1px var(--glass-edge),0 2px 6px rgb(0 0 0 / .25)}
.g-range::-moz-range-thumb{width:18px;height:18px;border:3px solid #fff;border-radius:50%;background:var(--glass-accent-bg);
box-shadow:0 0 0 1px var(--glass-edge),0 2px 6px rgb(0 0 0 / .25)}
.g-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px var(--glass-edge),0 2px 6px rgb(0 0 0 / .25)}
.g-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px var(--glass-edge),0 2px 6px rgb(0 0 0 / .25)}
.g-range:focus-visible{outline:3px solid var(--glass-focus);outline-offset:4px;border-radius:999px}
/* media and widgets */
.g-widget{display:grid;gap:14px;align-content:start;padding:20px}
.g-widget h3{font-size:1.02rem;line-height:1.3}
/* music player */
.g-player-top{display:flex;align-items:center;gap:14px}
.g-cover{display:grid;place-items:center;flex:none;width:64px;height:64px;border-radius:14px;background:var(--scene-1);color:#fff}
.g-cover svg{width:30px;height:30px}
.g-track{min-width:0;flex:1}
.g-track p{font-size:.85rem;color:var(--glass-ink-soft)}
.g-times{display:flex;justify-content:space-between;margin-top:-6px;font-size:.78rem;font-variant-numeric:tabular-nums;color:var(--glass-ink-soft)}
.g-controls{display:flex;align-items:center;justify-content:center;gap:16px}
.g-icon-btn--sm{width:36px;height:36px}
.g-icon-btn--sm svg{width:16px;height:16px}
/* weather */
.g-wx-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.g-wx-top p{font-size:.85rem;color:var(--glass-ink-soft)}
.g-wx-now{display:flex;align-items:center;gap:14px}
.g-temp{font-size:3.4rem;font-weight:800;line-height:1;letter-spacing:-.04em}
.g-wx-now p:not(.g-temp){font-size:.9rem;color:var(--glass-ink-soft)}
.g-wx-now b{display:block;font-size:1rem;color:var(--glass-ink)}
.g-wx-big{width:56px;height:56px;flex:none}
.g-wx-big .g-cloud{fill:#fff;stroke:var(--glass-ink-soft);stroke-width:2}
.g-hours{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin:0;padding:0;list-style:none}
.g-hours li{display:grid;justify-items:center;gap:4px;padding:10px 2px;border:1px solid var(--glass-border);border-radius:14px;background:var(--glass-bg-control);font-size:.8rem}
.g-hours li:first-child{border-color:transparent;background:var(--glass-accent-bg);color:var(--glass-on-accent)}
.g-hours span{color:inherit}
.g-hours b{font-size:.92rem}
.g-hours svg{width:22px;height:22px}
.g-wx-meta{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:0;font-size:.8rem;text-align:center}
.g-wx-meta div{display:flex;flex-direction:column-reverse}
.g-wx-meta dt{color:var(--glass-ink-soft)}
.g-wx-meta dd{margin:0;font-weight:700;font-size:.92rem}
/* mini calendar */
.g-cal-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.g-cal-head div{display:flex;gap:6px}
.g-cal table{width:100%;border-collapse:collapse;text-align:center;font-size:.85rem;font-variant-numeric:tabular-nums}
.g-cal th{padding:0 0 6px;font-size:.72rem;font-weight:700;color:var(--glass-ink-soft)}
.g-cal abbr{text-decoration:none}
.g-cal td{padding:2px 0}
.g-cal td>span{position:relative;display:inline-grid;place-items:center;width:32px;height:32px;border-radius:10px}
.g-cal .g-ev>span::after{content:"";position:absolute;bottom:3px;left:50%;width:5px;height:5px;margin-left:-2.5px;border-radius:50%;background:var(--glass-accent)}
.g-cal [aria-current="date"]>span{background:var(--glass-accent-bg);color:var(--glass-on-accent);font-weight:700}
.g-cal [aria-current="date"]>span::after{background:var(--glass-on-accent)}
.g-next{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--glass-border);border-radius:14px;background:var(--glass-bg-control);font-size:.85rem}
.g-next i{flex:none;width:8px;height:8px;border-radius:50%;background:var(--glass-accent)}
.g-next span{color:var(--glass-ink-soft)}
/* progress rings */
.g-rings{display:grid;grid-template-columns:1fr 1fr;gap:12px;text-align:center}
.g-ring{position:relative;width:min(100%,128px);aspect-ratio:1;margin:0 auto 8px}
.g-ring svg{display:block;width:100%;height:100%;transform:rotate(-90deg)}
.g-ring circle{fill:none;stroke-width:11}
.g-ring .g-ring-track{stroke:var(--glass-edge);stroke-opacity:.14}
.g-ring .g-ring-bar{stroke:var(--glass-accent);stroke-linecap:round;animation:g-fill 1s ease-out}
.g-ring--good .g-ring-bar{stroke:var(--glass-good)}
@keyframes g-fill{from{stroke-dasharray:0 100}}
.g-ring b{position:absolute;inset:0;display:grid;place-items:center;font-size:1.6rem;font-weight:800;letter-spacing:-.02em}
.g-rings h3{font-size:.92rem}
.g-rings p{font-size:.82rem;color:var(--glass-ink-soft)}
@media (prefers-reduced-motion:reduce){.g-ring .g-ring-bar{animation:none}}