/* ═════════════════════════════════════════════════════════════════════════
   SELLERIO ACCOUNT DASHBOARD — the signed-in shell at /account.

   LAYOUT only. Every colour, radius, shadow and type treatment comes from
   styles.css's tokens, and the components below are shaped to match the
   marketing site's own: pill nav items with a soft-tint active state (the
   same one .navlinks a.active uses), --r-xl cards on --shadow-sm, Space
   Grotesk headings, a translucent blurred top bar at the site's 64px nav
   height, and the site's own body gradient wash showing through.

   This file used to carry a --dash-* palette of its own — near-identical
   greys, a heavier border, its own shadow, square-ish cards and a solid
   blue block for the active nav item. Near-identical is the problem: it
   read as a different product the moment you crossed from sellerio.in into
   your account. There is now ONE set of brand values and this file states
   none of them.

   DARK MODE also moved into styles.css, as overrides of those same tokens,
   so /login and /signup get it from the same place. What is left here is
   the handful of status colours (verified green, error red) that are not
   in the token set.
   ═════════════════════════════════════════════════════════════════════════ */

/* No background of its own: styles.css's body rule already paints the site's
   background colour AND its three-point gradient wash, and overriding
   `background` here is what used to flatten the account page to plain grey
   while every other page had depth. */
body.dash {
  margin: 0;
  color: var(--text-primary);
  -webkit-font-smoothing: antialiased;
}

/* ── Layout ── */
.dash-shell { display: flex; min-height: 100vh; }

/* Translucent over the body wash, like the site's own sticky nav, rather
   than an opaque white panel sitting on top of it. */
.dash-side {
  width: 248px; flex: 0 0 248px;
  background: color-mix(in srgb, var(--surface) 82%, transparent);
  backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border-right: 1px solid var(--border);
  display: flex; flex-direction: column;
  position: sticky; top: 0; height: 100vh;
}
/* 64px tall — the site's nav height — so the logo sits at the same optical
   height as it does on every marketing page, and 36px to match .logo img
   there. It was 26px in a 18px-padded box, which read as a smaller brand. */
.dash-brand { display: flex; align-items: center; height: 64px; padding: 0 18px; flex: 0 0 auto; }
.dash-brand img { height: 36px; width: auto; }
/* The colour wordmark is near-black type; on the dark surface it disappeared
   into it. The light (white) file is the one the site already ships for dark
   backgrounds. Swapped in CSS so the right one is painted immediately —
   a script-set src flashes the wrong logo first. */
.dash-brand .on-dark { display: none; }
html[data-theme="dark"] .dash-brand .on-light { display: none; }
html[data-theme="dark"] .dash-brand .on-dark { display: block; }

/* styles.css styles the marketing header with a BARE element selector —
   `nav { position:sticky; background:rgba(247,248,250,.88); backdrop-filter:
   blur(12px); z-index:300 }`. That lands on this <nav> too, which left the
   sidebar painted light-grey in dark mode (and gave it a pointless blur
   layer and a z-index above the mobile scrim). Every one of those four
   properties is reset explicitly rather than relying on later-in-cascade
   luck. Keep the element a <nav> — it IS site navigation, and the fix
   belongs here, not in worse markup. */
.dash-nav {
  flex: 1; overflow-y: auto; padding: 6px 12px 12px;
  position: static;
  background: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: none;
  z-index: auto;
}
/* Shaped after .navlinks a on the marketing nav: a pill, muted by default,
   and ACTIVE as a soft tint of the accent rather than a solid blue block.
   The solid block was the single loudest thing on the page and matched
   nothing else in the product. */
.dash-nav-item {
  display: flex; align-items: center; gap: 11px;
  width: 100%; box-sizing: border-box;
  padding: 9px 13px; margin-bottom: 2px;
  border: none; background: none;
  border-radius: var(--r-pill);
  font: inherit; font-size: 14px; font-weight: 500;
  color: var(--text-secondary); text-align: left; text-decoration: none; cursor: pointer;
  transition: background .15s, color .15s;
}
.dash-nav-item:hover { background: var(--accent-soft); color: var(--text-primary); }
.dash-nav-item.is-active { background: var(--accent-soft); color: var(--accent); font-weight: 600; }
.dash-nav-item.is-active:hover { color: var(--accent); }
.dash-nav-item svg { width: 17px; height: 17px; flex: 0 0 17px; }
.dash-nav-item .tag {
  margin-left: auto; font-size: 10px; font-weight: 700; letter-spacing: .3px;
  padding: 2px 8px; border-radius: var(--r-pill);
  background: var(--accent-soft); color: var(--accent);
}
/* "New" beside Wallet (29 Sep 2026: "highlight Wallet with NEW tag near
   it"), in the Toolkit's Share & earn marker's look (lib/share-new.js): a red
   pill right after the word, the word at full contrast the whole time (5.6:1
   in both themes), and a ring that pulses, which stops under reduced motion.
   It shows until the date in assets/js/sio-wallet.js (NEW_UNTIL). */
.dash-nav-item .tag-new {
  margin-left: -3px; padding: 2px 7px 1px;
  font-size: 9.5px; font-weight: 800; letter-spacing: .06em; line-height: 1.35; text-transform: uppercase;
  background: #c5221f; color: #fff;
  animation: dashNewPulse 1.4s ease-out infinite;
}
@keyframes dashNewPulse {
  0% { box-shadow: 0 0 0 0 rgba(197,34,31,.55); }
  70% { box-shadow: 0 0 0 6px rgba(197,34,31,0); }
  100% { box-shadow: 0 0 0 0 rgba(197,34,31,0); }
}
@media (prefers-reduced-motion: reduce) { .dash-nav-item .tag-new { animation: none; } }

.dash-side-foot { border-top: 1px solid var(--border); padding: 14px 16px 16px; flex: 0 0 auto; }
.dash-who { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.dash-avatar {
  width: 32px; height: 32px; flex: 0 0 32px; border-radius: 50%;
  background: var(--accent); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 14px; font-weight: 700;
}
.dash-who .n { font-size: 13.5px; font-weight: 600; line-height: 1.3; }
.dash-who .e { font-size: 11.5px; color: var(--text-muted); word-break: break-all; line-height: 1.3; }
.dash-plan {
  display: block; text-align: center;
  font-size: 12px; font-weight: 700;
  padding: 8px; border-radius: var(--r-pill); margin-bottom: 10px;
  background: var(--accent-soft); color: var(--accent);
}
.dash-signout {
  display: flex; align-items: center; gap: 9px;
  width: 100%; padding: 8px 12px;
  border: none; background: none; font: inherit; font-size: 13.5px;
  color: var(--text-secondary); cursor: pointer; border-radius: var(--r-pill);
  transition: background .15s, color .15s;
}
.dash-signout:hover { color: var(--text-primary); background: var(--accent-soft); }

/* ── Main ── */
.dash-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
/* The site's nav, in every measurable respect: 64px tall, translucent over
   the body wash, blurred, one hairline border below. */
.dash-top {
  display: flex; align-items: center; justify-content: flex-end; gap: 10px;
  /* min-height, not height: the title now lives in here, and a two-line
     description on a narrow window must push the bar taller rather than
     spill out of it. */
  min-height: 64px; padding: 10px 24px;
  border-bottom: 1px solid var(--border);
  background: color-mix(in srgb, var(--body-bg) 88%, transparent);
  backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  position: sticky; top: 0; z-index: 20;
}
/* ── The section title, in the top bar ────────────────────────────────────
   Left-aligned and margin-right:auto, which is what keeps the pill and the
   theme button hard right — .dash-top is justify-content:flex-end, so
   without the auto margin this block would sit against them.
   min-width:0 lets the description ellipsis instead of shoving them off. */
.dash-top-title {
  margin-right: auto; min-width: 0; display: flex; flex-direction: column; gap: 1px;
}
.dash-top-h1 {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 19px; font-weight: 700; letter-spacing: -0.02em; line-height: 1.2;
  color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dash-top-sub {
  font-size: 12.5px; color: var(--text-secondary); line-height: 1.35;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Set by liftTitleToTopbar() only once a title has actually been read, so a
   page whose script never ran keeps its original in-body headings instead of
   showing none at all. */
body.dash-has-topbar-title .dash-section > .dash-h1,
body.dash-has-topbar-title .dash-section > .dash-sub { display: none; }

.dash-pill {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12.5px; font-weight: 600;
  padding: 6px 13px; border-radius: var(--r-pill);
  border: 1px solid var(--border); background: var(--surface);
  color: var(--text-secondary);
}
.dash-pill .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--text-muted); }
.dash-pill.on { background: rgba(0,200,117,.10); border-color: rgba(0,200,117,.28); color: #05794b; }
.dash-pill.on .dot { background: var(--mgreen); }
html[data-theme="dark"] .dash-pill.on { color: #4ade9b; }

.dash-icon-btn {
  width: 36px; height: 36px; display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--border-strong); background: var(--surface); border-radius: var(--r-pill);
  color: var(--text-secondary); cursor: pointer;
  transition: border-color .15s, color .15s;
}
.dash-icon-btn:hover { border-color: var(--text-muted); color: var(--text-primary); }
.dash-icon-btn svg { width: 16px; height: 16px; }

.dash-body { padding: 32px 24px 64px; max-width: 1080px; width: 100%; }
/* Space Grotesk, like every heading on the marketing site. This was Inter
   800 — a different typeface at a weight the site never uses, and the most
   visible single difference between the two surfaces. */
.dash-h1 {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 30px; font-weight: 700; letter-spacing: -0.03em; line-height: 1.15;
  margin: 0 0 6px;
}
.dash-sub { font-size: 14.5px; color: var(--text-secondary); margin: 0 0 26px; line-height: 1.6; }

.dash-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-sm);
  padding: 22px 24px;
  margin-bottom: 18px;
}
.dash-card-title { font-size: 14.5px; font-weight: 700; margin: 0 0 14px; letter-spacing: -0.01em; }

.dash-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 16px; margin-bottom: 18px; }
.dash-stat {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--r-xl); padding: 18px 20px; box-shadow: var(--shadow-sm);
}
.dash-stat .k { font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--text-muted); }
.dash-stat .v {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 26px; font-weight: 700; letter-spacing: -0.03em; margin-top: 6px;
}
.dash-stat .s { font-size: 11.5px; color: var(--text-muted); margin-top: 4px; }

.dash-row { display: flex; justify-content: space-between; gap: 14px; align-items: center; padding: 12px 0; border-bottom: 1px solid var(--border); font-size: 14px; }
.dash-row:last-child { border-bottom: none; }
.dash-row .k { color: var(--text-secondary); }
.dash-row .v { font-weight: 600; text-align: right; word-break: break-word; }

