/*
  GLASS THEME — UPDATED
  =====================
  Reusable design tokens and component styling extracted from
  selection-options.html.

  Theme selection:
    <html data-theme="dark">
    <html data-theme="light">

  If data-theme is omitted, the dark token set is used by default.

  This file intentionally excludes the selection-options.html demo/reference
  page layout. It contains the shared design system and all Modules 1–10.
*/

*, *::before, *::after { box-sizing: border-box; }

/* ================================================================
   00 — SHARED DESIGN TOKENS
   All current modules use these. Future modules should reuse these
   before inventing parallel colors for the same visual purpose.
   ================================================================ */
:root {
  color-scheme: dark;
  --bg: #2f2f2f;
  --panel: #262626;
  --panel-top: #2d2d2d;
  --demo-surface: linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,.015));
  --border: rgba(255,255,255,.08);
  --border-strong: rgba(255,255,255,.13);
  --text: #f5f5f5;
  --muted: rgba(245,245,245,.55);
  --faint: rgba(245,245,245,.40);
  --heading: rgba(245,245,245,.85);
  --sel: #e8e4db;
  --focus: #e8e4db;
  --shadow: 0 24px 60px rgba(0,0,0,.35);

  /* Shared v4 rail/glass language. */
  --seg-selected-text: rgba(245,245,245,.94);
  --seg-track-surface: linear-gradient(180deg, rgba(0,0,0,.26), rgba(255,255,255,.035));
  --seg-track-shadow-top: rgba(0,0,0,.40);
  --seg-track-shadow-bottom: rgba(255,255,255,.05);
  --seg-glass-wash-top: rgba(255,255,255,.050);
  --seg-glass-wash-mid: rgba(255,255,255,.024);
  --seg-glass-wash-bottom: rgba(0,0,0,.055);
  --seg-glass-inner: rgba(255,255,255,.085);
  --seg-glass-top-depth: rgba(255,255,255,.030);
  --seg-glass-bottom-depth: rgba(0,0,0,.085);
  --seg-glass-shadow: rgba(0,0,0,.12);
  --seg-glass-rim: rgba(255,255,255,0);
  --seg-glass-rim-soft: rgba(255,255,255,0);
  --seg-glass-edge-width: 0px;
  --seg-iris-opacity: .10;
  --seg-iris-ring-width: 5px;
  --seg-glass-iridescence: conic-gradient(from 220deg at 50% 50%,
    rgba(255,122,163,.10) 0deg,
    rgba(255,122,163,.24) 22deg,
    rgba(255,184,123,.10) 48deg,
    rgba(255,255,255,.05) 74deg,
    rgba(188,154,255,.14) 102deg,
    rgba(255,255,255,.04) 132deg,
    rgba(98,214,255,.24) 174deg,
    rgba(98,214,255,.12) 208deg,
    rgba(255,255,255,.06) 236deg,
    rgba(255,209,122,.14) 278deg,
    rgba(255,255,255,.03) 308deg,
    rgba(255,146,182,.16) 334deg,
    rgba(255,122,163,.10) 360deg);
  --seg-sheen-1: rgba(255,255,255,.28);
  --seg-sheen-2: rgba(255,255,255,.16);
  --seg-sheen-3: rgba(255,255,255,.06);
  --seg-hotspot-1: rgba(255,255,255,.32);
  --seg-hotspot-2: rgba(255,255,255,.18);
  --seg-hotspot-3: rgba(255,255,255,.07);

  /* Dropdown-only surfaces. */
  --select-menu: rgba(38,38,38,.97);
  --select-menu-shadow: 0 16px 36px rgba(0,0,0,.38);
  --select-option-hover: rgba(255,255,255,.055);
  --select-option-selected: rgba(255,255,255,.075);
  --select-separator: rgba(255,255,255,.055);

  /* Checkbox-only surfaces. */
  --check-rail: var(--seg-track-surface);
  --check-mark: rgba(245,245,245,.94);

  /* Destructive/error semantics. */
  --button-danger: #e37b73;
  --button-danger-soft: rgba(216,92,92,.12);

  /* Slider-specific emphasis. The thumb is small, so it needs slightly
     more oil definition than larger glass surfaces. */
  --slider-fill: rgba(245,245,245,.18);
  --slider-value-bg: rgba(255,255,255,.055);
  --slider-iris-opacity: .14;
  --slider-iris-saturation: 1;

  /* Choice-card-only surfaces. */
  --choice-selected-text: rgba(245,245,245,.96);
  --choice-selected-muted: rgba(245,245,245,.63);
  --choice-hover: rgba(255,255,255,.028);

  --danger-iridescence: conic-gradient(from 220deg at 50% 50%,
    rgba(120,8,18,.28) 0deg,
    rgba(224,54,66,.72) 26deg,
    rgba(255,112,105,.52) 58deg,
    rgba(255,205,194,.26) 86deg,
    rgba(177,33,54,.54) 118deg,
    rgba(255,92,99,.68) 154deg,
    rgba(114,12,25,.32) 194deg,
    rgba(255,132,119,.56) 234deg,
    rgba(255,221,211,.22) 270deg,
    rgba(157,23,43,.48) 308deg,
    rgba(241,67,78,.68) 340deg,
    rgba(120,8,18,.28) 360deg);
  --danger-iris-strong: .30;
}

:root[data-theme="light"] {
  color-scheme: light;
  --bg: #ccc;
  --panel: #f5f6f8;
  --panel-top: #ffffff;
  --demo-surface: linear-gradient(180deg, rgba(255,255,255,.88), rgba(230,234,239,.72));
  --border: rgba(28,39,52,.13);
  --border-strong: rgba(28,39,52,.20);
  --text: #20262d;
  --muted: rgba(32,38,45,.62);
  --faint: rgba(32,38,45,.48);
  --heading: rgba(32,38,45,.86);
  --sel: #536273;
  --focus: #536273;
  --shadow: 0 20px 45px rgba(62,76,94,.18);

  --seg-selected-text: rgba(30,38,47,.96);
  --seg-track-surface: linear-gradient(180deg, rgba(109,123,140,.16), rgba(255,255,255,.45));
  --seg-track-shadow-top: rgba(65,77,91,.18);
  --seg-track-shadow-bottom: rgba(255,255,255,.78);
  --seg-glass-wash-top: rgba(255,255,255,.36);
  --seg-glass-wash-mid: rgba(255,255,255,.17);
  --seg-glass-wash-bottom: rgba(112,128,147,.10);
  --seg-glass-inner: rgba(255,255,255,.18);
  --seg-glass-top-depth: rgba(255,255,255,.14);
  --seg-glass-bottom-depth: rgba(82,99,118,.11);
  --seg-glass-shadow: rgba(73,88,105,.16);
  --seg-glass-rim: rgba(255,255,255,.07);
  --seg-glass-rim-soft: rgba(255,255,255,.02);
  --seg-glass-edge-width: 4px;
  --seg-iris-opacity: .92;
  --seg-iris-ring-width: 5px;
  --seg-glass-iridescence: conic-gradient(from 220deg at 50% 50%,
    rgba(255,122,163,.10) 0deg,
    rgba(255,122,163,.24) 22deg,
    rgba(255,184,123,.10) 48deg,
    rgba(255,255,255,.05) 74deg,
    rgba(188,154,255,.14) 102deg,
    rgba(255,255,255,.04) 132deg,
    rgba(98,214,255,.24) 174deg,
    rgba(98,214,255,.12) 208deg,
    rgba(255,255,255,.06) 236deg,
    rgba(255,209,122,.14) 278deg,
    rgba(255,255,255,.03) 308deg,
    rgba(255,146,182,.16) 334deg,
    rgba(255,122,163,.10) 360deg);
  --seg-sheen-1: rgba(255,255,255,.50);
  --seg-sheen-2: rgba(255,255,255,.24);
  --seg-sheen-3: rgba(255,255,255,.06);
  --seg-hotspot-1: rgba(255,255,255,.48);
  --seg-hotspot-2: rgba(255,255,255,.22);
  --seg-hotspot-3: rgba(255,255,255,.06);

  --select-menu: rgba(247,249,251,.975);
  --select-menu-shadow: 0 16px 34px rgba(62,76,94,.22);
  --select-option-hover: rgba(50,64,80,.055);
  --select-option-selected: rgba(70,87,106,.075);
  --select-separator: rgba(28,39,52,.07);

  --check-rail: var(--seg-track-surface);
  --check-mark: rgba(30,38,47,.96);

  --button-danger: #b6453d;
  --button-danger-soft: rgba(191,65,57,.10);

  --slider-fill: rgba(53,67,83,.17);
  --slider-value-bg: rgba(38,51,66,.055);
  --slider-iris-opacity: 1;
  --slider-iris-saturation: 1.55;

  --choice-selected-text: rgba(30,38,47,.96);
  --choice-selected-muted: rgba(32,38,45,.65);
  --choice-hover: rgba(38,51,66,.035);

  --danger-iris-strong: .60;
}


