/* app/app.css — standalone post-login web app styles.
   Two sources, concatenated in the same cascade order the design used them:
   1) drop-design/components/app.css (the Prism component language: .wsh/.wsc/
      .chip/.btn/.locchip/.seg/.skel/.metric/.dual etc — was linked in the design
      file's <helmet> as _ds/.../components/app.css; copied here verbatim, no _ds/
      link, since the design doc's inline <style> alone has no component styling).
   2) the design file's own inline <style> block (Drop Website.dc.html lines 18-108),
      verbatim — page-level resets + a few page-specific rules (skeleton shimmer,
      mobile @media overrides, dual-range slider).
   Self-contained on purpose — do NOT dedupe against ../shell.css. */

/* app.css — Drop app component language (PRISM). Consumes foundations/tokens.css.
   Mirrors the real RN components in src/components (EventCard, ActionButton,
   Segmented, tab bar) so the design library and the app stay in lockstep.
   Used by component preview cards (components/*.html) and screen prototypes. */

/* ===== Glass app header (Discover sticky header) ===== */
.appbar { position: sticky; top: 0; z-index: 30; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px var(--sp-lg); background: var(--glass-dark); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); border-bottom: 1px solid var(--border); }
.wordmark { font-family: var(--font-display); font-weight: 700; font-size: var(--fs-xl); letter-spacing: var(--tr-tight); display: inline-flex; align-items: center; gap: 8px; background: var(--grad-chrome); -webkit-background-clip: text; background-clip: text; color: transparent; }
.droplet { width: 18px; height: 18px; border-radius: 50% 50% 50% 2px; transform: rotate(45deg); background: var(--grad-chrome); box-shadow: inset 0 0 6px rgba(255,255,255,0.6), var(--shadow-glow); flex: 0 0 auto; }
.appbar__right { display: flex; align-items: center; gap: 12px; }
.bell { width: 22px; height: 22px; border-radius: 7px; border: 2px solid var(--text-muted); position: relative; }
.bell::after { content: ""; position: absolute; top: -3px; right: -3px; width: 9px; height: 9px; border-radius: 50%; background: var(--going); border: 2px solid var(--ink); }

/* ===== Glass location chip ===== */
.locchip { display: inline-flex; align-items: center; gap: 7px; background: var(--glass); border: 1px solid var(--glass-border); border-radius: var(--r-pill); padding: 7px var(--sp-md); font-size: var(--fs-sm); color: var(--text-secondary); }
.locchip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px var(--accent); }

/* ===== Section header ===== */
.sec { display: flex; align-items: baseline; justify-content: space-between; padding: var(--sp-xl) var(--sp-lg) var(--sp-md); }
.sec__title { font-family: var(--font-display); font-weight: 700; font-size: var(--fs-lg); letter-spacing: var(--tr-snug); color: var(--text); }
.sec__more { font-size: var(--fs-sm); font-weight: 600; color: var(--accent); }

/* ===== Segmented control (glass) ===== */
.seg { display: inline-flex; background: var(--glass); border: 1px solid var(--glass-border); border-radius: var(--r-pill); padding: 3px; gap: 2px; }
.seg__item { padding: 7px 16px; border: 0; background: transparent; border-radius: var(--r-pill); font: inherit; font-size: var(--fs-sm); font-weight: 600; color: var(--text-muted); white-space: nowrap; }
.seg__item.is-active { background: var(--surface-hi); color: var(--text); }

/* ===== Event card (mirrors src/components/EventCard.tsx) ===== */
.ec { display: block; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-card); color: var(--text); text-decoration: none; margin: 0 var(--sp-lg) var(--sp-lg); transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease); will-change: transform; }
.ec:hover { border-color: var(--border-strong); box-shadow: 0 12px 28px rgba(0,0,0,0.55); }
.ec:active { transform: scale(0.98); }
.ec:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.ec__imgwrap { position: relative; height: 188px; display: flex; flex-direction: column; justify-content: flex-end; }
.ec__img { position: absolute; inset: 0; background:
    radial-gradient(120% 90% at 72% 12%, rgba(226,77,255,0.55), transparent 55%),
    radial-gradient(120% 90% at 18% 30%, rgba(77,226,255,0.45), transparent 55%),
    linear-gradient(160deg, var(--surface-alt), var(--ink)); }