.dash-badge { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: var(--r-pill); }
.dash-badge.yes { background: rgba(0,200,117,.13); color: #05794b; }
.dash-badge.no { background: rgba(140,141,151,.15); color: var(--text-secondary); }
html[data-theme="dark"] .dash-badge.yes { color: #4ade9b; }

.dash-field { margin-bottom: 15px; }
.dash-label { display: block; font-size: 12px; font-weight: 700; color: var(--text-secondary); margin-bottom: 6px; letter-spacing: .2px; }
/* Identical to .auth-input on /login and /signup — the same control on the
   same account, two clicks apart, should not be two different controls. */
.dash-input {
  width: 100%; box-sizing: border-box; font: inherit; font-size: 14.5px;
  color: var(--text-primary); background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: var(--r-md); padding: 11px 13px;
  transition: border-color .15s, box-shadow .15s;
}
.dash-input::placeholder { color: var(--text-muted); }
.dash-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }

/* Shaped after .btn-primary / .btn-ghost on the marketing site: pill, same
   lift on hover, same shadow. display/text-decoration/white-space are here
   so it works on an <a> as well as a <button> — the Extensions list renders
   "Add to Chrome" as a real link to the Web Store. */
/* The fill is the brand accent taken 12% darker. White on #1a6fff measures
   4.41:1 — just under the 4.5:1 a 14px label needs — and a primary button
   is the one thing on the page that must be read at a glance. The mix lands
   at ~5.4:1 and still reads as the brand blue; the plain accent stays first
   for any browser without color-mix(). Hover is --accent2, darker again.
   Changed 24 Sep 2026 with the Extensions/Settings redesign. */
.dash-btn {
  font: inherit; font-size: 14px; font-weight: 600; color: #fff;
  background: var(--accent);
  background: color-mix(in srgb, var(--accent) 88%, #000);
  border: none; border-radius: var(--r-pill);
  padding: 11px 22px; cursor: pointer;
  display: inline-block; text-decoration: none; white-space: nowrap;
  box-shadow: 0 1px 2px rgba(26,111,255,0.15);
  transition: background .15s, transform .15s, box-shadow .15s;
}
.dash-btn:hover { background: var(--accent2); color: #fff; transform: translateY(-1px); box-shadow: var(--shadow-md); }
/* Row-level action — small enough to sit inline beside a value without
   turning the row into a toolbar. Used by the email row's Verify. */
.dash-btn.mini {
  font-size: 12px; padding: 4px 12px;
  margin-left: 8px; vertical-align: middle;
}
.dash-btn[disabled] { opacity: .6; cursor: default; transform: none; box-shadow: none; }
.dash-btn.ghost {
  background: var(--surface); color: var(--text-primary);
  border: 1px solid var(--border-strong); box-shadow: none;
}
.dash-btn.ghost:hover { background: var(--surface); border-color: var(--text-muted); color: var(--text-primary); }

.dash-msg { display: none; font-size: 13px; line-height: 1.5; border-radius: var(--r-md); padding: 11px 13px; margin-bottom: 15px; }
.dash-msg.err { display: block; background: rgba(226,68,92,.09); color: #b3243a; border: 1px solid rgba(226,68,92,.22); }
.dash-msg.ok { display: block; background: rgba(0,200,117,.09); color: #05794b; border: 1px solid rgba(0,200,117,.25); }
html[data-theme="dark"] .dash-msg.err { color: #ff8098; }
html[data-theme="dark"] .dash-msg.ok { color: #4ade9b; }

/* ── One-time codes ──────────────────────────────────────────────────────
   An email code and an SMS code are both six digits and land minutes apart.
   When they were asked for on two different screens, nothing on either
   screen named WHICH code it wanted, and people typed one into the other's
   box. So both live in a single card now, each in its own bordered panel
   headed by the channel name and — the part that actually disambiguates —
   the real address or number the code was sent to.

   auto-fit rather than a fixed two-column grid: a legacy account with no
   mobile number on file still renders a second panel (asking for the
   number), but if a panel is ever hidden the remaining one fills the row
   instead of leaving a hole where a box used to be. */
.dash-otp-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; align-items: start; }
.dash-otp { border: 1px solid var(--border); border-radius: var(--r-lg); padding: 16px 18px; background: var(--body-bg); }
/* A verified panel stays on screen rather than vanishing — a box that
   disappears the instant it succeeds leaves someone unsure it worked. */
.dash-otp.is-done { border-color: rgba(0,200,117,.30); background: rgba(0,200,117,.05); }
.dash-otp-head { display: flex; align-items: center; justify-content: space-between; gap: 9px; }
.dash-otp-title { font-size: 14.5px; font-weight: 700; letter-spacing: -.01em; }
/* Full text colour, not a muted caption. This line is the whole point of
   the panel: it is what tells someone which of the two codes belongs in
   the box underneath it. */
.dash-otp-to { font-size: 13px; font-weight: 600; color: var(--text-primary); word-break: break-all; margin: 5px 0 12px; }
.dash-otp-hint { font-size: 11.5px; color: var(--text-muted); line-height: 1.55; margin: 7px 0 11px; }
.dash-otp-input { max-width: 168px; font-size: 16px; font-weight: 700; letter-spacing: 5px; }
.dash-otp-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.dash-otp-actions .dash-btn { font-size: 13px; padding: 9px 16px; }
.dash-otp-done { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; font-weight: 600; line-height: 1.5; color: #05794b; }
html[data-theme="dark"] .dash-otp-done { color: #4ade9b; }
.dash-otp-done svg { width: 15px; height: 15px; flex: 0 0 15px; margin-top: 2px; }
.dash-note { font-size: 12.5px; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }

/* ── Sub-tabs inside one section ─────────────────────────────────────────
   Settings holds three pages now — Profile, Password and Billing. Password
   used to be a SIDEBAR ITEM of its own called Security, which put two
   halves of "my account settings" at the same level as Extensions and
   Templates and made the sidebar longer without making anything easier to
   find.

   Ported from the platform app's own .sub-tab-bar (public/assets/style.css)
   rather than invented here: an underlined row, muted until active, accent
   text over a 2px accent rule. That combination is the reason it is NOT a
   background tint — a tint alone is the active state that all but vanishes
   on the dark surface, where --accent-soft is a 0.18-alpha wash over a near
   black. Colour AND a hard rule read in both themes.

   Real <button>s in a real tablist, with a roving tabindex driven by
   account.html: the strip is one tab stop, arrows move inside it. */
.dash-subtabs {
  display: flex; align-items: center; gap: 22px;
  margin: 0 0 22px; padding: 0;
  border-bottom: 1px solid var(--border);
  overflow-x: auto; scrollbar-width: none;
}
.dash-subtabs::-webkit-scrollbar { display: none; }
.dash-subtab {
  flex: 0 0 auto;
  padding: 0 0 11px; margin-bottom: -1px;
  border: none; border-bottom: 2px solid transparent; background: none;
  font: inherit; font-size: 14px; font-weight: 600;
  /* --text-secondary, not --text-muted. The app's .sub-tab uses muted, but
     on THIS page the closest sibling control is .dash-nav-item beside it,
     which is secondary/accent — and muted is only 3.1:1 on the light body
     background, under the 4.5:1 that 14px text needs to stay legible. */
  color: var(--text-secondary); white-space: nowrap; cursor: pointer;
  transition: color .15s, border-color .15s;
}
.dash-subtab:hover { color: var(--text-primary); }
/* --accent-ink for the WORDS, --accent for the rule. #1a6fff as 14px text on
   the body background is 3.95:1; the ink (#0052e0 light, #4da3f5 dark) is the
   accent dropped until it clears AA, which is what styles.css made it for. */
.dash-subtab[aria-selected="true"] {
  color: var(--accent-ink); border-bottom-color: var(--accent); font-weight: 700;
}
.dash-subtab { display: inline-flex; align-items: center; gap: 8px; }
.dash-subtab svg { width: 16px; height: 16px; flex: 0 0 16px; }
/* A roving tabindex means the strip is reached by ONE Tab press, so the ring
   on the tab that press lands on is the only thing telling a keyboard user
   where they are. :focus-visible rather than :focus, so a mouse click does
   not leave a ring behind. */
.dash-subtab:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--r-sm);
}

/* The credits bar on Billing. A number on its own ("63 left") does not say
   whether that is most of the month's allowance or the last of it. */
.dash-meter {
  height: 8px; border-radius: var(--r-pill);
  background: var(--border-strong); overflow: hidden; margin: 12px 0 8px;
}
.dash-meter > span { display: block; height: 100%; background: var(--accent); }
/* Spent everything: the same red the error banner uses, because "0 left"
   and "plenty left" must not be the same colour at a glance. */
.dash-meter.out > span { background: var(--mred); }

.dash-empty { text-align: center; padding: 44px 20px; border: 1px dashed var(--border-strong); border-radius: var(--r-xl); }
.dash-empty h3 { font-size: 15px; font-weight: 700; margin: 0 0 6px; }
.dash-empty p { font-size: 13.5px; color: var(--text-secondary); margin: 0 0 16px; line-height: 1.6; }

/* PADDING: 0 IS LOAD-BEARING. Every panel on this page is a <section>, and
   account.html loads the marketing stylesheet BEFORE this one — where
   `section { padding: 84px 0 }` (styles.css:235) gives the landing pages
   their generous band spacing. That rule matched here too, so every title on
   /account sat 84px lower than intended: a band of dead space under the top
   bar on Overview, Extensions, Templates and every other section, with the
   content pushed toward the middle of the window.

   Measured, not guessed — in Chromium the computed padding-top on
   .dash-section was 84px while this file set none, which is what identified
   the marketing sheet as the source. scripts/test-account-layout.js loads
   the real page in a real browser and fails if any section's heading drifts
   below the top bar again.

   Reset here rather than by narrowing styles.css's selector: that rule is
   right for the twenty-odd marketing pages relying on it, and this file is
   already where the dashboard states its differences from that sheet. */
.dash-section { display: none; padding: 0; }
.dash-section.is-active { display: block; }

/* ── Mobile ── */
.dash-menu-btn { display: none; }
@media (max-width: 900px) {
  .dash-side {
    position: fixed; z-index: 60; left: 0; top: 0;
    transform: translateX(-100%); transition: transform .2s ease;
    background: var(--surface);   /* opaque while it floats over content */
    box-shadow: var(--shadow-xl);
  }
  .dash-side.is-open { transform: translateX(0); }
  /* The menu button no longer takes the auto margin — the title block does,
     or the two fight over it and the title lands hard against the pill. */
  .dash-menu-btn { display: flex; }
  .dash-top { justify-content: flex-start; padding: 10px 16px; }
  /* Below 900px the bar is carrying a hamburger, a title, a status pill and a
     theme button. The description is the one thing there that repeats what
     the section itself makes obvious, so it is what goes. */
  .dash-top-sub { display: none; }
  .dash-top-h1 { font-size: 17px; }
  .dash-scrim { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 55; }
  .dash-scrim.is-open { display: block; }
  .dash-body { padding: 24px 16px 56px; }
  .dash-h1 { font-size: 25px; }
}

/* ══════════ Toolkit plan — Account ▸ Toolkit plan ══════════
   Painted by assets/js/sio-toolkit-plan.js. Uses the page's own tokens
   throughout so it follows the theme like every card beside it — nothing
   here hardcodes a colour that would go wrong in dark mode. */
.tkp-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.tkp-plan { font-size: 20px; font-weight: 800; letter-spacing: -0.01em; }
.tkp-plan-s { font-size: 13px; color: var(--text-secondary); margin-top: 3px; line-height: 1.5; }

.tkp-usage { margin-top: 20px; }
.tkp-usage-n { font-size: 30px; font-weight: 800; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.tkp-usage-n span { font-size: 17px; font-weight: 600; color: var(--text-muted); }
.tkp-usage-l { font-size: 12.5px; color: var(--text-muted); margin-top: 2px; }
/* A bar, because "38 of 50" is a number and a seller wants a glance. */
.tkp-bar { height: 7px; border-radius: var(--r-pill); background: var(--border); margin-top: 11px; overflow: hidden; }
.tkp-bar i { display: block; height: 100%; background: var(--accent); border-radius: var(--r-pill); transition: width .3s; }

.tkp-note { font-size: 12.5px; color: var(--text-muted); line-height: 1.55; margin-top: 12px; }
/* Beside the buy button, not under the card. Razorpay's own summary says
   "until <date>" because an e-mandate must carry an end date; this is the
   line that answers it, and it has to be read BEFORE the popup opens. */
.tkp-anytime { display: block; margin-top: 6px; font-size: 11.5px; color: var(--text-muted); }
.tkp-note a { color: var(--accent); }

.tkp-pick { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--border); }
.tkp-pick-h { font-size: 13px; font-weight: 700; margin-bottom: 10px; }
.tkp-mps { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
.tkp-mp { display: flex; align-items: center; gap: 9px; font-size: 13.5px; padding: 9px 12px;
  border: 1px solid var(--border); border-radius: var(--r-md); cursor: pointer; }
.tkp-mp:hover { border-color: var(--border-strong); }
.tkp-mp input { accent-color: var(--accent); }
.tkp-pick-foot { display: flex; align-items: center; gap: 12px; margin-top: 14px; flex-wrap: wrap; }
.tkp-msg { font-size: 12.5px; color: var(--text-muted); }
.tkp-msg.is-ok { color: var(--mgreen); }
.tkp-msg.is-bad { color: var(--mred); }

.tkp-h { font-size: 15px; font-weight: 700; }
.tkp-head { display: flex; align-items: center; justify-content: space-between; gap: 14px;
  flex-wrap: wrap; margin-bottom: 14px; }

/* Monthly / Yearly. A segmented pair rather than a select, because it is a
   choice of two that repaints every price on the cards below it. */
.tkp-int { display: inline-flex; gap: 3px; padding: 3px; background: var(--border);
  border-radius: var(--r-pill); }
.tkp-int-b { font: inherit; font-size: 12.5px; font-weight: 600; line-height: 1;
  padding: 7px 14px; border: 0; border-radius: var(--r-pill); cursor: pointer;
  background: transparent; color: var(--text-secondary); }
/* The selected half is the card's own colour lifted out of a tinted track.
   The ring is a shadow rather than a border so the two halves stay the same
   size — a 1px border on one of them shifts both. It also carries the whole
   contrast in dark mode, where surface and track sit close together. */
.tkp-int-b.is-on { background: var(--surface); color: var(--text-primary);
  box-shadow: 0 0 0 1px var(--border-strong), var(--shadow-sm); }
.tkp-int-b:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* "2 months free", inside the Yearly half. An accent tint rather than a
   solid fill: the control already carries one emphasis — which half is
   selected — and a second solid colour beside it makes the two compete. */
.tkp-int-tag { margin-left: 6px; font-size: 10px; font-weight: 700; letter-spacing: .02em;
  color: var(--accent); background: var(--accent-soft);
  padding: 2px 6px; border-radius: var(--r-pill); white-space: nowrap; }

.tkp-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px;
  align-items: stretch; }
.tkp-card { border: 1px solid var(--border); border-radius: var(--r-md); padding: 14px;
  display: flex; flex-direction: column; }
/* The button sits on the floor of its card, so four cards with descriptions
   of different lengths still line their buttons up. */
.tkp-card-a { margin-top: auto; padding-top: 12px; }
.tkp-card-a .dash-btn { width: 100%; justify-content: center; }
.tkp-card.is-current { border-color: var(--accent); background: var(--accent-soft); }
.tkp-card-h { font-size: 13px; font-weight: 700; display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.tkp-tag { font-size: 9.5px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: #fff; background: var(--accent); padding: 2px 7px; border-radius: var(--r-pill); }
.tkp-card-p { font-size: 21px; font-weight: 800; margin-top: 6px; letter-spacing: -0.015em; }
.tkp-card-p span { font-size: 12px; font-weight: 600; color: var(--text-muted); }
/* GST ON TOP (28 Sep 2026): "+ GST" beside each price, and the amount
   actually charged under it, while checkout adds GST (sellerio 0ea). */
.tkp-card-p .tkp-card-gst { margin-left: 6px; font-size: 11px; font-weight: 700; letter-spacing: .02em; color: var(--text-muted);
  border: 1px solid var(--border); border-radius: 999px; padding: 1px 7px; vertical-align: 3px; white-space: nowrap; }
.tkp-card-gstl { font-size: 11.5px; color: var(--text-muted); margin-top: 4px; line-height: 1.45; }
.tkp-card-gstl b { color: var(--text); font-weight: 700; font-variant-numeric: tabular-nums; }
.tkp-up-gst { display: block; font-size: 12px; color: var(--text-muted); font-weight: 500; }
/* On the yearly view only: the total for the year, and what it saves.
   Derived from the two prices the API sent, so the line disappears by itself
   if an annual price ever stops being a discount.

   THE SAVING IS GREEN, not the accent. Everything else on this panel that is
   accent-coloured is something to press or the plan you are on; money you
   keep is a different kind of good news and reads faster in the colour the
   rest of the app already uses for it. */
.tkp-card-d { font-size: 11px; color: var(--text-muted); margin-top: 3px; line-height: 1.4; }
.tkp-card-d strong { color: var(--text); font-size: 12px; }
.tkp-card-renew { display: block; margin-top: 2px; }
/* NOT --mgreen (#00c875), which styles.css uses for the same saving on
   /pricing. That green measures about 2.1:1 on white — fine as a fill behind
   white text, which is what .save-badge does with it, and under AA as TEXT at
   any size. Here it IS the text, at 11px, so it is a darker green of the same
   family at ~5.4:1, and the light one the rest of this file already uses in
   dark mode. */
.tkp-card-d strong { color: #0a7a3f; font-weight: 700; }
html[data-theme="dark"] .tkp-card-d strong { color: #4ade9b; }
/* "2 months free", beside the per-month price. Sized and weighted well below
   it: the price is the number being compared, and a badge that competes with
   it turns one clear figure into two. */
/* ON ITS OWN LINE, ALWAYS — not inline beside the price. Inline, it fitted
   next to ₹83 and wrapped next to ₹1,490's wider siblings, so the three paid
   cards disagreed about how tall their price block was and nothing below it
   lined up across the row. A badge that sometimes wraps is a layout that
   depends on the prices. */
.tkp-card-off {
  display: block; width: fit-content; margin-top: 5px;
  font-size: 9.5px; font-weight: 700; letter-spacing: .02em;
  color: #0a7a3f; background: rgba(10,122,63,.10);
  padding: 2px 6px; border-radius: var(--r-pill); white-space: nowrap;
}
html[data-theme="dark"] .tkp-card-off { color: #4ade9b; background: rgba(74,222,155,.12); }
.tkp-card-s { font-size: 11.5px; color: var(--text-muted); margin-top: 5px; line-height: 1.5; }
/* What the plan includes, from assets/js/sio-plan-features.js — the same
   list /pricing shows. A tick per line rather than a bullet, matching the
   pricing page's own vocabulary, and the ticks are decorative so a screen
   reader reads the sentences and not "check, check, check". */
.tkp-card-f { list-style: none; margin: 10px 0 0; padding: 0; display: grid; gap: 6px; }
.tkp-card-f li { position: relative; padding-left: 18px; font-size: 11.5px; line-height: 1.5; color: var(--text); }
.tkp-card-f li::before {
  content: ""; position: absolute; left: 0; top: 5px;
  width: 10px; height: 6px; border-left: 2px solid var(--accent); border-bottom: 2px solid var(--accent);
  transform: rotate(-45deg);
}

/* The note /pricing carries under each list ("Also: … Not in Pro: …"), from
   the same module. Muted and set off by a tint, as on the pricing page, so it
   reads as the small print under the list rather than a second list. */
.tkp-card-n { margin-top: 10px; padding: 8px 10px; border-radius: 8px;
  background: rgba(127,127,127,.08); font-size: 11px; line-height: 1.55;
  color: var(--text-secondary, var(--text-muted)); }
.tkp-card-n strong { color: var(--text); font-weight: 700; }
.tkp-card-n code { font-size: 10.5px; }

/* The checkout line. Empty most of the time, and taking no space when it is
   — a permanent gap under the cards would read as something missing. */
#tkpPayMsg:not(:empty) { display: block; margin-top: 14px; }

/* Cancelling is available, not advertised: a quiet text button rather than
   a second call to action competing with the plans above it. */
.tkp-foot { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--border); }
.tkp-foot .tkp-note { margin-top: 0; }
.tkp-cancel { font: inherit; font-size: 12.5px; font-weight: 600; padding: 0; border: 0;
  background: none; color: var(--text-secondary); text-decoration: underline;
  text-underline-offset: 3px; cursor: pointer; }
.tkp-cancel:hover { color: var(--mred); }
.tkp-cancel[disabled] { opacity: .55; cursor: default; }

/* ══════════ My subscription (24 Sep 2026) ══════════
   The status chip beside the plan name, Cancel / Resume beside the plan,
   the green yearly saving on Monthly (as on /pricing), and the cancel
   dialog. Greens are the darker family .tkp-card-off already measured for
   text on white (~5.4:1); the lighter one in dark mode. */
.tkp-plan { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.tkp-chip { font-size: 10.5px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  padding: 3px 9px; border-radius: var(--r-pill); }
.tkp-chip.is-ok { color: #065f46; background: #d1fae5; }
.tkp-chip.is-trial, .tkp-chip.is-given { color: #1e3a8a; background: #dbeafe; }
.tkp-chip.is-ending { color: #7c2d12; background: #ffedd5; }
.tkp-chip.is-bad { color: #991b1b; background: #fee2e2; }
html[data-theme="dark"] .tkp-chip.is-ok { color: #6ee7b7; background: rgba(16,185,129,.16); }
html[data-theme="dark"] .tkp-chip.is-trial, html[data-theme="dark"] .tkp-chip.is-given { color: #93c5fd; background: rgba(59,130,246,.18); }
html[data-theme="dark"] .tkp-chip.is-ending { color: #fdba74; background: rgba(249,115,22,.16); }
html[data-theme="dark"] .tkp-chip.is-bad { color: #fca5a5; background: rgba(239,68,68,.16); }
.tkp-plan-r { font-size: 13px; font-weight: 600; color: #0a7a3f; margin-top: 4px; }
html[data-theme="dark"] .tkp-plan-r { color: #4ade9b; }
.tkp-acts { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.tkp-kill { font: inherit; font-size: 13.5px; font-weight: 600; min-height: 40px; padding: 8px 16px;
  color: #b91c1c; background: var(--surface); border: 1px solid #fecaca; border-radius: var(--r-md); cursor: pointer; }
.tkp-kill:hover { background: #fef2f2; }
.tkp-kill[disabled] { opacity: .55; cursor: default; }
html[data-theme="dark"] .tkp-kill { color: #fca5a5; border-color: rgba(252,165,165,.4); }
html[data-theme="dark"] .tkp-kill:hover { background: rgba(239,68,68,.12); }

.tkp-save { font: inherit; text-align: left; display: flex; flex-direction: column; gap: 4px;
  margin-top: 10px; padding: 11px 12px; border-radius: var(--r-md); cursor: pointer;
  background: #ecfdf5; border: 2px solid #10b981; color: #065f46; }
.tkp-save:hover { background: #d1fae5; }
.tkp-save:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.tkp-save-h { font-size: 17px; font-weight: 800; }
.tkp-save-b { font-size: 12px; line-height: 1.45; }
.tkp-save-go { align-self: flex-end; font-size: 12px; font-weight: 700; }
html[data-theme="dark"] .tkp-save { background: rgba(16,185,129,.12); border-color: #10b981; color: #6ee7b7; }

.tkp-vh { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.tkp-modal { position: fixed; inset: 0; z-index: 200; display: flex; align-items: center; justify-content: center;
  padding: 16px; background: rgba(15,23,42,.55); }
.tkp-dlg { width: 100%; max-width: 520px; max-height: calc(100vh - 32px); overflow-y: auto; box-sizing: border-box;
  background: var(--surface); color: var(--text-primary); border-radius: 16px; padding: 26px;
  box-shadow: 0 24px 60px rgba(15,23,42,.35); display: flex; flex-direction: column; gap: 14px; }
.tkp-dlg-step { font-size: 12px; font-weight: 600; color: var(--text-muted); }
.tkp-dlg-h { margin: 0; font-size: 21px; font-weight: 800; letter-spacing: -0.01em; }
.tkp-dlg-p { margin: 0; font-size: 13.5px; color: var(--text-secondary); line-height: 1.5; }
.tkp-why { border: 0; margin: 0; padding: 0; display: grid; gap: 8px; }
.tkp-why-o { display: flex; align-items: center; gap: 10px; min-height: 44px; box-sizing: border-box;
  padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--r-md); font-size: 14px; cursor: pointer; }
.tkp-why-o:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); }
.tkp-why-o input { accent-color: var(--accent); width: 17px; height: 17px; }
.tkp-why-t { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; }
.tkp-why-t span { font-weight: 400; color: var(--text-muted); }
.tkp-why-t textarea { font: inherit; font-size: 14px; font-weight: 400; padding: 9px 11px; resize: vertical;
  border: 1px solid var(--border-strong); border-radius: var(--r-md); background: var(--surface); color: var(--text-primary); }
.tkp-dlg-a { display: flex; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.tkp-dlg-a.is-stack { flex-direction: column; }
.tkp-dlg-a.is-stack > * { width: 100%; justify-content: center; }
.tkp-keep { background: #ecfdf5; border: 2px solid #10b981; border-radius: 14px; padding: 18px 20px;
  display: flex; flex-direction: column; gap: 8px; color: #065f46; }
.tkp-keep-tag { align-self: flex-start; font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
  color: #fff; background: #047857; padding: 3px 9px; border-radius: var(--r-pill); }
.tkp-keep-p { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.tkp-keep-p s { font-size: 17px; color: var(--text-muted); }
.tkp-keep-p b { font-size: 32px; font-weight: 800; color: #064e3b; }
.tkp-keep-p span { font-size: 14px; font-weight: 600; }
.tkp-keep-d { font-size: 13.5px; line-height: 1.5; }
.tkp-keep-b { background: #047857; border-color: #047857; color: #fff; }
.tkp-keep-b:hover { background: #065f46; border-color: #065f46; }
html[data-theme="dark"] .tkp-keep { background: rgba(16,185,129,.12); color: #a7f3d0; }
html[data-theme="dark"] .tkp-keep-p b { color: #6ee7b7; }


/* ── THE SIGN-IN CAP'S LIST OF COMPUTERS ────────────────────────────────
   Shown inside the Extensions card's own message, under the refusal it
   belongs to. Each row is one sign-in and one way to end it; nothing here
   is a link, because every one of them acts on the account immediately. */
/* The list sits INSIDE the red refusal banner, so it inherits the error
   colour unless it is told not to — which made every computer name read as
   a fault rather than as a row to act on. Caught by looking at it. */
.dash-sessions { margin-top: 10px; color: var(--text, #15161a); }
.dash-sessions .dash-note { color: var(--text, #15161a); }
.dash-session-list { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 6px; }
.dash-session-list li {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 8px 10px; border: 1px solid var(--line, #e5e7eb); border-radius: 8px;
  background: var(--card, #fff);
}
.dash-session-list small { color: var(--muted, #6b7280); margin-left: 6px; }
.dash-note-err { color: var(--danger, #b91c1c); }

/* ── THE EARLY-BIRD OFFER ON THE ACCOUNT PAGE (24 Sep 2026) ──────────────
   The same banner /pricing carries, painted by sio-toolkit-plan.js on
   /account#plan and Settings ▸ Billing. Solid fills so contrast is measured
   against the real thing; every pair is AA in both themes. */
.tkp-offer { position: relative; margin: 0 0 16px; padding: 16px 18px 14px; border-radius: 14px; text-align: center;
  background: #fff6e5; color: #3d2400; border: 2px solid #f59e0b; box-shadow: 0 10px 28px -20px #f59e0b; }
html[data-theme="dark"] .tkp-offer { background: #2a1d08; color: #fde7c2; }
.tkp-offer-tags { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; }
.tkp-offer-tag { display: inline-block; padding: 7px 18px; border-radius: 999px; font-size: 14px; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase; }
/* ONE offer per visit, the same four as /pricing, each its own solid fill at
   AA in both themes; a breathing glow that stops under reduced motion. */
.tkp-offer-tag[data-offer="limited"]  { background: #b91c1c; color: #ffffff; }
.tkp-offer-tag[data-offer="navratri"] { background: #9d174d; color: #ffffff; }
.tkp-offer-tag[data-offer="diwali"]   { background: #b45309; color: #ffffff; }
.tkp-offer-tag[data-offer="early"]    { background: #9a3412; color: #ffffff; }
html[data-theme="dark"] .tkp-offer-tag[data-offer="limited"]  { background: #f87171; color: #1f0707; }
html[data-theme="dark"] .tkp-offer-tag[data-offer="navratri"] { background: #f472b6; color: #1f0713; }
html[data-theme="dark"] .tkp-offer-tag[data-offer="diwali"]   { background: #f59e0b; color: #1f1300; }
html[data-theme="dark"] .tkp-offer-tag[data-offer="early"]    { background: #fdba74; color: #1f1300; }
@keyframes tkp-breathe {
  0%, 100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(245, 158, 11, 0); }
  50%      { transform: scale(1.06); box-shadow: 0 0 0 7px rgba(245, 158, 11, .35); }
}
.tkp-offer-tag[data-offer] { animation: tkp-breathe 2.2s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) { .tkp-offer-tag[data-offer] { animation: none; } }
.tkp-offer-h { margin: 10px 0 6px; font-size: 19px; line-height: 1.3; font-weight: 800; }
.tkp-offer-rows { list-style: none; margin: 8px 0 6px; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 24px; }
.tkp-offer-rows li { font-size: 15px; font-weight: 600; }
.tkp-offer-rows s { margin: 0 5px; text-decoration-thickness: 2px; }
.tkp-offer-rows b { font-size: 18px; font-weight: 800; color: #9a3412; }
html[data-theme="dark"] .tkp-offer-rows b { color: #fdba74; }
.tkp-offer-f { font-size: 13px; line-height: 1.5; }
.tkp-vh { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.tkp-card-was { margin-left: 8px; font-size: 15px; font-weight: 600; color: var(--text-muted); text-decoration-thickness: 2px; }

/* ── Upgrading while paying: the credit, before Checkout (24 Sep 2026) ── */
.tkp-up { border: 1px solid var(--border, #e5e7eb); border-radius: 12px; padding: 6px 16px; margin: 4px 0 14px; }
.tkp-up-r { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; font-size: 14px; }
.tkp-up-r + .tkp-up-r { border-top: 1px solid var(--border, #e5e7eb); }
.tkp-up-r b { font-variant-numeric: tabular-nums; white-space: nowrap; }
.tkp-up-r.is-credit b { color: #047857; }
.tkp-up-r.is-due { font-size: 16px; }
.tkp-up-r.is-due b { font-weight: 800; }
html[data-theme="dark"] .tkp-up-r.is-credit b { color: #6ee7b7; }
/* ── SHARE & EARN (assets/js/sio-referral.js) ─────────────────────────────
   Redesigned 24 Sep 2026: "more user friendly and easy to understand ...
   professional UI and UX". The reasoning is in that file's header; what
   matters here is the colour, and it has one rule that was already paid
   for once at the top of assets/styles.css:

     --mgreen is a FILL (#00c875, carrying near-black --mgreen-on at
     6.74:1) and --mgreen-ink is INK (#00804b on white). Fill for blocks,
     ink for text, and NEVER the fill for text.

   The WhatsApp button is the fill with --mgreen-on over it; the "30 days"
   in the headline and the top rung's figure are the ink. Swapping them is
   the exact mistake that rule exists to stop. */
.ref-hero { display: flex; flex-direction: column; gap: 18px; }
.ref-head { font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 26px;
  font-weight: 700; letter-spacing: -0.02em; line-height: 1.24; margin: 0; max-width: 24ch; }
.ref-head b { font-weight: 700; color: var(--mgreen-ink); }
/* THE MULTIPLIER, AND IT IS NOT A CAPTION. It was `.dash-note` — muted,
   small, indistinguishable from the fine print under it — and it carries
   the whole reason to invite a second seller. Full ink, one step up in
   size, with "No limit." in the headline's own green so the eye lands on
   the two words that matter. INK, never the fill: that is the rule at the
   top of this block, and this is exactly the text the rule is about.
   The invitee's own trial keeps the muted treatment, because it is the one
   clause here that is not about the reader's own reward. */
.ref-sub { margin: -12px 0 0; font-size: 14px; line-height: 1.5;
  color: var(--text-primary); max-width: 46ch; }
.ref-sub b { font-weight: 700; color: var(--mgreen-ink); }
.ref-sub-q { color: var(--text-secondary); }

.ref-acts { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
/* The one action this page exists for. */
.ref-wa { display: inline-flex; align-items: center; gap: 9px; text-decoration: none;
  font-size: 14.5px; font-weight: 700; height: 48px; padding: 0 24px;
  border-radius: var(--r-pill); background: var(--mgreen); color: var(--mgreen-on);
  transition: transform .12s, box-shadow .12s; }
.ref-wa:hover { color: var(--mgreen-on); transform: translateY(-1px); box-shadow: var(--shadow-md); }
.ref-wa:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(0,200,117,.45); }
.ref-acts .dash-btn.ghost { height: 48px; padding: 0 22px; }
.ref-said { font-size: 12.5px; color: var(--text-secondary); }

.ref-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.ref-col { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.ref-cap { font-size: 11px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-muted); }
.ref-caprow { gap: 9px; }
.ref-inline { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.ref-inline .dash-input { flex: 1 1 160px; min-width: 0; }
.ref-link { font: inherit; font-size: 12px; font-weight: 600; padding: 0; border: none;
  background: none; color: var(--accent-ink); cursor: pointer; }
.ref-link:hover { text-decoration: underline; }
.ref-msg { margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--text-primary);
  background: var(--body-bg); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 10px 12px; }
.ref-msgbox { width: 100%; box-sizing: border-box; height: auto; line-height: 1.55;
  padding: 10px 12px; resize: vertical; font-size: 12.5px; }
.ref-slug { display: flex; flex-direction: column; gap: 7px; margin-top: 3px; }
.ref-base { font-size: 12.5px; color: var(--text-secondary); }
.ref-hint { font-size: 11.5px; color: var(--text-muted); line-height: 1.55; margin: 0; }

.ref-head2 { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.ref-head2 .dash-card-title { margin: 0; }
.ref-sub2 { font-size: 12.5px; color: var(--text-secondary); }

/* ── THE SHAPE IS THE EXPLANATION ─────────────────────────────────────
   Three bars that GROW to a full one say "this rises to a maximum"
   before a word is read. The widths are each milestone over the largest
   (barPct in sio-referral.js), so a bar can never disagree with the
   figure beside it. */
.ref-steps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px; }
.ref-step { display: flex; flex-direction: column; gap: 9px; min-width: 0; }
.ref-step-h { display: flex; align-items: center; gap: 8px; }
.ref-step-n { width: 21px; height: 21px; border-radius: 50%; background: var(--body-bg);
  border: 1px solid var(--border-strong); color: var(--text-secondary); font-size: 11.5px;
  font-weight: 700; display: inline-flex; align-items: center; justify-content: center;
  flex: none; font-variant-numeric: tabular-nums; }
.ref-step.is-best .ref-step-n { background: var(--mgreen); border-color: var(--mgreen);
  color: var(--mgreen-on); }
.ref-step-w { font-size: 13.5px; font-weight: 600; }
.ref-bar { height: 8px; border-radius: var(--r-pill); background: var(--border);
  overflow: hidden; }
.ref-bar > i { display: block; height: 100%; border-radius: var(--r-pill);
  background: var(--mgreen); opacity: .45; }
.ref-step.is-best .ref-bar > i { opacity: 1; }
.ref-step-d { font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 21px;
  font-weight: 700; letter-spacing: -0.02em; line-height: 1.1;
  font-variant-numeric: tabular-nums; }
.ref-step.is-best .ref-step-d { color: var(--mgreen-ink); }
.ref-step-t { font-family: 'Inter', sans-serif; font-size: 12.5px; font-weight: 600;
  letter-spacing: 0; color: var(--text-muted); }
.ref-step.is-best .ref-step-t { color: var(--mgreen-ink); }
.ref-foot { margin: 16px 0 0; }

/* ── THE COUNTS, IN THE ORDER THEY HAPPEN ─────────────────────────────
   Link opens first: it is the number that MOVES first, and it used to be
   a sub-line under Joined. A zero recedes to --text-muted — still data,
   still honest, no longer the loudest thing on a page every seller opens
   on the day they have nothing. */
/* No flex-wrap: measured with it removed at 860, 780, 700, 620 and 580px
   and nothing overflows at any of them — the cells shrink and their labels
   wrap, and below 560 this becomes a grid anyway. It was there as a
   precaution and did nothing, which is the worse kind of dead rule: it
   reads as protection. */
.ref-funnel { display: flex; align-items: center; gap: 0; }
.ref-cell { padding: 0 20px; border-left: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 2px; }
.ref-cell:first-child { padding-left: 0; border-left: none; }
.ref-n { font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 28px; font-weight: 700;
  letter-spacing: -0.02em; line-height: 1.1; font-variant-numeric: tabular-nums;
  color: var(--text-primary); }
.ref-n.is-zero { color: var(--text-muted); }
.ref-n.is-won { color: var(--accent); }
.ref-earned { margin-left: auto; border: 1px solid rgba(26,111,255,.30);
  background: var(--accent-soft); border-radius: var(--r-lg); padding: 12px 20px;
  display: flex; flex-direction: column; gap: 2px; min-width: 190px; }
.ref-earned .ref-cap { color: var(--accent-ink); }
.ref-people { margin-top: 18px; border-top: 1px solid var(--border); padding-top: 4px; }

@media (max-width: 860px) {
  .ref-two, .ref-steps { grid-template-columns: 1fr; }
  .ref-head { font-size: 22px; max-width: none; }
}
/* A phone: this is the page you open IN ORDER TO share on WhatsApp, so the
   button is full width and a thumb tall, and five counts across a row
   become 2x2 under the outcome they add up to. */
@media (max-width: 560px) {
  .ref-acts { flex-direction: column; align-items: stretch; }
  .ref-wa { justify-content: center; height: 50px; }
  .ref-acts .dash-btn.ghost { width: 100%; height: 46px; }
  .ref-funnel { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1px;
    background: var(--border); border: 1px solid var(--border);
    border-radius: var(--r-lg); overflow: hidden; }
  .ref-cell { background: var(--surface); padding: 11px 13px; border-left: none; }
  .ref-cell:first-child { padding: 11px 13px; }
  .ref-n { font-size: 22px; }
  .ref-earned { grid-column: 1 / -1; order: -1; margin-left: 0; border-radius: 0;
    border: none; border-bottom: 1px solid var(--border); }
}

/* ══════════ Extensions and Settings — redesigned 24 Sep 2026 ══════════
   Asked for as "more user friendly, professional and empathetic, nice and
   clean ... premium feel", on the design canvas "Account — Extensions &
   Settings". Every colour here is a site token or one of the status colours
   this file already uses (the verified green, and an amber for "waiting"
   whose dark-theme ink is restated below), so both themes follow the toggle.
   Every radius is a --r-* step; circles are 50%. */

/* ── Extensions: the status card ── */
.ext-hero { padding: 26px 28px; margin-bottom: 30px; box-shadow: var(--shadow-md); }
.ext-hero-top { display: flex; align-items: flex-start; gap: 18px; }
.ext-hero-icon {
  width: 52px; height: 52px; flex: 0 0 52px; border-radius: var(--r-lg);
  display: flex; align-items: center; justify-content: center;
  background: var(--accent-soft); color: var(--accent-ink);
}
.ext-hero-icon svg { width: 26px; height: 26px; }
.ext-hero[data-state="ok"] .ext-hero-icon { background: rgba(0,200,117,.13); color: #05794b; }
.ext-hero[data-state="wait"] .ext-hero-icon { background: rgba(253,171,61,.18); color: #9a5200; }
html[data-theme="dark"] .ext-hero[data-state="ok"] .ext-hero-icon { color: #4ade9b; }
html[data-theme="dark"] .ext-hero[data-state="wait"] .ext-hero-icon { color: #fbbf24; }
.ext-hero-copy { flex: 1; min-width: 0; }
.ext-hero-title {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 21px; font-weight: 600; letter-spacing: -0.02em; line-height: 1.25; margin: 2px 0 6px;
}
.ext-hero-text { font-size: 14.5px; line-height: 1.6; color: var(--text-secondary); margin: 0; }
.ext-hero .dash-msg { margin: 14px 0 0; }
.ext-hero-top > .dash-btn { flex: 0 0 auto; min-height: 46px; }
.ext-hero-foot {
  margin: 20px 0 0; padding-top: 16px; border-top: 1px solid var(--border);
  font-size: 13px; line-height: 1.6; color: var(--text-secondary);
}
.ext-hero-foot strong { color: var(--text-primary); font-weight: 600; }

/* ── Extensions: the cards ── */
.ext-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 0 0 14px; }
.ext-list-title {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 18px; font-weight: 600; letter-spacing: -0.01em; margin: 0;
}
.ext-list-count { font-size: 13px; color: var(--text-muted); white-space: nowrap; }
.ext-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 18px; margin-bottom: 32px; }
.ext-card { margin: 0; padding: 24px; display: flex; flex-direction: column; gap: 14px; }
.ext-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.ext-tile {
  width: 52px; height: 52px; flex: 0 0 52px; border-radius: var(--r-lg);
  display: flex; align-items: center; justify-content: center;
}
.ext-tile svg { width: 26px; height: 26px; }
.ext-tile.toolkit { background: var(--teal-soft); color: var(--teal); }
.ext-tile.insights { background: var(--accent-soft); color: var(--accent); }
.ext-tile.autofill { background: rgba(162,93,220,.12); color: var(--mpurple); }
.ext-chip {
  display: inline-flex; align-items: center; gap: 7px; min-height: 28px; padding: 0 11px;
  border-radius: var(--r-pill); font-size: 12.5px; font-weight: 700; white-space: nowrap;
}
.ext-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.ext-chip.on { background: rgba(0,200,117,.13); color: #05794b; }
.ext-chip.wait { background: rgba(253,171,61,.18); color: #8a4b00; }
.ext-chip.off { background: rgba(140,141,151,.15); color: var(--text-secondary); }
html[data-theme="dark"] .ext-chip.on { color: #4ade9b; }
html[data-theme="dark"] .ext-chip.wait { color: #fbbf24; }
.ext-card-name {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 18.5px; font-weight: 600; letter-spacing: -0.01em; margin: 0 0 5px;
}
.ext-card-desc { font-size: 14px; line-height: 1.55; color: var(--text-secondary); margin: 0; }
.ext-works { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ext-works-k { font-size: 12px; font-weight: 600; color: var(--text-muted); }
.ext-tags { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.ext-tags li {
  display: inline-flex; align-items: center; min-height: 26px; padding: 0 10px;
  border-radius: var(--r-sm); background: var(--body-bg); border: 1px solid var(--border);
  color: var(--text-secondary); font-size: 12px; font-weight: 600;
}
.ext-card-foot {
  margin-top: auto; padding-top: 14px; border-top: 1px solid var(--border);
  display: flex; align-items: center; gap: 10px 20px; flex-wrap: wrap;
}
.ext-link {
  display: inline-flex; align-items: center; gap: 7px; min-height: 32px;
  font-size: 13.5px; font-weight: 600; color: var(--accent-ink); text-decoration: none;
}
.ext-link:hover { text-decoration: underline; color: var(--accent-ink); }
.ext-link svg { width: 15px; height: 15px; flex: 0 0 15px; }
.ext-note {
  flex-basis: 100%; display: flex; align-items: flex-start; gap: 8px; margin: 0;
  font-size: 13px; line-height: 1.55; color: var(--text-secondary);
}
.ext-note svg { width: 15px; height: 15px; flex: 0 0 15px; margin-top: 2px; color: #9a5200; }
html[data-theme="dark"] .ext-note svg { color: #fbbf24; }
.ext-note strong { color: var(--text-primary); font-weight: 600; }
.ext-add {
  display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 20px;
  border-radius: var(--r-pill); background: var(--accent-soft); border: 1px solid rgba(26,111,255,.25);
  color: var(--accent-ink); font-size: 14px; font-weight: 600; text-decoration: none; white-space: nowrap;
}
.ext-add:hover { background: rgba(26,111,255,.14); color: var(--accent-ink); }
.ext-add svg { width: 15px; height: 15px; }

/* ── Extensions: good to know ── */
.ext-tips-title { margin: 0 0 14px; }
.ext-tips { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }
.ext-tip {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 20px; display: flex; flex-direction: column; align-items: flex-start; gap: 9px;
}
.ext-tip-icon {
  width: 36px; height: 36px; border-radius: var(--r-md);
  background: var(--accent-soft); color: var(--accent-ink);
  display: flex; align-items: center; justify-content: center;
}
.ext-tip-icon svg { width: 18px; height: 18px; }
.ext-tip h3 { font-size: 14.5px; font-weight: 700; margin: 0; }
.ext-tip p { font-size: 13px; line-height: 1.6; color: var(--text-secondary); margin: 0; }

/* ══════════ Settings — compact, 29 Sep 2026 (backlog 0fa) ══════════
   Built from the approved canvas "Account Settings Redesign" ("Approved
   design... just go for it"), asked as: "It has too much padding
   everywhere, and also too many small helper text". One card per tab; its
   head is the identity strip on Profile; each section is a 200px title
   column beside a two-column grid of fields with their labels above them;
   20px 24px inside every section where it was 22px 28px on every row, and
   40px fields where they were 46px. The rows of a label column with a line
   of help under nearly every name, the grey bands and the separate verify
   card are gone. Every colour is a site token or one of the status colours
   this file already uses, restated for the dark theme where the ink changes. */

/* ── The identity strip: the Profile card's head ── */
.set-id { display: flex; align-items: center; gap: 14px; padding: 18px 24px; border-bottom: 1px solid var(--border); }
.set-id-avatar {
  width: 44px; height: 44px; flex: 0 0 44px; border-radius: 50%;
  background: var(--accent); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 18px; font-weight: 700;
}
.set-id-main { flex: 1; min-width: 0; }
.set-id-name { font-size: 15.5px; font-weight: 600; line-height: 1.3; color: var(--text-primary); overflow-wrap: anywhere; }
.set-id-sub { font-size: 13px; line-height: 1.4; color: var(--text-muted); margin-top: 2px; overflow-wrap: anywhere; }
.set-id-chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
.set-chip {
  display: inline-flex; align-items: center; gap: 6px; min-height: 26px; padding: 0 10px;
  font-size: 12px; font-weight: 600; white-space: nowrap;
}
.set-chip svg { width: 12px; height: 12px; flex: 0 0 12px; }
.set-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.dash-badge.warn { background: rgba(253,171,61,.18); color: #8a4b00; }
html[data-theme="dark"] .dash-badge.warn { color: #fbbf24; }

/* ── A card, its head and its foot ── */
.set-card { padding: 0; overflow: hidden; }
.set-card-head { padding: 18px 24px; border-bottom: 1px solid var(--border); }
.set-card-title {
  font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 18px; font-weight: 600; letter-spacing: -0.01em; margin: 0;
}
.set-card-sub { font-size: 13.5px; line-height: 1.5; color: var(--text-secondary); margin: 4px 0 0; }
.set-card-foot { display: flex; align-items: center; gap: 10px; padding: 12px 24px; background: var(--body-bg); }
.set-card-foot .dash-btn { padding: 9px 18px; font-size: 13.5px; }
.set-card-foot-note {
  flex: 1; min-width: 0; margin: 0; display: flex; align-items: center; gap: 8px;
  font-size: 13px; line-height: 1.45; color: var(--text-muted);
}
.set-card-foot-note svg { width: 16px; height: 16px; flex: 0 0 16px; }
.set-card-foot-note a { color: var(--accent-ink); font-weight: 600; }

/* ── A section: a title column beside a grid of fields ── */
.set-sec {
  display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: 24px;
  padding: 20px 24px; border-bottom: 1px solid var(--border);
}
/* styles.css gives every h2 the marketing pages' 30px; these are section names. */
.set-sec-title {
  margin: 0; font-family: inherit; font-size: 14px; font-weight: 600; line-height: 20px;
  letter-spacing: 0; color: var(--text-primary);
}
.set-sec-sub { margin: 4px 0 0; font-size: 13px; line-height: 1.45; color: var(--text-muted); }
.set-sec-body { min-width: 0; }
.set-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 20px; align-items: start; }
.set-f.dash-field { margin: 0; min-width: 0; }
.set-f-wide { grid-column: 1 / -1; }
.set-f .dash-label { margin: 0 0 6px; font-size: 12.5px; font-weight: 600; line-height: 18px; letter-spacing: 0; color: var(--text-secondary); }
.set-grid .dash-input, .set-flow .dash-input { height: 40px; padding-top: 0; padding-bottom: 0; font-size: 14px; }
.set-hint { margin-top: 6px; font-size: 12.5px; line-height: 1.45; color: var(--text-muted); }
.set-f-top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 0 0 6px; }
.set-f-top .dash-label { margin: 0; }
.set-f-link { font-size: 12.5px; font-weight: 600; line-height: 18px; color: var(--accent-ink); text-decoration: none; }
.set-f-link:hover { text-decoration: underline; }

/* ── Save changes: greyed out until something changes ── */
.set-save { justify-content: flex-end; }
.set-dirty {
  display: inline-flex; align-items: center; gap: 8px; margin-right: auto;
  font-size: 13px; font-weight: 500; color: var(--text-secondary);
}
.set-dirty .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--morange); }
.set-save .dash-btn[disabled] { opacity: .45; }

/* ── The sign-in email: shown, with Change inside the field ── */
.set-email-ro {
  box-sizing: border-box; display: flex; align-items: center; gap: 10px; height: 40px; padding: 0 5px 0 12px;
  border: 1px solid var(--border-strong); border-radius: var(--r-md); background: var(--body-bg); color: var(--text-primary);
}
.set-email-ro svg { width: 15px; height: 15px; flex: 0 0 15px; color: var(--text-muted); }
.set-email-addr { flex: 1; min-width: 0; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.set-email-change {
  height: 30px; padding: 0 12px; border: 0; border-radius: var(--r-sm); background: transparent;
  font: inherit; font-size: 13px; font-weight: 600; color: var(--accent-ink); cursor: pointer;
}
.set-email-change:hover { background: var(--accent-soft); }
.set-email-change:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.set-email-row .dash-msg { margin: 10px 0 0; }
/* The WhatsApp number (1 Oct 2026): the email's look, a green tick once
   verified and an orange dot until then, with one short line and Verify
   under it; "Same as your mobile number" in grey while it is empty, and
   Remove as a link beside the label. */
.set-wa-now.is-empty { color: var(--text-muted); }
.set-wa-ok { display: inline-flex; align-items: center; flex: 0 0 auto; color: #05794b; }
html[data-theme="dark"] .set-wa-ok { color: #4ade9b; }
.set-email-ro .set-wa-ok svg { width: 15px; height: 15px; flex: 0 0 15px; color: inherit; }
.set-wa-dot { width: 8px; height: 8px; flex: 0 0 8px; border-radius: 50%; background: var(--morange); }
.set-wa-wait { display: flex; align-items: baseline; gap: 8px; margin: 6px 0 0; font-size: 12.5px; line-height: 1.45; color: var(--text-muted); }
.set-wa-wait span { flex: 1; min-width: 0; }
.set-wa-wait .set-otp-link { flex: 0 0 auto; padding: 2px 4px; font-size: 12.5px; }
button.set-f-link { padding: 0; border: 0; background: none; font-family: inherit; cursor: pointer; }
.set-flow-note .set-otp-link { padding: 2px 4px; font-size: 12.5px; }
.set-flow { margin-top: 10px; padding: 14px; border: 1px solid var(--border); border-radius: 12px; background: var(--body-bg); }
/* As many columns as fit: the email's new address takes its half of the row
   whole until a password is asked for (1 Oct 2026, when the email and the
   WhatsApp number came to share a row). */
.set-flow-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px 16px; }
.set-flow-foot { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.set-flow-note { flex: 1 1 220px; margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-muted); }
.set-flow-foot .dash-btn { padding: 8px 16px; font-size: 13px; }
.set-code { letter-spacing: .12em; }

/* ── A channel's code strip, under its own field ── */
.set-otp { grid-column: 1 / -1; }
.set-otp-bar {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; padding: 8px 8px 8px 12px;
  border: 1px solid rgba(253,171,61,.32); border-radius: 12px; background: rgba(253,171,61,.08);
}
.set-otp-ic { width: 18px; height: 18px; flex: 0 0 18px; color: #9a5200; }
html[data-theme="dark"] .set-otp-ic { color: #fbbf24; }
.set-otp-t { flex: 1 1 220px; min-width: 0; margin: 0; font-size: 13px; line-height: 1.4; color: var(--text-primary); overflow-wrap: anywhere; }
.set-otp-to { font-weight: 600; }
.set-otp-act, .set-otp-miss { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.set-otp-miss { flex: 1 1 auto; }
.set-otp .dash-btn { padding: 7px 14px; font-size: 13px; }
.set-otp .set-otp-code { width: 132px; height: 34px; padding: 0 10px; font-size: 14px; letter-spacing: .12em; text-align: center; }
.set-otp-link {
  padding: 7px 8px; border: 0; border-radius: var(--r-sm); background: transparent;
  font: inherit; font-size: 13px; font-weight: 600; color: var(--accent-ink); cursor: pointer;
}
.set-otp-link:hover { background: var(--accent-soft); }
.set-otp-note { flex-basis: 100%; margin: 0; font-size: 12.5px; color: var(--text-muted); }
.set-otp-done { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: #05794b; }
html[data-theme="dark"] .set-otp-done { color: #4ade9b; }
.set-otp-done svg { width: 16px; height: 16px; flex: 0 0 16px; }
.set-otp.is-done .set-otp-bar { border-color: rgba(0,200,117,.30); background: rgba(0,200,117,.07); }
.set-otp.is-done .set-otp-ic, .set-otp.is-done > .set-otp-bar > .set-otp-t,
.set-otp.is-missing > .set-otp-bar > .set-otp-t { display: none; }
.set-otp .dash-msg { margin: 8px 0 0; }

/* ── The Overview's verify card (shares the look of the old Settings one) ── */
.set-verify { padding: 22px 28px 26px; }
.set-verify-head { display: flex; align-items: flex-start; gap: 14px; margin-bottom: 18px; }
.set-verify-icon {
  width: 40px; height: 40px; flex: 0 0 40px; border-radius: var(--r-md);
  background: rgba(253,171,61,.18); color: #9a5200;
  display: flex; align-items: center; justify-content: center;
}
html[data-theme="dark"] .set-verify-icon { color: #fbbf24; }
.set-verify-icon svg { width: 20px; height: 20px; }
.set-verify .dash-otp { background: var(--surface); }

/* ── Passwords: the eye, and the one rule ── */
.set-pw {
  display: flex; align-items: center; border: 1px solid var(--border-strong); border-radius: var(--r-md);
  background: var(--surface); transition: border-color .15s, box-shadow .15s;
}
.set-pw:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
.set-pw .dash-input { flex: 1; min-width: 0; height: 38px; border: none; background: transparent; }
.set-pw .dash-input:focus { box-shadow: none; }
.set-pw-eye {
  width: 36px; height: 36px; flex: 0 0 36px; margin-right: 2px; border: none; background: none;
  color: var(--text-muted); border-radius: var(--r-sm); cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.set-pw-eye:hover { color: var(--text-primary); }
.set-pw-eye:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
.set-pw-eye svg { width: 17px; height: 17px; }
.set-rule { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 12.5px; font-weight: 500; line-height: 18px; color: var(--text-muted); }
.set-rule-dot {
  width: 14px; height: 14px; flex: 0 0 14px; box-sizing: border-box; border-radius: 50%; border: 1.5px solid var(--border-strong);
  display: inline-flex; align-items: center; justify-content: center;
}
.set-rule-dot svg { width: 9px; height: 9px; opacity: 0; }
.set-rule.is-met { color: #05794b; }
.set-rule.is-met .set-rule-dot { background: #00804b; border-color: transparent; color: #fff; }
.set-rule.is-met .set-rule-dot svg { opacity: 1; }
html[data-theme="dark"] .set-rule.is-met { color: #4ade9b; }
html[data-theme="dark"] .set-rule.is-met .set-rule-dot { background: #00c875; color: #052e1b; }
.set-pwset-send { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 16px; }
.set-pwset-t { flex: 1 1 260px; margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-secondary); }
.set-pwset-t strong { color: var(--text-primary); font-weight: 600; }
.set-pwset-send .dash-btn { padding: 9px 18px; font-size: 13.5px; }
#pwSetStep2 { margin-top: 16px; }
#pwSetStep2[hidden] { display: none; }

/* ── Both, on a narrow window ── */
@media (max-width: 760px) {
  .ext-hero { padding: 22px 20px; }
  .ext-hero-top { flex-wrap: wrap; }
  .ext-hero-top > .dash-btn { width: 100%; }
  .set-id { flex-wrap: wrap; padding: 16px; }
  .set-id-chips { justify-content: flex-start; width: 100%; }
  .set-card-head { padding-left: 16px; padding-right: 16px; }
  .set-verify { padding-left: 20px; padding-right: 20px; }
  .set-sec { grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 16px; }
  .set-grid, .set-flow-row { grid-template-columns: minmax(0, 1fr); gap: 14px; }
  /* 44px to press, and 16px so a phone does not zoom the page on focus. */
  .set-grid .dash-input, .set-flow .dash-input { height: 44px; font-size: 16px; }
  .set-pw .dash-input { height: 42px; }
  .set-email-ro { height: 44px; }
  .set-email-addr { font-size: 16px; }
  .set-email-change, .set-otp-link { min-height: 36px; }
  .set-card-foot { flex-wrap: wrap; padding: 12px 16px; }
  .set-card-foot-note { flex-basis: 100%; }
  .set-card-foot .dash-btn { flex: 1 1 0; min-height: 44px; }
  .set-save .set-dirty { flex-basis: 100%; }
}

/* ══════════ Overview — redesigned 24 Sep 2026 ══════════
   Built from the design canvas "Account Overview Redesign" ("push to main").
   Same rules as the Extensions and Settings block above: every colour is a
   site token or one of the status colours this file already uses (the
   verified green, the waiting amber), restated for the dark theme where the
   ink changes, and every radius is a --r-* step; circles are 50%. */

/* styles.css gives every <section> 84px of top and bottom padding for the
   marketing pages; the Overview's three are landmarks, not page bands. */
.ov-hero, .ov-grid, .ov-shortcuts { padding: 0; }

/* ── The card at the top: setup, things that need you, or all set ── */
.ov-hero { padding: 26px 28px 20px; margin-bottom: 24px; box-shadow: var(--shadow-md); }
.ov-hero[data-state="attention"] { border-color: rgba(253,171,61,.45); }
.ov-hero[data-state="setup"] { border-color: rgba(26,111,255,.25); }
.ov-hero-top { display: flex; align-items: center; gap: 20px; }
.ov-hero-icon {
  width: 56px; height: 56px; flex: 0 0 56px; border-radius: var(--r-lg);
  display: flex; align-items: center; justify-content: center;
  background: var(--accent-soft); color: var(--accent-ink);
}
.ov-hero-icon:empty { display: none; }
.ov-hero-icon svg { width: 28px; height: 28px; }
.ov-hero[data-state="ok"] .ov-hero-icon { background: rgba(0,200,117,.13); color: #05794b; }
.ov-hero[data-state="attention"] .ov-hero-icon { background: rgba(253,171,61,.18); color: #9a5200; }
html[data-theme="dark"] .ov-hero[data-state="ok"] .ov-hero-icon { color: #4ade9b; }
html[data-theme="dark"] .ov-hero[data-state="attention"] .ov-hero-icon { color: #fbbf24; }
.ov-hero-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.ov-eyebrow {
  margin: 0; font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--text-muted);
}
.ov-hero-title {
  margin: 0; font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 26px; font-weight: 600; letter-spacing: -0.02em; line-height: 1.2; color: var(--text-primary);
}
.ov-hero-text { margin: 2px 0 0; font-size: 15px; line-height: 1.55; color: var(--text-secondary); }
.ov-count { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.ov-count-n {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 26px; font-weight: 600; line-height: 1.1;
  color: var(--text-primary); font-variant-numeric: tabular-nums;
}
.ov-count-l { font-size: 12.5px; color: var(--text-muted); white-space: nowrap; }
.ov-hero-bar { margin-top: 18px; }
.ov-hero .dash-msg { margin: 16px 0 0; }
.ov-hero-foot:empty { display: none; }
.ov-hero-foot { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.ov-who {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: 13px; line-height: 1.5; color: var(--text-muted);
}
.ov-who strong { color: var(--text-primary); font-weight: 600; overflow-wrap: anywhere; }
.ov-setup-foot { display: flex; align-items: center; gap: 12px 16px; flex-wrap: wrap; }
.ov-setup-note { flex: 1; min-width: 200px; font-size: 13px; line-height: 1.5; color: var(--text-muted); }

/* ── The list inside it: steps, or things to do ── */
.ov-list {
  list-style: none; margin: 20px 0 0; padding: 0; display: flex; flex-direction: column;
  border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden;
}
.ov-row { position: relative; display: flex; align-items: center; gap: 16px; padding: 16px 18px; background: var(--surface); }
.ov-row + .ov-row { border-top: 1px solid var(--border); }
.ov-row.is-done { background: var(--body-bg); }
.ov-row-icon {
  width: 40px; height: 40px; flex: 0 0 40px; border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center;
  background: rgba(253,171,61,.18); color: #9a5200;
}
html[data-theme="dark"] .ov-row-icon { color: #fbbf24; }
.ov-row-icon svg { width: 20px; height: 20px; }
.ov-row-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.ov-row-title { font-size: 14.5px; line-height: 1.4; font-weight: 700; color: var(--text-primary); }
.ov-row-text { font-size: 13px; line-height: 1.55; color: var(--text-secondary); overflow-wrap: anywhere; }
.ov-row.is-done .ov-row-title { color: var(--text-secondary); }
.ov-row.is-done .ov-row-text { color: var(--text-muted); }
.ov-step {
  width: 32px; height: 32px; flex: 0 0 32px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; font-weight: 700; color: var(--text-secondary);
  border: 1.5px solid var(--border-strong);
}
.ov-step.is-next { border: 2px solid var(--accent); color: var(--accent-ink); }
.ov-step.is-done { border: none; background: #05794b; color: #fff; }
.ov-step svg { width: 15px; height: 15px; }
.ov-after { flex: 0 0 auto; font-size: 13px; font-weight: 600; color: var(--text-muted); white-space: nowrap; }
/* Read to a screen reader beside a done step, never shown. */
.ov-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ── Buttons: the primary is .dash-btn; the soft one is a second action ── */
.ov-btn {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; padding: 0 18px;
}
.ov-btn svg { width: 14px; height: 14px; flex: 0 0 14px; }
.dash-btn.ov-soft { background: var(--accent-soft); color: var(--accent-ink); box-shadow: none; }
.dash-btn.ov-soft:hover { background: rgba(26,111,255,.16); color: var(--accent-ink); }
.ov-link {
  display: inline-flex; align-items: center; gap: 6px; min-height: 44px;
  font-size: 13.5px; font-weight: 600; color: var(--accent-ink); text-decoration: none;
}
.ov-link:hover { text-decoration: underline; color: var(--accent-ink); }
.ov-link svg { width: 15px; height: 15px; flex: 0 0 15px; }

/* ── Chips and meters ── */
.ov-chip {
  display: inline-flex; align-items: center; gap: 5px; min-height: 26px; padding: 0 10px;
  border-radius: var(--r-pill); font-size: 12px; font-weight: 700; white-space: nowrap;
  background: var(--accent-soft); color: var(--accent-ink);
}
.ov-chip svg { width: 13px; height: 13px; flex: 0 0 13px; }
.ov-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.ov-chip.ok { background: rgba(0,200,117,.13); color: #05794b; }
.ov-chip.warn { background: rgba(253,171,61,.18); color: #8a4b00; }
.ov-chip.bad { background: rgba(226,68,92,.10); color: #b3243a; }
.ov-chip.off { background: rgba(140,141,151,.15); color: var(--text-secondary); }
html[data-theme="dark"] .ov-chip.ok { color: #4ade9b; }
html[data-theme="dark"] .ov-chip.warn { color: #fbbf24; }
html[data-theme="dark"] .ov-chip.bad { color: #ff8098; }
.ov-bar { height: 6px; border-radius: var(--r-pill); background: var(--border-strong); overflow: hidden; }
.ov-bar i { display: block; height: 100%; border-radius: var(--r-pill); background: var(--accent); }
.ov-bar.is-warn i { background: #e8850c; }
.ov-meter { display: flex; flex-direction: column; gap: 8px; }
.ov-meter-l { margin: 0; font-size: 12.5px; line-height: 1.4; color: var(--text-muted); }
.ov-mono { font-family: 'JetBrains Mono', ui-monospace, monospace; font-weight: 600; font-variant-numeric: tabular-nums; }
strong.ov-mono { color: var(--text-primary); }

/* ── The three cards ── */
.ov-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; margin-bottom: 28px; }
.ov-card { margin: 0; padding: 24px; display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.ov-card-head { display: flex; align-items: center; gap: 12px; }
.ov-card-icon {
  width: 40px; height: 40px; flex: 0 0 40px; border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center;
  background: var(--accent-soft); color: var(--accent-ink);
}
.ov-card-icon svg { width: 20px; height: 20px; }
.ov-card-icon.teal { background: var(--teal-soft); color: var(--teal); }
.ov-card-icon.ok { background: rgba(0,200,117,.13); color: #05794b; }
.ov-card-icon.warn { background: rgba(253,171,61,.18); color: #9a5200; }
html[data-theme="dark"] .ov-card-icon.ok { color: #4ade9b; }
html[data-theme="dark"] .ov-card-icon.warn { color: #fbbf24; }
.ov-card-label { font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
.ov-card-main { display: flex; flex-direction: column; gap: 8px; }
.ov-card-titlerow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ov-card-title {
  margin: 0; font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 22px; font-weight: 600; letter-spacing: -0.01em; line-height: 1.25; color: var(--text-primary);
}
.ov-card-text { margin: 0; font-size: 14px; line-height: 1.55; color: var(--text-secondary); }
.ov-card-note { margin: 0; font-size: 13px; line-height: 1.6; color: var(--text-secondary); }
.ov-card-foot {
  margin-top: auto; padding-top: 16px; border-top: 1px solid var(--border);
  display: flex; align-items: center; gap: 8px 18px; flex-wrap: wrap; min-height: 44px;
}
.ov-checks { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.ov-checks li { display: flex; align-items: center; gap: 10px; font-size: 13px; line-height: 1.5; color: var(--text-primary); }
.ov-checks svg { width: 15px; height: 15px; flex: 0 0 15px; color: #05794b; }
html[data-theme="dark"] .ov-checks svg { color: #4ade9b; }
.ov-exts { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.ov-exts li { display: flex; align-items: center; gap: 12px; }
.ext-tile.ov-ext-tile { width: 36px; height: 36px; flex: 0 0 36px; border-radius: var(--r-md); }
.ext-tile.ov-ext-tile svg { width: 18px; height: 18px; }
.ov-ext-name { flex: 1; min-width: 0; font-size: 13.5px; font-weight: 600; color: var(--text-primary); }
.ov-exts .ext-chip { min-height: 26px; font-size: 12px; padding: 0 10px; gap: 6px; }
.ov-kvs { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.ov-kvs li { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-top: 1px solid var(--border); }
.ov-kv { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ov-k { font-size: 12px; line-height: 1.4; color: var(--text-muted); }
.ov-v {
  font-size: 13.5px; line-height: 1.4; font-weight: 600; color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ov-v.is-dots { letter-spacing: .12em; }
.ov-v.is-muted { color: var(--text-muted); font-weight: 500; }

/* ── The verify card, opened from the top card ── */
.ov-verify { margin-bottom: 24px; }

/* ── Shortcuts ── */
.ov-sc-title {
  margin: 0 0 16px; font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 18px; font-weight: 600; letter-spacing: -0.01em; color: var(--text-primary);
}
.ov-sc-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
/* The whole tile is the link. Icon and arrow share the first row, the words
   run under them; on a phone the same markup becomes one row (below). */
.ov-sc {
  display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto 1fr;
  gap: 12px; align-items: start;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 20px; color: var(--text-primary); text-decoration: none;
  transition: border-color .15s, box-shadow .15s;
}
.ov-sc:hover { border-color: rgba(26,111,255,.35); box-shadow: var(--shadow-md); color: var(--text-primary); }
.ov-sc:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ov-sc-icon {
  grid-column: 1; grid-row: 1;
  width: 36px; height: 36px; border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center;
  background: var(--accent-soft); color: var(--accent-ink);
}
.ov-sc-icon svg { width: 18px; height: 18px; }
.ov-sc-go { grid-column: 3; grid-row: 1; width: 16px; height: 16px; color: var(--text-muted); margin-top: 10px; }
.ov-sc-body { grid-column: 1 / -1; grid-row: 2; display: flex; flex-direction: column; gap: 4px; height: 100%; }
.ov-sc-name { font-size: 15px; font-weight: 700; color: var(--text-primary); }
.ov-sc-desc { font-size: 13px; line-height: 1.55; color: var(--text-secondary); }
.ov-sc-stat { margin-top: auto; padding-top: 8px; font-size: 13px; font-weight: 600; color: var(--text-primary); }
.ov-sc-stat.is-quiet { color: var(--text-muted); }

/* ── Narrower windows: two across, then one ── */
@media (max-width: 1100px) {
  .ov-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ov-grid > .ov-card:last-child { grid-column: 1 / -1; }
}
@media (max-width: 760px) {
  .ov-hero { padding: 20px; }
  .ov-hero-top { gap: 14px; align-items: flex-start; }
  .ov-hero-icon { width: 48px; height: 48px; flex-basis: 48px; }
  .ov-hero-icon svg { width: 24px; height: 24px; }
  .ov-hero-title { font-size: 21px; }
  /* Two lines, not one wrapped line with a dot left dangling at its end. */
  .ov-who { flex-direction: column; align-items: flex-start; gap: 2px; }
  .ov-who > [aria-hidden="true"] { display: none; }
  .ov-hero-text { font-size: 14.5px; }
  .ov-hero[data-state="setup"] .ov-hero-top { flex-wrap: wrap; }
  .ov-count { flex-direction: row; align-items: baseline; gap: 8px; width: 100%; padding-left: 62px; }
  .ov-count-n { font-size: 20px; }
  .ov-row { flex-wrap: wrap; padding: 14px 16px; }
  /* The action drops under the words, lined up with them: past the row's
     icon (40px) or step circle (32px) and the 16px gap. */
  .ov-row { --ov-lead: 56px; }
  .ov-row.ov-step-row { --ov-lead: 48px; }
  .ov-row > .ov-btn, .ov-row > .ov-chip, .ov-row > .ov-after { margin-left: var(--ov-lead); }
  .ov-row > .ov-btn { width: calc(100% - var(--ov-lead)); }
  .ov-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; }
  .ov-grid > .ov-card:last-child { grid-column: auto; }
  .ov-card { padding: 20px; gap: 14px; }
  .ov-card-title { font-size: 20px; }
  .ov-sc-grid { grid-template-columns: minmax(0, 1fr); gap: 12px; }
  .ov-sc { grid-template-columns: auto 1fr auto; grid-template-rows: auto; gap: 14px; padding: 16px; }
  .ov-sc-icon { width: 40px; height: 40px; }
  .ov-sc-body { grid-column: 2; grid-row: 1; height: auto; gap: 3px; }
  .ov-sc-go { grid-column: 3; margin-top: 4px; }
  .ov-sc-stat { margin-top: 4px; padding-top: 0; }
}

/* ══════════ Label QR — redesigned 24 Sep 2026 ══════════
   Built from the design canvas "Label QR Redesign" ("Push to main"), and
   painted by assets/js/sio-follow-qr.js. Same rules as the blocks above:
   every colour is a site token or a status colour this file already uses,
   restated for the dark theme where the ink changes; every radius is a
   --r-* step or a percentage. Two things are white in BOTH themes on
   purpose — the QR code and the label drawn around it — because they are
   pictures of a printed sticker, and a QR is dark on light. */
.lqr { display: flex; flex-direction: column; gap: 24px; }
/* styles.css pads every <section> 84px for the marketing pages. :where()
   keeps this reset at no weight, so the paddings below still win. */
.lqr :where(section) { padding: 0; }
.lqr .dash-card { margin: 0; }
#qrList[aria-busy="true"] .lqr { opacity: .55; pointer-events: none; transition: opacity .15s; }
.lqr-loading { padding: 48px 0; text-align: center; font-size: 13.5px; color: var(--text-muted); }
.lqr-i { width: 18px; height: 18px; flex: 0 0 18px; }
.lqr-sr, .lqr-all-l {
  position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}
.lqr-eyebrow {
  margin: 0; font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted);
}
.lqr-h2 {
  margin: 0; font-family: 'Space Grotesk', 'Inter', sans-serif;
  font-size: 18px; font-weight: 600; letter-spacing: -0.01em; line-height: 1.3; color: var(--text-primary);
}
.lqr-h3 { margin: 0; font-size: 13.5px; font-weight: 600; color: var(--text-primary); }
.lqr-mono, .lqr-n, .lqr-row-n strong, .lqr-hero-v, .lqr-tick span {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-variant-numeric: tabular-nums;
}
.lqr-card { padding: 22px 24px; display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.lqr-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px 16px; flex-wrap: wrap; }
.lqr-card-hgroup { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.lqr-card-sub { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-secondary); }

/* ── Buttons ── */
.lqr-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 44px; padding: 0 18px; white-space: nowrap; }
.lqr-btn .lqr-i { width: 16px; height: 16px; flex-basis: 16px; }
.lqr-btn--ghost, .lqr-btn--soft {
  font: inherit; font-size: 13.5px; font-weight: 600; border-radius: var(--r-pill); cursor: pointer; text-decoration: none;
  transition: border-color .15s, background .15s, color .15s;
}
.lqr-btn--ghost { padding: 0 16px; border: 1px solid var(--border-strong); background: var(--surface); color: var(--text-primary); }
.lqr-btn--ghost:hover { border-color: var(--text-muted); color: var(--text-primary); }
.lqr-btn--soft { padding: 0 14px 0 18px; border: none; background: var(--accent-soft); color: var(--accent-ink); }
.lqr-btn--soft:hover { background: rgba(26,111,255,.16); color: var(--accent-ink); }
/* The tick replaces the copy mark for a moment after a copy. */
.lqr-copy .lqr-i-done { display: none; }
.lqr-copy.is-done { border-color: rgba(0,200,117,.45); color: #05794b; }
.lqr-copy.is-done .lqr-i-copy { display: none; }
.lqr-copy.is-done .lqr-i-done { display: block; }
html[data-theme="dark"] .lqr-copy.is-done { color: #4ade9b; }
.lqr-btn:focus-visible, .lqr-seg-b:focus-visible, .lqr-tab:focus-visible, .lqr-back:focus-visible,
.lqr-store-name:focus-visible, .lqr-link:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px;
}

/* ── The range ── */
.lqr-range { display: flex; align-items: center; gap: 12px 16px; flex-wrap: wrap; }
.lqr-seg {
  display: inline-flex; align-items: center; gap: 2px; padding: 3px;
  border-radius: var(--r-pill); background: var(--surface); border: 1px solid var(--border-strong);
}
.lqr-seg-b {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; min-width: 56px; padding: 0 16px;
  border: none; border-radius: var(--r-pill); background: transparent; color: var(--text-secondary);
  font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; white-space: nowrap;
  transition: background .15s, color .15s;
}
.lqr-seg-b:hover { color: var(--text-primary); background: var(--accent-soft); }
/* The primary button's fill (see .dash-btn): white on it clears 5.4:1. */
.lqr-seg-b[aria-pressed="true"], .lqr-seg-b.is-on {
  background: var(--accent); background: color-mix(in srgb, var(--accent) 88%, #000); color: #fff;
}
.lqr-seg-b .lqr-i { width: 16px; height: 16px; flex-basis: 16px; }
.lqr-seg-div { width: 1px; height: 22px; margin: 0 4px; background: var(--border-strong); }
.lqr-range-cap { margin: 0; font-size: 13.5px; line-height: 1.4; color: var(--text-secondary); }
.lqr-range-cap strong { font-weight: 600; color: var(--text-primary); }
.lqr-pick {
  display: flex; align-items: flex-end; gap: 12px 16px; flex-wrap: wrap; padding: 16px 18px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
}
.lqr-pick-f { display: flex; flex-direction: column; gap: 6px; }
.lqr-pick-f label { font-size: 12px; font-weight: 700; color: var(--text-secondary); }
.lqr-pick-f .dash-input { width: auto; min-width: 160px; min-height: 44px; }
.lqr-pick-go { display: flex; gap: 8px; flex-wrap: wrap; }
.lqr-pick-msg { flex-basis: 100%; margin: 0; font-size: 13px; color: #b3243a; }
.lqr-pick-msg:empty { display: none; }
html[data-theme="dark"] .lqr-pick-msg { color: #ff8098; }

/* ── The numbers ── */
.lqr-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
.lqr-kpis.is-three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.lqr-kpi {
  min-width: 0; display: flex; flex-direction: column; gap: 10px; padding: 18px 20px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow-sm);
}
.lqr-kpi-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 32px; }
.lqr-kpi-icon {
  width: 32px; height: 32px; flex: 0 0 32px; border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center; background: var(--accent-soft); color: var(--accent-ink);
}
.lqr-kpi-icon .lqr-i { width: 16px; height: 16px; flex-basis: 16px; }
.lqr-kpi-v {
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 32px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1.05; color: var(--text-primary); font-variant-numeric: tabular-nums;
}
.lqr-kpi-v.is-word { font-size: 24px; line-height: 1.2; overflow-wrap: anywhere; }
.lqr-kpi-of { font-size: 20px; color: var(--text-muted); }
.lqr-kpi-s { font-size: 13px; line-height: 1.45; color: var(--text-secondary); }

/* ── Scans per day ── */
.lqr-legend { display: inline-flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--text-secondary); white-space: nowrap; }
.lqr-legend i { width: 10px; height: 10px; border-radius: 30%; background: var(--accent); }
.lqr-chart { display: flex; flex-direction: column; gap: 8px; }
.lqr-plotwrap { position: relative; height: 160px; margin-top: 8px; }
.lqr-ticks { position: absolute; inset: 0; pointer-events: none; }
.lqr-tick { position: absolute; left: 28px; right: 0; height: 0; border-top: 1px dashed var(--border-strong); }
.lqr-tick.is-base { border-top-style: solid; }
.lqr-tick span {
  position: absolute; right: calc(100% + 8px); top: -8px;
  font-size: 11px; line-height: 16px; color: var(--text-muted); white-space: nowrap;
}
.lqr-plot { position: absolute; left: 28px; right: 0; top: 0; bottom: 0; display: flex; align-items: stretch; gap: 8px; }
.lqr-chart[data-dense="1"] .lqr-plot { gap: 6px; }
.lqr-chart[data-dense="2"] .lqr-plot { gap: 2px; }
.lqr-plot:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; border-radius: var(--r-sm); }
.lqr-col { flex: 1 1 0; min-width: 0; display: flex; align-items: flex-end; }
.lqr-bar { display: block; width: 100%; min-height: 2px; background: var(--accent); border-radius: var(--r-sm) var(--r-sm) 0 0; }
.lqr-bar.is-zero { height: 2px; background: var(--border-strong); border-radius: var(--r-pill); }
.lqr-col.is-on .lqr-bar { background: var(--accent-ink); box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px rgba(26,111,255,.35); }
.lqr-col.is-on .lqr-bar.is-zero { background: var(--text-muted); box-shadow: none; }
.lqr-x { position: relative; height: 16px; margin-left: 28px; }
.lqr-x span { position: absolute; top: 0; font-size: 11.5px; line-height: 16px; color: var(--text-muted); white-space: nowrap; }
/* The tooltip inverts with the theme: dark on the light page, light on the dark. */
.lqr-tip {
  position: absolute; z-index: 5; left: 0; top: 0; display: flex; flex-direction: column; gap: 2px;
  padding: 8px 12px; border-radius: var(--r-md); background: var(--text-primary); color: var(--surface);
  white-space: nowrap; box-shadow: var(--shadow-lg); pointer-events: none;
}
.lqr-tip-d { font-size: 12px; font-weight: 600; }
.lqr-tip-n { font-size: 12px; color: color-mix(in srgb, var(--surface) 82%, var(--text-primary)); }
.lqr-tip-arrow {
  position: absolute; bottom: -5px; width: 10px; height: 10px; margin-left: -5px;
  background: var(--text-primary); transform: rotate(45deg);
}

/* ── Your stores ── */
.lqr-stores { padding: 0; gap: 0; overflow: hidden; }
.lqr-stores-head { padding: 22px 24px 18px; }
.lqr-table { width: 100%; border-collapse: collapse; }
.lqr-table thead th {
  padding: 12px 24px; text-align: left; white-space: nowrap; background: var(--body-bg);
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
  font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted);
}
.lqr-table thead th.lqr-th-all { width: 110px; }
.lqr-table tbody th, .lqr-table td { padding: 16px 24px; vertical-align: middle; text-align: left; font-weight: 400; }
.lqr-table tbody tr + tr > * { border-top: 1px solid var(--border); }
.lqr-store { display: flex; align-items: center; gap: 14px; min-width: 0; }
.lqr-store-txt { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.lqr-store-name { font-size: 15px; font-weight: 700; color: var(--text-primary); text-decoration: none; overflow-wrap: anywhere; }
.lqr-store-name:hover { color: var(--accent-ink); text-decoration: underline; }
.lqr-store-meta, .lqr-since { font-size: 12.5px; line-height: 1.4; color: var(--text-muted); overflow-wrap: anywhere; }
.lqr-scans { display: flex; align-items: center; gap: 12px; }
.lqr-n { font-size: 15px; font-weight: 600; color: var(--text-primary); }
.lqr-c-scans .lqr-n { min-width: 34px; }
.lqr-share-row { display: inline-flex; align-items: center; gap: 12px; min-width: 0; }
.lqr-share { width: 120px; height: 6px; flex: 0 0 120px; border-radius: var(--r-pill); background: var(--border-strong); overflow: hidden; }
.lqr-share i, .lqr-row-bar i { display: block; height: 100%; border-radius: var(--r-pill); background: var(--accent); }
.lqr-pct { font-size: 12.5px; color: var(--text-secondary); white-space: nowrap; }
.lqr-zero { min-width: 200px; font-size: 12.5px; line-height: 1.45; color: var(--text-muted); white-space: normal; }
.lqr-c-act { text-align: right; }
/* The two value columns take what their content needs and the Store column
   takes the rest, so a store's name and link are not the thing that wraps. */
.lqr-table td.lqr-c-scans, .lqr-table td.lqr-c-act { width: 1%; white-space: nowrap; }
/* Words for the count that only a card needs — the table has its header. */
.lqr-n-sr { display: none; }
.lqr-acts { display: inline-flex; align-items: center; gap: 8px; }

/* ── The QR, as it prints ── */
.lqr-qr { display: flex; flex: 0 0 auto; background: #fff; color: #15161a; border: 1px solid var(--border); }
.lqr-qr svg { width: 100%; height: 100%; display: block; }
.lqr-qr svg path { fill: currentColor; }
.lqr-qr--xs { width: 58px; height: 58px; padding: 2px; border: 0; border-radius: var(--r-sm); }
.lqr-qr--sm { width: 48px; height: 48px; padding: 2px; border-radius: var(--r-md); }
.lqr-qr--lg { width: 132px; height: 132px; padding: 6px; border-radius: var(--r-lg); }

/* ── One store ── */
.lqr-back {
  align-self: flex-start; display: inline-flex; align-items: center; gap: 8px; min-height: 44px;
  padding: 0 16px 0 12px; margin: -8px 0 -8px -12px; border-radius: var(--r-pill);
  font-size: 14px; font-weight: 600; color: var(--accent-ink); text-decoration: none;
}
.lqr-back:hover { background: var(--accent-soft); color: var(--accent-ink); }
.lqr-back .lqr-i { width: 16px; height: 16px; flex-basis: 16px; }
.lqr-hero { flex-direction: row; align-items: center; gap: 28px; padding: 24px; }
.lqr-hero-qr { display: flex; flex-direction: column; align-items: center; gap: 10px; flex: 0 0 auto; }
.lqr-hero-cap { font-size: 12px; color: var(--text-muted); }
.lqr-hero-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.lqr-hero-top { display: flex; flex-direction: column; gap: 6px; }
.lqr-hero-title {
  margin: 0; font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 28px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1.15; color: var(--text-primary); overflow-wrap: anywhere;
}
.lqr-hero-title:focus { outline: none; }
.lqr-hero-text { margin: 0; font-size: 14px; line-height: 1.5; color: var(--text-secondary); }
.lqr-link { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; color: var(--accent-ink); text-decoration: none; }
.lqr-link:hover { color: var(--accent-ink); text-decoration: underline; }
.lqr-link .lqr-i { width: 14px; height: 14px; flex-basis: 14px; }
.lqr-hero-link { display: flex; align-items: center; gap: 12px 20px; flex-wrap: wrap; padding-top: 14px; border-top: 1px solid var(--border); }
.lqr-hero-kv { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.lqr-hero-k { font-size: 12px; color: var(--text-muted); }
.lqr-hero-v { font-size: 14px; font-weight: 600; color: var(--text-primary); overflow-wrap: anywhere; }
.lqr-pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; align-items: stretch; }
.lqr-tabs {
  display: inline-flex; gap: 2px; padding: 3px; border-radius: var(--r-pill);
  background: var(--body-bg); border: 1px solid var(--border);
}
.lqr-tab {
  min-height: 38px; padding: 0 16px; border: none; border-radius: var(--r-pill); background: transparent;
  color: var(--text-secondary); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
}
.lqr-tab:hover { color: var(--text-primary); }
.lqr-tab[aria-selected="true"] { background: var(--surface); color: var(--text-primary); box-shadow: 0 1px 2px rgba(15,15,20,.12); }
.lqr-place-body { flex: 1; display: flex; flex-direction: column; gap: 16px; }
.lqr-rows { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.lqr-row { display: grid; grid-template-columns: 120px minmax(0, 1fr) 84px; align-items: center; gap: 14px; }
.lqr-row-name { font-size: 14px; font-weight: 500; line-height: 1.35; color: var(--text-primary); overflow-wrap: anywhere; }
.lqr-row-bar { height: 8px; border-radius: var(--r-pill); background: var(--border-strong); overflow: hidden; }
.lqr-row-n { text-align: right; font-size: 13.5px; color: var(--text-secondary); white-space: nowrap; }
.lqr-row-n strong { font-weight: 600; color: var(--text-primary); }
/* Two lists side by side are too narrow for a bar between the words: it
   goes under them, the full width of the list. */
.lqr-rows.is-narrow { gap: 10px; }
.lqr-rows.is-narrow .lqr-row { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "name n" "bar bar"; gap: 6px 10px; }
.lqr-rows.is-narrow .lqr-row-name { grid-area: name; }
.lqr-rows.is-narrow .lqr-row-bar { grid-area: bar; height: 6px; }
.lqr-rows.is-narrow .lqr-row-n { grid-area: n; }
.lqr-place-note {
  margin-top: auto; display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px;
  border-radius: var(--r-md); background: var(--body-bg); color: var(--text-muted);
}
.lqr-place-note .lqr-i { width: 16px; height: 16px; flex-basis: 16px; margin-top: 2px; }
.lqr-place-note p { margin: 0; font-size: 13px; line-height: 1.55; color: var(--text-secondary); }
.lqr-place-note strong { font-weight: 600; color: var(--text-primary); }
.lqr-split-wrap { display: flex; flex-direction: column; gap: 10px; }
.lqr-split { display: flex; gap: 2px; height: 14px; border-radius: var(--r-pill); overflow: hidden; }
.lqr-split span { flex-basis: 0; min-width: 4px; }
.lqr-split .is-phone, .lqr-split-key i.is-phone { background: var(--accent); }
.lqr-split .is-tablet, .lqr-split-key i.is-tablet { background: var(--teal); }
.lqr-split .is-computer, .lqr-split-key i.is-computer { background: color-mix(in srgb, var(--accent) 40%, var(--surface)); }
.lqr-split .is-other, .lqr-split-key i.is-other { background: var(--text-muted); }
.lqr-split-key { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 20px; font-size: 13px; color: var(--text-secondary); }
.lqr-split-key li { display: inline-flex; align-items: center; gap: 8px; }
.lqr-split-key i { width: 10px; height: 10px; border-radius: 30%; }
.lqr-split-key strong { font-weight: 600; color: var(--text-primary); }
.lqr-how-lists {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px;
  padding-top: 18px; border-top: 1px solid var(--border);
}
.lqr-how-list { display: flex; flex-direction: column; gap: 12px; min-width: 0; }

/* ── The plan note ── */
.lqr-note {
  display: flex; align-items: center; gap: 18px; padding: 20px 22px; border-radius: var(--r-xl);
  background: rgba(253,171,61,.12); border: 1px solid rgba(253,171,61,.45);
}
.lqr-note-icon {
  width: 44px; height: 44px; flex: 0 0 44px; border-radius: var(--r-lg);
  display: flex; align-items: center; justify-content: center; background: rgba(253,171,61,.22); color: #9a5200;
}
html[data-theme="dark"] .lqr-note-icon { color: #fbbf24; }
.lqr-note-icon .lqr-i { width: 20px; height: 20px; flex-basis: 20px; }
.lqr-note-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.lqr-note-title { margin: 0; font-size: 15.5px; font-weight: 700; line-height: 1.35; color: var(--text-primary); }
.lqr-note-text { margin: 0; font-size: 14px; line-height: 1.55; color: var(--text-secondary); }

/* ── Nothing yet ── */
.lqr-empty { flex-direction: row; align-items: center; gap: 40px; padding: 32px; }
.lqr-mock { width: 300px; flex: 0 0 300px; padding: 22px; border-radius: var(--r-xl); background: var(--body-bg); display: flex; justify-content: center; }
.lqr-mock-label {
  width: 236px; padding: 16px; display: flex; flex-direction: column; gap: 10px;
  background: #fff; border: 1px solid rgba(21,22,26,.12); border-radius: var(--r-md); box-shadow: var(--shadow-lg);
}
.lqr-mock-row { display: flex; justify-content: space-between; align-items: center; }
.lqr-mock-lines { display: flex; flex-direction: column; gap: 5px; }
.lqr-mock-l { display: block; height: 7px; border-radius: var(--r-pill); background: #d6d9e0; }
.lqr-mock-row .lqr-mock-l { height: 9px; background: #15161a; }
.lqr-mock-row .lqr-mock-l.is-soft { background: #c9ccd4; }
.lqr-mock-l.w34 { width: 34px; } .lqr-mock-l.w70 { width: 70px; } .lqr-mock-l.w120 { width: 120px; }
.lqr-mock-l.w150 { width: 150px; } .lqr-mock-l.w180 { width: 180px; }
.lqr-mock-code { height: 44px; background: repeating-linear-gradient(90deg, #15161a 0 2px, #fff 2px 4px, #15161a 4px 7px, #fff 7px 9px); }
.lqr-mock-qr { display: flex; align-items: center; gap: 10px; padding: 8px; border-radius: var(--r-sm); border: 1.5px dashed #1a6fff; background: #f5f8ff; }
.lqr-mock-cap { display: flex; flex-direction: column; gap: 3px; }
.lqr-mock-cap b { font-size: 11px; font-weight: 700; color: #15161a; }
.lqr-mock-cap span { font-size: 10px; color: #53545e; }
.lqr-empty-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 20px; }
.lqr-empty-head { display: flex; flex-direction: column; gap: 8px; }
.lqr-empty-title {
  margin: 0; font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 26px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1.2; color: var(--text-primary);
}
.lqr-empty-text { margin: 0; font-size: 15px; line-height: 1.6; color: var(--text-secondary); }
.lqr-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.lqr-step { display: flex; gap: 14px; align-items: flex-start; }
.lqr-step-n {
  width: 28px; height: 28px; flex: 0 0 28px; border-radius: 50%; background: var(--accent-soft); color: var(--accent-ink);
  display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 700;
}
.lqr-step-copy { display: flex; flex-direction: column; gap: 3px; padding-top: 3px; min-width: 0; }
.lqr-step-t { font-size: 14.5px; font-weight: 600; color: var(--text-primary); }
.lqr-step-t strong { font-weight: 700; }
.lqr-step-d { font-size: 13.5px; line-height: 1.5; color: var(--text-secondary); }
.lqr-empty-go { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding-top: 4px; }
.lqr-whys { display: flex; flex-direction: column; gap: 14px; }
.lqr-why-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.lqr-why {
  display: flex; flex-direction: column; gap: 10px; padding: 20px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
}
.lqr-why-icon {
  width: 36px; height: 36px; border-radius: var(--r-md); background: var(--accent-soft); color: var(--accent-ink);
  display: flex; align-items: center; justify-content: center;
}
.lqr-why-t { font-size: 15px; font-weight: 700; color: var(--text-primary); }
.lqr-why-d { font-size: 13.5px; line-height: 1.55; color: var(--text-secondary); }

/* ── Narrower windows ── */
/* Measured in Chromium, not guessed. Four tiles below ~880px of content
   wrap their labels. The stores table needs ~780px — the two value columns
   and the buttons take 520 of it — so below that each store becomes a card:
   two across while there is room, one on a phone. */
@media (max-width: 1180px) {
  .lqr-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lqr-kpis.is-three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .lqr-table thead th, .lqr-table tbody th, .lqr-table td { padding-left: 16px; padding-right: 16px; }
  .lqr-table thead th.lqr-th-all { width: 88px; }
  .lqr-share { width: 72px; flex-basis: 72px; }
  .lqr-zero { min-width: 150px; }
  .lqr-c-act .lqr-copy { width: 44px; padding: 0; }
  .lqr-c-act .lqr-copy-word { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .lqr-since { display: none; }
  .lqr-empty { gap: 28px; padding: 28px; }
}
@media (max-width: 1080px) {
  .lqr-stores { gap: 12px; padding: 0; background: none; border: 0; box-shadow: none; overflow: visible; border-radius: 0; }
  .lqr-stores-head { padding: 4px 2px 0; }
  .lqr-table { display: block; }
  .lqr-table tbody { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  /* No header row on a card: each card says what its numbers are, and the
     count's own words (.lqr-n-sr) are read aloud in the header's place. */
  .lqr-table thead { display: none; }
  .lqr-n-sr { display: block; position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .lqr-table tbody tr {
    display: grid; grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas: "store n" "store all" "share share" "act act"; column-gap: 12px;
    padding: 16px; background: var(--surface);
    border: 1px solid var(--border); border-radius: var(--r-xl); box-shadow: var(--shadow-sm);
  }
  .lqr-table tbody tr + tr > * { border-top: 0; }
  .lqr-table tbody th, .lqr-table td { padding: 0; }
  .lqr-table td.lqr-c-scans, .lqr-table td.lqr-c-act { width: auto; white-space: normal; }
  .lqr-c-store { grid-area: store; }
  .lqr-c-scans, .lqr-scans { display: contents; }
  .lqr-c-scans .lqr-n {
    grid-area: n; align-self: end; justify-self: end; min-width: 0;
    font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 22px; line-height: 1.1;
  }
  .lqr-c-all { grid-area: all; align-self: start; justify-self: end; white-space: nowrap; }
  .lqr-c-all .lqr-n { font-family: inherit; font-size: 11.5px; font-weight: 500; color: var(--text-muted); }
  .lqr-all-l { position: static; width: auto; height: auto; overflow: visible; clip: auto; font-size: 11.5px; color: var(--text-muted); }
  .lqr-share-row { grid-area: share; margin-top: 14px; }
  .lqr-share { flex: 1 1 auto; width: auto; }
  .lqr-zero { min-width: 0; }
  .lqr-c-act { grid-area: act; margin-top: 14px; text-align: left; }
  .lqr-acts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .lqr-c-act .lqr-copy { width: auto; padding: 0 16px; }
  .lqr-c-act .lqr-copy-word { position: static; width: auto; height: auto; overflow: visible; clip: auto; }
  .lqr-qr--sm { width: 44px; height: 44px; }
}
@media (max-width: 1000px) {
  .lqr-pair { grid-template-columns: minmax(0, 1fr); }
  .lqr-empty { flex-direction: column; align-items: stretch; }
  .lqr-mock { width: auto; flex-basis: auto; }
}
/* A phone: the canvas's own phone board. The chips stand apart, the numbers
   go two by two, and each store is a card of its own. */
@media (max-width: 760px) {
  .lqr { gap: 16px; }
  .lqr-range { flex-direction: column; align-items: flex-start; gap: 8px; }
  .lqr-seg { flex-wrap: wrap; gap: 6px; padding: 0; background: none; border: 0; border-radius: 0; }
  .lqr-seg-b { min-width: 52px; padding: 0 12px; border: 1px solid var(--border-strong); background: var(--surface); }
  .lqr-seg-b[aria-pressed="true"], .lqr-seg-b.is-on { border-color: transparent; }
  .lqr-seg-div { display: none; }
  .lqr-seg-pick { width: 44px; min-width: 44px; padding: 0; }
  .lqr-pick-word { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .lqr-pick-f { flex: 1 1 140px; }
  .lqr-pick-f .dash-input { width: 100%; min-width: 0; }
  .lqr-kpis, .lqr-kpis.is-three { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  .lqr-kpis.is-three .lqr-kpi:last-child { grid-column: 1 / -1; }
  .lqr-kpi { padding: 14px 16px; gap: 6px; }
  .lqr-kpi-head { min-height: 0; }
  .lqr-kpi-icon { display: none; }
  .lqr-kpi .lqr-eyebrow { font-size: 11.5px; }
  .lqr-kpi-v { font-size: 26px; }
  .lqr-kpi-v.is-word { font-size: 21px; }
  .lqr-kpi-of { font-size: 17px; }
  .lqr-kpi-s { font-size: 12.5px; }
  .lqr-card { padding: 16px; gap: 14px; }
  .lqr-stores { padding: 0; }
  .lqr-legend { display: none; }
  .lqr-plotwrap { height: 120px; }
  .lqr-tick { left: 22px; }
  .lqr-plot { left: 22px; gap: 3px; }
  .lqr-x { margin-left: 22px; }
  .lqr-chart[data-dense="1"] .lqr-plot { gap: 2px; }
  .lqr-chart[data-dense="2"] .lqr-plot { gap: 1px; }
  .lqr-x span.is-minor { visibility: hidden; }
  .lqr-table tbody { grid-template-columns: minmax(0, 1fr); }

  .lqr-hero { flex-direction: column; align-items: stretch; gap: 18px; padding: 20px; }
  .lqr-hero-title { font-size: 24px; }
  .lqr-note { flex-direction: column; align-items: flex-start; gap: 12px; padding: 18px; }
  .lqr-note .dash-btn { width: 100%; }
  .lqr-row { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "name n" "bar bar"; gap: 6px 10px; }
  .lqr-row-name { grid-area: name; }
  .lqr-row-bar { grid-area: bar; height: 6px; }
  .lqr-row-n { grid-area: n; }
  .lqr-how-lists { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .lqr-empty { padding: 20px; gap: 20px; }
  .lqr-empty-title { font-size: 22px; }
  .lqr-empty-go .dash-btn { width: 100%; }
  .lqr-why-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ── SHARE & WIN (1 Oct 2026, rm19) ──────────────────────────────────────
   The seller's own monthly ladder, above Share & earn (sio-referral.js
   shareWinHtml). The campaign's violet and pink, as on /share-and-win: the
   wash under the card's head, the edge on the AirPods steps. Ink stays the
   page's own, and a done step's mark is the green Share & earn uses. */
.sw-card { --sw-ink: #6d28d9; --sw-edge: linear-gradient(135deg, #7c3aed, #ec4899);
  --sw-wash: linear-gradient(135deg, rgba(124, 58, 237, 0.10), rgba(236, 72, 153, 0.08)); }
html[data-theme="dark"] .sw-card { --sw-ink: #c4b5fd;
  --sw-wash: linear-gradient(135deg, rgba(124, 58, 237, 0.22), rgba(236, 72, 153, 0.14)); }
.sw-card .sw-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px;
  margin: -4px -4px 16px; padding: 14px 16px; border-radius: var(--r-lg); background: var(--sw-wash); }
.sw-eyebrow { font-size: 11px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--sw-ink); }
.sw-title { margin: 4px 0 2px; font-size: 20px; line-height: 1.25; }
.sw-dates { margin: 0; font-size: 12.5px; color: var(--text-secondary); }
.sw-need { margin: 0 0 16px; padding: 12px 14px; border-radius: var(--r-md); border: 1px solid rgba(253,171,61,.45);
  background: rgba(253,171,61,.10); font-size: 13px; }
.sw-need ul { list-style: none; margin: 6px 0 8px; padding: 0; display: flex; flex-wrap: wrap; gap: 6px 16px; }
.sw-need li.is-ok { color: var(--mgreen-ink); font-weight: 600; }
.sw-need li.is-no { color: var(--text-primary); font-weight: 600; }
.sw-counts { display: flex; align-items: center; margin: 0 0 16px; }
.sw-reached { margin-left: auto; text-align: right; border-left: none; }
.sw-reached-v { font-size: 15px; font-weight: 700; color: var(--text-muted); }
.sw-reached-v.is-won { color: var(--sw-ink); }
.sw-steps { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; }
.sw-step { display: flex; flex-direction: column; gap: 8px; min-width: 0; padding: 12px; border-radius: var(--r-md);
  border: 1px solid var(--border); background: var(--surface); }
.sw-step.is-prize { border: 1px solid transparent;
  background: linear-gradient(var(--surface), var(--surface)) padding-box, var(--sw-edge) border-box; }
.sw-step-h { display: flex; align-items: center; gap: 8px; min-width: 0; }
.sw-step-n { width: 22px; height: 22px; border-radius: 50%; flex: none; display: inline-flex; align-items: center;
  justify-content: center; font-size: 11.5px; font-weight: 700; background: var(--body-bg);
  border: 1px solid var(--border-strong); color: var(--text-secondary); }
.sw-step.is-done .sw-step-n { background: var(--mgreen); border-color: var(--mgreen); color: var(--mgreen-on); }
.sw-step-w { font-size: 13px; font-weight: 700; line-height: 1.3; }
.sw-bar > i { opacity: 1; background: var(--sw-edge); }
.sw-step-d { font-size: 12px; color: var(--text-secondary); line-height: 1.4; }
.sw-next { margin: 12px 0 0; font-size: 13px; color: var(--text-secondary); }
.sw-next.is-top { color: var(--mgreen-ink); font-weight: 600; }
.sw-refs { margin-top: 14px; border-top: 1px solid var(--border); padding-top: 4px; }
.sw-why { font-size: 12px; font-weight: 500; color: var(--text-secondary); }
.sw-empty { margin: 14px 0 0; }
.sw-last, .sw-awards { margin-top: 20px; padding-top: 14px; border-top: 1px solid var(--border); }
.sw-awards .dash-card-title { margin: 0 0 10px; }
.sw-award { padding: 12px 0; border-top: 1px solid var(--border); }
.sw-award:first-of-type { border-top: none; }
.sw-award-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.sw-award-p { margin: 6px 0 0; font-size: 13px; color: var(--text-secondary); }
.sw-claim { margin-top: 12px; padding: 14px; border-radius: var(--r-md); background: var(--body-bg); border: 1px solid var(--border); }
.sw-claim-h { margin: 0 0 10px; font-size: 13px; font-weight: 600; }
.sw-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.sw-f { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.sw-ferr { font-size: 12px; color: #c62839; min-height: 0; }
html[data-theme="dark"] .sw-ferr { color: #ff8a93; }
.sw-claim-acts { display: flex; align-items: center; gap: 12px; margin-top: 12px; flex-wrap: wrap; }
.sw-said { font-size: 12.5px; color: var(--text-secondary); }
@media (max-width: 860px) {
  .sw-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  .sw-card .sw-top { flex-direction: column; }
  .sw-steps, .sw-grid { grid-template-columns: minmax(0, 1fr); }
  .sw-counts { flex-wrap: wrap; row-gap: 10px; }
  .sw-reached { margin-left: 0; text-align: left; width: 100%; padding-left: 0; }
}