/* ================================================================
   BASE THEME
   Safe global defaults for a site using the glass theme.
   ================================================================ */
html,
body {
  background-color: var(--bg);
  color: var(--text);
}

body {
  font-family:
    Ubuntu,
    "Helvetica Neue",
    Verdana,
    ui-sans-serif,
    sans-serif;
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1,
h2,
h3,
h4,
h5,
h6 {
  font-family: inherit;
  font-weight: 500;
}

/* ================================================================
   10 — SEGMENTED CONTROL MODULE
   Recommended for small, finite, mutually-exclusive choices.
   Source: seg-control_v4 with the raised/over-rail pill treatment.
   ================================================================ */
/* ══ SEG CONTROL — CSS ═══════════════════════════════════════════════
   Transforms only. No filter, backdrop-filter, SVG or canvas, so this
   stays cheap and works everywhere. */

.seg {
  --seg-surface: var(--seg-track-surface);
  --seg-track-radius: 999px;
  --seg-thumb-overhang: 10px;
  position: relative;
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  row-gap: 4px;
  border: 1px solid var(--border);
  border-radius: var(--seg-track-radius);
  padding: 3px;
  background: var(--seg-surface);
  box-shadow:
inset 0 1px 3px var(--seg-track-shadow-top),
inset 0 -1px 0 var(--seg-track-shadow-bottom);
  /* Let the pill sit slightly above/outside the rail for this variant. */
  overflow: visible;
}

/* Once a control wraps to 2+ rows, keep the rail corners based on a
   single-row capsule rather than on the full taller box height. That
   makes the rail read as a rounded panel instead of two stacked pills,
   and stops the outer corners from visually cutting into the moving pill. */
.seg.multiline { --seg-track-radius: 18px; }

/* Equal-width segments on a single row — the classic iOS look. Only use
   it when the labels are short and similar; they are nowrap, so a label
   too wide for its share will overflow. The default never can. */
.seg.even { flex-wrap: nowrap; }
.seg.even .seg-btn { flex: 1 1 0; }

.seg-btn {
  position: relative;
  z-index: 1;
  flex: 1 1 auto;
  padding: 7px 12px;
  border: none;
  border-radius: 999px;
  background: transparent;
  color: var(--muted);
  font: inherit;
  font-size: .78rem;
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  transition: color .18s ease;
  -webkit-tap-highlight-color: transparent;
}

/* On .flat this is the visible label. On the warping variant the pill
   covers it and the lens copy shows instead. */
.seg-btn.on { color: var(--seg-selected-text); }
.seg.flat .seg-btn.on {
  color: var(--seg-selected-text);
  text-shadow: none;
}
.seg-btn:focus-visible { outline: 2px solid var(--sel); outline-offset: 2px; }
@media (hover: hover) { .seg-btn:not(.on):hover { color: var(--text); } }

/* Positional wrapper — carries the slide, paints nothing. Above the
   buttons, because the pill body has to hide the real label so the lens
   copy can stand in for it. */
.seg-thumb {
  position: absolute;
  top: calc(var(--seg-thumb-overhang) * -1);
  left: 0;
  width: 0;
  height: 0;
  z-index: 2;
  border-radius: 999px;
  pointer-events: none;
  transition:
transform .40s cubic-bezier(.34, 1.35, .5, 1),
width .40s cubic-bezier(.34, 1.35, .5, 1),
height .20s ease,
opacity .18s ease;
  will-change: transform, width;
}

/* No lens to stand in for the label, so the flat pill sits behind the
   buttons and .seg-btn.on provides the dark text itself. */
.seg.flat .seg-thumb { z-index: 0; }

/* Glass treatment inspired by soft translucent UI capsules:
   centered, smooth and non-slanted. The effect comes from a gentle
   diffuse edge glow, a broad top sheen and a small bottom hotspot rather than
   stripe-like reflections. */
.seg-glass {
  position: absolute;
  inset: 0;
  border-radius: 999px;
  overflow: hidden;
  background:
linear-gradient(180deg,
  var(--seg-glass-wash-top) 0%,
  var(--seg-glass-wash-mid) 42%,
  var(--seg-glass-wash-bottom) 100%),
var(--seg-surface);
  box-shadow:
inset 0 0 0 1px var(--seg-glass-rim),
inset 0 0 0 3px var(--seg-glass-rim-soft),
inset 1px 0 7px var(--seg-glass-inner),
inset 0 8px 16px var(--seg-glass-top-depth),
inset 0 -8px 16px var(--seg-glass-bottom-depth),
inset 9px 0 14px rgba(255, 255, 255, .018),
inset -11px 0 15px rgba(0, 0, 0, .040),
0 1px 3px var(--seg-glass-shadow);
  transform-origin: 50% 50%;
  transition: transform .40s cubic-bezier(.34, 1.4, .5, 1);
}

/* Fixed rounded-rectangle doughnut. Its geometry never moves. The
   oversized conic-gradient canvas inside it rotates underneath the mask,
   so only the oil-spill colors travel around the pill. */
.seg-iris-ring {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: var(--seg-iris-opacity);
  -webkit-mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.seg-iris-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(0deg);
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22, .72, .18, 1);
  will-change: transform;
}

.seg-glass::before {
  content: '';
  position: absolute;
  inset: 2px 13px 50% 8px;
  border-radius: 999px 999px 58% 62% / 999px 999px 100% 100%;
  background:
radial-gradient(152% 112% at 43% 0%,
  var(--seg-sheen-1) 0%,
  var(--seg-sheen-2) 25%,
  var(--seg-sheen-3) 45%,
  rgba(255, 255, 255, 0) 72%);
  pointer-events: none;
  opacity: .82;
}

.seg-glass::after {
  content: '';
  position: absolute;
  left: 28%;
  right: 28%;
  bottom: 3px;
  height: 24%;
  border-radius: 999px;
  background:
radial-gradient(ellipse at center,
  var(--seg-hotspot-1) 0%,
  var(--seg-hotspot-2) 26%,
  var(--seg-hotspot-3) 50%,
  rgba(255, 255, 255, 0) 76%);
  pointer-events: none;
  opacity: .58;
}

/* Lens: a magnified copy of every label, clipped to the pill. Omitted
   entirely on .seg.flat. */
.seg-lens {
  position: absolute;
  inset: 0;
  border-radius: 999px;
  overflow: hidden;
}

.seg-lens-row {
  position: absolute;
  left: 0;
  top: 0;
  /* The counter-motion MUST use the exact same timing as .seg-thumb.
 Otherwise the copied lens label drifts away from the real label
 during the spring animation and briefly appears as duplicate text. */
  transition:
left .40s cubic-bezier(.34, 1.35, .5, 1),
top .40s cubic-bezier(.34, 1.35, .5, 1);
  will-change: left, top;
}

/* The lens copy must be typographically identical to the real button
   label. Even a tiny font-size difference makes the two rasterisations
   overlap at different edges and reads as blur rather than refraction. */
.lens-label {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--seg-selected-text);
  text-shadow: none;
  font: inherit;
  font-size: .78rem;
  font-weight: 600;
  line-height: normal;
  white-space: nowrap;
  -webkit-font-smoothing: inherit;
  text-rendering: auto;
}

.seg-thumb.no-anim,
.seg-thumb.no-anim .seg-glass,
.seg-thumb.no-anim .seg-iris-color,
.seg-thumb.no-anim .seg-lens-row { transition: none; }

/* Nothing selected. */
.seg-thumb.off { opacity: 0; }

@media (prefers-reduced-motion: reduce) {
  .seg-thumb, .seg-glass, .seg-iris-color, .seg-lens-row { transition: none; }
}

@media (max-width: 640px) {
  /* Equal-width segments rarely survive a phone; let them wrap. */
  .seg.even { flex-wrap: wrap; }
  .seg.even .seg-btn { flex: 1 1 auto; }
  .seg-btn { padding: 8px 10px; }
}
/* ══ END SEG CONTROL — CSS ═══════════════════════════════════════════ */

/* ================================================================
   20 — GLASS DROPDOWN MODULE
   Recommended for long/dynamic single-choice lists.
   The native <select> remains the source of truth.
   ================================================================ */
/* ══ GLASS DROPDOWN — CSS ═══════════════════════════════════════════ */