.ec__scrim { position: absolute; left: 0; right: 0; bottom: 0; height: 78%; background: var(--scrim); }
.ec__top { position: absolute; top: var(--sp-md); left: var(--sp-md); right: var(--sp-md); display: flex; align-items: center; justify-content: space-between; }
.ec__badge { background: var(--glass-dark); border: 1px solid var(--glass-border); padding: 5px var(--sp-md); border-radius: var(--r-pill); font-size: var(--fs-xs); font-weight: 700; letter-spacing: var(--tr-wide); color: var(--text); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.ec__sale { position: absolute; top: 54px; left: var(--sp-md); display: inline-flex; align-items: center; gap: 5px; background: var(--going); color: var(--white); padding: 4px var(--sp-md); border-radius: var(--r-pill); font-size: var(--fs-xs); font-weight: 700; letter-spacing: var(--tr-wide); }
.ec__sale.is-presale { background: var(--gold); color: var(--ink); } /* was --brand-magenta which == --going (no-op); --gold per token comment "presale-live" */
.ec__title { position: relative; font-family: var(--font-display); font-weight: 700; font-size: var(--fs-xl); letter-spacing: var(--tr-tight); line-height: 1.15; color: var(--text); padding: 0 var(--sp-lg) var(--sp-md); }
.ec__body { padding: var(--sp-md) var(--sp-lg) var(--sp-lg); display: flex; flex-direction: column; gap: 6px; }
.ec__meta { display: flex; align-items: center; gap: 6px; color: var(--text-secondary); font-size: var(--fs-sm); }
.ec__meta .ic { width: 5px; height: 5px; border-radius: 50%; background: var(--text-muted); margin: 0 3px; flex: 0 0 auto; }
.ec__lineup { color: var(--accent); font-size: var(--fs-sm); font-weight: 600; }
.ec__friends { align-self: flex-start; display: inline-flex; align-items: center; gap: 6px; margin-top: var(--sp-xs); background: var(--social-glass); border: 1px solid var(--social-glass-border); border-radius: var(--r-pill); padding: 5px var(--sp-md); color: var(--accent); font-size: var(--fs-xs); font-weight: 700; transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); }
/* Non-color cue: a people glyph marks the social wedge so its meaning survives without hue.
   Drawn as a masked inline SVG (not an emoji) so it inherits currentColor — staying
   monochrome cyan in lockstep with the statuschip glyphs, with no color-emoji clash.
   (Surfaces that render an avatar mini-stack already carry a shape cue and suppress this.) */
.ec__friends {
  /* People glyph as a data-URI SVG mask — local component asset, not a theme token. */
  --ic-people: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g fill="black"><circle cx="9" cy="8" r="3.4"/><path d="M9 13c-3.3 0-6 1.9-6 4.6V19h12v-1.4C15 14.9 12.3 13 9 13z"/><circle cx="17" cy="8.6" r="2.8"/><path d="M17 13c-1 0-1.9.2-2.7.5 1.4 1 2.3 2.5 2.3 4.1V19h5v-1.6C21.6 14.7 19.6 13 17 13z"/></g></svg>');
}
.ec__friends::before {
  content: ""; width: 13px; height: 13px; flex: 0 0 auto; background-color: currentColor;
  -webkit-mask: var(--ic-people) center / contain no-repeat;
          mask: var(--ic-people) center / contain no-repeat;
}
.ec__friends:has(.avmini)::before { content: none; }
.ec:hover .ec__friends { background: rgba(77,226,255,0.20); border-color: var(--accent); }
.ec:active .ec__friends { transform: scale(0.97); }

/* ===== Action button (mirrors src/components/ActionButton.tsx) ===== */
.btn { position: relative; display: inline-flex; align-items: center; justify-content: center; height: 54px; padding: 0 var(--sp-lg); border: 1px solid transparent; border-radius: var(--r-lg); font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-md); letter-spacing: var(--tr-snug); overflow: hidden; cursor: pointer; text-decoration: none; -webkit-appearance: none; appearance: none; transition: filter var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease), opacity var(--dur-fast) var(--ease); }
.btn--primary { background-image: var(--grad-glow); color: var(--text-on-brand); box-shadow: var(--shadow-glow); }
.btn--secondary { background: var(--surface-alt); border-color: var(--border); color: var(--text); }
.btn--ghost { background: transparent; border-color: var(--border-strong); color: var(--text); }
.btn--danger { background: var(--danger); color: var(--text-on-brand); }
.btn--sm { height: 44px; border-radius: var(--r-md); font-size: var(--fs-sm); padding: 0 var(--sp-md); } /* ponytail: was 40px → 44px WCAG 2.5.5 minimum */
.btn--block { display: flex; width: 100%; }
/* Interaction states */
.btn:hover:not(:disabled):not([aria-disabled=true]) { filter: brightness(1.08); }
.btn:active:not(:disabled) { transform: scale(0.97); }
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--r-md); }
.btn:disabled, .btn[aria-disabled=true] { opacity: 0.4; cursor: not-allowed; pointer-events: none; }
/* Loading state — spinner overlays label */
.btn.is-loading { pointer-events: none; color: transparent; }
.btn.is-loading::after { content: ""; position: absolute; width: 18px; height: 18px; border-radius: 50%; border: 2px solid transparent; border-top-color: currentColor; animation: btn-spin 0.7s linear infinite; color: var(--text-on-brand); }
.btn--secondary.is-loading::after, .btn--ghost.is-loading::after { color: var(--text); }
@keyframes btn-spin { to { transform: rotate(360deg); } }

/* Inline spinner — geolocation "Locating…" state (design round 4) */
@keyframes spin360 { to { transform: rotate(360deg); } }
.spinner { display: inline-block; width: 13px; height: 13px; border-radius: 50%; border: 2px solid var(--glass-border); border-top-color: var(--accent); animation: spin360 0.7s linear infinite; }

/* ===== Status chips (RSVP / attendance) =====
   A11y: state is conveyed by SHAPE (::before glyph), not hue alone — a colorblind user
   reads filled-dot = Going, hollow-ring = Interested, check = Attended without color.
   The glyph is CSS-driven so every usage carries it (no reliance on inline text). */