.gselect-native {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

.gselect {
  --select-overhang: 4px;
  --select-radius: 999px;
  position: relative;
  width: 100%;
  z-index: 1;
}

.gselect.open { z-index: 30; }

/* The rail is deliberately a little shorter than the glass trigger. */
.gselect-rail {
  position: relative;
  height: 34px;
  border: 1px solid var(--border);
  border-radius: var(--select-radius);
  background: var(--seg-track-surface);
  box-shadow:
inset 0 1px 3px var(--seg-track-shadow-top),
inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: visible;
}

.gselect-trigger {
  appearance: none;
  position: absolute;
  inset: 0;
  border: 0;
  border-radius: var(--select-radius);
  padding: 0 52px 0 13px;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-size: .78rem;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.gselect-trigger:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

.gselect.disabled .gselect-trigger {
  opacity: .42;
  cursor: not-allowed;
}

.gselect-value {
  position: relative;
  z-index: 1;
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
}

/* Only the arrow gets the raised v4 glass treatment. The text remains
   visually part of the rail, which keeps the dropdown quieter than a
   full-width glass capsule. */
.gselect-arrow-pill {
  position: absolute;
  z-index: 3;
  top: calc(var(--select-overhang) * -1);
  right: -1px;
  width: 42px;
  height: calc(100% + var(--select-overhang) * 2);
  border-radius: 999px;
  overflow: hidden;
  isolation: isolate;
  background:
linear-gradient(180deg,
  var(--seg-glass-wash-top) 0%,
  var(--seg-glass-wash-mid) 42%,
  var(--seg-glass-wash-bottom) 100%),
var(--seg-track-surface);
  box-shadow:
inset 0 0 0 1px var(--seg-glass-rim),
inset 0 0 0 3px var(--seg-glass-rim-soft),
inset 1px 0 7px var(--seg-glass-inner),
inset 0 8px 16px var(--seg-glass-top-depth),
inset 0 -8px 16px var(--seg-glass-bottom-depth),
inset 9px 0 14px rgba(255,255,255,.018),
inset -11px 0 15px rgba(0,0,0,.040),
0 1px 3px var(--seg-glass-shadow);
  transition:
transform .22s cubic-bezier(.34,1.35,.5,1),
box-shadow .18s ease;
  pointer-events: none;
}

.gselect-trigger:hover .gselect-arrow-pill {
  transform: translateY(-1px);
}

.gselect.open .gselect-arrow-pill {
  transform: translateY(-1px);
}

.gselect-chevron {
  position: absolute;
  z-index: 5;
  left: 50%;
  top: 50%;
  width: 8px;
  height: 8px;
  border-right: 1.5px solid var(--seg-selected-text);
  border-bottom: 1.5px solid var(--seg-selected-text);
  transform: translate(-50%, -67%) rotate(45deg);
  transform-origin: 50% 50%;
  opacity: .78;
  transition: transform .24s cubic-bezier(.34,1.35,.5,1), opacity .18s ease;
}

.gselect.open .gselect-chevron {
  transform: translate(-50%, -30%) rotate(225deg);
  opacity: .98;
}

/* Same fixed doughnut + rotating oversized oil canvas approach as v4,
   now clipped only to the arrow pill. */
.gselect-iris-ring {
  position: absolute;
  z-index: 1;
  inset: 0;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: var(--seg-iris-opacity);
  -webkit-mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gselect-iris-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(0deg);
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
  will-change: transform;
}

.gselect-arrow-pill::before {
  content: '';
  position: absolute;
  z-index: 2;
  inset: 2px 10px 50% 6px;
  border-radius: 999px 999px 58% 62% / 999px 999px 100% 100%;
  background:
radial-gradient(152% 112% at 43% 0%,
  var(--seg-sheen-1) 0%,
  var(--seg-sheen-2) 25%,
  var(--seg-sheen-3) 45%,
  rgba(255,255,255,0) 72%);
  pointer-events: none;
  opacity: .82;
}

.gselect-arrow-pill::after {
  content: '';
  position: absolute;
  z-index: 3;
  left: 28%;
  right: 28%;
  bottom: 3px;
  height: 24%;
  border-radius: 999px;
  background:
radial-gradient(ellipse at center,
  var(--seg-hotspot-1) 0%,
  var(--seg-hotspot-2) 26%,
  var(--seg-hotspot-3) 50%,
  rgba(255,255,255,0) 76%);
  pointer-events: none;
  opacity: .58;
}

.gselect-menu {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + var(--select-overhang) + 9px);
  z-index: 20;
  padding: 5px;
  max-height: 246px;
  overflow-y: auto;
  overscroll-behavior: contain;
  border: 1px solid var(--border-strong);
  border-radius: 15px;
  background: var(--select-menu);
  box-shadow: var(--select-menu-shadow);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(-6px) scale(.985);
  transform-origin: 50% 0;
  transition:
opacity .16s ease,
transform .22s cubic-bezier(.22,.8,.3,1),
visibility 0s linear .22s;
}

.gselect.open .gselect-menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateY(0) scale(1);
  transition:
opacity .16s ease,
transform .22s cubic-bezier(.22,.8,.3,1),
visibility 0s;
}

.gselect-option {
  appearance: none;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  min-height: 34px;
  padding: 8px 11px;
  border: 0;
  border-radius: 10px;
  background: transparent;
  color: var(--muted);
  font: inherit;
  font-size: .78rem;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
  transition: background .11s ease, color .11s ease;
  -webkit-tap-highlight-color: transparent;
}

.gselect-option + .gselect-option { margin-top: 1px; }

.gselect-option:hover,
.gselect-option.active {
  background: var(--select-option-hover);
  color: var(--text);
}

.gselect-option.selected {
  background: var(--select-option-selected);
  color: var(--text);
}

.gselect-option.selected::after {
  content: '';
  width: 6px;
  height: 6px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: currentColor;
  opacity: .68;
  box-shadow: 0 0 0 3px var(--select-option-selected);
}

.gselect-option[aria-disabled="true"] {
  opacity: .34;
  cursor: not-allowed;
}

.gselect-menu::-webkit-scrollbar { width: 9px; }
.gselect-menu::-webkit-scrollbar-track { background: transparent; }
.gselect-menu::-webkit-scrollbar-thumb {
  background: var(--border-strong);
  border: 3px solid transparent;
  background-clip: padding-box;
  border-radius: 999px;
}

@media (prefers-reduced-motion: reduce) {
  .gselect-trigger,
  .gselect-arrow-pill,
  .gselect-chevron,
  .gselect-iris-color,
  .gselect-menu { transition: none; }
}


/* ══ END GLASS DROPDOWN — CSS ═══════════════════════════════════════ */

/* ================================================================
   30 — GLASS CHECKBOX MODULE
   Independent multi-select / Boolean flags.
   Native checkbox remains the source of truth.
   ================================================================ */

.gcheck {
  --check-size: 24px;
  --check-overhang: 3px;
  /* Keep the checkbox v1 ring thickness independent of the segmented
     control/dropdown ring token so future tuning cannot alter this module. */
  --gcheck-iris-ring-width: 4px;
  position: relative;
  display: grid;
  grid-template-columns: var(--check-size) minmax(0, 1fr);
  gap: 12px;
  align-items: center;
  min-height: calc(var(--check-size) + var(--check-overhang) * 2);
  padding: 7px 8px;
  border-radius: 12px;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

@media (hover: hover) {
  .gcheck:not(.disabled):hover { background: rgba(127,127,127,.045); }
}

.gcheck-native {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  opacity: 0;
  pointer-events: none;
}

.gcheck-control {
  position: relative;
  width: var(--check-size);
  height: var(--check-size);
  border-radius: 8px;
  border: 1px solid var(--border);
  background: var(--check-rail);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  transition: border-color .18s ease, opacity .18s ease;
}

.gcheck-native:focus-visible + .gcheck-control {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

.gcheck-glass {
  position: absolute;
  z-index: 2;
  inset: calc(var(--check-overhang) * -1);
  border-radius: 10px;
  overflow: hidden;
  isolation: isolate;
  opacity: 0;
  transform: scale(.78);
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%),
    var(--seg-track-surface);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 7px 0 11px rgba(255,255,255,.018),
    inset -8px 0 12px rgba(0,0,0,.040),
    0 1px 3px var(--seg-glass-shadow);
  transition:
    opacity .14s ease,
    transform .30s cubic-bezier(.34,1.42,.5,1);
  pointer-events: none;
}

.gcheck.checked .gcheck-glass,
.gcheck.indeterminate .gcheck-glass {
  opacity: 1;
  transform: scale(1);
}

.gcheck.pulse .gcheck-glass {
  animation: gcheck-pop .34s cubic-bezier(.34,1.45,.5,1);
}

@keyframes gcheck-pop {
  0% { transform: scale(.90); }
  52% { transform: scale(1.09); }
  100% { transform: scale(1); }
}

.gcheck-iris-ring {
  position: absolute;
  z-index: 1;
  inset: 0;
  border-radius: inherit;
  padding: var(--gcheck-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: var(--seg-iris-opacity);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gcheck-iris-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 240%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(0deg);
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
  will-change: transform;
}

.gcheck-glass::before {
  content: '';
  position: absolute;
  z-index: 2;
  inset: 2px 8px 50% 5px;
  border-radius: 9px 9px 54% 60% / 9px 9px 100% 100%;
  background:
    radial-gradient(150% 112% at 42% 0%,
      var(--seg-sheen-1) 0%,
      var(--seg-sheen-2) 25%,
      var(--seg-sheen-3) 45%,
      rgba(255,255,255,0) 72%);
  pointer-events: none;
  opacity: .76;
}

.gcheck-glass::after {
  content: '';
  position: absolute;
  z-index: 3;
  left: 27%;
  right: 27%;
  bottom: 3px;
  height: 22%;
  border-radius: 999px;
  background:
    radial-gradient(ellipse at center,
      var(--seg-hotspot-1) 0%,
      var(--seg-hotspot-2) 26%,
      var(--seg-hotspot-3) 50%,
      rgba(255,255,255,0) 76%);
  pointer-events: none;
  opacity: .52;
}

.gcheck-mark {
  position: absolute;
  z-index: 6;
  inset: calc(var(--check-overhang) * -1);
  display: grid;
  place-items: center;
  pointer-events: none;
  opacity: 0;
  transform: scale(.65);
  transition:
    opacity .13s ease,
    transform .28s cubic-bezier(.34,1.42,.5,1);
}

.gcheck.checked .gcheck-mark,
.gcheck.indeterminate .gcheck-mark {
  opacity: 1;
  transform: scale(1);
}

.gcheck-check {
  width: 12px;
  height: 7px;
  border-left: 2px solid var(--check-mark);
  border-bottom: 2px solid var(--check-mark);
  transform: translateY(-1px) rotate(-45deg);
  border-radius: 0 0 0 1px;
}

.gcheck-dash {
  display: none;
  width: 12px;
  height: 2px;
  border-radius: 999px;
  background: var(--check-mark);
}

.gcheck.indeterminate .gcheck-check { display: none; }
.gcheck.indeterminate .gcheck-dash { display: block; }

.gcheck-copy { min-width: 0; }

.gcheck-label {
  display: block;
  font-size: .84rem;
  font-weight: 650;
  color: var(--text);
  line-height: 1.3;
}

.gcheck-help {
  display: block;
  margin-top: 2px;
  font-size: .71rem;
  line-height: 1.4;
  color: var(--muted);
}

.gcheck.disabled {
  opacity: .43;
  cursor: not-allowed;
}

.gcheck.disabled:hover { background: transparent; }

.gcheck-stack { display: grid; gap: 10px; }

.gcheck-inline-row {
  display: flex;
  flex-wrap: wrap;
  gap: 14px 18px;
  align-items: center;
}

.gcheck-inline-row .gcheck {
  width: fit-content;
  padding-right: 10px;
}

.gcheck-state-readout {
  margin-top: 12px;
  font-size: .72rem;
  color: var(--muted);
}

.gcheck-state-readout b { color: var(--text); }

@media (prefers-reduced-motion: reduce) {
  .gcheck-glass,
  .gcheck-mark,
  .gcheck-iris-color { transition: none; animation: none !important; }
}

@media (max-width: 640px) {
  .gcheck { padding-left: 6px; padding-right: 6px; }
}

/* ══ END GLASS CHECKBOX — CSS ═════════════════════════════════════ */

/* ================================================================
   40 — GLASS ACTION BUTTON MODULE
   Actions rather than selection state. All variants share the same
   interaction language: fixed geometry, theme-aware hover emphasis,
   and a reflection-mirror press state. Variant styling remains semantic.
   ================================================================ */

.glass-btn {
  --btn-overhang: 4px;
  --btn-radius: 999px;
  --btn-transition: .14s ease;
  --button-hover-iris-opacity: .40;
  --reflection-sheen-opacity: .82;
  --reflection-hotspot-opacity: .58;
  position: relative;
  display: inline-grid;
  place-items: center;
  min-height: 38px;
  padding: 3px;
  border: 1px solid var(--border);
  border-radius: var(--btn-radius);
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: visible;
  vertical-align: middle;
  transition:
    border-color var(--btn-transition),
    background var(--btn-transition),
    box-shadow var(--btn-transition);
}

.glass-btn > button {
  position: relative;
  z-index: 2;
  min-width: 104px;
  min-height: 32px;
  padding: 7px 16px;
  border: 0;
  border-radius: inherit;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-size: .82rem;
  font-weight: 650;
  letter-spacing: .01em;
  cursor: pointer;
  outline: none;
  -webkit-tap-highlight-color: transparent;
}

.glass-btn-face {
  position: absolute;
  z-index: 1;
  left: 3px;
  right: 3px;
  top: calc(3px - var(--btn-overhang));
  bottom: calc(3px - var(--btn-overhang));
  border-radius: inherit;
  overflow: hidden;
  pointer-events: none;
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%),
    var(--seg-track-surface);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    0 2px 4px var(--seg-glass-shadow);
  transition:
    box-shadow var(--btn-transition),
    background var(--btn-transition),
    opacity var(--btn-transition);
}

.glass-btn-iris-ring {
  position: absolute;
  z-index: 1;
  inset: 0;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: var(--seg-iris-opacity);
  transition: opacity var(--btn-transition);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.glass-btn-iris-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%,-50%) rotate(var(--btn-iris-angle, 0deg));
  transform-origin: 50% 50%;
  transition:
    transform var(--btn-transition),
    background var(--btn-transition);
  will-change: transform;
}

/* Fallback reflections keep buttons visually complete before JS initializes.
   initGlassButton() replaces these with two cross-fading reflection layers so
   the press state can mirror them across the horizontal centerline. */
.glass-btn-face::before {
  content: '';
  position: absolute;
  inset: 2px 13px 50% 8px;
  border-radius: 999px 999px 58% 62% / 999px 999px 100% 100%;
  background: radial-gradient(152% 112% at 43% 0%,
    var(--seg-sheen-1) 0%,
    var(--seg-sheen-2) 25%,
    var(--seg-sheen-3) 45%,
    rgba(255,255,255,0) 72%);
  opacity: var(--reflection-sheen-opacity);
}

.glass-btn-face::after {
  content: '';
  position: absolute;
  left: 28%;
  right: 28%;
  bottom: 3px;
  height: 24%;
  border-radius: 999px;
  background: radial-gradient(ellipse at center,
    var(--seg-hotspot-1) 0%,
    var(--seg-hotspot-2) 26%,
    var(--seg-hotspot-3) 50%,
    rgba(255,255,255,0) 76%);
  opacity: var(--reflection-hotspot-opacity);
}

.glass-btn.has-reflection-layers .glass-btn-face::before,
.glass-btn.has-reflection-layers .glass-btn-face::after {
  content: none;
}

.glass-btn-reflections {
  position: absolute;
  z-index: 2;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  overflow: hidden;
  transition: opacity var(--btn-transition);
}

.glass-btn-reflections::before {
  content: '';
  position: absolute;
  inset: 2px 13px 50% 8px;
  border-radius: 999px 999px 58% 62% / 999px 999px 100% 100%;
  background: radial-gradient(152% 112% at 43% 0%,
    var(--seg-sheen-1) 0%,
    var(--seg-sheen-2) 25%,
    var(--seg-sheen-3) 45%,
    rgba(255,255,255,0) 72%);
  opacity: var(--reflection-sheen-opacity);
  transition: opacity var(--btn-transition);
}

.glass-btn-reflections::after {
  content: '';
  position: absolute;
  left: 28%;
  right: 28%;
  bottom: 3px;
  height: 24%;
  border-radius: 999px;
  background: radial-gradient(ellipse at center,
    var(--seg-hotspot-1) 0%,
    var(--seg-hotspot-2) 26%,
    var(--seg-hotspot-3) 50%,
    rgba(255,255,255,0) 76%);
  opacity: var(--reflection-hotspot-opacity);
  transition: opacity var(--btn-transition);
}

.glass-btn-reflections.original {
  box-shadow:
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040);
  opacity: 1;
}

.glass-btn-reflections.mirrored {
  box-shadow:
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040);
  transform: scaleY(-1);
  opacity: 0;
}

/* Pressing changes only the internal reflections. The button geometry stays
   completely fixed. */
.glass-btn:not(.is-disabled):active .glass-btn-reflections.original,
.glass-btn.pressing:not(.is-disabled) .glass-btn-reflections.original {
  opacity: 0;
}

.glass-btn:not(.is-disabled):active .glass-btn-reflections.mirrored,
.glass-btn.pressing:not(.is-disabled) .glass-btn-reflections.mirrored {
  opacity: 1;
}

.glass-btn > button:focus-visible {
  outline: 2px solid var(--text);
  outline-offset: 5px;
}

/* Secondary remains visually quieter at rest, but uses the same hover/press
   mechanics as every other action-button variant. */
.glass-btn.secondary {
  --reflection-sheen-opacity: .48;
  --reflection-hotspot-opacity: .36;
}

.glass-btn.secondary .glass-btn-face {
  opacity: .72;
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 5px var(--seg-glass-inner),
    inset 0 5px 12px var(--seg-glass-top-depth),
    inset 0 -5px 12px var(--seg-glass-bottom-depth),
    0 1px 3px var(--seg-glass-shadow);
}

.glass-btn.secondary .glass-btn-iris-ring {
  opacity: 0;
}