.statuschip { display: inline-flex; align-items: center; gap: 7px; border-radius: var(--r-pill); padding: 8px 15px; font-family: var(--font-display); font-weight: 700; font-size: var(--fs-sm); transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); }
.statuschip::before { font-size: 11px; line-height: 1; }
.statuschip--going { color: var(--going); background: rgba(226,77,255,0.12); border: 1px solid rgba(226,77,255,0.32); }
.statuschip--going::before { content: "\25CF"; }       /* filled dot — committed */
.statuschip--interested { color: var(--interested); background: rgba(77,226,255,0.12); border: 1px solid rgba(77,226,255,0.32); }
.statuschip--interested::before { content: "\25CB"; }  /* hollow ring — tentative */
.statuschip--attended { color: var(--attended); background: rgba(182,255,106,0.12); border: 1px solid rgba(182,255,106,0.32); }
.statuschip--attended::before { content: "\2713"; }    /* check — happened */
/* Interactive (when a chip is a button/link) */
.statuschip:hover { background: var(--surface-hi); }
.statuschip:active { transform: scale(0.96); }
.statuschip:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* ===== Avatar stack (friends going) ===== */
.avstack { display: inline-flex; }
.avstack .av { width: 28px; height: 28px; border-radius: 50%; border: 2px solid var(--surface); background-image: var(--grad-brand); margin-left: -8px; }
.avstack .av:first-child { margin-left: 0; }

/* ===== Friend activity row ===== */
.frow { display: flex; align-items: center; gap: 12px; padding: var(--sp-md) var(--sp-lg); transition: background var(--dur-fast) var(--ease); }
.frow:hover { background: var(--glass); }
.frow:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.frow__av { width: 38px; height: 38px; border-radius: 50%; background-image: var(--grad-brand); flex: 0 0 auto; }
.frow__txt { font-size: var(--fs-sm); color: var(--text-secondary); }
.frow__txt b { color: var(--text); font-weight: var(--fw-medium); }
.frow__time { margin-left: auto; font-size: var(--fs-xs); color: var(--text-muted); }

/* ===== Tab bar (glass) ===== */
.tabbar { position: absolute; bottom: 0; left: 0; right: 0; height: 84px; display: flex; justify-content: space-around; padding-top: 12px; background: var(--glass-dark); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); border-top: 1px solid var(--border); z-index: 30; }
.tab { display: flex; flex-direction: column; align-items: center; gap: 5px; font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--text-muted); background: none; border: none; cursor: pointer; padding: 4px 8px; min-width: 44px; min-height: 44px; transition: color var(--dur-fast) var(--ease); }
.tab__ico { width: 24px; height: 24px; border-radius: 7px; border: 2px solid currentColor; }
.tab.is-active { color: var(--accent); }
.tab.is-active .tab__ico { background-image: var(--grad-glow); border-color: transparent; }
.tab:hover:not(.is-active) { color: var(--text-secondary); }
.tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm); }

/* ===== Global focus visible (promoted from preview.css — preview-only no longer) ===== */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 4px; }

/* ===== Genre chips (promoted from segmented.html local style) ===== */
.chip { display: inline-flex; align-items: center; gap: 6px; background: var(--glass); border: 1px solid var(--glass-border); border-radius: var(--r-pill); padding: 7px var(--sp-md); font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--text-secondary); white-space: nowrap; cursor: pointer; transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.chip:hover { background: var(--surface-hi); border-color: var(--border-strong); }
.chip:active { transform: scale(0.96); }
.chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.chip.is-active { background: var(--social-glass); border-color: var(--social-glass-border); color: var(--accent); }
.chip.is-active .chip__dot { background: var(--accent); box-shadow: 0 0 8px var(--accent); }
.chip__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-muted); }

/* ===== Segmented + location chip focus (promoted from segmented.html local style) ===== */
.seg__item { cursor: pointer; transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.seg__item:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.seg__item:hover:not(.is-active) { background: var(--glass); color: var(--text-secondary); }
/* Social-wedge active variant on a seg item */
.seg__item.is-social.is-active { background: var(--social-glass); border: 1px solid var(--social-glass-border); color: var(--accent); }
.locchip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ===== One-tap reaction chips (friend-activity) ===== */
.fa-react__chip { cursor: pointer; transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); }
.fa-react__chip:hover { background: var(--surface-hi); border-color: var(--border-strong); }
.fa-react__chip:active { transform: scale(0.92); }
.fa-react__chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.fa-react__chip.is-active { background: var(--social-glass); border-color: var(--accent); }

/* ===== Toast notification ===== */
.toast { display: flex; align-items: center; gap: var(--sp-md); padding: var(--sp-md) var(--sp-lg); background: var(--surface-hi); border: 1px solid var(--border-strong); border-radius: var(--r-md); box-shadow: var(--overlay-shadow); font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text); max-width: 360px; }
.toast__ico { font-size: var(--fs-md); flex: 0 0 auto; }
.toast__msg { flex: 1; }
.toast__close { background: none; border: none; cursor: pointer; color: var(--text-muted); font-size: var(--fs-md); padding: 4px; border-radius: var(--r-sm); flex: 0 0 auto; }
.toast__close:hover { color: var(--text); }
.toast--success { border-color: rgba(182,255,106,0.32); }
.toast--success .toast__ico { color: var(--attended); }
.toast--error   { border-color: rgba(255,92,114,0.32); }
.toast--error   .toast__ico { color: var(--danger); }
.toast--info    { border-color: rgba(77,226,255,0.32); }
.toast--info    .toast__ico { color: var(--accent); }

/* ===== Overlay backdrop ===== */
.overlay { position: fixed; inset: 0; background: rgba(11,13,18,0.72); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 40; display: flex; align-items: flex-end; justify-content: center; }