.glass-btn.danger {
  border-color: color-mix(in srgb, var(--button-danger) 40%, var(--border));
  background:
    linear-gradient(var(--button-danger-soft), var(--button-danger-soft)),
    var(--seg-track-surface);
}

.glass-btn.danger > button {
  color: var(--button-danger);
}

/* Danger retains its red-spectrum semantic treatment while sharing the same
   geometry, hover timing, and reflection-mirror press behavior. */
.glass-btn.danger .glass-btn-iris-ring {
  opacity: calc(var(--seg-iris-opacity) * .45);
}


/* Dark mode: no recessed rail/bed. Hover/focus is expressed by strengthening
   the oil-spill ring to 40%, with zero movement or scaling. */
:root:not([data-theme="light"]) .glass-btn {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
}

:root:not([data-theme="light"]) .glass-btn:not(.icon) .glass-btn-face {
  left: 0;
  right: 0;
  top: calc(var(--btn-overhang) * -1);
  bottom: calc(var(--btn-overhang) * -1);
}

:root:not([data-theme="light"]) .glass-btn.danger {
  border-color: transparent;
  background: transparent;
}

@media (hover:hover) and (pointer:fine) {
  :root:not([data-theme="light"]) .glass-btn:not(.is-disabled):hover .glass-btn-iris-ring {
    opacity: var(--button-hover-iris-opacity);
  }

  .glass-btn.danger:not(.is-disabled):hover .glass-btn-iris-color {
    background: var(--danger-iridescence);
  }

  /* Light mode: strengthen only the rim. Final tuned values from the button
     study: main rim 33%, soft rim 10%. */
  :root[data-theme="light"] .glass-btn:not(.is-disabled):hover {
    --seg-glass-rim: rgba(255,255,255,.33);
    --seg-glass-rim-soft: rgba(74,91,110,.10);
  }
}

/* Keyboard focus mirrors the theme-specific hover emphasis. */
:root:not([data-theme="light"]) .glass-btn:not(.is-disabled):focus-within .glass-btn-iris-ring {
  opacity: var(--button-hover-iris-opacity);
}

.glass-btn.danger:not(.is-disabled):focus-within .glass-btn-iris-color {
  background: var(--danger-iridescence);
}

:root[data-theme="light"] .glass-btn:not(.is-disabled):focus-within {
  --seg-glass-rim: rgba(255,255,255,.33);
  --seg-glass-rim-soft: rgba(74,91,110,.10);
}

.glass-btn.compact {
  min-height: 32px;
}

.glass-btn.compact > button {
  min-width: 0;
  min-height: 26px;
  padding: 5px 12px;
  font-size: .75rem;
}

/* True circular icon buttons, matching the dropdown arrow geometry. */
.glass-btn.icon {
  width: 42px;
  height: 42px;
  min-height: 42px;
  padding: 0;
  border-radius: 50%;
}

.glass-btn.icon .glass-btn-face {
  inset: 0;
  border-radius: 50%;
}

.glass-btn.icon > button {
  min-width: 42px;
  width: 42px;
  min-height: 42px;
  height: 42px;
  padding: 0;
  display: grid;
  place-items: center;
  font-size: 1.12rem;
  line-height: 1;
}

.glass-btn.is-disabled {
  opacity: .38;
}

.glass-btn.is-disabled > button {
  cursor: not-allowed;
}

.glass-btn.is-disabled .glass-btn-iris-ring {
  opacity: 0;
}

.glass-btn-row {
  display: flex;
  gap: 14px;
  align-items: center;
  flex-wrap: wrap;
}

@media (prefers-reduced-motion: reduce) {
  .glass-btn,
  .glass-btn-face,
  .glass-btn-iris-ring,
  .glass-btn-iris-color,
  .glass-btn-reflections,
  .glass-btn-reflections::before,
  .glass-btn-reflections::after {
    transition: none;
  }
}

@media (max-width: 640px) {
  .glass-btn-row {
    gap: 16px 12px;
  }
}

/* ══ END GLASS ACTION BUTTON — CSS ═════════════════════════════════ */


/* ================================================================
   50 — GLASS INPUT FIELD MODULE
   Recommended for text and number entry. Inputs stay quiet at rest;
   focus brings the glass surface forward and reveals the oil ring.
   ================================================================ */

.ginput-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
}

.ginput-group { min-width: 0; }

.ginput-label {
  display: block;
  font-size: .7rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--faint);
  margin: 0 0 6px 2px;
}

.ginput-help {
  display: block;
  margin: 6px 2px 0;
  color: var(--faint);
  font-size: .68rem;
  line-height: 1.4;
}

.ginput-field {
  position: relative;
  min-height: 42px;
  border-radius: 13px;
  border: 1px solid var(--border);
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: hidden;
  isolation: isolate;
  transition:
    border-color .18s ease,
    box-shadow .18s ease,
    transform .18s ease;
}

.ginput-field::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  pointer-events: none;
  opacity: .32;
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040);
  transition: opacity .2s ease;
}

.ginput-field:focus-within {
  border-color: var(--border-strong);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom),
    0 3px 10px var(--seg-glass-shadow);
}

.ginput-field:focus-within::before { opacity: .78; }

.ginput-iris-ring {
  position: absolute;
  inset: 0;
  z-index: 1;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: 0;
  transition: opacity .2s ease;
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.ginput-field:focus-within .ginput-iris-ring {
  opacity: calc(var(--seg-iris-opacity) * .62);
}

.ginput-iris-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(var(--ginput-iris-angle, 0deg));
  transform-origin: 50% 50%;
  transition:
    transform .78s cubic-bezier(.22, .72, .18, 1),
    background .18s ease;
}

.ginput-native {
  position: relative;
  z-index: 2;
  appearance: none;
  width: 100%;
  min-height: 40px;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--text);
  padding: 10px 13px;
  font: inherit;
  font-size: .84rem;
  font-weight: 600;
}

.ginput-native::placeholder {
  color: var(--faint);
  font-weight: 500;
  opacity: .78;
}

.ginput-native::selection { background: rgba(127,127,127,.28); }

.ginput-field.has-prefix .ginput-native { padding-left: 38px; }
.ginput-field.has-suffix .ginput-native { padding-right: 42px; }

.ginput-affix {
  position: absolute;
  z-index: 3;
  top: 50%;
  transform: translateY(-50%);
  color: var(--muted);
  font-size: .78rem;
  font-weight: 700;
  pointer-events: none;
}

.ginput-affix.prefix { left: 13px; }
.ginput-affix.suffix { right: 13px; }

.ginput-native[type="number"] {
  -moz-appearance: textfield;
  text-align: center;
  font-variant-numeric: tabular-nums;
}

.ginput-native[type="number"]::-webkit-inner-spin-button,
.ginput-native[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

.ginput-field.invalid {
  /* Keep the structural border neutral. Error state is communicated by
     the same red liquid edge used by a destructive action on hover. */
  border-color: var(--border);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
}

.ginput-field.invalid .ginput-iris-ring,
.ginput-field.invalid:focus-within .ginput-iris-ring {
  opacity: var(--danger-iris-strong);
}

.ginput-field.invalid .ginput-iris-color,
.ginput-field.invalid:focus-within .ginput-iris-color {
  background: var(--danger-iridescence);
}

.ginput-field.invalid:focus-within {
  border-color: var(--border);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom),
    0 3px 10px var(--seg-glass-shadow);
}

.ginput-error {
  display: block;
  margin: 6px 2px 0;
  color: var(--button-danger);
  font-size: .68rem;
}

.ginput-field.disabled { opacity: .42; cursor: not-allowed; }
.ginput-field.disabled .ginput-native { cursor: not-allowed; }

.ginput-stepper {
  display: grid;
  grid-template-columns: 40px minmax(76px, 1fr) 40px;
  gap: 8px;
  align-items: center;
}

.ginput-step-btn {
  position: relative;
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--text);
  cursor: pointer;
  font: inherit;
  font-size: 1rem;
  font-weight: 700;
  isolation: isolate;
  -webkit-tap-highlight-color: transparent;
}

.ginput-step-face {
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  overflow: hidden;
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040),
    0 1px 3px var(--seg-glass-shadow);
  transition:
    transform .30s cubic-bezier(.34, 1.35, .5, 1),
    box-shadow .18s ease;
}

.ginput-step-btn:active .ginput-step-face,
.ginput-step-btn.pressing .ginput-step-face {
  transform: translateY(1px) scale(1.085, .965);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 8px var(--seg-glass-inner),
    inset 0 6px 13px var(--seg-glass-top-depth),
    inset 0 -6px 13px var(--seg-glass-bottom-depth),
    inset 11px 0 16px rgba(255,255,255,.020),
    inset -13px 0 17px rgba(0,0,0,.035),
    0 1px 2px var(--seg-glass-shadow);
  transition-duration: .09s;
}

.ginput-step-btn:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

.ginput-step-btn:disabled { opacity: .32; cursor: not-allowed; }