/* ===== Bottom sheet ===== */
.sheet { background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--r-xl) var(--r-xl) 0 0; padding: var(--sp-lg) var(--sp-lg) var(--sp-xxxl); width: 100%; max-width: 480px; box-shadow: var(--overlay-shadow); }
.sheet__handle { width: 36px; height: 4px; background: var(--border-strong); border-radius: var(--r-pill); margin: 0 auto var(--sp-lg); }
.sheet__title { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); letter-spacing: var(--tr-snug); color: var(--text); margin-bottom: var(--sp-md); }

/* ===== Centered modal ===== */
.overlay--center { align-items: center; }
.modal { background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--r-xl); padding: var(--sp-xl); width: 100%; max-width: 360px; box-shadow: var(--overlay-shadow); }
.modal__title { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--text); margin-bottom: var(--sp-sm); }
.modal__body { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-secondary); line-height: var(--lh-base); margin-bottom: var(--sp-xl); }
.modal__actions { display: flex; gap: var(--sp-sm); justify-content: flex-end; }

/* ===== Skeleton loader ===== */
.skel { border-radius: var(--r-sm); background: linear-gradient(90deg, var(--surface-alt) 25%, var(--surface-hi) 50%, var(--surface-alt) 75%); background-size: 200% 100%; animation: skel-shimmer 1.5s ease-in-out infinite; }
.skel[aria-hidden=true] { pointer-events: none; } /* ponytail: hide from a11y tree via aria-hidden on caller */
.skel--text  { height: 14px; border-radius: var(--r-pill); }
.skel--title { height: 20px; border-radius: var(--r-pill); }
.skel--avatar { width: 38px; height: 38px; border-radius: 50%; flex: 0 0 auto; }
.skel--card  { height: 200px; border-radius: var(--r-lg); }
@keyframes skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }

/* ===== Empty state ===== */
.empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--sp-md); padding: var(--sp-xxxl) var(--sp-xl); }
.empty__ico { font-size: 48px; line-height: 1; }
.empty__title { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); letter-spacing: var(--tr-snug); color: var(--text); }
.empty__body  { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-secondary); line-height: var(--lh-base); max-width: 260px; }

/* ===== Switch / Toggle ===== */
/* Uses real <input type=checkbox role=switch> hidden + CSS track/thumb */
.sw { display: inline-flex; align-items: center; gap: var(--sp-md); cursor: pointer; }
.sw__input { position: absolute; opacity: 0; width: 0; height: 0; } /* hidden; focus routes to track */
.sw__track { position: relative; width: 50px; height: 28px; border-radius: var(--r-pill); background: var(--surface-hi); border: 1px solid var(--border-strong); transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease); flex: 0 0 auto; }
.sw__thumb { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 50%; background: var(--text-muted); transition: transform var(--dur-base) var(--ease), background var(--dur-fast) var(--ease); box-shadow: 0 1px 4px rgba(0,0,0,0.4); }
.sw__input:checked ~ .sw__track { background: var(--accent); border-color: var(--accent); }
.sw__input:checked ~ .sw__track .sw__thumb { transform: translateX(22px); background: var(--ink); }
.sw__input:focus-visible ~ .sw__track { outline: 2px solid var(--accent); outline-offset: 2px; }
.sw__label { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-secondary); }

/* ===== Radio group (show ALL options for 2–3 choices — never a dropdown) ===== */
/* UX rule: when a user picks among 2–3 values, surface them inline; a <select> hides them. */
.rg { display: flex; flex-direction: column; gap: var(--sp-sm); }
.rg__legend { font-family: var(--font-body); font-weight: var(--fw-bold); font-size: var(--fs-sm); color: var(--text-secondary); margin-left: var(--sp-xs); margin-bottom: var(--sp-xs); }
.rd { display: inline-flex; align-items: center; gap: var(--sp-md); cursor: pointer; padding: var(--sp-sm) 0; min-height: 44px; }
.rd__input { position: absolute; opacity: 0; width: 0; height: 0; }
.rd__dot { flex: 0 0 22px; width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--border-strong); background: var(--surface-alt); display: flex; align-items: center; justify-content: center; transition: border-color var(--dur-fast) var(--ease); }
.rd__dot::after { content: ""; width: 10px; height: 10px; border-radius: 50%; background: var(--accent); opacity: 0; transform: scale(0.4); transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); }
.rd__input:checked ~ .rd__dot { border-color: var(--accent); }
.rd__input:checked ~ .rd__dot::after { opacity: 1; transform: scale(1); }
.rd__input:focus-visible ~ .rd__dot { outline: 2px solid var(--accent); outline-offset: 2px; }
.rd__label { font-family: var(--font-body); font-size: var(--fs-md); color: var(--text); }

/* ===== Toggle tokens (multi-select pills — replaces a checkbox list in long sets) ===== */
/* Reuses .chip; a token is a real <button aria-pressed> so selection is announced. */
.tokenwrap { display: flex; flex-wrap: wrap; gap: var(--sp-sm); }
.chip[aria-pressed=true] { background: var(--social-glass); border-color: var(--social-glass-border); color: var(--accent); }