:root:not([data-theme="light"]) .ginput-step-face {
  background: linear-gradient(180deg,
    rgba(255,255,255,.065) 0%,
    rgba(255,255,255,.025) 45%,
    rgba(0,0,0,.07) 100%);
}

@media (max-width: 620px) {
  .ginput-grid { grid-template-columns: 1fr; }
}

/* ================================================================
   60 — GLASS TEXTAREA MODULE
   Recommended for multiline text entry. Native <textarea> remains
   authoritative. Supports manual vertical resize, optional counters,
   auto-grow, disabled state and approved red-oil invalid state.
   ================================================================ */

.gtextarea-label {
  display: block;
  font-size: .7rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--faint);
  margin: 0 0 6px 2px;
}

.gtextarea-footer {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 12px;
  margin: 6px 2px 0;
  min-height: 1em;
}

.gtextarea-help,
.gtextarea-count {
  color: var(--faint);
  font-size: .68rem;
  line-height: 1.4;
}

.gtextarea-count {
  flex-shrink: 0;
  font-variant-numeric: tabular-nums;
}

.gtextarea-error {
  color: var(--button-danger);
  font-size: .68rem;
  line-height: 1.4;
}

.gtextarea-field {
  position: relative;
  border-radius: 14px;
  border: 1px solid var(--border);
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: hidden;
  isolation: isolate;
  transition:
    border-color .18s ease,
    box-shadow .18s ease;
}

.gtextarea-field::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  pointer-events: none;
  opacity: .32;
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 10px 20px var(--seg-glass-top-depth),
    inset 0 -10px 20px var(--seg-glass-bottom-depth),
    inset 12px 0 18px rgba(255,255,255,.018),
    inset -14px 0 20px rgba(0,0,0,.040);
  transition: opacity .20s ease;
}

.gtextarea-field:focus-within {
  border-color: var(--border-strong);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom),
    0 3px 10px var(--seg-glass-shadow);
}

.gtextarea-field:focus-within::before { opacity: .78; }

.gtextarea-ring {
  position: absolute;
  inset: 0;
  z-index: 1;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: 0;
  transition: opacity .2s ease;
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gtextarea-field:focus-within .gtextarea-ring {
  opacity: calc(var(--seg-iris-opacity) * .62);
}

.gtextarea-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 240%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(var(--gtextarea-angle, 0deg));
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
}

.gtextarea-native {
  position: relative;
  z-index: 2;
  display: block;
  width: 100%;
  min-height: 108px;
  max-height: 360px;
  padding: 12px 13px;
  border: 0;
  outline: 0;
  resize: vertical;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-size: .84rem;
  font-weight: 600;
  line-height: 1.5;
  scrollbar-width: thin;
  scrollbar-color: var(--muted) transparent;
}

.gtextarea-native::placeholder {
  color: var(--faint);
  font-weight: 500;
  opacity: .78;
}

.gtextarea-native::selection { background: rgba(127,127,127,.28); }
.gtextarea-native::-webkit-scrollbar { width: 8px; }
.gtextarea-native::-webkit-scrollbar-track { background: transparent; }
.gtextarea-native::-webkit-scrollbar-thumb {
  background: var(--muted);
  border: 2px solid transparent;
  background-clip: padding-box;
  border-radius: 999px;
}

/* Same approved semantic error language as destructive buttons/inputs. */
.gtextarea-field.invalid { border-color: var(--border); }
.gtextarea-field.invalid .gtextarea-ring { opacity: var(--danger-iris-strong); }
.gtextarea-field.invalid .gtextarea-color { background: var(--danger-iridescence); }
.gtextarea-field.invalid:focus-within { border-color: var(--border); }
.gtextarea-field.invalid:focus-within .gtextarea-ring { opacity: var(--danger-iris-strong); }

.gtextarea-field.disabled { opacity: .42; cursor: not-allowed; }
.gtextarea-field.disabled .gtextarea-native { cursor: not-allowed; resize: none; }

.gtextarea-field.autogrow .gtextarea-native {
  resize: none;
  overflow-y: hidden;
  min-height: 88px;
  max-height: none;
}

@media (prefers-reduced-motion: reduce) {
  .gtextarea-field,
  .gtextarea-field::before,
  .gtextarea-ring,
  .gtextarea-color { transition: none !important; }
}

@media (max-width: 620px) {
  .gtextarea-native { font-size: 16px; }
}

/* ================================================================
   70 — GLASS RANGE SLIDER MODULE
   Native <input type="range"> remains authoritative. The visual rail,
   fill and raised glass droplet mirror its state only.
   ================================================================ */

.gslider-label-row,
.gslider-meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.gslider-label {
  font-size: .7rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--faint);
}

.gslider-value {
  min-width: 54px;
  padding: 4px 8px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--slider-value-bg);
  color: var(--text);
  text-align: center;
  font-size: .72rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.gslider-meta {
  margin-top: 7px;
  color: var(--faint);
  font-size: .67rem;
}

.gslider {
  --slider-pct: 50%;
  --thumb-size: 30px;
  --rail-height: 8px;
  position: relative;
  margin-top: 10px;
  height: 40px;
  isolation: isolate;
}

.gslider-rail {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  height: var(--rail-height);
  transform: translateY(-50%);
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: hidden;
  pointer-events: none;
}

.gslider-fill {
  position: absolute;
  inset: 0 auto 0 0;
  width: var(--slider-pct);
  border-radius: inherit;
  background: linear-gradient(90deg, transparent 0%, var(--slider-fill) 100%);
  pointer-events: none;
}

.gslider-thumb {
  position: absolute;
  z-index: 2;
  top: 50%;
  left: var(--slider-pct);
  width: var(--thumb-size);
  height: var(--thumb-size);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  transition:
    width .22s cubic-bezier(.34,1.35,.5,1),
    height .22s cubic-bezier(.34,1.35,.5,1),
    filter .18s ease;
  will-change: left, width, height;
}

.gslider-glass {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  overflow: hidden;
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
  transition:
    transform .22s cubic-bezier(.34,1.45,.5,1),
    box-shadow .18s ease;
  transform-origin: 50% 55%;
}

.gslider-ring {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 4px;
  overflow: hidden;
  pointer-events: none;
  opacity: var(--slider-iris-opacity);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gslider-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  filter: saturate(var(--slider-iris-saturation));
  transform: translate(-50%, -50%) rotate(var(--slider-angle, 0deg));
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
}

.gslider-glass::before {
  content: '';
  position: absolute;
  inset: 2px 8px 51% 6px;
  border-radius: 999px 999px 58% 62% / 999px 999px 100% 100%;
  background:
    radial-gradient(150% 112% at 43% 0%,
      rgba(255,255,255,.34) 0%,
      rgba(255,255,255,.16) 26%,
      rgba(255,255,255,.05) 46%,
      transparent 72%);
  pointer-events: none;
  opacity: .74;
}

.gslider-glass::after {
  content: '';
  position: absolute;
  left: 28%;
  right: 28%;
  bottom: 3px;
  height: 22%;
  border-radius: 999px;
  background:
    radial-gradient(ellipse at center,
      rgba(255,255,255,.30) 0%,
      rgba(255,255,255,.14) 28%,
      rgba(255,255,255,.05) 50%,
      transparent 76%);
  pointer-events: none;
  opacity: .58;
}

.gslider-native {
  position: absolute;
  z-index: 4;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
  appearance: none;
  touch-action: none;
}

.gslider-native:focus-visible + .gslider-focus { opacity: 1; }

.gslider-focus {
  position: absolute;
  z-index: 3;
  top: 50%;
  left: var(--slider-pct);
  width: calc(var(--thumb-size) + 8px);
  height: calc(var(--thumb-size) + 8px);
  border: 2px solid var(--focus);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  opacity: 0;
  pointer-events: none;
  transition: opacity .14s ease;
}

/* Water-drop press: expand uniformly in every direction. */
.gslider.dragging .gslider-glass {
  transform: scale(1.16);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 8px var(--seg-glass-inner),
    inset 0 6px 13px var(--seg-glass-top-depth),
    inset 0 -6px 13px var(--seg-glass-bottom-depth),
    inset 11px 0 16px rgba(255,255,255,.020),
    inset -13px 0 17px rgba(0,0,0,.035),
    0 1px 2px var(--seg-glass-shadow);
}

.gslider.disabled { opacity: .36; }
.gslider.disabled .gslider-native { cursor: not-allowed; }

/* Approved light-mode disabled treatment: still muted, but the small
   thumb and rail keep enough neutral edge definition to remain legible. */
:root[data-theme="light"] .gslider.disabled { opacity: .52; }
:root[data-theme="light"] .gslider.disabled .gslider-rail {
  border-color: rgba(28,39,52,.18);
}
:root[data-theme="light"] .gslider.disabled .gslider-glass {
  box-shadow:
    inset 0 0 0 1px rgba(32,38,45,.18),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
}

@media (prefers-reduced-motion: reduce) {
  .gslider-thumb,
  .gslider-glass,
  .gslider-color,
  .gslider-focus { transition: none !important; }
}