/* ===== OTP / segmented code input (align field shape to the data) ===== */
/* One box per character — a 6-char code is six inputs, not one text field. */
.otp { display: flex; gap: var(--sp-sm); }
.otp__cell { width: 48px; height: 56px; text-align: center; background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--r-md); font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-xl); color: var(--text); -webkit-appearance: none; appearance: none; transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease); }
.otp__cell:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--social-glass); }
.otp__cell.is-filled { border-color: var(--border-strong); }

/* ===== Masked input (input mask guides the format) ===== */
/* The mask hint lives in the placeholder; JS keeps the value formatted as the user types. */
.tf__input.is-mask { font-variant-numeric: tabular-nums; letter-spacing: 0.5px; }

/* ===== Searchable combobox (type AND scroll — never a bare <select>) ===== */
.combo { position: relative; width: 100%; }
.combo__list { list-style: none; margin: var(--sp-xs) 0 0; padding: var(--sp-xs); position: absolute; left: 0; right: 0; z-index: 20; max-height: 220px; overflow-y: auto; background: var(--surface-hi); border: 1px solid var(--border-strong); border-radius: var(--r-md); box-shadow: var(--overlay-shadow); }
.combo__list[hidden] { display: none; }
.combo__opt { padding: var(--sp-md); border-radius: var(--r-sm); font-family: var(--font-body); font-size: var(--fs-md); color: var(--text); cursor: pointer; }
.combo__opt:hover, .combo__opt.is-active { background: var(--glass); }
.combo__opt[aria-selected=true] { color: var(--accent); }
.combo__empty { padding: var(--sp-md); font-size: var(--fs-sm); color: var(--text-muted); }

/* ===== Range slider (filters: a slider beats two number inputs) ===== */
.range { display: flex; flex-direction: column; gap: var(--sp-md); }
.range__head { display: flex; align-items: baseline; justify-content: space-between; }
.range__label { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-md); color: var(--text); }
.range__val { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--accent); font-variant-numeric: tabular-nums; }
.range__input { -webkit-appearance: none; appearance: none; width: 100%; height: 6px; border-radius: var(--r-pill); background: var(--surface-hi); outline: none; }
.range__input::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 24px; height: 24px; border-radius: 50%; background: var(--accent); border: 3px solid var(--ink); box-shadow: 0 0 8px var(--accent); cursor: pointer; }
.range__input::-moz-range-thumb { width: 22px; height: 22px; border-radius: 50%; background: var(--accent); border: 3px solid var(--ink); box-shadow: 0 0 8px var(--accent); cursor: pointer; }
.range__input:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }

/* ===== Metric / stat (prioritize the value — big number, quiet label) ===== */
.metric { display: flex; flex-direction: column; gap: var(--sp-xs); }
.metric__label { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-muted); font-weight: var(--fw-medium); }
.metric__value { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-xxl); letter-spacing: var(--tr-tight); color: var(--text); line-height: var(--lh-tight); font-variant-numeric: tabular-nums; }
.metric__delta { font-family: var(--font-body); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
.metric__delta.is-up { color: var(--attended); }
.metric__delta.is-down { color: var(--danger); }

/* ===== Read more (truncate long body, expand on demand) ===== */
.readmore__body { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-secondary); line-height: var(--lh-base); }
.readmore__body.is-clamped { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.readmore__toggle { margin-top: var(--sp-sm); background: none; border: none; padding: 4px 0; cursor: pointer; font-family: var(--font-body); font-weight: var(--fw-medium); font-size: var(--fs-sm); color: var(--accent); }
.readmore__toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm); }

/* ===== Nested radius rule (inner radius < outer for concentric corners) =====
   When an element nests inside a rounded container, inner-r = outer-r − gap.
   e.g. card --r-lg(20) with --sp-xs(4) inset → inner uses --r-md(14)/--r-sm(10), not --r-lg.
   Tokens already ladder this: r-sm 10 · r-md 14 · r-lg 20 · r-xl 28. Step DOWN one rung when nesting. */

/* ===== Checkbox ===== */
.cb { display: inline-flex; align-items: flex-start; gap: var(--sp-md); cursor: pointer; }
.cb__input { position: absolute; opacity: 0; width: 0; height: 0; }
.cb__box { flex: 0 0 22px; width: 22px; height: 22px; border-radius: var(--r-sm); border: 2px solid var(--border-strong); background: var(--surface-alt); display: flex; align-items: center; justify-content: center; transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease); }
.cb__box::after { content: ""; width: 6px; height: 11px; border: 2px solid var(--ink); border-top: none; border-left: none; transform: rotate(45deg) translateY(-1px); opacity: 0; transition: opacity var(--dur-fast) var(--ease); }
.cb__input:checked ~ .cb__box { background: var(--accent); border-color: var(--accent); }
.cb__input:checked ~ .cb__box::after { opacity: 1; }
.cb__input:focus-visible ~ .cb__box { outline: 2px solid var(--accent); outline-offset: 2px; }
.cb__label { font-family: var(--font-body); font-size: var(--fs-sm); color: var(--text-secondary); line-height: var(--lh-base); padding-top: 2px; }

/* ===== Web app shell (canonical web UI — mirrors app.trydropapp.com) =====
   Source: DropApp WebNav.tsx + WebShowCard.tsx + (tabs)/index.tsx web branch.
   THE look for every Drop web surface: dark glass top nav over a 1440px-capped
   left-aligned card grid. */