@media (max-width: 620px) {
  .gslider {
    height: 48px;
    --thumb-size: 34px;
  }
}

/* ══ END GLASS RANGE SLIDER — CSS ═════════════════════════════════ */

/* ================================================================
   80 — GLASS CHOICE CARD MODULE
   Rich mutually-exclusive choices. Native radio inputs remain
   authoritative; selected glass emphasis lives around the radio.
   ================================================================ */

.gchoice-group {
  display: grid;
  gap: 6px;
}

.gchoice-group.columns {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.gchoice {
  position: relative;
  display: block;
  min-width: 0;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.gchoice-native {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

/* The row/card itself stays intentionally quiet. */
.gchoice-card {
  position: relative;
  display: block;
  min-height: 72px;
  border: 1px solid transparent;
  border-radius: 14px;
  background: transparent;
  transition:
    border-color .18s ease,
    background .18s ease;
}

.gchoice-content {
  position: relative;
  display: grid;
  grid-template-columns: 34px minmax(0, 1fr);
  gap: 10px;
  align-items: start;
  min-height: 70px;
  padding: 12px 12px;
}

/* Quiet recessed radio bed. */
.gchoice-indicator {
  position: relative;
  width: 22px;
  height: 22px;
  margin: 1px 0 0 4px;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  isolation: isolate;
  transition:
    transform .28s cubic-bezier(.34,1.45,.5,1),
    border-color .18s ease,
    box-shadow .18s ease;
}

/* Raised glass/oil pill around the radio itself. */
.gchoice-indicator-glass {
  position: absolute;
  inset: -6px;
  z-index: -1;
  border-radius: 50%;
  overflow: hidden;
  opacity: 0;
  transform: scale(.82);
  background:
    linear-gradient(180deg,
      var(--seg-glass-wash-top) 0%,
      var(--seg-glass-wash-mid) 42%,
      var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 8px 0 12px rgba(255,255,255,.020),
    inset -10px 0 14px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
  transition:
    opacity .18s ease,
    transform .30s cubic-bezier(.34,1.45,.5,1);
}

.gchoice-ring {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 4px;
  overflow: hidden;
  pointer-events: none;
  opacity: var(--seg-iris-opacity);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gchoice-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%, -50%) rotate(var(--choice-angle, 0deg));
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
}

.gchoice-indicator::after {
  content: '';
  position: absolute;
  z-index: 2;
  left: 50%;
  top: 50%;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--text);
  transform: translate(-50%, -50%) scale(0);
  opacity: 0;
  transition:
    transform .28s cubic-bezier(.34,1.55,.5,1),
    opacity .16s ease;
}

.gchoice-copy {
  min-width: 0;
  display: grid;
  gap: 4px;
}

.gchoice-title {
  color: var(--text);
  font-size: .84rem;
  font-weight: 700;
  line-height: 1.35;
}

.gchoice-description {
  color: var(--muted);
  font-size: .72rem;
  line-height: 1.45;
}

@media (hover: hover) and (pointer: fine) {
  .gchoice:not(.disabled):hover .gchoice-card {
    border-color: var(--border);
    background: var(--choice-hover);
  }
}

.gchoice-native:checked + .gchoice-card .gchoice-indicator {
  border-color: transparent;
  transform: scale(1.03);
  box-shadow: none;
}

.gchoice-native:checked + .gchoice-card .gchoice-indicator-glass {
  opacity: 1;
  transform: scale(1);
}

.gchoice-native:checked + .gchoice-card .gchoice-indicator::after {
  transform: translate(-50%, -50%) scale(1);
  opacity: 1;
}

.gchoice-native:checked + .gchoice-card .gchoice-title {
  color: var(--choice-selected-text);
}

.gchoice-native:checked + .gchoice-card .gchoice-description {
  color: var(--choice-selected-muted);
}

.gchoice-native:focus-visible + .gchoice-card {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.gchoice.pressing .gchoice-indicator-glass {
  transform: scale(1.10);
}

.gchoice.disabled {
  opacity: .40;
  cursor: not-allowed;
}

.gchoice.disabled .gchoice-card {
  cursor: not-allowed;
}

/* Match the disabled-slider treatment in light mode: a selected,
   disabled choice stays muted but keeps enough glass-edge definition
   to remain clearly visible. */
:root[data-theme="light"] .gchoice.disabled:has(.gchoice-native:checked) {
  opacity: .52;
}

:root[data-theme="light"] .gchoice.disabled .gchoice-native:checked + .gchoice-card .gchoice-indicator-glass {
  box-shadow:
    inset 0 0 0 1px rgba(32,38,45,.18),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 8px 0 12px rgba(255,255,255,.020),
    inset -10px 0 14px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
}

/* Truly compact: closer to a dense option row than a card. */
.gchoice-group.compact-group {
  gap: 5px;
}

.gchoice.compact .gchoice-card {
  min-height: 40px;
  border-radius: 11px;
}

.gchoice.compact .gchoice-content {
  grid-template-columns: 28px minmax(0, 1fr);
  min-height: 38px;
  padding: 4px 8px;
  gap: 6px;
  align-items: center;
}

.gchoice.compact .gchoice-indicator {
  width: 18px;
  height: 18px;
  margin: 0 0 0 3px;
}

.gchoice.compact .gchoice-indicator-glass {
  inset: -4px;
}

.gchoice.compact .gchoice-ring {
  padding: 3px;
}

.gchoice.compact .gchoice-indicator::after {
  width: 6px;
  height: 6px;
}

.gchoice.compact .gchoice-title {
  font-size: .78rem;
  line-height: 1.2;
}

.gchoice.compact .gchoice-description {
  display: none;
}

@media (prefers-reduced-motion: reduce) {
  .gchoice-card,
  .gchoice-indicator,
  .gchoice-indicator-glass,
  .gchoice-color,
  .gchoice-indicator::after {
    transition: none !important;
  }
}

@media (max-width: 620px) {
  .gchoice-group.columns { grid-template-columns: 1fr; }
}

/* ================================================================
   90 — GLASS FILE UPLOAD MODULE
   Native file input remains authoritative. The centered drop zone
   supports browse and drag/drop without introducing a second state model.
   ================================================================ */

.gupload {
  position:relative;
  border:1px solid var(--border);
  border-radius:16px;
  background:var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow:hidden;
  isolation:isolate;
  transition:border-color .18s ease, box-shadow .18s ease;
}

.gupload::before {
  content:'';
  position:absolute;
  inset:0;
  z-index:0;
  pointer-events:none;
  opacity:.28;
  background:linear-gradient(180deg,
    var(--seg-glass-wash-top) 0%,
    var(--seg-glass-wash-mid) 42%,
    var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 8px var(--seg-glass-inner),
    inset 0 10px 20px var(--seg-glass-top-depth),
    inset 0 -10px 20px var(--seg-glass-bottom-depth),
    inset 12px 0 18px rgba(255,255,255,.018),
    inset -14px 0 20px rgba(0,0,0,.040);
  transition:opacity .2s ease;
}

.gupload-ring {
  position:absolute;
  inset:0;
  z-index:1;
  border-radius:inherit;
  padding:var(--seg-iris-ring-width);
  overflow:hidden;
  pointer-events:none;
  opacity:0;
  transition:opacity .2s ease;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask-composite:exclude;
}

.gupload-color {
  position:absolute;
  left:50%;
  top:50%;
  width:230%;
  aspect-ratio:1;
  background:var(--seg-glass-iridescence);
  transform:translate(-50%,-50%) rotate(var(--upload-angle,0deg));
  transform-origin:50% 50%;
  transition:transform .78s cubic-bezier(.22,.72,.18,1);
}

.gupload-body {
  position:relative;
  z-index:2;
  min-height:118px;
  padding:18px;
  display:grid;
  place-items:center;
  text-align:center;
  cursor:pointer;
}

.gupload-stack {
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:5px;
  width:min(100%, 420px);
}

.gupload-icon {
  position:relative;
  width:42px;
  height:42px;
  display:grid;
  place-items:center;
  margin-bottom:5px;
  border-radius:50%;
  font-size:1.18rem;
  line-height:1;
  isolation:isolate;
}

.gupload-icon::before {
  content:'';
  position:absolute;
  inset:0;
  z-index:-1;
  border-radius:50%;
  overflow:hidden;
  background:linear-gradient(180deg,
    var(--seg-glass-wash-top) 0%,
    var(--seg-glass-wash-mid) 42%,
    var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 8px 0 12px rgba(255,255,255,.020),
    inset -10px 0 14px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
}

.gupload-icon::after {
  content:'';
  position:absolute;
  inset:0;
  z-index:-2;
  border-radius:50%;
  padding:4px;
  background:var(--seg-glass-iridescence);
  opacity:var(--seg-iris-opacity);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite:exclude;
}

.gupload-title {
  font-size:.84rem;
  font-weight:700;
  color:var(--text);
}

.gupload-copy {
  color:var(--muted);
  font-size:.71rem;
  line-height:1.45;
}

.gupload-file {
  position:absolute;
  width:1px;
  height:1px;
  opacity:0;
  pointer-events:none;
}

.gupload-name {
  margin-top:4px;
  color:var(--faint);
  font-size:.69rem;
  min-height:1em;
  overflow-wrap:anywhere;
}

.gupload-name.has-file {
  color:var(--text);
  font-weight:600;
}

.gupload:focus-within,
.gupload.dragover {
  border-color:var(--border-strong);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom),
    0 3px 10px var(--seg-glass-shadow);
}

.gupload:focus-within::before,
.gupload.dragover::before { opacity:.72; }

.gupload:focus-within .gupload-ring,
.gupload.dragover .gupload-ring {
  opacity:calc(var(--seg-iris-opacity) * .72);
}

.gupload.dragover .gupload-body {
  transform:scale(1.008);
}

.gupload.invalid .gupload-ring {
  opacity:var(--danger-iris-strong);
}

.gupload.invalid .gupload-color {
  background:var(--danger-iridescence);
}

.gupload-error {
  color:var(--button-danger);
  font-size:.68rem;
  margin-top:6px;
}

.gupload.disabled {
  opacity:.40;
  cursor:not-allowed;
}

.gupload.disabled .gupload-body,
.gupload.disabled .gupload-button {
  cursor:not-allowed;
}

:root[data-theme="light"] .gupload.disabled {
  opacity:.52;
}

:root[data-theme="light"] .gupload.disabled {
  border-color:rgba(28,39,52,.18);
}

/* Match the disabled slider/choice treatment: keep the selected glass
   pill muted, but preserve a faint neutral edge in light mode. */
:root[data-theme="light"] .gupload.disabled .gupload-icon::before {
  box-shadow:
    inset 0 0 0 1px rgba(32,38,45,.18),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 8px 0 12px rgba(255,255,255,.020),
    inset -10px 0 14px rgba(0,0,0,.040),
    0 2px 5px var(--seg-glass-shadow);
}

@media (prefers-reduced-motion:reduce) {
  .gupload,
  .gupload::before,
  .gupload-ring,
  .gupload-color,
  .gupload-icon::before,
  .gupload-icon::after { transition:none!important; }
}


/* ================================================================
   100 — GLASS DATE PICKER MODULE
   Native <input type="date"> remains authoritative. The surrounding
   field and calendar trigger are the design-system enhancement.

   FOR FUTURE IMPROVEMENT:
   The calendar popup itself is currently rendered by the browser/OS and
   therefore does not visually match the glass design system. If full
   visual parity is wanted later, replace only the visible popup with a
   custom calendar panel (glass container, glass previous/next controls,
   selected-date oil pill, subdued out-of-month days, min/max disabled
   dates, Today/Clear actions and full keyboard support). Keep the native
   <input type="date"> as the authoritative ISO-date value and synchronize
   the custom calendar to it by dispatching normal input/change events.
   ================================================================ */

.gdate-label {
  display: block;
  font-size: .7rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--faint);
  margin: 0 0 6px 2px;
}

.gdate-help {
  display: block;
  margin: 6px 2px 0;
  color: var(--faint);
  font-size: .68rem;
  line-height: 1.4;
}

.gdate-field {
  position: relative;
  min-height: 42px;
  border-radius: 13px;
  border: 1px solid var(--border);
  background: var(--seg-track-surface);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom);
  overflow: hidden;
  isolation: isolate;
  transition: border-color .18s ease, box-shadow .18s ease;
}

.gdate-field::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: .32;
  background: linear-gradient(180deg,
    var(--seg-glass-wash-top) 0%,
    var(--seg-glass-wash-mid) 42%,
    var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 8px 16px var(--seg-glass-top-depth),
    inset 0 -8px 16px var(--seg-glass-bottom-depth),
    inset 9px 0 14px rgba(255,255,255,.018),
    inset -11px 0 15px rgba(0,0,0,.040);
  transition: opacity .2s ease;
}

.gdate-ring {
  position: absolute;
  inset: 0;
  z-index: 1;
  border-radius: inherit;
  padding: var(--seg-iris-ring-width);
  overflow: hidden;
  pointer-events: none;
  opacity: 0;
  transition: opacity .2s ease;
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gdate-color {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 230%;
  aspect-ratio: 1;
  background: var(--seg-glass-iridescence);
  transform: translate(-50%,-50%) rotate(var(--date-angle,0deg));
  transform-origin: 50% 50%;
  transition: transform .78s cubic-bezier(.22,.72,.18,1);
}

.gdate-field:focus-within {
  border-color: var(--border-strong);
  box-shadow:
    inset 0 1px 3px var(--seg-track-shadow-top),
    inset 0 -1px 0 var(--seg-track-shadow-bottom),
    0 3px 10px var(--seg-glass-shadow);
}

.gdate-field:focus-within::before { opacity: .78; }
.gdate-field:focus-within .gdate-ring { opacity: calc(var(--seg-iris-opacity) * .62); }

.gdate-native {
  position: relative;
  z-index: 2;
  width: 100%;
  min-height: 40px;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--text);
  padding: 10px 44px 10px 13px;
  font: inherit;
  font-size: .84rem;
  font-weight: 600;
  color-scheme: inherit;
}

/* Chromium/WebKit keeps the native calendar picker click target over the
   custom visual trigger. The popup that opens remains browser/OS UI. */
.gdate-native::-webkit-calendar-picker-indicator {
  position: absolute;
  right: 7px;
  top: 50%;
  width: 30px;
  height: 30px;
  margin: 0;
  padding: 0;
  transform: translateY(-50%);
  cursor: pointer;
  opacity: 0;
  z-index: 4;
}

.gdate-trigger {
  position: absolute;
  z-index: 3;
  right: 7px;
  top: 50%;
  width: 30px;
  height: 30px;
  transform: translateY(-50%);
  border-radius: 50%;
  display: grid;
  place-items: center;
  pointer-events: none;
  color: var(--text);
  font-size: .82rem;
  line-height: 1;
  isolation: isolate;
}

.gdate-trigger::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: 50%;
  overflow: hidden;
  background: linear-gradient(180deg,
    var(--seg-glass-wash-top) 0%,
    var(--seg-glass-wash-mid) 42%,
    var(--seg-glass-wash-bottom) 100%);
  box-shadow:
    inset 0 0 0 1px var(--seg-glass-rim),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 7px 13px var(--seg-glass-top-depth),
    inset 0 -7px 13px var(--seg-glass-bottom-depth),
    inset 7px 0 10px rgba(255,255,255,.020),
    inset -8px 0 11px rgba(0,0,0,.040),
    0 2px 4px var(--seg-glass-shadow);
  transition: transform .18s ease, box-shadow .18s ease;
}

.gdate-trigger::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -2;
  border-radius: 50%;
  padding: 3px;
  background: var(--seg-glass-iridescence);
  opacity: calc(var(--seg-iris-opacity) * .62);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.gdate-field:focus-within .gdate-trigger::before { transform: scale(1.05); }

.gdate-field.invalid { border-color: var(--border); }
.gdate-field.invalid .gdate-ring { opacity: var(--danger-iris-strong); }
.gdate-field.invalid .gdate-color { background: var(--danger-iridescence); }
.gdate-field.invalid .gdate-trigger::after {
  background: var(--danger-iridescence);
  opacity: var(--danger-iris-strong);
}

.gdate-error {
  display: block;
  margin: 6px 2px 0;
  color: var(--button-danger);
  font-size: .68rem;
}

.gdate-field.disabled {
  opacity: .42;
  cursor: not-allowed;
}

.gdate-field.disabled .gdate-native { cursor: not-allowed; }

:root[data-theme="light"] .gdate-field.disabled {
  opacity: .52;
  border-color: rgba(28,39,52,.18);
}

:root[data-theme="light"] .gdate-field.disabled .gdate-trigger::before {
  box-shadow:
    inset 0 0 0 1px rgba(32,38,45,.18),
    inset 0 0 0 3px var(--seg-glass-rim-soft),
    inset 1px 0 7px var(--seg-glass-inner),
    inset 0 7px 13px var(--seg-glass-top-depth),
    inset 0 -7px 13px var(--seg-glass-bottom-depth),
    inset 7px 0 10px rgba(255,255,255,.020),
    inset -8px 0 11px rgba(0,0,0,.040),
    0 2px 4px var(--seg-glass-shadow);
}

@media (max-width: 620px) {
  .gdate-native { font-size: 16px; }
}

@media (prefers-reduced-motion: reduce) {
  .gdate-field,
  .gdate-field::before,
  .gdate-ring,
  .gdate-color,
  .gdate-trigger::before { transition: none !important; }
}

/* ================================================================
   110 — FUTURE MODULE SLOT
   Add future controls as their own namespaced modules. Do not overload
   existing component namespaces merely to accommodate a new type.
   ================================================================ */