/* Top nav — persistent, replaces the phone tab bar on web */
.wn { width: 100%; background: var(--glass-dark); border-bottom: 1px solid var(--border-hi); display: flex; justify-content: center; backdrop-filter: blur(12px); }
.wn__inner { width: 100%; max-width: 1440px; display: flex; align-items: center; gap: var(--sp-xl); padding: var(--sp-md) var(--sp-xl); }
.wn__links { flex: 1; display: flex; align-items: center; gap: var(--sp-xl); }
.wn__link { font-family: var(--font-body); font-weight: var(--fw-medium); font-size: var(--fs-sm); letter-spacing: var(--tr-snug); color: var(--text-muted); text-decoration: none; }
.wn__link.is-active { color: var(--text); font-weight: var(--fw-bold); }
.wn__right { display: flex; align-items: center; gap: var(--sp-md); }
.wn__bell { position: relative; width: 38px; height: 38px; border-radius: var(--r-pill); background: var(--glass); border: 1px solid var(--glass-border); display: flex; align-items: center; justify-content: center; color: var(--text); }
.wn__badge { position: absolute; top: -2px; right: -2px; min-width: 18px; height: 18px; padding: 0 3px; border-radius: 9px; background: var(--going); border: 2px solid var(--bg); color: var(--text); font-family: var(--font-body); font-size: 10px; font-weight: 800; display: flex; align-items: center; justify-content: center; }

/* Page frame under the nav — 1440 cap, left-flowing content */
.wsh { background: var(--bg); min-height: 100%; }
.wsh__content { width: 100%; max-width: 1440px; margin: 0 auto; padding: var(--sp-xl) var(--sp-xl) var(--sp-xxxl); display: flex; flex-direction: column; gap: var(--sp-lg); }
.wsh__headrow { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-md); }
.wsh__title { font-family: var(--font-display); font-size: var(--fs-display); letter-spacing: var(--tr-tight); color: var(--text); }
.wsh__controls { display: flex; align-items: center; gap: var(--sp-md); flex-wrap: wrap; }
/* AXS-style: cards flow from the LEFT so a sparse feed never orphans one card dead-center */
.wsh__grid { display: flex; flex-wrap: wrap; justify-content: flex-start; gap: var(--sp-lg); }

/* Discover "Pick your night" genre carousel — a horizontal-scroll rail flanked
   by ghost arrow buttons on desktop; on mobile it falls back to the touch
   scroll rail (.m-rail) and the arrows hide (see the 720px block). */
.genre-carousel { display: flex; align-items: center; gap: var(--sp-sm); }
/* 4px padding + negative margin: room for the 2px selection ring the
   overflow scroll box would otherwise clip, without shifting layout */
.genre-rail { flex: 1; min-width: 0; display: flex; flex-wrap: nowrap; overflow-x: auto; scroll-behavior: smooth; scrollbar-width: none; padding: 4px; margin: -4px; }
.genre-rail::-webkit-scrollbar { display: none; }
.genre-rail > button { flex: 0 0 168px; }
.genre-arrow { flex: 0 0 auto; width: 40px; height: 40px; border-radius: var(--r-pill); background: var(--glass); border: 1px solid var(--glass-border); color: var(--text); font-size: 20px; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; padding: 0; transition: opacity 0.15s var(--ease); }
.genre-arrow:disabled { opacity: 0.35; cursor: default; }

/* Web show card — uniform 300×340 image-forward unit (identical signed-out/in) */
.wsc { width: 300px; }
.wsc__card { position: relative; display: flex; flex-direction: column; justify-content: flex-end; width: 300px; height: 340px; border-radius: var(--r-lg); overflow: hidden; background: var(--surface); border: 1px solid var(--border); text-decoration: none; }
.wsc__img { position: absolute; inset: 0; background: var(--surface-alt) center/cover no-repeat; }
.wsc__scrim { position: absolute; left: 0; right: 0; bottom: 0; height: 70%; background: var(--scrim); pointer-events: none; }
.wsc__price { position: absolute; top: var(--sp-md); right: var(--sp-md); background: var(--glass-dark); border: 1px solid var(--glass-border); padding: 5px var(--sp-md); border-radius: var(--r-pill); color: var(--text); font-family: var(--font-body); font-size: var(--fs-xs); font-weight: var(--fw-bold); }
.wsc__friends { position: absolute; top: var(--sp-md); left: var(--sp-md); display: flex; align-items: center; gap: 4px; background: var(--social-glass); border: 1px solid var(--social-glass-border); padding: 5px var(--sp-md); border-radius: var(--r-pill); color: var(--accent); font-family: var(--font-body); font-size: var(--fs-xs); font-weight: var(--fw-bold); }
.wsc__text { position: relative; padding: var(--sp-lg); display: flex; flex-direction: column; gap: 4px; }
.wsc__date { color: var(--accent); font-family: var(--font-body); font-weight: var(--fw-bold); font-size: var(--fs-xs); letter-spacing: var(--tr-wide); text-transform: uppercase; }
.wsc__title { color: var(--text); font-family: var(--font-display); font-weight: 800; font-size: var(--fs-lg); letter-spacing: var(--tr-tight); line-height: 24px; }
.wsc__venue { color: var(--text-secondary); font-family: var(--font-body); font-size: var(--fs-sm); }
/* Signed-in action row (below the image; absent → identical to the signed-out card) */
.wsc__actions { display: flex; align-items: center; gap: var(--sp-sm); margin-top: var(--sp-sm); }
.wsc__act { flex: 1; display: flex; align-items: center; justify-content: center; gap: 5px; padding: var(--sp-sm) 0; border-radius: var(--r-pill); background: var(--glass); border: 1px solid var(--glass-border); color: var(--text-secondary); font-family: var(--font-body); font-weight: var(--fw-bold); font-size: var(--fs-xs); cursor: pointer; }
.wsc__act.is-going { background: var(--going-glass); border-color: var(--going-glass-border); color: var(--going); }
.wsc__act.is-interested { background: var(--social-glass); border-color: var(--social-glass-border); color: var(--accent); }
.wsc__share { width: 40px; aspect-ratio: 1; border-radius: var(--r-pill); background: var(--glass); border: 1px solid var(--glass-border); display: flex; align-items: center; justify-content: center; color: var(--text-secondary); cursor: pointer; }
.wsc__skeleton { width: 300px; height: 340px; border-radius: var(--r-lg); background: var(--surface-alt); }

/* ===== design file's own inline <style> block, verbatim ===== */
  :root {
    --grad-glow-fill: linear-gradient(120deg, #5DCFE6 0%, #C350D9 52%, #B3EB78 100%);
  }
  html, body { margin: 0; padding: 0; background: var(--ink); }
  body { font-family: var(--font-body); color: var(--text); -webkit-font-smoothing: antialiased; }
  * { box-sizing: border-box; }
  a { color: var(--accent); text-decoration: none; }
  a:hover { color: var(--white); }
  ::selection { background: rgba(77,226,255,0.3); }
  /* Rule 9: large gradient fills desaturate — glow-fill for fills, grad-glow for text accents only */
  .btn--primary { background-image: var(--grad-glow-fill); box-shadow: 0 6px 24px rgba(195,80,217,0.28); }
  /* Dual-handle range slider (rule 16) */
  .dual { position: relative; height: 28px; }
  .dual__track { position: absolute; top: 11px; left: 0; right: 0; height: 6px; border-radius: var(--r-pill); background: var(--surface-hi); }
  .dual__fill { position: absolute; top: 11px; height: 6px; border-radius: var(--r-pill); background: var(--grad-cool); }
  .dual input[type=range] { position: absolute; top: 0; left: 0; width: 100%; height: 28px; margin: 0; background: none; pointer-events: none; -webkit-appearance: none; appearance: none; }
  .dual input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 22px; height: 22px; border-radius: 50%; background: var(--accent); border: 3px solid var(--ink); box-shadow: 0 0 8px var(--accent); cursor: pointer; pointer-events: auto; }
  .dual input[type=range]::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: var(--accent); border: 3px solid var(--ink); box-shadow: 0 0 8px var(--accent); cursor: pointer; pointer-events: auto; }
  @media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } }
  @keyframes wavebar { 0%,100% { transform: scaleY(0.28); } 50% { transform: scaleY(1); } }
  @keyframes floatGlow { 0%,100% { transform: translate(0,0); } 50% { transform: translate(20px,-24px); } }
  /* Skeleton loading */
  @keyframes shimmer { 0% { background-position: -400px 0; } 100% { background-position: 400px 0; } }
  .skel { background: var(--surface-hi); background-image: linear-gradient(90deg, transparent 0, rgba(255,255,255,0.06) 40%, rgba(255,255,255,0.10) 50%, rgba(255,255,255,0.06) 60%, transparent 100%); background-size: 800px 100%; background-repeat: no-repeat; animation: shimmer 1.4s var(--ease) infinite; border-radius: var(--r-sm); }
  .is-active-legal { background: var(--surface-hi); color: var(--text) !important; }
  .drop-scroll { min-height: 100vh; }
  /* Page must never scroll sideways — rails scroll inside their own boxes. */
  html, body { overflow-x: clip; }
  /* iOS renders date inputs with intrinsic chrome + centered value — flatten
     so they match the other 52px text pills. */
  input[type="date"] { -webkit-appearance: none; appearance: none; }
  input[type="date"]::-webkit-date-and-time-value { text-align: left; }
  /* Mobile-only icon buttons in nav — hidden on desktop */
  .wn__mobicon { display: none; }
  .ed-bottombar { display: none; }
  .mnav { display: none; }
  @media (max-width: 720px) {
    /* ===== NAV: logo + location pill + search icon + menu ===== */
    .wn__inner { gap: 10px; padding: 10px 14px; }
    .wn__links { flex: 1; gap: 10px; justify-content: flex-start; min-width: 0; }
    .wn__navlink { display: none !important; }
    .wn__search-inline { display: none !important; }
    .wn__right .btn, .wn__right > .wn__link { display: none !important; }
    .wn__avatar, .wn__bell { display: none !important; }
    .wn__mobicon { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--r-pill); background: var(--glass); border: 1px solid var(--glass-border); color: var(--text); font-size: 19px; cursor: pointer; flex: 0 0 auto; padding: 0; }
    .locchip { max-width: 160px; overflow: hidden; white-space: nowrap; }
    /* mobile drawer */
    .mnav { display: block; position: fixed; inset: 0; z-index: 90; }
    .mnav__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.55); backdrop-filter: blur(2px); }
    .mnav__panel { position: absolute; top: 0; right: 0; bottom: 0; width: 82%; max-width: 320px; background: var(--surface-hi); border-left: 1px solid var(--border-strong); box-shadow: var(--overlay-shadow); padding: var(--sp-lg); overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }

    /* ===== CARDS single column, centered (lists stay left — see below) ===== */
    .wsh__grid { justify-content: center; gap: var(--sp-md); }
    .wsc, .wsc__card { width: 100% !important; }
    .wsh__content { padding: var(--sp-md) var(--sp-md) var(--sp-xxxl); }
    /* Signed-out home "Happening in {city}" section matches Discover's near
       bezel-to-bezel cards (inline padding needs !important to override) */
    .home-shows { padding-left: var(--sp-md) !important; padding-right: var(--sp-md) !important; }

    /* Discover segmented control + Wrapped share buttons center on mobile */
    .disc-controls { justify-content: center; width: 100%; }
    .wr-share-actions { align-items: center; }
    /* Home "Happening in {city}" search goes full-width on compact */
    .home-search { flex: 1 1 100% !important; max-width: 100% !important; }
    .home-search input { height: 52px !important; font-size: 16px !important; }
    /* Genre carousel: arrows hide on mobile — touch-scroll the rail instead */
    .genre-arrow { display: none; }

    /* horizontal scroll rails (date chips, genre tiles, filters) */
    .m-rail { display: flex !important; flex-wrap: nowrap !important; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; grid-template-columns: none !important; margin: 0 calc(-1 * var(--sp-md)); padding: 0 var(--sp-md) var(--sp-xs); }
    .m-rail::-webkit-scrollbar { display: none; }
    .m-rail > * { flex: 0 0 auto; }
    .m-rail-tile > * { width: 132px; }

    /* ===== AUTH: brand strip on top, form leads ===== */
    .auth-main { flex-direction: column !important; min-height: 100vh; }
    .auth-brand { flex: 0 0 auto !important; padding: 16px 20px !important; }
    .auth-hero, .auth-foot { display: none !important; }
    .auth-form { flex: 1 1 auto !important; padding: 24px 20px 56px !important; align-items: flex-start !important; }

    /* ===== EVENT DETAIL: stack, drop buy box, sticky bottom bar ===== */
    .ed-grid { grid-template-columns: 1fr !important; gap: var(--sp-lg) !important; }
    .ed-aside { display: none !important; }
    .ed-wrap { padding-bottom: 96px !important; }
    .ed-bottombar { display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 60; gap: var(--sp-sm); align-items: center; padding: 10px 14px calc(10px + env(safe-area-inset-bottom)); background: var(--glass-dark); backdrop-filter: blur(12px); border-top: 1px solid var(--border-strong); }

    /* ===== SEARCH: stack filter above results, compact panel ===== */
    .search-grid { grid-template-columns: 1fr !important; }
    .search-filter { position: static !important; top: auto !important; padding: var(--sp-md) !important; }
    /* compact: uniform tight gaps + shorter selector pills (inline styles need !important) */
    .search-filter > div { margin-bottom: var(--sp-sm) !important; }
    .search-filter .fsel, .search-filter .locchip { height: 42px !important; }
    .search-filter .dual { margin-bottom: var(--sp-sm) !important; }

    /* ===== generic multi-col grids ===== */
    .m-stack { grid-template-columns: 1fr !important; }
    .m-2col { grid-template-columns: 1fr 1fr !important; }
    /* legal: sidebar → horizontal rail on top */
    .legal-grid { grid-template-columns: 1fr !important; gap: var(--sp-lg) !important; padding-left: var(--sp-md) !important; padding-right: var(--sp-md) !important; }
    .legal-nav { position: static !important; top: auto !important; flex-direction: row !important; gap: var(--sp-sm) !important; overflow-x: auto; scrollbar-width: none; padding-bottom: var(--sp-xs); border-bottom: 1px solid var(--border); }
    .legal-nav::-webkit-scrollbar { display: none; }
    .legal-nav > button { flex: 0 0 auto; white-space: nowrap; }
    /* sticky bottom CTA bar for form-heavy screens */
    .m-ctabar { position: sticky; bottom: 0; z-index: 40; margin: var(--sp-lg) calc(-1 * var(--sp-md)) calc(-1 * var(--sp-xxxl)); padding: 12px var(--sp-md) calc(12px + env(safe-area-inset-bottom)); background: var(--glass-dark); backdrop-filter: blur(12px); border-top: 1px solid var(--border-strong); }

    /* ===== WIZARD ===== */
    .wiz-main { align-items: stretch !important; padding: var(--sp-lg) var(--sp-md) var(--sp-xxl) !important; }
    .wiz-card { padding: var(--sp-lg) !important; }
    .wiz-foot { position: sticky; bottom: 0; background: var(--surface); margin: var(--sp-lg) calc(-1 * var(--sp-lg)) calc(-1 * var(--sp-lg)); padding: var(--sp-md) var(--sp-lg) calc(var(--sp-md) + env(safe-area-inset-bottom)); border-top: 1px solid var(--border); }

    /* headings that were nowrap can wrap on mobile */
    .m-wrap { white-space: normal !important; }
  }

/* ===== image-slot placeholder (image-slot.js dropped; CSS-only gradient fallback) ===== */
image-slot { display: flex; align-items: center; justify-content: center; position: absolute; inset: 0; background-image: linear-gradient(135deg, rgba(93,207,230,0.14), rgba(195,80,217,0.14)); color: var(--text-muted); font-family: var(--font-body); font-size: var(--fs-xs); text-align: center; padding: var(--sp-sm); }
image-slot::before { content: attr(placeholder); }
