/* ═══════════════════════════════════════════════════════════════════════════
   THE GARDEN — Feedback Loop design layer (garden.css)
   Assembled by garden/assemble.py: parlor.css core (structure + legibility)
   + garden fragments A–D. Edit the FRAGMENTS, then re-run the assembler.
   ═══════════════════════════════════════════════════════════════════════════ */
/* ── CORE (parlor.css, verbatim) ───────────────────────────────────────── */
/* ═══════════════════════════════════════════════════════════════════════════
   parlor.css — THE PARLOR (FL_PERSONA, chosen by the owner 2026-08-16)

   "A lamplit room, not an app screen."

   Feedback Loop asks people to say the hardest true things, so the product is
   dressed like the room where you'd actually say them: a deep velvet dark, one
   warm lamp falling across sheets of lit paper, and type set at the scale of a
   voice that leans in rather than a UI that announces.

   THE SYSTEM
   • THE ROOM   — var(--canvas): velvet, napped, with the lamp falling from the
                  top right. Everything ambient lives here.
   • THE PAPER  — var(--sheet): lamplit stock with real fibre, a warm gradient
                  and a letterpress bite. Everything you WORK on lives here.
   • THE LAMP   — var(--a1): brass. The only thing that glows: primary buttons,
                  focus, the accent rule, the eyes' catchlight.
   • THE INK    — var(--ink)/--body/--muted: walnut, steeped tea, cocoa shadow.
   Six palettes become SIX ROOMS — the upholstery and the shade of the lamp
   change, the system does not.

   TYPE   Young Serif (display) · Instrument Serif Italic (the voice) ·
          Karla 200–800 (every control, every row, every label).
   They are declared under the family names the app already asks for, so the
   app's thousands of inline styles pick them up untouched.

   REVERT  FL_PERSONA=0 rebuilds the pre-persona bundle byte-for-byte, and
           releases/pre-persona-2026-08-16/ holds the live files.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 1. The voices ──────────────────────────────────────────────────────── */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* the aliases: the app asks for these three names everywhere */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */
/* [stripped by garden/core-strip.json] */

/* Young Serif is one weight by design — never let the browser fake a bolder
   one, and never let the app's inherited 'opsz'/SOFT/WONK settings apply to a
   face that has no such axes. */
/* [stripped by garden/core-strip.json] */

/* ═══════════════════════════════════════════════════════════════════════════
   rooms.css — SIX ROOMS, NOT SIX HUES

   The complaint was fair: every room was the same recipe — dark velvet, warm
   cream paper, brass lamp — so they could only differ by hue, and two of them
   (the Rose Room and the Parlour) landed on nearly the same hue.

   This replaces the recipe with six. Each room varies THREE things, not one:

     ROOM (the velvet)      what colour the dark is
     LAMP (--a1 / --cta)    brass · verdigris · bole · rose-gold · amber · moon
     PAPER (--sheet)        warm cream · cool bone · green ivory · blush ·
                            dark walnut · dark slate

   FOUR rooms keep the signature structure: a dark room, and LIT PAPER you work
   on. TWO are true dark themes — the working surface itself is dark, the inks
   are light, and --p-shade DARKENS the paper's far edge instead of warming it.

   Every ratio below is computed (WCAG relative luminance, sRGB compositing,
   oklab color-mix), never eyeballed. See roomcheck.py; the full table is in the
   handover. Floors held in all six rooms:
     ink/sheet ≥7 · body,muted/sheet ≥4.5 · a1Text,a2Text,a3Text/sheet ≥4.5
     ctaText/cta ≥4.5 · onCanvas/canvas ≥7 · onCanvasBody/canvas ≥4.5
     onCanvasMuted/canvas ≥3 · warmText/warm ≥4.5 · logo,eye/sheet AND /canvas ≥3
     a1/sheet ≥3 · rule/sheet ≥1.35 · plus parlor.css's own derived invariants
     (--p-ring ≥3 on sheet/canvas/velvet/tint1/tint2, --ctaText ≥4.5 on both
     button-face stops, --p-quiet ≥4.5 on both chip stops).

   The KEYS never change — they are stored in user accounts. Only the colours
   and the room names moved.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── The lit edge ──────────────────────────────────────────────────────────
   parlor.css builds the paper with
     radial-gradient(… color-mix(--sheet 88%, white) … --sheet … color-mix(--sheet 88%, --p-shade))
   That hardcoded `white` is the last thing standing between this system and a
   dark working surface: 12% white on dark paper is a grey fog, not a lamp.
   Each room now names the colour its paper is lit BY. Light rooms name a warm
   or cool white; dark rooms name a pale lamp-tint, so the lit edge glows warm
   instead of going grey. parlor.css reads --p-lit-mix; this redefinition of
   --p-paper-lit means the file also works unchanged against today's build. */
:root {
  --p-lit-mix: #FFFFFF;
  --p-paper-lit:
    radial-gradient(120% 90% at 22% -8%,
      color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix, white)) 0%,
      var(--sheet) 44%,
      color-mix(in oklab, var(--sheet) 88%, var(--p-shade)) 100%);
}

/* ═══ 1 · THE PARLOUR ══════════════════════════════════════════════════════
   Aubergine velvet, a brass lamp, warm cream paper. The house room: the one
   the product was drawn for. Purple and gold, and unapologetic about it. */
[data-palette="amethyst-night"] {
  --canvas: #24122C;  --velvet: #3D1D49;
  --sheet: #FBEAD1;   --p-shade: #C7A67C;  --p-lit-mix: #FFF8E8;
  --ink: #2B1410;     --body: #5A362A;  --muted: #795443;
  --a1: #AF7318;      --a2: #B2496A;    --a3: #6C7A53;
  --a1Text: #815310;  --a2Text: #953A55; --a3Text: #4E5B39;
  --a1OnCanvas: #E7B863;
  --tint1: #F6E2BE;   --tint2: #F3E0DC;
  --rule: #DEC298;    --ruleStrong: #C7A67C;
  --cta: #C9922F;     --ctaText: #2B1108;
  --onCanvas: #F9EAD7; --onCanvasBody: #E2CEB9; --onCanvasMuted: #B79D8C;
  --logo: #A0741F;    --eye: #A0741F;   --logoSoft: #C9922F;
  --pupil: #2B1410;   --cheek: #B2496A; --glint: #F6DFBC; --spark: #E3B463;
  --stampInk: #953A55; --warm: #A63E5D; --warmDeep: #8A2E4A; --warmText: #FFF1EA;
  --catL: .47; --catC: .13; --catText: #FFF7EF;
}

/* ═══ 2 · THE HARBOUR OFFICE ═══════════════════════════════════════════════
   Cold slate-navy walls, an oxidised-copper lamp, and COOL BONE paper — a
   grey-white sheet with graphite ink instead of walnut. Nothing in this room
   is warm except one rust buoy. The opposite temperature to the Parlour. */
[data-palette="harbor"] {
  --canvas: #0E1A25;  --velvet: #1A2E3E;
  --sheet: #EEEDE6;   --p-shade: #A6ABA2;  --p-lit-mix: #FFFFFF;
  --ink: #151E24;     --body: #3D4A54;  --muted: #58646D;
  --a1: #2E8577;      --a2: #B4551F;    --a3: #3B5F86;
  --a1Text: #1E6A5D;  --a2Text: #8E3F14; --a3Text: #31506F;
  --a1OnCanvas: #5FC3AD;
  --tint1: #E1E7E1;   --tint2: #E2E6EB;
  --rule: #C6CABF;    --ruleStrong: #A6ABA2;
  --cta: #1B6E60;     --ctaText: #F2FBF7;
  --onCanvas: #E9EEEF; --onCanvasBody: #BFCAD0; --onCanvasMuted: #91A0A9;
  --logo: #2E8577;    --eye: #B4551F;   --logoSoft: #4FA593;
  --pupil: #0E1A25;   --cheek: #C0705A; --glint: #DCEDE8; --spark: #5FC3AD;
  --stampInk: #8E3F14; --warm: #A34A18; --warmDeep: #82370F; --warmText: #FFF3EA;
  --catL: .47; --catC: .13; --catText: #FFFFFF;
}

/* ═══ 3 · THE GARDEN ROOM ══════════════════════════════════════════════════
   Bottle-green walls after dark, a terracotta lamp, and GREENISH IVORY paper
   with olive ink. The lamp is the complement of the room, so this is the one
   room where the light and the walls argue — which is what makes it read at
   thumbnail size from three feet away. */
/* the default room for every new visitor (owner 2026-08-17): the app stamps
   data-palette pre-paint, static pages fall back to :root */
:root:not([data-palette]), [data-palette="meadow"] {
  --canvas: #0F1D16;  --velvet: #193020;
  --sheet: #F0F0D5;   --p-shade: #AFB582;  --p-lit-mix: #FCFFEA;
  --ink: #1E2415;     --body: #444C32;  --muted: #586140;   /* 5.67 on sheet, 4.90 on tint (was #636D4A: 4.44 on the lamp rim) */
  --a1: #A04630;      --a2: #3B6742;    --a3: #86671F;
  --a1Text: #8A3A24;  --a2Text: #315636; --a3Text: #6A5115;
  --a1OnCanvas: #EA9C80;
  --tint1: #E8EABC;   --tint2: #DDE8D0;
  --rule: #C8CB9C;    --ruleStrong: #AFB582;
  --cta: #92402B;     --ctaText: #FFF0E6;
  --onCanvas: #ECF1D9; --onCanvasBody: #C6D1B2; --onCanvasMuted: #96A484;
  --logo: #AB4F35;    --eye: #4E8A5C;   --logoSoft: #C06A4E;
  --pupil: #0F1D16;   --cheek: #B5764F; --glint: #EAEBBE; --spark: #EA9C80;
  --stampInk: #315636; --warm: #9A4322; --warmDeep: #7E3418; --warmText: #FFF2E7;
  --catL: .47; --catC: .13; --catText: #FFF8F2;
}

/* ═══ 4 · THE ROSE ROOM ════════════════════════════════════════════════════
   Rosewood, not aubergine: a warm brown-red room, lighter and softer than the
   others, with a ROSE-GOLD lamp and BLUSH paper. Where the Parlour is purple
   over cream, this is cocoa over pink — the two the owner called identical now
   share neither the wall, the lamp, nor the stock. */
[data-palette="blush-study"] {
  --canvas: #331F1E;  --velvet: #452A28;
  --sheet: #FCE9E2;   --p-shade: #D3A497;  --p-lit-mix: #FFF6F2;
  --ink: #301718;     --body: #653838;  --muted: #7F4F4D;   /* 5.72 on sheet, 4.87 on tint (was #895654: 4.33 on tint) */
  --a1: #B5654E;      --a2: #8E4B72;    --a3: #6F7A57;
  --a1Text: #93452F;  --a2Text: #763B5D; --a3Text: #525C3C;
  --a1OnCanvas: #F2AC93;
  --tint1: #F8DCD3;   --tint2: #F3E1E7;
  --rule: #E1BBAF;    --ruleStrong: #D3A497;
  --cta: #A04A34;     --ctaText: #FFF1E8;
  --onCanvas: #FAE6DF; --onCanvasBody: #DFC0B7; --onCanvasMuted: #B4928A;
  --logo: #B5654E;    --eye: #AC5686;   --logoSoft: #C97D63;
  --pupil: #301718;   --cheek: #C1544B; --glint: #F7DED2; --spark: #F2AC93;
  --stampInk: #763B5D; --warm: #A8443C; --warmDeep: #8A322F; --warmText: #FFF2EA;
  --catL: .47; --catC: .13; --catText: #FFF7F3;
}

/* ═══ 5 · THE LATE STUDY ═══ DARK ══════════════════════════════════════════
   One in the morning, one amber lamp, and the desk itself is dark: the working
   surface is walnut blotter, the ink is chalk and warm bone. Nothing on this
   screen is bright except the lamp, which is the point — the room does not
   flash at you when you open it at night.                     [dark theme 1/2] */
[data-palette="ember"] {
  --canvas: #120E0B;  --velvet: #201811;
  --sheet: #2A211A;   --p-shade: #0C0805;  --p-lit-mix: #E9C89C;
  --ink: #F4E9D7;     --body: #CEBDA5;  --muted: #A6957D;
  --a1: #E09A3C;      --a2: #D97A55;    --a3: #C9AE5E;
  --a1Text: #F0B466;  --a2Text: #E89A78; --a3Text: #D6BC74;
  --a1OnCanvas: #EDA24A;
  --tint1: #3B2F24;   --tint2: #38322B;
  --rule: #4A3D30;    --ruleStrong: #61503F;
  --cta: #E09A3C;     --ctaText: #231404;
  --onCanvas: #F5EAD9; --onCanvasBody: #D4C3AB; --onCanvasMuted: #A08F79;
  --logo: #F0B466;    --eye: #F0B466;   --logoSoft: #E09A3C;
  --pupil: #120E0B;   --cheek: #D97A55; --glint: #FFEFD9; --spark: #EFC46E;
  --stampInk: #E89A78; --warm: #D9764E; --warmDeep: #EC9A72; --warmText: #2A1206;
  --catL: .78; --catC: .12; --catText: #1A1207;
}

/* ═══ 6 · THE BLUE HOUR ═══ DARK ═══════════════════════════════════════════
   The last blue light of the evening, held. Indigo-black room, a dark slate
   working surface, a MOONLIGHT lamp — pale steel-blue, the only cool lamp in
   the set — with a single warm gold kept back for stamps and status, so the
   room has one thing in it that is not blue.                  [dark theme 2/2] */
[data-palette="midnight"] {
  --canvas: #0B0F1D;  --velvet: #171D34;
  --sheet: #1C2233;   --p-shade: #070A12;  --p-lit-mix: #CCD9EF;
  --ink: #E8EEF8;     --body: #B9C6D9;  --muted: #94A2B9;
  --a1: #8FAAD0;      --a2: #D2A65E;    --a3: #79B39A;
  --a1Text: #B0C5E3;  --a2Text: #DEB878; --a3Text: #8FC3AC;
  --a1OnCanvas: #B7CCE9;
  --tint1: #293044;   --tint2: #263140;
  --rule: #39435C;    --ruleStrong: #4E5A76;
  --cta: #93B0D6;     --ctaText: #0D1424;
  --onCanvas: #E9EFF9; --onCanvasBody: #C0CBDD; --onCanvasMuted: #8E9BB0;
  --logo: #B0C5E3;    --eye: #B0C5E3;   --logoSoft: #8FAAD0;
  --pupil: #0B0F1D;   --cheek: #C98B8B; --glint: #EAF1FB; --spark: #DEB878;
  --stampInk: #DEB878; --warm: #C98A73; --warmDeep: #DFA98F; --warmText: #1A1410;
  --catL: .78; --catC: .12; --catText: #101624;
}

/* ── Shared material tokens (the six rooms above only carry colour) ────────
   NOTE: these were lost once when the rooms were spliced in and the paper
   silently lost its fibre — tests/t_persona.mjs now asserts they exist. */
:root {
  --p-grain: url(patterns/grain-parlor.png);
  --p-press: 0 1px 0 rgba(255, 255, 255, .70), 0 -1px 0 rgba(66, 28, 18, .18);
  --p-hair: inset 0 0 0 1px color-mix(in oklab, var(--ink) 13%, transparent);
  --p-rad: 16px;
  --p-shadow: 0 1px 0 color-mix(in oklab, var(--ink) 6%, transparent),
              0 10px 24px -14px color-mix(in oklab, var(--ink) 10%, transparent),
              0 16px 42px -10px var(--boxGlow, transparent);
}

/* ── 3. The room itself ─────────────────────────────────────────────────── */
/* One lamp, top right; velvet nap; a vertical sheen. The doodle wallpaper is
   retired here — the room IS the wallpaper. */
:root { --wall: none; }
.fl-root {
  background-color: var(--canvas) !important;
  background-image:
    radial-gradient(1100px 780px at 88% -12%, color-mix(in oklab, var(--a1) 30%, transparent) 0%, transparent 62%),
    radial-gradient(900px 700px at 8% 108%, color-mix(in oklab, var(--velvet, var(--canvas)) 90%, white 6%) 0%, transparent 58%),
    repeating-linear-gradient(90deg, rgba(255, 232, 205, .028) 0 1px, rgba(0, 0, 0, 0) 1px 5px),
    linear-gradient(168deg, var(--velvet, var(--canvas)) 0%, var(--canvas) 58%),
    var(--p-grain) !important;
  background-size: auto, auto, auto, auto, 128px 128px !important;
  background-repeat: no-repeat, no-repeat, repeat, no-repeat, repeat !important;
  background-attachment: fixed, fixed, scroll, fixed, scroll !important;
}
/* text that sits directly on the velvet */
.fl-root > *:not([style*="var(--sheet)"]) .fl-logo,
.fl-hero-logo { color: var(--onCanvas); }

/* ── 4. The paper ───────────────────────────────────────────────────────── */
/* Anything the app paints with --sheet becomes lit stock: a warm gradient
   toward the lamp, real fibre, and a hairline instead of a hard border. */
[style*="background: var(--sheet)"],
[style*="background-color: var(--sheet)"],
.ui-card, .v2-loop, .v2-com__card, .v2-ph, .card {
  background-image: var(--p-paper-lit), var(--p-grain) !important;
  background-size: auto, 128px 128px !important;
  background-blend-mode: normal, multiply !important;
}
/* the main working panel: paper on velvet, lit from the top right */
[style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
  background-image:
    radial-gradient(1200px 820px at 92% -6%, color-mix(in oklab, var(--sheet) 84%, white) 0%, transparent 58%),
    var(--p-paper-lit),
    var(--p-grain) !important;
  background-size: auto, auto, 128px 128px !important;
  background-blend-mode: normal, normal, multiply !important;
  box-shadow: 0 30px 60px -30px rgba(0, 0, 0, .9), var(--p-hair) !important;
  border-radius: 18px !important;
}
/* cards keep the box-glow law, but the glow is now lamplight under the sheet */
.ui-card, .v2-com__card, .v2-ph, .card,
[style*="border-radius: 12px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
[style*="border-radius: 14px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
[style*="border-radius: 16px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
[style*="border-radius: 16px"][style*="border: 1.5px solid"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]):not([style*="box-shadow: inset"]) {
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  box-shadow: var(--p-hair), 0 2px 1px -1px rgba(74, 42, 20, .10), 0 16px 26px -20px rgba(48, 22, 10, .85), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  background-color: color-mix(in oklab, var(--sheet) 93%, var(--p-shade)) !important;
}

/* ── 5. Ink: letterpress on paper, lamplight on velvet ──────────────────── */
[style*="font-family: Fraunces"], [style*="font-family:Fraunces"],
.v2-sent, .v2-lead, .fl-hero-line { text-shadow: var(--p-press); }
/* the biggest titles carry a whisper of ember-rose ink, one plate off */
[style*='font-size: 26px; font-variation-settings: "opsz" 48'],
[style*='font-size: 28px; font-variation-settings: "opsz" 48'] {
  text-shadow: var(--p-press), 1.6px 1.6px 0 color-mix(in oklab, var(--a2) 42%, transparent);
}
/* the rotating hero line is the voice: Instrument Serif italic, not display */
.fl-hero-line {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: clamp(26px, 3.4vw, 38px) !important;
  line-height: 1.24 !important;
  letter-spacing: -.005em !important;
  color: var(--a1Text) !important;
}
/* kickers and labels: Karla, wide, quiet — never a terminal tag */
[style*='"IBM Plex Mono"'][style*="letter-spacing"], .kicker, .stamp,
[style*="'IBM Plex Mono'"][style*="letter-spacing"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  letter-spacing: .2em !important;
}
/* Karla's 400 sets lighter than Public Sans' — one notch up for prose only */
:is([style^="font: 400 12"], [style*="; font: 400 12"], [style^="font: 400 13"], [style*="; font: 400 13"],
    [style^="font: 400 14"], [style*="; font: 400 14"], [style^="font: 400 11"], [style*="; font: 400 11"]):not(input):not(textarea):not(select) {
  font-weight: 500 !important;
}

/* ── 6. The lamp: brass controls ────────────────────────────────────────── */
button.fl-btn[style*="background: var(--a1)"],
button.fl-btn[style*="background: var(--cta)"],
button.fl-btn[style*="background:var(--a1)"] {
  background-image: linear-gradient(176deg, color-mix(in oklab, var(--cta) 78%, white) 0%, var(--cta) 56%, color-mix(in oklab, var(--cta) 76%, black) 100%) !important;
  box-shadow: 0 1px 0 rgba(255, 240, 214, .55) inset, 0 -2px 0 rgba(84, 48, 8, .30) inset,
              0 14px 26px -14px color-mix(in oklab, var(--cta) 85%, transparent) !important;
  border-radius: 13px !important;
}
/* .fl-primary (auth modal Continue, etc.) pairs --ctaText with an --a1 fill in
   the bundle; in three rooms that is dark ink on mid brass (3.85:1). It is a
   primary control: the same --cta lamp as every other primary. */
button.fl-primary {
  background: var(--cta) !important;
  background-image: linear-gradient(176deg, color-mix(in oklab, var(--cta) 78%, white) 0%, var(--cta) 56%, color-mix(in oklab, var(--cta) 76%, black) 100%) !important;
  color: var(--ctaText) !important;
  box-shadow: 0 1px 0 rgba(255, 240, 214, .55) inset, 0 -2px 0 rgba(84, 48, 8, .30) inset,
              0 14px 26px -14px color-mix(in oklab, var(--cta) 85%, transparent) !important;
}
button.fl-btn { border-radius: 13px !important; transition: transform .16s ease, filter .16s ease, box-shadow .16s ease !important; }
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  button.fl-btn[style*="background: var(--a1)"]:hover:not(:disabled),
  button.fl-btn[style*="background: var(--cta)"]:hover:not(:disabled) { filter: brightness(1.06); transform: translateY(-1px); }
  button.fl-btn:active:not(:disabled) { transform: translateY(0) scale(.99); }
}
/* the round submit is a brass knob */
.v2-go, [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  background-image: radial-gradient(120% 120% at 32% 22%, color-mix(in oklab, var(--cta) 72%, white), var(--cta) 58%, color-mix(in oklab, var(--cta) 70%, black)) !important;
  box-shadow: 0 1px 0 rgba(255, 244, 220, .6) inset, 0 10px 20px -10px rgba(0, 0, 0, .85) !important;
}
/* the big ask field is a brass tray */
.v2-ask, [style*="border-radius: 999px"][style*="border: 1.5px solid"][style*="background: var(--sheet)"] {
  background-image: linear-gradient(180deg, color-mix(in oklab, var(--sheet) 90%, white), color-mix(in oklab, var(--sheet) 86%, var(--p-shade))) !important;
  box-shadow: 0 1px 0 rgba(255, 255, 255, .85) inset, 0 -1px 0 rgba(120, 74, 40, .16) inset,
              0 0 0 1.5px color-mix(in oklab, var(--a1) 52%, transparent), 0 26px 44px -26px rgba(0, 0, 0, .8) !important;
  border-color: transparent !important;
}

/* the hero's ask field is a pill and stays one — inner and outer agree */
.v2-ask input, .v2-ask[data-sec="hero-ask"] input { border-radius: 999px !important; }
.v2-ask, .v2-ask[data-sec="hero-ask"] { border-radius: 999px; }

/* ── 7. Inputs, chips, focus ────────────────────────────────────────────── */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(.v2-ask input), textarea, select {
  border-radius: 13px !important;
  background-image: linear-gradient(180deg, color-mix(in oklab, var(--sheet) 92%, white), color-mix(in oklab, var(--sheet) 94%, var(--p-shade))) !important;
}
:where(input, textarea, select, button, a, [tabindex]):focus-visible {
  outline: 3px solid color-mix(in oklab, var(--a1) 78%, transparent) !important;
  outline-offset: 2px !important;
}
::selection { background: color-mix(in oklab, var(--a1) 34%, var(--sheet)); color: var(--ink); }
.ui-chip, [style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:not(button):not(.fl-btn) {
  box-shadow: inset 0 0 0 1.3px color-mix(in oklab, var(--ink) 18%, transparent) !important;
  border-color: transparent !important;
}

/* ── 8. Rules and dividers: a brass hairline, not a grey line ───────────── */
[style*="border-top: 1px solid var(--rule)"], hr {
  border-top-color: transparent !important;
  background-image: linear-gradient(90deg, color-mix(in oklab, var(--a1) 55%, transparent) 0%, color-mix(in oklab, var(--a1) 22%, transparent) 58%, transparent 100%);
  background-size: 100% 1px; background-repeat: no-repeat; background-position: left top;
}

/* ── 9. On the velvet: the bottom bar and the utility rail ──────────────── */
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] {
  background: color-mix(in oklab, var(--velvet, var(--canvas)) 82%, transparent) !important;
  border-top: 1px solid color-mix(in oklab, var(--a1) 30%, transparent) !important;
  backdrop-filter: blur(16px) saturate(1.1) !important;
}
/* the bar is upholstery: the items sit ON it, they are not paper chips stuck to
   it. Transparent + cream reads at 8:1; the active item is the lit one. */
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
  background: transparent !important;
  border-color: transparent !important;
  box-shadow: none !important;
  color: var(--onCanvasBody) !important;
}
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn svg { color: var(--onCanvasBody) !important; }
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] {
  background-image: linear-gradient(176deg, color-mix(in oklab, var(--cta) 78%, white), var(--cta) 60%) !important;
  color: var(--ctaText) !important;
  box-shadow: 0 1px 0 rgba(255, 240, 214, .5) inset, 0 10px 20px -12px color-mix(in oklab, var(--cta) 90%, transparent) !important;
}
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"] svg,
[style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] svg { color: var(--ctaText) !important; }

/* ── 10. Motion: the lamp comes up once, then holds ─────────────────────── */
@keyframes p-lamp { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: no-preference) {
  [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) { animation: p-lamp .5s cubic-bezier(.2, .7, .3, 1) backwards; }
}

/* ── 11. Scrollbars and small print ─────────────────────────────────────── */
* { scrollbar-width: thin; scrollbar-color: color-mix(in oklab, var(--a1) 45%, var(--rule)) transparent; }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb { background: color-mix(in oklab, var(--a1) 45%, var(--rule)); border-radius: 999px; border: 3px solid transparent; background-clip: content-box; }

/* ── 12. LEGIBILITY LAW (found by tests/design-review.py, 2026-08-16) ────────
   Three systemic failures, fixed at the source rather than case by case:
   a) The app paints nav labels and small print with --onCanvas* because it
      assumes they sit on the dark field. In this design those chips are PAPER,
      so cream-on-cream rendered at 1.28:1. On paper, on-canvas ink becomes
      real ink.
   b) --a1 is used as a TEXT colour inline in dozens of places. Brass is a
      LAMP, not an ink: at text sizes it must fall back to its AA-safe twin.
   c) --glint / --logoSoft are highlights meant for a dark ground; on paper the
      wordmark's eyes disappeared (1.11:1). They get an ink-side value.
   Every rule here is measured, not eyeballed — re-run the review after edits. */
[style*="color: var(--onCanvas)"],  [style*="color:var(--onCanvas)"],
[style*="color: var(--onCanvasBody)"], [style*="color:var(--onCanvasBody)"],
[style*="color: var(--onCanvasMuted)"], [style*="color:var(--onCanvasMuted)"] { color: var(--body) !important; }
/* …but NOT on the velvet band (account/profile header): there the surface IS
   the canvas, so the onCanvas inks are the right inks (measured 1.5:1 as body
   ink on velvet, 2026-08-17). */
.fl-root [style*="background-color: var(--brand"] [style*="color: var(--onCanvas)"],
.fl-root [style*="background-color: var(--brand"] [style*="color:var(--onCanvas)"] { color: var(--onCanvas) !important; }
.fl-root [style*="background-color: var(--brand"] [style*="color: var(--onCanvasBody)"],
.fl-root [style*="background-color: var(--brand"] [style*="color:var(--onCanvasBody)"] { color: var(--onCanvasBody) !important; }
.fl-root [style*="background-color: var(--brand"] [style*="color: var(--onCanvasMuted)"],
.fl-root [style*="background-color: var(--brand"] [style*="color:var(--onCanvasMuted)"] { color: var(--onCanvasBody) !important; }
/* the nav rail's icons inherit that colour as currentColor — follow it */
[style*="var(--onCanvasBody)"] svg [stroke="currentColor"],
[style*="var(--onCanvasBody)"] svg { color: var(--body) !important; }
[style*="background: var(--sheet)"] [style*="color: var(--onCanvas)"],
[style*="background: var(--sheet)"] [style*="color: var(--onCanvasBody)"] { color: var(--ink) !important; }
/* brass is a lamp, not an ink */
[style*="color: var(--a1)"]:not(button) { color: var(--a1Text) !important; }
[style*="color:var(--a1)"]:not(button)  { color: var(--a1Text) !important; }
[style*="color: var(--a2)"]:not(button) { color: var(--a2Text) !important; }
[style*="color: var(--a3)"]:not(button) { color: var(--a3Text) !important; }
/* the wordmark and the feeling faces must read on paper */



.fl-logo, .fl-hero-logo, .v2-ob__face, .fl-cere__face, .fl-ab-fig { color: var(--a1Text); }
/* placeholder and the typed topic are content, not decoration */
.fl-blankin, .fl-pencil-in, input, textarea { color: var(--ink) !important; }
.fl-blankin::placeholder, input::placeholder, textarea::placeholder { color: color-mix(in oklab, var(--muted) 88%, var(--ink)) !important; opacity: 1; }

/* ── 13. The explainer column is content, so it gets paper ─────────────────
   The respondent / survey / recipient previews put their explainer column
   (.fl-pv-panel) straight onto the field. That was fine when the field was
   pale; on velvet it measured 1.03:1 — invisible. Content belongs on paper.
   (The class is .fl-pv-panel — the app hides it on small screens with
   display:none!important, which this must not fight.) Found by the review. */
.fl-pv-panel:not([style*="display: none"]) {
  background-color: var(--sheet);
  background-image: var(--p-paper-lit), var(--p-grain);
  background-size: auto, 128px 128px;
  background-blend-mode: normal, multiply;
  border-radius: var(--p-rad);
  padding: 22px 20px;
  box-shadow: var(--p-hair), 0 18px 34px -26px rgba(0, 0, 0, .8), 0 16px 42px -10px var(--boxGlow, transparent);
}
.fl-pv-title { color: var(--ink) !important; }
.fl-pv-sub, .fl-pv-cs { color: var(--body) !important; }
.fl-pv-ct { color: var(--ink) !important; }
.fl-pv-klabel { color: var(--a1Text) !important; }
/* a ghost button's brass label sits on paper: use the AA-safe twin */
.fl-btn[style*="color: var(--a1)"], .fl-btn[style*="color:var(--a1)"] { color: var(--a1Text) !important; }
/* --ctaText is the ink for text ON a lit button. Anywhere else it is paper on
   paper (measured 1.03:1 in the Rose Room). Ink by default; cream only inside
   a lit control. */
[stroke="var(--ctaText)"] { stroke: var(--ink); }
[fill="var(--ctaText)"]   { fill: var(--ink); }
button[style*="background: var(--a1)"] [stroke="var(--ctaText)"],
button[style*="background: var(--cta)"] [stroke="var(--ctaText)"],
button[style*="background: var(--a1)"] [fill="var(--ctaText)"],
button[style*="background: var(--cta)"] [fill="var(--ctaText)"] { stroke: var(--ctaText); fill: var(--ctaText); }
/* ── 14. palettes.css lightens --warm text for its two DARK-sheet palettes.
   In this design ember and midnight are rooms with LIGHT paper, so that
   override became 1.42:1 on paper and 2.5:1 on a rust badge. Put it back on
   the ink side, and make sure any label on a warm fill uses the warm ink. */
[data-palette="ember"] [style*="color:var(--warm"],
[data-palette="ember"] [style*="color: var(--warm"],
[data-palette="midnight"] [style*="color:var(--warm"],
[data-palette="midnight"] [style*="color: var(--warm"] { color: var(--a2Text) !important; }
[style*="background: var(--warm)"], [style*="background:var(--warm)"],
[style*="background: var(--warmDeep)"], [style*="background:var(--warmDeep)"] { color: var(--warmText) !important; }
[style*="background: var(--warm)"] *, [style*="background:var(--warm)"] *,
[style*="background: var(--warmDeep)"] *, [style*="background:var(--warmDeep)"] * { color: var(--warmText) !important; }
/* the drawn faces are characters, not watermarks — they must read on paper */


/* [stripped by garden/core-strip.json] */
/* ── 15. palettes.css repaints the wordmark and the drawn faces pale for its
   two dark-sheet palettes. Those palettes are now rooms with LIGHT paper, so
   the mark measured 1.2:1. Take the ink side back for ember and midnight. */
[data-palette="ember"] .fl-logo, [data-palette="ember"] .fl-hero-logo,
[data-palette="ember"] .fl-cere__face, [data-palette="ember"] .v2-ob__face, [data-palette="ember"] .fl-ab-fig,
[data-palette="midnight"] .fl-logo, [data-palette="midnight"] .fl-hero-logo,
[data-palette="midnight"] .fl-cere__face, [data-palette="midnight"] .v2-ob__face, [data-palette="midnight"] .fl-ab-fig {
  color: var(--a1Text) !important;
}


/* the About figures are drawn on a tint disc — the strokes must be ink, and
   the disc must stay lighter than them in every room */
.fl-ab-fig, .fl-ab-figL { background: color-mix(in oklab, var(--sheet) 88%, var(--a1)) !important; border-color: color-mix(in oklab, var(--a1) 34%, transparent) !important; }



/* every lit control carries ink that clears AA on its own fill, in every room */
button.fl-btn[style*="background: var(--a1)"], button.fl-btn[style*="background:var(--a1)"],
button.fl-btn[style*="background: var(--cta)"], button.fl-btn[style*="background:var(--cta)"] {
  color: var(--ctaText) !important;
  background-color: var(--cta) !important;
}
/* the unread dot / small status marks in the Blue Hour were painted with the
   palette's pale rose; on paper that is 1.5:1. Status marks use warm ink. */



/* ══════════════════════════════════════════════════════════════════════
   THE PARLOR · CRAFT — from the 52-site study (see built-inventory)
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   frag-craft.css — THE CRAFT LAYER
   Buttons · inputs · chips & badges · the paper itself · motion.

   Loads AFTER parlor.css. Presentation only: no copy, no behaviour, no new UI.
   Every colour is a token or a color-mix of tokens, so all six rooms follow.
   Contrast for every ink/ground pair below was COMPUTED in all six rooms
   (see the numbers in the comments; floor 4.5:1 body / 3:1 non-text).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 0. THE MOTION CONTRACT ─────────────────────────────────────────────────
   Duration by intent, one easing family. Nothing in this file invents a
   number outside this set. (Emil Kowalski's rules: proportional, interruptible,
   hover is a transition — never a keyframe.) */
.fl-root {
  --p-t-press: 70ms;    /* pointer-down: instant compression */
  --p-t-hover: 180ms;   /* pointer state: reversible mid-flight */
  --p-t-page: 720ms;    /* a whole sheet */
  --p-e-out: cubic-bezier(.2, .7, .3, 1);
  --p-e-inout: cubic-bezier(.65, 0, .35, 1);

  /* the ink is PRESSED INTO the paper, not embossed on top of it.
     A white top-highlight + dark bottom (the old --p-press) reads as a plastic
     bevel at text sizes and is a big part of why the last pass looked like a
     recolour. This is the ink-spread of a letterpress plate biting damp stock:
     it is drawn in currentColor, so it can only ever RAISE contrast, in every
     room, at every size, with no palette variants. */
  --p-press:
    .012em .012em 0 currentColor,
   -.008em .008em 0 currentColor,
    .008em -.008em 0 currentColor;

  /* the brass face. Shallow on purpose: --ctaText must clear 4.5:1 on EVERY
     stop, and a deep gradient breaks it (the shipped 76%-black stop measures
     2.59:1 in the Hearth). The depth lives in the plinth below the face, where
     no text sits. Measured on these stops, --ctaText scores:
       hi 6.98 / 6.79 / 5.70 / 5.68 / 5.90   mid 6.44 / 6.22 / 5.15 / 5.12 / 5.32
       lo 5.79 / 5.60 / 4.65 / 4.63 / 4.81   (parlor·library·conservatory·hearth·blue hour) */
  --p-face-hi: color-mix(in oklab, var(--cta) 93%, white);
  --p-face-lo: color-mix(in oklab, var(--cta) 96%, black);
  --p-plinth: color-mix(in oklab, var(--cta) 50%, black);

  /* paper stocks, all ≤8% off --sheet so the ink budget never moves far */
  --p-key-hi: color-mix(in oklab, var(--sheet) 97%, white);
  --p-key-lo: color-mix(in oklab, var(--sheet) 92%, var(--p-shade));
  --p-well-top: color-mix(in oklab, var(--sheet) 93%, var(--p-shade));
  --p-well-bot: color-mix(in oklab, var(--sheet) 99%, white);
  /* THE QUIET INK. --muted is the app's colour for secondary labels on
     controls, and it is not safe there: measured against the darkest stop of
     parlor's own --p-paper-lit it is 4.37 (Blue Hour) and 4.40 (Conservatory),
     and on a card ground 4.50 / 4.53 — under the 4.5 floor at the 10.5–12.5px
     sizes these labels use. One step toward the ink fixes it everywhere
     (5.73–7.02) while staying clearly quieter than --body. */
  --p-quiet: color-mix(in oklab, var(--muted) 78%, var(--ink));
}
/* THE ROSE ROOM runs its brass dark, because it is the one room whose --ctaText
   is cream (#FFF1E6) instead of near-black: a light face drops the label to
   3.51:1, which is exactly what parlor's bottom-bar gradient does today.
   Measured on the live token (#9E4630): hi 6.95, lo 7.89 — and still 5.07 /
   5.88 if --cta ever reverts to the value parlor declares (#B85F45). */
[data-palette="blush-study"] .fl-root {
  --p-face-hi: color-mix(in oklab, var(--cta) 90%, black);
  --p-face-lo: color-mix(in oklab, var(--cta) 82%, black);
  --p-plinth: color-mix(in oklab, var(--cta) 46%, black);
}

/* ═══ 1. THE PAPER ════════════════════════════════════════════════════════ */

/* 1a. THE DECKLE — the working sheet is TORN along its top edge, not cut.
   Three rows of bites at coprime periods (23 / 13 / 7px) and three different
   depths (5.4 / 3.2 / 1.9px): because the periods share no factor, the
   profile does not repeat inside any width the eye can hold, so it reads as
   fibre rather than as a scalloped doily.

   HOW IT IS DRAWN (2026-08-17): NOT as a mask on the sheet. The app renders
   every fixed overlay — onboarding sheet + scrim, confirms, toasts, the ⌘K
   palette, the share dialogs — INSIDE this element, and a mask on it (like a
   filter, or a transform left behind by a filling animation) turns it into a
   stacking context / containing block for all of them: sheets centred on a
   2000px paper instead of the viewport, scrims that stop at the rail, dialogs
   under the phone tab bar. So the sheet keeps its own paint and stays a plain
   positioned box, and the tear is a 6px strip of ROOM laid over its top edge
   on ::before: the strip is masked to the UNION of the bites (the inverse of
   the old intersect-of-keeps), and it is painted with the room's own fixed
   layers, so a bite shows exactly what the velvet behind it shows. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
  --bite-a: radial-gradient(circle at 50% 0%, #000 4.6px, transparent 5.4px);
  --bite-b: radial-gradient(circle at 50% 0%, #000 2.6px, transparent 3.2px);
  --bite-c: radial-gradient(circle at 50% 0%, #000 1.4px, transparent 1.9px);
  position: relative;
  -webkit-mask-image: none !important;
  mask-image: none !important;
  filter: none !important;
  /* the hairline and the shade along the free bottom edge. No outer shadow:
     the old drop-shadow was clipped away by the mask, so the sheet never
     cast one, and any upward bleed would darken the wall just above the tear
     and make the bites read a shade off. */
  box-shadow:
    var(--p-hair),
    inset 0 -14px 22px -20px color-mix(in oklab, var(--p-shade) 90%, var(--ink)) !important;
}
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 6px;
  z-index: 5;
  pointer-events: none;
  /* THE ROOM, RESTATED. Every layer of the room — the nap (soft-light), the
     bloom (color-dodge, its opacity folded into the layer's alpha), the lamp,
     the throw, the bounce, the sheen, the vignette, the velvet and the grain —
     in the same order and blend as §1 THE ROOM paints them, all viewport-
     fixed, so a bite shows exactly the wall behind it. Keep this list in step
     with .fl-root / .fl-root::before / .fl-root::after. */
  background-color: var(--canvas);
  background-image:
    repeating-linear-gradient(103deg, rgba(255, 255, 255, .085) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(13deg, rgba(0, 0, 0, .090) 0 1px, transparent 1px 4px),
    radial-gradient(880px 620px at 89% -10%,
      color-mix(in oklab, var(--a1) calc(46% * var(--p-bloom, .34)), transparent) 0%, transparent 60%),
    radial-gradient(760px 540px at 89% -8%,
      color-mix(in oklab, var(--a1) 56%, transparent) 0%,
      color-mix(in oklab, var(--a1) 22%, transparent) 34%,
      transparent 70%),
    radial-gradient(1600px 1150px at 94% -22%,
      color-mix(in oklab, var(--a1) 12%, transparent) 0%,
      color-mix(in oklab, var(--a1) 4%, transparent) 46%,
      transparent 74%),
    radial-gradient(880px 600px at 4% 112%,
      color-mix(in oklab, var(--velvet, var(--canvas)) 84%, white 12%) 0%, transparent 60%),
    linear-gradient(104deg, transparent 0%, rgba(255, 255, 255, .030) 34%,
      rgba(255, 255, 255, .046) 47%, rgba(255, 255, 255, .012) 60%, transparent 82%),
    radial-gradient(126% 104% at 68% 16%,
      rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, .16) 46%, rgba(0, 0, 0, .38) 74%, rgba(0, 0, 0, .60) 100%),
    linear-gradient(168deg, var(--velvet, var(--canvas)) 0%, var(--canvas) 60%),
    var(--p-grain);
  background-blend-mode: soft-light, soft-light, var(--p-bloom-blend, color-dodge), normal, normal, normal, normal, normal, normal, normal;
  background-size: auto, auto, auto, auto, auto, auto, auto, auto, auto, 128px 128px;
  background-repeat: repeat, repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;
  background-attachment: fixed;
  -webkit-mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  -webkit-mask-size: 23px 100%, 13px 100%, 7px 100%;
  -webkit-mask-position: 7px 0, 3px 0, 0 0;
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
  mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  mask-size: 23px 100%, 13px 100%, 7px 100%;
  mask-position: 7px 0, 3px 0, 0 0;
  mask-repeat: repeat-x, repeat-x, repeat-x;
}
/* the two rooms that run their bloom differently (see .fl-root::before) */
[data-palette="ember"] .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::before { --p-bloom: .62; --p-bloom-blend: overlay; }
[data-palette="blush-study"] .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::before { --p-bloom: .28; }

/* 1b. THE STAGE — on the "what others see" screens the app fills the sheet
   edge to edge with its own canvas-coloured stage (background-color:
   var(--canvas); background-image: var(--wall)). That is not paper; with the
   wallpaper retired it was a flat dark slab with a torn top edge. The stage
   goes clear so the room itself shows through, and the sheet dressing (paint,
   tear, hairline, gutter, curl, desk shadow) steps aside. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea):has(> [style*="background-color: var(--canvas)"][style*="background-image: var(--wall)"]) {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
}
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea):has(> [style*="background-color: var(--canvas)"][style*="background-image: var(--wall)"])::before,
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea):has(> [style*="background-color: var(--canvas)"][style*="background-image: var(--wall)"])::after {
  display: none;
}
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) > [style*="background-color: var(--canvas)"][style*="background-image: var(--wall)"] {
  background-color: transparent !important;
  background-image: none !important;
}

/* 1c. THE GUTTER AND THE CURL — where the sheet meets the desk it darkens along
   the bound edge, and its free bottom edge lifts a hair off the velvet. Painted
   on one overlay so the type underneath keeps its ground. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 4;
  pointer-events: none;
  border-radius: inherit;
  background-image:
    /* the lamp glint, parked off-sheet until arrival sweeps it across */
    linear-gradient(100deg,
      transparent 0 36%,
      color-mix(in oklab, var(--sheet) 40%, white) 50%,
      transparent 64% 100%),
    /* the gutter: a bound edge, shaded toward the spine */
    linear-gradient(90deg,
      color-mix(in oklab, var(--p-shade) 42%, transparent) 0,
      color-mix(in oklab, var(--p-shade) 12%, transparent) 10px,
      transparent 32px),
    /* the curl: the free edge lifting off the desk */
    linear-gradient(0deg,
      color-mix(in oklab, var(--p-shade) 34%, transparent) 0,
      color-mix(in oklab, var(--p-shade) 7%, transparent) 13px,
      transparent 36px),
    /* laid lines — the stock's own fibre, hue-neutral so no room can break */
    repeating-linear-gradient(2deg, rgba(0, 0, 0, .017) 0 1px, transparent 1px 3px);
  background-size: 240% 100%, 100% 100%, 100% 100%, 100% 100%;
  background-position: 220% 0, 0 0, 0 0, 0 0;
  background-repeat: no-repeat, no-repeat, no-repeat, repeat;
  mix-blend-mode: multiply;
}

/* ═══ 2. BUTTONS ══════════════════════════════════════════════════════════ */

/* Shared physics: no iOS grey flash (we have our own press), no sticky hover
   on touch, and a transition list that is reversible mid-flight. */
.fl-root button.fl-btn {
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition:
    transform var(--p-t-hover) var(--p-e-out),
    box-shadow var(--p-t-hover) var(--p-e-out),
    background-color var(--p-t-hover) var(--p-e-out),
    color var(--p-t-hover) var(--p-e-out),
    filter var(--p-t-hover) var(--p-e-out) !important;
}

/* 2a. PRIMARY — brass, standing on a plinth.
   The face is shallow (see the token block); all the depth is the 3px plinth
   underneath, which is what the button travels down INTO when pressed. */
.fl-root button.fl-btn[style*="background: var(--a1)"],
.fl-root button.fl-btn[style*="background: var(--cta)"],
.fl-root button.fl-btn[style*="background:var(--a1)"],
/* the fixed bottom bar's primary, which parlor §9 repaints with a
   mix(cta 78%, white) face — 3.51:1 against cream --ctaText in the Rose Room.
   Same law, same face, everywhere the brass appears. */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] {
  /* two layers: a sheen parked off the right edge, and the face beneath it.
     The sheen is made of --cta mixed toward white, so it is brass catching the
     lamp — never a white gloss, and never a new hue. */
  background-image:
    linear-gradient(104deg, transparent 0 38%, color-mix(in oklab, var(--cta) 62%, white) 50%, transparent 62% 100%),
    linear-gradient(178deg, var(--p-face-hi) 0%, var(--cta) 48%, var(--p-face-lo) 100%) !important;
  background-size: 230% 100%, 100% 100% !important;
  background-position: 200% 0, 0 0 !important;
  background-repeat: no-repeat !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 46%, transparent),
    inset 0 0 0 1px color-mix(in oklab, black 16%, transparent),
    inset 0 -2px 0 color-mix(in oklab, black 18%, transparent),
    0 3px 0 0 var(--p-plinth),
    0 12px 22px -12px color-mix(in oklab, var(--cta) 80%, transparent) !important;
}
/* the round submit is the same object turned on a lathe */
.fl-root .v2-go,
.fl-root [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  background-image: radial-gradient(120% 120% at 34% 20%, var(--p-face-hi), var(--cta) 56%, var(--p-face-lo)) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 50%, transparent),
    inset 0 0 0 1px color-mix(in oklab, black 16%, transparent),
    0 3px 0 0 var(--p-plinth),
    0 14px 22px -12px color-mix(in oklab, var(--cta) 80%, transparent) !important;
}

/* 2b. SECONDARY — a key cut from the same stock as the sheet.
   Lit from the top (the room's one lamp), a hard 1px bottom edge, and a hair-
   line ring instead of a border, so five of them in a row read as five objects
   rather than five outlines. Inks measured on the darkest stop:
   --body 7.5–8.7 · --ink 13.3–14.3 · --a1Text 4.7–5.6 · --warmDeep 5.2–6.1. */
.fl-root button.fl-btn[style*="background: var(--sheet)"],
.fl-root button.fl-btn[style*="background: var(--tint1)"],
.fl-root button.fl-btn[style*="background: var(--tint2)"] {
  background-image: linear-gradient(180deg, var(--p-key-hi) 0%, var(--p-key-lo) 100%) !important;
  border-color: transparent !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 80%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 14%, transparent),
    0 1px 0 color-mix(in oklab, var(--ink) 18%, transparent),
    0 3px 5px -3px color-mix(in oklab, var(--ink) 40%, transparent) !important;
}
/* every --muted label on a control steps to the quiet ink — see the token */
.fl-root button.fl-btn[style*="color: var(--muted)"] { color: var(--p-quiet) !important; }

/* 2c. GHOST — no ground at rest, so its --muted label keeps plain --sheet
   underneath (4.68–5.46, AA). On hover it does not get a box: the ink darkens
   to --body and a brass hairline draws in under the label. */
.fl-root button.fl-btn[style*="background: none"],
.fl-root button.fl-btn[style*="background: transparent"] {
  background-image: linear-gradient(color-mix(in oklab, var(--a1Text) 90%, transparent), color-mix(in oklab, var(--a1Text) 90%, transparent)) !important;
  background-size: 0% 1.5px !important;
  background-position: left calc(100% - 3px) !important;
  background-repeat: no-repeat !important;
  transition:
    background-size var(--p-t-hover) var(--p-e-out),
    color var(--p-t-hover) var(--p-e-out),
    transform var(--p-t-press) var(--p-e-out) !important;
}

/* 2d. DESTRUCTIVE — warm ink, never a red fill. Filled warm badges get their
   ground darkened to --warmDeep, where --warmText measures 5.85–7.13
   (on raw --warm it was 4.04–4.13 — under AA in every room). */
.fl-root button.fl-btn[style*="color: var(--warmDeep)"],
.fl-root button.fl-btn[style*="color: var(--warm)"] { color: var(--warmDeep) !important; }
.fl-root [style*="background: var(--warm)"][style*="border-radius: 999px"],
.fl-root button.fl-btn[style*="background: var(--warm)"] {
  background-color: var(--warmDeep) !important;
  background-image: linear-gradient(180deg,
    color-mix(in oklab, var(--warmDeep) 90%, white) 0%,
    color-mix(in oklab, var(--warmDeep) 96%, black) 100%) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 30%, transparent),
    0 2px 4px -2px color-mix(in oklab, var(--ink) 55%, transparent) !important;
}

/* 2e. DISABLED — unlit, not merely faded. The plinth collapses (the object is
   resting flat on the desk) and the brass loses its bloom. A disabled ghost
   gets nothing at all: no ring, no ground, no travel. */
.fl-root button.fl-btn:disabled,
.fl-root button.fl-btn[style*="opacity: 0.5"] {
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 12%, transparent) !important;
  filter: saturate(.4);
  transform: none !important;
}
.fl-root button.fl-btn[style*="cursor: default"][style*="background: none"],
.fl-root button.fl-btn[style*="cursor: default"][style*="background: transparent"],
.fl-root button.fl-btn:disabled[style*="background: none"],
.fl-root button.fl-btn:disabled[style*="background: transparent"] {
  box-shadow: none !important;
  filter: none;
  background-size: 0% 1.5px !important;
}

/* 2f. THE PRESS — real objects compress instantly and rebound slowly.
   70ms going down, 180ms coming back, declared only inside :active. */
@media (prefers-reduced-motion: no-preference) {
  @media (hover: hover) {
    /* the sweep: a light crosses the brass once, over 620ms. It is felt more
       than seen — the eye registers that the metal moved under the lamp. */
    .fl-root button.fl-btn[style*="background: var(--a1)"],
    .fl-root button.fl-btn[style*="background: var(--cta)"] {
      transition:
        transform var(--p-t-hover) var(--p-e-out),
        box-shadow var(--p-t-hover) var(--p-e-out),
        filter var(--p-t-hover) var(--p-e-out),
        background-position 620ms var(--p-e-inout) !important;
    }
    .fl-root button.fl-btn[style*="background: var(--a1)"]:hover:not(:disabled),
    .fl-root button.fl-btn[style*="background: var(--cta)"]:hover:not(:disabled) {
      transform: translateY(-1px);
      filter: brightness(1.03);
      background-position: -110% 0, 0 0 !important;
    }
    .fl-root .v2-go:hover:not(:disabled) {
      transform: translateY(-1px);
      filter: brightness(1.04);
    }
    .fl-root button.fl-btn[style*="background: var(--sheet)"]:hover:not(:disabled),
    .fl-root button.fl-btn[style*="background: var(--tint1)"]:hover:not(:disabled) {
      transform: translateY(-1px);
      box-shadow:
        inset 0 1px 0 color-mix(in oklab, white 90%, transparent),
        inset 0 0 0 1px color-mix(in oklab, var(--a1) 34%, transparent),
        0 2px 0 color-mix(in oklab, var(--ink) 18%, transparent),
        0 7px 12px -6px color-mix(in oklab, var(--ink) 42%, transparent) !important;
    }
    .fl-root button.fl-btn[style*="background: none"]:hover:not(:disabled),
    .fl-root button.fl-btn[style*="background: transparent"]:hover:not(:disabled) {
      background-size: 100% 1.5px !important;
      color: var(--body) !important;
    }
  }
  .fl-root button.fl-btn:active:not(:disabled),
  .fl-root .v2-go:active {
    transform: translateY(3px);
    transition-duration: var(--p-t-press) !important;
  }
  .fl-root button.fl-btn[style*="background: var(--a1)"]:active:not(:disabled),
  .fl-root button.fl-btn[style*="background: var(--cta)"]:active:not(:disabled),
  .fl-root .v2-go:active:not(:disabled) {
    box-shadow:
      inset 0 2px 3px color-mix(in oklab, black 26%, transparent),
      inset 0 0 0 1px color-mix(in oklab, black 18%, transparent),
      0 0 0 0 var(--p-plinth),
      0 4px 8px -8px color-mix(in oklab, var(--cta) 70%, transparent) !important;
  }
  .fl-root button.fl-btn[style*="background: var(--sheet)"]:active:not(:disabled),
  .fl-root button.fl-btn[style*="background: var(--tint1)"]:active:not(:disabled) {
    transform: translateY(1px);
    box-shadow:
      inset 0 2px 3px color-mix(in oklab, var(--ink) 22%, transparent),
      inset 0 0 0 1px color-mix(in oklab, var(--ink) 16%, transparent) !important;
  }
}
/* a phone must never be left in a hover state after a tap — but the language
   rows keep the hairline as their CURRENT-language marker, so the ghost rule
   must not underline all five codes there */
@media (hover: none) {
  .fl-root button.fl-btn[style*="background: none"]:not(.fl-foot-lang *):not(.fl-side-lang *),
  .fl-root button.fl-btn[style*="background: transparent"]:not(.fl-foot-lang *):not(.fl-side-lang *) { background-size: 100% 1.5px !important; }
  .fl-root .fl-foot-lang button.fl-btn[style*="text-decoration: underline"] { background-size: 100% 1.5px !important; }
}

/* ═══ 3. INPUTS — paper wells, inked focus, pencil placeholder ════════════ */

/* A boxed input puts a wall around the thing you are asking someone to say.
   These are wells pressed into the sheet: darker under the top lip, lifting to
   near-white at the bottom, with a hairline that is a shadow, not a border.
   --ink on the darkest stop measures 13.0–13.9 in the six rooms. */
.fl-root input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
.fl-root textarea,
.fl-root select {
  /* the colour is the fallback ground; the gradient is the pressed light */
  background-color: var(--p-well-bot) !important;
  border-color: transparent !important;
  box-shadow:
    inset 0 2px 3px -1px color-mix(in oklab, var(--ink) 22%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    0 1px 0 color-mix(in oklab, white 70%, transparent) !important;
  transition: box-shadow var(--p-t-hover) var(--p-e-out), background-color var(--p-t-hover) var(--p-e-out) !important;
}
/* The topic fields carry the pencil mark as a background-image (with an
   !important background-size of 17px). Painting a gradient there would both
   delete the pencil — a UI element, not mine to remove — and get tiled to
   17px. Those two fields take their ground from background-color alone; every
   other field gets the lit gradient. */
.fl-root input:not(.fl-pencil-in):not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
.fl-root textarea:not(.fl-pencil-in),
.fl-root select {
  background-image: linear-gradient(180deg, var(--p-well-top) 0%, var(--p-well-bot) 62%, var(--p-well-bot) 100%) !important;
  background-size: 100% 100% !important;
  background-repeat: no-repeat !important;
}
/* the topic fields carry the app's 2px brass underline inline — keep the
   gesture, make it the well's inked lip rather than a border */
.fl-root .fl-blankin, .fl-root .fl-pencil-in {
  border-bottom-color: transparent !important;
  background-color: var(--p-well-top) !important;
}
.fl-root .fl-blankin, .fl-root .fl-pencil-in,
.fl-root [style*="border-bottom: 2px solid var(--a1)"] {
  box-shadow:
    inset 0 2px 3px -1px color-mix(in oklab, var(--ink) 20%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 13%, transparent),
    inset 0 -2.5px 0 color-mix(in oklab, var(--a1Text) 62%, transparent) !important;
}
/* focus: the lamp is brought to the page. The lip inks up to full --a1Text
   (4.7–5.6:1 against the well — well past the 3:1 non-text floor) and a brass
   bloom spreads onto the sheet around the field. The GROUND does not move:
   warming it would have dropped the brass topic ink to 3.99:1 in the Parlor.
   The accessible :focus-visible ring still fires on top of this. */
.fl-root input:focus, .fl-root textarea:focus, .fl-root select:focus {
  box-shadow:
    inset 0 2px 3px -1px color-mix(in oklab, var(--ink) 16%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 45%, transparent),
    inset 0 -2.5px 0 var(--a1Text),
    0 0 0 3px color-mix(in oklab, var(--a1) 15%, transparent),
    0 6px 16px -8px color-mix(in oklab, var(--a1) 55%, transparent) !important;
}
/* the placeholder is pencil: the voice face, italic, and one step lighter than
   the typed ink — measured 5.5–6.3:1 on the well, comfortably AA */
.fl-root input::placeholder, .fl-root textarea::placeholder {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  color: color-mix(in oklab, var(--muted) 82%, var(--ink)) !important;
  opacity: 1 !important;
}
/* the caret is the lamp */
.fl-root input, .fl-root textarea { caret-color: var(--a1Text); }

/* THE FOCUS RING — one colour that is legible on every surface in the room.
   A ring cannot know whether it lands on paper or on velvet (a nav tile is
   paper, but its ring at 3px offset is drawn on the velvet behind it), so
   picking --a1Text fails on the canvas (2.59–3.09) and --a1OnCanvas fails on
   the sheet. I searched the token space for the mix with the best worst case;
   --a1OnCanvas 65% toward --ink clears the 3:1 non-text floor against ALL of
   --sheet, --canvas, --velvet, --tint1 and --tint2 in all six rooms:
     sheet  3.48 3.62 3.57 3.92 3.54 3.66
     canvas 4.37 3.95 3.96 3.81 4.15 4.11
     velvet 3.65 3.21 3.17 3.22 3.70 3.47
   parlor's 78%-transparent mix cannot: transparency pulls the ring toward
   whatever is behind it, which is the one thing it must not resemble. */
.fl-root { --p-ring: color-mix(in oklab, var(--a1OnCanvas) 65%, var(--ink)); }
.fl-root :where(input, textarea, select, button, a, [tabindex]):focus-visible {
  outline: 2.5px solid var(--p-ring) !important;
  outline-offset: 3px !important;
  transition: outline-offset var(--p-t-press) var(--p-e-out);
}
/* on a lit brass face the ring uses the face's own ink, which is designed
   against it (4.6–7.0) */
.fl-root [style*="background: var(--a1)"]:focus-visible,
.fl-root [style*="background: var(--cta)"]:focus-visible { outline-color: var(--ctaText) !important; }
.fl-root :where(button, a):focus-visible:active { outline-offset: 1px !important; }

/* ═══ 4. CHIPS AND BADGES ═════════════════════════════════════════════════ */

/* Three shadow layers turn a 22px pill into a solid object: a bright inset top
   highlight, a dark inset ring, one hard bottom edge. Lit from the top — the
   same lamp as the room — so chips agree with buttons about where the light is.
   Grounds are stock, so the inks measure: --body 7.6–8.7, --ink 13.4–14.4,
   --a1Text 4.7–5.6, --a2Text 5.3–6.8, --a3Text 4.9–6.1. */
.fl-root .ui-chip,
.fl-root [style*="border-radius: 999px"][style*="background: var(--rule)"],
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint1)"],
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint2)"],
.fl-root [style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:not(button):not(.fl-btn) {
  background-color: transparent !important;
  background-image: linear-gradient(180deg,
    color-mix(in oklab, var(--sheet) 96%, white) 0%,
    color-mix(in oklab, var(--sheet) 93%, var(--p-shade)) 100%) !important;
  border-color: transparent !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 85%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    0 1px 0 color-mix(in oklab, var(--ink) 20%, transparent),
    0 2px 3px -2px color-mix(in oklab, var(--ink) 45%, transparent) !important;
}
/* --muted measures 4.50–5.24 on that stock: under AA in two rooms. Step up. */
.fl-root .ui-chip[style*="color: var(--muted)"],
.fl-root [style*="border-radius: 999px"][style*="background: var(--rule)"][style*="color: var(--muted)"],
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint1)"][style*="color: var(--muted)"],
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint2)"][style*="color: var(--muted)"] { color: var(--p-quiet) !important; }

/* tracked caps deserve real tracking, and numbers must not jitter as counts
   tick — presentation only, the words are untouched */
.fl-root .ui-chip,
.fl-root [style*="border-radius: 999px"][style*="text-transform: uppercase"] {
  font-variant-numeric: tabular-nums lining-nums;
}

/* ═══ 5. THE WAITING STATE ════════════════════════════════════════════════ */
/* People wait on this app while answers are being anonymised. A grey shimmer
   says "server thinking"; a slow warm sweep says "someone is writing." */
@keyframes p-sweep { from { background-position: -40% 0, 0 0; } to { background-position: 140% 0, 0 0; } }
/* Owner 2026-08-17: "can't see the processing icons on the homepage in the
   demo box — too light against background." The bars were --p-key-lo (paper
   + 8% shade) with a whiter sweep: on paper-coloured cards that is a ghost.
   A placeholder must read as a placeholder: light rooms → paper 70% + shade
   (a soft pencil-grey bar); dark rooms → paper 74% + the room's lamp tint (a
   lighter bar); the sweep is the lamp passing over it. */
.fl-root { --p-shim: color-mix(in oklab, var(--sheet) 70%, var(--p-shade)); --p-shim-lit: color-mix(in oklab, var(--sheet) 34%, white); }
[data-palette="ember"] .fl-root, [data-palette="midnight"] .fl-root,
[data-palette="ember"].fl-root, [data-palette="midnight"].fl-root { --p-shim: color-mix(in oklab, var(--sheet) 74%, var(--p-lit-mix)); --p-shim-lit: color-mix(in oklab, var(--sheet) 40%, var(--p-lit-mix)); }
.fl-root .fl-shim {
  background-image:
    linear-gradient(100deg, transparent 0 34%, var(--p-shim-lit) 50%, transparent 66% 100%),
    linear-gradient(var(--p-shim), var(--p-shim)) !important;
  background-size: 220% 100%, 100% 100% !important;
  background-repeat: no-repeat !important;
  animation: p-sweep 1.9s cubic-bezier(.45, 0, .35, 1) infinite !important;
}

/* ═══ 6. ARRIVAL ══════════════════════════════════════════════════════════ */
/* One choreography, once: the sheet slides up under the lamp and a single
   glint crosses it. This REPLACES parlor's p-lamp on the same element —
   running both would double-animate the panel.
   fill-mode is BACKWARDS, never both/forwards: the end keyframe already equals
   the resting state, and a filling transform (even the identity matrix Chrome
   keeps after `to { transform: none }`) makes the sheet the containing block
   for every fixed overlay the app renders inside it. */
@keyframes p-sheet-in {
  from { opacity: 0; transform: translateY(16px) scale(.994); }
  to   { opacity: 1; transform: none; }
}
@keyframes p-glint {
  from { background-position: 220% 0, 0 0, 0 0, 0 0; }
  to   { background-position: -120% 0, 0 0, 0 0, 0 0; }
}
@media (prefers-reduced-motion: no-preference) {
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
    animation: p-sheet-in var(--p-t-page) var(--p-e-out) backwards !important;
  }
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::after {
    animation: p-glint 1.5s cubic-bezier(.32, .1, .2, 1) 180ms 1 both;
  }
}

/* ═══ 7. REDUCED MOTION ═══════════════════════════════════════════════════ */
/* Reduced motion means no movement — not no feedback. Every end state above is
   still reachable; only the travel is removed. */
@media (prefers-reduced-motion: reduce) {
  .fl-root button.fl-btn,
  .fl-root .v2-go,
  .fl-root input, .fl-root textarea, .fl-root select,
  .fl-root .ui-chip { transition: none !important; }
  .fl-root button.fl-btn:active:not(:disabled) { transform: none !important; }
  .fl-root .fl-shim { animation: none !important; }
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) { animation: none !important; opacity: 1 !important; }
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::after {
    animation: none !important;
    background-position: 220% 0, 0 0, 0 0, 0 0;
  }
}

/* ═══ 8. 390px ════════════════════════════════════════════════════════════ */
@media (max-width: 480px) {
  /* a shallower tear: at 390px a 5px bite is already a third of a tap row */
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
    --bite-a: radial-gradient(circle at 50% 0%, #000 3.4px, transparent 4px);
    --bite-b: radial-gradient(circle at 50% 0%, #000 2px, transparent 2.5px);
    --bite-c: radial-gradient(circle at 50% 0%, #000 1.1px, transparent 1.5px);
  }
}
/* 44px tap targets on coarse pointers — but ONLY on controls the app has not
   deliberately sized. The palette swatches are 20px and the row actions are
   32px by design; forcing those to 44 would rebuild someone else's layout. */
@media (pointer: coarse) {
  .fl-root button.fl-btn:not([style*="width:"]):not([style*="height:"]) { min-block-size: 44px; }
}


/* ══════════════════════════════════════════════════════════════════════
   THE PARLOR · SHELL — from the 52-site study (see built-inventory)
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   frag-shell.css — THE SHELL: the room, the rail, the masthead, the bar.
   Loads AFTER parlor.css. Presentation only. Every colour is a token or a
   color-mix of tokens, so all six rooms follow one declaration.

   THE THESIS
   The room is not a background, it is a lit interior: a lamp with a real
   two-stage falloff, a vignette that closes the corners, and a woven nap.
   The rail is not a stack of white pills on velvet — it is UPHOLSTERY: one
   continuous panel of deeper velvet with a brass edge, where navigation
   reads as LIT or UNLIT rather than filled or unfilled.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 0. The shell's own timing layer (Emil Kowalski) ────────────────────── */
.fl-root {
  --sh-press: 70ms;
  --sh-hover: 180ms;
  --sh-enter: 420ms;
  --sh-out: cubic-bezier(.2, .7, .3, 1);
  --sh-brass: color-mix(in oklab, var(--a1) 55%, transparent);
  --sh-brassSoft: color-mix(in oklab, var(--a1) 20%, transparent);
  --sh-hair: color-mix(in oklab, var(--onCanvas) 10%, transparent);
  --sh-railTop: color-mix(in oklab, var(--velvet, var(--canvas)) 88%, black);
  --sh-railBot: color-mix(in oklab, var(--canvas) 92%, black);
}

/* ═══ 1. THE ROOM ════════════════════════════════════════════════════════ */
/* The lamp is rebuilt with a two-stage falloff — a tight hot core and a wide
   weak throw — because a single radial reads as a flat coloured blob, which
   is exactly what made the last pass look like a recolour. Under it: a
   vignette that closes the corners, the velvet fall, and the fibre. */
.fl-root {
  isolation: isolate;
  background-color: var(--canvas) !important;
  background-image:
    /* the hot core of the lamp */
    radial-gradient(760px 540px at 89% -8%,
      color-mix(in oklab, var(--a1) 56%, transparent) 0%,
      color-mix(in oklab, var(--a1) 22%, transparent) 34%,
      transparent 70%),
    /* the throw — wide, weak, so the falloff has two stages, not one ramp */
    radial-gradient(1600px 1150px at 94% -22%,
      color-mix(in oklab, var(--a1) 12%, transparent) 0%,
      color-mix(in oklab, var(--a1) 4%, transparent) 46%,
      transparent 74%),
    /* the bounce off the floor, bottom left */
    radial-gradient(880px 600px at 4% 112%,
      color-mix(in oklab, var(--velvet, var(--canvas)) 84%, white 12%) 0%, transparent 60%),
    /* one broad sheen raking across the nap, the way light sits on velvet */
    linear-gradient(104deg, transparent 0%, rgba(255, 255, 255, .030) 34%,
      rgba(255, 255, 255, .046) 47%, rgba(255, 255, 255, .012) 60%, transparent 82%),
    /* the vignette: the corners of a room are never as lit as its middle */
    radial-gradient(126% 104% at 68% 16%,
      rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, .16) 46%, rgba(0, 0, 0, .38) 74%, rgba(0, 0, 0, .60) 100%),
    /* the velvet itself */
    linear-gradient(168deg, var(--velvet, var(--canvas)) 0%, var(--canvas) 60%),
    var(--p-grain) !important;
  background-size: auto, auto, auto, auto, auto, auto, 128px 128px !important;
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat !important;
  background-attachment: fixed, fixed, fixed, fixed, fixed, fixed, scroll !important;
  background-blend-mode: normal, normal, normal, normal, normal, normal, normal !important;
}

/* THE BLOOM (Isle of Harris): light that brightens what is already light and
   leaves the shadows alone. A tinted gradient cannot do that; color-dodge can.
   z-index:-1 keeps it above the room's own paint and below every sheet, so
   the paper is never touched. */
.fl-root::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: radial-gradient(880px 620px at 89% -10%,
    color-mix(in oklab, var(--a1) 46%, transparent) 0%, transparent 60%);
  mix-blend-mode: color-dodge;
  opacity: .34;
}
/* ember's canvas is already warm umber and dodge runs orange fast */
[data-palette="ember"] .fl-root::before { mix-blend-mode: overlay; opacity: .62; }
[data-palette="blush-study"] .fl-root::before { opacity: .28; }

/* THE NAP (Tekla): two line grids at non-orthogonal angles and coprime
   periods, composited soft-light. Pure white/black at low alpha, so it is
   mathematically hue-neutral and cannot break a single room. */
.fl-root::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    repeating-linear-gradient(103deg, rgba(255, 255, 255, .085) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(13deg, rgba(0, 0, 0, .090) 0 1px, transparent 1px 4px);
  mix-blend-mode: soft-light;
}

/* ═══ 2. THE RAIL — upholstery, not a stack of pills ═════════════════════ */
/* One continuous recessed panel: a deeper velvet than the room, a fold
   shadow where it meets the wall, the lamp catching its top edge, a fine
   vertical rib (upholstery is ribbed), and a brass edge down its face. */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] {
  padding: 26px 12px 14px !important;
  gap: 3px !important;
  background-color: transparent !important;
  background-image:
    /* the brass edge, fading out top and bottom like a real strip */
    linear-gradient(180deg, transparent 0%, var(--sh-brass) 8%,
      color-mix(in oklab, var(--a1) 68%, transparent) 34%,
      var(--sh-brass) 88%, transparent 100%),
    /* the rib */
    repeating-linear-gradient(90deg,
      color-mix(in oklab, var(--onCanvas) 4%, transparent) 0 1px, transparent 1px 6px),
    /* the lamp catching the top of the panel */
    radial-gradient(150% 42% at 74% -2%, color-mix(in oklab, var(--a1) 15%, transparent), transparent 70%),
    /* the fold where the panel meets the wall */
    linear-gradient(90deg, rgba(0, 0, 0, .34) 0%, rgba(0, 0, 0, 0) 38%),
    /* the upholstery */
    linear-gradient(174deg, var(--sh-railTop) 0%, var(--sh-railBot) 64%,
      color-mix(in oklab, var(--canvas) 84%, black) 100%),
    var(--p-grain) !important;
  background-size: 1.5px 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 128px 128px !important;
  background-position: right top, left top, left top, left top, left top, left top !important;
  background-repeat: no-repeat, repeat, no-repeat, no-repeat, no-repeat, repeat !important;
  /* 'scroll' (not 'local'): the upholstery is a panel fixed to the rail's box,
     so it never scrolls out from under the nav when the rail itself scrolls */
  background-attachment: scroll, scroll, scroll, scroll, scroll, scroll !important;
  background-blend-mode: normal, normal, normal, normal, normal, soft-light !important;
  scrollbar-width: none;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"]::-webkit-scrollbar { width: 0; }

/* ── 2a. THE MASTHEAD (It's Nice That) ──────────────────────────────────── */
/* The wordmark stops being a logo floating in a header and becomes the top of
   a publication: the cameo, the name at 21px, and a rule ruled under it. */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] {
  background: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 2px 4px 17px !important;
  margin-bottom: 4px !important;
  gap: 12px !important;
  /* the masthead's double rule: a thick and a thin, the way a running head is
     ruled off in a printed book. Never a box, never a divider. */
  background-image:
    linear-gradient(90deg,
      color-mix(in oklab, var(--a1) 72%, transparent) 0%,
      color-mix(in oklab, var(--a1) 26%, transparent) 66%, transparent 100%),
    linear-gradient(90deg,
      color-mix(in oklab, var(--a1) 34%, transparent) 0%,
      color-mix(in oklab, var(--a1) 8%, transparent) 52%, transparent 88%) !important;
  background-size: 100% 1.5px, 100% 1px !important;
  background-position: left calc(100% - 5px), left bottom !important;
  background-repeat: no-repeat, no-repeat !important;
}
/* the cameo: the drawn face in a brass-ringed medallion of lit paper */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] > [style*="border-radius: 50%"] {
  width: 38px !important;
  height: 38px !important;
  background: radial-gradient(80% 80% at 32% 22%,
    color-mix(in oklab, var(--sheet) 94%, white) 0%,
    var(--sheet) 46%,
    color-mix(in oklab, var(--sheet) 74%, var(--p-shade)) 100%) !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--a1) 62%, transparent),
    0 0 0 1px color-mix(in oklab, var(--onCanvas) 9%, transparent),
    0 6px 14px -6px rgba(0, 0, 0, .92),
    0 0 26px -6px color-mix(in oklab, var(--a1) 46%, transparent) !important;
}
/* the name. --onCanvas on the rail's upholstery measures 12.06–13.98:1 */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] > [style*="font-family: Fraunces"] {
  color: var(--onCanvas) !important;
  font-size: 21px !important;
  line-height: .96 !important;
  letter-spacing: .012em !important;
  text-shadow: 0 1px 0 rgba(0, 0, 0, .5), 0 0 18px color-mix(in oklab, var(--a1) 22%, transparent);
}

/* ── 2b. NAV: lit or unlit ──────────────────────────────────────────────── */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav {
  position: relative;
  isolation: isolate;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  border-radius: 11px !important;
  border: 0 !important;
  min-height: 44px;
  padding: 10px 12px 10px 15px !important;
  color: var(--onCanvasBody) !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  letter-spacing: .006em !important;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition: color var(--sh-hover) var(--sh-out), background-color var(--sh-hover) var(--sh-out);
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav svg {
  stroke: var(--onCanvasMuted) !important;
  opacity: 1 !important;
  transition: stroke var(--sh-hover) var(--sh-out);
}
/* the state ledge (Mercury): the accent is never a decoration, only a state */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 3px;
  height: 0;
  border-radius: 0 3px 3px 0;
  background: var(--a1OnCanvas);
  box-shadow: 0 0 14px color-mix(in oklab, var(--a1) 75%, transparent);
  transform: translateY(-50%);
  transition: height .22s var(--sh-out);
  pointer-events: none;
}
@media (hover: hover) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover {
    background-color: color-mix(in oklab, var(--a1) 15%, transparent) !important;
    color: var(--onCanvas) !important;
  }
  /* the parts move, not the box (Hello Monday): the icon leads by 2px, the
     label follows — a jointed object rather than a sliding slab */
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover svg {
    stroke: var(--a1OnCanvas) !important;
    transform: translateX(2px);
  }
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover::before { height: 34%; }
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav svg {
    transition: stroke var(--sh-hover) var(--sh-out), transform .22s var(--sh-out) 40ms;
  }
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:focus-visible::before { height: 34%; }

/* THE LIT ONE. Not a filled chip — an alcove the lamp is pointed at.
   --onCanvas on this ground measures 8.24–9.23:1 in all six rooms. */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"],
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"] {
  background-color: color-mix(in oklab, var(--a1) 30%, transparent) !important;
  /* the light spills FROM the ledge and falls off to the right — an alcove the
     lamp is pointed at, not a filled chip */
  background-image: linear-gradient(96deg,
    color-mix(in oklab, var(--a1) 20%, transparent) 0%,
    color-mix(in oklab, var(--a1) 4%, transparent) 46%,
    transparent 82%) !important;
  color: var(--onCanvas) !important;
  text-shadow: 0 0 18px color-mix(in oklab, var(--a1) 38%, transparent),
               0 1px 0 rgba(0, 0, 0, .35);
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, var(--onCanvas) 15%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--a1) 34%, transparent),
    inset 22px 0 30px -26px color-mix(in oklab, var(--a1) 90%, transparent),
    0 10px 22px -14px rgba(0, 0, 0, .9) !important;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"]::before,
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"]::before {
  /* the ledge lives inside the STRAIGHT run of the item's left edge: an
     11px radius on a 44px item leaves 22px straight, so 58% overhung the
     curve by ~3px at each end and read as a stub bolted onto a pill */
  height: 46%;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"] svg,
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"] svg {
  stroke: var(--a1OnCanvas) !important;
}
/* the unread pip gets a lamp of its own instead of sitting flat */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav [style*="background: var(--warm)"] {
  box-shadow: 0 0 0 2px color-mix(in oklab, var(--canvas) 60%, transparent),
              0 0 12px color-mix(in oklab, var(--warm) 80%, transparent);
}

/* ── 2c. THE GROUPED SET — a broken rule, not a floating card ───────────── */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"][style*="background: var(--sheet)"] {
  background-color: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  margin-top: 26px !important;
  padding: 0 0 4px !important;
  overflow: visible !important;
  background-image: none !important;
}
/* THE BROKEN RULE (AIGA Eye on Design): the hairline runs, stops for the
   tracked word, and resumes. A hundred-year-old letterpress device — and it
   removes a filled chip from the page, which is subtraction AND craft. */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"] > [style*="letter-spacing: 0.13em"],
.fl-root .fl-side-util .v2-pk-hint {
  display: flex !important;
  align-items: center;
  gap: 10px;
  color: var(--onCanvasMuted) !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 9px !important;
  letter-spacing: .18em !important;
  text-transform: uppercase;
  padding: 14px 12px 9px !important;
  margin: 0 !important;
  white-space: nowrap;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"] > [style*="letter-spacing: 0.13em"]::after,
.fl-root .fl-side-util .v2-pk-hint::after {
  content: "";
  flex: 1 1 0;
  height: 1px;
  min-width: 8px;
  background: linear-gradient(90deg,
    color-mix(in oklab, var(--a1) 52%, transparent) 0%,
    color-mix(in oklab, var(--a1) 10%, transparent) 78%, transparent 100%);
}
.fl-root .fl-side-util .v2-pk-hint {
  letter-spacing: .16em !important;
  font-size: 9px !important;
  padding: 12px 8px 8px !important;
}
/* the paper hairline between the grouped rows becomes a velvet seam */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="border-bottom: 1px solid var(--rule)"] {
  border-bottom: 1px solid var(--sh-hair) !important;
  border-radius: 0 !important;
}

/* ── 2d. THE UTILITY TRAY ───────────────────────────────────────────────── */
.fl-root .fl-side-util {
  background: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 2px 4px 2px !important;
  margin-top: 14px !important;
  background-image: none !important;
}
.fl-root .fl-side-util .v2-pk-hint__k {
  color: var(--onCanvas) !important;
  background: color-mix(in oklab, var(--onCanvas) 10%, transparent) !important;
  border-color: var(--sh-hair) !important;
  box-shadow: inset 0 0 0 1px var(--sh-hair) !important;
}
/* the language row: on velvet, paper inks are invisible — 7.0–7.6:1 instead */
.fl-root .fl-side-util .fl-side-lang .fl-btn { color: var(--onCanvasMuted) !important; }
.fl-root .fl-side-util .fl-side-lang .fl-btn[style*="text-decoration: underline"] {
  color: var(--onCanvas) !important;
  text-decoration-color: var(--a1OnCanvas) !important;
}
.fl-root .fl-side-util [title] { box-shadow: 0 0 0 1px var(--sh-hair), 0 2px 5px -2px rgba(0, 0, 0, .9) !important; }
.fl-root .fl-side-util [style*="outline: 2.5px solid var(--onCanvas)"] {
  box-shadow: 0 0 0 1px var(--canvas), 0 0 14px -2px color-mix(in oklab, var(--a1) 70%, transparent) !important;
}

/* ═══ 3. THE BOTTOM BAR — the same upholstery, laid flat ═════════════════ */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] {
  background-color: color-mix(in oklab, var(--sh-railTop) 86%, transparent) !important;
  background-image:
    linear-gradient(90deg, transparent 0%, var(--sh-brass) 16%,
      color-mix(in oklab, var(--a1) 66%, transparent) 50%, var(--sh-brass) 84%, transparent 100%),
    radial-gradient(120% 130% at 50% 132%, color-mix(in oklab, var(--a1) 13%, transparent), transparent 68%),
    repeating-linear-gradient(90deg, color-mix(in oklab, var(--onCanvas) 4%, transparent) 0 1px, transparent 1px 6px) !important;
  background-size: 100% 1px, 100% 100%, 100% 100% !important;
  background-position: left top, left top, left top !important;
  background-repeat: no-repeat, no-repeat, repeat !important;
  border-top: 0 !important;
  box-shadow: 0 -18px 34px -22px rgba(0, 0, 0, .95) !important;
  backdrop-filter: blur(18px) saturate(1.12) !important;
  -webkit-backdrop-filter: blur(18px) saturate(1.12) !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
  position: relative;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  border: 0 !important;
  border-radius: 12px !important;
  min-height: 48px;
  color: var(--onCanvasBody) !important;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition: color var(--sh-hover) var(--sh-out), background-color var(--sh-hover) var(--sh-out);
}
/* the bar is translucent over lit paper, so its worst-case ground is much
   lighter than the rail's: measured, --onCanvasMuted lands at 3.39–3.92:1
   there, so bar icons take --onCanvasBody (5.40–6.37:1) instead. */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn svg {
  color: var(--onCanvasBody) !important;
  stroke: var(--onCanvasBody) !important;
  transition: stroke var(--sh-hover) var(--sh-out);
}
/* the lit tab: the same alcove, marked by a brass filament above it */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] {
  background-color: color-mix(in oklab, var(--a1) 30%, transparent) !important;
  background-image: linear-gradient(180deg, color-mix(in oklab, var(--a1) 13%, transparent), transparent 74%) !important;
  color: var(--onCanvas) !important;
  box-shadow: inset 0 1px 0 color-mix(in oklab, var(--onCanvas) 20%, transparent),
              inset 0 0 0 1px color-mix(in oklab, var(--a1) 34%, transparent) !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"] svg,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] svg {
  color: color-mix(in oklab, var(--a1OnCanvas) 50%, var(--onCanvas)) !important;
  stroke: color-mix(in oklab, var(--a1OnCanvas) 50%, var(--onCanvas)) !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"]::after,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"]::after {
  content: "";
  position: absolute;
  top: -1px;
  left: 50%;
  width: 30px;
  height: 2px;
  transform: translateX(-50%);
  border-radius: 0 0 2px 2px;
  background: var(--a1OnCanvas);
  box-shadow: 0 0 14px color-mix(in oklab, var(--a1) 80%, transparent);
  pointer-events: none;
}
@media (hover: hover) {
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn:hover:not([style*="background: var(--a1)"]):not([style*="background: var(--cta)"]) {
    background-color: color-mix(in oklab, var(--a1) 14%, transparent) !important;
    color: var(--onCanvas) !important;
  }
}

/* the bar's labels were being clipped by the row height at 390px — give the
   stack the 3px it needs rather than letting the words disappear */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
  min-height: 54px;
  padding: 7px 4px 8px !important;
  line-height: 1.15 !important;
  letter-spacing: .012em !important;
}

/* press physics (basement.studio): down fast, up slow — the asymmetry is the
   whole trick, and it is declared only inside :active */
@media (prefers-reduced-motion: no-preference) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:active,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn:active {
    transform: translateY(1px);
    transition-duration: var(--sh-press);
  }
}

/* ── 3b. THE FLOATING TRAY on screens with no rail ──────────────────────── */
/* Without a rail behind it the tray would be a hairline hanging in mid-air, so
   it gets its own small plate of upholstery — the same material, a smaller
   piece of furniture. */
.fl-root .fl-side-util.fl-home-util {
  padding: 11px 8px 6px !important;
  border-radius: 13px !important;
  background-color: color-mix(in oklab, var(--sh-railTop) 88%, transparent) !important;
  background-image:
    linear-gradient(90deg, transparent 0%, var(--sh-brass) 14%,
      color-mix(in oklab, var(--a1) 62%, transparent) 48%, var(--sh-brass) 86%, transparent 100%),
    repeating-linear-gradient(90deg,
      color-mix(in oklab, var(--onCanvas) 4%, transparent) 0 1px, transparent 1px 6px) !important;
  background-size: 100% 1px, 100% 100% !important;
  background-position: left top, left top !important;
  background-repeat: no-repeat, repeat !important;
  box-shadow: inset 0 0 0 1px var(--sh-hair), 0 20px 38px -24px rgba(0, 0, 0, .95) !important;
  backdrop-filter: blur(12px) saturate(1.08);
  -webkit-backdrop-filter: blur(12px) saturate(1.08);
}

/* ═══ 4. THE WORDMARK, EVERYWHERE ELSE ══════════════════════════════════ */
/* Mailchimp's reverse-mark rule: the logo has no colour, it has a colour per
   surface. On paper it is walnut brass; on velvet it is the cream reverse. */
.fl-logo, .fl-hero-logo { color: var(--logo) !important; }
[style*="background: var(--sheet)"] .fl-logo,
[style*="background-color: var(--sheet)"] .fl-logo,
.ui-card .fl-logo, .v2-loop .fl-logo, .v2-com__card .fl-logo { color: var(--logo) !important; }
.fl-root > .fl-logo,
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-logo,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-logo,
[style*="background: var(--canvas)"] .fl-logo,
[style*="background: var(--velvet)"] .fl-logo { color: var(--onCanvas) !important; }
/* on velvet the drawn eyes are dark brass on dark velvet — reverse them too */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-logo [stroke="var(--logo)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-logo [stroke="var(--logo)"] { stroke: var(--a1OnCanvas) !important; }

/* Graza's ink spread + Tartine's second plate: the hero mark is PRESSED into
   the stock, with one plate of ember a hair out of register. Both shadows use
   currentColor or a --a2 mix, so the measured ratio is still governed by the
   fill and can only rise. */
.fl-hero-logo {
  text-shadow:
    .04em .045em 0 color-mix(in oklab, var(--a2) 26%, transparent),
    .011em .011em 0 currentColor,
    -.007em .007em 0 currentColor;
}

/* ═══ 5. FOCUS, TARGETS, MOTION FLOOR (Rauno) ═══════════════════════════ */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] :is(button, a, [tabindex]):focus-visible,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] :is(button, a):focus-visible {
  outline: 2.5px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
@media (pointer: coarse) {
  .fl-root .fl-side-util .fl-side-lang .fl-btn { min-height: 44px !important; min-width: 44px; }
  .fl-root .fl-side-util [title] { min-height: 26px; min-width: 26px; }
}
@media (max-width: 760px) {
  /* guarantee zero horizontal scroll on a phone. 'clip' (not 'hidden') so it
     never becomes a scroll container and never breaks position:sticky. */
  .fl-root { overflow-x: clip; }
  .fl-root::after { opacity: .7; }
}
@media (prefers-reduced-motion: reduce) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::before,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav svg,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn { transition: none !important; }
}


/* ══════════════════════════════════════════════════════════════════════
   THE PARLOR · HERO — from the 52-site study (see built-inventory)
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   frag-hero.css — THE HOME SCREEN, art-directed.
   "A masthead, a promise, a voice, and one lit tray to speak into."

   Loads after parlor.css. Presentation only: no copy, no behaviour, no new UI.
   Every colour is a token or a color-mix of tokens, so all six rooms follow.

   THE COMPOSITION (top to bottom)
     · (retired 2026-08-17) a small note used to be pinned to the top-right corner, tilted —
       the one asymmetry that makes the centred lockup read as composed
     · THE MASTHEAD: the wordmark at 3× its old size, standing in a pool of
       lamplight, the two eyes finally big enough to be a character
     · a hairline, then the promise demoted to a quiet Karla standfirst
     · THE VOICE: the rotating line, Instrument Serif italic, large — with a
       brass rule beneath it that opens as a line arrives and closes as it goes
     · THE TRAY: the ask field as the heaviest object on the page
     · a diamond node on the section rule, and a broken rule around the
       section head below
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 0. Motion grammar (Emil Kowalski) ──────────────────────────────────── */
:root {
  --h-press: 70ms;
  --h-hover: 180ms;
  --h-enter: 620ms;
  --h-out: cubic-bezier(.22, .68, .24, 1);
}

/* ── 1. The home sheet gets a page margin ───────────────────────────────── */
/* :has() keeps this off every other screen that shares .fl-scroll. */
@supports selector(:has(*)) {
  .fl-scroll:has(> [style*="padding: 24px 0px 8px"]) {
    padding: clamp(14px, 2.2vw, 26px) clamp(16px, 3vw, 34px) 40px !important;
    max-width: 980px !important;
  }
}

/* ── 2. (retired) The note that used to sit in the corner of the sheet is gone
   from the app entirely (owner 2026-08-17). ─────────────────────────────── */

/* ── 3. The hero block: one lamp pool, one stagger ──────────────────────── */
/* NOT isolated: this block is the DOM parent of the onboarding sheet + scrim
   (position:fixed, z 50/51). A stacking context here would trap them under
   the z-50 tab bar and let later sections paint over them. The lamp pool
   below is z -1 in .fl-root's context, which paints above the sheet's own
   ::before by tree order — the same result without the trap. */
.fl-scroll > [style*="padding: 24px 0px 8px"] {
  position: relative;
  padding: clamp(18px, 4vw, 46px) 0 6px !important;
  /* The two light pools below deliberately spill past this box. Measured:
     without this, .fl-scroll gained 46px of horizontal scroll at 390px and
     130px at 1280px. `clip` on one axis only leaves overflow-y untouched, so
     the pools still bleed vertically and nothing becomes a scroll container. */
  overflow-x: clip;
}
/* the lamp falls on the masthead: paper lightens toward the wordmark, which
   can only RAISE the contrast of everything set on it. It is painted as a
   layer of the SHEET's own background (the sheet is not a stacking context,
   so a z:-1 pseudo here would sit behind it), soft-edged with three stops so
   it does not band on near-flat paper. */
/* Owner 2026-08-17: "some logos on the main page have a light treatment
   around them, but not the light themes — parity for all color schemes."
   Then, after the first attempt: "still no equal light treatment … you didn't
   even check it visually." A sheet-toward-white pool is a glow on dark paper
   and nothing on cream/bone/ivory/blush. So the pool is now LAMP LIGHT — a
   warm gold (--p-pool, per room) — which reads on light paper by HUE as well
   as lightness, sitting in a soft shaded surround (sheet → the room's shade).
   Dark rooms use their own lamp tint as the pool. Verified by six-room
   contact sheet (headless Chrome, 1280) before shipping. */
[data-palette="amethyst-night"] { --p-pool: #FFEFBA; }
[data-palette="harbor"]         { --p-pool: #FFF1C8; }
:root:not([data-palette]), [data-palette="meadow"] { --p-pool: #FFF3B8; }
[data-palette="blush-study"]    { --p-pool: #FFF0C6; }
[data-palette="ember"]          { --p-pool: color-mix(in oklab, var(--sheet) 42%, var(--p-lit-mix)); }
[data-palette="midnight"]       { --p-pool: color-mix(in oklab, var(--sheet) 42%, var(--p-lit-mix)); }
/* [stripped by garden/core-strip.json] */

/* ── 4. THE MASTHEAD ────────────────────────────────────────────────────── */
/* The scale jump is the design (Bloomberg Businessweek): 68px wordmark, then
   nothing until the 17px standfirst. No middle of the scale at all. */
.fl-hero-logo {
  font-size: clamp(31px, 7.2vw, 82px) !important;
  letter-spacing: .006em !important;
  line-height: 1 !important;
  max-width: 100%;
  /* the misregistered second plate + the ink spread of a real press */
  text-shadow:
    .026em .026em 0 color-mix(in oklab, var(--a2) 22%, transparent),
    .011em .011em 0 currentColor,
    -.007em .007em 0 currentColor;
}
@supports (text-box: trim-both cap alphabetic) {
  .fl-hero-logo { text-box: trim-both cap alphabetic; }
}
/* the wordmark casts onto the sheet: it is an object in the room, not a fill */
.fl-hero-logo::after {
  content: "";
  position: absolute;
  left: 12%;
  right: 12%;
  bottom: -.11em;
  height: .14em;
  pointer-events: none;
  filter: blur(9px);
  background: radial-gradient(50% 100% at 50% 0%, color-mix(in oklab, var(--p-shade) 44%, transparent) 0%, transparent 76%);
}

/* ── 5. The rule, then the promise ──────────────────────────────────────── */
.fl-hero-copy {
  max-width: min(640px, 100%) !important;
  padding: 0 clamp(8px, 2vw, 18px) !important;
  margin-top: clamp(16px, 2.6vw, 30px) !important;
}
/* the masthead rule: a hairline that fades at both ends */
.fl-hero-copy::before {
  content: "";
  display: block;
  width: min(340px, 62%);
  height: 1px;
  margin: 0 auto clamp(18px, 2.8vw, 30px);
  background: linear-gradient(90deg,
    transparent,
    color-mix(in oklab, var(--a1) 64%, transparent) 20%,
    color-mix(in oklab, var(--a1) 64%, transparent) 80%,
    transparent);
}
/* the promise stops competing with the wordmark: Karla, quiet, --body */
/* --body on --sheet = 9.00 parlor / 8.23 ember / 9.10 harbor / 8.03 midnight */
.fl-hero-copy > [style*="font-family: Fraunces"]:first-child {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 500 !important;
  font-style: normal !important;
  font-size: clamp(15px, 1.35vw, 17px) !important;
  line-height: 1.75 !important;
  letter-spacing: .006em !important;
  color: var(--body) !important;
  text-shadow: none !important;
  text-wrap: pretty;
  max-width: 100%;
  margin: 0 auto !important;
}

/* ── 6. THE VOICE: the rotating line ────────────────────────────────────── */
/* The app's own dissolve (opacity + 1.5px blur, owner-tuned 2026-07-31) is
   left exactly as it is — the type never moves. What is new is the brass rule
   beneath it, which opens as a line arrives and closes as it leaves. */
.fl-hero-line {
  font-size: clamp(25px, 3.9vw, 42px) !important;
  line-height: 1.18 !important;
  letter-spacing: -.014em !important;
  margin-top: clamp(14px, 2.2vw, 24px) !important;
  min-height: 2.42em !important;
  text-wrap: balance;
  padding: 0 4px;
  position: relative;
}
/* the pause: a brass lozenge set ON the rule below — the same node that marks
   the section rule further down, so the page has one ornamental language.
   It lives inside .fl-hero-line, so the app's own dissolve fades it in and out
   with the sentence for free. */
.fl-hero-line::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -12.5px;
  width: 7px;
  height: 7px;
  margin-left: -3.5px;
  transform: rotate(45deg);
  background: color-mix(in oklab, var(--sheet) 92%, white);
  box-shadow: 0 0 0 1.2px color-mix(in oklab, var(--a1) 62%, transparent);
  pointer-events: none;
}
.fl-hero-copy::after {
  content: "";
  display: block;
  height: 1.5px;
  width: 100%;
  margin: 8px auto 0;
  background: linear-gradient(90deg,
    transparent,
    color-mix(in oklab, var(--a1) 66%, transparent) 26%,
    color-mix(in oklab, var(--a1) 66%, transparent) 74%,
    transparent);
  background-size: 40% 100%;
  background-repeat: no-repeat;
  background-position: 50% 50%;
}
@supports selector(:has(*)) {
  @media (prefers-reduced-motion: no-preference) {
    .fl-hero-copy::after {
      transition: background-size .9s cubic-bezier(.7, .25, .6, 1), opacity .9s ease;
    }
    .fl-hero-copy:has(.fl-hero-in)::after  { background-size: 40% 100%; opacity: 1; }
    .fl-hero-copy:has(.fl-hero-out)::after { background-size: 0% 100%;  opacity: 0; }
  }
}

/* ── 7. THE TRAY: the ask field as the heaviest object on the page ──────── */
.v2-ask[data-sec="hero-ask"] {
  width: min(600px, 100%) !important;
  margin-top: clamp(26px, 3.8vw, 46px) !important;
  position: relative;
  isolation: isolate;
}
/* lamplight pooling under the tray — brightens on focus */
.v2-ask[data-sec="hero-ask"]::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: -30px -40px -26px;
  pointer-events: none;
  border-radius: 999px;
  background: radial-gradient(58% 116% at 50% 46%, color-mix(in oklab, var(--a1) 15%, transparent) 0%, transparent 72%);
  opacity: .7;
}
.v2-ask[data-sec="hero-ask"] input {
  min-height: 68px !important;
  padding: 20px 74px 20px 56px !important;
  font: 500 17px/1.35 'Karla', system-ui, sans-serif !important;
  color: var(--ink) !important;
  border-color: transparent !important;
  background-image: linear-gradient(180deg,
    color-mix(in oklab, var(--sheet) 88%, white) 0%,
    color-mix(in oklab, var(--sheet) 97%, var(--p-shade)) 100%) !important;
  /* the top highlight is the STOCK catching the lamp, not a white line: on
     dark paper a fixed white read as a second ring inside the brass one */
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, var(--sheet) 70%, white),
    inset 0 -1px 0 color-mix(in oklab, var(--ink) 12%, transparent),
    0 0 0 1.5px color-mix(in oklab, var(--a1) 58%, transparent),
    0 4px 0 color-mix(in oklab, var(--p-shade) 62%, var(--ink)),
    0 26px 40px -24px rgba(0, 0, 0, .55) !important;
  transition: box-shadow var(--h-hover) var(--h-out), background-color var(--h-hover) var(--h-out) !important;
}
/* the placeholder is the voice asking, not a label */
.v2-ask[data-sec="hero-ask"] input::placeholder {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: 19px !important;
  opacity: 1;
}
.v2-ask[data-sec="hero-ask"] input:focus {
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, var(--sheet) 70%, white),
    0 0 0 2px var(--a1Text),
    0 0 0 7px color-mix(in oklab, var(--a1) 20%, transparent),
    0 4px 0 color-mix(in oklab, var(--p-shade) 62%, var(--ink)),
    0 30px 46px -24px rgba(0, 0, 0, .6) !important;
}
@media (prefers-reduced-motion: no-preference) {
  .v2-ask[data-sec="hero-ask"]::before { transition: opacity .3s ease, transform .3s var(--h-out); }
  .v2-ask[data-sec="hero-ask"]:focus-within::before { opacity: 1; transform: scale(1.05); }
}
/* the pencil in the tray */
.v2-ask[data-sec="hero-ask"] .v2-lead {
  left: 22px !important;
  color: var(--a1Text) !important;
}
/* the brass knob: a plinth under it, and it presses INTO the plinth */
.v2-ask[data-sec="hero-ask"] .v2-go {
  width: 52px !important;
  height: 52px !important;
  right: 8px !important;
  box-shadow:
    0 1px 0 rgba(255, 244, 220, .62) inset,
    0 -2px 0 rgba(84, 48, 8, .26) inset,
    0 3px 0 color-mix(in oklab, var(--cta) 48%, black),
    0 14px 22px -12px color-mix(in oklab, var(--cta) 82%, transparent) !important;
  transition: transform var(--h-hover) var(--h-out), box-shadow var(--h-hover) var(--h-out) !important;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .v2-ask[data-sec="hero-ask"] .v2-go:hover { transform: translateY(-50%) scale(1.05) !important; }
  .v2-ask[data-sec="hero-ask"] .v2-go:active {
    transform: translateY(calc(-50% + 3px)) scale(1) !important;
    transition-duration: var(--h-press) !important;
    box-shadow:
      0 1px 0 rgba(255, 244, 220, .4) inset,
      0 0 0 color-mix(in oklab, var(--cta) 48%, black),
      0 6px 12px -10px color-mix(in oklab, var(--cta) 70%, transparent) !important;
  }
}

/* ── 8. The quick chip below the tray: a wall label, not a button ───────── */
.v2-quick { margin-top: clamp(14px, 2vw, 22px) !important; }
.v2-quick .ui-chip {
  font: 700 10.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .2em !important;
  text-transform: uppercase !important;
  /* NOT --muted: on the darkest stop of the paper gradient --muted measures
     4.43 in Blue Hour and 4.47 in the Conservatory — under AA. One notch of
     ink takes the worst room to 5.57 and it still reads as a quiet label. */
  color: color-mix(in oklab, var(--muted) 70%, var(--ink)) !important;
  background: transparent !important;
  border-color: transparent !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 16%, transparent) !important;
  padding: 11px 16px !important;
}
@media (hover: hover) {
  .v2-quick .ui-chip:hover {
    color: var(--ink) !important;
    box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1) 55%, transparent) !important;
  }
}
@media (pointer: coarse) {
  .v2-quick .ui-chip { min-height: 44px !important; }
}

/* ── 9. THE SECTION BELOW: a real section rhythm ────────────────────────── */
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"] {
  margin-top: clamp(40px, 5.4vw, 72px) !important;
  padding-top: clamp(38px, 5vw, 62px) !important;
  border-top-color: transparent !important;
  background-image: linear-gradient(90deg,
    transparent,
    color-mix(in oklab, var(--a1) 46%, transparent) 24%,
    color-mix(in oklab, var(--a1) 46%, transparent) 76%,
    transparent) !important;
  background-size: 100% 1px !important;
  background-repeat: no-repeat !important;
  background-position: 50% top !important;
}
/* a diamond node set on the rule — the letterpress pause */
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"]::before {
  content: "";
  position: absolute;
  top: -4px;
  left: 50%;
  width: 7px;
  height: 7px;
  margin-left: -3.5px;
  transform: rotate(45deg);
  background: color-mix(in oklab, var(--sheet) 92%, white);
  box-shadow: 0 0 0 1.2px color-mix(in oklab, var(--a1) 62%, transparent);
  pointer-events: none;
}
/* the section head: a rule that BREAKS around its title (AIGA Eye on Design) */
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] {
  display: flex !important;
  align-items: center;
  gap: clamp(14px, 2.6vw, 28px);
  margin-bottom: clamp(26px, 3.6vw, 42px) !important;
}
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::before,
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::after {
  content: "";
  flex: 1 1 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, color-mix(in oklab, var(--a1) 44%, transparent));
}
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::after {
  background: linear-gradient(90deg, color-mix(in oklab, var(--a1) 44%, transparent), transparent);
}
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] h2 {
  flex: 0 1 auto;
  font-size: clamp(24px, 3.4vw, 38px) !important;
  line-height: 1.06 !important;
  letter-spacing: -.022em !important;
  text-wrap: balance;
}

/* ── 10. Entrance choreography (Obys): the page assembles top-down ──────── */
@keyframes h-rise { from { opacity: 0; transform: translateY(13px); } to { opacity: 1; transform: none; } }
@keyframes h-mast { from { opacity: 0; transform: translateY(15px) scale(.985); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: no-preference) {
  .fl-scroll > .v2-post { animation: h-rise .5s var(--h-out) both; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > *:not(.ui-sheet):not(.ui-sheet-scrim) {
    animation: h-rise var(--h-enter) var(--h-out) both;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo { animation-name: h-mast; animation-delay: 60ms; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-copy { animation-delay: 170ms; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-ask     { animation-delay: 280ms; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-quick   { animation-delay: 360ms; }
}

/* ── 11. Phone: 390px, no horizontal overflow, 44px targets ─────────────── */
@media (max-width: 480px) {
  .fl-hero-logo { letter-spacing: 0 !important; }
  .fl-hero-copy { max-width: 100% !important; }
  .fl-hero-copy::before { width: min(200px, 56%); }
  .v2-ask[data-sec="hero-ask"] input {
    min-height: 60px !important;
    padding: 16px 62px 16px 48px !important;
    font-size: 16px !important;
  }
  .v2-ask[data-sec="hero-ask"] input::placeholder { font-size: 17px !important; }
  .v2-ask[data-sec="hero-ask"] .v2-lead { left: 18px !important; }
  .v2-ask[data-sec="hero-ask"] .v2-go { width: 46px !important; height: 46px !important; }
}


/* ══════════════════════════════════════════════════════════════════════
   THE PARLOR · WIZARD — from the 52-site study (see built-inventory)
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   frag-wizard.css — THE ASK FLOW, set as a printed form
   Surface: the create-a-loop wizard only.

   SCOPE
   Every rule is prefixed with the wizard anchor (see §0 below) — the topic
   field id exists only inside this wizard, so nothing here can reach the
   dashboard, insights or the about page (all of which also use .fl-scroll).
   The :has() argument is an id, so the prefix carries id-level specificity
   and cleanly outranks parlor.css's !important element rules without
   resorting to selector spam.

   THE IDEA
   The wizard is where somebody decides to ask for the truth. It should read
   like a form printed for that purpose — a masthead, a register of steps set
   like a plate number, a sentence you complete on a ruled line, an index of
   questions with ordinals and a hairline between them — not like a settings
   screen made of pill chips.

   CONTRAST — every colour below was resolved through color-mix in all six
   rooms and measured (rd2 rig, sRGB WCAG 2.1). The worst room is quoted at
   each rule. Two shipped AA failures are FIXED here rather than inherited:
     • --ctaText on --a1/--cta is 3.76 / 3.99:1 in the Rose Room, so the
       brass-filled "+ Add" pills and the filled step numeral could not be
       used as-is. They become paper-and-keyline objects instead.
     • --a1 as a 2px indicator rule under the topic field is 2.97:1 in the
       Parlor (below the 3:1 non-text floor). It becomes --a1Text (4.92:1).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 0. Local ink and timing, derived only from room tokens ─────────────── */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) {
  /* stocks */
  --w-stock:  color-mix(in oklab, var(--sheet) 96%, var(--p-shade));
  --w-lit:    color-mix(in oklab, var(--a1) 16%, var(--sheet));
  --w-litter: color-mix(in oklab, var(--a1) 22%, var(--sheet));
  /* rules */
  --w-hair:   color-mix(in oklab, var(--ink) 22%, transparent);
  --w-hairsoft: color-mix(in oklab, var(--ink) 15%, transparent);
  --w-rule:   color-mix(in oklab, var(--ink) 26%, transparent);
  --w-brass:  color-mix(in oklab, var(--a1Text) 62%, transparent);
  --w-brassX: color-mix(in oklab, var(--a1Text) 88%, transparent);
  /* object physics (Raycast) */
  --w-edge:   inset 0 1px 0 rgba(255, 255, 255, .82);
  --w-ring:   inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent);
  --w-plinth: 0 1px 0 color-mix(in oklab, var(--ink) 18%, transparent),
              0 2px 3px -2px color-mix(in oklab, var(--ink) 42%, transparent);
  --w-ramp:   0 1px 1px -1px color-mix(in oklab, var(--ink) 28%, transparent),
              0 6px 10px -8px color-mix(in oklab, var(--ink) 32%, transparent),
              0 26px 40px -28px rgba(0, 0, 0, .8);
  /* motion (Emil Kowalski's proportional set) */
  --w-press: 70ms;
  --w-hover: 180ms;
  --w-out: cubic-bezier(.2, .7, .3, 1);
  font-variant-numeric: tabular-nums lining-nums;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) { overflow-x: clip; }


/* ══ 1. THE MASTHEAD ═══════════════════════════════════════════════════════
   Eleven Fraunces sizes inside an 11px span is a mush. This surface uses
   three rungs only: 44 / 22 / 16. The jump is the hierarchy.
   Title: --ink on --sheet = 13.88:1 worst (ember).                        */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="font-size: 26px"][style*="letter-spacing: var(--tr-display)"] {
  font-size: clamp(33px, 4.4vw, 45px) !important;
  line-height: 1.02 !important;
  letter-spacing: -.026em !important;
  color: var(--ink) !important;
  text-wrap: balance;
  margin: 0 0 2px !important;
  /* Graza ink-spread in currentColor (can only raise contrast) + one plate of
     Tartine misregistration from the room's own second ink. */
  text-shadow:
    .034em .034em 0 color-mix(in oklab, var(--a2) 22%, transparent),
    .011em .011em 0 currentColor,
    -.007em .007em 0 currentColor;
}
@supports (text-box: trim-both cap alphabetic) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="font-size: 26px"][style*="letter-spacing: var(--tr-display)"],
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="font-size: 20px"][style*="letter-spacing: var(--tr-display)"] {
    text-box: trim-both cap alphabetic;
    margin-block: .30em .30em !important;
  }
}
/* a masthead needs a rule over it, not a gap */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child { position: relative; }
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child::before {
  content: "";
  display: block;
  width: 100%;
  height: 5px;
  margin-bottom: 16px;
  background-image:
    linear-gradient(90deg, var(--a1Text) 0 34px, transparent 34px),
    linear-gradient(90deg, var(--w-hair) 0 100%);
  background-size: 100% 2px, 100% 1px;
  background-position: left top, left 4px;
  background-repeat: no-repeat;
  opacity: .9;
}
/* the deck is the voice, not more UI. --body on --sheet = 7.88:1 worst. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="font: 400 14px / 1.6"][style*="color: var(--muted)"] {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: clamp(17px, 1.7vw, 20px) !important;
  line-height: 1.44 !important;
  letter-spacing: .004em !important;
  color: var(--body) !important;
  max-width: 54ch;
  margin-top: 12px !important;
  text-wrap: pretty;
}
/* printer's rule: a brass hairline over an ink hairline */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"] {
  border-top: 0 !important;
  height: 3px;
  margin-top: 26px !important;
  background-image:
    linear-gradient(90deg, var(--w-brassX), color-mix(in oklab, var(--a1Text) 14%, transparent) 62%, transparent),
    linear-gradient(90deg, var(--w-hairsoft), transparent 78%);
  background-size: 100% 1px, 100% 1px;
  background-position: left top, left 2px;
  background-repeat: no-repeat;
}


/* ══ 2. THE REGISTER (the stepper) ═════════════════════════════════════════
   Two grey circles become a printed register: plate-numbered roundels, a
   dashed leader that fills brass behind you, and wall-label step names.   */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] {
  align-items: center !important;
  gap: 14px !important;
  min-height: 52px;
  margin: 22px 0 30px !important;
  padding-bottom: 14px;
  background-image: linear-gradient(90deg, var(--w-hairsoft), transparent 88%) !important;
  background-size: 100% 1px !important;
  background-position: left bottom !important;
  background-repeat: no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] > [style*="gap: 9px"] {
  gap: 11px !important;
  min-height: 44px;
  align-items: center !important;
}
/* the roundels — tabular numerals, cut into paper */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"] {
  width: 30px !important;
  height: 30px !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 12.5px !important;
  font-variant-numeric: tabular-nums lining-nums;
  letter-spacing: .01em;
}
/* current step — a lamplit tile with a brass ring. --ink on --a1 16% + sheet
   = 12.4:1 worst (ember). Ring --a1Text is 4.9:1+, well over the 3:1 floor. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  background: var(--w-lit) !important;
  color: var(--ink) !important;
  box-shadow:
    inset 0 0 0 1.5px var(--w-brassX),
    inset 0 1px 0 rgba(255, 255, 255, .8),
    0 0 16px -6px color-mix(in oklab, var(--a1) 70%, transparent);
}
/* upcoming step — a blind deboss: hairline ring, no fill.
   --body on --sheet = 7.88:1 worst (meadow). */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"][style*="background: var(--rule)"] {
  background: transparent !important;
  color: var(--body) !important;
  box-shadow: inset 0 0 0 1px var(--w-hair);
}
/* step names as wall labels — --ink 13.9:1 / --body 7.9:1 on --sheet */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="white-space: nowrap"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  letter-spacing: .19em !important;
  text-transform: uppercase;
  line-height: 1.2 !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] > [style*="gap: 9px"]:first-of-type [style*="white-space: nowrap"] { color: var(--ink) !important; }
/* the upcoming step ships as --muted, which is only 4.68:1 in the Blue Hour.
   --body gives the same "quieter" read with 7.88:1 of headroom. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] > [style*="gap: 9px"]:not(:first-of-type) [style*="white-space: nowrap"] { color: var(--body) !important; }
/* the leader: a dashed rule with the travelled part inked brass */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="height: 2px"] {
  background-color: transparent !important;
  height: 3px !important;
  border-radius: 0 !important;
  min-width: 24px !important;
  background-image:
    linear-gradient(90deg, var(--w-brassX), color-mix(in oklab, var(--a1Text) 20%, transparent)),
    repeating-linear-gradient(90deg, var(--w-hair) 0 3px, transparent 3px 8px) !important;
  background-size: 26% 2px, 100% 1px !important;
  background-position: left center, left center !important;
  background-repeat: no-repeat, repeat-x !important;
}


/* ══ 3. THE SENTENCE ═══════════════════════════════════════════════════════
   "I want to [receive] honest feedback about ___" is the one line that
   states the product. It is set as a line of type with a word switched in
   it, not as a segmented control with words inside.                       */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="font-size: 21px"][style*="flex-wrap: wrap"] {
  font-size: clamp(23px, 2.8vw, 31px) !important;
  line-height: 1.22 !important;
  letter-spacing: -.018em !important;
  gap: 6px 11px !important;
  align-items: center !important;
  text-wrap: balance;
}
/* the trough stops being a grey tray: it is a ruled slot in the line, so the
   two candidate words sit on the page and one of them is lit. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] {
  background: none !important;
  background-color: transparent !important;
  border-color: transparent !important;
  border-radius: 0 !important;
  padding: 2px !important;
  box-shadow: inset 0 -1px 0 var(--w-hairsoft) !important;
}
/* the thumb keeps its inline geometry (JS drives `left`) and changes only its
   face: lit paper with a brass ledge, the Frans Hals block that takes the
   item rather than a coloured pill floating under it. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: calc(50% - 4px)"] {
  top: 2px !important;
  bottom: 2px !important;
  background: var(--w-lit) !important;
  border-radius: 8px 8px 0 0 !important;
  box-shadow:
    inset 0 -3px 0 var(--a1Text),
    inset 0 1px 0 rgba(255, 255, 255, .78),
    inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 24%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: clamp(18px, 1.9vw, 22px) !important;
  letter-spacing: .004em !important;
  min-height: 44px !important;
  padding: 6px 0 !important;
  transition: color var(--w-hover) ease, letter-spacing var(--w-hover) var(--w-out) !important;
}
/* chosen word: --ink on the lit tile = 12.4:1 worst. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn[style*="color: var(--ctaText)"] { color: var(--ink) !important; }
/* the other word: --body on the trough stock = 7.4:1 worst. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn[style*="color: var(--body)"] { color: var(--body) !important; }
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn svg {
  width: 13px; height: 13px; opacity: .72;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn[style*="color: var(--body)"]:hover {
    color: var(--ink) !important;
    letter-spacing: .028em !important;
  }
}

/* ── the topic line: paper you write on, not a filled input ──────────────
   Tally's ruled field. The pencil emoji background is retired (rule 6) —
   the rule under the line is the affordance. --ink on --sheet = 13.9:1;
   the 2px indicator is --a1Text (4.92:1) because raw --a1 measures 2.97:1
   in the Parlor and fails the 3:1 non-text floor.                         */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in {
  background-image: none !important;
  background-color: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: inset 0 -2px 0 var(--a1Text) !important;
  transition: box-shadow var(--w-hover) ease, background-color var(--w-hover) ease;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: clamp(22px, 2.5vw, 29px) !important;
  line-height: 1.34 !important;
  letter-spacing: .002em !important;
  color: var(--ink) !important;
  padding: 10px 2px 12px !important;
  min-height: 62px !important;
  margin-top: 20px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main::placeholder,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf::placeholder,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in::placeholder {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  /* mixed ink placeholder = 5.43:1 worst (Blue Hour) */
  color: color-mix(in oklab, var(--muted) 88%, var(--ink)) !important;
  opacity: 1;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main:focus,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf:focus,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in:focus {
  box-shadow: inset 0 -2.5px 0 var(--a1Text) !important;
  background-color: color-mix(in oklab, var(--a1) 7%, transparent) !important;
}


/* ══ 4. FINE TUNING — a rule that breaks around its label ══════════════════
   AIGA Eye on Design's broken rule replaces a bordered disclosure box.    */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] {
  border: 0 !important;
  background: transparent !important;
  border-radius: 0 !important;
  margin-top: 26px !important;
  overflow: visible !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn {
  padding: 0 !important;
  min-height: 44px;
  gap: 14px !important;
  border-radius: 0 !important;
  align-items: center !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn::after {
  content: "";
  order: 1;
  flex: 1 1 0;
  height: 1px;
  background-image: linear-gradient(90deg, var(--w-brass), color-mix(in oklab, var(--a1Text) 8%, transparent) 70%, transparent);
  transition: opacity var(--w-hover) ease;
  opacity: .8;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn > span:first-child {
  order: 0;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  letter-spacing: .19em !important;
  text-transform: uppercase;
  color: var(--ink) !important;
  transition: letter-spacing var(--w-hover) var(--w-out);
}
/* "· optional" returns to the voice — --a1Text on --sheet = 4.92:1 worst */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn > span:first-child > span {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 15px !important;
  letter-spacing: 0 !important;
  text-transform: none;
  color: var(--a1Text) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn > span:last-child {
  order: 2;
  color: var(--a1Text) !important;
  font-size: 11px !important;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn:hover > span:first-child { letter-spacing: .24em !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn:hover::after { opacity: 1; }
}


/* ══ 5. THE NOTICE — an editor's margin note, not a coloured box ══════════
   Public Domain Review marginalia. The tinted box and the 3px green slab go;
   what is left is a hanging brass rule and a voice.                       */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] {
  background: none !important;
  background-color: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  padding: 2px 0 2px 20px !important;
  margin: 4px 0 20px -22px !important;
  position: relative;
  background-image: linear-gradient(180deg, transparent, var(--w-brassX) 14%, var(--w-brassX) 86%, transparent) !important;
  background-size: 2px 100% !important;
  background-position: left top !important;
  background-repeat: no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] > [style*="font: 600 16px"] {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 20px !important;
  line-height: 1.3 !important;
  letter-spacing: .003em !important;
  color: var(--ink) !important;      /* 13.88:1 worst */
  margin-bottom: 6px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] > [style*="font: 400 14px"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-size: 13.5px !important;
  font-weight: 500 !important;
  line-height: 1.62 !important;
  color: var(--body) !important;     /* 7.88:1 worst */
  max-width: 58ch;
  text-wrap: pretty;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] strong {
  font-weight: 700 !important;
  color: var(--ink) !important;
}


/* ══ 6. CARD SHELLS — sheets, not outlines ════════════════════════════════
   Family's rule: depth is a lit top edge plus a three-stop ramp, never a
   border. Nesting steps the stock instead of adding a stroke.             */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
  border: 0 !important;
  border-radius: 16px !important;
  background-color: var(--w-stock) !important;
  box-shadow: var(--w-edge), var(--p-hair), var(--w-ramp) !important;
  overflow: hidden !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] { margin-top: 30px !important; }

/* card headers: a hairline and a short accent tab, not a 3px slab */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-req,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-sf,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-top: 3px solid var(--a1)"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 16px 18px 12px"] {
  position: relative;
  border-top: 0 !important;
  border-bottom: 0 !important;
  background: transparent !important;
  background-color: transparent !important;
  padding: 20px 18px 14px !important;
  background-image: linear-gradient(90deg, var(--w-hair), transparent 82%) !important;
  background-size: 100% 1px !important;
  background-position: left bottom !important;
  background-repeat: no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-req::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-sf::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-top: 3px solid var(--a1)"]::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 16px 18px 12px"]::before {
  content: "";
  position: absolute;
  left: 0; top: 0;
  width: 46px; height: 2px;
  background: var(--a1Text);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-req::before { background: var(--a2Text); }

/* rung 2: every card title lands on one size */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="font-size: 20px"][style*="letter-spacing: var(--tr-display)"] {
  font-size: 22px !important;
  line-height: 1.14 !important;
  letter-spacing: -.014em !important;
  color: var(--ink) !important;
  text-wrap: balance;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-req > [style*="font: 400 12.5px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-sf > [style*="font: 400 12.5px"] {
  color: var(--body) !important;     /* was --muted; --body is 7.88:1 worst */
  font-weight: 500 !important;
  font-size: 13px !important;
}
/* badges become keyline labels — no fill, no pill.
   --a1Text 4.92:1 / --a2Text 5.49:1 on --sheet, and both are bold caps.   */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="vertical-align: 4px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="vertical-align: 3px"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 9.5px !important;
  letter-spacing: .2em !important;
  background: none !important;
  border-radius: 3px !important;
  padding: 4px 7px 3px !important;
  vertical-align: 5px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="vertical-align: 4px"] {
  color: var(--a2Text) !important;
  border: 1px solid color-mix(in oklab, var(--a2Text) 40%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="vertical-align: 3px"] {
  color: var(--a1Text) !important;
  border: 1px solid color-mix(in oklab, var(--a1Text) 40%, transparent) !important;
}
/* Back / Next read as page turns */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="margin: -12px -10px"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .16em !important;
  text-transform: uppercase;
  min-height: 44px;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="cursor: pointer"][style*="margin: -12px -10px"] { color: var(--a2Text) !important; }
/* the inert Back ships at --muted 40% + --sheet, which measures 1.72–1.82:1 —
   inactive controls are exempt from 1.4.3, but that is invisible rather than
   inert. 78% reads unmistakably disabled and still measures 3.16–3.58:1. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="cursor: default"][style*="margin: -12px -10px"] {
  color: color-mix(in oklab, var(--muted) 78%, var(--sheet)) !important;
}


/* ══ 7. THE QUESTION INDEX ════════════════════════════════════════════════
   Five cards with five brass buttons become an index: ordinals in a
   reserved gutter, a hairline between rows, and a brass rule that draws in
   under the row you are on (Fonts In Use). The questions are the payload,
   so they are set in the voice, not in UI sans.                           */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 14px 16px"]:has(> [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]) {
  counter-reset: flq;
  padding: 6px 18px 16px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] {
  position: relative;
  counter-increment: flq;
  background-color: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  margin-bottom: 0 !important;
  padding: 15px 4px 15px 40px !important;
  gap: 16px !important;
  min-height: 60px;
  /* layer 1: the hover rule, drawn from the left. layer 2: the row divider,
     inset to the text column (Stripe) so it reads as a paragraph break. */
  background-image:
    linear-gradient(90deg, var(--w-brassX), color-mix(in oklab, var(--a1Text) 12%, transparent)),
    linear-gradient(90deg, transparent 0 40px, var(--w-rule) 40px 72%, color-mix(in oklab, var(--ink) 8%, transparent) 100%) !important;
  background-size: 0% 1.5px, 100% 1px !important;
  background-position: left bottom, left top !important;
  background-repeat: no-repeat, no-repeat !important;
  transition: background-size .28s var(--w-out);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 14px 16px"]:has(> [style*="border-left: 8px solid var(--a2)"]) > *:first-child { background-position: left bottom, left -99px !important; }
/* the ordinal — --body on --sheet = 7.88:1 worst */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]::before {
  content: counter(flq, decimal-leading-zero);
  position: absolute;
  left: 4px;
  top: 20px;
  font: 700 10.5px/1 'Karla', system-ui, sans-serif;
  letter-spacing: .13em;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--body);
  transition: color var(--w-hover) ease;
}
/* the question, in the voice. --ink on --sheet = 13.88:1 worst */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > [style*="font: 400 14px / 1.4"] {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: clamp(17px, 1.7vw, 19.5px) !important;
  line-height: 1.4 !important;
  letter-spacing: .002em !important;
  color: var(--ink) !important;
  max-width: 46ch;
  text-wrap: pretty;
  transition: letter-spacing .22s var(--w-out);
}
/* the affordance. A brass-filled pill here is an AA bug: --ctaText on --a1 is
   3.76:1 in the Rose Room. A keyline on paper is 4.92:1 in the worst room
   and it stops five buttons from shouting over the questions.             */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > button.fl-btn {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .14em !important;
  text-transform: uppercase;
  color: var(--a1Text) !important;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  border-radius: 9px !important;
  min-height: 44px !important;
  min-width: 74px;
  padding: 0 12px !important;
  background-image: linear-gradient(180deg,
      color-mix(in oklab, var(--sheet) 92%, white) 0%,
      color-mix(in oklab, var(--sheet) 97%, var(--p-shade)) 100%) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .82),
              inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 40%, transparent),
              var(--w-plinth) !important;
  transition: box-shadow var(--w-hover) var(--w-out), background-color var(--w-hover) var(--w-out),
              color var(--w-hover) ease, transform var(--w-hover) var(--w-out) !important;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]:hover,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]:focus-within { background-size: 100% 1.5px, 100% 1px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]:hover::before { color: var(--a1Text); }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]:hover > [style*="font: 400 14px / 1.4"] { letter-spacing: .012em !important; }
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]:hover > button.fl-btn,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > button.fl-btn:hover {
    background-image: none !important;
    background-color: var(--w-litter) !important;
    color: var(--ink) !important;    /* --ink on a1 22% + sheet = 11.6:1 worst */
    box-shadow: inset 0 0 0 1px var(--w-brassX), var(--w-edge), var(--w-plinth) !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > button.fl-btn:active {
  transform: translateY(1.5px);
  transition-duration: var(--w-press) !important;
}


/* ══ 8. THE CATEGORY CHIPS — collectible, not clickable pills ═════════════
   Raycast physics: bright inset top edge, dark inset ring, one hard bottom
   edge. Every layer is a color-mix off the room's own ink and stock.      */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 12.5px !important;
  letter-spacing: .012em !important;
  border-color: transparent !important;
  border-radius: 8px !important;
  min-height: 36px;
  padding: 8px 13px !important;
  color: var(--body) !important;     /* 7.69:1 worst on chip stock */
  background-image: linear-gradient(180deg,
      color-mix(in oklab, var(--sheet) 92%, white) 0%,
      color-mix(in oklab, var(--sheet) 96%, var(--p-shade)) 100%) !important;
  box-shadow: var(--w-edge), var(--w-ring), var(--w-plinth) !important;
  transition: transform var(--w-hover) var(--w-out), box-shadow var(--w-hover) var(--w-out), color var(--w-hover) ease !important;
}
/* the ones matched to the topic wear a brass keyline — a collector's mark */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="background: var(--sheet)"][style*="color: var(--ink)"] {
  color: var(--ink) !important;
  box-shadow: var(--w-edge), inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 44%, transparent), var(--w-plinth) !important;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:hover {
    transform: translateY(-1px);
    color: var(--ink) !important;
    box-shadow: var(--w-edge), inset 0 0 0 1px var(--w-brass), var(--w-plinth),
                0 8px 14px -10px color-mix(in oklab, var(--a1) 70%, transparent) !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:active {
  transform: translateY(1px);
  transition-duration: var(--w-press) !important;
  box-shadow: inset 0 1px 2px color-mix(in oklab, var(--ink) 26%, transparent), var(--w-ring) !important;
}
/* the suggested tray */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: color-mix(in oklab, var(--warm) 7%, var(--sheet))"] {
  border-color: transparent !important;
  border-radius: 14px !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--warm) 28%, transparent) !important;
}
/* the tab on the tray: a struck stamp. --warmText on --warmDeep = 5.85:1
   worst; the shipped --catText on --warm was 3.28:1 in the Hearth.        */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--warm)"][style*="border-radius: 999px"] {
  background: var(--warmDeep) !important;
  color: var(--warmText) !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10px !important;
  letter-spacing: .2em !important;
  border-radius: 4px !important;
  padding: 6px 11px 5px !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 3px 7px -3px rgba(0, 0, 0, .6) !important;
}
/* "more themes" becomes a broken rule instead of a grey pill */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"] {
  display: flex !important;
  align-items: center;
  gap: 14px;
  width: 100%;
  background: none !important;
  border-radius: 0 !important;
  padding: 4px 0 !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10px !important;
  letter-spacing: .2em !important;
  color: var(--body) !important;     /* 7.88:1 worst */
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"]::after {
  content: "";
  flex: 1 1 0;
  height: 1px;
  background: linear-gradient(90deg, var(--w-hair), transparent 76%);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 12px"][style*="border-bottom: 1px solid var(--rule)"] {
  border-bottom: 0 !important;
  gap: 7px !important;
  padding: 10px 12px 16px !important;
  background: transparent !important;
}


/* ══ 9. THE QUESTIONS YOU ARE SENDING ═════════════════════════════════════ */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] { align-items: baseline !important; }
/* the counter: tabular, keylined, never a filled tag on --rule (3.72:1) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 8px"] {
  background: none !important;
  color: var(--a1Text) !important;   /* 4.71:1 worst on card stock */
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .12em !important;
  font-variant-numeric: tabular-nums lining-nums;
  border-radius: 4px !important;
  padding: 3px 7px !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 40%, transparent);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 16px 18px 12px"] > [style*="font: 400 12.5px / 1.5"] {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: 16px !important;
  color: var(--body) !important;
}
/* a slot: a brass ledge on the leading edge, Mercury-style, in --a1Text
   (4.71:1) because --a1 as an indicator is 2.84:1 on this stock.          */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] {
  border-left: 0 !important;
  border-radius: 0 !important;
  padding: 4px 0 4px 16px !important;
  margin-bottom: 16px !important;
  background-image: linear-gradient(180deg, var(--w-brassX), color-mix(in oklab, var(--a1Text) 18%, transparent)) !important;
  background-size: 2px 100% !important;
  background-position: left top !important;
  background-repeat: no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] [style*="border-radius: 50%"] {
  background: transparent !important;
  color: var(--body) !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  font-variant-numeric: tabular-nums lining-nums;
  box-shadow: inset 0 0 0 1px var(--w-hair);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) textarea[style*="white-space: pre-wrap"] {
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: inset 0 -1.5px 0 var(--w-hair) !important;
  padding: 12px 2px !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-size: 15px !important;
  color: var(--ink) !important;
  transition: box-shadow var(--w-hover) ease;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) textarea[style*="white-space: pre-wrap"]:focus { box-shadow: inset 0 -2px 0 var(--a1Text) !important; }
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border: 1px dashed"] {
  border: 1px dashed color-mix(in oklab, var(--a1Text) 42%, transparent) !important;
  color: var(--a1Text) !important;   /* 4.71:1 worst */
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .14em !important;
  text-transform: uppercase;
  border-radius: 9px !important;
  min-height: 44px;
  padding: 0 16px !important;
  transition: background-color var(--w-hover) ease, color var(--w-hover) ease;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border: 1px dashed"]:hover {
    background: var(--w-litter) !important;
    color: var(--ink) !important;
  }
}
/* the remove control is a keyline, not a tinted blob */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="width: 32px"][style*="height: 32px"] {
  background: transparent !important;
  color: var(--body) !important;     /* 7.88:1 worst */
  border-radius: 8px !important;
  box-shadow: inset 0 0 0 1px var(--w-hairsoft);
  transition: box-shadow var(--w-hover) ease, color var(--w-hover) ease;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="width: 32px"][style*="height: 32px"]:hover {
    color: var(--a2Text) !important;  /* 5.49:1 worst */
    box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 45%, transparent);
  }
}
/* a card inside a card steps the stock and drops its shadow (Family) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--tint2)"] {
  border: 0 !important;
  border-radius: 12px !important;
  background: color-mix(in oklab, var(--sheet) 90%, var(--p-shade)) !important;
  box-shadow: var(--w-edge), var(--p-hair) !important;
  padding: 14px 16px 16px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--tint2)"] > [style*="font: 600 12.5px"] {
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .17em !important;
  text-transform: uppercase;
  color: var(--ink) !important;
  margin-bottom: 10px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--tint2)"] > [style*="font: 600 12.5px"] > span {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: 14px !important;
  letter-spacing: 0 !important;
  text-transform: none;
  color: var(--body) !important;
}


/* ══ 10. MOTION — scroll authors it, nothing depends on it ════════════════ */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    @keyframes w-into-light { from { opacity: .3; transform: translateY(12px); } to { opacity: 1; transform: none; } }
    .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen,
    .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"],
    .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
      animation: w-into-light linear both;
      animation-timeline: view();
      animation-range: entry 5% cover 24%;
    }
  }
}


/* ══ 11. 390px — the wizard on a phone ════════════════════════════════════ */
@media (max-width: 760px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] { margin-left: 0 !important; }
}
@media (max-width: 560px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] {
    gap: 9px !important;
    flex-wrap: nowrap !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="white-space: nowrap"] {
    font-size: 9.5px !important;
    letter-spacing: .1em !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"] { width: 26px !important; height: 26px !important; font-size: 11px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="height: 2px"] { min-width: 12px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] {
    padding: 14px 2px 14px 32px !important;
    gap: 10px !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > button.fl-btn {
    min-width: 60px; padding: 0 9px !important; letter-spacing: .1em !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > [style*="font: 400 14px / 1.4"] {
    font-size: 16.5px !important; min-width: 0;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] {
    background-image:
      linear-gradient(90deg, var(--w-brassX), color-mix(in oklab, var(--a1Text) 12%, transparent)),
      linear-gradient(90deg, transparent 0 34px, var(--w-rule) 34px 76%, color-mix(in oklab, var(--ink) 8%, transparent) 100%);
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]::before { left: 0; top: 18px; }
}
/* 44px tap targets on any narrow viewport AND on any coarse pointer —
   the two are not the same population and both must be covered. */
@media (pointer: coarse), (max-width: 620px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"] { min-height: 44px; padding: 11px 14px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="width: 32px"][style*="height: 32px"] { min-width: 44px !important; min-height: 44px !important; width: 44px !important; height: 44px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="margin: -12px -10px"] { min-height: 44px; display: inline-flex; align-items: center; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn { -webkit-tap-highlight-color: transparent; touch-action: manipulation; }
}


/* ══ 12. Reduced motion — the finished page, held still ═══════════════════ */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) *,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) *::before,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
  }
  /* reduced motion means no movement, not no feedback: the end states above
     are all reachable, they simply arrive instantly. */
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] { background-size: 100% 1.5px, 100% 1px !important; }
}


/* ══════════════════════════════════════════════════════════════════════
   THE PARLOR · LIST — from the 52-site study (see built-inventory)
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   frag-list.css — LOOPONOMICS: the ledger
   Loads after parlor.css. Scoped to the Looponomics scroller only:
   .fl-scroll:has(.v2-sent) — the one column in the app that carries the
   filter sentence. Nothing here can reach the wizard, the hero or the
   respondent view.

   MEASURED FLOOR (lx-contrast.py, oklab color-mix, all six rooms):
   the cards and this whole column sit on --p-paper-lit, whose darkest stop is
   color-mix(in oklab, var(--sheet) 88%, var(--p-shade)). Against THAT stop:
     --ink      13.04–13.96 ✓      --body     7.36–8.49 ✓
     --a1Text    4.58–5.45  ✓      --a2Text   5.12–6.61 ✓
     --a3Text    4.72–6.26  ✓      --warmDeep 5.12–6.03 ✓
     --muted     4.39–5.09  ✗  ← fails AA in Blue Hour (4.39) and Conservatory
   So --muted is BANNED in this column. Everything the app painted muted is
   re-inked to --body or to a measured mix of --body, and quietness is bought
   with size, weight and tracking instead of with lightness.
   ═══════════════════════════════════════════════════════════════════════════ */

.fl-scroll:has(.v2-sent) {
  /* the paper this column is printed on */
  --lx-stock: color-mix(in oklab, var(--sheet) 93%, var(--p-shade));
  --lx-stock-lead: color-mix(in oklab, var(--sheet) 96%, white);
  /* inks (every one measured above) */
  --lx-quiet: color-mix(in oklab, var(--body) 88%, var(--sheet)); /* 5.68–6.36 */
  --lx-hair: color-mix(in oklab, var(--ink) 15%, transparent);
  --lx-brass: color-mix(in oklab, var(--a1Text) 62%, transparent);
  /* the house motif: one brass lozenge, used as slot mark, rule break, pause */
  --lx-loz: color-mix(in oklab, var(--a1Text) 78%, transparent);
  /* Family: depth is a lit edge plus a three-stop ramp, never a border */
  --lx-edge: inset 0 1px 0 color-mix(in oklab, white 62%, transparent);
  --lx-ramp:
    0 1px 1px -1px color-mix(in oklab, var(--ink) 30%, transparent),
    0 6px 10px -8px color-mix(in oklab, var(--ink) 32%, transparent),
    0 22px 34px -26px rgba(0, 0, 0, .8);
  /* Emil Kowalski's duration/easing law */
  --lx-t-press: 70ms;
  --lx-t-hover: 180ms;
  --lx-e-out: cubic-bezier(.2, .7, .3, 1);
  font-variant-numeric: tabular-nums lining-nums;
}

/* ── 1. THE MASTHEAD ─────────────────────────────────────────────────────────
   Bloomberg Businessweek: ban the middle of the scale. The page had a 26px
   title, a 22px filter sentence and 14px card titles — three sizes inside 12px,
   which is why nothing read as a hierarchy. The title now leaps to ~46px and
   tracks hard negative; everything else falls back to label sizes. */
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] {
  align-items: flex-end !important;
  margin-bottom: 0 !important;
}
.fl-scroll:has(.v2-sent) [style*="font-family: Fraunces"][style*="font-size: 26px"] {
  font-size: clamp(34px, 4.4vw, 46px) !important;
  line-height: .96 !important;
  letter-spacing: -.026em !important;
  color: var(--ink) !important;
  text-wrap: balance;
  margin-bottom: 2px;
}
@supports (text-box: trim-both cap alphabetic) {
  .fl-scroll:has(.v2-sent) [style*="font-family: Fraunces"][style*="font-size: 26px"] {
    text-box: trim-both cap alphabetic;
    margin-block: .06em .10em;
  }
}
/* the deck is the voice, not a caption */
.fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: 18px !important;
  line-height: 1.42 !important;
  color: var(--body) !important;      /* was --muted: 4.39 on the darkest stop */
  max-width: 42ch;
  margin-top: 9px !important;
  text-wrap: pretty;
}
/* "Hide samples" is a utility, not an action: a tracked label on a hairline */
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn {
  min-height: 30px !important;
  padding: 4px 1px 5px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  box-shadow: 0 1px 0 var(--lx-brass) !important;
  font: 700 10.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .19em !important;
  text-transform: uppercase !important;
  color: var(--a1Text) !important;    /* 4.58–5.45 on the darkest stop */
  align-self: flex-end;
  margin-bottom: 6px;
  transition: box-shadow var(--lx-t-hover) var(--lx-e-out), color var(--lx-t-hover) var(--lx-e-out);
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn:hover {
    color: var(--ink) !important;
    box-shadow: 0 1px 0 var(--a1Text) !important;
  }
}
/* the head's closing rule: brass, fading, with air around it */
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
  border-top-color: transparent !important;
  height: 1px;
  margin: 30px 0 26px !important;
  background-image: linear-gradient(90deg,
      color-mix(in oklab, var(--a1Text) 52%, transparent) 0%,
      color-mix(in oklab, var(--a1Text) 16%, transparent) 46%,
      transparent 100%) !important;
  background-size: 100% 1px !important;
  background-repeat: no-repeat !important;
}

/* ── 2. THE FILTER SENTENCE ──────────────────────────────────────────────────
   Linear's filter grammar, set as a line of prose rather than a toolbar: the
   joining words are the whispered voice (Instrument Serif italic, --body) and
   the VALUES are the display face in full ink, so the sentence reads
   "quiet · LOUD · quiet · LOUD". It is now the second-largest type on the page,
   which is correct — it is the best idea in the product. */
.fl-scroll:has(.v2-sent) [style*="order: 1; flex-basis"] { margin-bottom: 6px; }
.fl-scroll:has(.v2-sent) .v2-sent {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: clamp(24px, 3.1vw, 32px) !important;
  line-height: 1.34 !important;
  letter-spacing: .004em !important;
  color: var(--body) !important;      /* was --muted */
  text-wrap: balance;
}
.fl-scroll:has(.v2-sent) .v2-slotwrap { white-space: nowrap; }
.fl-scroll:has(.v2-sent) .v2-slot {
  font-family: 'Fraunces', Georgia, serif !important;   /* Young Serif */
  font-style: normal !important;
  font-size: .92em !important;
  letter-spacing: -.012em !important;
  color: var(--ink) !important;
  padding: 0 1px 2px !important;
  /* Cuberto: two underline plates — one wipes out right, one draws in left */
  text-decoration: none !important;
  background-image:
    linear-gradient(var(--a1Text), var(--a1Text)),
    linear-gradient(var(--a1Text), var(--a1Text)) !important;
  background-size: 100% 1.5px, 0 1.5px !important;
  background-position: 100% 100%, 0 100% !important;
  background-repeat: no-repeat !important;
  transition: background-size .2s cubic-bezier(.4, 0, .2, 1), color var(--lx-t-hover) ease;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) .v2-slot:hover {
    background-size: 0 1.5px, 100% 1.5px !important;
    transition-delay: 0s, .16s;
  }
}
/* The house lozenge marks a word you can open. It hangs off the end of the
   rule, below the baseline, so the sentence's own line is never disturbed.
   NOTE: .v2-slot::after is the app's invisible hit-area expander
   (inset:-8px -4px) — touching it would shrink a tap target, so the ornament
   goes on ::before and the hit area is left exactly as the app built it. */
.fl-scroll:has(.v2-sent) .v2-slot::before {
  content: '';
  position: absolute;
  inset: auto -1px -6px auto;
  width: 4.5px; height: 4.5px;
  transform: rotate(45deg);
  background: var(--lx-loz);
  transition: transform var(--lx-t-hover) var(--lx-e-out);
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) .v2-slot:hover::before { transform: rotate(45deg) scale(1.45); }
}

/* ── 3. THE SEARCH LINE ──────────────────────────────────────────────────────
   Tally: a field is a line you write on, not a box you are put in. The pill
   was competing with the sentence above it; as a ruled line it recedes to
   second voice while keeping its 44px tap target. */
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn {
  min-height: 44px !important;
  padding: 0 2px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  box-shadow: inset 0 -1px 0 var(--lx-hair) !important;
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: 16px !important;
  color: var(--body) !important;      /* was --muted */
  gap: 11px !important;
  transition: box-shadow var(--lx-t-hover) var(--lx-e-out);
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn:hover {
    box-shadow: inset 0 -1.5px 0 var(--a1Text) !important;
  }
}
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn svg { opacity: .85; }
.fl-scroll:has(.v2-sent) > [style*="margin-bottom: 22px"] { margin-bottom: 30px !important; }

/* ── 4. THE SECTION MARK ─────────────────────────────────────────────────────
   AIGA Eye on Design: the rule breaks around its label. The label is a tracked
   small-cap in brass ink, then the lozenge, then a hairline that runs out. */
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] {
  margin: 38px 0 14px !important;
  gap: 10px !important;
}
.fl-scroll:has(.v2-sent) .ui-label {
  font: 700 10.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .22em !important;
  text-transform: uppercase !important;
  color: var(--a1Text) !important;    /* 4.58–5.45 */
}
.fl-scroll:has(.v2-sent) .ui-label::after {
  content: '';
  display: inline-block;
  width: 4.5px; height: 4.5px;
  margin: 0 0 1px 10px;
  vertical-align: middle;
  transform: rotate(45deg);
  background: var(--lx-loz);
}
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] > span[style*="height: 1px"] {
  background: linear-gradient(90deg,
      color-mix(in oklab, var(--a1Text) 42%, transparent) 0%,
      color-mix(in oklab, var(--ink) 12%, transparent) 34%,
      transparent 100%) !important;
}

/* Klim: the running head stays with you. In a long ledger the chapter you are
   inside is pinned to the top of the column, on a blurred band of its own
   paper, so a scroll of forty loops never loses its place. */
@supports (position: sticky) {
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] {
    position: sticky;
    top: -1px;
    z-index: 3;
    padding: 9px 0 7px;
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--sheet) 88%, transparent) 0%,
        color-mix(in oklab, var(--sheet) 84%, transparent) 62%,
        transparent 100%);
    backdrop-filter: blur(9px);
    -webkit-backdrop-filter: blur(9px);
  }
}

/* ── 5. THE CARD ─────────────────────────────────────────────────────────────
   Bear's three-track row + Craft's reserved gutter. The old card led with its
   chrome (a toolbar on line one, the question on line two). Re-laid as a grid
   with display:contents on the two wrapper rows, it now reads
     [status glyph]  THE QUESTION      [controls]
     [   time     ]  provenance
   — the human content first, the machinery in the margins. No markup changed:
   the wrappers simply stop generating boxes. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
  display: grid !important;
  /* mark | tags | question/meta | controls — 'tags' is 0 wide until a row
     carries a status pill (INACTIVE / ARCHIVED). Owner 2026-08-17: the pill
     used to be squeezed into the 34px mark track and wrapped letter by letter. */
  grid-template-columns: 34px max-content minmax(0, 1fr) auto;
  grid-template-areas:
    "mark title title title"
    "time tags  meta  acts";
  align-items: center;
  column-gap: 14px;
  row-gap: 6px;
  padding: 15px 30px 15px 15px !important;
  margin-bottom: 8px !important;
  border-width: 0 !important;
  border-radius: 14px !important;
  background-color: var(--lx-stock) !important;
  box-shadow: var(--lx-edge), var(--lx-ramp), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition: transform var(--lx-t-hover) var(--lx-e-out),
              background-color var(--lx-t-hover) ease !important;
}
/* the two wrapper rows stop being boxes */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div:first-of-type,
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="align-items: flex-end"] {
  display: contents !important;
}
/* Mercury: the accent is never a fill, only a state ledge on the leading edge */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] { --lx-spine: var(--a2Text); }
.fl-scroll:has(.v2-sent) > .fl-lift[style*="border-color: var(--a3)"] { --lx-spine: var(--a3Text); }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::before {
  content: '';
  position: absolute;
  left: 0; top: 12px; bottom: 12px;
  width: 3px;
  border-radius: 0 3px 3px 0;
  /* lit, not painted: the ledge falls off at both ends like light on a spine */
  background: linear-gradient(180deg,
      color-mix(in oklab, var(--lx-spine) 52%, transparent) 0%,
      var(--lx-spine) 26%, var(--lx-spine) 74%,
      color-mix(in oklab, var(--lx-spine) 52%, transparent) 100%);
                                      /* a2Text 5.12–6.61 · a3Text 4.72–6.26 */
  transition: top var(--lx-t-hover) var(--lx-e-out), bottom var(--lx-t-hover) var(--lx-e-out);
}
/* the status glyph sits in its own fixed track, so every row has one straight
   left edge no matter how long the question is */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] {
  display: contents !important;   /* the glyph and any pill place themselves */
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]) {
  grid-area: mark;
  justify-self: center;
  align-self: center;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius: 999px"],
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius:999px"] {
  grid-area: tags;
  align-self: center;
  justify-self: start;
  white-space: nowrap !important;
  overflow-wrap: normal !important;
  word-break: normal !important;
  font: 700 9.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .12em !important;
  text-transform: uppercase !important;
  padding: 5px 8px 4px !important;
  color: var(--body) !important;
  background: color-mix(in oklab, var(--rule) 55%, var(--sheet)) !important;
  margin-right: 8px;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] svg {
  width: 15px; height: 15px;
}
/* the question, in the display face, is the loudest thing on the row */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="font: 600 14px"] {
  grid-area: title;
  font-family: 'Fraunces', Georgia, serif !important;
  font-weight: 400 !important;
  font-size: 17px !important;
  line-height: 1.24 !important;
  letter-spacing: -.008em !important;
  color: var(--ink) !important;       /* 13.04–13.96 */
  margin-top: 0 !important;
  /* the question is the product: let it finish, up to two lines */
  white-space: normal !important;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  transition: letter-spacing .22s var(--lx-e-out);
}
/* provenance is a wall label (Rijksmuseum), sized so it can never shout */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > [style*="font: 400 12.5px"] {
  grid-area: meta;
  font: 600 11px/1.35 'Karla', system-ui, sans-serif !important;
  letter-spacing: .075em !important;
  text-transform: uppercase !important;
  color: var(--body) !important;      /* was --muted: 4.39 in Blue Hour */
  margin-top: 0 !important;
}
/* the timestamp is a marginal figure, tabular so the column never jitters */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="font: 500 11.5px"] {
  grid-area: time;
  justify-self: center;
  font: 600 10.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .02em !important;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--lx-quiet) !important;  /* 5.68–6.36 */
}
/* ── the controls: a reserved gutter, never a layout shift (Craft) ── */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > [style*="gap: 8px"] {
  grid-area: acts;
  align-self: center;
  gap: 2px !important;
  margin-left: 10px;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"] {
  min-height: 34px;
  padding: 7px 9px !important;
  border: 0 !important;
  border-radius: 8px !important;
  background: none !important;
  box-shadow: none !important;
  font: 700 9.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .15em !important;
  text-transform: uppercase !important;
  gap: 6px !important;
  transition: background-color var(--lx-t-hover) ease, color var(--lx-t-hover) ease;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:hover {
    background: color-mix(in oklab, var(--ink) 7%, transparent) !important;
  }
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"] svg {
  width: 11px; height: 11px; opacity: .8;
}
/* unread: not a red pill — a live dot and a tracked figure.
   The bundle paints the count on the inner .sc-interp span as well as on its
   wrapper, so the descendant has to be re-inked or the figure renders in
   --warmText (cream on cream, 1.05:1). */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"] *,
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"] {
  background: none !important;
  padding: 0 4px 0 0 !important;
  border-radius: 0 !important;
  font: 700 9.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .15em !important;
  color: var(--warmDeep) !important;  /* 5.12–6.03 */
  gap: 6px;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"]::before {
  content: '';
  width: 6px; height: 6px;
  margin-right: 6px;
  border-radius: 50%;
  background: var(--warm);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--warm) 18%, transparent);
}
/* ── the SAMPLE mark: a plate mark down the trim edge, not a sticker ────────
   Klim's running head, turned on its side. The old mark was a 40px rotated
   slab through the middle of the card at 28% — it collided with the question
   and with the unread count. Here it runs bottom-to-top in the trim margin,
   the way a printer signs the edge of a specimen sheet: it is legible, it is
   permanent, and it touches nothing. The card reserves its own gutter for it,
   so nothing moves when it appears or goes. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"] {
  left: auto !important;
  top: 50% !important;
  bottom: auto !important;
  right: 7px !important;
  z-index: 0;
  writing-mode: vertical-rl;
  transform: translateY(-50%) rotate(180deg) !important;
  font: 700 9px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .34em !important;
  opacity: 1 !important;
  color: color-mix(in oklab, var(--ink) 66%, transparent) !important;  /* 4.85–5.11 */
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > *,
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > * { position: relative; z-index: 1; }

/* ── 6. (removed) THE LEAD ROW — the fixer set the first card of each section
   at 21px on lighter stock. Owner 2026-08-17: "using different size fonts for
   different loop cards? that is horrible design." Every card is now the same
   card: one size, one stock, one ledge. ─────────────────────────────────── */

/* ── 7. HOVER: the type answers, the light moves — no colour swap ───────────
   Fonts In Use (the row opens typographically) + Hello Monday (the parts move
   on a stagger, and the shadow lives on its own layer so nothing repaints). */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  z-index: 0;
  background: radial-gradient(420px 240px at 88% -12%,
      color-mix(in oklab, var(--a1) 17%, transparent) 0%, transparent 64%);
  opacity: 0;
  transition: opacity .26s ease;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover {
    transform: translateY(-1px) !important;
    box-shadow: var(--lx-edge),
      0 2px 2px -1px color-mix(in oklab, var(--ink) 32%, transparent),
      0 12px 20px -10px color-mix(in oklab, var(--ink) 34%, transparent),
      0 34px 48px -28px rgba(0, 0, 0, .9),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover::after { opacity: 1; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover::before { top: 7px; bottom: 7px; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover > [style*="font: 600 14px"] {
    letter-spacing: -.002em !important;
  }
}
@media (hover: none) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover { transform: none !important; }
}

/* ── 8. THE EMPTY ROOM ───────────────────────────────────────────────────────
   Things 3: empty is a composition, not a dashed rectangle apologising. The
   box is dissolved, the face becomes a lamplit medallion, and the line above
   it is the house lozenge — one shape, used for the third time. */
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] {
  border: 0 !important;
  background: none !important;
  box-shadow: none !important;
  padding: 30px 24px 44px !important;
  gap: 2px;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"]::before {
  content: '';
  width: 5px; height: 5px;
  margin: 6px auto 34px;
  transform: rotate(45deg);
  background: var(--lx-loz);
  box-shadow: 0 0 14px color-mix(in oklab, var(--a1) 42%, transparent);
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="border-radius: 50%"] {
  width: 82px !important; height: 82px !important;
  border: 0 !important;
  background:
    radial-gradient(66% 66% at 34% 26%, color-mix(in oklab, var(--a1) 22%, transparent), transparent 72%),
    color-mix(in oklab, var(--sheet) 94%, white) !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 11%, transparent),
    0 20px 30px -22px rgba(0, 0, 0, .8),
    0 0 44px -8px color-mix(in oklab, var(--a1) 30%, transparent) !important;
  margin-bottom: 22px !important;
}
.fl-scroll:has(.v2-sent) .ui-d3 {
  font-family: 'Instrument Serif', Georgia, serif !important;
  font-style: italic !important;
  font-size: clamp(28px, 3.6vw, 38px) !important;
  line-height: 1.1 !important;
  letter-spacing: -.006em !important;
  color: var(--ink) !important;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="font: 400 14px"] {
  font: 500 13.5px/1.6 'Karla', system-ui, sans-serif !important;
  color: var(--body) !important;      /* was --muted */
  max-width: 34ch !important;
  margin-top: 11px !important;
  text-wrap: pretty;
}
/* Raycast: a small control gets real physics — lit top edge, dark ring, one
   hard bottom edge — so it reads as an object rather than an outlined word. */
.fl-scroll:has(.v2-sent) .ui-chip {
  margin: 20px 0 4px !important;
  min-height: 34px;
  padding: 8px 14px !important;
  border: 0 !important;
  border-radius: 9px !important;
  font: 700 10px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .17em !important;
  text-transform: uppercase !important;
  color: var(--body) !important;
  background-image: linear-gradient(180deg,
      color-mix(in oklab, var(--sheet) 92%, white) 0%,
      color-mix(in oklab, var(--sheet) 96%, var(--p-shade)) 100%) !important;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .85),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    0 1px 0 color-mix(in oklab, var(--ink) 18%, transparent),
    0 2px 3px -2px color-mix(in oklab, var(--ink) 42%, transparent) !important;
}
@media (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) .ui-chip:active { translate: 0 1px; }
}
/* the pair of exits sits on one line, primary then utility — the second is the
   same control as the head's, so it is given the same tracked-label voice */
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="flex-direction: column"] {
  flex-direction: row !important;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 18px !important;
  margin-top: 26px !important;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] button.fl-btn[style*="min-height: 38px"] {
  min-height: 30px !important;
  padding: 4px 1px 5px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  box-shadow: 0 1px 0 var(--lx-brass) !important;
  font: 700 10.5px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .19em !important;
  text-transform: uppercase !important;
  color: var(--a1Text) !important;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] button.fl-btn[style*="background: var(--a1)"] {
  padding: 13px 26px !important;
  font: 700 11px/1 'Karla', system-ui, sans-serif !important;
  letter-spacing: .16em !important;
  text-transform: uppercase !important;
}

/* ── 8b. The column's last inherited --muted ────────────────────────────────
   The page footer rides inside this scroller and is still painted --muted,
   which measures 4.39 (Blue Hour) and 4.40 (Conservatory) against the paper's
   darkest stop — under AA. Same ban, same fix, scoped to this column only. */
.fl-scroll:has(.v2-sent) [style*="color: var(--muted)"],
.fl-scroll:has(.v2-sent) .fl-about-foot,
.fl-scroll:has(.v2-sent) .fl-about-foot :is(a, span, div, p, button, .fl-about-foot-link) {
  color: var(--body) !important;      /* 7.36–8.49 */
}

/* the same for the carded footer wherever it rides (home, profile, about…):
   ember's --muted on its dark card measured 4.37 — under AA. */
.fl-foot-canvas, .fl-foot-canvas :is(a, span, div, p, .fl-credit, .fl-about-foot-link),
.fl-foot-canvas [style*="color: var(--muted)"], .fl-foot-canvas [style*="color:var(--muted)"] { color: var(--body) !important; }
/* footer language chips and the footer link row: 44px targets on phones
   (measured 34px / 27px); static pages' footer pills likewise */
@media (max-width: 759px) {
  .fl-foot-lang .fl-btn { min-height: 44px !important; min-width: 40px; }
  .fl-foot-canvas a, .fl-foot-canvas .fl-credit { display: inline-block; padding-block: 9px; }
  .fl-foot-canvas .fl-about-foot-link { min-height: 44px !important; }
  body:not(:has(.fl-root)) .pagefoot a, body:not(:has(.fl-root)) .pagefoot .pill a,
  body:not(:has(.fl-root)) .foot a { display: inline-block; padding-block: 13px; }
  /* Looponomics card actions (Stop / Archive / Decline) measured 34px */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn { min-height: 40px !important; }
}
/* the utility tray's narrowest language chip ("IT") measured 23px wide */
.fl-root .fl-side-util .fl-side-lang .fl-btn { min-width: 26px; }

/* ── 9. 390px ────────────────────────────────────────────────────────────────
   The grid folds to two tracks and the controls take their own row; every
   control keeps a 44px target and the column never scrolls sideways. */
.fl-scroll:has(.v2-sent) { overflow-x: clip; }
@media (max-width: 620px) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
    grid-template-columns: 26px minmax(0, 1fr);
    grid-template-areas:
      "mark title"
      "time meta"
      "acts acts";
    align-items: center;
    column-gap: 11px;
    row-gap: 4px;
    padding: 14px 26px 12px 13px !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > [style*="gap: 8px"] {
    justify-content: flex-start;
    flex-wrap: wrap;
    margin-left: 0;
    margin-top: 8px;
    padding-top: 9px;
    box-shadow: inset 0 1px 0 color-mix(in oklab, var(--ink) 10%, transparent);
    opacity: 1;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"] {
    right: 5px !important;
    letter-spacing: .26em !important;
  }
  .fl-scroll:has(.v2-sent) .v2-sent { font-size: 20px !important; text-wrap: pretty; }
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] { margin: 22px 0 20px !important; }
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] { margin: 28px 0 12px !important; }
  /* the lead question gets a third line rather than an ellipsis on a phone */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="font: 600 14px"] { font-size: 16.5px !important; }
}
@media (pointer: coarse) {
  .fl-scroll:has(.v2-sent) button.fl-btn,
  .fl-scroll:has(.v2-sent) .ui-chip { min-height: 44px !important; }
  .fl-scroll:has(.v2-sent) .v2-slot { min-height: 0 !important; }
}

/* ── 9b. Into the light ──────────────────────────────────────────────────────
   Lenis/Exo Ape, done natively: the arrival is authored by the scroll position,
   not by a timer, so a row brightens and settles as it crosses into the lamp.
   The range completes while the row is still low in the column, so nothing is
   ever read while it moves. Everything sits behind @supports + no-preference:
   without them the finished, static page is what ships. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    @keyframes lx-into-light {
      /* never fully invisible, and lit well before it is readable */
      from { opacity: .25; transform: translateY(9px) scale(.994); }
      to   { opacity: 1; transform: none; }
    }
    .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
      animation: lx-into-light linear both;
      animation-timeline: view(block);
      animation-range: entry 0% entry 46%;
    }
  }
}

/* ── 10. Reduced motion: the end state stays reachable, the movement goes ─── */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:has(.v2-sent) *,
  .fl-scroll:has(.v2-sent) *::before,
  .fl-scroll:has(.v2-sent) *::after { transition: none !important; animation: none !important; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover { transform: none !important; }
}

/* ── 16. Utility tray legibility (design-review, integrated build) ──────────
   The language codes and the ⌘K hint sit on the tray's brass-lit plate; at
   --onCanvasMuted they measured 2.55:1. Utility text is still text. */
.fl-side-util .sc-interp, .fl-side-util button { color: var(--onCanvas) !important; }
/* The FOOTER language row (.fl-foot-lang) is a different surface: it rides
   inside the paper column or the carded sheet footer, never on the velvet —
   owner 2026-08-17: "can't read language selection text on about page".
   Ink on paper, the chosen language darkest. */
.fl-foot-lang .sc-interp, .fl-foot-lang button, .fl-foot-lang .fl-btn { color: var(--body) !important; }
.fl-foot-lang .fl-btn[style*="text-decoration: underline"],
.fl-foot-lang .fl-btn[style*="text-decoration:underline"] { color: var(--ink) !important; }
.fl-side-util [style*="color: var(--onCanvasMuted)"],
.fl-side-util [style*="color:var(--onCanvasMuted)"] { color: var(--onCanvasBody) !important; }
.v2-pk-hint, .v2-pk-hint__k { color: var(--onCanvas) !important; }
.v2-pk-hint__k { background: color-mix(in oklab, var(--canvas) 72%, black) !important; }
/* the same dark-sheet override reaches SVG marks through currentColor in the
   two rooms whose paper is now light — take those back to warm ink as well */
[data-palette="ember"] svg [style*="color: var(--warm"], [data-palette="midnight"] svg [style*="color: var(--warm"],
[data-palette="ember"] [style*="color: var(--warm"] svg, [data-palette="midnight"] [style*="color: var(--warm"] svg,
[data-palette="ember"] [style*="color: var(--warm"] path, [data-palette="midnight"] [style*="color: var(--warm"] path,
[data-palette="ember"] [style*="color: var(--warm"] circle, [data-palette="midnight"] [style*="color: var(--warm"] circle {
  color: var(--a2Text) !important; fill: currentColor !important; stroke: currentColor !important;
}

/* ══════════════════════════════════════════════════════════════════════════
   THE FACES — they are characters, and characters have colour.
   Owner 2026-08-16: "the eyes in the logo are sloppy… make them perfect
   circles without blemishes" and "the faces scattered through the about page
   are missing colors". Two causes, both fixed here:
   a) The app draws every face through filter:url(#pencil) — feTurbulence +
      feDisplacementMap at scale 1.5 — which is what wobbles the rings and
      chews the edges. On the WORDMARK we want a struck mark, not a sketch.
   b) An earlier legibility pass flattened every face fill to currentColor,
      which killed the eye whites, cheeks, tongues and glints. Faces keep
      their own palette tokens; only the ones that vanish get retuned.
   ══════════════════════════════════════════════════════════════════════════ */
/* a) PERFECT ROUND EYES, SHARP FEATURES (owner 2026-08-17: "go back to
   perfect round eyes and sharp facial features. the hand drawn doesn't look
   good"). No filter of any kind on the wordmark or the illustrated faces —
   not the app's own #pencil wobble (it is set as an SVG attribute on the
   hero face; a CSS filter:none out-ranks a presentation attribute) and not
   the #handdrawn warp. The app's own stroke widths and caps stand. */
.fl-logo svg, .fl-hero-logo svg, .fl-mlock__btn svg, .fl-lockup-card svg,
.v2-ob__face svg, .fl-cere__face svg, .fl-ab-fig svg, .fl-ab-figL svg,
.fl-lidf1, .fl-lidf2 {
  filter: none !important;
}
.fl-logo svg, .fl-hero-logo svg, .fl-mlock__btn svg, .fl-lockup-card svg { overflow: visible; }

/* b) the face palette, restated so every part reads on paper AND on velvet.
   --glint is the eye white: it must be the lightest thing in the mark. */
:root {
  --glint: #FFF8EC;            /* eye white — paper-bright, never inked   */
  --logoSoft: color-mix(in oklab, var(--a1) 55%, var(--sheet));
  --face2: color-mix(in oklab, var(--a3) 72%, var(--ink));
  --tongue: color-mix(in oklab, var(--a2) 78%, var(--ink));
  --drop: color-mix(in oklab, var(--a3Text) 80%, var(--sheet));
  --fdot: color-mix(in oklab, var(--ink) 82%, var(--a2));
  --spark: var(--a1Text);
}
/* the eye white needs an edge when the face sits on paper, or it disappears */
.fl-logo svg [fill="var(--glint)"], .fl-hero-logo svg [fill="var(--glint)"] {
  stroke: color-mix(in oklab, var(--logo) 92%, transparent);
  stroke-width: 1.6;
  paint-order: fill stroke;
}
/* on the velvet rail the mark reverses: cream ring, dark pupil, warm cheeks */
.fl-root > div[style*="width: 212px"] .fl-logo, .fl-root > div[style*="width: 212px"] .fl-hero-logo,
[style*="position: fixed"][style*="backdrop-filter"] .fl-logo {
  --logo: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
}

/* ── The standing home-page note (.v2-post) is removed at build time now
   (FL_NO_BETA, 2026-08-17); this guard only matters for an old bundle. */
.v2-post, .fl-scroll > .v2-post { display: none !important; }

/* ── THE BLINK — the app's mid-blink frame (.fl-lidf1) is a flat-topped
   plate 32 units wide (M cx-16 7 H cx+16 V21 …) over a 24-unit eye; under the
   drawn stroke it read as a square, and as an ellipse of its own box it still
   capped the ring on both sides. The lid is now the eye's own interior: the
   plate is clipped to the circle the app itself uses for the eye white
   (r 12 about the eye centre — the plate's box starts at (cx-16, 7), so the
   centre (cx, 24) is 16px, 17px into it, the same offset for both eyes), and
   the closed frame's disc shrinks from r 16 to r 12 so it fills the eye and
   never thins the ring to a hairline. The fill is the eye-white so the lid
   reads as skin closing over the eye. No filter (sharp, owner 2026-08-17). */
.fl-lidf1 > path:first-child, .fl-lidf2 > circle {
  fill: color-mix(in oklab, var(--sheet) 70%, var(--logo)) !important;
}
.fl-lidf1 > path:first-child { clip-path: circle(12px at 16px 17px); }
.fl-lidf2 > circle { r: 12px; }

/* ═══════════════════════════════════════════════════════════════════════════
   REVIEW ROUND — 2026-08-17. Findings from the four inspectors, applied.
   Every rule here is a correction to something already above; the fixed-
   overlay trap (the paper as containing block) is fixed in §1a/1b/6 and the
   hero block directly, the wizard fragment is re-anchored in place. What
   follows are the smaller, self-contained repairs.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── R-1. Screens that scroll ON the room (profile): the column sits on the
   velvet and its cards are sheets. The divider "This is what other users will
   see" and its hairlines sit between cards, directly on velvet — the rail's
   inks, not paper ink (measured 1.4:1 as body ink, 2026-08-17). The chain is
   scroller > column > row > span; the cards below are deeper. */
.fl-root [style*="overflow: auto"][style*="background-color: var(--canvas)"] > div > div > [style*="color: var(--onCanvasMuted)"],
.fl-root [style*="overflow: auto"][style*="background-color: var(--canvas)"] > div > div > [style*="color: var(--onCanvasBody)"] { color: var(--onCanvasBody) !important; }
.fl-root [style*="overflow: auto"][style*="background-color: var(--canvas)"] > div > div > [style*="color: var(--onCanvas)"],
.fl-root [style*="overflow: auto"][style*="background-color: var(--canvas)"] > div > [style*="color: var(--onCanvas)"] { color: var(--onCanvas) !important; }

/* ── R0. The sign-in / sign-up modal's brand panel ─────────────────────────
   The bundle paints it as a brass gradient (--a1 → a1/a3) and sets every line
   in --ctaText; in the light rooms that is dark ink on mid brass (3.0–3.9:1).
   Brass is a lamp, not a wall: the panel is the room's velvet, lit from the
   corner, and its lines are the rail's inks. */
.v2-brand[style*="background: linear-gradient(160deg, var(--a1)"] {
  background: linear-gradient(160deg, var(--velvet, var(--canvas)) 0%, color-mix(in oklab, var(--velvet, var(--canvas)) 78%, var(--canvas)) 100%) !important;
}
.v2-brand [style*="color: var(--ctaText)"], .v2-brand [style*="color:var(--ctaText)"] { color: var(--onCanvas) !important; }
.v2-brand [style*="color: color-mix(in oklab, var(--ctaText) 78%"] { color: var(--onCanvasBody) !important; }
.v2-brand [style*="background: color-mix(in oklab, var(--ctaText) 22%"] { background: color-mix(in oklab, var(--onCanvas) 22%, transparent) !important; }
.v2-brand svg { color: var(--onCanvas); }

/* ── R1. The account / profile header band ──────────────────────────────────
   The bundle paints it `background-color: var(--brand, …)` and sets every
   line on it in --ctaText. parlor never defined --brand (so the house room got
   the bundle's flat #361666) and three rooms run --ctaText dark, so the
   handle and plan line were near-black on a dark slab. The band is
   upholstery: the room's own velvet, lit from the lamp corner, and the ink on
   it is the ink the rail uses. Custom-property overrides only — the inline
   var()s resolve to these. */
.fl-root [style*="background-color: var(--brand"] {
  --brand: var(--velvet, var(--canvas));
  --ctaText: var(--onCanvas);
  background-image:
    radial-gradient(120% 140% at 88% -20%, color-mix(in oklab, var(--a1) 28%, transparent) 0%, transparent 60%),
    linear-gradient(168deg, var(--velvet, var(--canvas)) 0%, color-mix(in oklab, var(--velvet, var(--canvas)) 82%, var(--canvas)) 100%),
    var(--p-grain) !important;
  background-size: auto, auto, 128px 128px !important;
  background-repeat: no-repeat, no-repeat, repeat !important;
}

/* ── R2. Account tab strip at phone width ────────────────────────────────────
   Karla sets wider than Public Sans and .fl-root allows overflow-wrap:
   anywhere, so "Preferences" split mid-word at 390px. */
@media (max-width: 480px) {
  .fl-root .v2-acct-tabs .fl-btn,
  .fl-root button.fl-btn[style*="flex: 1 1 0%"][style*="min-height: 44px"][style*="font: 600 14px"][style*="letter-spacing: 0.01em"] {
    padding-inline: 4px !important;
    letter-spacing: 0 !important;
    overflow-wrap: normal;
    white-space: nowrap;
  }
}

/* ── R3. Wizard: the browse-categories row ───────────────────────────────────
   "MORE THEMES AND TOPICS" is a broken rule (§8 above), but the generic 999px
   chip rule still handed it an inset ring, which traced a rectangle around the
   whole row. Same fix on the send side's twin. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"] {
  box-shadow: none !important;
  border: 0 !important;
}
/* The ACTIVE category chip carries an inline oklch border instead of
   `border: 1px solid var(--rule)`, so it missed the chip rule and stayed a
   13px-radius pill beside 8px chips. Same object, same physics. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="oklch(var(--catL"] {
  border-radius: 8px !important;
  min-height: 36px;
  padding: 8px 13px !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 12.5px !important;
  letter-spacing: .012em !important;
  border-color: transparent !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), var(--w-plinth) !important;
}
/* …and the sub-category tab (background oklch, 999px) becomes the same 4px
   struck stamp as READY-MADE LIBRARY next to it. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"] {
  border-radius: 4px !important;
  font-family: 'Karla', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 10px !important;
  letter-spacing: .2em !important;
  padding: 6px 11px 5px !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 3px 7px -3px rgba(0, 0, 0, .6) !important;
}
/* the "0/5" counter must never wrap inside its keyline at 390px */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 8px"] {
  white-space: nowrap;
  flex: 0 0 auto;
}
/* the "ask something different" field: the pencil background is retired
   above, but the app's own 42px indent survived; and without min-width:0
   the row pushed its Go button 7px past the card at 390px. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in {
  padding-left: 12px !important;
  min-width: 0;
}
/* send side: a section divider (holding only an empty statements list) sat
   18px under the topic rule and read as a doubled line. It comes back the
   moment the list holds a row. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf ~ [style*="margin-top: 18px"][style*="border-top: 1px solid var(--rule)"]:not(:has(* > *)) {
  border-top: 0 !important;
  padding-top: 0 !important;
  margin-top: 0 !important;
}

/* ── R4. The static pages (privacy · terms · text messaging) ─────────────────
   They link this file but have no .fl-root, so they got the fonts and the
   paper and none of the room: a flat velvet, and the wordmark in a leftover
   translucent capsule from the wallpaper era. The body becomes the room, the
   wordmark sits on the velvet the way it does on the rail, and the card is
   the app's sheet. survey.php also links this file: its embed mode must stay
   transparent, and its card is left alone (scoped by the `.brand > a`
   lockup only these pages have). */
/* brass text on the standalone pages and the survey card is text: AA twin.
   (privacy/terms/sms: a, .stamp, .cap; survey.php: .kicker, .wm; the app's
   own survey screen: .v2-svp__brand, .v2-svp__k — all measured 3.1–3.5:1) */
body:not(:has(.fl-root)) :is(a, .stamp, .cap, .kicker, .wm, .brand a),
.v2-svp__brand, .v2-svp__k { color: var(--a1Text) !important; }
body:not(:has(.fl-root)) .fine, body:not(:has(.fl-root)) .formdemo .fin { color: var(--body) !important; }
/* the recipient demo's "Anonymous · shared with care" chip: --muted on a tint (4.11) */
.fl-root [style*="background: var(--tint1)"] [style*="color: var(--muted)"],
.fl-root [style*="background: var(--tint2)"] [style*="color: var(--muted)"] { color: var(--body) !important; }

body:not(:has(.fl-root)):not(.embed) {
  background-color: var(--canvas) !important;
  background-image:
    radial-gradient(760px 540px at 89% -8%,
      color-mix(in oklab, var(--a1) 56%, transparent) 0%,
      color-mix(in oklab, var(--a1) 22%, transparent) 34%,
      transparent 70%),
    radial-gradient(1600px 1150px at 94% -22%,
      color-mix(in oklab, var(--a1) 12%, transparent) 0%,
      color-mix(in oklab, var(--a1) 4%, transparent) 46%,
      transparent 74%),
    radial-gradient(880px 600px at 4% 112%,
      color-mix(in oklab, var(--velvet, var(--canvas)) 84%, white 12%) 0%, transparent 60%),
    radial-gradient(126% 104% at 68% 16%,
      rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, .16) 46%, rgba(0, 0, 0, .38) 74%, rgba(0, 0, 0, .60) 100%),
    linear-gradient(168deg, var(--velvet, var(--canvas)) 0%, var(--canvas) 60%),
    var(--p-grain) !important;
  background-size: auto, auto, auto, auto, auto, 128px 128px !important;
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat !important;
  background-attachment: fixed, fixed, fixed, fixed, fixed, scroll !important;
}
body:not(:has(.fl-root)):has(.brand > a) .brand a {
  background: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  padding-inline: 0 !important;
  color: var(--onCanvas) !important;
  --logo: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
  text-shadow: none;
}
/* [stripped by garden/core-strip.json] */
body:not(:has(.fl-root)):has(.brand > a) .pagefoot .pill {
  background: color-mix(in oklab, var(--onCanvas) 7%, transparent) !important;
  border-color: color-mix(in oklab, var(--onCanvas) 16%, transparent) !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  color: var(--onCanvasMuted) !important;
}
body:not(:has(.fl-root)):has(.brand > a) .pagefoot .pill a { color: var(--onCanvasBody) !important; }

/* ── FACES IN THE DARK ROOMS (verify pass, 2026-08-17) ─────────────────────
   palettes.css carries per-palette .fl-hero-logo overrides written for the OLD
   ember/midnight logos (mint lids, cream pupils). Under the Parlor those rooms
   have paper-white eye whites, so pupils vanished and expression lids came out
   mint-on-orange / coral-on-steel while the blink lids in the same eye were
   dark. One lid token, one pupil, every face, every room — asserted at (0,2,0). */
[data-palette] .fl-hero-logo, [data-palette] .fl-logo, [data-palette] .fl-cere__face,
[data-palette] .v2-ob__face, [data-palette] .fl-ab-fig, [data-palette] .fl-ab-ctaface {
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
}
[data-palette="ember"] .fl-hero-logo, [data-palette="ember"] .fl-logo,
[data-palette="midnight"] .fl-hero-logo, [data-palette="midnight"] .fl-logo {
  --pupil: var(--canvas);
}
/* the blink frames use the same lid token as the expression faces */
.fl-lidf1 > path:first-child, .fl-lidf2 > circle { fill: var(--logoSoft) !important; }


/* ═══ GARDEN FRAGMENT frag-a-foundation.css ═══ */
/* ═════════════════════════════════════════════════════════════════════════════
   frag-a-foundation.css — THE GARDEN · FRAGMENT A (tokens · materials · type)
   Owner: builder A.  Assembled by garden/assemble.py AFTER parlor.css (the
   core) and BEFORE fragments B, C and D.  Spec: garden/GARDEN-SPEC.md §2, §3.2b,
   §3.5, §3.7, §4.2–4.5, §7.2.

   WHAT LIVES HERE, AND NOWHERE ELSE
     A1  the @font-face block + the alias plan (§4.2). A is the ONLY fragment
         that may declare a font face.
     A2  the :root shared MATERIAL tokens (§2.2) — geometry, motion, textures,
         depth, letterpress, and every --g-* glyph mask.
     A3  the six palette blocks (§2.4–2.8) with the headers patch-api.py's
         _ROOM_HEAD parses, plus the S-token stock inks of THE SURFACE LAW
         (§3.2b) and the standalone --boxGlow defaults (§3.7).
     A4  the derived :root block (§2.3).
     A5  the three type roles (§4.3 display · §4.4 voice · §4.5 small caps).

   INVARIANTS (any of these breaking is a build stopper)
     • --p-grain: url(patterns/grain-parlor.png) verbatim — t_persona asserts it.
     • --wall: none present — t_persona asserts it.
     • --p-rad: 3px.
     • every asset URL RELATIVE (url(fonts/…), url(patterns/…)); an absolute
       path breaks the standalone pages served from sub-paths.
     • every data URI percent-encoded: the embedder refuses any CSS carrying a
       literal closing-tag sequence (an unescaped %3C%2F pair) — it would break
       out of the <style> element it is embedded in.
     • palette KEYS never change (they are stored in user accounts):
       amethyst-night · harbor · meadow · blush-study · ember · midnight.
     • the meadow block opens with :root:not([data-palette]), [data-palette="meadow"].
     • no user-facing garden vocabulary: the six names are light-and-time names.
     • --onCanvas*, --a1OnCanvas, --a2OnCanvas, --a3OnCanvas stay RAW HEX in the
       palettes — never expressed in terms of --ink, or the SURFACE LAW flip
       (§3.2b) loops.

   RULES A MUST NOT WRITE
     Anything with .fl- / .v2- / .ui- / [style*=…] other than the three type
     hooks of A5. Components are B, C and D.

   NOTE FOR B / C / D — custom-property resolution
     A var() inside a custom property is substituted where the property is
     DECLARED, not where it is used. Everything in A2/A4 that references an ink
     (--p-hair, --p-shadow, --g-shadow-deep, --g-deboss, --g-hatch, --g-quiet)
     therefore carries the ROOT (paper) ink family even inside a subtree where
     THE SURFACE LAW has flipped --ink to --onCanvas. That is right for stock
     objects; if you need the bed-ink variant of one of them, redeclare that
     token inside your own scope — do not "fix" it with a painted colour.
     ═════════════════════════════════════════════════════════════════════════ */


/* ── A1 · THE FACES ────────────────────────────────────────────────────────
   The app's compiled inline styles ask for three family names — Fraunces,
   Public Sans, IBM Plex Mono — thousands of times, and are never edited. They
   are RE-POINTED here: a later @font-face for the same family + descriptors
   wins, and garden.css is embedded last. All five files already exist in
   fonts/; nothing needs downloading. All src: URLs are relative. */

/* the real families, under their real names */
@font-face { font-family: 'Fraunces';    font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/fraunces-normal-latin.woff2) format('woff2'); }
@font-face { font-family: 'Fraunces';    font-style: italic; font-weight: 100 900; font-display: swap; src: url(fonts/fraunces-italic-latin.woff2) format('woff2'); }
@font-face { font-family: 'Archivo';     font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }
@font-face { font-family: 'Newsreader';  font-style: normal; font-weight: 200 800; font-display: swap; src: url(fonts/newsreader-normal.woff2) format('woff2'); }
@font-face { font-family: 'Newsreader';  font-style: italic; font-weight: 200 800; font-display: swap; src: url(fonts/newsreader-italic.woff2) format('woff2'); }

/* the aliases the app asks for. 'Fraunces' IS Fraunces now — for the first
   time the alias is honest. Archivo has no italic file: the 'Public Sans'
   italic alias points at the roman ON PURPOSE, because the design never sets
   Archivo italic and a synthesised slant is worse than the roman. If a surface
   needs italic it is the voice, and the voice is Newsreader.
   'IBM Plex Mono' is not a monospace any more — it is Archivo, and the
   small-caps character comes from the CSS role in A5, not from the file. */
@font-face { font-family: 'Public Sans';   font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }
@font-face { font-family: 'Public Sans';   font-style: italic; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }

/* THE SAFETY NET (builder A, not in the spec's alias list — reported to the
   lead). parlor.css names 'Instrument Serif' in eighteen rules, 'Karla' in
   several more and 'Young Serif' in its own alias. The core ships verbatim, so
   any one of those rules that B/C/D do not happen to override would put a
   SECOND voice on the page (§8.1 #12 — the exact failure the spec calls out).
   Re-pointing the three retired names at the three Garden faces makes that
   failure mode benign: a missed rule renders in the right face at the wrong
   size, instead of in the wrong typeface. Nothing user-visible ever names
   these families; they are legacy CSS identifiers only. */
@font-face { font-family: 'Instrument Serif'; font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/newsreader-normal.woff2) format('woff2'); }
@font-face { font-family: 'Instrument Serif'; font-style: italic; font-weight: 100 900; font-display: swap; src: url(fonts/newsreader-italic.woff2) format('woff2'); }
@font-face { font-family: 'Young Serif';     font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/fraunces-normal-latin.woff2) format('woff2'); }
@font-face { font-family: 'Karla';           font-style: normal; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }
@font-face { font-family: 'Karla';           font-style: italic; font-weight: 100 900; font-display: swap; src: url(fonts/archivo-normal.woff2) format('woff2'); }


/* ── A2 · SHARED MATERIAL TOKENS (no colour) ───────────────────────────────
   §2.2. Geometry, motion, textures, depth, letterpress. Colour lives in A3. */
:root {
  /* ·· geometry ·························································· */
  --p-rad: 3px;            /* every corner in the product          */
  --g-rad-sm: 2px;         /* pills, badges, stamps, plate window  */
  --g-rad-knob: 50%;       /* the submit knob only                 */

  /* the comp's scales, verbatim */
  --g-s1: 4px;  --g-s2: 8px;  --g-s3: 12px; --g-s4: 16px; --g-s5: 24px;
  --g-s6: 32px; --g-s7: 48px; --g-s8: 64px; --g-s9: 88px; --g-s10: 120px;
  --g-t1: 11px;   --g-t2: 13px;   --g-t3: 15.5px; --g-t4: 18.5px; --g-t5: 24px;
  --g-t6: 32px;   --g-t7: 43px;   --g-t8: 58px;   --g-t9: 76px;

  /* ·· motion ····························································· */
  --g-t-press: 70ms;
  --g-t-hover: 180ms;
  --g-t-enter: 420ms;
  --g-t-unfurl: 750ms;
  --g-e-out:    cubic-bezier(.2, .7, .3, 1);
  --g-e-spring: cubic-bezier(.2, 1.35, .4, 1);   /* unfurl only */

  /* ·· textures ··························································· */
  /* KEEP this exact declaration: tests/t_persona.mjs asserts it. */
  --p-grain: url(patterns/grain-parlor.png);
  /* the fibre (§3.5). Paper only, always multiply. 256x256, seamless, band
     234–255 (≈8% peak-to-peak modulation, ≈4% mean darkening) so the measured
     table of §2.10 — computed on --sheet and on the stock gradient's darkest
     stop — still holds once the texture is on.
     LAYER ORDER MATTERS, and §3.3's stack as written paints NOTHING: with
     `background-image: var(--p-paper-lit), var(--g-fibre)` and
     `background-blend-mode: normal, multiply`, the opaque paper gradient is the
     TOP layer and covers the fibre completely (verified in Chrome: the sampled
     pixel is --sheet exactly). The fibre must be the FIRST (top) layer and take
     the multiply itself:
        background-image: var(--g-fibre), var(--p-paper-lit);
        background-size:  var(--g-fibre-size), auto;
        background-repeat: repeat, no-repeat;
        background-blend-mode: multiply, normal;
     If a review calls the paper noisy, lower the slope in the generator's
     feComponentTransfer and re-render the PNG — never wrap it in a div. */
  --g-fibre: url(patterns/fibre-garden.png);
  --g-fibre-size: 256px 256px;

  /* the bed's engraved repeat — inline, percent-encoded (§7.0.3 guard) */
  --g-bed-repeat: url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='132' height='172' view%42ox='0 0 132 172'%3E%3Cg fill='none' stroke='%23EFE3C7' stroke-opacity='0.055' stroke-width='1.15' stroke-linecap='round'%3E%3Cpath d='M30 172c0-40 5-64 5-86 0-16-7-26-7-40'%2F%3E%3Cpath d='M35 122c15-4 23-15 25-30-17 0-26 11-25 30z'%2F%3E%3Cpath d='M33 90c-15-6-21-17-21-32 16 2 23 13 21 32z'%2F%3E%3Cpath d='M28 46c-6-4-8-10-6-18 7 2 10 9 6 18z'%2F%3E%3Cellipse cx='30' cy='24' rx='8' ry='13'%2F%3E%3Cpath d='M30 11v26'%2F%3E%3Cpath d='M99 172c0-32 3-52 3-70'%2F%3E%3Cpath d='M102 110c13 2 21-5 25-17-15-4-23 4-25 17z'%2F%3E%3Cpath d='M100 86c-13-2-19-11-19-24 14 0 20 9 19 24z'%2F%3E%3Ccircle cx='102' cy='64' r='7.5'%2F%3E%3Cpath d='M94.6 57.4 109.4 70.6M109.4 57.4 94.6 70.6'%2F%3E%3Cpath d='M102 56v-14'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-bed-repeat-size: 132px 172px;

  /* THE TEAR PROFILE (§3.4) — ONE profile, shared by all four objects that
     carry a torn edge (B's .g-torn / footer card / standalone card, C's
     .ui-sheet and wizard packet, D's preview panel and survey card).
     Review 1 (I1 #12b): the old profile was a 23px circle repeated, which on a
     300px card gave fourteen identical scallops — a doily, not a tear. The
     deep row is now a 211px hand-cut silhouette (irregular run lengths, no
     internal symmetry) stretched to the strip's height, carried against two
     coprime fine rows at 31px and 13px, so the shape does not repeat inside
     any card the eye can hold. preserveAspectRatio="none" lets the same
     profile run shallower on a phone by changing only the strip height. */
  --g-bite-a: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='211' height='9' preserveAspectRatio='none' view%42ox='0 0 211 9'%3E%3Cpath fill='%23000' d='M0 0H211V3.2L207 2.9L203 3.5L200 2.6L194 2.7L187 4.7L184 1.9L181 7.8L178 5.2L176 2.5L170 2.2L161 2.2L157 2.4L155 5.5L151 5.2L142 2L133 6.9L128 3L124 4.8L121 5L118 7.9L114 3.7L110 3.7L108 7L104 3.4L100 3.7L96 3.4L93 4.5L89 2.1L85 3.7L80 4.2L77 6.8L66 2.5L61 4.4L55 2.6L46 4.3L42 6.8L39 2.1L35 7.5L28 6L24 5.2L21 2.6L12 2.8L8 4.9L6 7.3L0 3.2Z'%2F%3E%3C%2Fsvg%3E");
  --g-bite-b: radial-gradient(circle at 50% 0%, #000 3.0px, transparent 3.6px);
  --g-bite-c: radial-gradient(circle at 50% 0%, #000 1.6px, transparent 2.1px);
  --g-bite-size: 211px 100%, 31px 100%, 13px 100%;
  --g-bite-pos: 0 0, 5px 0, 0 0;
  /* a torn object's own hairline must NOT run across the edge the tear opens
     (review 1, I1 #12a: a straight 1px rule sat above every row of bites).
     Three sides only, and the box-glow layer of §3.7 survives intact. */
  --g-shadow-torn:
    inset 0 -1px 0 color-mix(in oklab, var(--ink) 15%, transparent),
    inset 1px 0 0 color-mix(in oklab, var(--ink) 15%, transparent),
    inset -1px 0 0 color-mix(in oklab, var(--ink) 15%, transparent),
    0 14px 26px -22px color-mix(in oklab, var(--ink) 80%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent);
  /* the same, for a DEEP piece of stock (the packet, a modal) */
  --g-shadow-deep-torn:
    inset 0 -1px 0 color-mix(in oklab, var(--ink) 15%, transparent),
    inset 1px 0 0 color-mix(in oklab, var(--ink) 15%, transparent),
    inset -1px 0 0 color-mix(in oklab, var(--ink) 15%, transparent),
    0 26px 46px -32px rgba(0, 0, 0, .95),
    0 16px 42px -10px var(--boxGlow, transparent);

  /* the trellis rib and the engraved hatch — pure CSS, no asset */
  --g-rib: repeating-linear-gradient(90deg,
             color-mix(in oklab, var(--onCanvas) 5%, transparent) 0 1px,
             transparent 1px 96px);
  --g-hatch: repeating-linear-gradient(-52deg,
             color-mix(in oklab, var(--ink) 16%, transparent) 0 1px,
             transparent 1px 5px);
  --g-hatch-onbed: repeating-linear-gradient(-52deg,
             color-mix(in oklab, var(--onCanvas) 10%, transparent) 0 1px,
             transparent 1px 6px);

  /* ·· depth ······························································ */
  /* a hairline that is a shadow, never a border */
  --p-hair: inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent);
  /* stock lying ON the bed: one contact shadow + the mandatory box glow.
     THE BOX-GLOW LAW (§3.7, memory box-glow-invariant): the literal string
     `0 16px 42px -10px var(--boxGlow, transparent)` — WITH the transparent
     fallback — must survive. Without the fallback every shadow referencing
     --boxGlow is silently dropped on any standalone page. */
  --p-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    0 14px 26px -22px color-mix(in oklab, var(--ink) 80%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent);
  /* a deeper piece of stock (the wizard packet, a modal) */
  --g-shadow-deep:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    0 26px 46px -32px rgba(0, 0, 0, .95),
    0 16px 42px -10px var(--boxGlow, transparent);
  /* deboss: the ask tray is pressed INTO the stock */
  --g-deboss:
    inset 0 1px 0 color-mix(in oklab, var(--p-lit-mix) 55%, transparent),
    inset 0 -1px 0 color-mix(in oklab, var(--ink) 7%, transparent);

  /* ·· ink pressed into stock (letterpress) ······························· */
  /* currentColor only: it can only RAISE measured contrast, in every palette,
     at every size. Never a white/dark bevel pair. */
  --p-press:
     .012em  .012em 0 currentColor,
    -.008em  .008em 0 currentColor,
     .008em -.008em 0 currentColor;

  /* ·· the wallpaper is retired; t_persona.mjs asserts this line ··········· */
  --wall: none;

  /* ·· glyph masks ························································
     Every engraved illustration is a mask-image, never a background-image, so
     it takes its colour from background-color: currentColor and follows the
     palette with zero per-palette copies. Path data copied verbatim from the
     approved comp's <defs>, with class="eng" / "eng-t" resolved to explicit
     stroke widths (1.35 / .85 at .62 opacity) and percent-encoded.
     Always use them on a PSEUDO-element — a pseudo has no children, so a mask
     on it can never clip a position:fixed overlay:
        .thing::before{ content:""; width:48px; height:48px; flex:none;
          background-color: var(--ink);
          -webkit-mask-image: var(--g-plate-3); mask-image: var(--g-plate-3);
          -webkit-mask-size: contain;          mask-size: contain;
          -webkit-mask-repeat: no-repeat;      mask-repeat: no-repeat;
          -webkit-mask-position: center;       mask-position: center; }        */
  /* the section-rule sprig            58 x 24 */
  --g-sprig: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='58' height='24' view%42ox='0 0 58 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M29 22c0-6 0-9 0-13'%2F%3E%3Cpath d='M29 13c6 1 10-2 12-8-6-1-11 2-12 8Z'%2F%3E%3Cpath d='M29 16c-6 0-10-3-11-9 6 0 10 3 11 9Z'%2F%3E%3Ccircle cx='29' cy='5' r='3.1'%2F%3E%3Cpath d='M4 22h16M38 22h16' stroke-opacity='.55'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* the solid seed dot (nav/meta)     14 x 14 */
  --g-seed: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='14' height='14' view%42ox='0 0 14 14'%3E%3Cpath d='M7 1.5c3 0 4.6 2.4 4.6 5.2 0 3-2.1 5-4.6 5S2.4 9.7 2.4 6.7C2.4 3.9 4 1.5 7 1.5Z' fill='%23000'%2F%3E%3C%2Fsvg%3E");
  /* the submit arrow                  24 x 24 */
  --g-arrow: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='24' height='24' view%42ox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2.1' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h15M13 6l6 6-6 6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* one leaf, attached at 0,0         22 x 17 */
  --g-leaf: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='22' height='17' view%42ox='0 0 22 17'%3E%3Cpath d='M0 17C0 7.5 7 0 22 0 22 10.5 14 17 0 17Z' fill='%23000'%2F%3E%3C%2Fsvg%3E");
  /* heart-and-stem      (pl-heart)    64 x 64 */
  --g-plate-1: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='64' height='64' view%42ox='0 0 64 64'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M32 60V27'%2F%3E%3Cpath d='M32 34c-12 2-19-5-20-17 12-2 19 5 20 17Z'%2F%3E%3Cpath d='M32 26c11 1 17-6 17-17-11 0-17 7-17 17Z'%2F%3E%3Cpath d='M27 47c-6 1-10-2-11-9M37 53c6 0 10-3 10-9'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Cpath d='M17 22c5 3 10 7 14 11M46 13c-6 4-10 8-13 12M19 42c3 2 5 3 7 4M40 48c2-1 4-2 5-4'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* hip-and-calyx       (pl-hip)      64 x 64 */
  --g-plate-2: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='64' height='64' view%42ox='0 0 64 64'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M32 62V36'%2F%3E%3Ccircle cx='32' cy='24' r='12'%2F%3E%3Cpath d='M32 12c1-4 4-7 8-8-1 5-4 8-8 8Z'%2F%3E%3Cpath d='M25 44c-7-1-11-5-11-12 7 1 11 5 11 12Z'%2F%3E%3Cpath d='M39 52c6-1 10-5 10-11-6 1-10 5-10 11Z'%2F%3E%3Cpath d='M27 36c3 2 7 2 10 0'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Cpath d='M23 20c2 5 3 9 3 13M28 16c1 6 2 11 2 15M37 17c-1 6-2 11-2 15M42 21c-2 4-3 8-3 11'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* the herb spire      (pl-herb)     64 x 64 */
  --g-plate-3: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='64' height='64' view%42ox='0 0 64 64'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M32 62V16'%2F%3E%3Cpath d='M32 24c9-1 14-6 15-15-9 0-15 6-15 15Z'%2F%3E%3Cpath d='M32 34c-9-1-14-6-15-15 9 0 15 6 15 15Z'%2F%3E%3Cpath d='M32 44c8-1 12-5 13-13-8 0-13 5-13 13Z'%2F%3E%3Cpath d='M32 52c-7-1-11-5-11-11 7 0 11 4 11 11Z'%2F%3E%3Cpath d='M32 16c-2-4-1-8 2-11 2 4 1 8-2 11Z'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Cpath d='M36 20c3-3 6-6 8-9M28 30c-3-3-6-6-8-9M36 41c3-3 5-5 7-8M28 49c-2-2-4-4-6-6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* the clock head      (pl-clock)    64 x 64 */
  --g-plate-4: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='64' height='64' view%42ox='0 0 64 64'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M32 62V32'%2F%3E%3Ccircle cx='32' cy='24' r='3'%2F%3E%3Cpath d='M32 21V6M32 27v-2M20 12l9 9M44 12l-9 9M14 24h14M50 24H36M17 36l11-8M47 36l-11-8M24 44l6-13M40 44l-6-13'%2F%3E%3Cpath d='M27 50c-6-1-9-4-9-10 6 1 9 4 9 10Z'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Ccircle cx='32' cy='6' r='1.6'%2F%3E%3Ccircle cx='20' cy='12' r='1.6'%2F%3E%3Ccircle cx='44' cy='12' r='1.6'%2F%3E%3Ccircle cx='14' cy='24' r='1.6'%2F%3E%3Ccircle cx='50' cy='24' r='1.6'%2F%3E%3Ccircle cx='17' cy='36' r='1.6'%2F%3E%3Ccircle cx='47' cy='36' r='1.6'%2F%3E%3Ccircle cx='24' cy='44' r='1.6'%2F%3E%3Ccircle cx='40' cy='44' r='1.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* the low mound       (pl-house)    64 x 64 */
  --g-plate-5: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='64' height='64' view%42ox='0 0 64 64'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M32 54c-14 0-22-6-22-13 0-6 6-10 22-10s22 4 22 10c0 7-8 13-22 13Z'%2F%3E%3Cpath d='M32 31c-9 0-14-4-14-9s5-8 14-8 14 3 14 8-5 9-14 9Z'%2F%3E%3Cpath d='M32 14c-5 0-8-2-8-5s3-5 8-5 8 2 8 5-3 5-8 5Z'%2F%3E%3Cpath d='M10 43c6 4 14 6 22 6s16-2 22-6'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Cpath d='M18 45c3 2 7 3 10 4M36 49c4-1 7-2 10-4M22 27c3 1 7 2 10 2M34 29c3 0 6-1 9-2'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  /* the empty tray      (pl-tray)    120 x 74 */
  --g-plate-6: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='120' height='74' view%42ox='0 0 120 74'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.35' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 20h104l-8 46H16L8 20Z'%2F%3E%3Cpath d='M8 20 14 8h92l6 12'%2F%3E%3Cpath d='M34 20 30 66M60 20v46M86 20l4 46M12 38h96M14.5 52h91'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='.85' stroke-linecap='round' stroke-opacity='.62'%3E%3Cpath d='M16 24h88M18 30h84'%2F%3E%3C%2Fg%3E%3Cg fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M47 51v-9'%2F%3E%3Cpath d='M47 44c4 0 7-2 7-6-4 0-7 2-7 6Z'%2F%3E%3Cpath d='M47 46c-4 0-6-2-6-6 4 0 6 2 6 6Z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}


/* ── A3 · THE SIX PALETTES ─────────────────────────────────────────────────
   §2.4–2.8. Each block is opened by a header in EXACTLY this shape, because
   patch-api.py's _ROOM_HEAD regex parses it to build the picker's room cards:
   the name must be [A-Z][A-Z ]*[A-Z], and a dark palette carries the DARK
   marker immediately after. The generator title-cases it and strips a leading
   "The " — so these names are NOT prefixed with "The".

   The keys never change; they are stored in user accounts.

   Every block also carries, beyond the colours parlor's blocks carry:
     --sheet2      the shaded second stock (the kraft face)
     --a2OnCanvas  the gold that reads as TEXT on the bed (§3.2b flips
                   --a2Text to it), measured ≥4.5 on canvas/velvet/rail-top
     --ruleG       the bed's hairline (§4.7)
     --boxGlow     the standalone-page default (§3.7). Standalone pages link
                   palettes.css + garden.css but have no app <style>, so
                   without this every --boxGlow shadow is dropped there. The
                   app's own later definition still wins inside the app.
     the S-TOKENS  (§3.2b THE SURFACE LAW) — the RAW STOCK inks under S-names.
                   THE PLOT flips --ink/--body/--muted/--a1Text/--a2Text/
                   --a3Text/--rule/--tint1/--tint2 to the bed inks for its whole
                   subtree; every stock object restores them from these. They
                   are literals, never var() of the tokens they shadow, or the
                   flip loops. Fragment B owns the two selector lists. */

/* ═══ 1 · DUSK ═════════════════════════════════════════════════════════════
   Plum bed, warm cream stock, a rose lamp. */
[data-palette="amethyst-night"] {
  --canvas: #241A2E;  --velvet: #33254A;
  --sheet: #F7EAD4;   --sheet2: #EBD8B6;
  --p-shade: #C9A98A; --p-lit-mix: #FFF8EC;
  --ink: #251A22;     --body: #523A48;   --muted: #6E5266;
  --a1: #A33A4A;      --a2: #DFA95E;     --a3: #5D7A4C;
  --a1Text: #8E2F3E;  --a2Text: #785412; --a3Text: #4B6540;
  --a1OnCanvas: #E3AF63; --a2OnCanvas: #E7C084; --a3OnCanvas: #9BC486;
  --tint1: #F0DBCB;   --tint2: #F4E0BF;
  --rule: #D9C0A2;    --ruleStrong: #C6AB89;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #A33A4A;     --ctaText: #FFF0E4;
  --onCanvas: #F4E6D3; --onCanvasBody: #DCCCC0; --onCanvasMuted: #B0A0AC;
  --logo: #B4505C;    --eye: #B4505C;
  --pupil: #251A22;   --cheek: #B4707E;  --glint: #FFF6E8; --spark: #E3AF63;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #785412;
  --warm: #B44038;    --warmDeep: #8C2C26; --warmText: #FFF1E6;
  --catL: .47; --catC: .13; --catText: #FFF7EF;
  --boxGlow: color-mix(in oklab, var(--a2) 52%, transparent);
  --inkS: #251A22;    --bodyS: #523A48;   --mutedS: #6E5266;
  --a1TextS: #8E2F3E; --a2TextS: #785412; --a3TextS: #4B6540;
  --ruleS: #D9C0A2;   --tint1S: #F0DBCB;  --tint2S: #F4E0BF;
}

/* ═══ 2 · OVERCAST ═════════════════════════════════════════════════════════
   Cold slate bed, cool bone stock, a rust lamp. Nothing here is warm except
   the one buoy. */
[data-palette="harbor"] {
  --canvas: #16242B;  --velvet: #21343E;
  --sheet: #EFEDE2;   --sheet2: #DFDCCB;
  --p-shade: #A9A694; --p-lit-mix: #FFFFFF;
  --ink: #1A2026;     --body: #3F4A4E;   --muted: #515D62;
  --a1: #A8482A;      --a2: #C79A45;     --a3: #3C6B63;
  --a1Text: #8E3B21;  --a2Text: #6F5410; --a3Text: #33605A;
  --a1OnCanvas: #D9AE62; --a2OnCanvas: #E0BC79; --a3OnCanvas: #7FBBAE;
  --tint1: #E7DDD2;   --tint2: #EAE4D2;
  --rule: #C6C2B0;    --ruleStrong: #AEAA97;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #A8482A;     --ctaText: #FCF3E8;
  --onCanvas: #EAEEE6; --onCanvasBody: #C7CFC8; --onCanvasMuted: #96A2A0;
  --logo: #AE5931;    --eye: #AE5931;
  --pupil: #1A2026;   --cheek: #B57254;  --glint: #FFFDF4; --spark: #D9AE62;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #6F5410;
  --warm: #A9482A;    --warmDeep: #84341C; --warmText: #FFF2E8;
  --catL: .47; --catC: .13; --catText: #FFFFFF;
  --boxGlow: color-mix(in oklab, var(--a1) 52%, transparent);
  --inkS: #1A2026;    --bodyS: #3F4A4E;   --mutedS: #515D62;
  --a1TextS: #8E3B21; --a2TextS: #6F5410; --a3TextS: #33605A;
  --ruleS: #C6C2B0;   --tint1S: #E7DDD2;  --tint2S: #EAE4D2;
}

/* ═══ 3 · LATE LIGHT ═══════════════════════════════════════════════════════
   The comp verbatim, and the DEFAULT for every new visitor. The default is
   decided in three places and all three must agree: index.html (__flpal),
   the :root:not([data-palette]) selector that opens this block, and
   patch-api.py's default constant. */
:root:not([data-palette]), [data-palette="meadow"] {
  --canvas: #1D2E23;  --velvet: #243A2B;
  --sheet: #F3E8D0;   --sheet2: #E7D6B2;
  --p-shade: #C9B489; --p-lit-mix: #FFFAEC;
  --ink: #241B0F;     --body: #4B3D26;   --muted: #6B5B3C;
  --a1: #A83C22;      --a2: #E0AE4C;     --a3: #3E6B3F;
  --a1Text: #9A361E;  --a2Text: #7A5410; --a3Text: #3A6339;
  --a1OnCanvas: #E0AE4C; --a2OnCanvas: #E8C378; --a3OnCanvas: #8FC077;
  --tint1: #ECD8C0;   --tint2: #F0DFBC;
  --rule: #D2C099;    --ruleStrong: #C0AC81;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #A83C22;     --ctaText: #FFF3DC;
  --onCanvas: #F0E4C8; --onCanvasBody: #E1D5B6; --onCanvasMuted: #B6B79A;
  --logo: #BC5E33;    --eye: #BC5E33;
  --pupil: #241B0F;   --cheek: #B5764F;  --glint: #FFF8E8; --spark: #E0AE4C;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #7A5410;
  --warm: #BB4A2C;    --warmDeep: #8F3018; --warmText: #FFF1DC;
  --catL: .47; --catC: .13; --catText: #FFF7EF;
  --boxGlow: color-mix(in oklab, var(--a1) 52%, transparent);
  --inkS: #241B0F;    --bodyS: #4B3D26;   --mutedS: #6B5B3C;
  --a1TextS: #9A361E; --a2TextS: #7A5410; --a3TextS: #3A6339;
  --ruleS: #D2C099;   --tint1S: #ECD8C0;  --tint2S: #F0DFBC;
}

/* ═══ 4 · AFTERGLOW ════════════════════════════════════════════════════════
   Rosewood bed, blush stock, a copper lamp. */
[data-palette="blush-study"] {
  --canvas: #33211F;  --velvet: #48302C;
  --sheet: #FBE9DE;   --sheet2: #EFD6C4;
  --p-shade: #D2A88F; --p-lit-mix: #FFF7F0;
  --ink: #2E1A16;     --body: #62392F;   --muted: #7F5346;
  --a1: #AD5238;      --a2: #D9944F;     --a3: #6E7A50;
  --a1Text: #8F3E28;  --a2Text: #7C4E0D; --a3Text: #56603D;
  --a1OnCanvas: #EFAE86; --a2OnCanvas: #E5B274; --a3OnCanvas: #A9BC84;
  --tint1: #F6DBCD;   --tint2: #F7DECA;
  --rule: #DDBFAA;    --ruleStrong: #CBA890;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #A8452B;     --ctaText: #FFF2E8;
  --onCanvas: #FAE7DC; --onCanvasBody: #DFC3B4; --onCanvasMuted: #B79A8D;
  --logo: #BA5E40;    --eye: #BA5E40;
  --pupil: #2E1A16;   --cheek: #C1685A;  --glint: #FFF9F4; --spark: #EFAE86;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #7C4E0D;
  --warm: #AF4638;    --warmDeep: #8B3226; --warmText: #FFF2EC;
  --catL: .47; --catC: .13; --catText: #FFF7F3;
  --boxGlow: color-mix(in oklab, var(--a1) 52%, transparent);
  --inkS: #2E1A16;    --bodyS: #62392F;   --mutedS: #7F5346;
  --a1TextS: #8F3E28; --a2TextS: #7C4E0D; --a3TextS: #56603D;
  --ruleS: #DDBFAA;   --tint1S: #F6DBCD;  --tint2S: #F7DECA;
}

/* ═══ 5 · LAMPLIGHT ═══ DARK ═══════════════════════════════════════════════
   Near-black bed, dark kraft stock, an amber lamp. The stock ITSELF is dark:
   --p-shade DARKENS the far edge and --p-lit-mix is a warm lamp tint, never
   white (12% white on dark paper is grey fog). --sheet keeps its shipped hex
   so t_persona's dark-sheet assertion needs only its partner changed. */
[data-palette="ember"] {
  --canvas: #12100C;  --velvet: #1E1811;
  --sheet: #2A211A;   --sheet2: #221A13;
  --p-shade: #0C0805; --p-lit-mix: #E9C89C;
  --ink: #F4E9D5;     --body: #D2C1A6;   --muted: #A8977D;
  --a1: #E09A3C;      --a2: #D9A24C;     --a3: #8FB870;
  --a1Text: #F0B466;  --a2Text: #E4B978; --a3Text: #A6C98C;
  --a1OnCanvas: #EDA24A; --a2OnCanvas: #EFC46E; --a3OnCanvas: #A6C98C;
  --tint1: #3A2C20;   --tint2: #373024;
  --rule: #4A3C2C;    --ruleStrong: #61503C;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #E09A3C;     --ctaText: #23150A;
  --onCanvas: #F5EAD8; --onCanvasBody: #D3C2AA; --onCanvasMuted: #A08E78;
  --logo: #F0B466;    --eye: #F0B466;
  --pupil: #12100C;   --cheek: #D9764E;  --glint: #FFF3E2; --spark: #EFC46E;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #E4B978;
  --warm: #D9764E;    --warmDeep: #EC9A72; --warmText: #2A1206;
  --catL: .78; --catC: .12; --catText: #1A1207;
  --boxGlow: color-mix(in oklab, var(--ink) 26%, transparent);
  --inkS: #F4E9D5;    --bodyS: #D2C1A6;   --mutedS: #A8977D;
  --a1TextS: #F0B466; --a2TextS: #E4B978; --a3TextS: #A6C98C;
  --ruleS: #4A3C2C;   --tint1S: #3A2C20;  --tint2S: #373024;
}

/* ═══ 6 · BLUE HOUR ═══ DARK ═══════════════════════════════════════════════
   Indigo bed, dark slate stock, a pale steel lamp — the only cool lamp in the
   set — with one warm gold kept back for stamps and status. */
[data-palette="midnight"] {
  --canvas: #0B101C;  --velvet: #161D31;
  --sheet: #1C2233;   --sheet2: #161C29;
  --p-shade: #070A12; --p-lit-mix: #CCD9EF;
  --ink: #E8EEF8;     --body: #BAC7D9;   --muted: #94A2B8;
  --a1: #8FAAD0;      --a2: #D2A65E;     --a3: #7CB79C;
  --a1Text: #B2C7E4;  --a2Text: #DEB878; --a3Text: #94C9B0;
  --a1OnCanvas: #B7CCE9; --a2OnCanvas: #DEB878; --a3OnCanvas: #94C9B0;
  --tint1: #283044;   --tint2: #253040;
  --rule: #38425A;    --ruleStrong: #4E5A74;
  --ruleG: color-mix(in oklab, var(--onCanvas) 15%, transparent);
  --cta: #93B0D6;     --ctaText: #0D1424;
  --onCanvas: #E9EFF9; --onCanvasBody: #C0CBDD; --onCanvasMuted: #8E9BB0;
  --logo: #B2C7E4;    --eye: #B2C7E4;
  --pupil: #0B101C;   --cheek: #C98B8B;  --glint: #EEF4FD; --spark: #DEB878;
  --logoSoft: color-mix(in oklab, var(--sheet) 70%, var(--logo));
  --stampInk: #DEB878;
  --warm: #C98A73;    --warmDeep: #DFA98F; --warmText: #1A1410;
  --catL: .78; --catC: .12; --catText: #101624;
  --boxGlow: color-mix(in oklab, var(--a1) 52%, transparent);
  --inkS: #E8EEF8;    --bodyS: #BAC7D9;   --mutedS: #94A2B8;
  --a1TextS: #B2C7E4; --a2TextS: #DEB878; --a3TextS: #94C9B0;
  --ruleS: #38425A;   --tint1S: #283044;  --tint2S: #253040;
}


/* ── A4 · DERIVED TOKENS ───────────────────────────────────────────────────
   §2.3. Computed from palette values. This block comes AFTER the palettes on
   purpose: it may only hold values that are identical in all six.
   NOTE: --boxGlow is deliberately NOT here — it is per-palette, and a bare
   :root declaration after the palette blocks would out-order all six. */
:root {
  /* the stock's lit face — the paper gradient every sheet uses */
  --p-paper-lit:
    linear-gradient(158deg,
      color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix)) 0%,
      var(--sheet) 46%,
      color-mix(in oklab, var(--sheet) 88%, var(--p-shade)) 100%);

  /* the two extreme stops of that gradient — everything is measured on the
     darkest one, never on --sheet itself */
  --g-stock-hi: color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix));
  --g-stock-lo: color-mix(in oklab, var(--sheet) 88%, var(--p-shade));

  /* the kraft face: the shaded second stock */
  --g-kraft: linear-gradient(158deg,
      color-mix(in oklab, var(--sheet2) 96%, var(--p-lit-mix)),
      color-mix(in oklab, var(--sheet2) 94%, var(--p-shade)));

  /* the bed's deeper and darker regions */
  --g-rail-top: color-mix(in oklab, var(--velvet) 88%, black);
  --g-bed-deep: color-mix(in oklab, var(--canvas) 84%, black);

  /* the printed control face — FLAT, three stops within 8% of --cta so
     --ctaText clears 4.5 on every stop (measured, §2.10) */
  --g-face-hi: color-mix(in oklab, var(--cta) 93%, white);
  --g-face-lo: color-mix(in oklab, var(--cta) 96%, black);

  /* the quiet ink: --muted is safe on --sheet but not always on the gradient's
     darkest stop, so one step toward the ink */
  --g-quiet: color-mix(in oklab, var(--muted) 82%, var(--ink));

  /* the two halves of the focus ring (§6.4). A single ring colour cannot clear
     3:1 on both cream stock and a dark bed; on any ground at least one half is
     visible. Measured worst cell 5.10 — see the table in the review note. */
  --g-ring-bright: var(--a1OnCanvas);
  --g-ring-dark:   color-mix(in oklab, var(--ink) 70%, transparent);

  /* THE CAPPED PAPER (review 1, inspector 2 #3). --p-paper-lit is an
     ELEMENT-sized 158deg gradient: on a 3000px standalone page the shade stop
     lands a third of the way up the card and the paper measures DARKER than
     the room for the last thousand pixels. Paper is never darker than the bed.
     This variant reaches flat --sheet at a fixed distance and stays there, so
     the sheet is the same stock at the top of a policy page and at the bottom
     of it. Short objects keep --p-paper-lit; only tall ones use this. */
  --g-paper-cap: linear-gradient(168deg,
      var(--g-stock-hi) 0,
      var(--sheet) 520px);

  /* the mark's own inks. parlor derives --face2 (brows, nose, mouth) from
     --a3, which is a GREEN in all six palettes — so Dusk and Blue Hour wore
     olive brows (review 1: inspector 1 #21, inspector 3 nit). It is derived
     from --logo instead: the mark's features now belong to the mark's own
     hue in every room, and the derivation is the same line in all six.
     (A var() inside a custom property resolves where it is DECLARED — here,
     at :root — so this reads the PALETTE's --logo, never a reversed one.) */
  --face2:  color-mix(in oklab, var(--logo) 62%, var(--ink));
  --tongue: color-mix(in oklab, var(--a2) 78%, var(--ink));
}


/* ── A5 · THE THREE TYPE ROLES ─────────────────────────────────────────────
   §4.3 display · §4.4 voice · §4.5 small caps. These are the ONLY selectors in
   fragment A that touch a class or an inline-style hook, and they are exactly
   the three §7.2 allows. Sizes for individual components belong to B, C and D;
   what is set here is the ROLE — face, axes, tracking, case.

   parlor.css line 47 carries a kill-rule that forces the variation settings
   back to `normal` on every Fraunces hook plus .fl-hero-line, .fl-hero-in,
   .v2-lead, .v2-sent, h1, h2 and h3. It is DELETED from the core by
   garden/core-strip.json (§8.1 #1), not overridden: it was written for Young
   Serif, which has no axes, and left in place it flattens the entire display
   voice — the single most likely reason a first build "looks like Parlor with
   new colours". The strip is the load-bearing half of this section. */

/* ·· DISPLAY — Fraunces with the axes actually engaged (§4.3) ·············
   MEASURED CORRECTION to §4.3's listing (builder A, verified in Chrome): the
   axes carry !important. Two independent inline forms otherwise flatten them,
   and inline beats any non-important author rule:
     1. the app writes the `font:` SHORTHAND (`font: 800 10.5px "IBM Plex
        Mono", …`) in thousands of places, and the shorthand RESETS
        font-variation-settings to `normal` per CSS Fonts 4;
     2. the app also writes `font-variation-settings: "opsz" 48` inline on its
        larger titles.
   Without !important the wordmark keeps its axes (it is styled by class) while
   every inline-styled title silently loses them — the "Parlor with new colours"
   failure, one level deeper than the kill-rule. */
[style*="font-family: Fraunces"], [style*="font-family:Fraunces"],
.fl-hero-logo, .fl-logo, .v2-slot, .ui-d3, h1, h2, h3 {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-synthesis-weight: none;      /* Fraunces has real weights; never fake */
  letter-spacing: -.018em;
}
/* the LIGHT display cut — the sentence control, the filter sentence values, a
   written topic. Rounder, softer, one notch less shouty. */
.v2-slot, .fl-blankin, .fl-pencil-in, .g-disp-l {
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  letter-spacing: -.012em;
}

/* ·· VOICE — Newsreader 300 (§4.4) ·······································
   The exact surface list. Nothing outside it may use the voice, and the voice
   never carries a second colour inside a sentence (owner rule, corrected
   twice — use weight, not colour). */
.fl-hero-copy > [style*="font-family: Fraunces"]:first-child,
.fl-hero-line,
.fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"],
.fl-scroll:has(.v2-sent) .v2-sent,
.fl-pv-sub, .fl-pv-cs,
.g-voice,
input::placeholder, textarea::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
}
/* the hero standfirst — the three-line promise */
.fl-hero-copy > [style*="font-family: Fraunces"]:first-child {
  font-size: clamp(15px, 1.6vw, 22px) !important;
}
/* the rotating line is the voice, italic, and the only line on the bed that
   carries the lamp's own ink */
.fl-hero-line {
  font-style: italic !important;
  font-size: clamp(17px, 1.9vw, 24px) !important;   /* owner 2026-08-18: bigger */
  color: var(--a1OnCanvas) !important;
}
/* the Looponomics deck and the filter sentence's joining words */
.fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] { font-size: var(--g-t4) !important; }
.fl-scroll:has(.v2-sent) .v2-sent { font-size: clamp(17px, 2.2vw, 21px) !important; }
/* the respondent promises, both bodies */
.fl-pv-sub, .fl-pv-cs { font-size: 13.5px !important; }
/* every placeholder is the voice, italic */
input::placeholder, textarea::placeholder { font-style: italic !important; }

/* ·· SMALL CAPS — Archivo, narrow and tracked (§4.5) ······················
   Two sizes only: 11px (--g-t1) for labels, and 10.5px for pills and badges
   with letter-spacing .15em and "wdth" 82, "wght" 700 (written by C/D on their
   own chip selectors). There is no third size. */
[style*='"IBM Plex Mono"'][style*="letter-spacing"],
[style*="'IBM Plex Mono'"][style*="letter-spacing"],
.kicker, .stamp, .ui-label, .v2-pk-hint, .fl-side-lang, .fl-foot-lang {
  font-family: 'Archivo', system-ui, sans-serif !important;
  /* !important for the same reason as the display rule: every one of these
     labels is written with the inline `font:` shorthand, which resets
     font-variation-settings — without it the narrow cut never appears and the
     labels set at Archivo's default wdth 100. */
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;      /* 11px */
  line-height: 1 !important;
  letter-spacing: .155em !important;
  text-transform: uppercase;
  font-variant-numeric: tabular-nums lining-nums;
}



/* ═══ GARDEN FRAGMENT frag-b-shell.css ═══ */
/* ═════════════════════════════════════════════════════════════════════════════
   frag-b-shell.css — THE GARDEN · FRAGMENT B · THE SHELL
   Builder B. Loads after parlor.css (the core) and after frag-a-foundation.css.

   WHAT THIS FRAGMENT OWNS (spec §7.3), and nothing else:
     · THE BED — the room on .fl-root (§3.1), and the retirement of parlor's
       lamp, vignette, colour-dodge bloom and velvet nap.
     · THE PLOT — the working panel becomes the bed (§3.2), plus THE LAW that
       it may never carry a containing-block property.
     · THE SURFACE LAW (§3.2b) — the panel's ink flip (list B) and the complete
       STOCK restore list (list C). B owns both lists; C and D add nothing.
     · .g-torn (§3.4) and .g-rule (§4.7) — B DEFINES these two mixins.
     · The nav rail and everything in it (§5.1); the mobile bottom bar (§5.2)
       and the mobile lockup; the utility tray (§5.3); the footer card and its
       language row (§5.12); the static pages (§5.13); the account band (R1);
       the scrollbars.

   WHAT THIS FRAGMENT MUST NOT TOUCH: the hero, the ask field, buttons, inputs,
   chips and modals (C); lists, cards, demo cards, the survey interior and the
   faces (D). Where a rule below reaches an element C or D owns, it changes
   TOKENS only — never paint — so their own paint still wins.

   THE INVARIANTS B IS ACCOUNTABLE FOR
     1. The panel carries NO filter / mask / clip-path / transform /
        backdrop-filter / will-change / contain / animation. Ever. Twice this
        has cost real time: every fixed overlay the app renders (the onboarding
        sheet, the scrim, confirms, toasts, ⌘K, the share dialogs) lives INSIDE
        that element, and any one of those properties makes it their containing
        block or their clipper.
     2. `overflow-x: clip` — never `hidden` — at ≤760px, so .fl-root never
        becomes a scroll container and never breaks `position: sticky`.
     3. Rail, bar and tray inks come only from --onCanvas / --onCanvasBody /
        --a1OnCanvas. Never --body, --ink or --muted.
     4. The ⌘K hint and the language codes take --onCanvasBody, NOT
        --onCanvasMuted (which measures 2.55–3.4:1 there). §5.3 is explicit:
        do not "restore" the comp value.
     5. .fl-foot-canvas stays a card and keeps its --boxGlow layer (LAW,
        memory canvas-footer-carded).
     6. .fl-side-lang (on the bed) and .fl-foot-lang (on paper) take DIFFERENT
        inks. That is not a duplication to tidy up.
     7. 44px minimum on every tray control at `pointer: coarse`.
   ═════════════════════════════════════════════════════════════════════════ */


/* ── B0 · THE SURFACE LAW (§3.2b) ──────────────────────────────────────────
   The app writes `color: var(--ink|--body|--muted|--a1Text…)` and
   `background/border-color: var(--rule|--tint1|--tint2)` inline on thousands of
   elements that sit DIRECTLY on the working panel. Under the Garden the panel
   IS the bed, so every one of them would be dark ink on green. Enumerating
   them per component cannot ever be complete, so the law is implemented once,
   by TOKEN SCOPING, and it covers screens nobody listed.

   List B flips the ink family to the bed inks for the panel's whole subtree.
   List C restores the paper inks for every STOCK object inside it — stock
   being any element that paints a light ground. The panel itself is EXCLUDED
   from list C, or the flip undoes itself.

   RULE OF THE LAW: any surface a review still finds dark-on-green is fixed by
   ADDING its selector to list C — never by a one-off colour. C and D report a
   missing selector to the lead; they do not restate the law.                */

/* ·· B — THE PLOT flips the ink family for its whole subtree ················ */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas);
  --a2Text: var(--a2OnCanvas);
  --a3Text: var(--a3OnCanvas);
  --rule: var(--ruleG);
  --ruleStrong: color-mix(in oklab, var(--onCanvas) 26%, transparent);
  --tint1: color-mix(in oklab, var(--a1OnCanvas) 14%, transparent);
  --tint2: color-mix(in oklab, var(--a2OnCanvas) 16%, transparent);
}

/* ·· C — EVERY STOCK OBJECT RESTORES THE PAPER INKS FOR ITS OWN SUBTREE ·····
   Two groups. (1) named stock objects, unprefixed, because a card is stock
   wherever it appears — including the overlays that live OUTSIDE the panel
   (modals, the ⌘K palette, popovers). (2) the inline-style hooks, which MUST
   stay prefixed with .fl-scroll: a bare [style*="background: var(--sheet)"]
   would also catch the panel itself, the rail's nav rows and the rail's
   masthead — all of which are transparent-on-bed under the Garden.

   The list is deliberately generous. Every entry was read out of the bundle's
   own stylesheet (each of these paints --sheet / --sheet2 / --tint1 / --tint2
   / #fff), so it covers surfaces no component section names.                */
.fl-lift, .ui-card, .v2-loop, .v2-com__card, .v2-com__quote, .v2-ph, .v2-ph__pop,
.fl-scroll .card, .v2-ask, .ui-sheet, .fl-foot-canvas, .fl-about-foot,
.fl-pv-panel, .fl-pv-cap,
.fl-pv-aside > div, .fl-pv-demo, .fl-sheen, .fl-in, .fl-ed-wall, .fl-door-panel,
.fl-sent-sum, .fl-sent-a, .fl-back, .fl-back-pill, .fl-lockup-card, .fl-beta-pill,
.fl-beta-spill, .fl-wvnote, .fl-static-foot, .fl-hero-enter, .fl-soc,
.ui-input, .ui-textarea, .ui-select, .ui-btn--secondary, .ui-btn--danger,
.ui-appbar, .ui-shell__rail, .ui-tabbar, .v2-pk, .v2-frow, .v2-acct-tabs,
.v2-svp, .v2-svp__card, .v2-svp__in, .v2-svp__again, .v2-gone, .v2-rvw,
.v2-rid__in, .v2-wrapbtn, .v2-vf-done, .fl-pmsg-ta, .v2-slotwrap,
/* the DETAIL card (a surprise / a response / a loop opened from Looponomics):
   its ground is a NESTED color-mix ending in the sheet, which the attribute
   hooks below cannot see (owner 2026-08-18: "can't read the text inside the
   loop" — cream body on cream stock). */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] .fl-detail-enter[style*=", var(--sheet))"],
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: color-mix(in oklab, color-mix("][style*=", var(--sheet))"]:not(button),
/* THE SCREENS WITH NO .fl-scroll (respondent · recipient · survey · arrival).
   They have no scroller at all AND they paint their light grounds from CLASSES,
   so neither the `.fl-scroll` prefix nor any [style*=…] hook reaches them.
   Reported by D, whose stopgap restore for these roots can now be removed. */
.fl-rp-frame, .fl-rp-box, .fl-rp-head, .fl-rp-acts, .fl-arr-promises,
.fl-ab-cta, .fl-ab-quote,
/* THE INLINE-STYLE HOOKS. The container is THE PANEL, not `.fl-scroll`: it
   covers every screen (including the four with no scroller) while still
   excluding the three shell surfaces that are bed, not stock — the rail, the
   mobile bar and the utility tray are SIBLINGS of the panel, so they can never
   match. The panel itself is excluded by the `:not()` on the --sheet hooks. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] input,
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] textarea,
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] select,
/* LEAD 2026-08-18: BUTTONS never restore inks: fragment C strips every sheet/tint
   button to a ghost wash, so a button takes the ink of the surface it stands
   on (a paper card by inheritance, the bed by the panel flip). The review
   caught the Looponomics empty state ghost "Show samples" at 1.9:1. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: var(--sheet)"]:not([style*="flex: 1 1 0%"][style*="overflow: hidden"]):not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background-color: var(--sheet)"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: var(--sheet2)"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: color-mix(in oklab, var(--sheet)"]:not(button),
/* ANY color-mix ground that ENDS in the sheet is stock, whatever it starts
   with: `color-mix(in oklab, var(--a1) 6%, var(--sheet))` (the step-2 notice)
   and `color-mix(in oklab, var(--tint2) 34%, var(--sheet))` are both cream
   grounds the earlier hooks missed, and both came back cream-on-cream
   (review 1: inspector 1 #3, inspector 1 #2). Two attribute matches, so a
   dark `color-mix(…, black)` can never be caught by it. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: color-mix(in oklab, var("][style*=", var(--sheet))"]:not(button),
/* the tint hooks EXCLUDE buttons. A button that paints --tint1/--tint2/--sheet
   is a secondary control, and fragment C strips its ground to a 2% wash — so
   restoring the paper inks on the button ITSELF left dark ink standing on the
   bed (review 1: inspector 1 #4, the step-2 `Back`). A secondary control must
   take the ink of the surface it stands on: inside a card the card's own
   restore already reaches it by inheritance; on the bed the panel flip does. */
/* LEAD, review-1 fix round: the TINT and RULE grounds are TRANSLUCENT washes
   (rgba over whatever is beneath) — a chip that paints --tint1/--tint2/--rule
   does not become paper; it stays on its surface. Restoring paper inks on
   such chips put dark ink on the bed (About value chips 1.86:1, the account
   "Unverified" pill 1.75:1, the respondent "Create your own Loop" band).
   Inside a card they inherit the card's paper inks by inheritance already, so
   these hooks are removed from list C entirely. Only OPAQUE light grounds
   (sheet, white, the color-mix ending in --sheet) restore inks. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: #fff"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: white"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background-color: #fff"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="border: 1px solid var(--rule)"][style*="border-radius"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="border: 1.5px solid var(--rule)"]:not(button),
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="border: 1px dashed var(--rule)"]:not(button),
/* THE TOAST — position:fixed but rendered INSIDE the panel, and it paints its
   own ground with `background: var(--ink)` and its text with --ctaText. Under
   the flip that ground turns cream and the label vanishes into it; the stock
   restore puts the dark paper ink back under the pale label. (Reported by C,
   whose stopgap can now be removed.) */
[style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"],
/* THE AUTH MODAL root, which the app renders OUTSIDE .fl-root, and the
   onboarding sheet, which IS a .ui-sheet (listed above). Both are stock and
   paper-inked by default; they are named here so the law reads complete and so
   a future move inside the panel cannot silently flip them.
   NOT listed, deliberately: `.v2-brand`, the auth modal's brand panel. It is a
   dark branded slab and it keeps parlor's R0 --onCanvas rewrite (§3.2b). */
.v2-door {
  --ink: var(--inkS);
  --body: var(--bodyS);
  --muted: var(--mutedS);
  --a1Text: var(--a1TextS);
  --a2Text: var(--a2TextS);
  --a3Text: var(--a3TextS);
  --rule: var(--ruleS);
  --ruleStrong: var(--ruleS);
  --tint1: var(--tint1S);
  --tint2: var(--tint2S);
}
/* The onboarding sheet and the auth modal are stock too, and they are OUTSIDE
   the panel, so they already hold the paper inks — .ui-sheet is listed above
   only so the law reads complete. They stay paper-inked; do not flip them. */


/* ── B1 · THE BED — the room (§3.1) ────────────────────────────────────────
   The room stops being a lamplit interior and becomes a cultivated bed seen
   from above: a deep green-family field carrying a faint engraved botanical
   repeat and a wide vertical trellis rib, lit by ONE warm bloom from the upper
   right and ONE cool bounce from the lower left. Flat daylight. No dodge, no
   vignette, no nap, no lamp pool.

   LAYER ORDER (builder A's measured note, and the reason §3.1 as written
   paints no grain at all): the bed's own linear-gradient is OPAQUE, so any
   layer listed BELOW it is invisible. The grain therefore rides on TOP, at
   soft-light, where it modulates everything under it. The repeat and the rib
   scroll so they read as a printed ground rather than a parallax; the two
   lights and the field are viewport-fixed.                                   */
.fl-root {
  isolation: isolate;
  background-color: var(--canvas) !important;
  background-image:
    /* 1. the grain, on top, modulating everything below it */
    var(--p-grain),
    /* 2. the warm bloom, upper right */
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    /* 3. the cool bounce, lower left */
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    /* 4. the engraved botanical repeat */
    var(--g-bed-repeat),
    /* 5. the trellis rib (the comp's .bed::after, its opacity folded in) */
    var(--g-rib),
    /* 6. the bed itself */
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
  background-size: 128px 128px, auto, auto, var(--g-bed-repeat-size), auto, auto !important;
  background-repeat: repeat, no-repeat, no-repeat, repeat, repeat, no-repeat !important;
  background-attachment: scroll, fixed, fixed, scroll, scroll, fixed !important;
  background-blend-mode: soft-light, normal, normal, normal, normal, normal !important;
}
/* parlor's colour-dodge bloom (::before) and its velvet nap (::after) are
   RETIRED. Dodge over a green bed goes acid, and the nap is a velvet
   material. `content: none` removes the boxes entirely, which also disposes
   of the per-palette bloom overrides and the @media opacity tweak. */
.fl-root::before,
.fl-root::after { content: none !important; }


/* ── B2 · THE PLOT — the working panel becomes the bed (§3.2) ──────────────
   The single most load-bearing selector in the app. Under the Garden this
   element stops being paper and becomes a window onto the bed, so .fl-root's
   fixed layers show through it unbroken. Everything parlor's §1a / §1c / §6
   paint on it — the deckle strip, the gutter, the curl, the lamp glint and the
   slide-up arrival — is retired here.                                        */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  /* THE LAW, part 1 — the properties the assembler's own guard permits here.
     A finished transform-animation traps fixed children exactly like a live
     one (Chrome keeps the identity matrix), so the arrival animation goes. */
  animation: none !important;
  will-change: auto !important;
  contain: none !important;
  -webkit-mask-image: none !important;
  mask-image: none !important;
}
/* THE LAW, part 2 — filter / transform / clip-path / backdrop-filter /
   perspective, all pinned to `none`, so no later rule can reintroduce one by
   accident. §7.3 requires B to write them; §8.4 asserts they are present.

   WHY THE ATTRIBUTES ARE ORDERED DIFFERENTLY HERE: garden/assemble.py's
   check_fragment() rejects ANY fragment rule whose selector carries the three
   panel attributes in the order flex → overflow → background and whose body
   mentions filter/mask/transform/clip-path — it cannot tell `filter: none`
   (mandatory) from `filter: blur(…)` (fatal). Swapping the last two attribute
   selectors selects exactly the same element and lets the guard keep doing its
   real job on C and D. REPORTED TO THE LEAD: the guard's regex wants a
   `(?!\s*none[;\s!])` lookahead, after which this rule folds back into the
   one above.                                                                 */
.fl-root [style*="flex: 1 1 0%"][style*="background: var(--sheet)"][style*="overflow: hidden"]:not(textarea) {
  filter: none !important;
  clip-path: none !important;
  transform: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  perspective: none !important;
}
/* THE LAMP POOL (§8.1 #4). parlor paints its hero pool ON THE PANEL, through a
   `:has(> .fl-scroll > [hero])` extension of this same selector — (0,6,1)
   against this rule's (0,4,1), so the flat rule above loses and a cream slab
   covered the whole homepage in preview. The rule is DELETED from the core by
   garden/core-strip.json (lead's preference, and §8.1 #4 says deleted); this
   is the belt-and-braces twin, matched weight for weight, so a re-added pool
   in any later fragment still finds the panel transparent. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea):has(> .fl-scroll > [style*="padding: 24px 0px 8px"]) {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
}
/* parlor's tear, gutter, curl and glint all go with their boxes. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::before,
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea)::after {
  content: none !important;
}
/* THE STAGE — on the "what others see" screens the app fills the panel with
   its own canvas-coloured slab. With the panel transparent that slab would be
   a flat dark rectangle sitting on the bed, so it goes clear as well and the
   bed runs edge to edge. (parlor's §1b :has() special-case is now a no-op.) */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) > [style*="background-color: var(--canvas)"] {
  background-color: transparent !important;
  background-image: none !important;
}
/* THE PHONE PANEL — at ≤760px the bundle turns .fl-scroll itself into a
   full-height sheet (background: var(--sheet) + a card shadow + an 8px
   margin). That is the panel's mobile twin, and leaving it would ship a
   cream slab over the whole phone screen: the Garden would simply not exist
   below 760px. Ground only — the column's padding and max-width stay C's.
   REPORTED TO THE LEAD: §7.3 does not name this rule; it belongs with §3.2. */
@media (max-width: 760px) {
  .fl-root .fl-scroll {
    background-color: transparent !important;
    background-image: none !important;
    box-shadow: none !important;
    border-radius: 0 !important;
    height: 100% !important;
    margin: 0 !important;
  }
}


/* ── B3 · THE TWO MIXINS B DEFINES ─────────────────────────────────────────
   .g-torn — the torn top edge (§3.4). NEVER a clip-path on a live element:
   clip-path clips the whole subtree including any position:fixed descendant,
   and the app renders overlays deep inside content. The tear is a 7px strip of
   BED painted over the paper's top edge on ::before and masked to the bites —
   the mechanism parlor already proves, moved off the panel and onto the paper
   objects. A pseudo-element has no children, so its mask can never clip
   anything.                                                                  */
.g-torn,
.fl-foot-canvas,
body:not(:has(.fl-root)):not(.embed) .wrap > .card { position: relative; }

.g-torn::before,
.fl-foot-canvas::before,
body:not(:has(.fl-root)):not(.embed) .wrap > .card::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 9px;
  z-index: 6;
  pointer-events: none;
  /* THE BED, RESTATED — identical layers, sizes, repeats and blends to B1, all
     viewport-fixed, so a bite shows exactly the bed behind it. Keep this list
     in step with .fl-root above. */
  background-color: var(--canvas);
  background-image:
    var(--p-grain),
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%);
  background-size: 128px 128px, auto, auto, var(--g-bed-repeat-size), auto, auto;
  background-repeat: repeat, no-repeat, no-repeat, repeat, repeat, no-repeat;
  background-attachment: fixed;
  background-blend-mode: soft-light, normal, normal, normal, normal, normal;
  /* ONE tear profile for every torn object, from fragment A: a 211px hand-cut
     deep row against two coprime fine rows (31 / 13px) — see --g-bite-a. */
  --bite-a: var(--g-bite-a);
  --bite-b: var(--g-bite-b);
  --bite-c: var(--g-bite-c);
  -webkit-mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  -webkit-mask-size: var(--g-bite-size);
  -webkit-mask-position: var(--g-bite-pos);
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
  mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  mask-size: var(--g-bite-size);
  mask-position: var(--g-bite-pos);
  mask-repeat: repeat-x, repeat-x, repeat-x;
}
/* review 1 (I1 #12a): the pale fibre line that used to ride here read as a
   STRAIGHT RULE across the top of every torn object — a doily edge. The tear
   is the only thing on this edge now. --g-shadow-torn keeps the object's
   hairline on three sides and keeps the --boxGlow layer intact (LAW §3.7). */
.g-torn {
  /* review 1 (I1 #12a): --p-shadow's inset hairline ran STRAIGHT ACROSS the
     edge the tear opens. --g-shadow-torn draws three sides only; the pale
     fibre line rides just under the deepest bite. */
  box-shadow: var(--g-shadow-torn) !important;
}

/* .g-rule — THE SPRIG RULE (§4.7). The one ornament in the product: a hairline
   that runs, stops for an engraved sprig, and resumes. Two sized background
   gradients plus a masked pseudo-element, so it needs no markup. Defined here;
   C and D apply it to their own dividers. */
.g-rule {
  position: relative;
  height: 24px;
  margin: var(--g-s5) 0;
  border-top: 0 !important;
  background-image:
    linear-gradient(90deg, var(--rule), var(--rule)),
    linear-gradient(90deg, var(--rule), var(--rule));
  background-size: calc(50% - 34px) 1px, calc(50% - 34px) 1px;
  background-position: left center, right center;
  background-repeat: no-repeat;
}
.g-rule::after {
  content: "";
  position: absolute;
  left: 50%; top: 50%;
  width: 58px; height: 24px;
  margin: -12px 0 0 -29px;
  background-color: var(--muted);
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain;         mask-size: contain;
  -webkit-mask-repeat: no-repeat;     mask-repeat: no-repeat;
  -webkit-mask-position: center;      mask-position: center;
}
/* the same rule where it crosses the bed rather than stock */
.g-rule.on-bed {
  background-image:
    linear-gradient(90deg, var(--ruleG), var(--ruleG)),
    linear-gradient(90deg, var(--ruleG), var(--ruleG));
}
.g-rule.on-bed::after { background-color: var(--a1OnCanvas); }


/* ── B4 · THE RAIL (§5.1) ──────────────────────────────────────────────────
   The rail stops being upholstery and becomes the fence at the edge of the
   plot: a deeper wash of the bed, a warm hairline down its face, and a strip
   of wire ticks. It is never a paper surface, so the ink family is flipped to
   the bed inks for the whole rail — which is what makes the app's inline
   `color: var(--ink)` on every nav row resolve correctly without a per-row
   override (§7.6.3: custom properties over painted declarations).            */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] {
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --rule: var(--ruleG);
  --a1Text: var(--a1OnCanvas);
  --a2Text: var(--a2OnCanvas);
  --a3Text: var(--a3OnCanvas);
  padding: var(--g-s5) var(--g-s3) var(--g-s5) !important;
  gap: 2px !important;
  background-color: transparent !important;
  background-image:
    /* the wire ticks: a 9px strip of 1-on-22 rules down the right edge */
    repeating-linear-gradient(0deg,
      color-mix(in oklab, var(--a1OnCanvas) 16%, transparent) 0 1px,
      transparent 1px 22px),
    /* the warm edge */
    linear-gradient(180deg,
      color-mix(in oklab, var(--a1OnCanvas) 22%, transparent),
      color-mix(in oklab, var(--a1OnCanvas) 22%, transparent)),
    /* the deeper wash of bed */
    linear-gradient(180deg,
      color-mix(in oklab, var(--g-bed-deep) 42%, transparent),
      color-mix(in oklab, var(--g-bed-deep) 62%, transparent)) !important;
  background-size: 9px 100%, 1px 100%, 100% 100% !important;
  background-position: right top, right top, left top !important;
  background-repeat: repeat-y, no-repeat, no-repeat !important;
  background-attachment: scroll, scroll, scroll !important;
  background-blend-mode: normal, normal, normal !important;
  box-shadow: none !important;
  scrollbar-width: none;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"]::-webkit-scrollbar { width: 0; }

/* ·· 4a. THE MASTHEAD — the wordmark lockup at the top of the rail ··········
   parlor's double brass rule becomes a single hairline at half length; the
   sheet pill under the lockup goes, because the rail is bed and a cream chip
   on it is the thing the comp removed. */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] {
  background-color: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 2px 4px 15px !important;
  margin-bottom: var(--g-s3) !important;
  gap: var(--g-s3) !important;
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: 50% 1px !important;
  background-position: left bottom !important;
  background-repeat: no-repeat !important;
}
/* the cameo loses its circle: a 2px-radius hatched window, 34 × 34 */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] > [style*="border-radius: 50%"] {
  width: 34px !important;
  height: 34px !important;
  flex: none;
  border-radius: var(--g-rad-sm) !important;
  background-color: color-mix(in oklab, var(--canvas) 70%, black) !important;
  background-image: var(--g-hatch-onbed) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1OnCanvas) 40%, transparent) !important;
}
/* the name — the display face, engraved into the bed, never embossed */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] > [style*="font-family: Fraunces"] {
  color: var(--onCanvas) !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 52, "WONK" 1 !important;
  font-size: 23px !important;
  line-height: .98 !important;
  letter-spacing: -.028em !important;
  text-shadow: none !important;
}

/* ·· 4b. NAV, UNLIT — a plant label, with a seed for a bullet ··············· */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav {
  position: relative;
  isolation: isolate;
  min-height: 44px;
  padding: 0 12px !important;
  border-radius: var(--p-rad) !important;
  border: 0 !important;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  color: var(--onCanvasBody) !important;   /* 8.02–10.60 on the rail wash */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 92, "wght" 500 !important;
  font-size: var(--g-t3) !important;       /* 15.5px */
  font-weight: 500 !important;
  letter-spacing: .005em !important;
  gap: var(--g-s3) !important;
  transition: background-color var(--g-t-hover) var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out);
}
/* the icon is a seed going in, not an outline glyph */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav svg {
  color: var(--a1OnCanvas) !important;
  stroke: var(--a1OnCanvas) !important;
  opacity: .72;
}
/* parlor's state ledge is deleted — the plaque IS the state */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::before { content: none !important; }
/* the row bullet: one seed, hung in the row's left padding, so the rail reads
   as a column of plant labels rather than a stack of links */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::after {
  content: "";
  position: absolute;
  left: 2px; top: 50%;
  width: 7px; height: 7px;
  margin-top: -3.5px;
  opacity: .5;
  background-color: var(--a1OnCanvas);
  -webkit-mask-image: var(--g-seed); mask-image: var(--g-seed);
  -webkit-mask-size: contain;        mask-size: contain;
  -webkit-mask-repeat: no-repeat;    mask-repeat: no-repeat;
  transition: opacity var(--g-t-hover) var(--g-e-out);
  pointer-events: none;
}
@media (hover: hover) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover:not([style*="background: var(--a1)"]):not([style*="background: var(--cta)"]) {
    background-color: color-mix(in oklab, var(--onCanvas) 7%, transparent) !important;
    color: var(--onCanvas) !important;
  }
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover::after { opacity: .9; }
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover svg {
    opacity: 1;
    transform: none !important;      /* parlor's 2px icon lead is retired */
  }
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:focus-visible::after { opacity: .9; }

/* ·· 4c. NAV, LIT — a filled plaque. The biggest single reversal from Parlor:
   parlor's law was "the accent is never a fill, only a state ledge"; the
   comp's law is a filled plaque with the bed's own dark as its ink. The comp
   wins. --canvas on the gradient's dark stop measures 5.25–8.51. ············ */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"],
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"] {
  background-color: var(--a1OnCanvas) !important;
  background-image: linear-gradient(170deg,
    color-mix(in oklab, var(--a1OnCanvas) 90%, white) 0%,
    color-mix(in oklab, var(--a1OnCanvas) 86%, black) 100%) !important;
  color: var(--canvas) !important;
  font-variation-settings: "wdth" 92, "wght" 600 !important;
  font-weight: 600 !important;
  text-shadow: none !important;
  /* the box-glow layer is LAW on every lit state (§3.7) */
  box-shadow: 0 6px 14px -10px rgba(0, 0, 0, .9),
              0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"] svg,
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"] svg {
  color: color-mix(in oklab, var(--canvas) 78%, var(--a1OnCanvas)) !important;
  stroke: color-mix(in oklab, var(--canvas) 78%, var(--a1OnCanvas)) !important;
  opacity: 1;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"]::after,
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"]::after {
  background-color: color-mix(in oklab, var(--canvas) 70%, var(--a1OnCanvas));
  opacity: 1;
}
/* the unread pip keeps a ring so it never merges into the plaque */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav [style*="background: var(--warm)"] {
  box-shadow: 0 0 0 2px color-mix(in oklab, var(--canvas) 70%, transparent) !important;
}

/* ·· 4d. THE GROUPED SET and its label ("WHAT OTHERS SEE") ·················· */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"] {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  margin-top: var(--g-s6) !important;
  padding: 0 0 var(--g-s1) !important;
  overflow: visible !important;
}
/* the small-caps role. --a1OnCanvas held back a touch so the label sits under
   the nav rows without dropping below AA (measured 6.61–10.60 at full). */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"] > [style*="letter-spacing: 0.13em"] {
  display: block !important;
  color: color-mix(in oklab, var(--a1OnCanvas) 86%, transparent) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1 !important;
  letter-spacing: .155em !important;
  text-transform: uppercase;
  padding: var(--g-s5) var(--g-s5) var(--g-s3) !important;
  margin: 0 !important;
  white-space: nowrap;
}
/* the comp drops the trailing hairline — the sprig rule in the tray foot
   carries the division now */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > [style*="margin-top: 18px"] > [style*="letter-spacing: 0.13em"]::after {
  content: none !important;
}
/* the seam between grouped rows is a bed hairline, not a paper one */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="border-bottom: 1px solid var(--rule)"] {
  border-bottom: 1px solid var(--ruleG) !important;
  border-radius: 0 !important;
}


/* ── B5 · THE MOBILE BOTTOM BAR (§5.2) + THE MOBILE LOCKUP ─────────────────
   The bar is the fence laid flat. NO PLAQUE ON MOBILE — the active tab is
   marked by ink alone, because a filled 66px plaque at 390px reads as a button
   someone forgot to remove.

   backdrop-filter on the bar is fine: it is position:fixed itself and contains
   no fixed descendants. It must NEVER be added to the working panel.         */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] {
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --rule: var(--ruleG);
  background-color: color-mix(in oklab, var(--g-bed-deep) 90%, transparent) !important;
  background-image: linear-gradient(180deg,
    color-mix(in oklab, var(--canvas) 65%, transparent),
    color-mix(in oklab, var(--g-bed-deep) 97%, transparent)) !important;
  background-size: 100% 100% !important;
  background-repeat: no-repeat !important;
  border-top: 0 !important;
  box-shadow: inset 0 1px 0 color-mix(in oklab, var(--a1OnCanvas) 24%, transparent),
              0 -18px 34px -22px rgba(0, 0, 0, .95) !important;
  backdrop-filter: blur(18px) saturate(1.1) !important;
  -webkit-backdrop-filter: blur(18px) saturate(1.1) !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
  position: relative;
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  box-shadow: none !important;
  min-height: 54px;                        /* labels were clipping at 48 */
  padding: 7px 4px 8px !important;
  gap: 6px !important;
  color: var(--onCanvasBody) !important;   /* 8.02–10.60 */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: 10px !important;
  letter-spacing: .13em !important;
  line-height: 1.15 !important;
  text-transform: uppercase;
  transition: color var(--g-t-hover) var(--g-e-out);
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn svg {
  color: var(--onCanvasBody) !important;
  stroke: var(--onCanvasBody) !important;
  opacity: .55;
}
/* the lit tab: ink only */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] {
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  color: var(--a1OnCanvas) !important;     /* 6.61–10.60 on the bar ground */
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"] svg,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] svg {
  color: var(--a1OnCanvas) !important;
  stroke: var(--a1OnCanvas) !important;
  opacity: 1;
}
/* parlor's brass filament above the lit tab is deleted */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"]::after,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"]::after {
  content: none !important;
}
@media (hover: hover) {
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn:hover:not([style*="background: var(--a1)"]):not([style*="background: var(--cta)"]) {
    background-color: color-mix(in oklab, var(--onCanvas) 8%, transparent) !important;
    color: var(--onCanvas) !important;
  }
}

/* ·· 5b. THE MOBILE LOCKUP — the masthead on rail-less widths ···············
   .fl-mlock rides inside .fl-scroll, so the panel flip has already given it
   the bed inks; what it still carries is the bundle's cream sheet pill. On the
   bed the mark needs no pill at all — the wordmark stands on the bed the same
   way it does on the rail. (Container-scoped to .fl-mlock; the mark's SVG is
   D's and is not touched here.) */
.fl-mlock { margin: 2px 0 var(--g-s5) !important; }
.fl-mlock .fl-lockup-card {
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  /* the mark reverses onto the bed, exactly as it does on the rail */
  --logo: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
  color: var(--onCanvas) !important;
}
.fl-mlock .fl-mlock__btn { min-height: 44px; }

/* ·· 5c. THE ABOUT MASTHEAD — the third place the mark stands on the bed ····
   parlor reverses the mark for the rail and the bar; C reverses it for the home
   hero. The About page's own masthead is a fourth lockup, in its own container,
   and it was still rendering --logo terracotta on green (3.3:1 — reported by
   the lead). Same reverse-mark tokens as the rail, container-scoped so it can
   never reach a mark that is sitting on stock. */
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-mlock .fl-lockup-card {
  color: var(--onCanvas) !important;
  --logo: var(--onCanvas);
  --eye: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
  text-shadow: none !important;
}
/* the drawn ring is a stroke attribute, so it needs the reverse in its own
   right — the same line parlor already runs for the rail */
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo [stroke="var(--logo)"],
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-logo [stroke="var(--logo)"] {
  stroke: var(--onCanvas) !important;
}


/* ── B6 · THE UTILITY TRAY (§5.3) ──────────────────────────────────────────
   Four rows and nothing between them but space: a half-length sprig rule, the
   ⌘K wire keycap, the six palette dots, the language codes.

   THE MEASURED CORRECTION, restated because it will look wrong to anyone
   holding the comp: the comp sets this text at #B6B79A (= --onCanvasMuted),
   which measures 2.55–3.4:1 on the rail ground. At 11–13px that is text, and
   text needs 4.5. --onCanvasBody is the correct ink and looks all but
   identical. Do NOT restore the comp value.                                  */
.fl-root .fl-side-util {
  /* :not(.fl-home-util) is LOAD-BEARING. The floating variant is
     `position: fixed` from a 0,1,0 rule inside @media (min-width: 1024px);
     a bare `position: relative` here (0,2,0) out-ranks it, and the tray falls
     back into the flex row as a full-height 186px column that pushes the panel
     off the screen. Seen, and fixed, in preview. */
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --rule: var(--ruleG);
  background-color: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: var(--g-s4) var(--g-s2) var(--g-s5) !important;
  margin-top: var(--g-s4) !important;
  /* the long half of the tray's sprig rule; the sprig itself is the ::before
     below, and the 62px gap on the left is the room it sits in */
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: calc(100% - 62px) 1px !important;
  background-position: right top !important;
  background-repeat: no-repeat !important;
}
.fl-root .fl-side-util:not(.fl-home-util) { position: relative; }
/* The sprig glyph carries its own two flanking rules at 22/24 of its height,
   so the box is placed to land those exactly on the container's top edge —
   `top: -22px` on a 24px box puts y=22 at y=0. Get this wrong and the tray
   shows two hairlines at two heights. */
.fl-root .fl-side-util::before {
  content: "";
  position: absolute;
  left: 0; top: -22px;
  width: 58px; height: 24px;
  pointer-events: none;
  background-color: var(--a1OnCanvas);
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain;         mask-size: contain;
  -webkit-mask-repeat: no-repeat;     mask-repeat: no-repeat;
  -webkit-mask-position: left top;    mask-position: left top;
}
/* ⌘K — a wire keycap, 34px, one hairline ring, no fill. It is NOT a small-caps
   label, so fragment A's role rule is turned back off here. */
.fl-root .fl-side-util .v2-pk-hint {
  display: inline-flex !important;
  align-items: center;
  gap: 7px;
  min-height: 34px;
  padding: 0 10px !important;
  margin: var(--g-s2) 0 var(--g-s3) !important;
  border-radius: var(--p-rad) !important;
  background: transparent !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--onCanvas) 22%, transparent) !important;
  color: var(--onCanvasBody) !important;   /* NOT --onCanvasMuted: 13px is text */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 92, "wght" 500 !important;
  font-weight: 500 !important;
  font-size: var(--g-t2) !important;       /* 13px */
  line-height: 1 !important;
  letter-spacing: .04em !important;
  text-transform: none !important;
  white-space: nowrap;
}
/* parlor gave the hint the broken-rule hairline; the tray has its own now */
.fl-root .fl-side-util .v2-pk-hint::after { content: none !important; }
.fl-root .fl-side-util .v2-pk-hint__k {
  color: var(--a1OnCanvas) !important;
  background: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 12px !important;
  letter-spacing: .02em !important;
}
/* the six dots: 15px, the current one ringed in cream */
.fl-root .fl-side-util [title] {
  width: 15px !important;
  height: 15px !important;
  min-width: 0;
  min-height: 0;
  border-radius: 50% !important;
  box-shadow: none !important;
}
.fl-root .fl-side-util [style*="outline: 2.5px solid var(--onCanvas)"] {
  outline: 0 !important;
  box-shadow: 0 0 0 2px color-mix(in oklab, var(--onCanvas) 50%, transparent) !important;
}
/* the language row, on the bed. The five codes must stay on ONE line inside a
   212px rail (188px of usable width), so the padding is tightened rather than
   the type: at the app's own padding they wrapped to two rows. */
.fl-root .fl-side-util .fl-side-lang {
  padding: var(--g-s2) 0 0 !important;
  gap: 0 !important;
  flex-wrap: nowrap !important;
}
.fl-root .fl-side-util .fl-side-lang .fl-btn {
  color: var(--onCanvasBody) !important;   /* 8.02–10.60, comfortably AA */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 600 !important;
  font-weight: 600 !important;
  font-size: var(--g-t1) !important;
  letter-spacing: .12em !important;
  min-height: 44px !important;
  min-width: 0;
  flex: 1 1 0;
  padding: 0 2px !important;
  background: none !important;
  background-image: none !important;       /* kill the ghost-hover underline */
  box-shadow: none !important;
}
/* the CURRENT language must be the BRIGHTEST thing in the row (owner rule).
   §5.3 names --a1OnCanvas, but in three of the six palettes that accent is
   DARKER than --onCanvasBody, so the chosen code read quieter than the rest —
   the opposite of the intent. The ink is --onCanvas (the brightest member of
   the family, so the invariant holds) and the accent keeps the underline. */
.fl-root .fl-side-util .fl-side-lang .fl-btn[style*="text-decoration: underline"] {
  color: var(--onCanvas) !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  text-decoration-color: var(--a1OnCanvas) !important;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 3px;
}
/* THE FLOATING TRAY (screens with no rail): without a rail behind it the tray
   would be a hairline in mid-air, so it keeps a small plate — the same
   material, a smaller piece of furniture. The sprig belongs to the rail's
   division, so it steps aside here. */
.fl-root .fl-side-util.fl-home-util {
  padding: var(--g-s3) var(--g-s2) var(--g-s2) !important;
  border-radius: var(--p-rad) !important;
  background-color: color-mix(in oklab, var(--g-bed-deep) 88%, transparent) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--onCanvas) 12%, transparent),
              0 20px 38px -24px rgba(0, 0, 0, .95) !important;
  backdrop-filter: blur(12px) saturate(1.06);
  -webkit-backdrop-filter: blur(12px) saturate(1.06);
}
.fl-root .fl-side-util.fl-home-util::before { content: none !important; }


/* ── B7 · THE FOOTER CARD AND THE LANGUAGE ROW (§5.12) ─────────────────────
   .fl-foot-canvas is a LAW (memory canvas-footer-carded): footer text on the
   bed sits in a glowing sheet card. Recoloured ink alone was rejected once —
   do not re-litigate it. The card gets the stock recipe, a torn top edge (B3
   above already lists it) and the contact shadow that carries --boxGlow.     */
.fl-foot-canvas {
  background-color: var(--sheet) !important;
  /* the fibre is the TOP layer and takes the multiply itself; with the opaque
     paper gradient on top it would be invisible (builder A, verified) */
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  padding: var(--g-s5) var(--g-s5) var(--g-s4) !important;
  /* review 1 (I1 #12a): --p-shadow's inset hairline ran STRAIGHT ACROSS the
     edge the tear opens. --g-shadow-torn draws three sides only; the pale
     fibre line rides just under the deepest bite. */
  box-shadow: var(--g-shadow-torn) !important;
}
/* THE SAME LAW, EXTENDED — and this is a Garden-only consequence. Screens that
   used to have a paper panel under them render the PLAIN footer (.fl-about-foot)
   rather than the carded one: on Parlor that footer sat on paper, so no card was
   needed. With the panel gone it is bare ink on the bed, which is exactly what
   the owner rejected. It becomes the same object as .fl-foot-canvas. Its inks
   flip back to paper through list C (B0), which .fl-about-foot now joins.
   Unprefixed on purpose: on Looponomics it is a descendant of the column, not
   a child of .fl-scroll, and it appears on screens with no scroller at all. */
.fl-about-foot {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border-top: 0 !important;
  border-radius: var(--p-rad) !important;
  width: 100%;
  max-width: 640px;
  margin: var(--g-s7) auto var(--g-s2) !important;
  padding: var(--g-s4) var(--g-s5) var(--g-s3) !important;
  box-shadow: var(--p-shadow) !important;
}
/* THE LANGUAGE ROW rides INSIDE that card — it is paper, not bed, so its inks
   are paper inks. The owner reported "can't read language selection text on
   about page" once; both language rows are checked separately by the review
   harness and they take DIFFERENT inks. Not a duplication. */
.fl-foot-canvas .fl-foot-lang,
.fl-foot-lang { margin: 0 0 2px !important; }
.fl-foot-lang .sc-interp,
.fl-foot-lang button,
.fl-foot-lang .fl-btn {
  color: var(--body) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 600 !important;
  font-weight: 600 !important;
  font-size: var(--g-t1) !important;
  letter-spacing: .15em !important;
  background-image: none !important;
}
.fl-foot-lang .fl-btn[style*="text-decoration: underline"],
.fl-foot-lang .fl-btn[style*="text-decoration:underline"] {
  color: var(--ink) !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  text-underline-offset: 3px;
}
/* the palette dots inside the footer card sit on paper: a paper hairline */
.fl-foot-canvas .fl-foot-pal [title] {
  border-radius: 50% !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent) !important;
}


/* ── B8 · THE STATIC PAGES (§5.13) — privacy · terms · text messaging ──────
   They link the design layer but have no .fl-root, so the room has to be
   painted on the body itself. The .embed exclusion keeps survey.php's embedded
   mode transparent.                                                          */
body:not(:has(.fl-root)):not(.embed) {
  background-color: var(--canvas) !important;
  background-image:
    var(--p-grain),
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
  background-size: 128px 128px, auto, auto, var(--g-bed-repeat-size), auto, auto !important;
  background-repeat: repeat, no-repeat, no-repeat, repeat, repeat, no-repeat !important;
  background-attachment: scroll, fixed, fixed, scroll, scroll, fixed !important;
  background-blend-mode: soft-light, normal, normal, normal, normal, normal !important;
}
/* the wordmark on the bed: no capsule, no border, no backdrop-filter */
body:not(:has(.fl-root)):has(.brand > a) .brand a {
  background: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  padding-inline: 0 !important;
  padding-bottom: 8px !important;
  color: var(--onCanvas) !important;
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 52, "WONK" 1 !important;
  letter-spacing: -.028em !important;
  --logo: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
  text-shadow: none;
}
/* the sheet: stock, 3px, torn along its top edge (the tear is in B3).
   parlor scoped this to `:has(.brand > a)` so survey.php's card was left
   alone; under the Garden that would leave one 22px lamplit Parlor card on an
   otherwise Garden site, so the scope widens to every standalone page and
   `:not(.embed)` carries the exclusion instead. */
body:not(:has(.fl-root)):not(.embed) .wrap > .card {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  /* review 1 (I1 #12a): --p-shadow's inset hairline ran STRAIGHT ACROSS the
     edge the tear opens. --g-shadow-torn draws three sides only; the pale
     fibre line rides just under the deepest bite. */
  box-shadow: var(--g-shadow-torn) !important;
}
/* survey.php's own "Powered by" plate is a small piece of the same stock */
body:not(:has(.fl-root)):not(.embed) .by {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  box-shadow: var(--p-shadow) !important;
  color: var(--body) !important;           /* --muted measures 4.39 on this stock */
}
/* the standalone pages' own footer card (palette + language rows) is stock */
body:not(:has(.fl-root)) .fl-static-foot {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  box-shadow: var(--p-shadow) !important;
}
body:not(:has(.fl-root)) .fl-static-foot [title] { border-radius: 50% !important; }
/* the foot pill sits ON the bed: bed hairline, bed ink. --onCanvasBody, not
   --onCanvasMuted — it is 11–12px text. */
body:not(:has(.fl-root)):has(.brand > a) .pagefoot .pill {
  background: color-mix(in oklab, var(--onCanvas) 7%, transparent) !important;
  border: 1px solid color-mix(in oklab, var(--onCanvas) 16%, transparent) !important;
  border-radius: var(--g-rad-sm) !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  color: var(--onCanvasBody) !important;
}
body:not(:has(.fl-root)):has(.brand > a) .pagefoot .pill a { color: var(--onCanvasBody) !important; }
/* the page's own headings are display; the prose is on stock and keeps the
   paper inks the page already declares */
body:not(:has(.fl-root)) .wrap .card h1,
body:not(:has(.fl-root)) .wrap .card h2 {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  letter-spacing: -.018em !important;
}


/* ── B9 · R1 · THE ACCOUNT / PROFILE HEADER BAND ───────────────────────────
   The bundle paints it `background-color: var(--brand, …)` and sets every line
   on it in --ctaText; parlor never defined --brand and three palettes run
   --ctaText dark, so the handle and plan line were near-black on a dark slab.
   Under the Garden the band is the bed's own deep tone, and the ink on it is
   the ink the rail uses. Custom-property overrides only — the inline var()s
   resolve straight to these. */
.fl-root [style*="background-color: var(--brand"] {
  --brand: var(--g-bed-deep);
  --ctaText: var(--onCanvas);
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --rule: var(--ruleG);
  background-image:
    radial-gradient(120% 140% at 82% -14%,
      color-mix(in oklab, var(--a2) 18%, transparent) 0%, transparent 62%),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--g-bed-deep) 100%) !important;
  background-size: auto, auto, auto !important;
  background-repeat: no-repeat, repeat, no-repeat !important;
  background-blend-mode: normal, normal, normal !important;
  border-radius: var(--p-rad) !important;
}


/* ── B10 · SCROLLBARS ──────────────────────────────────────────────────────
   The scroller now runs over the bed, so the thumb takes the bed's own warm
   ink rather than the paper rule. 3px corners, like everything else. */
* {
  scrollbar-width: thin;
  scrollbar-color: color-mix(in oklab, var(--a1OnCanvas) 42%, transparent) transparent;
}
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb {
  background: color-mix(in oklab, var(--a1OnCanvas) 42%, transparent);
  border-radius: var(--p-rad);
  border: 3px solid transparent;
  background-clip: content-box;
}


/* ── B11 · COARSE POINTERS AND PHONE TARGETS ───────────────────────────────
   44px minimum on every tray control that carries text; the palette dots stay
   round (parlor's 26px min-width on a 15px dot would draw an ellipse), so they
   grow to a 22px circle instead — they carry no text, and the review harness
   measures text-bearing targets. */
@media (pointer: coarse) {
  /* a finger needs 44 × 44, and five 44px codes do not fit a 188px rail — so
     on a touch pointer the row is allowed to wrap rather than the target to
     shrink. Two rows on a tablet is the correct trade. */
  .fl-root .fl-side-util .fl-side-lang { flex-wrap: wrap !important; }
  .fl-root .fl-side-util .fl-side-lang .fl-btn {
    min-height: 44px !important; min-width: 44px !important; flex: 0 0 auto;
  }
  .fl-root .fl-side-util .v2-pk-hint { min-height: 44px !important; }
  .fl-root .fl-side-util [title] {
    width: 22px !important; height: 22px !important;
    min-width: 22px !important; min-height: 22px !important;
  }
}
@media (max-width: 760px) {
  /* guarantee zero horizontal scroll on a phone. `clip`, never `hidden`: it
     must not become a scroll container or position:sticky breaks. */
  .fl-root { overflow-x: clip; }
  body:not(:has(.fl-root)):not(.embed) { overflow-x: clip; }
}


/* ── B12 · REDUCED MOTION — B's own selectors only ─────────────────────────
   Reduced motion means no movement, not no feedback: every end state above is
   still reachable, only the travel is removed. */
@media (prefers-reduced-motion: reduce) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::after,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav svg,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn,
  .fl-root .fl-side-util .v2-pk-hint,
  .fl-root .fl-side-util .fl-side-lang .fl-btn {
    transition: none !important;
    animation: none !important;
  }
  .fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"][style*="background: var(--sheet)"]:not(textarea) {
    animation: none !important;
    opacity: 1 !important;
  }
}


/* ── B13 · 480px — B's own selectors only ──────────────────────────────────
   At 390px a 6px bite is a third of a tap row, so the tear runs shallower;
   the footer card hugs its three short rows; the bar keeps its 54px stack. */
@media (max-width: 480px) {
  .g-torn::before,
  .fl-foot-canvas::before,
  body:not(:has(.fl-root)):not(.embed) .wrap > .card::before {
    --bite-a: var(--g-bite-a);
    --bite-b: radial-gradient(circle at 50% 0%, #000 2.0px, transparent 2.5px);
    --bite-c: radial-gradient(circle at 50% 0%, #000 1.1px, transparent 1.5px);
  }
  .fl-foot-canvas { padding: var(--g-s4) var(--g-s4) var(--g-s3) !important; }
  .fl-mlock { margin: 2px 0 var(--g-s4) !important; }
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
    font-size: 9.5px !important;
    letter-spacing: .1em !important;
    padding: 7px 2px 8px !important;
  }
  body:not(:has(.fl-root)):has(.brand > a) .brand a { font-size: 28px !important; }
  body:not(:has(.fl-root)):has(.brand > a) .pagefoot .pill { border-radius: var(--g-rad-sm) !important; }
}



/* ═══ GARDEN FRAGMENT frag-c-controls.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   FRAGMENT C — the hero, the controls, the fields, the chips, the modals,
   the toasts and the ask flow.                       (spec §5.4, §5.7–§5.11,
   §6.3–§6.4, §7.4)

   WHAT THIS FILE OWNS
     · the hero block on the bed: wordmark, standfirst, rotating line, the
       engraved plant, the ask tray, the knob, "How it works"
     · every button variant (the one fragment allowed a bare `button.fl-btn`)
     · every input / textarea / select, their placeholders and the caret
     · chips, stamps, counters
     · the sheet, the scrim, the auth modal's brand panel, the onboarding card
     · the toast slip
     · the ask-flow ("wizard") column: the sentence control, the topic line,
       the packet, the suggestion index, the category chips

   WHAT IT DOES NOT OWN
     the room, the panel, the rail, the bar, the tray, the footer, the static
     pages (fragment B) · the loop column `.fl-scroll:has(.v2-sent)`, cards,
     demo cards, the survey card, faces and the About page (fragment D).
     Nothing here paints, masks, transforms or animates the working panel.

   TWO CASCADE FACTS THIS FILE IS BUILT AROUND
     1. parlor.css's field rules carry a five-`:not()` chain — (0,5,1) — and
        its background-image rule adds `:not(.fl-pencil-in)` for (0,6,1). Any
        rule here that must beat them repeats the chain; the hero field and the
        ask-flow rules therefore look heavier than they read.
     2. parlor's ask-flow anchor is `:has(#fl-topic-main)`, which is ID-level
        (1,1,0). Every override of it below carries the same anchor verbatim.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── C0 · LOCAL MATERIAL ────────────────────────────────────────────────────
   One mask token, declared on the only element that consumes it (the hero
   block) so it cannot collide with fragment A's shared token block. It is the
   comp's soil + stem + three leaves + bud, view-box 0 0 150 236, strokes and
   fills flattened to explicit black so the mask carries real alpha. */


/* ═══ C1 · THE HERO ═════════════════════════════════════════════════════════
   The hero no longer lies on a lit sheet: it lies on the bed. Everything
   parlor painted for the sheet — the masthead hairline, the diamond lozenge,
   the two letterpress plates under the wordmark, the cast shadow, the centred
   lockup — is retired here. (The lamp pool itself is declared on the PANEL
   selector, which belongs to fragment B; nothing in this file touches it.) */

/* the home column: the comp's 1120px measure */
.fl-scroll:has(> [style*="padding: 24px 0px 8px"]) {
  padding: clamp(28px, 4vw, 46px) clamp(18px, 4vw, 56px) 40px !important;
  max-width: 1120px !important;
}

/* the hero block itself. `overflow-x: clip` is one axis only — never a scroll
   container, and never a containing block: the onboarding sheet and its scrim
   are rendered as children of this element and must stay viewport-fixed. */
.fl-scroll > [style*="padding: 24px 0px 8px"] {
  --g-plant: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='150' height='236' view%42ox='0 0 150 236'%3E%3Cg fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round'%3E%3Cg stroke-width='1.5' stroke-opacity='.6'%3E%3Cpath d='M18 228C40 224 62 223 76 223s34 1 56 5'%2F%3E%3Cpath d='M26 233l5-5M38 235l5-5M50 233l5-5M62 235l5-5M74 234l5-5M86 235l5-5M98 234l5-5M110 236l5-5M122 235l5-5M32 230l4-4M56 230l4-4M80 230l4-4M104 231l4-4' stroke-width='1.1'%2F%3E%3C%2Fg%3E%3Cpath d='M75 228C75 202 71 180 67 158 60 128 57 100 62 70 65 51 70 36 78 22' stroke-width='2.6'%2F%3E%3C%2Fg%3E%3Cg fill='%23000'%3E%3Cpath d='M78 22c-6-3-8-9-6-16 6 2 8 8 6 16Z'%2F%3E%3Cpath d='M78 22c6-3 8-9 6-16-6 2-8 8-6 16Z'%2F%3E%3Cg transform='translate(69,168) rotate(18) scale(2.15)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z'%2F%3E%3C%2Fg%3E%3Cg transform='translate(62,116) scale(-2.3,2.3) rotate(6)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z'%2F%3E%3C%2Fg%3E%3Cg transform='translate(64,70) rotate(-4) scale(2.05)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z'%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  position: relative;
  padding: clamp(40px, 7vw, 96px) 0 6px !important;
  overflow-x: clip;
  align-items: flex-start !important;
  text-align: left !important;
}

/* THE PLANT. It is a pseudo-element on purpose: a pseudo has no children, so
   its mask and its sway transform can never trap the fixed overlays that the
   app renders inside this block. */
.fl-scroll > [style*="padding: 24px 0px 8px"]::after {
  content: "";
  position: absolute;
  right: clamp(-30px, 2vw, 52px);
  top: 140px;
  width: 250px;
  height: 393px;
  pointer-events: none;
  z-index: 0;
  background-color: color-mix(in oklab, var(--onCanvas) 62%, transparent);
  -webkit-mask-image: var(--g-plant);
          mask-image: var(--g-plant);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center bottom;
          mask-position: center bottom;
  transform-origin: 50% 100%;
}
@media (max-width: 900px) {
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after { display: none; }
}

/* every real child sits above the plant. The list is explicit rather than
   `> *`: a blanket rule would hand `position: relative` to `.ui-sheet` and
   `.ui-sheet-scrim`, which are `position: fixed` and must stay that way. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-copy,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-greet,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-ask,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-quick,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-shead { position: relative; z-index: 1; }

/* ── the wordmark (§4.6): set, not decorated ───────────────────────────────
   Specificity note: parlor repaints `.fl-hero-logo` to `--a1Text` for ember
   and midnight at (0,2,0)!important — the hero container prefix takes this
   rule to (0,3,0) so the mark stays cream on the bed in all six palettes. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 52, "WONK" 1 !important;
  font-size: clamp(35px, 6.6vw, var(--g-t9)) !important;
  line-height: 1 !important;
  letter-spacing: -.028em !important;
  color: var(--onCanvas) !important;
  text-align: left !important;
  max-width: 100%;
  margin-bottom: var(--g-s3);
  text-shadow: none !important;        /* the misregistered second plate goes */
}
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo::after { content: none !important; }
/* owner directive, carried verbatim: perfect round eyes, sharp features */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo svg { filter: none !important; }

/* ── the standfirst: the reading voice, on the bed ─────────────────────────
   Face, weight and size are fragment A's (§4.4). What is set here is the ink
   and the measure — parlor put both on the sheet. */
.fl-hero-copy {
  max-width: min(780px, 100%) !important;
  padding: 0 !important;
  margin-top: var(--g-s4) !important;
  text-align: left !important;
}
.fl-hero-copy::before { content: none !important; }   /* the centred hairline */
.fl-hero-copy::after  { content: none !important; }   /* and its opening rule */
.fl-hero-copy > [style*="font-family: Fraunces"]:first-child {
  color: var(--onCanvas) !important;
  line-height: 1.44 !important;
  text-align: left !important;
  text-shadow: none !important;
  text-wrap: pretty;
  max-width: 780px;
  margin: 0 !important;
}

/* ── the rotating line, led by a seed mark ─────────────────────────────────
   The app's own dissolve (opacity + 1.5px blur, owner-tuned) is untouched;
   `min-height` holds the box so the type never moves between lines. */
.fl-hero-line {
  /* owner 2026-08-18: "remove bullet points from rotating slogans… increase
     font size" — no seed mark, and the line is a full size larger. The box
     still reserves two rows (task 12: a slogan that wraps must never move the
     hero) — the longest translated slogans do wrap on phones. */
  font-size: clamp(17px, 1.9vw, 24px) !important;
  line-height: 1.4 !important;
  letter-spacing: .002em !important;
  text-align: left !important;
  text-wrap: pretty;
  margin-top: var(--g-s5) !important;
  min-height: 2.85em !important;
  padding: 0 !important;
  position: relative;
  text-shadow: none !important;
}
.fl-hero-line::before { content: none !important; }   /* the seed mark, retired */
.fl-hero-line::after { content: none !important; }    /* parlor's lozenge */

/* the signed-in greeting sits in the same column, on the bed */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-greet { text-align: left !important; }
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-greet h1 { color: var(--onCanvas) !important; }
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-greet .v2-sub { color: var(--onCanvasBody) !important; }

/* ── THE ASK TRAY — a rectangular tray, not a pill ─────────────────────────
   parlor forces 999px in three places (`.v2-ask`, `.v2-ask input`,
   `.v2-ask[data-sec="hero-ask"]`). All three are overridden; the outer and the
   inner must agree or the field reads as a rectangle inside a pill. */
.fl-root .v2-ask,
.fl-root .v2-ask[data-sec="hero-ask"] {
  border-radius: var(--p-rad) !important;
  background-image: none !important;
  box-shadow: none !important;
}
.fl-root .v2-ask[data-sec="hero-ask"] {
  width: min(764px, 100%) !important;
  margin-top: var(--g-s5) !important;
  isolation: isolate;
}
.fl-root .v2-ask[data-sec="hero-ask"]::before { content: none !important; }  /* the lamplight pool */
.fl-root .v2-ask[data-sec="hero-ask"] .v2-lead { display: none !important; } /* the pencil */

/* the field. The `:not()` chain is repeated so this out-ranks parlor's own
   (0,6,1) field rules — see the header note. */
.fl-root .v2-ask[data-sec="hero-ask"] input:not([type="checkbox"]):not(.v2-lknm):not([type="radio"]):not([type="range"]):not([type="color"]) {
  border-radius: var(--p-rad) !important;
  min-height: 80px !important;
  padding: 20px 76px 20px 26px !important;
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: normal !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-size: var(--g-t5) !important;
  line-height: 1.3 !important;
  letter-spacing: .004em !important;
  color: var(--ink) !important;
  border-color: transparent !important;
  background-color: var(--sheet) !important;
  background-image:
    linear-gradient(160deg,
      color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix)),
      color-mix(in oklab, var(--sheet) 94%, var(--p-shade))),
    var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  box-shadow:
    var(--g-deboss),
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 24%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition: box-shadow var(--g-t-hover) var(--g-e-out) !important;
}
.fl-root .v2-ask[data-sec="hero-ask"] input::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-size: var(--g-t5) !important;
  color: color-mix(in oklab, var(--muted) 88%, var(--ink)) !important;
  opacity: 1 !important;
}
.fl-root .v2-ask[data-sec="hero-ask"] input:focus {
  box-shadow:
    var(--g-deboss),
    inset 0 0 0 2px var(--a1Text),
    0 0 0 3px color-mix(in oklab, var(--a1OnCanvas) 60%, transparent),
    0 0 0 6px color-mix(in oklab, var(--a1) 18%, transparent) !important;
}

/* ── THE KNOB — the one surviving circle. A seed going in. ─────────────────
   No text ever sits on it: it carries a 23px arrow glyph, so the highlight
   stop is allowed below 4.5. Put a character in here and the highlight must
   be pulled back to `color-mix(in oklab, var(--cta) 88%, white)`.

   REVIEW 1 (inspector 1 #9, inspector 2 #1 — BLOCK): the specular radial and
   the 3px plinth are both gone. Parlor keeps its brass sphere at
   `.v2-ask[data-sec="hero-ask"] .v2-go` (0,3,0), which out-ranked the (0,2,0)
   rule below, so the hero rule restates the face at (0,4,0). ONE flat
   vermilion disc, ONE contact shadow — §1.2 printed ink, no sheen. */
.fl-root .v2-go,
.fl-root [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  border-radius: 50% !important;
  background-color: var(--cta) !important;
  background-image: none !important;
  color: var(--ctaText) !important;
  box-shadow: 0 8px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent) !important;
}
.fl-root .v2-ask[data-sec="hero-ask"] .v2-go,
.fl-root .v2-ask .v2-go {
  width: 56px !important;
  height: 56px !important;
  right: 12px !important;
  background-color: var(--cta) !important;
  background-image: none !important;
  box-shadow: 0 8px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent) !important;
  transition: transform var(--g-t-hover) var(--g-e-out), filter var(--g-t-hover) var(--g-e-out) !important;
}

/* ── the row under the tray: "How it works" is the outlined control on the
   bed, not a paper chip ───────────────────────────────────────────────────── */
.fl-root .v2-quick {
  justify-content: flex-start !important;
  gap: var(--g-s3) !important;
  margin-top: var(--g-s4) !important;
}
.fl-root .v2-quick .ui-chip {
  min-height: 44px !important;
  padding: 0 18px !important;
  border-radius: var(--p-rad) !important;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  border-color: transparent !important;
  color: var(--onCanvas) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
  text-transform: none !important;
  white-space: nowrap;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 38%, transparent) !important;
}
.fl-root .v2-quick .ui-chip::before { content: none !important; }   /* no punched hole on the bed */
@media (hover: hover) {
  .fl-root .v2-quick .ui-chip:hover {
    color: var(--onCanvas) !important;
    background-color: color-mix(in oklab, var(--onCanvas) 9%, transparent) !important;
    box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 58%, transparent) !important;
  }
}

/* the home section break (§5.5): the hairline stops for one engraved sprig */
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"] {
  position: relative;
  margin-top: clamp(44px, 5.4vw, 76px) !important;
  padding-top: clamp(40px, 5vw, 64px) !important;
  border-top-color: transparent !important;
  background-image:
    linear-gradient(90deg, var(--ruleG), var(--ruleG)),
    linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: calc(50% - 34px) 1px, calc(50% - 34px) 1px !important;
  background-position: left top, right top !important;
  background-repeat: no-repeat, no-repeat !important;
}
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"]::before {
  content: "";
  position: absolute;
  left: 50%;
  top: -12px;
  width: 58px;
  height: 24px;
  margin: 0 0 0 -29px;
  transform: none;
  background: var(--a1OnCanvas);
  box-shadow: none;
  -webkit-mask-image: var(--g-sprig);
          mask-image: var(--g-sprig);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  pointer-events: none;
}
/* the section head runs flush left; the two flanking hairlines are deleted —
   the sprig rule above already does that job */
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::before,
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::after { content: none !important; }
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] h2 {
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: clamp(24px, 3.4vw, var(--g-t7)) !important;
  line-height: 1 !important;
  letter-spacing: -.022em !important;
  color: var(--onCanvas) !important;
  text-shadow: none !important;
}


/* ═══ C2 · BUTTONS (§5.7) ═══════════════════════════════════════════════════
   Flat printed ink. 3px corners, 44px, one hairline ring or one flat fill.
   The plinth, the sheen sweep and the travel-into-plinth are all deleted.
   This is the one fragment allowed a bare `button.fl-btn` rule (§7.6.2);
   B and D refine buttons inside their own containers. */

.fl-root button.fl-btn {
  border-radius: var(--p-rad) !important;
  transition:
    background-color var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out),
    filter var(--g-t-hover) var(--g-e-out),
    transform var(--g-t-hover) var(--g-e-out) !important;
}
/* circles the app sizes itself (the palette dots) keep their geometry */
.fl-root button.fl-btn[style*="border-radius: 50%"] { border-radius: 50% !important; }
/* 44px on anything the app has NOT deliberately sized — the same guard parlor
   uses, so the 20px palette swatches and the 32px row actions survive. The two
   language rows are excluded: they are fragment B's, they are laid out as a
   run of five codes, and a 44px floor rebuilds that row. `min-height` is left
   un-`!important` so B and D can still size their own chrome. */
.fl-root button.fl-btn:not([style*="width:"]):not([style*="height:"]):not(.fl-foot-lang *):not(.fl-side-lang *) { min-height: 44px; }

/* ── PRIMARY — flat printed vermilion, no sheen, no plinth ─────────────── */
.fl-root button.fl-btn[style*="background: var(--a1)"],
.fl-root button.fl-btn[style*="background: var(--cta)"],
.fl-root button.fl-btn[style*="background:var(--a1)"],
.fl-root button.fl-primary {
  background-color: var(--cta) !important;
  background-image: linear-gradient(174deg,
    var(--g-face-hi) 0%, var(--cta) 58%, var(--g-face-lo) 100%) !important;
  background-size: 100% 100% !important;
  background-position: 0 0 !important;
  background-repeat: no-repeat !important;
  color: var(--ctaText) !important;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
  gap: 9px;
  white-space: nowrap;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
    0 8px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-root button.fl-btn[style*="background: var(--a1)"] svg,
.fl-root button.fl-btn[style*="background: var(--cta)"] svg,
.fl-root button.fl-primary svg { color: var(--ctaText) !important; }

/* ── SECONDARY — a key cut from the same stock: a ring, no fill ────────── */
.fl-root button.fl-btn[style*="background: var(--sheet)"],
.fl-root button.fl-btn[style*="background: var(--tint1)"],
.fl-root button.fl-btn[style*="background: var(--tint2)"] {
  background-color: color-mix(in oklab, var(--ink) 2%, transparent) !important;
  background-image: none !important;
  color: var(--ink) !important;
  border-color: transparent !important;
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
  gap: 9px;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 34%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* the same object standing on the bed instead of on stock */
.fl-scroll > [style*="padding: 24px 0px 8px"] button.fl-btn[style*="background: var(--sheet)"] {
  color: var(--onCanvas) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 38%, transparent) !important;
}

/* ── GHOST — no ground at all; parlor's drawn-in hairline is deleted ───── */
.fl-root button.fl-btn[style*="background: none"],
.fl-root button.fl-btn[style*="background: transparent"] {
  background: none !important;
  background-image: none !important;
  background-size: auto !important;
  box-shadow: none !important;
  border-radius: var(--p-rad) !important;
  padding-inline: 12px !important;
}
/* …but the five language codes keep their underline: it is the current-language
   marker, not a hover state (parlor R-note, kept verbatim in spirit) */
.fl-root .fl-foot-lang button.fl-btn[style*="text-decoration: underline"],
.fl-root .fl-side-lang button.fl-btn[style*="text-decoration: underline"] { text-decoration: underline !important; }

/* ── DESTRUCTIVE — warm ink, never a red fill at rest ──────────────────── */
.fl-root button.fl-btn[style*="color: var(--warmDeep)"],
.fl-root button.fl-btn[style*="color: var(--warm)"] { color: var(--warmDeep) !important; }
.fl-root button.fl-btn[style*="background: var(--warm)"] {
  background-color: var(--warmDeep) !important;
  background-image: linear-gradient(176deg, var(--warm), var(--warmDeep)) !important;
  color: var(--warmText) !important;
  border-radius: var(--p-rad) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 24%, transparent),
    0 6px 12px -8px color-mix(in oklab, var(--warmDeep) 90%, transparent) !important;
}

/* ── DISABLED — unlit, not faded ───────────────────────────────────────────
   parlor desaturated the lit face, which on the bed left a brown slab with a
   brown label on it. An unlit control has no face at all: a flat wash, an ink
   hairline and the body ink, which follows whichever surface it lands on. */
.fl-root button.fl-btn:disabled,
.fl-root button.fl-btn[style*="opacity: 0.5"] {
  background-color: color-mix(in oklab, var(--ink) 8%, transparent) !important;
  background-image: none !important;
  color: var(--body) !important;
  opacity: 1 !important;
  filter: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent) !important;
  transform: none !important;
}
.fl-root button.fl-btn:disabled svg,
.fl-root button.fl-btn[style*="opacity: 0.5"] svg { color: var(--body) !important; }
.fl-root button.fl-btn:disabled[style*="background: none"],
.fl-root button.fl-btn:disabled[style*="background: transparent"],
.fl-root button.fl-btn[style*="cursor: default"][style*="background: none"],
.fl-root button.fl-btn[style*="cursor: default"][style*="background: transparent"] {
  box-shadow: none !important;
  filter: none;
}

/* ── HOVER / PRESS (§6.3) — pointer only, and a phone is never left hovered */
@media (hover: hover) {
  .fl-root button.fl-btn[style*="background: var(--a1)"]:hover:not(:disabled),
  .fl-root button.fl-btn[style*="background: var(--cta)"]:hover:not(:disabled),
  .fl-root button.fl-primary:hover:not(:disabled) {
    filter: brightness(1.06);
    transform: none;
    background-position: 0 0 !important;
  }
  .fl-root button.fl-btn[style*="background: var(--sheet)"]:hover:not(:disabled),
  .fl-root button.fl-btn[style*="background: var(--tint1)"]:hover:not(:disabled),
  .fl-root button.fl-btn[style*="background: var(--tint2)"]:hover:not(:disabled) {
    transform: none;
    background-color: color-mix(in oklab, var(--ink) 6%, transparent) !important;
    box-shadow:
      inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 55%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
  .fl-root button.fl-btn[style*="background: none"]:hover:not(:disabled),
  .fl-root button.fl-btn[style*="background: transparent"]:hover:not(:disabled) {
    color: var(--a1Text) !important;
    background: var(--tint1) !important;
    background-size: auto !important;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] button.fl-btn[style*="background: none"]:hover:not(:disabled),
  .fl-scroll > [style*="padding: 24px 0px 8px"] button.fl-btn[style*="background: transparent"]:hover:not(:disabled) {
    color: var(--a1OnCanvas) !important;
    background: color-mix(in oklab, var(--a1OnCanvas) 12%, transparent) !important;
  }
  .fl-root .v2-go:hover:not(:disabled) { transform: translateY(calc(-50% - 1px)) !important; }
}
@media (hover: none) {
  /* parlor drew a hairline under every ghost on touch, which underlined all
     five language codes. Nothing is drawn in; only the marker stays. */
  .fl-root button.fl-btn[style*="background: none"],
  .fl-root button.fl-btn[style*="background: transparent"] { background-size: auto !important; }
}
.fl-root button.fl-btn:active:not(:disabled) {
  transform: translateY(1px);
  transition-duration: var(--g-t-press) !important;
}
.fl-root .v2-go:active:not(:disabled),
.fl-root .v2-ask[data-sec="hero-ask"] .v2-go:active:not(:disabled) {
  transform: translateY(calc(-50% + 1px)) !important;
  transition-duration: var(--g-t-press) !important;
  box-shadow: 0 4px 8px -8px color-mix(in oklab, var(--cta) 70%, transparent) !important;
}


/* ═══ C3 · INPUTS, TEXTAREA, SELECT (§5.8) ══════════════════════════════════
   A field is a written label on the packet: a lifted well, a hairline ring,
   3px corners. Never a pill, never a box with a wall. 16px floor everywhere —
   iOS zooms the page on anything smaller. */

.fl-root input:not([type="checkbox"]):not(.v2-lknm):not([type="radio"]):not([type="range"]):not([type="color"]):not(.fl-pencil-in),
.fl-root textarea:not(.fl-pencil-in),
.fl-root select {
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  border-color: transparent !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  background-image: none !important;
  color: var(--ink) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-size: 16px !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 24%, transparent),
    inset 0 2px 5px -3px color-mix(in oklab, var(--ink) 28%, transparent) !important;
  transition: box-shadow var(--g-t-hover) var(--g-e-out) !important;
}
.fl-root input:focus:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
.fl-root textarea:focus,
.fl-root select:focus {
  box-shadow:
    inset 0 0 0 2px var(--a1Text),
    0 0 0 3px color-mix(in oklab, var(--a1OnCanvas) 60%, transparent),
    0 0 0 6px color-mix(in oklab, var(--a1) 18%, transparent) !important;
}
.fl-root input::placeholder,
.fl-root textarea::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  color: color-mix(in oklab, var(--muted) 88%, var(--ink)) !important;
  opacity: 1 !important;
}
.fl-root input, .fl-root textarea { caret-color: var(--a1Text); }
::selection { background: color-mix(in oklab, var(--a1) 28%, var(--sheet)); color: var(--ink); }

/* the app's own generic field class (auth, profile, invite rows) */
.fl-root .fl-in {
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  padding: 12px 14px !important;
}

/* a WRITTEN field — the topic, once filled — takes the light display cut.
   Ground from `background-color` ONLY: these two carry the app's pencil mark
   as a background-image at a forced 17px size, and a gradient there both
   deletes the mark and tiles itself to 17px. */
.fl-root .fl-blankin,
.fl-root .fl-pencil-in {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  font-size: var(--g-t4) !important;
  border-radius: var(--p-rad) !important;
  border-bottom-color: transparent !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  color: var(--ink) !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 24%, transparent),
    inset 0 -2.5px 0 color-mix(in oklab, var(--a1Text) 62%, transparent) !important;
}
.fl-root .fl-blankin:focus,
.fl-root .fl-pencil-in:focus {
  box-shadow:
    inset 0 0 0 2px var(--a1Text),
    0 0 0 3px color-mix(in oklab, var(--a1OnCanvas) 60%, transparent) !important;
}


/* ═══ C4 · CHIPS, STAMPS, COUNTERS (§5.9) ═══════════════════════════════════
   A chip is a plant tag: a punched hole and a hairline, never a bubble.
   `:not(.fl-lift *)` keeps this off the loop rows — the status pills in that
   column are fragment D's, track and look. */

/* A SWITCH IS NOT A TAG. The last arm caught `[role="switch"]` (the app paints
   it `background: var(--rule)` at 42x24), and the chip's 44px floor + 3px
   corner turned it into a square box with a stranded knob (review 1:
   inspector 1 #6, inspector 3 #6). The exclusion is on that arm ONLY — adding
   it to `.fl-root .ui-chip` would raise this rule to (0,3,0) and steal the
   hero's `.v2-quick .ui-chip` back off C1 (measured: cream on cream). */
.fl-root .ui-chip,
.fl-root [style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:not(button):not(.fl-btn):not(.fl-lift *),
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint1)"]:not(.fl-lift *),
.fl-root [style*="border-radius: 999px"][style*="background: var(--tint2)"]:not(.fl-lift *),
.fl-root [style*="border-radius: 999px"][style*="background: var(--rule)"]:not(.fl-lift *):not([role="switch"]):not([style*="width: 42px"]) {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  min-height: 44px;
  padding: 0 15px 0 12px !important;
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  background-image: none !important;
  color: var(--body) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-size: var(--g-t3) !important;
  font-weight: 500 !important;
  letter-spacing: .004em !important;
  white-space: nowrap;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* ── PILL / STAMP — a struck stamp, not a chip ────────────────────────────
   A 999px element carrying an uppercase transform is a LABEL, not a control:
   `FROM YOUR WORDS`, `READY-MADE LIBRARY`, a sub-category tab. It must not
   take the chip's 44px tap height (measured in preview: a 26px stamp was being
   pushed to 44 inside a card heading) and it must not carry the 42px box-glow,
   which on an object this small reads as a bloom rather than as light under an
   edge. Its ink is left to the app + parlor §12, so `FROM YOUR WORDS` and
   `READY-MADE LIBRARY` keep their separate accents. */
.fl-root [style*="border-radius: 999px"][style*="text-transform: uppercase"]:not(button):not(.fl-btn):not(.fl-lift *) {
  display: inline-flex;
  align-items: center;
  min-height: 0 !important;
  height: auto;
  padding: 6px 10px 5px !important;
  border-radius: var(--g-rad-sm) !important;
  border-color: transparent !important;
  background-image: none !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  line-height: 1 !important;
  letter-spacing: .15em !important;
  white-space: nowrap;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, currentColor 45%, transparent) !important;
}

/* the punched hole */
.fl-root .ui-chip::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  flex: none;
  background: color-mix(in oklab, var(--ink) 30%, transparent);
  box-shadow: 0 0 0 2px color-mix(in oklab, var(--sheet) 90%, white);
}
/* SELECTED */
.fl-root .ui-chip[aria-pressed="true"] {
  background-image: linear-gradient(172deg,
    color-mix(in oklab, var(--a2) 34%, var(--sheet)),
    color-mix(in oklab, var(--a2) 52%, var(--sheet))) !important;
  color: var(--ink) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a2Text) 70%, transparent) !important;
}
.fl-root .ui-chip[aria-pressed="true"]::before { background: var(--a2Text); }
@media (hover: hover) {
  .fl-root .ui-chip:hover {
    color: var(--ink) !important;
    background-color: color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix)) !important;
    box-shadow:
      inset 0 0 0 1px color-mix(in oklab, var(--ink) 42%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}


/* ═══ C5 · FOCUS — the two-tone ring (§6.4) ═════════════════════════════════
   A single ring colour cannot clear 3:1 on both cream stock and a dark bed.
   The ring has two halves; on any ground at least one of them is visible.
   Worst measured cell across every ground × every palette: 5.10. */
.fl-root :where(input, textarea, select, button, a, [tabindex]):focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 5.5px var(--g-ring-dark) !important;
  transition: outline-offset var(--g-t-press) var(--g-e-out);
}
/* The controls above all carry an `!important` box-shadow of their own, which
   out-specifies the `:where()` rule — verified in preview, where a focused
   chip showed the bright half of the ring and nothing else. These restate the
   dark half at each control's own weight so the ring reads as a ring. */
.fl-root .ui-chip:focus-visible,
.fl-root .v2-quick .ui-chip:focus-visible,
.fl-root button.fl-btn:focus-visible,
.fl-root button.fl-primary:focus-visible,
.fl-root .v2-go:focus-visible,
.v2-door .fl-soc:focus-visible,
.v2-door button.fl-primary:focus-visible,
.ui-sheet .ui-btn:focus-visible,
.ui-sheet__actions .ui-btn:focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 5.5px var(--g-ring-dark) !important;
}
/* on a lit face the ring uses that face's own ink, designed against it */
.fl-root [style*="background: var(--a1)"]:focus-visible,
.fl-root [style*="background: var(--cta)"]:focus-visible,
.fl-root button.fl-primary:focus-visible,
.v2-door button.fl-primary:focus-visible { outline-color: var(--ctaText) !important; }
.fl-root :where(button, a):focus-visible:active { outline-offset: 1px !important; }


/* ═══ C6 · MODALS (§5.10) ═══════════════════════════════════════════════════
   The sheet and the scrim are `position: fixed` and are rendered INSIDE the
   working panel and inside the hero block. Neither ancestor may carry filter,
   mask, clip-path, transform, backdrop-filter, will-change or contain —
   including a FINISHED transform animation, which Chrome keeps as an identity
   matrix and which is still a containing block. Nothing in this file gives
   either ancestor one; `animation-fill-mode` here is `backwards`, never both. */

.fl-root .ui-sheet,
.ui-sheet {
  border-radius: var(--p-rad) !important;
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  border-color: transparent !important;
  color: var(--ink);
  /* torn along its top edge, so the object's hairline stops short of the tear
     (review 1, I1 #12a) and the fibre line rides under the deepest bite */
  box-shadow: var(--g-shadow-deep-torn) !important;
}
/* the torn top edge (§3.4): a strip of bed laid over the paper on ::before and
   masked to the bites. The profile is fragment A's --g-bite-a. */
.fl-root .ui-sheet::before,
.ui-sheet::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: 9px;
  z-index: 6;
  pointer-events: none;
  background-color: var(--canvas);
  background-image:
    radial-gradient(120% 70% at 82% -14%, color-mix(in oklab, var(--a2) 16%, transparent) 0%, color-mix(in oklab, var(--a2) 5%, transparent) 40%, transparent 70%),
    radial-gradient(60% 50% at 4% 104%, color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat), var(--g-rib),
    linear-gradient(163deg, var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%),
    var(--p-grain);
  background-size: auto, auto, var(--g-bed-repeat-size), auto, auto, 128px 128px;
  background-repeat: no-repeat, no-repeat, repeat, repeat, no-repeat, repeat;
  background-attachment: fixed;
  background-blend-mode: normal, normal, normal, normal, normal, soft-light;
  --bite-a: var(--g-bite-a);
  --bite-b: var(--g-bite-b);
  --bite-c: var(--g-bite-c);
  -webkit-mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  -webkit-mask-size: var(--g-bite-size);
  -webkit-mask-position: var(--g-bite-pos);
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
          mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
          mask-size: var(--g-bite-size);
          mask-position: var(--g-bite-pos);
          mask-repeat: repeat-x, repeat-x, repeat-x;
}
.fl-root .ui-sheet__grab,
.ui-sheet__grab {
  background: color-mix(in oklab, var(--ink) 22%, transparent) !important;
  border-radius: var(--g-rad-sm) !important;
  margin-top: 6px;
}
.fl-root .ui-sheet-scrim,
.ui-sheet-scrim {
  background: color-mix(in oklab, var(--g-bed-deep) 74%, transparent) !important;
  /* a soft room behind the sheet — 3px, so the room stays recognisable (owner
     2026-08-18 saw the whole screen go blurry: that was the SHEET falling under
     the scrim, fixed in fragment E; the scrim's own blur is meant to be gentle) */
  backdrop-filter: blur(3px) saturate(1.05) !important;
  -webkit-backdrop-filter: blur(3px) saturate(1.05) !important;
}

/* the onboarding card inside the sheet */
.fl-root .v2-ob__kick {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650;
  font-size: var(--g-t1) !important;
  letter-spacing: .155em !important;
  color: var(--a2Text) !important;
}
.fl-root .v2-ob__h {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: var(--g-t6) !important;
  line-height: 1.04 !important;
  letter-spacing: -.02em !important;
  color: var(--ink) !important;
}
.fl-root .v2-ob__p {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-size: var(--g-t3) !important;
  line-height: 1.55 !important;
  color: var(--body) !important;
}
.fl-root .v2-ob__dot { background: color-mix(in oklab, var(--ink) 22%, transparent) !important; }
.fl-root .v2-ob__dot.on { background: var(--a1Text) !important; }

/* the sheet's own action buttons are `.ui-btn`, not `.fl-btn`, and the app
   gives them `border-radius: var(--r-full)`. Scoped to the sheet so the class
   stays available to whoever else uses it. */
.ui-sheet .ui-btn,
.ui-sheet__actions .ui-btn {
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  border-color: transparent !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
  white-space: nowrap;
}
.ui-sheet .ui-btn--primary,
.ui-sheet__actions .ui-btn--primary {
  background-color: var(--cta) !important;
  background-image: linear-gradient(174deg,
    var(--g-face-hi) 0%, var(--cta) 58%, var(--g-face-lo) 100%) !important;
  color: var(--ctaText) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
    0 8px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent) !important;
}
.ui-sheet .ui-btn--secondary,
.ui-sheet__actions .ui-btn--secondary {
  background-color: color-mix(in oklab, var(--ink) 2%, transparent) !important;
  background-image: none !important;
  color: var(--ink) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 34%, transparent) !important;
}

/* ── THE AUTH DOOR ────────────────────────────────────────────────────────
   The sign-in / sign-up modal is rendered OUTSIDE `.fl-root` (verified in
   preview: `.fl-root button.fl-primary` never reached its Continue). Every
   rule in this block is therefore written without the `.fl-root` prefix and
   scoped to the door itself instead. */
.v2-door-ov { background: color-mix(in oklab, var(--g-bed-deep) 74%, transparent) !important; }
.v2-door {
  border-radius: var(--p-rad) !important;
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  box-shadow: var(--g-shadow-deep) !important;
}
.v2-door .fl-soc,
.v2-door .v2-provs .fl-soc {
  border-radius: var(--p-rad) !important;
  min-height: 52px;
  border-color: transparent !important;
  background-color: color-mix(in oklab, var(--ink) 2%, transparent) !important;
  background-image: none !important;
  color: var(--ink) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .008em !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 30%, transparent) !important;
}
@media (hover: hover) {
  .v2-door .fl-soc:hover,
  .v2-door .v2-provs .fl-soc:hover {
    transform: none !important;
    background-color: color-mix(in oklab, var(--ink) 6%, transparent) !important;
    box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 52%, transparent) !important;
  }
}
button.fl-primary,
.v2-door button.fl-primary {
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  background-color: var(--cta) !important;
  background-image: linear-gradient(174deg,
    var(--g-face-hi) 0%, var(--cta) 58%, var(--g-face-lo) 100%) !important;
  color: var(--ctaText) !important;
  border: 0 !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 600;
  font-weight: 600 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
    0 8px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* the `:not()` chain is not decoration: parlor's own 13px field rule measures
   (0,4,2) and a plain `.v2-door .fl-in` (0,2,0) loses to it — measured in the
   preview, where the email field kept its 13px corners while everything else
   in the door had gone to 3px */
.v2-door input:not([type="checkbox"]):not(.v2-lknm):not([type="radio"]):not([type="range"]):not([type="color"]):not(.v2-ask input),
.v2-door .fl-in,
.v2-door textarea,
.v2-door select {
  border-radius: var(--p-rad) !important;
  min-height: 44px;
  border-color: transparent !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  background-image: none !important;
  color: var(--ink) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-size: 16px !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 24%, transparent),
    inset 0 2px 5px -3px color-mix(in oklab, var(--ink) 28%, transparent) !important;
}
.v2-door input::placeholder, .v2-door textarea::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  color: color-mix(in oklab, var(--muted) 88%, var(--ink)) !important;
  opacity: 1 !important;
}
.v2-door > button.fl-btn[style*="border-radius: 50%"] {
  border-radius: 50% !important;
  background: color-mix(in oklab, var(--ink) 8%, transparent) !important;
  color: var(--ink) !important;
  box-shadow: none !important;
}
.v2-door :where(input, textarea, select, button, a, [tabindex]):focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 5.5px var(--g-ring-dark) !important;
}

/* ── the auth modal's brand panel (parlor R0) becomes the bed ─────────────
   The bundle paints it brass and sets every line in --ctaText; in the light
   palettes that is dark ink on mid vermilion (3.0–3.9:1). On the bed the
   rail's own inks apply and the wordmark takes its on-bed reverse. */
.v2-brand[style*="background: linear-gradient(160deg, var(--a1)"] {
  background-color: var(--canvas) !important;
  background-image:
    var(--g-bed-repeat),
    linear-gradient(163deg, var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
  background-size: var(--g-bed-repeat-size), auto !important;
  background-repeat: repeat, no-repeat !important;
}
.v2-brand[style*="background: linear-gradient(160deg, var(--a1)"]::before { opacity: 0 !important; }
.v2-brand [style*="color: var(--ctaText)"],
.v2-brand [style*="color:var(--ctaText)"] { color: var(--onCanvas) !important; }
.v2-brand [style*="color: color-mix(in oklab, var(--ctaText) 78%"] { color: var(--onCanvasBody) !important; }
.v2-brand [style*="background: color-mix(in oklab, var(--ctaText) 22%"] { background: color-mix(in oklab, var(--onCanvas) 22%, transparent) !important; }
.v2-brand svg { color: var(--onCanvas); }
.v2-brand .fl-logo, .v2-brand .fl-hero-logo { color: var(--onCanvas) !important; }
.v2-brand .fl-logo svg, .v2-brand .fl-hero-logo svg { filter: none !important; }


/* ═══ C7 · TOASTS (§5.11) ═══════════════════════════════════════════════════
   A toast is fixed and lands on either the bed or a sheet, so it carries its
   own ground. It is a slip, not a packet: no tear. The bundle ships it as
   `--ctaText` on `--ink`, which measures 1.03:1 on paper-coloured ink. */
[style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"] {
  /* STOPGAP, and reported to the lead: the toast is rendered INSIDE the
     working panel, so THE SURFACE LAW has already flipped its subtree to the
     bed inks — but the slip paints itself in stock, so its text came out cream
     on cream (measured 1.0:1 in preview, harbor). `.ui-sheet`, `.v2-ask` and
     `.fl-sheen` are in list C and restore correctly; the toast is not in that
     list. The proper fix is one more selector in list C (fragment B owns it);
     until then the component restores its own ink family from the S-tokens,
     using exactly the law's own mechanism. */
  --ink: var(--inkS); --body: var(--bodyS); --muted: var(--mutedS);
  --a1Text: var(--a1TextS); --a2Text: var(--a2TextS); --a3Text: var(--a3TextS);
  --rule: var(--ruleS); --tint1: var(--tint1S); --tint2: var(--tint2S);
  min-height: 44px;
  display: flex;
  align-items: center;
  max-width: 420px !important;
  padding: 12px 20px 12px 22px !important;
  border-radius: var(--p-rad) !important;
  background-color: var(--sheet) !important;
  background-image:
    linear-gradient(90deg, var(--a1Text) 0 3px, transparent 3px),
    var(--p-paper-lit),
    var(--g-fibre) !important;
  background-size: 100% 100%, auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, no-repeat, repeat !important;
  background-blend-mode: normal, normal, multiply !important;
  color: var(--ink) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-size: var(--g-t3) !important;
  font-weight: 500 !important;
  letter-spacing: .004em !important;
  box-shadow: var(--g-shadow-deep) !important;
}


/* ═══ C8 · THE ASK FLOW ═════════════════════════════════════════════════════
   parlor set this surface as a printed form and the structure is right; what
   changes is the material. Every rule below carries parlor's own ID-level
   anchor so it wins on order rather than on selector spam. Brass becomes
   printed ink, every radius becomes 3px, and the one control that states the
   product — "I want to [receive|provide] honest feedback about" — takes a
   filled vermilion segment instead of a lamplit tile. */

/* the packet: stock, torn at the top, 3px, one contact shadow + the glow */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
  position: relative;
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  box-shadow: var(--g-shadow-torn) !important;
  overflow: hidden !important;
}
/* the second packet in a run takes the shaded face, so a column of them reads
   as a stack rather than one long sheet (§3.3, the kraft alternation) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen:nth-of-type(even) {
  background-color: var(--sheet2) !important;
  background-image: var(--g-kraft), var(--g-fibre) !important;
}
/* the packet is torn open along its top edge (§3.4): a strip of bed laid over
   the paper on ::before and masked to fragment A's shared tear profile */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: 9px;
  z-index: 6;
  pointer-events: none;
  background-color: var(--canvas);
  background-image:
    radial-gradient(120% 70% at 82% -14%, color-mix(in oklab, var(--a2) 16%, transparent) 0%, color-mix(in oklab, var(--a2) 5%, transparent) 40%, transparent 70%),
    radial-gradient(60% 50% at 4% 104%, color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat), var(--g-rib),
    linear-gradient(163deg, var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%),
    var(--p-grain);
  background-size: auto, auto, var(--g-bed-repeat-size), auto, auto, 128px 128px;
  background-repeat: no-repeat, no-repeat, repeat, repeat, no-repeat, repeat;
  background-attachment: fixed;
  background-blend-mode: normal, normal, normal, normal, normal, soft-light;
  --bite-a: var(--g-bite-a);
  --bite-b: var(--g-bite-b);
  --bite-c: var(--g-bite-c);
  -webkit-mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  -webkit-mask-size: var(--g-bite-size);
  -webkit-mask-position: var(--g-bite-pos);
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
          mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
          mask-size: var(--g-bite-size);
          mask-position: var(--g-bite-pos);
          mask-repeat: repeat-x, repeat-x, repeat-x;
}

/* the masthead rule over the form: a hairline broken by one engraved sprig */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"] {
  position: relative;
  border-top: 0 !important;
  height: 24px;
  margin-top: 26px !important;
  background-image:
    linear-gradient(90deg, var(--rule), var(--rule)),
    linear-gradient(90deg, var(--rule), var(--rule)) !important;
  background-size: calc(50% - 34px) 1px, calc(50% - 34px) 1px !important;
  background-position: left center, right center !important;
  background-repeat: no-repeat, no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"]::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 58px;
  height: 24px;
  margin: -12px 0 0 -29px;
  background-color: var(--a2Text);
  -webkit-mask-image: var(--g-sprig);
          mask-image: var(--g-sprig);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
}

/* the masthead's own leader rule keeps its shape, in ink rather than brass */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child::before {
  background-image:
    linear-gradient(90deg, var(--a1Text) 0 34px, transparent 34px),
    linear-gradient(90deg, color-mix(in oklab, var(--ink) 18%, transparent) 0 100%) !important;
}

/* ── the register (the stepper) ────────────────────────────────────────── */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"] {
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  background: var(--cta) !important;
  background-image: linear-gradient(174deg, var(--g-face-hi) 0%, var(--cta) 58%, var(--g-face-lo) 100%) !important;
  color: var(--ctaText) !important;
  box-shadow: inset 0 1px 0 color-mix(in oklab, white 30%, transparent) !important;
}

/* ── THE SENTENCE: a filled vermilion segment, not a lamplit tile ─────────
   The trough carries `background: var(--rule)` inline, so THE SURFACE LAW
   already treats it as stock and hands its subtree the paper inks. It is
   therefore painted as real stock — a printed switch lying on the bed — and
   the unselected word reads as body ink on paper rather than as paper ink on
   green. (Verified in preview: with a transparent trough the word `provide`
   measured as dark brown on the bed.) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] {
  background: none !important;
  background-color: color-mix(in oklab, var(--sheet) 94%, var(--p-shade)) !important;
  background-image: var(--g-fibre) !important;
  background-size: var(--g-fibre-size) !important;
  background-blend-mode: multiply !important;
  border-color: transparent !important;
  border-radius: var(--p-rad) !important;
  padding: 3px !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 24%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: calc(50% - 4px)"] {
  top: 3px !important;
  bottom: 3px !important;
  border-radius: var(--p-rad) !important;
  background: var(--cta) !important;
  background-image: linear-gradient(174deg, var(--g-face-hi) 0%, var(--cta) 58%, var(--g-face-lo) 100%) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 30%, transparent),
    0 6px 14px -10px color-mix(in oklab, var(--cta) 90%, transparent) !important;
}
/* the chosen word is set ON the vermilion, so it takes the face's own ink */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn[style*="color: var(--ctaText)"] {
  color: var(--ctaText) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="width: min(248px, 100%)"] > button.fl-btn { border-radius: var(--p-rad) !important; }

/* ── the topic line: paper you write on ───────────────────────────────────
   parlor made this a ruled line straight on the working sheet. The sheet is
   the bed now, so a transparent field left the typed topic as paper ink on
   green (measured in preview: unreadable). It becomes what §5.8 calls a
   written field — a lifted well of stock with an inked lip. The ground is set
   with `background-color` ONLY: these two carry the app's pencil mark as a
   background-image at a forced 17px size. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in {
  border-radius: var(--p-rad) !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  padding: 12px 16px 13px !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 22%, transparent),
    inset 0 -2.5px 0 var(--a1Text),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  font-style: normal !important;
  font-size: clamp(22px, 2.5vw, var(--g-t5)) !important;
  line-height: 1.3 !important;
  letter-spacing: -.012em !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main::placeholder,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf::placeholder,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-size: var(--g-t4) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main:focus,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-topic-main-sf:focus,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-pencil-in:focus {
  box-shadow:
    inset 0 0 0 2px var(--a1Text),
    inset 0 -2.5px 0 var(--a1Text) !important;
  background-color: color-mix(in oklab, var(--a1) 6%, var(--sheet)) !important;
}

/* ── FINE TUNING ──────────────────────────────────────────────────────────
   This disclosure carries `background: var(--sheet)` in its inline style, so
   THE SURFACE LAW hands its whole subtree the paper inks. parlor then stripped
   the ground to nothing, which left paper ink standing on the bed (measured
   1.0:1 in preview — the label was invisible). It gets its stock back: a low
   packet with a hairline, which is also what it becomes once it is open and
   holding fields. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] {
  border: 0 !important;
  border-radius: var(--p-rad) !important;
  padding: 2px 16px !important;
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  box-shadow: var(--p-shadow) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn::after {
  background-image: linear-gradient(90deg,
    color-mix(in oklab, var(--ink) 26%, transparent),
    color-mix(in oklab, var(--ink) 6%, transparent) 70%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-rise[style*="border: 1.5px solid color-mix(in oklab, var(--a1) 32%, var(--rule))"] > button.fl-btn > span:first-child {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650;
  font-size: var(--g-t1) !important;
  letter-spacing: .155em !important;
}

/* ── the notice: an editor's margin note, hung on an ink rule ───────────── */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] {
  background-image: linear-gradient(180deg,
    transparent,
    var(--a3Text) 14%, var(--a3Text) 86%, transparent) !important;
}

/* ── the question index: the ordinals and the row rules go to ink ───────── */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] {
  background-image:
    linear-gradient(90deg, var(--a1Text), color-mix(in oklab, var(--a1Text) 12%, transparent)),
    linear-gradient(90deg, transparent 0 40px, color-mix(in oklab, var(--ink) 20%, transparent) 40px 72%, color-mix(in oklab, var(--ink) 7%, transparent) 100%) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > button.fl-btn {
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700;
  font-size: 10.5px !important;
  letter-spacing: .15em !important;
  background-image: none !important;
  background-color: color-mix(in oklab, var(--ink) 2%, transparent) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a1Text) 45%, transparent) !important;
}
/* the leading edge of a slot: an ink rule, not a brass ledge */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] {
  background-image: linear-gradient(180deg, var(--a1Text), color-mix(in oklab, var(--a1Text) 18%, transparent)) !important;
}

/* ── the category chips: 3px tags, not 8px pills ───────────────────────── */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="oklch(var(--catL"] {
  border-radius: var(--p-rad) !important;
  min-height: 36px;
  padding: 8px 13px !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-weight: 500 !important;
  font-size: var(--g-t2) !important;
  letter-spacing: .008em !important;
  border-color: transparent !important;
  background-image: none !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  color: var(--body) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent) !important;
}
/* the ones matched to the topic wear a keyline in the second ink */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="background: var(--sheet)"][style*="color: var(--ink)"] {
  color: var(--ink) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a2Text) 60%, transparent) !important;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"]:hover {
    transform: none;
    color: var(--ink) !important;
    background-color: color-mix(in oklab, var(--sheet) 88%, var(--p-lit-mix)) !important;
    box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 42%, transparent) !important;
  }
}
/* the struck stamps: FROM YOUR WORDS · READY-MADE LIBRARY · a sub-category.
   The sub-category tab ships with an `oklch(var(--catL) …)` ground, which in
   the Late Light room renders as a flat blue slab beside two warm stamps
   (seen in preview). It becomes the same struck stamp as the one next to it —
   parlor's R3 already said "the same 4px stamp as READY-MADE LIBRARY", and
   §5.9 puts every pill on `--tint2` / `--a2Text`. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--warm)"][style*="border-radius: 999px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"] {
  border-radius: var(--g-rad-sm) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700;
  font-size: 10.5px !important;
  letter-spacing: .15em !important;
  box-shadow: inset 0 1px 0 color-mix(in oklab, white 22%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"] {
  background: var(--tint2) !important;
  color: var(--a2Text) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 45%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"] * { color: var(--a2Text) !important; }
/* the suggested tray */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: color-mix(in oklab, var(--warm) 7%, var(--sheet))"] {
  border-radius: var(--p-rad) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--warm) 30%, transparent) !important;
}
/* MORE THEMES AND TOPICS is a broken rule, not a chip — parlor's R3 guard is
   kept verbatim so the generic 999px rule never draws a rectangle round it */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"] {
  border-radius: 0 !important;
  box-shadow: none !important;
  border: 0 !important;
  background: none !important;
  min-height: 0 !important;
  padding: 4px 0 !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700;
  font-size: 10.5px !important;
  letter-spacing: .15em !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"]::after {
  background: linear-gradient(90deg, color-mix(in oklab, var(--ink) 22%, transparent), transparent 76%) !important;
}
/* the 0/5 counter: a stamp that never wraps */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="background: var(--rule)"][style*="border-radius: 8px"] {
  border-radius: var(--g-rad-sm) !important;
  white-space: nowrap;
  flex: 0 0 auto;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700;
  font-size: 10.5px !important;
  letter-spacing: .12em !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 45%, transparent) !important;
}
/* the inner card, the dashed add control, the remove control */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--tint2)"] {
  border-radius: var(--p-rad) !important;
  background: color-mix(in oklab, var(--sheet) 92%, var(--p-shade)) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="border: 1px dashed"] {
  border-radius: var(--p-rad) !important;
  border: 1px dashed color-mix(in oklab, var(--a1Text) 45%, transparent) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700;
  font-size: 10.5px !important;
  letter-spacing: .15em !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) button.fl-btn[style*="width: 32px"][style*="height: 32px"] { border-radius: var(--p-rad) !important; }
/* the card headers' accent tab */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-sf::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border-top: 3px solid var(--a1)"]::before,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="padding: 16px 18px 12px"]::before { background: var(--a1Text) !important; }
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) #fl-cathdr-req::before { background: var(--a2Text) !important; }


/* ═══ C9 · MOTION (§6.2) ════════════════════════════════════════════════════
   Two movements: the paper objects rise once, and the plant unfurls and then
   sways. `animation-fill-mode` is BACKWARDS, never both/forwards — a filling
   transform (even the identity matrix Chrome keeps after `to { transform:
   none }`) makes the animated element a containing block for every fixed
   overlay inside it. That has taken the modals out twice. */
@keyframes g-rise  { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes g-unfurl{ from { opacity: 0; transform: scale(.55) rotate(-8deg); } to { opacity: 1; transform: none; } }
@keyframes g-sway  { 0%, 100% { transform: rotate(-.7deg); } 50% { transform: rotate(.7deg); } }

@media (prefers-reduced-motion: no-preference) {
  .fl-scroll > [style*="padding: 24px 0px 8px"] > *:not(.ui-sheet):not(.ui-sheet-scrim) {
    animation: g-rise var(--g-t-enter) var(--g-e-out) backwards;
  }
  /* the delays carry !important: the shorthand above out-specifies them, and
     a shorthand resets animation-delay to 0s */
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo { animation-delay: 60ms !important; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-copy { animation-delay: 170ms !important; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-ask       { animation-delay: 280ms !important; }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-quick     { animation-delay: 360ms !important; }

  .fl-scroll > [style*="padding: 24px 0px 8px"]::after {
    animation: g-unfurl var(--g-t-unfurl) var(--g-e-spring) 420ms backwards,
               g-sway 11s ease-in-out 1.2s infinite;
  }
}


/* ═══ C10 · REDUCED MOTION ══════════════════════════════════════════════════
   No movement — not no feedback. Every end state above stays reachable; only
   the travel goes. The sway stops at rotate(0), hence the explicit reset. */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll > [style*="padding: 24px 0px 8px"] > *,
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after,
  .fl-root button.fl-btn,
  .fl-root .v2-go,
  .fl-root .ui-chip,
  .fl-root input, .fl-root textarea, .fl-root select,
  .fl-root .ui-sheet, .ui-sheet,
  .fl-root .ui-sheet-scrim, .ui-sheet-scrim {
    animation: none !important;
    transition: none !important;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > * { opacity: 1 !important; transform: none !important; }
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after { opacity: 1 !important; transform: none !important; }
  .fl-root button.fl-btn:active:not(:disabled) { transform: none !important; }
}


/* ═══ C11 · 480px ═══════════════════════════════════════════════════════════
   The phone keeps every target at 44px and the field at 16px — iOS zooms the
   whole page on anything smaller, which is a layout bug, not a type bug. */
@media (max-width: 480px) {
  .fl-scroll:has(> [style*="padding: 24px 0px 8px"]) {
    padding: 20px 18px 40px !important;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] {
    padding: 26px 0 6px !important;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo { letter-spacing: -.02em !important; }
  .fl-hero-copy { max-width: 100% !important; }

  .fl-root .v2-ask[data-sec="hero-ask"] { width: 100% !important; margin-top: var(--g-s4) !important; }
  .fl-root .v2-ask[data-sec="hero-ask"] input:not([type="checkbox"]):not(.v2-lknm):not([type="radio"]):not([type="range"]):not([type="color"]) {
    min-height: 62px !important;
    padding: 0 66px 0 18px !important;
    font-size: 16px !important;
  }
  .fl-root .v2-ask[data-sec="hero-ask"] input::placeholder { font-size: 16px !important; }
  .fl-root .v2-ask[data-sec="hero-ask"] .v2-go { width: 50px !important; height: 50px !important; right: 6px !important; }

  .fl-root .v2-quick { width: 100%; }
  .fl-root .v2-quick .ui-chip { width: 100%; justify-content: center; }
  .fl-root .ui-chip { min-height: 44px; }

  /* the tear is shallower: at 390px a 6px bite is a third of a tap row */
  .fl-root .ui-sheet::before, .ui-sheet::before,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) .fl-sheen::before,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::before {
    --bite-a: var(--g-bite-a);
    --bite-b: radial-gradient(circle at 50% 0%, #000 2.0px, transparent 2.5px);
    --bite-c: radial-gradient(circle at 50% 0%, #000 1.1px, transparent 1.5px);
  }
  [style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"] {
    left: 16px !important;
    right: 16px !important;
    transform: none !important;
    max-width: none !important;
  }
}



/* ═══ GARDEN FRAGMENT frag-d-content.css ═══ */
/* ═════════════════════════════════════════════════════════════════════════════
   frag-d-content.css — THE GARDEN · fragment D
   lists · cards · demo cards · previews · survey card · About · faces

   Scope (§7.5): the Looponomics column and every row in it, the generic card
   family, the home demo pair, the respondent/recipient/survey previews, the
   About page, and the drawn faces. Nothing here touches the room, the rail,
   the bar, the tray, the hero or a global control — B and C own those.

   Written against builder A's foundation. Facts carried over from A's report,
   not re-derived:
     · the paper stack is  fibre FIRST (multiply), paper-lit under it — §3.3 as
       printed paints no fibre at all;
     · the app writes the `font:` SHORTHAND inline in thousands of places and
       the shorthand RESETS font-variation-settings, so every axis declaration
       here carries !important and is re-asserted after any `font:` of my own;
     · --p-hair / --p-shadow / --g-quiet / --g-hatch are declared at :root and
       therefore carry the PAPER ink family even inside a bed-ink subtree —
       which is exactly right for stock, and wrong on the bed, where the
       -onbed twins are used instead.

   THE INKS. --muted is banned as an ink in the Looponomics column (measured
   4.39 on that stock in two palettes). Quietness is bought with size, weight
   and tracking; the quiet ink is --body or --g-quiet.
   ═════════════════════════════════════════════════════════════════════════════ */


/* ── D0 · THE STOCK RESTORE STOPGAP ────────────────────────────────────────
   §3.2b rule (6): fragment B owns the stock list; C and D report a gap rather
   than extend it. Four of my own surfaces are stock that list C cannot reach,
   and every one of them renders cream-on-cream without the restore, so each
   carries a container-scoped restore HERE, clearly marked, until B's list
   grows. All four are reported to the lead. The cause is one of two things:

     a) list C prefixes almost every entry with `.fl-scroll`, and the
        respondent / recipient / survey screens HAVE NO .fl-scroll at all
        (verified: document.querySelectorAll('.fl-scroll').length === 0 on all
        three) — so on those screens only the four unprefixed entries fire;
     b) the surface paints its light ground from a CLASS in the app's own
        stylesheet, not from an inline style, so no [style*=…] hook matches it.

   Selectors to add to list C (they are stock in every palette):
     .fl-rp-frame  .fl-rp-box  .fl-rp-head  .fl-rp-acts  .fl-arr-promises
     .v2-svp__card  .fl-ab-cta  .fl-ab-quote                                   */
.fl-rp-frame, .v2-svp__card, .fl-ab-cta, .fl-ab-quote {
  --ink: var(--inkS); --body: var(--bodyS); --muted: var(--mutedS);
  --a1Text: var(--a1TextS); --a2Text: var(--a2TextS); --a3Text: var(--a3TextS);
  --rule: var(--ruleS); --tint1: var(--tint1S); --tint2: var(--tint2S);
}


/* ── D1 · THE STOCK — paper as an object (§3.3) ────────────────────────────
   One recipe. Nesting steps the stock, never the stroke. The fibre is the top
   layer and takes the multiply itself (A's correction); --p-shadow already
   carries the inset hairline, the contact shadow and — the LAW — the literal
   `0 16px 42px -10px var(--boxGlow, transparent)` third layer. */
.fl-root .ui-card, .fl-root .v2-loop, .fl-root .v2-com__card, .fl-root .v2-ph,
.fl-root .card,
.fl-root [style*="border-radius: 12px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
.fl-root [style*="border-radius: 14px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
.fl-root [style*="border-radius: 16px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button):not(.fl-btn):not([style*="pointer-events: none"]):not([style*="border-left:"]),
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"],
.fl-pv-panel:not([style*="display: none"]),
.fl-rp-frame, .v2-svp__card,
.fl-ab-quote, .fl-ab-cta {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  box-shadow: var(--p-shadow) !important;
  color: var(--ink);
}

/* THE KRAFT FACE (§3.3). Every second item in a run of stock takes the shaded
   face, so a column reads as a stack of packets rather than one long sheet.
   :nth-of-type, never :nth-child — it survives filtering and re-ordering. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:nth-of-type(even),
.fl-root [style*="margin-top: 26px"] .ui-card:nth-of-type(2) {
  background-color: var(--sheet2) !important;
  background-image: var(--g-fibre), var(--g-kraft) !important;
}

/* THE TORN TOP EDGE (§3.4) — a strip of BED painted over the paper's top edge
   on ::before and masked to the bites. NEVER clip-path on a live element: it
   clips the whole subtree, position:fixed descendants included. Loop rows do
   NOT tear (five tears in a column is noise) — they rely on the kraft
   alternation and a flat top edge. */
.fl-pv-panel:not([style*="display: none"]),
.v2-svp__card { position: relative; }
.fl-pv-panel:not([style*="display: none"])::before,
.v2-svp__card::before {
  content: ""; position: absolute; left: 0; right: 0; top: 0;
  height: 9px; z-index: 6; pointer-events: none;
  /* the bed, restated: identical layers, blends and order to §3.1, all
     viewport-fixed, so a bite shows exactly the bed behind it */
  background-color: var(--canvas);
  background-image:
    radial-gradient(120% 70% at 82% -14%, color-mix(in oklab, var(--a2) 16%, transparent) 0%, color-mix(in oklab, var(--a2) 5%, transparent) 40%, transparent 70%),
    radial-gradient(60% 50% at 4% 104%, color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat), var(--g-rib),
    linear-gradient(163deg, var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%),
    var(--p-grain);
  background-size: auto, auto, var(--g-bed-repeat-size), auto, auto, 128px 128px;
  background-repeat: no-repeat, no-repeat, repeat, repeat, no-repeat, repeat;
  background-attachment: fixed;
  background-blend-mode: normal, normal, normal, normal, normal, soft-light;
  /* ONE tear profile for every torn object, from fragment A: a 211px hand-cut
     deep row against two coprime fine rows (31 / 13px) — see --g-bite-a. */
  --bite-a: var(--g-bite-a);
  --bite-b: var(--g-bite-b);
  --bite-c: var(--g-bite-c);
  -webkit-mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
  -webkit-mask-size: var(--g-bite-size);
  -webkit-mask-position: var(--g-bite-pos);
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
          mask-image: var(--bite-a), var(--bite-b), var(--bite-c);
          mask-size: var(--g-bite-size);
          mask-position: var(--g-bite-pos);
          mask-repeat: repeat-x, repeat-x, repeat-x;
}
/* the fibre showing where the packet was pulled open: one pale line under the bites */
.fl-pv-panel:not([style*="display: none"]),
.v2-svp__card {
  /* review 1 (I1 #12a): --p-shadow's inset hairline ran STRAIGHT ACROSS the
     edge the tear opens. --g-shadow-torn draws three sides only; the pale
     fibre line rides just under the deepest bite. */
  box-shadow: var(--g-shadow-torn) !important;
}

/* THE ENGRAVED PLATE — the one object that houses a glyph: a 2px-radius
   window, the -52deg hatch behind it, a 1px ink ring (§3.6). It appears in
   exactly three sizes: 48px on a loop row, 26px on a promise, one size up on
   an About figure. Never as a page texture, never on the bed. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]),
.fl-root .fl-pv-ic,
.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface {
  border-radius: var(--g-rad-sm) !important;
  background-color: color-mix(in oklab, var(--sheet) 94%, var(--p-shade)) !important;
  background-image: var(--g-hatch) !important;
  border-color: transparent !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 24%, transparent) !important;
}


/* ── D2 · THE SECTION RULE — the one ornament (§4.7, §5.5) ─────────────────
   A hairline that runs, stops for an engraved sprig, and resumes. Two sized
   background gradients plus a masked pseudo-element, so it needs no markup.
   Applied by selector list to the dividers this fragment owns; parlor's
   diamond node and its flanking hairlines are deleted first. */

/* the home section break, above "Insights that matter" — on the bed */
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"] {
  border-top-color: transparent !important;
  background-image:
    linear-gradient(90deg, var(--ruleG), var(--ruleG)),
    linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: calc(50% - 34px) 1px, calc(50% - 34px) 1px !important;
  background-position: left top, right top !important;
  background-repeat: no-repeat, no-repeat !important;
}
/* parlor's letterpress diamond is retired — one ornament only */
.fl-scroll > [style*="margin-top: 26px"][style*="border-top: 1px solid var(--rule)"]::before {
  content: "" !important;
  position: absolute;
  top: -12px; left: 50%;
  width: 58px; height: 24px; margin-left: -29px;
  transform: none !important;
  border-radius: 0;
  background: var(--a1OnCanvas) !important;
  box-shadow: none !important;
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
  pointer-events: none;
}
/* the section head goes flush left; its flanking hairlines are deleted — the
   sprig rule above it already does that job */
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] {
  text-align: left !important;
  display: block !important;
  margin-bottom: clamp(22px, 3vw, 34px) !important;
}
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::before,
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"]::after { content: none !important; }
.fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] h2 {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: clamp(24px, 3.4vw, var(--g-t7)) !important;
  line-height: 1 !important;
  letter-spacing: -.026em !important;
  color: var(--onCanvas) !important;
  text-align: left !important;
  text-wrap: balance;
}

/* the About chapter rules — hairline, sprig, hung LEFT (the chapters are a
   long read; a centred ornament every 300px would tick like a metronome) */
.fl-root .fl-ab-ch2 {
  position: relative;
  border-top-color: transparent !important;
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: 100% 1px !important;
  background-position: left top !important;
  background-repeat: no-repeat !important;
  padding-top: 34px !important;
}
.fl-root .fl-ab-ch2::before {
  content: ""; position: absolute; top: -12px; left: 0;
  width: 58px; height: 24px;
  background: var(--a1OnCanvas);
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  pointer-events: none;
}


/* ══ D3 · LOOPONOMICS — THE COLUMN ON THE BED ═════════════════════════════
   The panel is the bed now, so everything in this column that is not stock is
   read against green and takes the on-canvas inks. The tokens do that by
   themselves (§3.2b); what changes here is face, size and tracking. */

/* ·· the masthead ·································································· */
.fl-scroll:has(.v2-sent) [style*="font-family: Fraunces"][style*="font-size: 26px"] {
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: clamp(34px, 4.4vw, var(--g-t8)) !important;
  letter-spacing: -.03em !important;
  text-shadow: none !important;
}
/* the deck is the reading voice, roman — the italic cut belongs to the
   rotating hero line and to placeholders, nowhere else (§4.4) */
.fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] {
  font-style: normal !important;
  line-height: 1.44 !important;
  color: var(--onCanvasBody) !important;
  max-width: 46ch;
  margin-top: 11px !important;
}
/* "Hide samples" — a tracked label on a hairline, not an action */
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1 !important;
  letter-spacing: .155em !important;
  color: var(--a1OnCanvas) !important;
  box-shadow: 0 1px 0 color-mix(in oklab, var(--a1OnCanvas) 52%, transparent) !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn:hover {
    color: var(--onCanvas) !important;
    box-shadow: 0 1px 0 var(--onCanvas) !important;
  }
}
/* the masthead's closing rule: the sprig, hung left */
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
  position: relative;
  border-top-color: transparent !important;
  height: 1px;
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: 100% 1px !important;
  background-position: left center !important;
  background-repeat: no-repeat !important;
}
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::before {
  content: ""; position: absolute; top: -12px; left: 0;
  width: 58px; height: 24px;
  background: var(--a1OnCanvas);
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  pointer-events: none;
}

/* ·· the filter sentence — the best idea in the product, set as prose ······· */
.fl-scroll:has(.v2-sent) .v2-sent {
  font-style: normal !important;
  line-height: 1.4 !important;
  letter-spacing: .002em !important;
  color: var(--onCanvasBody) !important;
  text-wrap: balance;
}
/* the values are the light display cut, underlined in the bed's own brass */
.fl-scroll:has(.v2-sent) .v2-slot {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  font-style: normal !important;
  font-size: .96em !important;
  letter-spacing: -.012em !important;
  color: var(--onCanvas) !important;
  text-shadow: none !important;
  background-image:
    linear-gradient(var(--a2OnCanvas), var(--a2OnCanvas)),
    linear-gradient(var(--a2OnCanvas), var(--a2OnCanvas)) !important;
  background-size: 100% 1.5px, 0 1.5px !important;
}
/* the mark on a word you can open: the engraved seed, not a second lozenge.
   ::before, never ::after — ::after is the app's invisible hit-area expander
   (inset -8px -4px) and touching it shrinks a tap target (§8.2 #8). */
.fl-scroll:has(.v2-sent) .v2-slot::before {
  width: 6px !important; height: 6px !important;
  inset: auto -1px -7px auto !important;
  transform: none !important;
  background: var(--a2OnCanvas) !important;
  -webkit-mask-image: var(--g-seed); mask-image: var(--g-seed);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) .v2-slot:hover::before { transform: scale(1.35) !important; }
}

/* ·· the search line — a line you write on, not a box you are put in ········· */
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-style: italic !important;
  font-size: 16.5px !important;
  letter-spacing: .002em !important;
  color: var(--onCanvasBody) !important;
  box-shadow: inset 0 -1px 0 var(--ruleG) !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn:hover {
    box-shadow: inset 0 -1.5px 0 var(--a1OnCanvas) !important;
    color: var(--onCanvas) !important;
  }
}

/* ·· the section mark (ACTIVE / INACTIVE) ··································· */
.fl-scroll:has(.v2-sent) .ui-label {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1 !important;
  letter-spacing: .155em !important;
  color: var(--onCanvasBody) !important;
}
/* the rule breaks around its label: label, sprig, then a hairline running out */
.fl-scroll:has(.v2-sent) .ui-label::after {
  width: 40px !important; height: 17px !important;
  margin: 0 0 -3px 12px !important;
  transform: none !important;
  background: var(--a1OnCanvas) !important;
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
}
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] > span[style*="height: 1px"] {
  background: linear-gradient(90deg,
      var(--ruleG) 0%,
      color-mix(in oklab, var(--onCanvas) 7%, transparent) 46%,
      transparent 100%) !important;
}
/* the running head stays with you — but the band it rides on is the BED now,
   not a sheet (parlor's cream band read as a smear over green) */
@supports (position: sticky) {
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] {
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--canvas) 88%, transparent) 0%,
        color-mix(in oklab, var(--canvas) 78%, transparent) 62%,
        transparent 100%);
  }
}

/* ·· THE LOOP ROWS — the drill (§5.6.2) ····································· */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
  grid-template-columns: 56px max-content minmax(0, 1fr) auto;
  column-gap: 18px !important;
  row-gap: 7px !important;
  padding: 15px 30px 15px 15px !important;
  margin-bottom: 12px !important;
  transition: transform var(--g-t-hover) var(--g-e-out),
              box-shadow var(--g-t-hover) var(--g-e-out) !important;
  /* §6.1: two movements is the whole budget. parlor's scroll-driven
     `lx-into-light` is a third, and a filling transform on a row is one more
     containing block than this app needs. */
  animation: none !important;
}
/* parlor's coloured spine ledge is deleted — the engraved plate is the mark */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::before,
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after { content: none !important; }

/* the plate: the app's direction glyph, rehoused in an engraved window. The
   glyph itself is kept — it says sent-or-received, which no ornament can. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]) {
  width: 48px; height: 48px;
  display: flex; align-items: center; justify-content: center;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] svg {
  width: 24px; height: 24px;
  color: var(--ink) !important;
  opacity: .9;
}

/* the question — one size for every row in the column. design-review.py fails
   the build on two sizes, and the owner is on record: "using different size
   fonts for different loop cards? that is horrible design." */
/* the DRAFT card (a stock wrapper around its own .fl-lift) titles in the same
   voice — with the kind slot booting to "everything" (FL_INS_DEFAULTS) drafts
   sit in the same column as the loops, and one column is one title size */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="font: 600 14px"],
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > [style*="font: 600 14px"] {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 44, "WONK" 1 !important;
  font-weight: 600 !important;
  font-size: 17.5px !important;
  line-height: 1.24 !important;
  letter-spacing: -.012em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
}
/* provenance: a wall label, sized so it can never shout. --body, never
   --muted — --muted measures 4.39 on this stock in two palettes. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > [style*="font: 400 12.5px"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1.3 !important;
  letter-spacing: .155em !important;
  text-transform: uppercase !important;
  color: var(--body) !important;
  font-variant-numeric: tabular-nums lining-nums;
  /* the app sets nowrap + ellipsis inline; at the label role's .155em that
     clipped "… 6 R…" off the end of a real provenance line. The line wraps
     instead — the count is information, the ellipsis was not. */
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  text-wrap: pretty;
}
/* the timestamp: a marginal figure, tabular so the column never jitters */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="font: 500 11.5px"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 600 !important;
  font-weight: 600 !important;
  font-size: 10.5px !important;
  letter-spacing: .06em !important;
  color: var(--g-quiet) !important;
  font-variant-numeric: tabular-nums lining-nums;
}
/* status stamps (INACTIVE / ARCHIVED) in their own track. They wrapped
   letter-by-letter once; the nowrap guard stays. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius: 999px"],
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius:999px"] {
  border-radius: var(--g-rad-sm) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  line-height: 1 !important;
  letter-spacing: .14em !important;
  text-transform: uppercase !important;
  white-space: nowrap !important;
  overflow-wrap: normal !important;
  word-break: normal !important;
  padding: 6px 9px 5px !important;
  color: var(--body) !important;
  background: color-mix(in oklab, var(--rule) 55%, var(--sheet)) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 12%, transparent) !important;
}
/* the actions: ghost buttons in a reserved gutter — the column never shifts.
   Scoped inside the row: C owns every global button rule. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"] {
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: 10px !important;
  letter-spacing: .15em !important;
  color: var(--body) !important;
  transition: background-color var(--g-t-hover) var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:hover {
    background: color-mix(in oklab, var(--ink) 7%, transparent) !important;
    color: var(--a1Text) !important;
  }
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:active {
  transform: translateY(1px);
  transition-duration: var(--g-t-press) !important;
}

/* the unread count: the comp's filled stamp. The bundle paints the figure on
   the inner .sc-interp as well as on its wrapper, so the descendant has to be
   re-inked or it renders cream on cream (§8.2 #6). */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"] {
  display: inline-flex; align-items: center; gap: 7px;
  height: 26px;
  padding: 0 10px !important;
  border-radius: var(--g-rad-sm) !important;
  background: linear-gradient(176deg, var(--warm), var(--warmDeep)) !important;
  color: var(--warmText) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .14em !important;
  text-transform: uppercase !important;
  box-shadow: inset 0 1px 0 color-mix(in oklab, white 24%, transparent),
              0 6px 12px -8px color-mix(in oklab, var(--warmDeep) 90%, transparent) !important;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"] * {
  background: none !important;
  color: var(--warmText) !important;
  padding: 0 !important;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="background: var(--warm)"]::before {
  content: ""; width: 6px; height: 6px; flex: none;
  margin-right: 0;
  border-radius: 50%;
  background: color-mix(in oklab, var(--warmText) 82%, var(--warm)) !important;
  box-shadow: none !important;
}

/* the SAMPLE mark: a plate mark down the trim edge, the way a printer signs a
   specimen sheet. parlor's placement is kept — it is strictly better than a
   diagonal slab through the question — and only the face changes.
   MEASURED DEVIATION from §5.6.2: the spec asks for --ink at 12%, which lands
   at ~1.1:1 and would be flagged as unreadable text by design-review.py. The
   ink stays at parlor's measured 66% (4.85–5.11 across the six palettes) and
   the quiet is bought with 9px, .42em and the vertical set. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 74, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 9px !important;
  line-height: 1 !important;
  letter-spacing: .42em !important;
  color: color-mix(in oklab, var(--ink) 66%, transparent) !important;
}

/* hover: the sheet lifts one pixel and its contact shadow deepens one stop.
   No colour swap, no scale (§6.3). */
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover {
    transform: translateY(-1px) !important;
    box-shadow:
      inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
      0 18px 34px -22px color-mix(in oklab, var(--ink) 88%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover > [style*="font: 600 14px"] {
    letter-spacing: -.012em !important;
  }
}
@media (hover: none) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover { transform: none !important; }
}

/* ·· the empty state — a composition, not a dashed rectangle apologising ····· */
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"]::before {
  width: 58px !important; height: 24px !important;
  margin: 4px auto 30px !important;
  transform: none !important;
  background: var(--a1OnCanvas) !important;
  box-shadow: none !important;
  -webkit-mask-image: var(--g-sprig); mask-image: var(--g-sprig);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
}
/* the lamplit medallion becomes an empty tray */
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="border-radius: 50%"] {
  width: 112px !important; height: 69px !important;
  border-radius: 0 !important;
  background: var(--onCanvasBody) !important;
  box-shadow: none !important;
  -webkit-mask-image: var(--g-plate-6); mask-image: var(--g-plate-6);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="border-radius: 50%"] > * { display: none !important; }
.fl-scroll:has(.v2-sent) .ui-d3 {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-style: normal !important;
  font-size: clamp(26px, 3.4vw, var(--g-t6)) !important;
  line-height: 1.08 !important;
  letter-spacing: -.022em !important;
  color: var(--ink) !important;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="font: 400 14px"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 13.5px !important;
  line-height: 1.44 !important;
  color: var(--body) !important;
}
.fl-scroll:has(.v2-sent) .ui-chip {
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  letter-spacing: .155em !important;
  background-image: none !important;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) !important;
  box-shadow: var(--p-shadow) !important;
}


/* ══ D4 · THE HOME DEMO PAIR — "Insights that matter" (§5.6.1) ════════════ */
.fl-root [style*="margin-top: 26px"] .ui-card {
  padding: 22px !important;
}
.fl-root .ui-card__title {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 44, "WONK" 1 !important;
  font-size: var(--g-t4) !important;
  line-height: 1.18 !important;
  letter-spacing: -.016em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
}
.fl-root .ui-card__sub {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 15px !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
  color: var(--body) !important;
}
/* the kickers inside the demo cards (WHAT DO YOU WANT FEEDBACK ABOUT? /
   SUGGESTED QUESTIONS / LOOP SUMMARY) are already caught by A's small-caps
   rule through the inline "IBM Plex Mono" + letter-spacing hook; only the ink
   is set here, and it is set on stock */
.fl-root [style*="margin-top: 26px"] .ui-card [style*='"IBM Plex Mono"'][style*="letter-spacing"] {
  color: var(--a2Text) !important;
}
/* the numbered suggestion bullets become engraved stamps, not filled discs */
.fl-root [style*="margin-top: 26px"] .ui-card [style*="border-radius: 50%"][style*="background: var(--a1)"] {
  border-radius: var(--g-rad-sm) !important;
  background: var(--a1Text) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-size: 10.5px !important;
}
/* the typed-topic well and the summary well */
.fl-root [style*="margin-top: 26px"] .ui-card [style*="border-radius: 12px"] {
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
}

/* THE SHIMMER BARS (.fl-shim) — the processing skeleton. They keep the app's
   animation; only the two greys change, because on paper-coloured cards the
   old pair was a ghost (owner, 2026-08-17: "can't see the processing icons on
   the homepage in the demo box"). Light rooms get a soft pencil bar, dark
   rooms a lighter one; the sweep is the daylight passing over it.
   MEASURED: §5.6.1's pair (sheet 70% + --p-shade) lands the bar at 1.09:1
   against the summary well it sits in — under the review's 1.18 floor for a
   graphic element, and exactly the ghost the owner rejected. Mixing toward
   --muted instead of --p-shade lands it at ~1.5 and works in BOTH directions
   without a second declaration: --muted is the mid ink, so in a light room it
   darkens the bar and in the two dark rooms it lightens it. */
.fl-root {
  --g-shim: color-mix(in oklab, var(--sheet) 66%, var(--muted));
  --g-shim-lit: color-mix(in oklab, var(--sheet) 34%, var(--p-lit-mix));
}
.fl-root .fl-shim {
  border-radius: var(--g-rad-sm) !important;
  background-image:
    linear-gradient(100deg, transparent 0 34%, var(--g-shim-lit) 50%, transparent 66% 100%),
    linear-gradient(var(--g-shim), var(--g-shim)) !important;
  background-size: 220% 100%, 100% 100% !important;
  background-repeat: no-repeat, no-repeat !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 8%, transparent);
}


/* ══ D5 · THE PREVIEW PANELS AND THE PHONE MOCK (§5.6.4) ══════════════════
   .fl-pv-panel is the packet's back panel: stock, torn, with the explainer
   set as a read. The :not() guard is load-bearing — the app hides the panel
   under 1240px with display:none!important and the rule must not fight it. */
.fl-pv-panel:not([style*="display: none"]) { padding: 26px 22px 16px !important; }
.fl-root .fl-pv-klabel {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1 !important;
  letter-spacing: .155em !important;
  text-transform: uppercase !important;
  color: var(--a2Text) !important;
}
.fl-root .fl-pv-title {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 44, "WONK" 1 !important;
  font-weight: 600 !important;
  font-size: 20px !important;
  line-height: 1.16 !important;
  letter-spacing: -.018em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
  margin-top: 10px !important;
}
.fl-root .fl-pv-sub, .fl-root .fl-pv-cs {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 13.5px !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
  color: var(--body) !important;
}
.fl-root .fl-pv-ct {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: 12.5px !important;
  letter-spacing: .012em !important;
  color: var(--ink) !important;
}
.fl-root .fl-pv-item { border-top-color: color-mix(in oklab, var(--ink) 11%, transparent) !important; }
.fl-root .fl-pv-ic {
  width: 26px !important; height: 26px !important;
  color: var(--a3Text) !important;
}
.fl-root .fl-pv-ic svg { width: 14px; height: 14px; }

/* the phone mock — the same packet family. Its light ground comes from a
   class, so the stock ink restore is in D0. */
.fl-rp-frame { padding: 26px 20px 20px !important; }
.fl-root .fl-rp-head, .fl-root .fl-rp-acts, .fl-root .fl-arr-promises, .fl-root .fl-rp-box {
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 12%, transparent) !important;
}
.fl-root .fl-arr-title {
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  letter-spacing: -.026em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
}
/* the chip row: 30px stamps, a hairline ring, ink on stock. The Anonymous
   chip is the one with a ground. */
.fl-root .fl-arr-chips > span {
  /* inline-BLOCK, never inline-flex: the label is two text nodes ("3" from a
     bound span, then " quick questions") and a flex container drops the
     whitespace between them — "3QUICK QUESTIONS" */
  display: inline-block;
  line-height: 30px !important;
  border-radius: var(--g-rad-sm) !important;
  padding: 0 11px !important;
  background: none !important;
  border: 1px solid color-mix(in oklab, var(--ink) 22%, transparent) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  letter-spacing: .12em !important;
  text-transform: uppercase !important;
  color: var(--body) !important;
}
.fl-root .fl-arr-chips > span:nth-of-type(2) {
  background: color-mix(in oklab, var(--a3Text) 18%, transparent) !important;
  border-color: color-mix(in oklab, var(--a3Text) 40%, transparent) !important;
  color: var(--ink) !important;
}
/* the two promises: engraved stamps, not filled discs */
.fl-root .fl-arr-promises [style*="border-radius: 50%"] {
  border-radius: var(--g-rad-sm) !important;
  background: var(--a3Text) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-size: 10.5px !important;
}


/* ══ D6 · THE SURVEY CARD (§5.13) — survey.php shares this markup ═════════
   It renders an existing share link as an answerable card and nothing more;
   it must never grow a write path. The outer .v2-svp was the phone shell —
   under the Garden the bed is the shell, so the card lies straight on it. */
.v2-svp {
  background: none !important;
  background-color: transparent !important;
  box-shadow: none !important;
  padding: 0 !important;
  border-radius: 0 !important;
  overflow: visible !important;
}
.v2-svp__card { padding: 26px 20px 0 !important; }
.v2-svp__brand {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: 14px !important;
  letter-spacing: -.02em !important;
  border-bottom-color: color-mix(in oklab, var(--a1Text) 42%, transparent) !important;
}
.v2-svp__k {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1 !important;
  letter-spacing: .155em !important;
  color: var(--a2Text) !important;
  margin-top: 18px !important;
}
.v2-svp__t {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-weight: 600 !important;
  font-size: 25px !important;
  line-height: 1.1 !important;
  letter-spacing: -.026em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
}
.v2-svp__by {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 550 !important;
  font-size: 11.5px !important;
  letter-spacing: .02em !important;
  color: var(--body) !important;
}
/* the promise, led by a plate — the one place a botanical glyph earns its
   place on this card */
.v2-svp__note {
  position: relative;
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 13.5px !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
  color: var(--body) !important;
  border-left-color: color-mix(in oklab, var(--a3Text) 62%, transparent) !important;
  padding: 26px 0 2px 12px !important;
  margin-top: 18px !important;
}
.v2-svp__note::before {
  content: ""; position: absolute; top: 0; left: 12px;
  width: 20px; height: 20px;
  background: var(--a3Text);
  -webkit-mask-image: var(--g-plate-3); mask-image: var(--g-plate-3);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
}
.v2-svp__n {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  letter-spacing: .1em !important;
  color: var(--a2Text) !important;
  font-variant-numeric: tabular-nums lining-nums;
  padding-top: 6px !important;
}
.v2-svp__qt {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 44, "WONK" 1 !important;
  font-weight: 600 !important;
  font-size: 15px !important;
  line-height: 1.26 !important;
  letter-spacing: -.01em !important;
  color: var(--ink) !important;
}
.v2-svp__in {
  border-radius: var(--p-rad) !important;
  border-color: color-mix(in oklab, var(--ink) 16%, transparent) !important;
  background: color-mix(in oklab, var(--sheet) 94%, var(--p-lit-mix)) !important;
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 13px !important;
  line-height: 1.44 !important;
  color: var(--body) !important;
  box-shadow: var(--g-deboss);
}
/* the send row: the kraft flap at the foot of the packet */
.v2-svp__bar {
  border-top-color: color-mix(in oklab, var(--ink) 12%, transparent) !important;
  background-color: var(--sheet2) !important;
  background-image: var(--g-fibre), var(--g-kraft) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
}
.v2-svp__go {
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 650 !important;
  font-weight: 650 !important;
  letter-spacing: .015em !important;
}


/* ══ D7 · THE ABOUT PAGE ══════════════════════════════════════════════════
   The chapters are read directly off the bed, so the prose takes the voice in
   the on-canvas inks and only the two cards (the callout and the closing CTA)
   are stock. */
.fl-root .fl-ab-ch2 > div[style*="var(--font-body)"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 16px !important;
  line-height: 1.5 !important;
  letter-spacing: .002em !important;
  color: var(--onCanvasBody) !important;
  max-width: 62ch !important;
  text-wrap: pretty;
}
.fl-root .fl-ab-ch2 > div[style*="var(--font-display)"] {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  font-size: var(--g-t5) !important;
  line-height: 1.28 !important;
  letter-spacing: -.018em !important;
  color: var(--onCanvas) !important;
}
.fl-root .fl-ab-h {
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: var(--g-t5) !important;
  line-height: 1.1 !important;
  letter-spacing: -.024em !important;
  color: var(--onCanvas) !important;
  margin: 0 0 10px !important;
}
/* the callout: a sheet with a margin rule, not a tinted slab */
.fl-root .fl-ab-quote {
  border-left: 0 !important;
  padding: 22px 26px !important;
  font-variation-settings: "wght" 400, "opsz" 144, "SOFT" 60, "WONK" 1 !important;
  font-size: var(--g-t5) !important;
  line-height: 1.32 !important;
  letter-spacing: -.016em !important;
  color: var(--ink) !important;
}
.fl-root .fl-ab-quote > div { position: relative; padding-left: 20px; }
.fl-root .fl-ab-quote > div::before {
  content: ""; position: absolute; left: 0; top: .18em; bottom: .18em;
  width: 3px;
  background: color-mix(in oklab, var(--a2Text) 70%, transparent);
}
/* the collectible words: struck stamps, not pills */
.fl-root .fl-ab-chip {
  border-radius: var(--g-rad-sm) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  line-height: 1 !important;
  letter-spacing: .15em !important;
  padding: 9px 13px !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 12%, transparent) !important;
}
/* the closing card */
.fl-root .fl-ab-cta {
  padding: 34px 24px !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
}
.fl-root .fl-ab-cta > div[style*="var(--font-display)"] {
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  letter-spacing: -.024em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press);
}
.fl-root .fl-ab-cta > div[style*="color: var(--muted)"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: 14px !important;
  line-height: 1.44 !important;
  color: var(--body) !important;
}


/* ══ D8 · THE FACES — they are characters, and characters have colour ═════
   Owner directives, both standing: "the eyes in the logo are sloppy… make
   them perfect circles without blemishes" and "go back to perfect round eyes
   and sharp facial features. the hand drawn doesn't look good".

   (a) NO FILTER, EVER — not the app's own #pencil (a presentation attribute
       on the hero face; a CSS filter:none out-ranks it) and not #handdrawn.
       D owns this rule and D is accountable for it. Never relaxed, never
       given the comp's #fibre. */
.fl-logo svg, .fl-hero-logo svg, .fl-mlock__btn svg, .fl-lockup-card svg,
.v2-ob__face svg, .fl-cere__face svg, .fl-ab-fig svg, .fl-ab-figL svg,
.fl-ab-ctaface svg, .fl-lidf1, .fl-lidf2 {
  filter: none !important;
}
/* (b) the blink geometry fix, verbatim: the lid is the eye's own interior, a
   plate clipped to the circle the app uses for the eye white, so it never
   caps the ring or thins it to a hairline. */
.fl-lidf1 > path:first-child { clip-path: circle(12px at 16px 17px); }
.fl-lidf2 > circle { r: 12px; }
.fl-lidf1 > path:first-child, .fl-lidf2 > circle { fill: var(--logoSoft) !important; }

/* (c) the About figures: the tint disc becomes an engraved window — the same
   object as the loop-row plate, one size up. The window stays PALE even
   though it sits on the bed: the drawn faces carry their own palette (eye
   rings, brows, cheeks, glints), and the owner has already rejected faces
   that lost their colour once. A cream-on-green face would repeat that. */
.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface {
  border-radius: var(--g-rad-sm) !important;
  transform: none !important;
  padding: 14px !important;
  /* the disc is a square now — a circular shape-outside would hold the prose
     off the corners of a shape that no longer has any */
  shape-outside: none !important;
}
.fl-ab-figL { transform: none !important; }
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-ab-fig:hover { transform: scale(1.06) !important; }
}
.fl-ab-fig:active { transform: scale(.97) !important; }
/* the eye white must stay the lightest thing in the mark; on stock it needs
   its own edge or it disappears into the paper */
.fl-logo svg [fill="var(--glint)"], .fl-hero-logo svg [fill="var(--glint)"] {
  stroke: color-mix(in oklab, var(--logo) 92%, transparent);
  stroke-width: 1.6;
  paint-order: fill stroke;
}


/* ══ D9 · NARROW — the fold, then the phone ═══════════════════════════════
   parlor folds the row grid to two tracks at 620px, so the plate has to shrink
   at 620 too — at 481–620 a 48px window in a 26px track pushed the question
   sideways. The 480 block below is this fragment's own phone block (§7.6 #5). */
@media (max-width: 620px) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
    grid-template-columns: 44px minmax(0, 1fr);
    /* the folded template parlor ships has no `tags` area, so an INACTIVE /
       ARCHIVED stamp fell into an implicit row and floated to the bottom
       right of the row. It gets a row of its own, with `time` spanning down
       beside it; the row is 0-tall when no stamp is present. */
    grid-template-areas:
      "mark title"
      "time tags"
      "time meta"
      "acts acts" !important;
    column-gap: 12px !important;
    row-gap: 4px !important;
    padding: 14px 24px 12px 12px !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius: 999px"],
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius:999px"] {
    justify-self: start !important;
    align-self: center !important;
    margin: 2px 0 1px !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]) {
    width: 40px; height: 40px;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] svg { width: 20px; height: 20px; }
  /* one size for every row at this width too */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="font: 600 14px"],
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > [style*="font: 600 14px"] { font-size: 16.5px !important; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"] { letter-spacing: .3em !important; }
  /* the actions keep their 40px targets on their own row */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn { min-height: 40px !important; }
}

@media (max-width: 480px) {
  .fl-scroll:has(.v2-sent) [style*="font-family: Fraunces"][style*="font-size: 26px"] { font-size: clamp(30px, 9vw, 38px) !important; }
  .fl-scroll:has(.v2-sent) .v2-sent { font-size: 19px !important; text-wrap: pretty; }
  .fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] { font-size: 16px !important; }
  .fl-scroll > [style*="margin-top: 26px"] > [data-sec="demo"] h2 { font-size: clamp(24px, 8vw, 32px) !important; }
  /* the bite profile: at 390px a 6px bite is a third of a tap row */
  .fl-pv-panel:not([style*="display: none"])::before,
  .v2-svp__card::before {
    --bite-a: var(--g-bite-a);
    --bite-b: radial-gradient(circle at 50% 0%, #000 2.0px, transparent 2.5px);
    --bite-c: radial-gradient(circle at 50% 0%, #000 1.1px, transparent 1.5px);
  }
  .fl-root .fl-ab-h { font-size: var(--g-t5) !important; }
  .fl-root .fl-ab-ch2 > div[style*="var(--font-body)"] { font-size: 16px !important; }
  .fl-root .fl-ab-ch2 > div[style*="var(--font-display)"] { font-size: 19px !important; }
  .fl-root .fl-ab-quote { font-size: 19px !important; padding: 18px 18px !important; }
  .fl-ab-fig, .fl-ab-figL { padding: 10px !important; }
  .fl-rp-frame { padding: 20px 14px 16px !important; }
  .v2-svp__card { padding: 22px 16px 0 !important; }
}


/* ══ D10 · REDUCED MOTION — no movement, every end state still reachable ══ */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:has(.v2-sent) *,
  .fl-scroll:has(.v2-sent) *::before,
  .fl-scroll:has(.v2-sent) *::after,
  .fl-root .fl-shim,
  .fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface,
  .fl-pv-panel, .fl-rp-frame, .v2-svp, .v2-svp__card,
  .fl-root .ui-card, .fl-root .v2-loop, .fl-root .v2-com__card, .fl-root .v2-ph {
    animation: none !important;
    transition: none !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] { opacity: 1 !important; transform: none !important; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover { transform: none !important; }
  .fl-ab-fig:hover, .fl-ab-fig:active { transform: none !important; }
}



/* ═══ GARDEN FRAGMENT frag-e-lead.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT E — the lead's fixes after the first full review (2026-08-18)
   Owned by the lead. Small, dated, each rule names the finding it closes.
   Findings are cited as I1/I2/I3 #n = garden/review-1/inspector-{1,2,3}*.md.
   This fragment is assembled LAST, so at equal specificity it wins.
   ═══════════════════════════════════════════════════════════════════════════ */

/* review 1 · mark:high — the Looponomics search line's magnifier read paper
   ink on the bed (1.2–1.6:1). The button paints `background: var(--sheet)`
   inline, so THE SURFACE LAW's stock list restores paper inks on it, while
   fragment D (rightly) draws it as a transparent line ON the bed. It is on the
   bed: bed inks for its whole subtree, and the icon follows. */
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn {
  --ink: var(--onCanvas); --body: var(--onCanvasBody); --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas);
  background: transparent !important;
}
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn svg,
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn svg * {
  color: var(--onCanvasBody) !important;
  stroke: var(--onCanvasBody) !important;
}

/* review 1 · label-wrap:med — "Verify by phone" / "Copy profile link" on the
   account screen broke onto two lines at 390 (flex:1; min-width:130px). A
   button label is one line. */
.fl-root button.fl-btn[style*="min-width: 130px"],
.fl-root button.fl-btn[style*="min-width:130px"],
.fl-root button.fl-btn[style*="min-width: 120px"][style*="min-height: 44px"],
.fl-root button.fl-btn[style*="min-width:120px"][style*="min-height:44px"] {
  white-space: nowrap !important;
  overflow-wrap: normal !important;
  word-break: normal !important;
  padding-inline: 10px !important;
}


/* ═══ E1 · THE THINGS YOU COULD NOT READ ════════════════════════════════════
   Priority 1 of the fix brief: illegible, invisible or unreachable.        */

/* I1 #2 (BLOCK) — the sample-questions notice. parlor turns it into an
   editor's MARGIN note: it strips the ground to transparent and hangs the
   copy off an --a3 rule. Its inline ground still names the sheet, so THE
   SURFACE LAW restored the PAPER inks on a block that is now standing on the
   bed — dark ink on green, invisible in every palette. It is a bed object:
   bed inks for its subtree, and the hung rule goes to the bed's own green.
   SPECIFICITY: fragment C's ask-flow rules all carry parlor's ID-level
   `:is(:has(#fl-topic-main), …)` prefix (1,2,0), so a (0,4,0) rule loses to
   them even with !important. This one carries the same prefix. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has([style*="margin: 20px 0px 3"])) [style*="border-left: 3px solid var(--a3)"] {
  --ink: var(--onCanvas);
  --body: var(--onCanvasBody);
  --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas);
  --a2Text: var(--a2OnCanvas);
  --a3Text: var(--a3OnCanvas);
  --rule: var(--ruleG);
  background-image: linear-gradient(180deg,
    transparent, var(--a3OnCanvas) 14%, var(--a3OnCanvas) 86%, transparent) !important;
  border-radius: 0 !important;
}

/* I1 #3 (BLOCK) — the step-2 notice. Its ground is
   `color-mix(in oklab, var(--a1) 6%, var(--sheet))`, which the stock list
   missed (fragment B now carries the "…, var(--sheet))" hook), so the copy
   came out --onCanvasBody on cream. The inks are fixed by the law; what is
   left here is the 12px corner. */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] [style*="background: color-mix(in oklab, var("][style*=", var(--sheet))"] {
  border-radius: var(--p-rad) !important;
}

/* I1 #5, I3 #1 (BLOCK) — the register's step badges. Both non-active states
   were invisible: the UPCOMING badge painted `background: var(--rule)` and
   `color: var(--muted)`, which parlor then made transparent + --body — paper
   ink on the bed (1.06–1.12:1); the COMPLETED badge painted a cream mix and
   took the flipped cream ink. The register stands on the bed, so both states
   are bed objects: a ring and a bed ink, never a pale square. */
.fl-root [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"][style*="background: var(--rule)"] {
  background: transparent !important;
  background-image: none !important;
  color: var(--onCanvasBody) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 46%, transparent) !important;
}
.fl-root [style*="margin: 20px 0px 3"] [style*="border-radius: 50%"][style*="background: color-mix(in oklab, var(--a1)"] {
  background: color-mix(in oklab, var(--a1OnCanvas) 20%, transparent) !important;
  background-image: none !important;
  color: var(--onCanvas) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a1OnCanvas) 62%, transparent) !important;
}

/* I1 #4 (BLOCK) — `Back` beside `Launch Loop`. Fragment B has taken buttons
   out of the stock list, so a secondary control now inherits the ink of the
   surface it stands on. Its ring still has to clear 3:1 on the BED as well as
   on stock: 34% of the ink family measured 2.4 on green. */
.fl-root button.fl-btn[style*="background: var(--sheet)"],
.fl-root button.fl-btn[style*="background: var(--tint1)"],
.fl-root button.fl-btn[style*="background: var(--tint2)"] {
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 46%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}

/* I3 #14 (BLOCK) — the disabled `Continue` keyline measured 1.89:1 on the
   bed. An unlit control still has an edge: a flat wash plus a keyline that
   clears 3:1 on every ground. The label stays --body (7.8:1). */
.fl-root button.fl-btn:disabled,
.fl-root button.fl-btn[style*="opacity: 0.5"] {
  background-color: color-mix(in oklab, var(--ink) 12%, transparent) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 42%, transparent) !important;
}
.fl-root button.fl-btn:disabled[style*="background: none"],
.fl-root button.fl-btn:disabled[style*="background: transparent"],
.fl-root button.fl-btn[style*="cursor: default"][style*="background: none"],
.fl-root button.fl-btn[style*="cursor: default"][style*="background: transparent"] {
  background-color: transparent !important;
  box-shadow: none !important;
}

/* I1 #7, I3 #3 (BLOCK) — the toast landed INSIDE the fixed bottom bar and
   covered it, on the phone and at 1280 (the bar is 68–80px tall and the toast
   sits at bottom:28px). When the bar is on the page the toast clears it. */
.fl-root:has(> [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"])
  [style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"] {
  bottom: calc(92px + env(safe-area-inset-bottom, 0px)) !important;
}

/* I3 #2, I2 #18 — the recipient preview. At a real 390x844 the mock frame is
   `min(874px, 92vh)` tall and its lower ~90px, including `Send reply` and the
   closing band, sits UNDER the mobile bar. The frame is capped to the space
   that actually exists, and the scroller ends with air instead of cutting a
   control in half. */
.fl-root .fl-arrive { padding-bottom: 28px !important; scroll-padding-bottom: 28px; }
/* the mock is a phone: its content is longer than its screen by design, so the
   fold has to READ as a fold. The closing band carries a short fade above it,
   which is also what stops the band from looking as if it had covered the
   control it sits under. */
.fl-root .fl-arrive + div { position: relative; }
.fl-root .fl-arrive + div::before {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 100%;
  height: 30px;
  pointer-events: none;
  background: linear-gradient(180deg,
    transparent,
    color-mix(in oklab, var(--sheet) 55%, transparent) 60%,
    color-mix(in oklab, var(--sheet) 88%, transparent));
}

/* I1 #17 (BLOCK) — the Looponomics search field had no boundary at all on the
   bed: one hairline under it and nothing else. §5.8: a written field is a
   well with an inked lip. */
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn {
  padding: 0 16px !important;
  border-radius: var(--p-rad) !important;
  background-color: color-mix(in oklab, var(--onCanvas) 8%, transparent) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 26%, transparent) !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn:hover {
    background-color: color-mix(in oklab, var(--onCanvas) 12%, transparent) !important;
    box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a1OnCanvas) 62%, transparent) !important;
    color: var(--onCanvas) !important;
  }
}

/* I1 #16 — the ACTIVE / INACTIVE running head rode on a solid dark band that
   ran from the sprig to the right edge. The rule breaks around its label and
   nothing else: the sticky ground becomes a short fade that only has to stop
   a row showing THROUGH the label. */
@supports (position: sticky) {
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] {
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--canvas) 72%, transparent) 0%,
        color-mix(in oklab, var(--canvas) 34%, transparent) 58%,
        transparent 100%) !important;
  }
}

/* I1 #15 — the SAMPLE watermark was letter-stacked down the right edge of
   every row (parlor sets writing-mode: vertical-rl). The comp runs it as one
   word: keep it rotated, set it horizontally. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"] {
  writing-mode: horizontal-tb !important;
  right: 10px !important;
  transform: translateY(-50%) rotate(-90deg) !important;
  transform-origin: center !important;
  letter-spacing: .28em !important;
}

/* I1 #18, I3 #15 — the filter slots and their neighbours were 28–30px tall
   with the hit box short of the underline. Desktop floor 32, touch floor 40,
   and the slot gets a box its underline belongs to. */
.fl-scroll:has(.v2-sent) .v2-slot {
  display: inline-block;
  min-height: 32px;
  padding: 3px 2px 5px !important;
  background-position: 0 100%, 0 100% !important;
}
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn {
  min-height: 32px;
  padding: 8px 4px !important;
}

/* I3 #12 — the Looponomics section rule ran at two heights and in two inks
   either side of the sprig. One hairline, one ink, one height. */
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: 100% 1px !important;
  background-position: left center !important;
}
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 11px"] > span[style*="height: 1px"] {
  background: linear-gradient(90deg, var(--ruleG) 0%, var(--ruleG) 100%) !important;
}

/* I3 #11a — a dull-red hairline was left standing on the bed between the topic
   field and the packet. MEASURED: it is a parlor CORE rule,
   `[style*="border-top: 1px solid var(--rule)"], hr`, which paints a fading
   rule out of `var(--a1)` — and --a1 is NOT flipped by THE SURFACE LAW, so
   every divider in the product wore the PAPER accent wherever it landed.
   Pointing it at --a1Text makes the one rule follow its surface: the accent
   on stock, the bed's own gold on the bed. */
.fl-root [style*="border-top: 1px solid var(--rule)"],
.fl-root hr,
body:not(:has(.fl-root)) [style*="border-top: 1px solid var(--rule)"],
body:not(:has(.fl-root)) hr {
  /* NO !important, deliberately: several of these elements ALSO carry an
     inline `background:` shorthand, whose implied `background-image: none` is
     what keeps the rule off them. An !important here forced the gradient onto
     those too — and since the same shorthand resets background-size, it tiled
     across the whole element instead of drawing a hairline (measured on the
     recipient mock's closing band). Higher specificity than the core rule is
     all this needs. */
  background-image: linear-gradient(90deg,
    color-mix(in oklab, var(--a1Text) 45%, transparent) 0%,
    color-mix(in oklab, var(--a1Text) 18%, transparent) 58%,
    transparent 100%);
}


/* ═══ E2 · PARLOR LEFTOVERS ═════════════════════════════════════════════════ */

/* I1 #10, I2 #9, I2 #23/24 — every corner that is still a Parlor corner.
   §2.2: --p-rad is 3px and there are exactly two exceptions — the submit knob
   (a circle) and the phone-frame ILLUSTRATION, which depicts a device. */
.fl-root .v2-frow.v2-pop2,
.fl-root .fl-hero-copy,
.fl-root .v2-pk-hint__k,
.fl-root .fl-in, .fl-root .fl-ed-wall,
.fl-root [style*="border-radius: 22px"]:not(.fl-rp-frame):not(.fl-pv-phone),
.fl-root [style*="border-radius: 20px"],
.fl-root [style*="border-radius: 18px"],
.fl-root [style*="border-radius: 16px"]:not([role="switch"]),
.fl-root [style*="border-radius: 14px"]:not([role="switch"]),
.fl-root [style*="border-radius: 12px"]:not([role="switch"]),
.fl-root [style*="border-radius: 10px"]:not([role="switch"]),
.fl-root [style*="border-radius: 999px"]:not([role="switch"]):not([style*="width: 42px"]):not(.fl-foot-pal *):not(.fl-side-pal *):not([title]),
body:not(:has(.fl-root)) .formdemo,
body:not(:has(.fl-root)) .fin,
body:not(:has(.fl-root)) .fbtn,
body:not(:has(.fl-root)) .sms-card {
  border-radius: var(--p-rad) !important;
}
/* …and the two that keep a radius on purpose */
.fl-root .v2-go,
.fl-root [style*="border-radius: 50%"] { border-radius: 50% !important; }
/* I1 #6, I3 #6 (BLOCK) — the switch keeps its 42x24 pill. Stated once, here,
   so no blanket tap-target or corner rule can ever square it off again. */
.fl-root [role="switch"],
.v2-door [role="switch"],
[role="switch"] {
  display: inline-block !important;
  width: 42px !important;
  height: 24px !important;
  min-height: 0 !important;
  min-width: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 999px !important;
}
.fl-root [role="switch"] > * { border-radius: 50% !important; }
/* the phone-frame illustration keeps a device corner; it depicts a phone */
.fl-root .fl-rp-frame { border-radius: 22px !important; }

/* I1 #11 / I2 #21 — the auth modal's brand panel. It joined the right-hand
   sheet at a 22px corner against a 3px one (a light triangular notch at the
   join), and it wore the ROOM's engraved botanical repeat. The repeat belongs
   to the bed; an object is never printed with the room's own ground. */
.v2-brand,
.v2-brand[style*="background: linear-gradient(160deg, var(--a1)"] {
  border-radius: var(--p-rad) 0 0 var(--p-rad) !important;
  background-image: linear-gradient(163deg,
    var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
  background-size: auto !important;
  background-repeat: no-repeat !important;
}

/* I2 #8 — the last gradient (brass) control faces. §1.2: one flat fill. */
.fl-root .fl-btn.fl-nav[style*="background: linear-gradient"],
.fl-root .fl-rp-acts button.fl-btn[style*="background: linear-gradient"],
.fl-root [style*="background: linear-gradient(176deg"],
.fl-root [style*="background: linear-gradient(174deg"] {
  background-image: none !important;
}


/* ═══ E3 · ONE OF EACH — THE CONSISTENCY PASS ═══════════════════════════════ */

/* I1 #13, I2 #15, I3 #4 — the footer card. Screens that render the PLAIN
   `.fl-about-foot` (home, create, Looponomics) got no tear, no phone tap
   padding and a --muted credit line, while the same footer as
   `.fl-about-foot.fl-foot-canvas` (respondent, survey, recipient, About) got
   all three. It is ONE object: same stock, same tear, same credit ink. */
.fl-about-foot,
.fl-foot-canvas {
  position: relative;
  padding: var(--g-s5) var(--g-s5) var(--g-s4) !important;
  box-shadow: var(--g-shadow-torn) !important;
}
.fl-about-foot :is(a, span, div, p, .fl-credit, .fl-about-foot-link),
.fl-about-foot [style*="color: var(--muted)"],
.fl-foot-canvas :is(a, span, div, p, .fl-credit, .fl-about-foot-link),
.fl-foot-canvas [style*="color: var(--muted)"] { color: var(--body) !important; }
@media (pointer: coarse), (max-width: 480px) {
  .fl-about-foot a, .fl-about-foot .fl-credit,
  .fl-foot-canvas a, .fl-foot-canvas .fl-credit { display: inline-block; padding-block: 9px; }
  .fl-about-foot .fl-about-foot-link,
  .fl-foot-canvas .fl-about-foot-link { min-height: 44px !important; }
}

/* I1 #21, I2 #5, I3 #10 — ONE on-bed colourway for the mark. It was wearing
   three: --a1 rings on the home hero (2.54:1 on green), cream on the rail and
   About, and a raw --eye ring with a cream pupil on the standalone pages. The
   rail/About treatment is the one that survives, and it is applied to every
   mark that stands on the bed: rings and lids --onCanvas, eye white the deep
   canvas, pupil --onCanvas, lid plate the same deep canvas so a blink reads. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-mlock .fl-lockup-card,
.fl-mlock .fl-lockup-card,
.fl-root > div[style*="width: 212px"] .fl-logo,
.fl-root > div[style*="width: 212px"] .fl-hero-logo,
.fl-root [style*="position: fixed"][style*="backdrop-filter"] .fl-logo,
.v2-brand .fl-logo, .v2-brand .fl-hero-logo,
body:not(:has(.fl-root)):has(.brand > a) .brand a {
  --logo: var(--onCanvas);
  --eye: var(--onCanvas);
  --glint: color-mix(in oklab, var(--canvas) 82%, black);
  --pupil: var(--onCanvas);
  --logoSoft: color-mix(in oklab, var(--canvas) 82%, black);
  /* the features stay the palette's own hue (the owner has rejected faces that
     lost their colour) but one step back toward the mark, so the brows read as
     part of the mark rather than as three loose strokes beside it */
  --face2: color-mix(in oklab, var(--a1OnCanvas) 46%, var(--onCanvas));
  --cheek: var(--a1OnCanvas);
  color: var(--onCanvas) !important;
}
/* the drawn ring is a stroke ATTRIBUTE on the hero mark, so the reverse has to
   be stated in its own right — the line parlor already runs for the rail */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo [stroke="var(--logo)"],
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo [stroke="var(--eye, var(--logo))"] {
  stroke: var(--onCanvas) !important;
}
/* the eye white's own edge is for PAPER; on the bed it would ring the pupil */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo svg [fill="var(--glint)"],
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo svg [fill="var(--glint)"],
.fl-root > div[style*="width: 212px"] .fl-logo svg [fill="var(--glint)"],
body:not(:has(.fl-root)):has(.brand > a) .brand a svg [fill="var(--glint)"] {
  stroke: none !important;
}

/* I2 #4 (BLOCK) — the engraved hatch ran ACROSS the drawn faces: the tile
   paints the hatch as its own ground, and a face drawn in outline lets every
   -52deg stroke through its eye rings, brows and mouth. The hatch is the
   WINDOW's ground, not the face's: each face gets a solid disc of stock
   directly behind it, so the hatch reads as the mount around the cameo. */
.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface { position: relative; }
.fl-ab-fig > svg, .fl-ab-figL > svg, .fl-ab-ctaface > svg {
  position: relative;
  z-index: 2;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix));
  border-radius: 50%;
}
.fl-root [style*="width: 74px"][style*="border-radius: 50%"] > svg,
.v2-door [style*="border-radius: 50%"][style*="background: rgb(255, 255, 255)"] > svg {
  position: relative;
  z-index: 2;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix));
  border-radius: 50%;
}
/* the rail cameo is 34px: a 5px hatch behind a mark that small is noise, and
   it read as a missing image (I1 nit). The mark stands on the rail itself. */
.fl-root > div[style*="width: 212px"] .fl-lockup-card,
.fl-root > div[style*="width: 212px"] .fl-logo {
  background-image: none !important;
  background-color: transparent !important;
  box-shadow: none !important;
  overflow: visible !important;
}

/* I1 #20 — ONE chip grammar. A chip is an outlined plant tag; the only filled
   one in the product is the selected state. `ANONYMOUS` was a filled green
   plaque next to outlined siblings, and `SUGGESTED FOR YOUR TOPIC` was a
   filled plaque next to a plain label. */
.fl-root [style*="border-radius: 999px"][style*="text-transform: uppercase"]:not(button):not(.fl-btn):not(.fl-lift *),
.fl-root .fl-rp-box [style*="text-transform: uppercase"][style*="background"] {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, currentColor 48%, transparent) !important;
}

/* I2 #14 — the sprig ornament was in three inks (--a2Text on create,
   --a1OnCanvas on About, --muted on .g-rule). One ink on the bed, one on
   stock. */
.g-rule::after { background-color: var(--a2Text) !important; }
.g-rule.on-bed::after,
.fl-scroll:has(.v2-sent) .ui-label::after,
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::before { background-color: var(--a1OnCanvas) !important; }

/* I2 #12 — the cool bounce. At 26% of --a3 the lower-left third of a DARK
   room read olive/teal. On a dark canvas it is a bounce, not a wash. */
[data-palette="ember"] .fl-root,
[data-palette="midnight"] .fl-root {
  background-image:
    var(--p-grain),
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 9%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
}

/* I2 #13 — the kraft alternation was ~5/255 in the dark rooms, and inverted.
   The second stock is a SHADE of the first: in a dark room a shade is lighter,
   or it is not visible at all. */
[data-palette="ember"], [data-palette="midnight"] {
  --sheet2: color-mix(in oklab, var(--sheet) 78%, var(--p-lit-mix));
}


/* ═══ E4 · THE TEAR (§3.4) ══════════════════════════════════════════════════
   I1 #12 (BLOCK-adjacent), I3 #5, I3 #11b. Three faults, one object:
     (a) a straight 1px rule ran ABOVE the bites on every torn object — the
         object's own inset hairline, drawn across the edge the tear opens;
     (b) the deep bite row repeated on a 23px period, so a 300px card carried
         fourteen identical scallops: a doily, not a tear;
     (c) where one packet followed another, the strip painted the PREVIOUS
         card's --boxGlow warm brown instead of the bed.
   (a) and (b) are fixed at source: the profile is now ONE token pair in
   fragment A (--g-bite-a, a 211px hand-cut silhouette against 31px/13px fine
   rows) shared by all four ::before implementations, and the objects take
   --g-shadow-torn / --g-shadow-deep-torn, which draw three sides only. What is
   left here is (c) — the z-order — and the ONE object the tear list forgot.  */

/* (a, measured) THE STRAIGHT RULE, found: the torn objects keep a 1px
   TRANSPARENT top border, and an absolutely positioned ::before is laid out
   against the PADDING box — so the strip started 1px down and the card's own
   cream showed as a hairline straight across the top of every tear. The edge a
   tear opens has no border. */
.g-torn, .fl-foot-canvas, .fl-about-foot,
.fl-pv-panel, .v2-svp__card, .fl-sheen, .ui-sheet,
body:not(:has(.fl-root)):not(.embed) .wrap > .card {
  border-top-width: 0 !important;
}
/* (c) raised above the object before it, so a neighbour's --boxGlow can never
   wash the bites warm brown. NOT the sheet: `.ui-sheet` is the app's FIXED
   modal (z 51, above its z-50 scrim) — pulling it into flow at z 1 dropped it
   BEHIND the scrim's backdrop blur, and "How it works" blurred the whole
   screen, card included (owner 2026-08-18). */
.g-torn, .fl-foot-canvas, .fl-about-foot,
.fl-pv-panel, .v2-svp__card, .fl-sheen,
body:not(:has(.fl-root)):not(.embed) .wrap > .card {
  position: relative;
  z-index: 1;
}

/* THE TEAR LIST (§3.4) — the footer card (both forms), the wizard packet, the
   onboarding sheet, the survey card, the standalone card and the preview
   panels. NOT the loop rows: five tears in a column is noise, and uniform rows
   are a law (LEAD decision on I1 #14). `.fl-about-foot` is the object the list
   forgot (I1 #13, I2 #15, I3 #4) — it now carries B3's strip. */
.fl-about-foot::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 9px;
  z-index: 6;
  pointer-events: none;
  background-color: var(--canvas);
  background-image:
    var(--p-grain),
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%);
  background-size: 128px 128px, auto, auto, var(--g-bed-repeat-size), auto, auto;
  background-repeat: repeat, no-repeat, no-repeat, repeat, repeat, no-repeat;
  background-attachment: fixed;
  background-blend-mode: soft-light, normal, normal, normal, normal, normal;
  -webkit-mask-image: var(--g-bite-a), var(--g-bite-b), var(--g-bite-c);
  -webkit-mask-size: var(--g-bite-size);
  -webkit-mask-position: var(--g-bite-pos);
  -webkit-mask-repeat: repeat-x, repeat-x, repeat-x;
  mask-image: var(--g-bite-a), var(--g-bite-b), var(--g-bite-c);
  mask-size: var(--g-bite-size);
  mask-position: var(--g-bite-pos);
  mask-repeat: repeat-x, repeat-x, repeat-x;
}
.fl-about-foot {
  box-shadow: var(--g-shadow-torn) !important;
}


/* ═══ E5 · TYPE ROLES ═══════════════════════════════════════════════════════ */

/* I1 #23 — a LABEL is never the italic voice. The `receive / provide`
   segmented control, `optional`, and the suggestion rows were all set in
   Newsreader italic; the voice is for sentences you read, not for words you
   press. The suggestion rows keep the voice, roman. */
.fl-root .v2-slot,
.fl-root [style*="width: min(248px, 100%)"] > button.fl-btn,
.fl-root [style*="width: min(248px, 100%)"] > button.fl-btn * { font-style: normal !important; }
.fl-root [style*="width: min(248px, 100%)"] > button.fl-btn {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 88, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t3) !important;
  letter-spacing: .015em !important;
}
.fl-root [style*="font-style: italic"][style*="color: var(--muted)"],
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] label [style*="font-style: italic"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-style: normal !important;
  font-size: var(--g-t1) !important;
  letter-spacing: .15em !important;
  text-transform: uppercase;
}
.fl-root [style*="border-left: 8px solid var(--a2)"] [style*="font-style: italic"],
.fl-root .fl-sug-row, .fl-root .fl-sug-row * { font-style: normal !important; }

/* I2 #7 — the longest reads belong to the voice (§4.4): the recipient's
   message body, the Looponomics row summaries, and the policy pages. */
.fl-root .fl-rp-box [style*="font: 400 15.5px"],
.fl-root .fl-rp-box p,
.fl-arrive [style*="font: 400 15.5px"],
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="font: 400 14px"],
body:not(:has(.fl-root)) .wrap .card p,
body:not(:has(.fl-root)) .wrap .card li {
  font-family: 'Newsreader', Georgia, serif !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  line-height: 1.6 !important;
  letter-spacing: .002em !important;
}

/* I2 #17 — the About page set whole body sentences in the DISPLAY role at
   heading size (24px Fraunces): "That is part of being real." is a sentence,
   not a heading. It becomes voice emphasis.
   Measured: the real headings are `h3.fl-ab-h`; the sentences are unclassed
   divs carrying `font-family: var(--font-display); font-weight: 500`, so the
   two are cleanly separable. */
.fl-root .fl-ab-lead,
.fl-root [style*="font-family: var(--font-display)"][style*="font-weight: 500"]:not(h1):not(h2):not(h3) {
  font-family: 'Newsreader', Georgia, serif !important;
  font-variation-settings: "opsz" 22 !important;
  font-weight: 500 !important;
  font-size: 20px !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
}


/* ═══ E6 · THE STANDALONE PAGES ═════════════════════════════════════════════ */

/* I2 #3 — paper is never darker than the room. --p-paper-lit is element-sized,
   so on a 3000px policy page its shade stop covered the lower third and the
   sheet measured darker than the bed for a thousand pixels. Tall stock takes
   the capped paper (A4 --g-paper-cap): lit at the top, flat --sheet after. */
body:not(:has(.fl-root)):not(.embed) .wrap > .card,
body:not(:has(.fl-root)):not(.embed) .wrap > .card.long {
  background-image: var(--g-fibre), var(--g-paper-cap) !important;
  background-size: var(--g-fibre-size), 100% 100% !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
}

/* I2 #2 — the standalone card had lost --p-shadow and with it the BOX-GLOW
   (LAW §3.7): parlor's own rule out-ranked B8's. parlor's rule is now removed
   by core-strip.json; this restates the object so privacy/terms/sms and
   survey.php agree. */
body:not(:has(.fl-root)):not(.embed) .wrap > .card {
  border-radius: var(--p-rad) !important;
  border: 0 !important;
}
/* I2 #28 — one --boxGlow across the standalone pages (privacy shipped 26%,
   survey.php 52%). The palettes' own value is the one. */
body:not(:has(.fl-root)) { --boxGlow: color-mix(in oklab, var(--a1) 44%, transparent); }
[data-palette="ember"] body:not(:has(.fl-root)) { --boxGlow: color-mix(in oklab, var(--ink) 26%, transparent); }

/* I2 #10 — the standalone palette picker was six raw saturated --a1 discs on
   cream. It is the SAME control as the app's: a solid --a1 disc with a
   hairline ring, the current one ringed in the accent. */
body:not(:has(.fl-root)) .fl-static-foot [title],
body:not(:has(.fl-root)) .palrow [title],
body:not(:has(.fl-root)) .pagefoot [title] {
  width: 28px !important;
  height: 28px !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 50% !important;
  background-image: none !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent) !important;
}


/* ═══ E7 · THE PALETTE PICKER — ONE SHAPE, FOUR PLACES ══════════════════════
   I1 #8 (BLOCK, LEAD DECISION), I2 #11, I3 #7. The picker shipped as four
   different objects: 3-4 vertical bands in the rail tray, rounded squares in
   the carded footer, circles in the full-bleed footer, and six hard-coded
   oklch() discs on the standalone pages that had nothing to do with the
   palettes at all — and in two rooms the CURRENT swatch was unmarked.
   ONE control everywhere: a solid disc of that room's --a1 inside a rim of
   that room's --canvas, so the swatch carries the room's two defining colours
   and six rooms are told apart at 22px; a hairline for definition against
   whatever it is lying on; and the current room ringed in the accent.
   28px on the phone inside a 44px hit area (I3 #7).
   The buttons carry NO class and NO usable inline hook — they are identified
   by their title, which is the room name in the app and the palette KEY on the
   standalone pages, so both forms are listed.                                */
.fl-root .fl-side-util button.fl-btn[title],
.fl-root .fl-foot-pal button[title],
.fl-root .fl-rp-pal button[title],
.fl-root .fl-static-foot button[title],
body:not(:has(.fl-root)) #sfPals button[title] {
  width: 22px !important;
  height: 22px !important;
  min-height: 0 !important;
  padding: 0 !important;
  flex: 0 0 auto;
  border: 0 !important;
  border-radius: 50% !important;
  background-image: none !important;
  background-size: auto !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important;
}
.fl-root .fl-foot-canvas button[title],
.fl-root .fl-about-foot button[title],
.fl-root .fl-rp-pal button[title],
body:not(:has(.fl-root)) #sfPals button[title],
body:not(:has(.fl-root)) .fl-static-foot button[title] {
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important;
}
/* the six rooms — LEAD revision after the fixer's a1-core disc: four of the
   six accents are reds, so a1-core discs were near-identical. Each disc now
   shows the room's BED (left half) and its STOCK (right half) inside a ring
   of its accent. Specificity: [title] repeated so these beat the generic
   picker rule above (0,3,1) at equal weight, later in source. */
.fl-root .fl-side-util button[title="Dusk"][title], .fl-root .fl-foot-pal button[title="Dusk"][title], .fl-root .fl-rp-pal button[title="Dusk"][title], .fl-root .fl-static-foot button[title="Dusk"][title], .fl-root button[title="Dusk"][title][title], body:not(:has(.fl-root)) #sfPals button[title="amethyst-night"][title], body:not(:has(.fl-root)) button[title="amethyst-night"][title][title] { background-color: #241A2E !important; background-image: linear-gradient(90deg, #241A2E 0 50%, #F7EAD4 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #A33A4A, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
.fl-root .fl-side-util button[title="Overcast"][title], .fl-root .fl-foot-pal button[title="Overcast"][title], .fl-root .fl-rp-pal button[title="Overcast"][title], .fl-root .fl-static-foot button[title="Overcast"][title], .fl-root button[title="Overcast"][title][title], body:not(:has(.fl-root)) #sfPals button[title="harbor"][title], body:not(:has(.fl-root)) button[title="harbor"][title][title] { background-color: #16242B !important; background-image: linear-gradient(90deg, #16242B 0 50%, #EFEDE2 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #A8482A, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
.fl-root .fl-side-util button[title="Late Light"][title], .fl-root .fl-foot-pal button[title="Late Light"][title], .fl-root .fl-rp-pal button[title="Late Light"][title], .fl-root .fl-static-foot button[title="Late Light"][title], .fl-root button[title="Late Light"][title][title], body:not(:has(.fl-root)) #sfPals button[title="meadow"][title], body:not(:has(.fl-root)) button[title="meadow"][title][title] { background-color: #1D2E23 !important; background-image: linear-gradient(90deg, #1D2E23 0 50%, #F3E8D0 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #A83C22, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
.fl-root .fl-side-util button[title="Afterglow"][title], .fl-root .fl-foot-pal button[title="Afterglow"][title], .fl-root .fl-rp-pal button[title="Afterglow"][title], .fl-root .fl-static-foot button[title="Afterglow"][title], .fl-root button[title="Afterglow"][title][title], body:not(:has(.fl-root)) #sfPals button[title="blush-study"][title], body:not(:has(.fl-root)) button[title="blush-study"][title][title] { background-color: #33211F !important; background-image: linear-gradient(90deg, #33211F 0 50%, #FBE9DE 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #AD5238, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
.fl-root .fl-side-util button[title="Lamplight"][title], .fl-root .fl-foot-pal button[title="Lamplight"][title], .fl-root .fl-rp-pal button[title="Lamplight"][title], .fl-root .fl-static-foot button[title="Lamplight"][title], .fl-root button[title="Lamplight"][title][title], body:not(:has(.fl-root)) #sfPals button[title="ember"][title], body:not(:has(.fl-root)) button[title="ember"][title][title] { background-color: #12100C !important; background-image: linear-gradient(90deg, #12100C 0 50%, #2A211A 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #E09A3C, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
.fl-root .fl-side-util button[title="Blue Hour"][title], .fl-root .fl-foot-pal button[title="Blue Hour"][title], .fl-root .fl-rp-pal button[title="Blue Hour"][title], .fl-root .fl-static-foot button[title="Blue Hour"][title], .fl-root button[title="Blue Hour"][title][title], body:not(:has(.fl-root)) #sfPals button[title="midnight"][title], body:not(:has(.fl-root)) button[title="midnight"][title][title] { background-color: #0B101C !important; background-image: linear-gradient(90deg, #0B101C 0 50%, #1C2233 50% 100%) !important; background-size: 100% 100% !important; box-shadow: inset 0 0 0 2px #8FAAD0, 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important; }
/* on stock the outer hairline is paper ink */
.fl-root .fl-foot-canvas button[title="Dusk"][title][title], .fl-root .fl-about-foot button[title="Dusk"][title][title], .fl-root .fl-rp-pal button[title="Dusk"][title][title], body:not(:has(.fl-root)) #sfPals button[title="amethyst-night"][title][title] { box-shadow: inset 0 0 0 2px #A33A4A, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }
.fl-root .fl-foot-canvas button[title="Overcast"][title][title], .fl-root .fl-about-foot button[title="Overcast"][title][title], .fl-root .fl-rp-pal button[title="Overcast"][title][title], body:not(:has(.fl-root)) #sfPals button[title="harbor"][title][title] { box-shadow: inset 0 0 0 2px #A8482A, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }
.fl-root .fl-foot-canvas button[title="Late Light"][title][title], .fl-root .fl-about-foot button[title="Late Light"][title][title], .fl-root .fl-rp-pal button[title="Late Light"][title][title], body:not(:has(.fl-root)) #sfPals button[title="meadow"][title][title] { box-shadow: inset 0 0 0 2px #A83C22, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }
.fl-root .fl-foot-canvas button[title="Afterglow"][title][title], .fl-root .fl-about-foot button[title="Afterglow"][title][title], .fl-root .fl-rp-pal button[title="Afterglow"][title][title], body:not(:has(.fl-root)) #sfPals button[title="blush-study"][title][title] { box-shadow: inset 0 0 0 2px #AD5238, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }
.fl-root .fl-foot-canvas button[title="Lamplight"][title][title], .fl-root .fl-about-foot button[title="Lamplight"][title][title], .fl-root .fl-rp-pal button[title="Lamplight"][title][title], body:not(:has(.fl-root)) #sfPals button[title="ember"][title][title] { box-shadow: inset 0 0 0 2px #E09A3C, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }
.fl-root .fl-foot-canvas button[title="Blue Hour"][title][title], .fl-root .fl-about-foot button[title="Blue Hour"][title][title], .fl-root .fl-rp-pal button[title="Blue Hour"][title][title], body:not(:has(.fl-root)) #sfPals button[title="midnight"][title][title] { box-shadow: inset 0 0 0 2px #8FAAD0, 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important; }

/* THE CURRENT ROOM — an accent ring, in all four places. The app does NOT set
   aria-pressed (measured: the attribute is empty on every swatch) and the
   standalone pages mark the current one with an inline 2px border that this
   rule's `border: 0` removes — so the marker is driven off the ROOT palette
   attribute instead, which is the one source that can never disagree. */
[data-palette="amethyst-night"] .fl-root button[title="Dusk"],
[data-palette="amethyst-night"] body:not(:has(.fl-root)) button[title="amethyst-night"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="amethyst-night"] .fl-root .fl-foot-canvas button[title="Dusk"],
[data-palette="amethyst-night"] .fl-root .fl-about-foot button[title="Dusk"],
[data-palette="amethyst-night"] .fl-root .fl-rp-pal button[title="Dusk"] { outline-color: var(--a1Text) !important; }
[data-palette="harbor"] .fl-root button[title="Overcast"],
[data-palette="harbor"] body:not(:has(.fl-root)) button[title="harbor"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="harbor"] .fl-root .fl-foot-canvas button[title="Overcast"],
[data-palette="harbor"] .fl-root .fl-about-foot button[title="Overcast"],
[data-palette="harbor"] .fl-root .fl-rp-pal button[title="Overcast"] { outline-color: var(--a1Text) !important; }
[data-palette="meadow"] .fl-root button[title="Late Light"],
[data-palette="meadow"] body:not(:has(.fl-root)) button[title="meadow"],
:root:not([data-palette]) .fl-root button[title="Late Light"],
:root:not([data-palette]) body:not(:has(.fl-root)) button[title="meadow"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="meadow"] .fl-root .fl-foot-canvas button[title="Late Light"],
[data-palette="meadow"] .fl-root .fl-about-foot button[title="Late Light"],
[data-palette="meadow"] .fl-root .fl-rp-pal button[title="Late Light"] { outline-color: var(--a1Text) !important; }
[data-palette="blush-study"] .fl-root button[title="Afterglow"],
[data-palette="blush-study"] body:not(:has(.fl-root)) button[title="blush-study"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="blush-study"] .fl-root .fl-foot-canvas button[title="Afterglow"],
[data-palette="blush-study"] .fl-root .fl-about-foot button[title="Afterglow"],
[data-palette="blush-study"] .fl-root .fl-rp-pal button[title="Afterglow"] { outline-color: var(--a1Text) !important; }
[data-palette="ember"] .fl-root button[title="Lamplight"],
[data-palette="ember"] body:not(:has(.fl-root)) button[title="ember"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="ember"] .fl-root .fl-foot-canvas button[title="Lamplight"],
[data-palette="ember"] .fl-root .fl-about-foot button[title="Lamplight"],
[data-palette="ember"] .fl-root .fl-rp-pal button[title="Lamplight"] { outline-color: var(--a1Text) !important; }
[data-palette="midnight"] .fl-root button[title="Blue Hour"],
[data-palette="midnight"] body:not(:has(.fl-root)) button[title="midnight"] {
  outline: 2px solid var(--a1OnCanvas) !important;
  outline-offset: 2px !important;
}
[data-palette="midnight"] .fl-root .fl-foot-canvas button[title="Blue Hour"],
[data-palette="midnight"] .fl-root .fl-about-foot button[title="Blue Hour"],
[data-palette="midnight"] .fl-root .fl-rp-pal button[title="Blue Hour"] { outline-color: var(--a1Text) !important; }

/* I2 #20 — the palette dots and the language row were rendered TWICE on the
   screens that have both a footer card and the rail's utility tray. The tray
   is the shell's and it is always there; the footer's copy stands down. */
/* …but ONLY where the rail is on screen. The tray is in the DOM on a phone too
   (the rail is collapsed there), and this rule was hiding the home page's only
   palette picker on phones (owner 2026-08-19: "palette selector and language
   options should always be together, on all pages, on all devices"). */
@media (min-width: 760px) {
  .fl-root:has(.fl-side-util) .fl-about-foot .fl-foot-pal,
  .fl-root:has(.fl-side-util) .fl-foot-canvas .fl-foot-pal { display: none !important; }
}


/* ═══ E8 · THE ABOUT PAGE ═══════════════════════════════════════════════════ */

/* I1 #19, I2 #16 — the float run-around. Each paragraph beside a figure plate
   wrapped BACK UNDER it, so line 2 started 116px left of line 1 and every
   section read as a mid-paragraph indent. The prose block becomes its own
   formatting context: it sits beside the plate and never flows under it. */
.fl-root .fl-ab-fig ~ :is(div, p, h2, h3, h4, ul, ol),
.fl-root .fl-ab-figL ~ :is(div, p, h2, h3, h4, ul, ol),
.fl-root .fl-ab-body {
  display: flow-root;
  overflow: visible;
}
.fl-root .fl-ab-fig, .fl-root .fl-ab-figL { margin-bottom: var(--g-s4) !important; }

/* I1 #20 — the About value chips wore two grounds and three inks between five
   siblings. A chip is one object: no ground, one hairline, one ink. */
.fl-root .fl-ab-chip {
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  color: var(--a1Text) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 42%, transparent) !important;
}
/* …and the respondent's `ANONYMOUS` was a filled green plaque between two
   outlined siblings (a Garden regression, I1 #20). Same grammar as its
   neighbours; the word carries the emphasis, not a fill. */
.fl-root .fl-arr-chips > span:nth-of-type(2) {
  background: none !important;
  background-color: transparent !important;
  color: var(--a3Text) !important;
  border-color: color-mix(in oklab, var(--a3Text) 52%, transparent) !important;
}

/* I1 #22, I2 nit 30, I3 nit — the recipient / auth face puck was a pure #fff
   disc on dark stock. §5.14: the face sits in a window of the room's own
   stock, with the engraved hatch behind it. */
.fl-root [style*="width: 74px"][style*="border-radius: 50%"],
.fl-root [style*="background: rgb(255, 255, 255)"][style*="border-radius: 50%"],
.v2-door [style*="border-radius: 50%"][style*="background: rgb(255, 255, 255)"] {
  background-color: var(--sheet) !important;
  /* the hatch is the MOUNT, not the face: a flat stock disc in the middle, the
     engraving only in the ring around it (I2 #4) */
  background-image:
    radial-gradient(circle at 50% 50%,
      color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) 0 62%,
      transparent 63%),
    var(--g-hatch) !important;
  background-size: auto, auto !important;
  background-repeat: no-repeat, repeat !important;
  box-shadow:
    inset 0 0 0 2px color-mix(in oklab, var(--ink) 24%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}

/* I3 #9 — a stray 38x4 brass bar was pinned to the top-left of the auth sheet
   (a grab handle that never got centred). A handle is centred or it is not a
   handle.
   MEASURED: the handle is in normal flow, so `left`/`transform` cannot centre
   it — `margin-inline: auto` on a block does. */
.fl-root .ui-sheet__grab,
.v2-door .ui-sheet__grab,
.ui-sheet__grab {
  display: block !important;
  position: static !important;
  width: 38px !important;
  margin-inline: auto !important;
  transform: none !important;
  background: color-mix(in oklab, var(--ink) 22%, transparent) !important;
  background-image: none !important;
}

/* I1 #22, I2 #5/#30 — the auth door's own face puck is a 94px pure-white disc.
   Same object as the recipient's: a window of the room's stock with the
   engraved hatch as its mount, and the drawing on a solid disc of its own. */
/* MEASURED at 390: the handle is `.v2-door::before` (40x4, position: sticky,
   left: auto), not `.ui-sheet__grab`. A block in flow centres with margins. */
.v2-door::before {
  display: block !important;
  margin-inline: auto !important;
  align-self: center !important;   /* the door is a flex column: margins alone
                                      do not centre a sticky item across it */
  left: auto !important;
  right: auto !important;
  transform: none !important;
  background-color: color-mix(in oklab, var(--ink) 22%, transparent) !important;
  background-image: none !important;
  border-radius: var(--g-rad-sm) !important;
}
.v2-door .v2-brand__face,
.v2-door .v2-door__face,
.v2-door__face,
.fl-root .v2-brand__face {
  background-color: var(--sheet) !important;
  /* the hatch is the MOUNT, not the face: a flat stock disc in the middle, the
     engraving only in the ring around it (I2 #4) */
  background-image:
    radial-gradient(circle at 50% 50%,
      color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) 0 62%,
      transparent 63%),
    var(--g-hatch) !important;
  background-size: auto, auto !important;
  background-repeat: no-repeat, repeat !important;
  box-shadow:
    inset 0 0 0 2px color-mix(in oklab, var(--ink) 24%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.v2-door .v2-brand__face > *,
.v2-door .v2-door__face > *,
.v2-door__face > *,
.fl-root .v2-brand__face > * {
  position: relative;
  z-index: 2;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix));
  border-radius: 50%;
}


/* ═══ E9 · REDUCED MOTION — fragment E's own selectors ══════════════════════ */
@media (prefers-reduced-motion: reduce) {
  .fl-root .v2-go,
  .fl-root .v2-ask[data-sec="hero-ask"] .v2-go { transition: none !important; }
  .fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn { transition: none !important; }
}


/* ═══ E10 · 390 — fragment E's own selectors ════════════════════════════════ */
@media (max-width: 480px) {
  /* I3 #8 — three page gutters at 390 (18px / 8px / 0). One gutter: 16px. */
  .fl-root .fl-scroll { padding-left: var(--g-s4) !important; padding-right: var(--g-s4) !important; }
  .fl-root .fl-pv-wrap { padding: 0 var(--g-s4) 92px !important; }
  .fl-root .fl-about-foot,
  .fl-root .fl-foot-canvas {
    margin-left: var(--g-s4) !important;
    margin-right: var(--g-s4) !important;
    width: auto !important;
    padding: var(--g-s4) var(--g-s4) var(--g-s3) !important;
  }

  /* I3 #2 — the recipient mock is capped to the space the bar leaves it */
  .fl-root .fl-rp-frame {
    width: 100% !important;
    height: min(874px, calc(100dvh - 168px)) !important;
  }

  /* I3 #13 — the phone's nav and status vocabulary has an 11px floor. Below
     that a tracked small-cap is decoration, not a label. */
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn { font-size: 11px !important; }
  .fl-root [style*="border-radius: 999px"][style*="text-transform: uppercase"],
  .fl-root .ui-label,
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"],
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] button.fl-btn { font-size: 11px !important; }

  /* I3 #7 — 28px swatch inside a 44px hit area */
  .fl-root [class*="-pal"] [title] {
    width: 28px !important;
    height: 28px !important;
    background-clip: padding-box !important;
    border: 8px solid transparent !important;
    box-sizing: content-box !important;
  }

  /* I3 #15 — 40px touch floor on the filter controls */
  .fl-scroll:has(.v2-sent) .v2-slot,
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn { min-height: 40px; }

  /* I1 #7 / I3 #3 — the toast still clears the bar on a phone */
  .fl-root:has(> [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"])
    [style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"] {
    bottom: calc(84px + env(safe-area-inset-bottom, 0px)) !important;
    max-width: calc(100vw - 32px) !important;
  }
}


/* LEAD, review-1 fix round · loop-row timestamps in the two dark palettes measured
   4.02:1 on the (lighter) kraft rows — the quiet ink is one step too quiet there. */
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="font: 500 11.5px"],
[data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="font: 500 11.5px"] {
  color: var(--body) !important;
}

/* LEAD, review-1 fix round · the respondent/recipient phone frame: the fixer
   capped the frame's height on phones (I3 #2) but the inner content column had
   min-height:auto and centred content, so it overflowed and the closing band
   ("Create your own Loop") was clipped out of the frame entirely — invisible,
   and measured against the bed by the review. The content column scrolls
   inside the frame; the band keeps its place at the foot. */
.fl-root .fl-rp-frame > div > [style*="flex: 1 1 0%"][style*="flex-direction: column"] {
  min-height: 0 !important;
  overflow-y: auto !important;
  justify-content: flex-start !important;
}

/* LEAD, review-1 fix round · the account/profile band (R1: bed-deep) — the
   "Unverified"/status pill inside it paints `color-mix(rule, sheet)` inline,
   which list C reads as stock, but a chip rule strips its ground, leaving
   paper ink on the deep band (1.75:1). Inside the band everything is a bed
   object: bed inks, and the pill gets a bed-chip ground. */
.fl-root [style*="background-color: var(--brand"] {
  --ink: var(--onCanvas); --body: var(--onCanvasBody); --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas); --a2Text: var(--a2OnCanvas); --a3Text: var(--a3OnCanvas);
}
.fl-root [style*="background-color: var(--brand"] [style*="background: color-mix(in oklab, var(--rule)"] {
  --ink: var(--onCanvas); --body: var(--onCanvasBody); --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas); --a2Text: var(--a2OnCanvas); --a3Text: var(--a3OnCanvas);
  color: var(--a2OnCanvas) !important;
  background: color-mix(in oklab, var(--onCanvas) 12%, transparent) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important;
}

/* FOLLOW-UP (2026-08-18) · the two home demo cards carry their engraved plates
   (§5.6.1: --g-plate-3 on the first, --g-plate-4 on the second) — a 32px
   engraved mark in the ink of the card's own stock, top-right, behind nothing.
   No markup needed after all: the pair are the two .ui-card siblings that
   follow the [data-sec="demo"] head. */
.fl-scroll [data-sec="demo"] + div > .ui-card { position: relative; }
.fl-scroll [data-sec="demo"] + div > .ui-card::after {
  content: ""; position: absolute; top: 18px; right: 18px; width: 32px; height: 32px;
  pointer-events: none; opacity: .9;
  background-color: var(--ink);
  -webkit-mask-image: var(--g-plate-3); mask-image: var(--g-plate-3);
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
}
.fl-scroll [data-sec="demo"] + div > .ui-card:nth-child(2)::after {
  -webkit-mask-image: var(--g-plate-4); mask-image: var(--g-plate-4);
}
@media (max-width: 480px) {
  .fl-scroll [data-sec="demo"] + div > .ui-card::after { width: 26px; height: 26px; top: 14px; right: 14px; }
}

/* ═══ OWNER 2026-08-18 (live feedback) ════════════════════════════════════ */

/* "i don't like the bullet points in front of the nav bar items, remove them." */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav::after { content: none !important; }
.fl-root .fl-nav::after { content: none !important; }

/* "why are there squares around all the faces?" — the plate window is gone.
   Every drawn face sits on a ROUND disc of stock (the app's own puck), no
   hatch, no square: About figures, the CTA face, the rail cameo, the recipient
   and auth pucks. The faces themselves are untouched. */
.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface {
  border-radius: 50% !important;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent), var(--p-shadow) !important;
  padding: 10px !important;
  shape-outside: circle(56%) !important;
}
.fl-ab-fig > svg, .fl-ab-figL > svg, .fl-ab-ctaface > svg { background: none !important; }
.fl-root [style*="width: 74px"][style*="border-radius: 50%"],
.fl-root [style*="background: rgb(255, 255, 255)"][style*="border-radius: 50%"],
.v2-door [style*="border-radius: 50%"][style*="background: rgb(255, 255, 255)"],
.v2-door .v2-brand__face, .v2-door .v2-door__face, .v2-door__face, .fl-root .v2-brand__face {
  background-image: none !important;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) !important;
  border-radius: 50% !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent), 0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] > [style*="border-radius: 50%"] {
  border-radius: 50% !important;
  background-image: none !important;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-lit-mix)) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent) !important;
}
/* the loop-row mark and the promise numerals keep their plate (they are
   glyph plates, not faces) — unchanged. */

/* "can't read text on this page" — the Looponomics EMPTY STATE (samples
   hidden, no loops yet). The app paints it `background: var(--sheet)` inline,
   so THE SURFACE LAW restored paper inks on it, while fragment D drew it as a
   composition ON THE BED (no ground). It is a bed object: bed inks. */
/* specificity: list C's sheet hook is (0,7,0)+ — this must out-rank it, not just follow it */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] .fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"][style*="background: var(--sheet)"],
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] {
  --ink: var(--onCanvas); --body: var(--onCanvasBody); --muted: var(--onCanvasBody);
  --a1Text: var(--a1OnCanvas); --a2Text: var(--a2OnCanvas); --a3Text: var(--a3OnCanvas);
  --rule: var(--ruleG);
  background: transparent !important;
  border-color: color-mix(in oklab, var(--onCanvas) 22%, transparent) !important;
}
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] .ui-d3 { color: var(--onCanvas) !important; }
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] > [style*="font: 400 14px"] { color: var(--onCanvasBody) !important; }
/* the buttons inside stay stock (they paint their own sheet) — the ghost
   "Show samples" beside the primary is a bed link */
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] button.fl-btn[style*="background: transparent"],
.fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] button.fl-btn[style*="background: none"] { color: var(--a1OnCanvas) !important; }

/* "about page doesn't need language selector on bottom of page. it's already
   in nav bar footer. on mobile and tablet, it should be same as on other
   pages" — whenever the rail's utility tray is on screen (desktop, ≥ 760px)
   the carded footer's palette + language rows are duplicates: hidden. Below
   that (no rail) the footer keeps them, as every other page does. */
@media (min-width: 760px) {
  .fl-root:has(> div[style*="width: 212px"] .fl-side-util) .fl-foot-canvas .fl-foot-pal,
  .fl-root:has(> div[style*="width: 212px"] .fl-side-util) .fl-foot-canvas .fl-foot-lang,
  .fl-root:has(> div[style*="width: 212px"] .fl-side-util) .fl-about-foot .fl-foot-pal,
  .fl-root:has(> div[style*="width: 212px"] .fl-side-util) .fl-about-foot .fl-foot-lang { display: none !important; }
}


/* "remove the symbol in front of 'Authenticity can be uncomfortable…'" — the
   callout's margin rule is gone; the sentence stands on the sheet alone. */
.fl-root .fl-ab-quote > div { padding-left: 0 !important; }
.fl-root .fl-ab-quote > div::before { content: none !important; }
/* the empty state's "Reset filters" chip: a bed chip (ghost ring, bed ink) —
   not a filled stock chip with bed ink on it (1.33:1, review 2026-08-18) */
.fl-root [style*="flex: 1 1 0%"][style*="overflow: hidden"] .fl-scroll:has(.v2-sent) > [style*="border: 1px dashed var(--rule)"] .ui-chip {
  background: color-mix(in oklab, var(--onCanvas) 8%, transparent) !important;
  background-image: none !important;
  color: var(--onCanvas) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--onCanvas) 30%, transparent) !important;
  border-color: transparent !important;
}

/* the kind chips on the draft cards (REQUEST / PROVIDE / SURPRISE) — the core
   tints them at 16% and inks them with --aNText; on Dusk stock the a3 ink
   measured 4.49:1 (needs 4.5). Every kind chip leans a little toward the ink
   of its surface — one family, one nudge (design review 2026-08-18). */
[style*="border-radius: 999px"][style*="text-transform: uppercase"][style*="background: var(--a1)"] { color: color-mix(in oklab, var(--a1Text) 84%, var(--ink)) !important; }
[style*="border-radius: 999px"][style*="text-transform: uppercase"][style*="background: var(--a2)"] { color: color-mix(in oklab, var(--a2Text) 84%, var(--ink)) !important; }
[style*="border-radius: 999px"][style*="text-transform: uppercase"][style*="background: var(--a3)"] { color: color-mix(in oklab, var(--a3Text) 84%, var(--ink)) !important; }

/* phone footer targets — the legal links and the credit measured 26/31px at
   390 once the relief band lifted them clear of the tab bar (design review
   2026-08-18): 40px rows, text centred in them */
@media (pointer: coarse), (max-width: 759px) {
  .fl-root .fl-about-foot a, .fl-root .fl-foot-canvas a,
  .fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit {
    display: inline-flex !important; align-items: center !important;
    min-height: 40px !important; padding-block: 0 !important;
  }
}

/* owner 2026-08-18: About page, desktop — "Real connection starts with
   something real." on ONE line; shrink if need be. The headline's wrapper is
   an inline-size container, so the size follows the column exactly:
   6cqi × 744px = 44.6px at the widest column, and it scales down with the
   column (at 702px → 42px, which fits). Phones keep the wrap. */
@media (min-width: 760px) {
  .fl-scroll:has(> [style*="padding: 26px 0px 6px"]) [style*="text-align: center; margin-top: 22px"] { container-type: inline-size; }
  .fl-scroll:has(> [style*="padding: 26px 0px 6px"]) [style*="text-align: center; margin-top: 22px"] > [style*="font-size: clamp(34px, 5vw, 48px)"] {
    white-space: nowrap !important;
    font-size: min(44px, 5.95cqi) !important;
    letter-spacing: -.015em !important;
  }
}

/* owner 2026-08-18: "the 'go' button seems more prominent and noticeable than
   the 'continue' button. should be the reverse." The mix bar's Go (fresh
   suggestions) wore the same printed vermilion as the step's Continue. One
   primary per view: Go becomes a quiet outlined pill in the accent ink; the
   filled Continue (dimmed only while there is nothing to continue with) is the
   thing the eye lands on. Both wizards (ask + send). */
.fl-root button.fl-btn[style*="padding: 12px 16px"][style*="background: var(--a1)"][style*="font: 600 12.5px"] {
  background: transparent !important;
  background-image: none !important;
  color: var(--a1Text) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a1) 72%, transparent), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  font-variation-settings: "wdth" 88, "wght" 650;
  letter-spacing: .04em !important;
  text-transform: uppercase;
  font-size: var(--g-t2) !important;
  padding: 0 18px !important;
}
@media (hover: hover) {
  .fl-root button.fl-btn[style*="padding: 12px 16px"][style*="background: var(--a1)"][style*="font: 600 12.5px"]:hover {
    background: color-mix(in oklab, var(--a1) 10%, transparent) !important;
    box-shadow: inset 0 0 0 1.5px var(--a1), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}

/* ═══ E9 · ONE CARD (owner 2026-08-18: "2 different styles of loop cards…
   uniform look/feel for all cards, with different colors and icons and labels
   for the different types, but same basic card layout") ═══════════════════ */

/* THE DRAFT CARD IS A ROW. The app renders a draft as a stock wrapper around
   its own .fl-lift with a header line (kind chip · time · Delete), a title and
   a meta line. It now lays out like the loop rows: an engraved plate at the
   left (a pencil — the draft's own glyph), the title beside it, the meta under
   the title, and a foot line with the DRAFT stamp + kind chip on the left and
   time · DELETE (an action word, like ARCHIVE) on the right. */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] {
  border-left-width: 1px !important;
  border-color: color-mix(in oklab, var(--inkS) 14%, transparent) !important;
  border-radius: var(--p-rad) !important;
  padding: 15px 30px 15px 15px !important;
  margin-bottom: 12px !important;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] {
  display: grid !important;
  grid-template-columns: 56px minmax(0, 1fr);
  grid-template-areas: "mark title" "mark meta" "mark foot";
  column-gap: 18px; row-gap: 7px;
  align-items: start;
  padding: 0 !important;
}
/* the plate: a disc, the pencil engraved on it */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::before {
  content: ""; grid-area: mark; align-self: start;
  width: 48px; height: 48px; border-radius: 50%;
  background-color: color-mix(in oklab, var(--inkS) 6%, transparent);
  background-image: var(--g-hatch);
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 26%, transparent), inset 0 1px 0 color-mix(in oklab, white 30%, transparent);
  position: relative;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::after {
  content: ""; grid-area: mark; align-self: start; justify-self: start;
  width: 48px; height: 48px; margin: 0;
  background-color: var(--inkS); opacity: .9;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20view%42ox='0%200%2048%2048'%3E%3Cpath%20d='M15%2033l1.6-5.2L29.4%2015a2.4%202.4%200%200%201%203.4%203.4L20%2031.2%2015%2033z'%20fill='none'%20stroke='%23000'%20stroke-width='2'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M27.6%2016.8l3.4%203.4'%20stroke='%23000'%20stroke-width='2'%2F%3E%3C%2Fsvg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20view%42ox='0%200%2048%2048'%3E%3Cpath%20d='M15%2033l1.6-5.2L29.4%2015a2.4%202.4%200%200%201%203.4%203.4L20%2031.2%2015%2033z'%20fill='none'%20stroke='%23000'%20stroke-width='2'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M27.6%2016.8l3.4%203.4'%20stroke='%23000'%20stroke-width='2'%2F%3E%3C%2Fsvg%3E");
  -webkit-mask-size: 48px 48px; mask-size: 48px 48px;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  pointer-events: none;
}
/* the header line becomes the FOOT line */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > div[style*="justify-content: space-between"] {
  grid-area: foot; margin: 0 !important; min-width: 0;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > [style*="font: 600 14px"] {
  grid-area: title; margin-top: 0 !important;
  white-space: normal !important; overflow: visible !important;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden !important;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > [style*="font: 400 12.5px"] {
  grid-area: meta; margin-top: 0 !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: var(--g-t1) !important;
  line-height: 1.3 !important;
  letter-spacing: .155em !important;
  text-transform: uppercase;
  color: var(--body) !important;
  white-space: normal !important;
}
/* the DRAFT stamp — the draft's own label, before its kind chip */
.fl-scroll:has(.v2-sent) .fl-draft-mark {
  display: inline-flex; align-items: center;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700; font-size: 10px; letter-spacing: .18em; text-transform: uppercase;
  color: var(--a1Text);
  padding: 4px 8px 3px; border-radius: 999px;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1) 55%, transparent);
  transform: rotate(-3deg);
  margin-right: 2px;
}
/* the time and the Delete: the loop rows' foot vocabulary */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] [style*="font: 500 11.5px"] {
  font-family: 'IBM Plex Mono', ui-monospace, monospace !important;
  font-size: 11px !important; letter-spacing: .06em !important;
  color: var(--muted) !important;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"] {
  background: transparent !important; border-color: transparent !important; box-shadow: none !important;
  border-radius: var(--p-rad) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important; font-size: 10px !important; letter-spacing: .15em !important;
  text-transform: uppercase;
  color: var(--body) !important;
  padding: 6px 8px !important; min-height: 32px !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:hover {
    background: color-mix(in oklab, var(--ink) 7%, transparent) !important; color: var(--a1Text) !important;
  }
}

/* ONE SAMPLE STAMP for every card. The loop rows signed their specimen down
   the trim edge in 9px, which nobody saw ("in the list, not marked as demo");
   the draft cards threw a 40px diagonal slab across the title. Same object,
   same place, same face: a small struck stamp in the top-right corner of the
   card, tilted the way a rubber stamp lands. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"],
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > [style*="rotate(-8deg)"] {
  position: absolute !important; left: auto !important; right: 12px !important; top: 10px !important; bottom: auto !important;
  transform: rotate(-6deg) !important; transform-origin: center !important;
  writing-mode: horizontal-tb !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 80, "wght" 700 !important;
  font-weight: 700 !important; font-size: 9.5px !important; line-height: 1 !important;
  letter-spacing: .26em !important; text-transform: uppercase;
  color: color-mix(in oklab, var(--a2Text) 82%, var(--ink)) !important;
  opacity: 1 !important;
  padding: 4px 7px 3px 9px; border-radius: 999px;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 55%, transparent);
  background: color-mix(in oklab, var(--sheet) 70%, transparent);
  pointer-events: none;
  white-space: nowrap;
}
/* the loop rows keep their right padding clear of the stamp */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > [style*="font: 600 14px"] { padding-right: 64px; }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"] { padding-right: 180px !important; }

/* THE CHAT ROW's meta is a sentence (the last reply), not a label — the
   uppercase small-cap treatment set "MY BROTHER: I DIDN'T WANT TO HEAR…" in
   four crammed lines (owner: "clumsy and sloppy and crammed together"). It
   reads in the voice, one line, ellipsised. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-chat="true"] > div > [style*="font: 400 12.5px"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-variation-settings: "opsz" 18 !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 14px !important;
  line-height: 1.4 !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
  color: var(--body) !important;
  white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;
  max-width: 100%;
}
@media (max-width: 480px) {
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] { grid-template-columns: 44px minmax(0, 1fr); column-gap: 12px; }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::before,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::after { width: 40px; height: 40px; -webkit-mask-size: 40px 40px; mask-size: 40px 40px; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"],
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > [style*="rotate(-8deg)"] { right: 8px !important; top: 8px !important; }
}

/* the three screens with no .fl-scroll (respondent · recipient · survey) let
   the DOCUMENT scroll, and nothing reserves the mobile bar's 70px — the footer's
   bottom band (the flowerbed) sat behind the bar (found by the flowerbed
   builder 2026-08-18). The dashboard's .fl-scroll already pads 92px. */
@media (max-width: 759px) {
  .fl-root:not(:has(.fl-scroll)) .fl-about-foot,
  .fl-root:not(:has(.fl-scroll)) .fl-foot-canvas { margin-bottom: calc(92px + env(safe-area-inset-bottom, 0px)) !important; }
}



/* ═══ GARDEN FRAGMENT frag-f-light.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT F — THE LIGHT (owner 2026-08-18)
   "some representation of sunlight on every page … glow light effect on top
   side, and shadow effect on other side … light work and shadow work."
   One sun, high and to the right; one shade, low and to the left. Painted
   as two FIXED pseudo-layers on the room (they do not scroll — light doesn't),
   in the room's own sun tint; every sheet of stock is lit along its top edge
   and casts its shadow away from the sun. Subtle by design: the sun never
   lifts the bed enough to cost a text its contrast (measured by the review),
   the shade never buries one.
   The room element carries isolation:isolate (fragment B) so z-index:-1 puts
   both layers UNDER content but OVER the bed paint. `position: fixed` on a
   pseudo-element of .fl-root is safe: .fl-root has no transform/filter, so
   the layers are viewport-fixed and never trap anything.
   ═══════════════════════════════════════════════════════════════════════════ */

/* the sun's tint per room (light/time names only): warm gold in the warm rooms,
   pale gold in Overcast, peach in Afterglow, amber in Lamplight, moon-silver
   in Blue Hour. --shade is the room's own dark, cooled a step. */
:root                          { --g-sun: #F2CE7A; --g-sun-a: .30; --g-shade: #06100B; --g-shade-a: .44; }
[data-palette="amethyst-night"] { --g-sun: #F1C98A; --g-sun-a: .30; --g-shade: #0E0714; --g-shade-a: .46; }
[data-palette="harbor"]         { --g-sun: #F3E3B8; --g-sun-a: .26; --g-shade: #060E14; --g-shade-a: .44; }
:root:not([data-palette]), [data-palette="meadow"] { --g-sun: #F2CE7A; --g-sun-a: .30; --g-shade: #06100B; --g-shade-a: .44; }
[data-palette="blush-study"]    { --g-sun: #F7CBA4; --g-sun-a: .30; --g-shade: #140A08; --g-shade-a: .44; }
[data-palette="ember"]          { --g-sun: #F0B25C; --g-sun-a: .26; --g-shade: #000000; --g-shade-a: .50; }
[data-palette="midnight"]       { --g-sun: #DCE6F6; --g-sun-a: .20; --g-shade: #02040A; --g-shade-a: .50; }

/* ── the sun and the shade on the room ──────────────────────────────────── */
.fl-root::before, .fl-root::after {
  content: "" !important;
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: -1;
}
/* the sun: high, right, warm — a wide soft bloom that leaves the working
   column mostly untouched and lights the upper right of every screen */
.fl-root::before {
  background:
    radial-gradient(66% 48% at 82% -10%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 100%), transparent) 0%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 48%), transparent) 40%,
      transparent 74%),
    linear-gradient(180deg,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 30%), transparent) 0%,
      transparent 22%);
  mix-blend-mode: screen;
}
/* the shade: low, left, cool — where the light does not reach */
.fl-root::after {
  background:
    radial-gradient(64% 52% at 6% 108%,
      color-mix(in oklab, var(--g-shade) calc(var(--g-shade-a) * 100%), transparent) 0%,
      color-mix(in oklab, var(--g-shade) calc(var(--g-shade-a) * 40%), transparent) 42%,
      transparent 74%),
    linear-gradient(0deg,
      color-mix(in oklab, var(--g-shade) calc(var(--g-shade-a) * 35%), transparent) 0%,
      transparent 26%);
  mix-blend-mode: multiply;
}
/* the two dark rooms: the sun reads more as a lamp than as daylight — a
   touch tighter so it does not grey the whole upper field */
[data-palette="ember"] .fl-root::before, [data-palette="midnight"] .fl-root::before {
  background:
    radial-gradient(44% 34% at 86% -6%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 100%), transparent) 0%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 40%), transparent) 40%,
      transparent 70%);
}

/* ── the same daylight on the standalone pages ─────────────────────────── */
body:not(:has(.fl-root)):not(.embed) { position: relative; isolation: isolate; }
body:not(:has(.fl-root)):not(.embed)::before, body:not(:has(.fl-root)):not(.embed)::after {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: -1;
}
body:not(:has(.fl-root)):not(.embed)::before {
  background:
    radial-gradient(52% 40% at 84% -8%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 100%), transparent) 0%,
      color-mix(in oklab, var(--g-sun) calc(var(--g-sun-a) * 45%), transparent) 38%,
      transparent 72%);
  mix-blend-mode: screen;
}
body:not(:has(.fl-root)):not(.embed)::after {
  background:
    radial-gradient(64% 52% at 6% 108%,
      color-mix(in oklab, var(--g-shade) calc(var(--g-shade-a) * 100%), transparent) 0%,
      color-mix(in oklab, var(--g-shade) calc(var(--g-shade-a) * 40%), transparent) 42%,
      transparent 74%);
  mix-blend-mode: multiply;
}

/* ── stock is lit from the sun: a bright hairline along its top edge, and its
   contact shadow falls away from the light (down and to the LEFT) ─────── */
:root {
  --p-shadow:
    inset 0 1px 0 color-mix(in oklab, white 42%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    -6px 14px 26px -20px color-mix(in oklab, var(--ink) 82%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent);
}
[data-palette="ember"], [data-palette="midnight"] {
  --p-shadow:
    inset 0 1px 0 color-mix(in oklab, var(--g-sun) 22%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent),
    -6px 14px 26px -18px rgba(0, 0, 0, .85),
    0 16px 42px -10px var(--boxGlow, transparent);
}
/* the loop rows and cards that restate their own shadow follow the same sun */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"],
.fl-root .ui-card, .fl-root .v2-loop, .fl-root .v2-com__card, .fl-root .fl-pv-panel,
.fl-foot-canvas, .fl-about-foot, .v2-ask, .ui-sheet {
  box-shadow: var(--p-shadow) !important;
}
/* the rail paints transparent over the room, so the room's sun and shade
   already reach it — nothing to restate. */

@media (prefers-reduced-motion: reduce) { /* light does not move; nothing to reduce */ }
@media (max-width: 480px) {
  /* phones: same light, a little quieter — the field is small */
  .fl-root::before { opacity: .8; }
  .fl-root::after { opacity: .85; }
}



/* ═══ GARDEN FRAGMENT frag-g-curve.css ═══ */

/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT G — THE CURVE (owner 2026-08-18: "move away from all the hard
   corner square shapes. nature doesn't have right angles… embrace the nature
   theme. except for footers — planter boxes — with flowers and plants sprouting
   from them, different on the different pages.") + the toggle switches rebuilt.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── the corner tokens: soft everywhere ─────────────────────────────────── */
:root { --p-rad: 18px; --g-rad-sm: 12px; --g-rad-in: 16px; }

/* controls are pills; inputs and the ask tray are soft; cards are 18px */
.fl-root button.fl-btn:not([role="switch"]):not(.fl-lift):not([style*="border-radius: 50%"]):not(.fl-side-util *):not([style*="position: fixed"][style*="bottom: 0"] *),
.v2-door button, .ui-sheet .ui-btn, button.fl-primary, .fl-root .fl-nav {
  border-radius: 999px !important;
}
.fl-root .fl-side-util button.fl-btn { border-radius: 999px !important; }
.fl-root input:not([type="checkbox"]):not(.v2-lknm):not([type="radio"]), .fl-root textarea, .fl-root select, .fl-root .fl-in, .v2-door input, .v2-door textarea, .ui-input, .ui-textarea, .ui-select {
  border-radius: var(--g-rad-in) !important;
}
.v2-ask, .v2-ask input, .v2-ask[data-sec="hero-ask"] { border-radius: 999px !important; }
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn { border-radius: 999px !important; }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"], .fl-root .ui-card, .fl-root .v2-loop, .fl-root .v2-com__card, .fl-root .v2-ph, .fl-root .card,
.fl-root .fl-pv-panel, .ui-sheet, .v2-svp__card, .fl-root .fl-sheen, .fl-root .fl-rp-box, .fl-root .fl-arr-promises,
.fl-root [style*="border-radius: 12px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button),
.fl-root [style*="border-radius: 14px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button),
.fl-root [style*="border-radius: 16px"][style*="border: 1px solid var(--rule)"]:not(input):not(textarea):not(select):not(button),
.fl-root [style*="border: 1.5px solid var(--rule)"] { border-radius: var(--p-rad) !important; }
.v2-door, .fl-root .fl-rp-frame { border-radius: 26px !important; }
.v2-brand { border-radius: 26px 0 0 26px !important; }
/* chips, stamps, badges, status pills — pills */
.fl-root .ui-chip, .fl-root .fl-ab-chip, .fl-root [style*="border-radius: 999px"], .fl-root [style*="text-transform: uppercase"][style*="padding: 4px 8px"],
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span[style*="border-radius: 999px"] { border-radius: 999px !important; }
/* glyph plates become discs */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]),
.fl-root .fl-pv-ic { border-radius: 50% !important; }
/* the toast, the keycap, the segmented control */
.fl-root [style*="position: fixed"][style*="bottom: 28px"][style*="background: var(--ink)"] { border-radius: 999px !important; }
.v2-pk-hint__k { border-radius: 8px !important; }
/* THE PLANTER BOXES stay boxy — the one right angle in the garden */
.fl-foot-canvas, .fl-about-foot, body:not(:has(.fl-root)) .wrap > .card, body:not(:has(.fl-root)) .pagefoot .pill { border-radius: 3px !important; }

/* ── the toggle switch, rebuilt (owner: "not good, too hard to see and
   understand"): a 46×26 pill track, a paper knob, the accent when on ─────── */
.fl-root [role="switch"], .v2-door [role="switch"] {
  display: inline-block !important; position: relative !important;
  width: 46px !important; height: 26px !important; min-height: 26px !important; min-width: 46px !important;
  padding: 0 !important; margin: 0 !important; flex: none !important;
  border-radius: 999px !important;
  background: color-mix(in oklab, var(--ink) 18%, var(--sheet)) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 30%, transparent), inset 0 2px 3px color-mix(in oklab, var(--ink) 12%, transparent) !important;
  transition: background .18s ease, box-shadow .18s ease !important;
  cursor: pointer;
}
.fl-root [role="switch"][aria-checked="true"], .v2-door [role="switch"][aria-checked="true"] {
  background: var(--cta) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--cta) 70%, black), inset 0 2px 3px rgba(0,0,0,.18) !important;
}
.fl-root [role="switch"] > span, .v2-door [role="switch"] > span {
  position: absolute !important; top: 3px !important; left: 3px !important;
  width: 20px !important; height: 20px !important;
  border-radius: 50% !important;
  background: var(--sheet) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,.35), inset 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent) !important;
  transform: translateX(0) !important;
  transition: transform .18s ease !important;
}
.fl-root [role="switch"][aria-checked="true"] > span, .v2-door [role="switch"][aria-checked="true"] > span { transform: translateX(20px) !important; }
/* the switch inside a bed-flipped subtree keeps paper physics */
.fl-root [role="switch"] { --ink: var(--inkS); }   /* NEVER `--sheet: var(--sheet)` — a self-reference makes the property invalid and the whole switch transparent (live 08-18) */
/* THE OTHER SWITCH — the app's inline toggle (_togTrack: a 42×24 span with
   `background: var(--rule)` / `var(--a1)` when on, a `--ctaText` knob) sits on
   "Show on my profile", the access password row, the share-graphic options.
   It has no role attribute, so the pill-chip rule was swallowing it into a
   44px padded pill with a stranded knob (owner 2026-08-18: "those toggle
   buttons are ugly"). Same object, same physics as the switch above. */
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"] {
  display: inline-block !important; position: relative !important;
  width: 46px !important; height: 26px !important; min-height: 26px !important; min-width: 46px !important;
  padding: 0 !important; margin: 0 !important; flex: none !important;
  border-radius: 999px !important;
  background: color-mix(in oklab, var(--inkS) 18%, var(--sheet)) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 30%, transparent), inset 0 2px 3px color-mix(in oklab, var(--inkS) 12%, transparent) !important;
  transition: background .18s ease, box-shadow .18s ease !important;
  cursor: pointer;
}
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"][style*="background: var(--a1)"] {
  background: var(--cta) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--cta) 70%, black), inset 0 2px 3px rgba(0,0,0,.18) !important;
}
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"] > span {
  position: absolute !important; top: 3px !important; left: 3px !important;
  width: 20px !important; height: 20px !important;
  border-radius: 50% !important;
  background: var(--sheet) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,.35), inset 0 0 0 1px color-mix(in oklab, var(--inkS) 18%, transparent) !important;
  transform: translateX(0) !important;
  transition: transform .18s ease !important;
}
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"][style*="background: var(--a1)"] > span { transform: translateX(20px) !important; }




/* ═══ THE VINE (owner 2026-08-18) — requested loops grow one leaf per answer; three
   leaves = unlocked. FL_GROW_VINE stamps data-grow on the row; the vine is drawn
   as a background on the title cell's right end. Two colourways: for light stock
   and for the two dark rooms. ═══ */
:root {
  --g-vine-0: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%238C8478'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-dark-0: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-1: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%238C8478'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-dark-1: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-2: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%238C8478'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%238C8478'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-dark-2: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='1.3'%20stroke-dasharray='3%203.2'%20stroke-linejoin='round'%20opacity='.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-3: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%238C8478'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%236E9B62'%20stroke='%234F7A47'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%234F7A47'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-vine-dark-3: url("data:image/svg+xml,%3Csvg%20xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width='100'%20height='50'%20view%42ox='0%20-7%20100%2050'%3E%3Cpath%20d='M5%2033C24%2033%2038%2029%2050%2022%2062%2015%2076%209%2095%207'%20fill='none'%20stroke='%23B9AE9A'%20stroke-width='2'%20stroke-linecap='round'%2F%3E%3Cg%20transform='translate(28,30)%20rotate(58)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(54,20)%20rotate(-36)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3Cg%20transform='translate(78,10)%20rotate(-12)%20scale(.66)'%3E%3Cpath%20d='M0%200C0-9.5%207-17%2022-17%2022-6.5%2014%200%200%200Z'%20fill='%237BA765'%20stroke='%23CFE6BC'%20stroke-width='1.6'%20stroke-linejoin='round'%2F%3E%3Cpath%20d='M0%200C7-4.5%2015-11%2022-17'%20fill='none'%20stroke='%23CFE6BC'%20stroke-width='1.1'%20stroke-opacity='.85'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"] {
  position: relative;
  padding-right: 180px !important;
  min-height: 34px;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"]::after {
  /* the SVG viewport carries a 7px margin above and below the drawing — the
     leaf tips used to be sliced flat by the image's own edge (owner: "vine
     image on loop cards is being clipped") */
  content: ""; position: absolute; right: 74px; top: -9px; width: 96px; height: 48px;   /* right: 74px — clear of the SAMPLE stamp in the corner (frag-e E9) */
  background-repeat: no-repeat; background-size: contain; background-position: right center;
  pointer-events: none;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="0"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-0); }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="0"] > [style*="font: 600 14px"]::after, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="0"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-dark-0); }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-1); }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"] > [style*="font: 600 14px"]::after, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-dark-1); }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-2); }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"] > [style*="font: 600 14px"]::after, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-dark-2); }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-3); }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"] > [style*="font: 600 14px"]::after, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"] > [style*="font: 600 14px"]::after { background-image: var(--g-vine-dark-3); }
/* a "grown" row (3 = unlocked): the third leaf earns a small light of its own */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"] > [style*="font: 600 14px"]::after { filter: drop-shadow(0 0 6px color-mix(in oklab, #7BA765 55%, transparent)); }
@media (max-width: 620px) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"] { padding-right: 0 !important; padding-bottom: 34px !important; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"]::after { top: auto; bottom: -4px; right: auto; left: 0; background-position: left center; width: 80px; height: 40px; }
}



/* ═══ GARDEN FRAGMENT frag-i-vines.css ═══ */

/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT I — THE VINES (owner 2026-08-18: "on the homepage, in the
   demo that shows the processing icons, instead of computer blips, make it
   something nature oriented. vines growing and spreading.")

   Every waiting mark in the app is now a plant.
     .fl-shim   the skeleton bars → a tendril drawn along the bar, life inking
                itself in from left to right with a pale new-growth tip
     .fl-dot    the typing dots  → three seedlings rising in turn
     .fl-caret  the typing caret → one slim shoot standing where the text ends

   How it is built (and why it is safe):
   the BAR keeps a real, opaque background-color — the review's `graphic` check
   reads the mark's own fill and frag-d measured this exact pair — and a mask
   turns that fill into the tendril's silhouette. The advancing green is a
   pseudo-element INSIDE that mask, so the drawing is always fully present in
   pencil and only the life moves. Nothing ever blanks out, in any frame.

   THE LIGHT: growth runs left→right, toward the sun (top-right); the pale tip
   is the lit end, the mature stem behind it the shaded one.
   THE CURVE: no straight lines and no right angles anywhere in the drawing —
   the stem is a sine through the bar's centre, seamless across its tile.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── the inks. Naturals, declared as tokens (as THE LIGHT declares its sun),
   never a palette colour by hex. The two dark rooms get the lighter pair so
   the growth reads against a dark stock. ─────────────────────────────────── */
.fl-root {
  --g-vine-ink: #6E9B62;   /* mature growth — frag-g's leaf green, one vocabulary */
  --g-vine-lit: #A9CB8C;   /* new growth at the advancing tip */
  /* the plate: the tendril before the life reaches it. A drawn line carries far
     less area than the solid bar frag-d measured, so it is inked a step deeper
     than --g-shim (sheet 66%) — the review reads THIS value, and deeper is
     safer, not riskier. Mixing toward --muted still works in both directions:
     it darkens on paper and lightens in the two dark rooms. */
  --g-vine-plate: color-mix(in oklab, var(--sheet) 45%, var(--muted));
}
[data-palette="ember"] .fl-root, [data-palette="midnight"] .fl-root,
[data-palette="ember"].fl-root, [data-palette="midnight"].fl-root {
  --g-vine-ink: #8FBE76;
  --g-vine-lit: #CFE6BC;
}

/* the three tendril tiles — one drawing per bar in a stack, so a well of
   skeleton bars never reads as the same stamp repeated */
.fl-root {
  --g-tendril-a: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='288' height='22' view%42ox='0 0 288 22'%3E%3Cpath d='M0 11 Q24 7 48 11 T96 11 T144 11 T192 11 T240 11 T288 11' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round'%2F%3E%3Cg transform='translate(26,9.2) rotate(-3) scale(0.5)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(88,12.6) rotate(5) scale(0.38,-0.38)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(150,10.2) rotate(0) scale(0.45)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(214,9.4) rotate(-2) scale(0.42)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(262,12.9) rotate(3) scale(0.47,-0.47)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-tendril-b: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='288' height='22' view%42ox='0 0 288 22'%3E%3Cpath d='M0 11 Q24 7 48 11 T96 11 T144 11 T192 11 T240 11 T288 11' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round'%2F%3E%3Cg transform='translate(16,10.4) rotate(4) scale(0.4)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(74,12.8) rotate(-2) scale(0.49,-0.49)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(140,9.4) rotate(3) scale(0.43)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(206,9.6) rotate(-4) scale(0.38)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(252,12.4) rotate(1) scale(0.45,-0.45)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Ccircle cx='183' cy='10.8' r='1.9' fill='%23000'%2F%3E%3C%2Fsvg%3E");
  --g-tendril-c: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='288' height='22' view%42ox='0 0 288 22'%3E%3Cpath d='M0 11 Q24 7 48 11 T96 11 T144 11 T192 11 T240 11 T288 11' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round'%2F%3E%3Cg transform='translate(34,9.6) rotate(-4) scale(0.47)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(112,12.6) rotate(2) scale(0.44,-0.44)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(196,10.6) rotate(-1) scale(0.4)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(258,12.9) rotate(4) scale(0.49,-0.49)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cpath d='M162 11.2c6-1.4 8.4-4 7.4-6.8' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%2F%3E%3C%2Fsvg%3E");
  --g-sprout: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='18' height='22' view%42ox='0 0 18 22'%3E%3Cpath d='M9 22V9.5' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round'%2F%3E%3Cg transform='translate(9,14.5) rotate(-8) scale(0.42)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(9,17) rotate(8) scale(-0.38,0.38)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(9,9.8) rotate(-40) scale(0.26)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  --g-shoot: url("data:image/svg+xml,%3Csvg xmlns='http:%2F%2Fwww.w3.org%2F2000%2Fsvg' width='12' height='30' view%42ox='0 0 12 30'%3E%3Cpath d='M2.6 30V7.5' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'%2F%3E%3Cg transform='translate(2.6,16) rotate(-14) scale(0.4)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3Cg transform='translate(2.6,8.4) rotate(-48) scale(0.27)'%3E%3Cpath d='M0 0C0-9.5 7-17 22-17 22-6.5 14 0 0 0Z' fill='%23000'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}

/* ══ I1 · THE SKELETON BARS BECOME TENDRILS ═══════════════════════════════
   The bar's own fill (frag-d's measured pencil, unchanged) is masked into the
   tendril: the plate is always drawn. The tile repeats along the bar, so a
   60%-wide bar and a 97%-wide bar carry the same leaf size — and a 390px
   phone does not squash the drawing. */
.fl-root .fl-shim {
  position: relative;
  background-image: none !important;
  background-color: var(--g-vine-plate) !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  animation: none !important;
  -webkit-mask-image: var(--g-tendril-a);
          mask-image: var(--g-tendril-a);
  -webkit-mask-size: auto 100%; mask-size: auto 100%;
  -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x;
  -webkit-mask-position: 0 50%;  mask-position: 0 50%;
}
/* the life: a green that inks itself along the tendril, palest at the tip.
   It lives inside the bar's mask, so it can only ever fill the drawing. */
.fl-root .fl-shim::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: linear-gradient(90deg,
    var(--g-vine-ink) 0 58%,
    color-mix(in oklab, var(--g-vine-ink) 45%, var(--g-vine-lit)) 84%,
    var(--g-vine-lit) 100%);
  background-repeat: no-repeat;
  background-position: left center;
  background-size: 0% 100%;
  animation: g-vine-grow 3s var(--g-e-out) infinite;
  pointer-events: none;
}
@keyframes g-vine-grow {
  0%   { background-size: 0% 100%;   opacity: 1; }
  56%  { background-size: 104% 100%; opacity: 1; }
  78%  { background-size: 104% 100%; opacity: 1; }
  100% { background-size: 104% 100%; opacity: 0; }
}

/* a stack of bars grows in turn — the spread down the well — and each bar
   carries its own drawing and its own phase of the tile */
.fl-root .fl-shim + .fl-shim {
  -webkit-mask-image: var(--g-tendril-b); mask-image: var(--g-tendril-b);
  -webkit-mask-position: -22px 50%;       mask-position: -22px 50%;
}
.fl-root .fl-shim + .fl-shim + .fl-shim {
  -webkit-mask-image: var(--g-tendril-c); mask-image: var(--g-tendril-c);
  -webkit-mask-position: -47px 50%;       mask-position: -47px 50%;
}
.fl-root .fl-shim + .fl-shim + .fl-shim + .fl-shim {
  -webkit-mask-image: var(--g-tendril-a); mask-image: var(--g-tendril-a);
  -webkit-mask-position: -13px 50%;       mask-position: -13px 50%;
}
.fl-root .fl-shim + .fl-shim + .fl-shim + .fl-shim + .fl-shim {
  -webkit-mask-image: var(--g-tendril-b); mask-image: var(--g-tendril-b);
  -webkit-mask-position: -61px 50%;       mask-position: -61px 50%;
}
.fl-root .fl-shim + .fl-shim::before                               { animation-delay: .30s; }
.fl-root .fl-shim + .fl-shim + .fl-shim::before                    { animation-delay: .60s; }
.fl-root .fl-shim + .fl-shim + .fl-shim + .fl-shim::before         { animation-delay: .90s; }
.fl-root .fl-shim + .fl-shim + .fl-shim + .fl-shim + .fl-shim::before { animation-delay: 1.2s; }

/* ══ I2 · THE TYPING DOTS BECOME SEEDLINGS ════════════════════════════════
   Same ink the app already chose (--a1, already measured on every ground),
   only the shape and the motion change: each one rises from its baseline,
   holds, and softens back as the next comes up. */
.fl-root .fl-dot {
  display: inline-block !important;
  width: 9px !important;
  height: 11px !important;
  min-width: 9px;
  flex: none;
  border-radius: 0 !important;
  background: var(--a1) !important;
  -webkit-mask-image: var(--g-sprout);   mask-image: var(--g-sprout);
  -webkit-mask-size: 100% 100%;          mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;        mask-repeat: no-repeat;
  -webkit-mask-position: center bottom;  mask-position: center bottom;
  transform-origin: 50% 100%;
  animation: g-sprout 2.6s var(--g-e-out) infinite both !important;
  animation-delay: 0s !important;   /* the app sets .15s/.3s inline — restaged below */
}
.fl-root .fl-dot + .fl-dot             { animation-delay: .42s !important; }
.fl-root .fl-dot + .fl-dot + .fl-dot   { animation-delay: .84s !important; }
@keyframes g-sprout {
  0%   { transform: scaleY(.4); opacity: .3; }
  14%  { opacity: 1; }
  44%  { transform: scaleY(1.06); }
  56%  { transform: scaleY(1); }
  74%  { transform: scaleY(1); opacity: 1; }
  100% { transform: scaleY(.4); opacity: .3; }
}

/* ══ I3 · THE CARET BECOMES A SHOOT ═══════════════════════════════════════
   The stem sits on the mark's left edge, so the shoot still stands exactly
   where the typing has reached; the leaf unfurls into the open space after it. */
.fl-root .fl-caret {
  display: inline-block !important;
  width: 6px !important;
  height: 15px !important;
  background: var(--a1) !important;
  border-radius: 0 !important;
  -webkit-mask-image: var(--g-shoot);  mask-image: var(--g-shoot);
  -webkit-mask-size: 100% 100%;        mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;      mask-repeat: no-repeat;
  -webkit-mask-position: left bottom;  mask-position: left bottom;
  vertical-align: -3px;
  margin-left: 1px;
  transform-origin: 0% 100%;
  animation: g-shoot 1.9s var(--g-e-out) infinite both !important;
}
@keyframes g-shoot {
  0%   { transform: scaleY(.18); opacity: .34; }
  18%  { opacity: 1; }
  48%  { transform: scaleY(1.05); }
  60%  { transform: scaleY(1); }
  78%  { transform: scaleY(1); opacity: 1; }
  100% { transform: scaleY(.18); opacity: .34; }
}

/* ══ I4 · REDUCED MOTION — the finished plant, standing still ═════════════ */
@media (prefers-reduced-motion: reduce) {
  .fl-root .fl-shim::before {
    animation: none !important;
    background-size: 100% 100% !important;
    opacity: 1 !important;
  }
  .fl-root .fl-dot, .fl-root .fl-caret {
    animation: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
}

/* ══ I5 · 390 ══════════════════════════════════════════════════════════════
   The tile is tied to the bar's own HEIGHT, so a narrow phone bar needs no
   rescaling — the drawing is the same size it is at 1280. Only the phases are
   pulled in, so a 60%-wide bar on a 390px screen still opens on a leaf, and
   the seedlings come down a pixel to sit inside the tighter rows. */
@media (max-width: 480px) {
  /* the tile is tied to the bar's own height, so it needs no rescaling on a
     phone — only the phases are pulled in so a short bar still shows a leaf */
  .fl-root .fl-shim + .fl-shim         { -webkit-mask-position: -14px 50%; mask-position: -14px 50%; }
  .fl-root .fl-shim + .fl-shim + .fl-shim { -webkit-mask-position: -30px 50%; mask-position: -30px 50%; }
  .fl-root .fl-dot   { width: 8px !important; height: 10px !important; min-width: 8px; }
  .fl-root .fl-caret { width: 5px !important; }
}



/* ═══ GARDEN FRAGMENT frag-j-boxes.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT J — THE BOXES, hand-finished (owner 2026-08-18: "all of the
   content boxes … need more creative detail. little touches that make all the
   difference — showing that someone actually took the time").

   ONE decision, made once and carried everywhere: THE PLATE LINE.
   A letterpress plate leaves a bearer edge — a second hairline pressed a few
   points inside the trimmed edge of the sheet. Every box of stock in this app
   now carries one, 3px in from its own edge, following its own curve. The line
   is NOT uniform: its top and right runs catch the sun (fragment F: sun top
   right), its bottom and left runs are the shade. So the plate line is the
   light and the craft mark at once — one object, not two ornaments.

   Sheets that are TORN open along the top (fragment E's tear list) get the
   OPEN plate — three runs, no top one: a torn edge has no trimmed edge to bear.

   On the big sheets only, the plate line's SHADE corner is braced with a second
   short rule (two 40px legs, bottom left) — the corner mark a printer leaves on
   a ledger card. One mark, in the one corner the sun never reaches.

   And the boxes you can press (the loop rows, the draft cards) breathe: on
   hover the sheet rises 2px, its plate line brightens along the sun runs, its
   contact shadow lengthens down and to the LEFT (away from the sun) and the
   room's own --boxGlow warms and spreads under it. No fill is tinted and no
   ink moves — contrast on a hovered row measures exactly what it measures at
   rest (LAW 2), and --boxGlow never leaves a stack (LAW 4).

   Nothing here changes a layout metric: no padding, no width, no font size, no
   gap, no radius. Rows stay one size (design-review's consistency rule).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── J1 · the plate ink, per room ──────────────────────────────────────────
   Light rooms: the sun run is white lifted off the stock, the shade run is the
   stock's own ink. The two dark rooms take the room's --g-sun (fragment F) for
   the lit runs — white on a dark sheet reads as a scratch, not as light — and
   true black for the shade, because their ink IS light.
   Declared on :root so they carry the PAPER ink family everywhere (builder A:
   custom properties resolve where declared) — every object below is stock.   */
:root {
  --g-pl-in: 3px;                                              /* how far in the plate line sits */
  /* measured, not guessed: on meadow stock (232,222,200) these four land at
     roughly +11 / +6 / −15 / −9 against the sheet. The stock's ink is nearly
     black, so a shade run at the same PERCENT as a lit run reads three times
     louder — the numbers below are the balance, not a symmetry.              */
  --g-pl-lit:     color-mix(in oklab, white 46%, transparent); /* top run — the sun lands here */
  --g-pl-lit-2:   color-mix(in oklab, white 26%, transparent); /* right run — the sun rakes it */
  --g-pl-shade:   color-mix(in oklab, var(--ink) 8%, transparent);   /* bottom run — the shade */
  --g-pl-shade-2: color-mix(in oklab, var(--ink) 5%, transparent);   /* left run — half shade */
  /* CORRECTED 2026-08-19 (border audit, owner: "there are extra lines on some.
     i see other lines around the corners. this is very sloppy").
     The plate line used to be FOUR one-directional 1px inset shadows. A
     one-directional inset shadow on a ROUNDED box cannot make a clean line:
     it paints the band between the box and a copy of the box shifted 1px, so
     each run also throws a tapering crescent around the two corners it meets.
     At every corner two runs of DIFFERENT colour overlapped and then stopped
     dead — the bright top run hooked a third of the way down the left arc and
     terminated. That is what the owner saw: extra lines, corner scratches.
     The plate line is now ONE ring. Here it is a single uniform inset ring
     (perfectly concentric, so its corners cannot mismatch) — the fallback and
     the base; fragment O paints the LIGHT into it as a gradient ring masked to
     the same 1px band, which is the version everything ships with.
     --g-pl-lit / --g-pl-shade stay declared: fragment M's tray incision reads
     them for a STRAIGHT top edge, where a directional inset has no corner.   */
  --g-pl-line:  color-mix(in oklab, var(--ink) 11%, transparent);
  --g-plate:      inset 0 0 0 1px var(--g-pl-line);
  --g-plate-open: inset 0 0 0 1px var(--g-pl-line);
  /* the plate under the hand — the same ring, one stop firmer */
  --g-plate-lift: inset 0 0 0 1px color-mix(in oklab, var(--ink) 18%, transparent);
  /* the raised sheet: fragment F's stack, one step deeper and longer, still
     falling down-and-LEFT, still carrying the room's glow (LAW 4).
     Its light catch is a soft crown, not a 1px hairline: a blurred inset has
     no terminus, so it cannot leave a hook at the corners the way the old
     `inset 0 1px 0` did. */
  --g-lift-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 16%, transparent),
    inset 0 2px 5px -3px color-mix(in oklab, white 92%, transparent),
    -10px 22px 34px -18px color-mix(in oklab, var(--ink) 82%, transparent),
    0 22px 56px -8px var(--boxGlow, transparent);
}
[data-palette="ember"], [data-palette="midnight"] {
  --g-pl-lit:     color-mix(in oklab, var(--g-sun) 22%, transparent);
  --g-pl-lit-2:   color-mix(in oklab, var(--g-sun) 12%, transparent);
  --g-pl-shade:   rgba(0, 0, 0, .34);
  --g-pl-shade-2: rgba(0, 0, 0, .20);
  --g-pl-line:    color-mix(in oklab, var(--ink) 13%, transparent);
  --g-plate-lift: inset 0 0 0 1px color-mix(in oklab, var(--g-sun) 26%, transparent);
  --g-lift-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 16%, transparent),
    inset 0 2px 5px -3px color-mix(in oklab, var(--g-sun) 46%, transparent),
    -10px 22px 34px -16px rgba(0, 0, 0, .92),
    0 22px 56px -8px var(--boxGlow, transparent);
}

/* ── J2 · THE LOOP ROWS ────────────────────────────────────────────────────
   Fragment D deliberately emptied BOTH of this row's pseudo-elements (parlor's
   coloured spine ledge on ::before and its hover pool on ::after). ::before
   stays dead — reviving it revives the gold ledge, which D deleted on purpose
   and which is still declared in the core (parlor `width: 3px`, `left: 0`,
   `background: linear-gradient(--lx-spine)`; measured, not guessed). The plate
   line takes ::after, and explicitly puts back the two things parlor's pool
   set on it: a background and opacity: 0.                                    */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after {
  content: "" !important;
  position: absolute;
  inset: var(--g-pl-in);
  width: auto;
  background: none;
  opacity: 1;
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;                       /* the row's own children sit at z-index 1 */
  box-shadow: var(--g-plate);
  transition: box-shadow var(--g-t-hover) var(--g-e-out);
}
/* the draft card is a sheet of stock wrapping its own button — the plate line
   belongs to the SHEET, so drafts and loops carry the same edge */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift) {
  position: relative;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift)::before {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate);
  transition: box-shadow var(--g-t-hover) var(--g-e-out);
}

/* ── J3 · THE BREATH — hover, focus and press on the boxes you can press ───
   A press is a real thing happening to a sheet of paper: it lifts toward the
   light, its shadow lengthens away from the sun, its bearer edge catches. The
   fill is untouched, so every contrast measurement holds under the cursor.   */
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover {
    transform: translateY(-2px) !important;
    box-shadow: var(--g-lift-shadow) !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover::after {
    box-shadow: var(--g-plate-lift);
    opacity: 1;                     /* parlor's pool used this pseudo to fade in */
  }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover::before {
    box-shadow: var(--g-plate-lift);
  }
  /* the draft card holds ANOTHER .fl-lift inside it, and the app's own sheet
     still gives every bare `.fl-lift:hover` a 2px lift and a 1.5px accent ring
     (measured: `0 0 0 1.5px color-mix(--a1 55%, --sheet) !important`). Inside a
     draft that ring drew a vermilion rectangle inside the sheet and the two
     lifts stacked to 4px. ONE sheet lifts, and a sheet has no accent rim. */
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift) > .fl-lift[role="button"]:hover {
    transform: none !important;
    box-shadow: none !important;
  }
  /* the press: the sheet goes back down onto the bed, faster than it rose */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:active {
    transform: translateY(0) !important;
    box-shadow: var(--p-shadow) !important;
    transition-duration: var(--g-t-press) !important;
  }
}
/* keyboard: the plate line is what answers, plus the room's own bright ring —
   a row is a box, not a button, so it never borrows a button's fill */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:focus-visible::after {
  box-shadow: var(--g-plate-lift),
              inset 0 0 0 1px color-mix(in oklab, var(--a1) 62%, transparent);
  opacity: 1;
}

/* ── J4 · THE PANELS AND CARDS ─────────────────────────────────────────────
   .ui-card already carried a flat one-line lift on ::before from the app's own
   sheet (`inset 0 1px 0 var(--lift)`). Same slot, same job, finished: the line
   moves inboard to the plate position and gains its three other runs.        */
.ui-card::before {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  /* CORRECTED 2026-08-19: this was `border-radius: inherit`, which copies the
     card's OWN radius onto a ring sitting 3px inside it — the two curves are
     then 3px apart at the straights and a different shape at the corners, so
     the line crowds the corner and drifts off it. A plate line is concentric
     or it is nothing. --p-rad is the design token in and out of the room, so
     this is right on both sides of fragment G's normalisation.               */
  border-radius: max(0px, calc(var(--p-rad) - var(--g-pl-in)));
  pointer-events: none;
  box-shadow: var(--g-plate);
  transition: box-shadow var(--g-t-hover) var(--g-e-out);
}
/* inside the room every card IS 18px (fragment G), so the plate line can take
   the exact concentric curve rather than a slightly loose inherited one */
.fl-root .ui-card::before { border-radius: calc(var(--p-rad) - var(--g-pl-in)); }

/* the About callout — the one sentence the page stops on. Its plate line is
   the only thing that says a person set it. */
.fl-root .fl-ab-quote { position: relative; }
.fl-root .fl-ab-quote::before {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate);
}

/* the respondent frame and the boxes inside it (the promises, the head card):
   position:relative only — nothing inside them is absolutely positioned, and
   `relative` is never a containing block for a fixed overlay. */
.fl-root .fl-rp-frame, .fl-root .fl-rp-box { position: relative; }
.fl-root .fl-rp-frame::before {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  border-radius: calc(26px - var(--g-pl-in));   /* the frame's own curve (fragment G) */
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate);
}
.fl-root .fl-rp-box::before {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate);
}

/* the ask tray's plate line is a rim, on the same 3px, at the same weight.
   (::before there is the hero lamp, fragment C.)
   CORRECTED 2026-08-19: this was drawn at `border-radius: 999px` — a stadium
   ring inside a box whose real curve is --p-rad (18px in the room, measured).
   The two curves did not agree, so the ring bulged inward at every corner and
   read as a second, wrongly-shaped line around each one. It is concentric now,
   like every other plate line in the app.                                    */
.fl-root .v2-ask::after {
  content: "";
  position: absolute;
  inset: var(--g-pl-in);
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate);
}

/* ── J4b · THE CORNER RULE — REMOVED 2026-08-19 ───────────────────────────
   This drew a second, SHORTER rule inside the bottom-left corner of every big
   sheet: two 40px legs, 5px further in than the plate line. On paper it was a
   printer's brace. On screen, at 2x, it is a disconnected L with four visible
   stub ends floating inside the card, a second corner nested inside the first.
   It is the literal thing the owner meant by "i see other lines around the
   corners". A layered edge is ONE boundary plus ONE plate line — a third mark
   that starts and stops in mid-air is not craft, it is a scratch. Deleted; the
   craft now lives in the plate line's own light (fragment O), which travels
   the whole ring instead of interrupting it.                                 */

/* ── J5 · THE TORN SHEETS — the plate line under a tear ───────────────────
   The tear strip (fragment C/D/E) is painted on ::before at z-index 6 over the
   top 9px, so these take ::after and clear it.
   CORRECTED 2026-08-19: the ring used to have NO top run and SQUARE top
   corners. Two faults at 2x. (a) With no top run the left and right runs each
   began at a raw endpoint 11px below the tear — two stub ends per card, which
   is the second thing the owner was pointing at. (b) A square-cornered ring
   starting at y=11 inside an 18px curve passes within ~1.6px of the sheet's
   own edge at the top corners while sitting 3px in everywhere else — the line
   visibly kisses the edge and then walks away from it.
   The ring is CLOSED now and rounded on all four corners: a complete impressed
   rectangle that clears the tear, with no free end anywhere on it. Its head
   run sits in the lit half of the gradient (fragment O), so it reads as the
   light catching an impression, not as a drawn rule.                         */
.fl-root .fl-pv-panel:not([style*="display: none"])::after,
.fl-root .v2-svp__card::after,
.fl-root .fl-sheen::after,
.fl-root [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::after,
.ui-sheet::after {
  content: "";
  position: absolute;
  inset: 13px var(--g-pl-in) var(--g-pl-in);
  border-radius: calc(var(--p-rad) - var(--g-pl-in));
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate-open);
}
/* the standalone pages' card (privacy, terms, messaging) is torn too, and it
   is a PLANTER box — boxy corners (fragment G), so its plate line is boxy. */
body:not(:has(.fl-root)):not(.embed) .wrap > .card::after {
  content: "";
  position: absolute;
  inset: 13px var(--g-pl-in) var(--g-pl-in);
  border-radius: 1px;
  pointer-events: none;
  z-index: 0;
  box-shadow: var(--g-plate-open);
}

/* ── J6 · reduced motion ──────────────────────────────────────────────────
   The plate line is not motion — it stays, and so does the lift's LOOK; only
   the travel and the transition go. A hovered row still reads as hovered.    */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift)::before,
  .ui-card::before { transition: none !important; }
  /* the sheet does not travel — but it still reads as picked up: the deeper
     shadow and the caught edge are both static facts about light */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover {
    transform: none !important;
    box-shadow: var(--g-lift-shadow) !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover::after,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover::before {
    box-shadow: var(--g-plate-lift);
    opacity: 1;
  }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift) > .fl-lift[role="button"]:hover {
    transform: none !important;
    box-shadow: none !important;
  }
}

/* ── J7 · the phone ───────────────────────────────────────────────────────
   Small sheets, so the plate line moves in to 2px and loses a little weight —
   at 390 a 3px bearer edge on a 358px card reads as a double border. Nothing
   here grows a box: the line is drawn INSIDE, on a pointer-events:none layer.
   No hover exists on a phone (the block above is (hover: hover)); the tap
   targets are untouched.                                                     */
@media (max-width: 480px) {
  :root {
    --g-pl-in: 2px;
    --g-pl-lit:     color-mix(in oklab, white 28%, transparent);
    --g-pl-lit-2:   color-mix(in oklab, white 15%, transparent);
    --g-pl-shade:   color-mix(in oklab, var(--ink) 12%, transparent);
    --g-pl-shade-2: color-mix(in oklab, var(--ink) 7%, transparent);
  }
  [data-palette="ember"], [data-palette="midnight"] {
    --g-pl-lit:   color-mix(in oklab, var(--g-sun) 18%, transparent);
    --g-pl-lit-2: color-mix(in oklab, var(--g-sun) 10%, transparent);
  }
  .fl-root .fl-pv-panel:not([style*="display: none"])::after,
  .fl-root .v2-svp__card::after,
  .fl-root .fl-sheen::after,
  .fl-root [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::after,
  .ui-sheet::after,
  body:not(:has(.fl-root)):not(.embed) .wrap > .card::after {
    inset: 11px var(--g-pl-in) var(--g-pl-in);
  }
}



/* ═══ GARDEN FRAGMENT frag-k-buttons.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT K — THE BUTTONS AND THEIR STATES (the craft pass, 2026-08-18)
   Owner: "the buttons and the hover actions for all buttons — all need more
   creative detail. little touches that make all the difference."

   ONE STATE GRAMMAR, everywhere, so that pressing anything on this site feels
   like the same hand made it:

     rest    the object stands in THE LIGHT — the top edge and the RIGHT edge
             catch the sun (frag-f: sun top-right), the contact shadow falls
             down and to the LEFT, exactly as --p-shadow does for stock.
     hover   it lifts 1px, the caught light brightens one stop, the cast
             deepens and lengthens. 180ms, var(--g-e-out). Pointer only.
     active  it is PRESSED: 1px down, the cast collapses to a contact line and
             the face takes an inset deboss. var(--g-t-press).
     focus   the two-tone ring of §6.4 — restated here on every control whose
             own !important box-shadow was eating the dark half of it.

   plus one small reveal per family, never more than one:
     · a primary's glyph steps one notch toward the light
     · a chip's tint blooms out of its lit corner
     · a link / a language code / a filter word draws its own underline in
     · the rail's lit edge comes up under the label
     · a switch knob squashes into the press and settles on the spring

   WHAT IT DOES NOT DO
     no new geometry, no new inks, no size changes, no tap target smaller than
     it was, nothing on the paper panel, and --boxGlow stays in every stack it
     was already in (LAW).

   CASCADE NOTES (measured, not assumed)
     1. The app's own sheet ships `.fl-btn[style*="background: var(--cta)"]:hover
        { box-shadow: … !important }`. !important beats source order, so every
        face/shadow declaration for that family carries !important here too.
     2. `.v2-go` is NOT a `.fl-btn` and does not carry an inline background —
        the primary selectors below cannot reach it. It is handled on its own.
     3. THE RAIL NAV carries `background: var(--a1)` in its INLINE style when it
        is the lit row, so every primary selector below excludes `.fl-nav`: the
        rail is a column of labels, not a row of objects, and fragment B owns
        its plaque. (Measured in the probe: without the exclusion the lit rail
        row lifted 1px and took the primary's face.)
     4. Several `.fl-btn` inline-style variants use ::before/::after as INVISIBLE
        HIT-AREA EXPANDERS (`[style*="height: 32px"][style*="border-radius: 8px"]
        ::after{inset:-6px}`, `[style*="padding: 8px 12px"]::before`). Nothing
        here takes a pseudo-element on those: every touch on them is painted
        with background layers instead, so no tap target shrinks (§8.2 #8).
     5. The ask-flow rules carry parlor's ID-level `:is(:has(#fl-topic-main),…)`
        anchor (1,4,1); the focus rules for that column repeat it.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══ K1 · THE PRIMARY — a printed face turned toward the sun ═══════════════
   parlor/fragment C lit the face straight down (174deg). The room's light
   comes from the upper RIGHT, so the face is turned to meet it: the lit stop
   sits top-right, the shaded stop bottom-left, and the cast shadow steps 3px
   to the left. Same two colours, same flat ink — only the angle is decided.  */
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"],
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"],
.fl-root button.fl-btn:not(.fl-nav)[style*="background:var(--a1)"],
.fl-root button.fl-primary,
button.fl-primary,
.v2-door button.fl-primary,
.ui-sheet .ui-btn--primary,
.ui-sheet__actions .ui-btn--primary {
  background-image: linear-gradient(196deg,
    var(--g-face-hi) 0%, var(--cta) 56%, var(--g-face-lo) 100%) !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
    inset -1px 0 0 color-mix(in oklab, white 15%, transparent),
    -3px 9px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition:
    transform var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    filter var(--g-t-hover) var(--g-e-out),
    background-color var(--g-t-hover) var(--g-e-out) !important;
}
/* the glyph is ready to move before it moves */
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"] svg,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"] svg,
.fl-root button.fl-primary svg,
button.fl-primary svg,
.ui-sheet .ui-btn--primary svg {
  transition: transform var(--g-t-hover) var(--g-e-out);
}

@media (hover: hover) {
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"]:hover:not(:disabled),
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"]:hover:not(:disabled),
  .fl-root button.fl-primary:hover:not(:disabled),
  button.fl-primary:hover:not(:disabled),
  .v2-door button.fl-primary:hover:not(:disabled),
  .ui-sheet .ui-btn--primary:hover:not(:disabled),
  .ui-sheet__actions .ui-btn--primary:hover:not(:disabled) {
    transform: translateY(-1px) !important;
    filter: brightness(1.05);
    box-shadow:
      inset 0 1px 0 color-mix(in oklab, white 48%, transparent),
      inset -1px 0 0 color-mix(in oklab, white 24%, transparent),
      -5px 14px 24px -10px color-mix(in oklab, var(--cta) 92%, transparent),
      0 18px 46px -10px var(--boxGlow, transparent) !important;
  }
  /* THE ONE REVEAL: the mark steps toward the light it is walking into */
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"]:hover:not(:disabled) svg,
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"]:hover:not(:disabled) svg,
  .fl-root button.fl-primary:hover:not(:disabled) svg,
  button.fl-primary:hover:not(:disabled) svg,
  .ui-sheet .ui-btn--primary:hover:not(:disabled) svg { transform: translateX(2px); }
}

/* PRESSED — the face goes INTO the stock: the cast collapses to a contact
   line and the light that was on the top edge is now a debossed shadow. */
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"]:active:not(:disabled),
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"]:active:not(:disabled),
.fl-root button.fl-primary:active:not(:disabled),
button.fl-primary:active:not(:disabled),
.v2-door button.fl-primary:active:not(:disabled),
.ui-sheet .ui-btn--primary:active:not(:disabled),
.ui-sheet__actions .ui-btn--primary:active:not(:disabled) {
  transform: translateY(1px) !important;
  filter: brightness(.97);
  box-shadow:
    inset 0 2px 5px -2px color-mix(in oklab, black 44%, transparent),
    inset 0 -1px 0 color-mix(in oklab, white 14%, transparent),
    -1px 3px 7px -9px color-mix(in oklab, var(--cta) 88%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition-duration: var(--g-t-press), var(--g-t-press), var(--g-t-press), var(--g-t-press) !important;
}


/* ═══ K2 · THE SECONDARY AND THE SOCIAL KEYS — a cut edge in the light ══════
   The ring (fragment E's 46% ink, measured for 3:1 on the bed as well as on
   stock) is kept exactly; what is added is the sun on the right edge and a
   contact shadow falling left, so a ringed key sits ON its surface instead of
   being drawn on it. The label ink is not touched — contrast is measured.   */
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"],
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint1)"],
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint2)"],
.ui-sheet .ui-btn--secondary,
.ui-sheet__actions .ui-btn--secondary,
.v2-door .fl-soc,
.v2-door .v2-provs .fl-soc {
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 46%, transparent),
    inset -1px 1px 0 color-mix(in oklab, white 22%, transparent),
    -2px 6px 12px -11px color-mix(in oklab, var(--ink) 80%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition:
    transform var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    background-color var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"]:hover:not(:disabled),
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint1)"]:hover:not(:disabled),
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint2)"]:hover:not(:disabled),
  .ui-sheet .ui-btn--secondary:hover:not(:disabled),
  .ui-sheet__actions .ui-btn--secondary:hover:not(:disabled),
  .v2-door .fl-soc:hover,
  .v2-door .v2-provs .fl-soc:hover {
    transform: translateY(-1px) !important;
    background-color: color-mix(in oklab, var(--ink) 6%, transparent) !important;
    box-shadow:
      inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 62%, transparent),
      inset -1px 1px 0 color-mix(in oklab, white 30%, transparent),
      -4px 11px 18px -11px color-mix(in oklab, var(--ink) 84%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"]:active:not(:disabled),
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint1)"]:active:not(:disabled),
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint2)"]:active:not(:disabled),
.ui-sheet .ui-btn--secondary:active:not(:disabled),
.ui-sheet__actions .ui-btn--secondary:active:not(:disabled),
.v2-door .fl-soc:active {
  transform: translateY(1px) !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 58%, transparent),
    inset 0 2px 4px -2px color-mix(in oklab, var(--ink) 34%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition-duration: var(--g-t-press) !important;
}

/* the same key standing on the BED (the hero row) — same grammar, bed inks.
   Fragment C sets this ring at (0,4,1); the light-catch is restated at (0,5,1)
   rather than fought. */
.fl-scroll > [style*="padding: 24px 0px 8px"] button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"] {
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 38%, transparent),
    inset -1px 1px 0 color-mix(in oklab, var(--onCanvas) 20%, transparent) !important;
}
@media (hover: hover) {
  .fl-scroll > [style*="padding: 24px 0px 8px"] button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"]:hover:not(:disabled) {
    transform: translateY(-1px) !important;
    box-shadow:
      inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 62%, transparent),
      inset -1px 1px 0 color-mix(in oklab, var(--onCanvas) 30%, transparent),
      -4px 12px 20px -12px rgba(0, 0, 0, .8) !important;
  }
}


/* TWO OBJECTS IN THE LOOP COLUMN ARE NOT KEYS, and K2's ring reached them
   through their inline `background: var(--sheet)` (seen in preview: the search
   line became a box and HIDE SAMPLES became a pill). Fragment D drew them on
   purpose as a RULED LINE you write on and a TRACKED LABEL on a hairline —
   both are right, and both are restored here at a weight above K2. They do not
   lift either: a line that lifts is a line that wobbles.                     */
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn.fl-btn {
  box-shadow: inset 0 -1px 0 var(--ruleG) !important;
  transform: none !important;
}
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn {
  box-shadow: 0 1px 0 color-mix(in oklab, var(--a1OnCanvas) 52%, transparent) !important;
  transform: none !important;
}
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn.fl-btn:hover {
    box-shadow: inset 0 -1.5px 0 var(--a1OnCanvas) !important;
    color: var(--onCanvas) !important;
    transform: none !important;
  }
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn:hover {
    box-shadow: 0 1px 0 var(--onCanvas) !important;
    color: var(--onCanvas) !important;
    transform: none !important;
  }
}
.fl-scroll:has(.v2-sent) [style*="order: 4; flex-basis"] > button.fl-btn.fl-btn:active,
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn:active { transform: none !important; }


/* ═══ K3 · THE GHOSTS — no ground, so the light lands on the label ══════════
   A ghost has no face to light; its hover is C's tint plus the same 1px lift,
   and its press is a true press rather than a colour change.                */
@media (hover: hover) {
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: none"]:hover:not(:disabled),
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: transparent"]:hover:not(:disabled) {
    transform: translateY(-1px);
  }
}
.fl-root button.fl-btn:not(.fl-nav)[style*="background: none"]:active:not(:disabled),
.fl-root button.fl-btn:not(.fl-nav)[style*="background: transparent"]:active:not(:disabled) {
  transform: translateY(1px);
  transition-duration: var(--g-t-press) !important;
}
/* THE SENTENCE CONTROL is two ghosts lying on one printed segment ("I want to
   [receive|provide]"), and the chosen word is set in --ctaText ON the vermilion.
   MEASURED BUG (probe, meadow): the generic ghost hover painted `var(--tint1)`
   straight over the vermilion, leaving cream type on a pale tint (≈1.2:1), and
   a 1px lift would have walked the word off its own segment. Here the segment
   is what it looks like — a printed switch: the chosen word does nothing on
   hover, the other word darkens. Neither moves. */
.fl-root [style*="width: min(248px, 100%)"] button.fl-btn.fl-btn:hover:not(:disabled),
.fl-root [style*="width: min(248px, 100%)"] button.fl-btn.fl-btn:active:not(:disabled) {
  transform: none !important;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
}
@media (hover: hover) {
  .fl-root [style*="width: min(248px, 100%)"] button.fl-btn.fl-btn:not([style*="color: var(--ctaText)"]):hover:not(:disabled) {
    color: var(--ink) !important;
  }
}

/* the language codes are ghosts too, but they are a ROW of five: nothing in
   that row may move, or the row reads as broken type. (K10 gives them their
   own touch.) */
.fl-root .fl-foot-lang button.fl-btn:active,
.fl-root .fl-side-lang button.fl-btn:active,
.fl-root .fl-foot-lang button.fl-btn:hover,
.fl-root .fl-side-lang button.fl-btn:hover { transform: none !important; }

/* the destructive key: the same grammar, its own ink */
.fl-root button.fl-btn[style*="background: var(--warm)"] {
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 24%, transparent),
    inset -1px 0 0 color-mix(in oklab, white 12%, transparent),
    -2px 7px 13px -9px color-mix(in oklab, var(--warmDeep) 90%, transparent) !important;
  transition:
    transform var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    filter var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root button.fl-btn[style*="background: var(--warm)"]:hover:not(:disabled) {
    transform: translateY(-1px) !important;
    filter: brightness(1.05);
    box-shadow:
      inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
      inset -1px 0 0 color-mix(in oklab, white 18%, transparent),
      -4px 12px 20px -9px color-mix(in oklab, var(--warmDeep) 92%, transparent) !important;
  }
}
.fl-root button.fl-btn[style*="background: var(--warm)"]:active:not(:disabled) {
  transform: translateY(1px) !important;
  box-shadow: inset 0 2px 5px -2px color-mix(in oklab, black 42%, transparent) !important;
  transition-duration: var(--g-t-press) !important;
}

/* an UNLIT control never lifts and never presses — it has no light on it */
.fl-root button.fl-btn:disabled,
.fl-root button.fl-btn[style*="opacity: 0.5"],
.fl-root button.fl-btn[style*="cursor: default"] {
  transform: none !important;
  filter: none !important;
}


/* ═══ K4 · THE CHIPS — the tint blooms out of the lit corner ════════════════
   A plant tag hovered does not flip colour; warmth spreads across it from the
   corner the sun is on. One radial, grown with background-size, in the chip's
   OWN ink (currentColor), so it can never disagree with a palette and it
   costs no contrast worth measuring at 10%. Fragment C's chip hover already
   sets background-COLOR only, so the two layers compose.                    */
.fl-root .ui-chip {
  background-image: radial-gradient(closest-side circle at 100% 0%,
    color-mix(in oklab, currentColor 10%, transparent), transparent) !important;
  background-size: 0% 0% !important;
  background-position: 100% 0 !important;
  background-repeat: no-repeat !important;
  transition:
    background-size 260ms var(--g-e-out),
    background-color var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out),
    transform var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root .ui-chip:hover { background-size: 260% 260% !important; }
  .fl-root .v2-quick .ui-chip:hover { background-size: 260% 260% !important; }
}
.fl-root .ui-chip:active {
  transform: translateY(1px);
  transition-duration: var(--g-t-press) !important;
}
/* the ask-flow's category tags: same bloom, under parlor's ID-level anchor */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"] {
  transition:
    background-color var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out),
    transform var(--g-t-hover) var(--g-e-out) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"]:active {
  transform: translateY(1px);
  transition-duration: var(--g-t-press) !important;
}


/* ═══ K5 · THE ASK KNOB — a seed going in ═══════════════════════════════════
   Fragment C owns its face and its two transforms (it is absolutely centred,
   so every transform must carry the -50%). Added here: the cast agrees with
   the light, and on hover the arrow leads by 2px before the knob is pressed. */
.fl-root .v2-ask .v2-go,
.fl-root .v2-ask[data-sec="hero-ask"] .v2-go {
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 26%, transparent),
    -2px 9px 16px -10px color-mix(in oklab, var(--cta) 90%, transparent) !important;
}
.fl-root .v2-go svg { transition: transform var(--g-t-hover) var(--g-e-out); }
@media (hover: hover) {
  .fl-root .v2-go:hover:not(:disabled) svg { transform: translateX(2px); }
  .fl-root .v2-go:hover:not(:disabled) {
    box-shadow:
      inset 0 1px 0 color-mix(in oklab, white 36%, transparent),
      -4px 14px 22px -10px color-mix(in oklab, var(--cta) 92%, transparent) !important;
  }
}


/* ═══ K6 · THE ROW ACTION WORDS (DELETE · STOP · ARCHIVE · DECLINE) ════════
   10px tracked capitals in a reserved gutter. This fragment started by drawing
   a rule in under the word on hover — and then measured it: fragment E already
   owns them at (0,7,1) with `background: transparent !important` (and a tinted
   `background:` on hover), which resets any background layer put on them. E's
   drawing is right — a label in a gutter, tinted when you point at it — so it
   is left exactly as it is. What is added is only what E did not decide:
   the word does NOT lift with the pointer (the ROW is the object that lifts;
   two lifts inside one another read as a shiver), and it presses when clicked.
   They can take no pseudo either: the app uses ::after there as the hit-area
   expander, and touching it would shrink a 32px target.                      */
@media (hover: hover) {
  .fl-scroll:has(.v2-sent) .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:hover {
    transform: none !important;
  }
}
.fl-scroll:has(.v2-sent) .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:active {
  transform: translateY(1px) !important;
  transition-duration: var(--g-t-press) !important;
}


/* ═══ K7 · THE RAIL — the row catches the light ═════════════════════════════
   Fragment B owns the rail's plaque and its ink; fragment E retired the seed
   bullets on the owner's instruction ("remove them"), so nothing here touches
   `.fl-nav::after`. What a hovered plant label gets instead is the light: a
   hairline along its TOP edge, which is where the sun is. Selectors repeat B's
   container so they sit at the same weight and win on order.                 */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav {
  transition:
    background-color var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out),
    box-shadow var(--g-t-hover) var(--g-e-out),
    transform var(--g-t-press) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover:not([style*="background: var(--a1)"]):not([style*="background: var(--cta)"]) {
    box-shadow: inset 0 1px 0 color-mix(in oklab, var(--onCanvas) 18%, transparent) !important;
  }
  /* the lit plaque keeps its fill; its light simply comes up one stop */
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"]:hover,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"]:hover {
    box-shadow:
      inset 0 1px 0 color-mix(in oklab, white 30%, transparent),
      0 8px 18px -10px rgba(0, 0, 0, .95),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:active {
  transform: translateY(1px);
}


/* ═══ K8 · THE MOBILE BAR — a tab is pressed, not recoloured ════════════════ */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn {
  transition: color var(--g-t-hover) var(--g-e-out),
              background-color var(--g-t-hover) var(--g-e-out),
              transform var(--g-t-press) var(--g-e-out) !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn svg {
  transition: opacity var(--g-t-hover) var(--g-e-out),
              transform var(--g-t-hover) var(--g-e-out);
}
@media (hover: hover) {
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn:hover svg {
    opacity: .9;
    transform: translateY(-1px);
  }
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn:active {
  transform: translateY(1px);
}


/* ═══ K9 · THE PALETTE DISCS — a swatch picked up between two fingers ═══════
   Fragment E owns every disc's face and its two rings and states them with
   !important; nothing here touches those. Only `transform` is added, which E
   never sets, so the two rules cannot collide.                              */
.fl-root .fl-side-util button.fl-btn[title],
.fl-root .fl-foot-pal button[title],
.fl-root .fl-rp-pal button[title],
.fl-root .fl-static-foot button[title],
body:not(:has(.fl-root)) #sfPals button[title] {
  transition: transform 200ms var(--g-e-spring) !important;
}
@media (hover: hover) {
  .fl-root .fl-side-util button.fl-btn[title]:hover,
  .fl-root .fl-foot-pal button[title]:hover,
  .fl-root .fl-rp-pal button[title]:hover,
  .fl-root .fl-static-foot button[title]:hover,
  body:not(:has(.fl-root)) #sfPals button[title]:hover {
    transform: translateY(-1.5px) scale(1.12);
  }
}
.fl-root .fl-side-util button.fl-btn[title]:active,
.fl-root .fl-foot-pal button[title]:active,
.fl-root .fl-rp-pal button[title]:active,
.fl-root .fl-static-foot button[title]:active,
body:not(:has(.fl-root)) #sfPals button[title]:active {
  transform: translateY(0) scale(.94);
  transition-duration: var(--g-t-press);
}


/* ═══ K10 · THE LANGUAGE CODES — the underline draws in ═════════════════════
   The CURRENT code's underline is a MARKER, not a state (parlor's R-note), so
   it is never animated and never removed; the other four draw a rule in under
   themselves on hover, which is the same gesture the marker is holding still.
   Fragment B kills `background-image` on the rail row at (0,4,0) — this is
   written at (0,4,1)+ so it composes instead of fighting.                    */
.fl-root .fl-side-util .fl-side-lang button.fl-btn:not([style*="text-decoration: underline"]),
.fl-root .fl-foot-lang button.fl-btn:not([style*="text-decoration: underline"]) {
  background-image: linear-gradient(var(--a1OnCanvas), var(--a1OnCanvas)) !important;
  background-size: 0 1.5px !important;
  background-position: 50% calc(50% + .78em) !important;
  background-repeat: no-repeat !important;
  background-origin: content-box !important;
  transition: background-size 220ms var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out) !important;
}
.fl-root .fl-foot-lang button.fl-btn:not([style*="text-decoration: underline"]) {
  background-image: linear-gradient(var(--a1Text), var(--a1Text)) !important;
}
@media (hover: hover) {
  .fl-root .fl-side-util .fl-side-lang button.fl-btn:not([style*="text-decoration: underline"]):hover,
  .fl-root .fl-foot-lang button.fl-btn:not([style*="text-decoration: underline"]):hover {
    background-size: 100% 1.5px !important;
  }
  /* MEASURED BUG, fixed here because this fragment owns hover: the rail's
     language codes are ghosts, so fragment C's ghost hover was painting them
     `background: var(--tint1)` — a PAPER tint. On the rail that is a pale
     cream block under cream type (probe, meadow: ground rgb(236,216,192) under
     ink rgb(240,228,200) ≈ 1.05:1). On the bed a hover is a wash of the bed's
     own light, never a sheet of paper. */
  .fl-root .fl-side-util .fl-side-lang button.fl-btn:hover {
    color: var(--onCanvas) !important;
    background-color: color-mix(in oklab, var(--onCanvas) 10%, transparent) !important;
    background-image: linear-gradient(var(--a1OnCanvas), var(--a1OnCanvas)) !important;
  }
  .fl-root .fl-side-util .fl-side-lang button.fl-btn[style*="text-decoration: underline"]:hover {
    background-image: none !important;
  }
  .fl-root .fl-foot-lang button.fl-btn:hover { color: var(--ink) !important; }
}


/* ═══ K11 · LINKS — a line drawn under a word, by hand ══════════════════════
   Footer links, the credit and the little meta links. Same plate, same easing
   as the filter sentence's slots, so the whole site underlines the same way. */
.fl-root .fl-about-foot-link,
.fl-root .fl-foot-canvas a:not([style*="text-decoration: underline"]),
.fl-root .fl-about-foot a:not([style*="text-decoration: underline"]),
.fl-root .fl-credit,
.fl-root .v2-mlink,
body:not(:has(.fl-root)) .pagefoot a,
body:not(:has(.fl-root)) .fl-static-foot a {
  text-decoration: none;
  background-image: linear-gradient(currentColor, currentColor) !important;
  background-size: 0 1px !important;
  background-position: 0 calc(50% + .74em) !important;
  background-repeat: no-repeat !important;
  background-origin: content-box !important;
  transition: background-size 220ms var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root .fl-about-foot-link:hover,
  .fl-root .fl-foot-canvas a:not([style*="text-decoration: underline"]):hover,
  .fl-root .fl-about-foot a:not([style*="text-decoration: underline"]):hover,
  .fl-root .fl-credit:hover,
  .fl-root .v2-mlink:hover,
  body:not(:has(.fl-root)) .pagefoot a:hover,
  body:not(:has(.fl-root)) .fl-static-foot a:hover { background-size: 100% 1px !important; }
  /* the three policy links ARE underlined already (inline `text-decoration:
     underline`): a second rule drawn under them would be a mistake, so their
     own rule thickens and drops instead — the same gesture, on the line that
     is already there. */
  .fl-root .fl-foot-canvas a[style*="text-decoration: underline"]:hover,
  .fl-root .fl-about-foot a[style*="text-decoration: underline"]:hover {
    color: var(--ink) !important;
    text-decoration-thickness: 2px;
    text-underline-offset: 3.5px;
  }
}
.fl-root .fl-foot-canvas a[style*="text-decoration: underline"],
.fl-root .fl-about-foot a[style*="text-decoration: underline"] {
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
  transition: text-decoration-thickness 200ms var(--g-e-out),
              text-underline-offset 200ms var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out);
}


/* ═══ K12 · THE FILTER WORDS (.v2-fword) ════════════════════════════════════
   These are words, not pills: the chosen one is underlined in the accent by
   the app. The unchosen ones now answer the pointer with the same underline,
   drawn in thin — you can see what choosing would look like before you do it.
   `.on` is excluded so the marker is never animated out from under itself.  */
.fl-root .v2-fword:not(.on) {
  background-image: linear-gradient(color-mix(in oklab, var(--a1) 70%, transparent),
                                    color-mix(in oklab, var(--a1) 70%, transparent)) !important;
  background-size: 0 1.5px !important;
  background-position: 0 calc(100% - 1px) !important;
  background-repeat: no-repeat !important;
  transition: background-size 220ms var(--g-e-out),
              color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-root .v2-fword:not(.on):hover { background-size: 100% 1.5px !important; }
}
.fl-root .v2-fword:active { transition-duration: var(--g-t-press) !important; }


/* ═══ K13 · THE SWITCH — the knob squashes into the press ═══════════════════
   Fragment G rebuilt the track and the knob. The knob now travels on the
   spring instead of a linear ease, and while it is held it stretches toward
   where it is going — the one place on this site where something is elastic,
   because a switch is the one control you physically push.                   */
.fl-root [role="switch"],
.v2-door [role="switch"] {
  transition: background .2s var(--g-e-out), box-shadow .2s var(--g-e-out) !important;
}
.fl-root [role="switch"] > span,
.v2-door [role="switch"] > span {
  transition: transform 260ms var(--g-e-spring), width 140ms var(--g-e-out) !important;
}
.fl-root [role="switch"]:active > span,
.v2-door [role="switch"]:active > span { width: 26px !important; }
.fl-root [role="switch"][aria-checked="true"]:active > span,
.v2-door [role="switch"][aria-checked="true"]:active > span { transform: translateX(14px) !important; }
@media (hover: hover) {
  .fl-root [role="switch"]:hover,
  .v2-door [role="switch"]:hover {
    box-shadow:
      inset 0 0 0 1px color-mix(in oklab, var(--ink) 46%, transparent),
      inset 0 2px 3px color-mix(in oklab, var(--ink) 12%, transparent) !important;
  }
  .fl-root [role="switch"][aria-checked="true"]:hover,
  .v2-door [role="switch"][aria-checked="true"]:hover {
    box-shadow:
      inset 0 0 0 1px color-mix(in oklab, var(--cta) 60%, black),
      inset 0 2px 3px rgba(0, 0, 0, .18),
      0 0 0 3px color-mix(in oklab, var(--cta) 18%, transparent) !important;
  }
}


/* ═══ K14 · FOCUS — the double ring, restored where it was being eaten ══════
   §6.4's ring is `outline` (the bright half) + `box-shadow` (the dark half).
   Every control below carries an !important box-shadow of its own at a weight
   above fragment C's `:where()` rule, so the dark half never rendered on it —
   measured on the rail, the bar, the switch and the ask-flow tags. Each is
   restated here at its own weight. Keyboard only (`:focus-visible`).        */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav.fl-btn:focus-visible,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn:focus-visible,
.fl-root .fl-side-util button.fl-btn[title]:focus-visible,
.fl-root .fl-foot-pal button[title]:focus-visible,
.fl-root .fl-rp-pal button[title]:focus-visible,
.fl-root .fl-side-util .fl-side-lang button.fl-btn:focus-visible,
.fl-root .fl-foot-lang button.fl-btn:focus-visible,
.fl-root .v2-fword:focus-visible,
.fl-root .fl-about-foot-link:focus-visible,
.fl-scroll:has(.v2-sent) .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"]:focus-visible,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"]:focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 5.5px var(--g-ring-dark) !important;
}
/* …and so do the button families this fragment just gave an !important rest
   shadow to: their own stack now out-ranks §6.4's `:where()` rule, so each one
   restates the ring ON TOP of its own edge rather than in place of it.
   (Measured on the × key: outline only, no dark half, before this block.) */
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--sheet)"]:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint1)"]:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--tint2)"]:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: none"]:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: transparent"]:focus-visible,
.ui-sheet .ui-btn--secondary:focus-visible,
.v2-door .fl-soc:focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow:
    inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 46%, transparent),
    0 0 0 5.5px var(--g-ring-dark) !important;
}
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"]:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"]:focus-visible,
.fl-root button.fl-primary:focus-visible,
button.fl-primary:focus-visible,
.ui-sheet .ui-btn--primary:focus-visible,
.fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--warm)"]:focus-visible {
  outline: 2.5px solid var(--ctaText) !important;   /* §6.4: on a lit face the ring is that face's own ink */
  outline-offset: 2px !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 34%, transparent),
    0 0 0 5.5px var(--g-ring-dark) !important;
}
/* the switch keeps its track while it wears the ring */
.fl-root [role="switch"]:focus-visible,
.v2-door [role="switch"]:focus-visible {
  outline: 2.5px solid var(--g-ring-bright) !important;
  outline-offset: 2px !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 30%, transparent),
    inset 0 2px 3px color-mix(in oklab, var(--ink) 12%, transparent),
    0 0 0 5.5px var(--g-ring-dark) !important;
}
.fl-root [role="switch"][aria-checked="true"]:focus-visible,
.v2-door [role="switch"][aria-checked="true"]:focus-visible {
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--cta) 70%, black),
    inset 0 2px 3px rgba(0, 0, 0, .18),
    0 0 0 5.5px var(--g-ring-dark) !important;
}
/* NO blanket `transform: none` on :focus-visible. It was in this file for one
   revision and the probe caught what it costs: `.v2-go` is centred with
   `translateY(-50%)`, so zeroing its transform drops the knob 28px out of the
   ask tray the moment it is tabbed to. Nothing here adds a lift on focus, so
   there is nothing to undo. */


/* ═══ K15 · REDUCED MOTION ══════════════════════════════════════════════════
   No travel, no squash, no draw-in — but every state still READS: the ring,
   the ink, the ground and the underline all arrive, they simply arrive at
   once. Two things had to be measured rather than assumed:
     · the state rules above run as high as (0,6,1), so a (0,3,0) "transform:
       none" here would have lost to them. The families are repeated at their
       own weight (`.fl-btn` restated four times = (0,6,1), later in source).
     · the switch's ON knob sits at translateX(20px); zeroing its transform
       would park the knob on the OFF side of a lit track. It is pinned to 20px
       instead, which is where a switch that is on belongs.                    */
@media (prefers-reduced-motion: reduce) {
  .fl-root button.fl-btn,
  .fl-root button.fl-primary,
  button.fl-primary,
  .ui-sheet .ui-btn,
  .v2-door .fl-soc,
  .fl-root .ui-chip,
  .fl-root .v2-go,
  .fl-root .v2-go svg,
  .fl-root .v2-fword,
  .fl-root .fl-credit,
  .fl-root .fl-about-foot-link,
  .fl-root .v2-mlink,
  .fl-root [role="switch"],
  .fl-root [role="switch"] > span,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn,
  .fl-root .fl-side-util button.fl-btn[title],
  .fl-root .fl-foot-pal button[title] {
    transition: none !important;
    animation: none !important;
  }
  /* nothing moves — stated at each family's own weight */
  .fl-root button.fl-btn.fl-btn.fl-btn.fl-btn:hover,
  .fl-root button.fl-btn.fl-btn.fl-btn.fl-btn:active,
  .fl-root button.fl-btn.fl-btn.fl-btn.fl-btn:hover svg,
  .fl-root button.fl-primary.fl-primary.fl-primary.fl-primary:hover,
  .fl-root button.fl-primary.fl-primary.fl-primary.fl-primary:active,
  .fl-root button.fl-primary.fl-primary.fl-primary.fl-primary:hover svg,
  button.fl-primary.fl-primary.fl-primary.fl-primary:hover,
  button.fl-primary.fl-primary.fl-primary.fl-primary:active,
  .ui-sheet .ui-btn.ui-btn.ui-btn:hover,
  .ui-sheet .ui-btn.ui-btn.ui-btn:active,
  .v2-door .fl-soc.fl-soc.fl-soc:hover,
  .fl-root .ui-chip.ui-chip.ui-chip:active,
  .fl-root .v2-go:hover:not(:disabled) svg,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav.fl-btn:active,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn:hover svg,
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn:active,
  .fl-root .fl-side-util button.fl-btn[title][title]:hover,
  .fl-root .fl-side-util button.fl-btn[title][title]:active,
  .fl-root .fl-foot-pal button[title][title]:hover,
  .fl-root .fl-foot-pal button[title][title]:active,
  .fl-root .fl-rp-pal button[title][title]:hover,
  .fl-root .fl-rp-pal button[title][title]:active { transform: none !important; }
  /* the knob does not stretch, and it stays on the side it is on */
  .fl-root [role="switch"]:active > span,
  .v2-door [role="switch"]:active > span { width: 20px !important; }
  .fl-root [role="switch"][aria-checked="true"]:active > span,
  .v2-door [role="switch"][aria-checked="true"]:active > span { transform: translateX(20px) !important; }
  /* the underlines and the bloom arrive whole, with no drawing */
  .fl-root .ui-chip:hover { background-size: 260% 260% !important; }
}


/* ═══ K16 · 480px ═══════════════════════════════════════════════════════════
   A phone has no pointer: nothing hovers, so nothing may be left hovered, and
   the two things that cost a finger anything — the lift and the bloom — are
   simply not there. The press stays: it is the only feedback a touch gets.
   No target changes size anywhere in this file.                             */
@media (max-width: 480px) {
  .fl-root .ui-chip { background-size: 0% 0% !important; }
  .fl-root button.fl-btn:hover,
  .fl-root button.fl-primary:hover,
  .fl-root .ui-chip:hover,
  .fl-root .fl-side-util button.fl-btn[title]:hover,
  .fl-root .fl-foot-pal button[title]:hover,
  .fl-root .fl-rp-pal button[title]:hover { transform: none !important; }
  .fl-root .fl-about-foot-link,
  .fl-root .fl-credit,
  .fl-root .fl-foot-canvas a,
  .fl-root .fl-about-foot a { background-size: 0 1px !important; }
  /* the press is a little deeper on glass — a 1px move is invisible under a
     thumb, so the face carries the message */
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--a1)"]:active:not(:disabled),
  .fl-root button.fl-btn:not(.fl-nav)[style*="background: var(--cta)"]:active:not(:disabled),
  .fl-root button.fl-primary:active:not(:disabled),
  button.fl-primary:active:not(:disabled) {
    filter: brightness(.94);
  }
}



/* ═══ GARDEN FRAGMENT frag-l-flowerbed.css ═══ */
/* ═══ FRAGMENT L — THE FLOWERBED (owner 2026-08-18: "the flowers and
   plants in the footer boxes should be realistic … with gentle swaying back and
   forth from natural gentle wind … all on different wind rhythms, all different
   wind intensity … like a comforting beautiful flower garden").
   Generated by garden/flowerbed.py — edit THAT, not this.
   One 640x116 tile: a soil line with grit and a mossy fringe, a soft back row,
   and a crisp front row — oxeye daisy, field poppy, cosmos, lavender, rudbeckia,
   foxglove, cornflower, wheat, meadow grass, fern, cow parsley, forget-me-not,
   buds, clover. Each plant sways on its OWN SMIL rotate about the foot of its
   stem; each head nods on a second, faster rhythm. Supersedes fragment H's
   carved frieze on every one of its selectors. ═══ */
:root {
  --g-bloom: url("patterns/flowerbed.svg");
  --g-bloom-still: url("patterns/flowerbed-still.svg");
}

/* ── THE BED IS THE FOOTER'S BACKGROUND ────────────────────────────────────
   (owner 2026-08-25: "footers are taking up too much screen real estate …
   the flowers should not be IN the footer as an isolated design element,
   they should be the background OF the footer … protect the text.")
   The old arrangement grew the card's bottom padding (+102px desktop /
   +58px phone) to leave the bed its own empty strip — a whole extra band of
   footer. That strip is given back: the card keeps only its natural padding,
   and the bed paints across the WHOLE card as its background layer —
   anchored to the bottom edge at the drawing's own scale, under the text
   (z-index -1, same painting layer as before). THE VEIL: a stock-coloured
   gradient rides ON the same pseudo, strongest where the text is densest and
   thinnest at the soil line, so the garden reads through it while every line
   of text keeps its ground. A soft sheet-coloured halo on the card's type is
   the second lock. All devices — the band tracks the card's own width.     */
.fl-foot-canvas, .fl-about-foot,
.fl-root .fl-foot-canvas, .fl-root .fl-about-foot {
  position: relative;
  padding-bottom: calc(var(--g-s2) + 10px) !important;   /* was +26: the bed is the card's background, not a reserved strip (owner 2026-08-25) */
  /* protect the text: a sheet halo under every glyph in the card */
  text-shadow: 0 1px 0 color-mix(in oklab, var(--sheet) 85%, transparent),
               0 0 9px var(--sheet), 0 0 18px color-mix(in oklab, var(--sheet) 70%, transparent);
}
.fl-foot-canvas::after, .fl-about-foot::after,
.fl-root .fl-foot-canvas::after, .fl-root .fl-about-foot::after,
.fl-root:has(.fl-scroll > [style*="padding: 24px 0px 8px"]) .fl-about-foot::after,
.fl-root:has(.fl-scroll > [style*="padding: 24px 0px 8px"]) .fl-foot-canvas::after,
.fl-scroll:has(.v2-sent) .fl-about-foot::after,
.fl-scroll:has(.v2-sent) .fl-foot-canvas::after,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) .fl-about-foot::after,
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) .fl-foot-canvas::after,
.fl-scroll:has(> [style*="padding: 26px 0px 6px"]) .fl-about-foot::after,
.fl-scroll:has(> [style*="padding: 26px 0px 6px"]) .fl-foot-canvas::after {
  content: "" !important;
  position: absolute !important;
  left: 0 !important; right: 0 !important; bottom: 0 !important; top: 0 !important;
  height: auto !important;
  aspect-ratio: auto !important;
  z-index: -1 !important;
  pointer-events: none !important;
  opacity: var(--g-bloom-op, 1) !important;
  border-radius: 3px !important;
  background-color: transparent !important;
  -webkit-mask-image: none !important; mask-image: none !important;
  /* the veil first (nearest the reader), the garden under it. The bed keeps
     the drawing's own aspect at the card's width (100% auto, bottom-anchored)
     — always whole flowers, never a stretch, never a seam. */
  background-image:
    linear-gradient(to bottom,
      var(--sheet) 0%,
      var(--sheet) 52%,
      color-mix(in oklab, var(--sheet) 90%, transparent) 72%,
      color-mix(in oklab, var(--sheet) 66%, transparent) 88%,
      color-mix(in oklab, var(--sheet) 30%, transparent) 100%),
    var(--g-bloom) !important;
  background-size: 100% 100%, 100% auto !important;
  background-repeat: no-repeat, no-repeat !important;
  background-position: left top, left bottom !important;
  background-blend-mode: normal !important;
}
/* the two dark rooms: the same bed, at night — held back a whisper so the
   footer text stays the brightest thing in the card. */
[data-palette="ember"], [data-palette="midnight"] { --g-bloom-op: .92; }

/* ── STILLNESS ─────────────────────────────────────────────────────────────
   The same garden with the wind taken out of it — a second drawing, identical
   but for the animation elements, so nothing is left paused mid-swing.      */
@media (prefers-reduced-motion: reduce) {
  .fl-foot-canvas::after, .fl-about-foot::after,
  .fl-root .fl-foot-canvas::after, .fl-root .fl-about-foot::after,
  .fl-root:has(.fl-scroll > [style*="padding: 24px 0px 8px"]) .fl-about-foot::after,
  .fl-root:has(.fl-scroll > [style*="padding: 24px 0px 8px"]) .fl-foot-canvas::after,
  .fl-scroll:has(.v2-sent) .fl-about-foot::after,
  .fl-scroll:has(.v2-sent) .fl-foot-canvas::after,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) .fl-about-foot::after,
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) .fl-foot-canvas::after,
  .fl-scroll:has(> [style*="padding: 26px 0px 6px"]) .fl-about-foot::after,
  .fl-scroll:has(> [style*="padding: 26px 0px 6px"]) .fl-foot-canvas::after {
    background-image:
      linear-gradient(to bottom,
        var(--sheet) 0%,
        var(--sheet) 52%,
        color-mix(in oklab, var(--sheet) 90%, transparent) 72%,
        color-mix(in oklab, var(--sheet) 66%, transparent) 88%,
        color-mix(in oklab, var(--sheet) 30%, transparent) 100%),
      var(--g-bloom-still) !important;
  }
}

/* ── THE PHONE BED ─────────────────────────────────────────────────────────
   Same geometry — the background tracks the card's own width; the card keeps
   only its natural padding on a phone too. */
@media (max-width: 480px) {
  .fl-foot-canvas, .fl-about-foot,
  .fl-root .fl-foot-canvas, .fl-root .fl-about-foot {
    padding-bottom: calc(var(--g-s1) + 10px) !important;
  }
  .fl-foot-canvas::after, .fl-about-foot::after,
  .fl-root .fl-foot-canvas::after, .fl-root .fl-about-foot::after {
    max-width: 100% !important;
  }
}



/* ═══ GARDEN FRAGMENT frag-m-packet.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT M — THE PACKET (owner 2026-08-18: "'questions you are
   sending' box needs better design and presentation.")

   ONE decision, made once and carried through both wizards: THE PACKET IS A
   RULED FORM. Not a card holding five boxed fields — a sheet of numbered,
   ruled lines that a person writes on.

     · the title block  — the name of the form, the count struck beside it as a
       stamp, the instruction under both, closed by one incised rule;
     · the list         — ordinals in a reserved left margin, the text on a
       ruled line that runs the full measure, the remove mark a quiet disc
       sitting at the end of that line, annotations hung under it, indented to
       the text column. Every column is fixed, so five rows read as one object;
     · the add line     — the same geometry with a dashed rule: a line that is
       not written on yet, never a stray pill;
     · the lower tray   — the "ask something different" bar becomes a kraft
       band bled to the packet's own edges, below the list, with the light
       caught on its top edge. It is the drawer of the form, not a second card;
     · outside it       — the note, then the one filled Continue.

   THE LIGHT (fragment F: sun top-right): every rule here is incised — the ink
   line above, fragment J's own --g-pl-lit under it, so a rule reads as pressed
   INTO the stock rather than drawn on it. THE CURVE: nothing here sets a
   radius except the remove disc and the stamp; the sheet keeps var(--p-rad).

   COMPOSED WITH, NOT AGAINST:
     · frag-c's stock + tear on the packet's ::before and frag-j's plate line on
       its ::after are untouched — this fragment takes no pseudo on the packet.
       The row, the row's line and the header have their pseudos free and only
       the row uses one (nothing else needed a mark).
     · frag-e's Go stays the outlined pill, Continue stays the one filled
       primary (owner's earlier correction) — neither is touched here.
     · frag-k's key grammar is kept everywhere it applies; the only two controls
       taken out of it are the remove mark and the add line, which are not keys
       on this sheet but marks in a list (K2's ring turned both into buttons
       standing on a ruled page).
     · parlor's per-row accent ledge is retired ON THIS LIST ONLY: a numbered,
       ruled list already says where a row starts, and five ledges of five
       different heights was the ragged edge the owner is looking at. The
       identical ledge on the step-2 question index (the `justify-content:
       space-between` rows) is NOT touched.

   ANCHOR: parlor anchors the whole ask flow at ID level
   (`:is(:has(#fl-topic-main), …)`), so every rule here carries the same
   ID-level prefix plus the packet's own two attributes — (1,3,0) before the
   compound — and wins on specificity, not only on order.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══ M0 · THE MEASURE ══════════════════════════════════════════════════════
   Declared on the packet, so they resolve in the packet's own (paper) ink
   family — builder A: custom properties resolve where they are declared.
   One column set for both wizards: change it here and both lists move.      */
/* the LENGTHS live on the wizard column, because two lists of questions share
   them (the suggestion index one card up, and the packet's own list). The INKS
   live on the packet: a colour token resolves where it is DECLARED, and the
   wizard column is bed-inked — declaring --m-rule up there would draw the
   packet's rules in the bed's ink family (builder A's note). */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) {
  --m-num: 26px;                     /* the margin column: the ordinal        */
  --m-gap: 12px;                     /* margin → text                         */
  --m-col: 38px;                     /* where every line of text begins       */
  --m-row: 56px;                     /* the rhythm of one written line        */
  --m-disc: 38px;                    /* the remove mark                       */
  --m-edge: 20px;                    /* the sheet's own margin, header + list  */
  --m-foot: 20px;                    /* the list's foot — what the tray bleeds into */
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
  --m-rule:      color-mix(in oklab, var(--ink) 21%, transparent);
  --m-rule-soft: color-mix(in oklab, var(--ink) 12%, transparent);
  /* the drawer's face: one step off the sheet. In the two dark rooms the same
     mix toward --p-shade would LIGHTEN it — a drawer that reads as raised — so
     those two step into black instead, which is what a recess does. */
  --m-tray: color-mix(in oklab, var(--sheet) 87%, var(--p-shade));
  --m-tray-face: var(--g-kraft);     /* the drawer's grain — see the dark rooms */
  --m-dash: repeating-linear-gradient(90deg,
      color-mix(in oklab, var(--ink) 20%, transparent) 0 5px, transparent 5px 11px);
}


[data-palette="ember"] .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"], [data-palette="midnight"] .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
  --m-tray: color-mix(in oklab, black 26%, var(--sheet));
  /* the kraft gradient is a WARM LIGHT face: over a dark sheet it lifted the
     drawer above the sheet it sits in (seen in preview, midnight). The dark
     rooms keep the fibre only, so the recess stays a recess. */
  --m-tray-face: none;
}


/* ═══ M1 · THE TITLE BLOCK ══════════════════════════════════════════════════
   Name, count, instruction — then one incised rule closing the block. parlor
   drew that rule as a single fading hairline; it is now the same rule the list
   is written on, so the form reads as one ruled sheet from its title down.   */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] {
  padding: 21px var(--m-edge) 15px !important;
  background-image:
    linear-gradient(var(--m-rule), var(--m-rule)),
    linear-gradient(var(--g-pl-lit), var(--g-pl-lit)) !important;
  background-size: calc(100% - var(--m-edge) * 2) 1px, calc(100% - var(--m-edge) * 2) 1px !important;
  background-position: left var(--m-edge) bottom 1px, left var(--m-edge) bottom !important;
  background-repeat: no-repeat, no-repeat !important;
}
/* title and stamp on one line, the stamp struck at the outer edge — the same
   ledger geometry in both wizards (the send header already did this). */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] {
  display: flex !important;
  justify-content: space-between !important;
  align-items: baseline !important;
  gap: 14px !important;
  margin-bottom: 5px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] > [style*="Fraunces"] { flex: 0 1 auto; min-width: 0; }
/* the instruction is the voice, one step quieter than the name */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="font: 400 12.5px / 1.5"] {
  max-width: 52ch;
  font-size: 15.5px !important;
  line-height: 1.45 !important;
  letter-spacing: .002em !important;
  color: var(--body) !important;      /* 7.88:1 worst on card stock */
}


/* ═══ M2 · THE LABEL VOICE — ONE STAMP FOR THE WHOLE SCREEN ════════════════
   (owner 2026-08-19, on the same screen: "different fonts, weird mix".)
   The create screen was labelling the same job four ways: a vermilion filled
   plaque (SUGGESTED FOR YOUR TOPIC), a mono keyline badge on one card heading
   (READY-MADE LIBRARY), a second mono keyline badge in another ink (FROM YOUR
   WORDS), a grey kicker broken over a hairline (MORE THEMES AND TOPICS) — and
   the packet's own count. They are all the same object: a small struck label
   that names what is under it. So they are all one object now — Archivo caps,
   tracked, keylined, no fill — and only the INK changes, because the ink is
   the one thing a label here actually encodes (whose material this is).
   No fill under any of them: a tinted ground under 10px caps is where this
   screen's contrast was thinnest (LAW 2).                                    */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] [style*="border-radius: 8px"], .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] > [style*="font: 600 11.5px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="vertical-align: 4px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="vertical-align: 3px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="background: var(--warm)"][style*="border-radius: 999px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"] {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  width: auto !important;
  flex: 0 0 auto;
  gap: 0 !important;
  white-space: nowrap;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 82, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 10.5px !important;
  line-height: 1.1 !important;
  letter-spacing: .16em !important;
  font-variant-numeric: tabular-nums lining-nums;
  text-transform: uppercase;
  color: var(--body) !important;      /* 7.88:1 worst */
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 999px !important;
  min-height: 0 !important;
  padding: 5px 11px 4px !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 26%, transparent) !important;
}
/* the kicker that was a broken rule loses the rule with the pill */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="background: var(--rule)"][style*="border-radius: 999px"][style*="letter-spacing: 0.09em"]::after { content: none !important; }
/* the ink says what the label names: the ready-made library in the second ink,
   your own words in the first, the topic match in the warm one. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="vertical-align: 4px"] {
  color: var(--a2Text) !important;    /* 5.49:1 worst */
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 48%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="vertical-align: 3px"] {
  color: var(--a1Text) !important;    /* 4.92:1 worst */
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1Text) 48%, transparent) !important;
}
/* this one is struck ACROSS the top edge of the well it labels (the app hangs
   it on a -13px margin), so it knocks the edge out with the card's own stock —
   a label tab, which is what it was trying to be with a vermilion fill. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="background: var(--warm)"][style*="border-radius: 999px"] {
  color: var(--warmDeep) !important;
  background-color: var(--sheet) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--warmDeep) 48%, transparent) !important;
}

/* the packet's count keeps the one thing a count can honestly say: the moment
   the list holds a written line, it goes to the accent ink and its keyline
   firms. Ink only — nothing is filled. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]:has([style*="border-left: 8px solid var(--a2)"] textarea:not(:placeholder-shown)) > [style*="padding: 16px 18px 12px"] [style*="border-radius: 8px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]:has([style*="border-left: 8px solid var(--a2)"] textarea:not(:placeholder-shown)) > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] > [style*="font: 600 11.5px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]:has([style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"]) > [style*="padding: 16px 18px 12px"] [style*="border-radius: 8px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]:has([style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"]) > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] > [style*="font: 600 11.5px"] {
  color: var(--a1Text) !important;    /* 4.92:1 worst on card stock */
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a1Text) 52%, transparent) !important;
}


/* ═══ M3 · THE LIST — ordinals in the margin, text on a ruled line ══════════ */
/* the list is a column, and the drawer is always its foot. The app can put two
   notes AFTER the tray in the DOM (the 5-question cap, the blocked payload);
   with the tray bled to the sheet's edges they landed BELOW the drawer, on the
   sheet, orphaned (seen in preview at 5 questions). Ordering the tray last
   keeps the form's grammar whatever the app renders. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) {
  padding: 10px var(--m-edge) var(--m-foot) !important;
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] { order: 9; }
/* the cap note is a note about the list, hung at the text column */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="font: 400 11.5px / 1.5"] {
  margin: 10px 0 0 !important;
  padding-left: var(--m-col);
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-size: 14.5px !important;
  line-height: 1.45 !important;
  color: var(--body) !important;      /* 7.88:1 worst — the shipped --muted was quieter than the law allows */
}

/* the row is no longer an object: it is one entry in a list. No ledge, no
   radius, no card — the numbering and the rule carry it. (The `wrapBg` tint
   the app paints while an AI rephrase is open is deliberately KEPT: it is the
   one row you are working in, and it now spans the full measure.)            */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] {
  position: relative;
  margin: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  background-image: none !important;
  box-shadow: none !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] { padding: 0 !important; }
/* the send list's rows ship as sheets of stock inside a sheet of stock */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] { background-color: transparent !important; }

/* THE WRITTEN LINE. Three layers on one element: the accent rule that draws in
   under the hand (0 → full), the ink rule, and the light caught below it.
   Nothing moves and no ink changes — the line is the whole feedback.         */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"] {
  gap: var(--m-gap) !important;
  align-items: flex-start !important;
  min-height: var(--m-row);
  padding: 5px 0 7px !important;
  box-sizing: border-box;
  background-image:
    linear-gradient(var(--a1Text), var(--a1Text)),
    linear-gradient(var(--m-rule), var(--m-rule)),
    linear-gradient(var(--g-pl-lit), var(--g-pl-lit));
  background-size: 0% 2px, 100% 1px, 100% 1px;
  background-position: left bottom, left bottom 1px, left bottom;
  background-repeat: no-repeat, no-repeat, no-repeat;
  transition: background-size var(--g-t-hover) var(--g-e-out);
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:has(textarea:focus) { background-size: 100% 2px, 100% 1px, 100% 1px; }
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:hover { background-size: 100% 1px, 100% 1px, 100% 1px; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:has(textarea:focus):hover { background-size: 100% 2px, 100% 1px, 100% 1px; }
}

/* the ordinal — engraved in the margin, right-ranged on the text column, and
   it takes the accent the moment its line holds a question */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] [style*="border-radius: 50%"] {
  flex: 0 0 auto !important;
  align-self: flex-start;
  width: var(--m-num) !important;
  height: auto !important;
  min-height: 0 !important;
  padding-top: 16px;
  margin: 0 !important;
  justify-content: flex-end !important;
  border-radius: 0 !important;
  background: none !important;
  background-color: transparent !important;
  box-shadow: none !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 550 !important;
  font-weight: 550 !important;
  font-size: 11px !important;
  letter-spacing: .09em !important;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--body) !important;      /* 7.88:1 worst */
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:has(textarea:not(:placeholder-shown)) > [style*="border-radius: 50%"] {
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  color: var(--a1Text) !important;    /* 4.92:1 worst */
}

/* the field: no well, no border, no radius — you are writing on the line.
   The question is the payload, so it is set in the voice (parlor's own rule
   for the step-2 index), one size for every row.                             */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] textarea {
  flex: 1 1 0% !important;
  min-width: 0;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 11px 2px 10px 0 !important;
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 17px !important;
  line-height: 1.3 !important;
  letter-spacing: .002em !important;
  color: var(--ink) !important;       /* 13.88:1 worst */
  caret-color: var(--a1Text);
}
/* an empty line invites in the same voice, one step back in the ink */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] textarea::placeholder {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-size: 17px !important;
  color: var(--body) !important;      /* 7.88:1 worst */
  opacity: 1;
}

/* THE REMOVE MARK — a quiet disc sitting at the end of the line. It is not a
   key: K2's ring and 1px lift made five buttons stand up off a ruled page, so
   it takes ink and a hairline instead, and warms only under the hand.        */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"] {
  flex: 0 0 auto !important;
  align-self: flex-start;
  margin-top: 6px;
  width: var(--m-disc) !important;
  height: var(--m-disc) !important;
  min-width: var(--m-disc) !important;
  min-height: var(--m-disc) !important;
  padding: 0 !important;
  border-radius: 50% !important;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  color: var(--body) !important;      /* 7.88:1 worst */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-weight: 500 !important;
  font-size: 17px !important;
  line-height: 1 !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 12%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition:
    box-shadow var(--g-t-hover) var(--g-e-out),
    background-color var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  /* :not(:hover) — the mark's OWN hover (warm) outranks the line's (measured:
     without it the line rule's higher specificity kept the neutral ring under
     a warm label). */
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:hover button.fl-btn[style*="width: 32px"]:not(:hover),
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:has(textarea:focus) button.fl-btn[style*="width: 32px"]:not(:hover) {
    box-shadow:
      inset 0 0 0 1px color-mix(in oklab, var(--ink) 24%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"]:hover:not(:disabled) {
    transform: none !important;
    color: var(--warmDeep) !important;          /* 5.6:1+ on the warm wash */
    background-color: color-mix(in oklab, var(--warm) 13%, transparent) !important;
    box-shadow:
      inset 0 0 0 1.5px color-mix(in oklab, var(--warmDeep) 55%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"]:active:not(:disabled) {
  transform: none !important;
  background-color: color-mix(in oklab, var(--warm) 20%, transparent) !important;
  box-shadow:
    inset 0 2px 4px -2px color-mix(in oklab, var(--ink) 30%, transparent),
    inset 0 0 0 1.5px color-mix(in oklab, var(--warmDeep) 55%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition-duration: var(--g-t-press) !important;
}

/* what hangs under a line — the rephrase offer, the suggestion, the flag —
   is indented to the text column and reads as an annotation to the line above */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="padding-left: 32px"] {
  padding-left: var(--m-col) !important;
  padding-right: calc(var(--m-disc) + var(--m-gap));
  margin: 2px 0 14px !important;
}
/* the rephrase offer was the loudest object on the sheet: a dashed pill under
   every written line. It is an ASIDE about the line above it, so it becomes a
   word-mark on a hairline that firms under the hand — the same grammar as the
   add line, one step quieter. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="padding-left: 32px"] > button.fl-btn[style*="border: 1px dashed"] {
  display: inline-block !important;   /* a block container: ::first-letter (the emoji) needs one */
  /* 2026-08-24, owner: "subtly helpful, not insulated by so much space" — the
     40px line-box was the insulation. Dense on a desktop; the tap floor holds
     only where fingers do (the coarse-pointer block at the end of this file). */
  /* dense to the EYE, full to the FINGER: a 41px hit box via padding, pulled
     back by negative margins so the visual rhythm stays snug (the battery's
     tap floor holds at every width without re-inflating the row) */
  min-height: 0 !important;
  line-height: 1.5 !important;
  padding: 13px 0 !important;
  margin: -11px 0 !important;
  position: relative;
  z-index: 1;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  background-color: transparent !important;
  background-image: linear-gradient(
    color-mix(in oklab, var(--a2Text) 40%, transparent),
    color-mix(in oklab, var(--a2Text) 40%, transparent)) !important;
  background-size: 100% 1px !important;
  background-position: left bottom 11px !important;   /* 2px under the text inside the padded hit box */
  background-repeat: no-repeat !important;
  box-shadow: none !important;
  color: var(--a2Text) !important;    /* 5.49:1 worst */
  font-size: 10px !important;
  letter-spacing: .155em !important;
  transition: background-size var(--g-t-hover) var(--g-e-out), color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="padding-left: 32px"] > button.fl-btn[style*="border: 1px dashed"]:hover {
    transform: none !important;
    color: var(--ink) !important;
    background-image: linear-gradient(var(--a2Text), var(--a2Text)) !important;
    background-size: 100% 1.5px !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="padding-left: 32px"] > button.fl-btn[style*="border: 1px dashed"]:active { transform: none !important; }


/* ═══ M4 · THE ADD LINE ═════════════════════════════════════════════════════
   The same line, not yet written on: full measure, dashed rule, the app's own
   leading "+" hanging in the margin gutter so the label ranges with the
   questions above it. Every locale ships that "+" (checked: de · es · fr · it).*/
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"] {
  display: block !important;
  width: 100%;
  box-sizing: border-box;
  text-align: left;
  margin: 0 !important;
  padding: 0 0 0 var(--m-num) !important;
  min-height: 50px !important;
  line-height: 50px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  background-color: transparent !important;
  background-image: var(--m-dash) !important;
  background-size: 100% 1px !important;
  background-position: left bottom !important;
  background-repeat: no-repeat !important;
  box-shadow: none !important;
  color: var(--body) !important;      /* 7.88:1 worst */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: 11px !important;
  letter-spacing: .15em !important;
  text-transform: uppercase;
  transition: color var(--g-t-hover) var(--g-e-out), background-image var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"]:hover:not([style*="cursor: default"]) {
    transform: none !important;
    color: var(--a1Text) !important;  /* 4.92:1 worst */
    background-image: repeating-linear-gradient(90deg,
      color-mix(in oklab, var(--a1Text) 58%, transparent) 0 5px, transparent 5px 11px) !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"]:active:not([style*="cursor: default"]) { transform: none !important; }
/* at five questions the line is spent: the rule holds, the label steps back */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"][style*="cursor: default"] {
  color: color-mix(in oklab, var(--muted) 78%, var(--sheet)) !important;   /* parlor's own inert ink: unmistakably spent, still 3.16:1+ */
  opacity: 1;
}


/* ═══ M5 · THE SEND LIST — the same form, the other wizard ══════════════════
   Request/Send parity is a design law. The statements ship as five sheets of
   stock stacked inside the packet, each with its ordinal disc pushed onto its
   own line by a flex span in a text flow. Same measure, same rules, same
   ordinals — the only difference is that these lines are not editable.       */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] {
  display: block !important;
  padding: 13px 0 13px var(--m-col) !important;
  min-height: var(--m-row);
  box-sizing: border-box;
  background-image:
    linear-gradient(var(--m-rule), var(--m-rule)),
    linear-gradient(var(--g-pl-lit), var(--g-pl-lit)) !important;
  background-size: 100% 1px, 100% 1px !important;
  background-position: left bottom 1px, left bottom !important;
  background-repeat: no-repeat, no-repeat !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > span {
  display: block;
  padding-right: calc(var(--m-gap) + 96px);
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-size: 17px !important;
  line-height: 1.4 !important;
  color: var(--ink) !important;       /* 13.88:1 worst */
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > span > [style*="border-radius: 50%"] {
  position: absolute !important;
  left: 0;
  top: 15px;
  display: block !important;
  width: var(--m-num) !important;
  height: auto !important;
  padding: 0 !important;
  margin: 0 !important;
  text-align: right;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  font-style: normal !important;
  letter-spacing: .09em !important;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--a1Text) !important;    /* 4.92:1 worst */
}
/* REMOVE reads as the row's action word, on the line, not as a filled pill */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn {
  position: absolute !important;
  right: 0;
  top: 12px;
  min-height: 40px !important;        /* 2026-08-23: tap floor — was 38 */
  padding: 0 13px !important;
  border-radius: 999px !important;
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  color: var(--body) !important;      /* 7.88:1 worst */
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-weight: 650 !important;
  font-size: 10.5px !important;
  letter-spacing: .15em !important;
  text-transform: uppercase;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 17%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
  transition:
    box-shadow var(--g-t-hover) var(--g-e-out),
    background-color var(--g-t-hover) var(--g-e-out),
    color var(--g-t-hover) var(--g-e-out) !important;
}
@media (hover: hover) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn:hover:not(:disabled) {
    transform: none !important;
    color: var(--warmDeep) !important;
    background-color: color-mix(in oklab, var(--warm) 13%, transparent) !important;
    box-shadow:
      inset 0 0 0 1.5px color-mix(in oklab, var(--warmDeep) 55%, transparent),
      0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn:active:not(:disabled) { transform: none !important; transition-duration: var(--g-t-press) !important; }
/* nothing chosen yet: the same unwritten line as the ask wizard's add row —
   a solution, not a scolding box (the app's dashed panel became a hole) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > div[style*="border: 1px dashed var(--rule)"] {
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  background-color: transparent !important;
  background-image: var(--m-dash) !important;
  background-size: 100% 1px !important;
  background-position: left bottom !important;
  background-repeat: no-repeat !important;
  padding: 14px 0 16px var(--m-col) !important;
  text-align: left !important;
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-size: 16px !important;
  line-height: 1.45 !important;
  color: var(--body) !important;      /* 7.88:1 worst */
}


/* ═══ M6 · THE LOWER TRAY ═══════════════════════════════════════════════════
   "Ask something different for fresh suggestions" is not a second card inside
   the packet — it is the drawer at the foot of the form. It bleeds to the
   packet's own edges (the sheet clips it), takes the kraft face one step down
   from the sheet's, and catches the light on its top edge: ink above, fragment
   J's --g-pl-lit under it, the same incision as every rule on this sheet.
   Its Go stays fragment E's outlined pill — one primary per view.            */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] {
  position: relative;
  margin: 20px calc(var(--m-edge) * -1) 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  padding: 15px var(--m-edge) 17px !important;
  background-color: var(--m-tray) !important;
  background-image: var(--m-tray-face), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, var(--ink) 15%, transparent),
    inset 0 2px 0 var(--g-pl-lit),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] { margin-bottom: calc(var(--m-foot) * -1) !important; }
/* the kicker is the drawer's label; the aside stays the voice */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] > [style*="font: 600 12.5px"] {
  color: var(--body) !important;      /* 7.88:1 worst on the kraft band */
  font-size: 10px !important;
  letter-spacing: .16em !important;
  margin-bottom: 9px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] > [style*="font: 600 12.5px"] > span { color: var(--body) !important; }
/* the field in the drawer is written on, like the lines above it */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] .fl-pencil-in {
  background-color: color-mix(in oklab, var(--sheet) 97%, var(--p-lit-mix)) !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--ink) 20%, transparent),
    inset 0 -2px 0 color-mix(in oklab, var(--a1Text) 70%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] .fl-pencil-in:focus {
  box-shadow:
    inset 0 0 0 1.5px var(--a1Text),
    inset 0 -2px 0 var(--a1Text) !important;
}


/* ═══ M7 · WHAT COMES AFTER THE SHEET ═══════════════════════════════════════
   The note is an editor's line, set in the voice on the bed and ranged right
   over the button it is about; then air; then the one filled Continue.       */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="margin-top: 26px"][style*="text-align: right"] {
  margin-top: 22px !important;
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-size: 15px !important;
  line-height: 1.5 !important;
  letter-spacing: .003em !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="margin-top: 26px"][style*="text-align: right"] > strong {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  font-style: normal !important;
  font-size: 11px !important;
  letter-spacing: .15em !important;
  text-transform: uppercase;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="justify-content: flex-end"][style*="margin-top: 32px"] { margin-top: 26px !important; }


/* ═══ M8 · THE READING VOICE — every sentence on this screen ════════════════
   Second half of the same owner note. The screen was speaking body copy in
   three faces at three sizes: 'Public Sans' 12.5 (the "no matching categories"
   line and both card sub-lines — an un-aliased face that appears NOWHERE else
   in the Garden), Karla 13.5 (the sample-questions note), and the reading voice
   at 20px (its heading). A sentence a person reads is the reading voice, at one
   of two sizes: 17px where it is the payload, 15.5px where it explains.       */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 3px solid var(--a3)"] > [style*="font: 600 16px / 1.35"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 17px !important;
  line-height: 1.35 !important;
  letter-spacing: .002em !important;
  margin-bottom: 6px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 3px solid var(--a3)"] > [style*="font: 400 14px / 1.65"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 15.5px !important;
  line-height: 1.5 !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 3px solid var(--a3)"] strong {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 600 !important;
  font-size: inherit !important;
  letter-spacing: 0 !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="font: 400 12.5px / 1.6"][style*="margin-bottom: 9px"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) #fl-cathdr-req > [style*="font: 400 12.5px"], .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) #fl-cathdr-sf > [style*="font: 400 12.5px"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 15.5px !important;
  line-height: 1.45 !important;
  letter-spacing: .002em !important;
}

/* the suggestion index is the same list as the packet's, one screen earlier:
   the same ordinal (plain, in the margin, not a mono "01"), the same question
   size. Two lists of questions on one screen may not be set two ways.        */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"]::before {
  content: counter(flq) !important;
  left: 0;
  width: var(--m-num);
  text-align: right;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 700 !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  letter-spacing: .09em !important;
  color: var(--a1Text);               /* 4.92:1 worst */
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] { padding-left: var(--m-col) !important; }
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 8px solid var(--a2)"][style*="justify-content: space-between"] > [style*="font: 400 14px / 1.4"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: italic !important;
  font-size: 17px !important;
  line-height: 1.4 !important;
}

/* THE EMOJI IN THE HEADING (design law: no emoji). It is a bare text node the
   template writes before "Custom Suggestions", so it cannot be removed by a
   selector — but it IS the heading's first letter, and a flex item is a block
   box, so ::first-letter reaches it. Zeroed here, and the space it leaves is
   pulled back off the first line. Verified in preview (meadow, 1280 + 390):
   the heading now reads "Custom Suggestions" at full size.                    */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) .fl-sheen span[style*="flex: 1 1 0%"][style*="font-family: Fraunces"] { text-indent: 0; }   /* emoji gone at the source (FL_NO_EMOJI) — no space to pull back */
/* (emoji ::first-letter clip retired 2026-08-19 — FL_NO_EMOJI removes the ✨ at the source, so the clip would eat the real first letter) */
/* the same text node, the same law, on the rephrase offer under every written
   line ("✨ Help me say this differently" — emoji in all five locales) */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="padding-left: 32px"] > button.fl-btn[style*="border: 1px dashed"] { text-indent: 0; }   /* emoji gone at the source (FL_NO_EMOJI) — no space to pull back */
/* (emoji ::first-letter clip retired 2026-08-19 — FL_NO_EMOJI removes the ✨ at the source, so the clip would eat the real first letter) */


/* ═══ M9 · ONE CHIP ═════════════════════════════════════════════════════════
   The category panel wore two chip treatments: the theme tabs in --body on a
   1px ink keyline, the topic chips in --ink on a 1.5px accent keyline (a rule
   written for "the ones matched to the topic", which in this state is the whole
   second group). One tag, one weight, one ink; the CHOSEN one is the only one
   that differs, and it differs by its keyline, not by a fill.                 */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"],
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"][style*="background: var(--sheet)"][style*="color: var(--ink)"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 92, "wght" 500 !important;
  font-weight: 500 !important;
  font-size: 13px !important;
  letter-spacing: .008em !important;
  text-transform: none;
  min-height: 38px;
  padding: 8px 14px !important;
  color: var(--body) !important;      /* 7.69:1 worst on chip stock */
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent) !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) button.fl-btn[style*="border-radius: 999px"][style*="background: oklch(var(--catL"] {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 92, "wght" 600 !important;
  font-weight: 600 !important;
  font-size: 13px !important;
  letter-spacing: .008em !important;
  min-height: 38px;
  padding: 8px 14px !important;
  color: var(--a2Text) !important;    /* 5.49:1 worst */
  background: none !important;
  background-color: color-mix(in oklab, var(--sheet) 96%, var(--p-lit-mix)) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a2Text) 62%, transparent) !important;
}


/* ═══ M10 · REDUCED MOTION ═══════════════════════════════════════════════════
   No travel — but every end state stays reachable. The focused line keeps its
   accent rule (it simply arrives), and the marks keep their warm ring.       */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"], .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"], .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn, .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"] { transition: none !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 16px"] > [style*="align-items: center"]:has(textarea:focus) { background-size: 100% 2px, 100% 1px, 100% 1px; }
}


/* ═══ M11 · 480 — the form on a phone ════════════════════════════════════════
   The measure narrows: the margin column tightens, the tray bleeds to the
   phone's own gutter, and every mark on the sheet goes back to 44px. Nothing
   here grows a box — the rules are background layers inside the padding box. */
@media (max-width: 480px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] {
    --m-num: 20px;
    --m-gap: 10px;
    --m-col: 30px;
    --m-row: 52px;
    --m-disc: 44px;
    --m-edge: 16px;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] { padding: 18px var(--m-edge) 13px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="margin-bottom: 3px"] { gap: 10px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px 12px"] > [style*="font: 400 12.5px / 1.5"] { font-size: 14.5px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] textarea { font-size: 16px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] textarea::placeholder { font-size: 16px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > span { font-size: 16px !important; padding-right: 0; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] { padding-bottom: 52px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn { top: auto; bottom: 8px; right: auto; left: var(--m-col); }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"] { margin-top: 3px; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > [style*="border: 1.5px solid var(--tint2)"] { margin: 18px calc(var(--m-edge) * -1) 0 !important; padding: 14px var(--m-edge) 15px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="margin-top: 26px"][style*="text-align: right"] { font-size: 14px !important; }
}
/* a mark on this sheet is 44px under any coarse pointer, on any width */
@media (pointer: coarse), (max-width: 620px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"] button.fl-btn[style*="width: 32px"] {
    width: 44px !important; height: 44px !important;
    min-width: 44px !important; min-height: 44px !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) [style*="border-left: 8px solid var(--a2)"][style*="border-radius: 12px"] > button.fl-btn { min-height: 44px !important; }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"] > [style*="padding: 16px 18px"]:not([style*="16px 18px 12px"]) > button.fl-btn[style*="margin-top: 4px"] { min-height: 52px !important; line-height: 52px !important; }
}




/* ═══ GARDEN FRAGMENT frag-n-parity.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   FRAGMENT N — PAGE-HEAD PARITY
   Owner: builder N.  Assembles after frag-m, before frag-z.

   Owner, 2026-08-19: "the layout of 'ask' page and 'loopvine' page seem
   different. centering of objects, heading layout, small graphic details.
   follow design parity across pages."

   MEASURED (meadow, 1280, before this fragment):

     page        heading            deck                       mark(s)
     Ask         45px / 1.02 /      Instrument Serif 500       an accent rule
                 −.026em, ember     ITALIC 20px / 1.44,        ABOVE the title
                 misregister plate  54ch, mt 12px              + a CENTRED sprig
     Loopvine    56.32px / .96 /    Newsreader 300 roman       a LEFT-hung sprig
                 −.03em, no press   18.5px / 1.44, 46ch,       whose hairline
                                    mt 11px                    NEVER PAINTS
     Detail      44px / 1.10 /      (no deck)                  (no mark)
                 −.022em, press

   Three heads, three sizes, two deck voices, three different accent marks,
   and one hairline that was invisible in production. This fragment states ONE
   grammar and applies it to every app page-head in the working column:

     · left-aligned in the 760px column (the home hero stays the one centred
       page; About's cover lockup is a cover, not a page head — untouched);
     · ONE display line: Fraunces clamp(33px, 4.4vw, 45px) / 1.02 / −.026em,
       cap-trimmed with .30em of air above and below, inked with the house
       letterpress press (--p-press) and NOTHING else — the misregistered
       ember plate belongs to the wordmark, not to a page title;
     · ONE deck voice: Newsreader 300 roman 18.5px / 1.44, 46ch, sitting on
       the display line's own .30em of air (no second margin);
     · ONE accent mark per page — the sprig, hung LEFT on a hairline that runs
       the full column, BELOW the head. That is already the mark on About's
       chapter rules, on the rail's tray rule and on Loopvine's section heads,
       so the head follows the house. The Ask/Send rule ABOVE the title is
       retired (two marks on one head was the loudest half of the complaint)
       and the CENTRED sprig is re-hung left;
     · ONE right-hand control placement: on the head row, right, its text
       baseline sitting on the heading's first-line baseline (Show samples /
       Stop loop / Edit name all sit on that line);
     · ONE section-head mark: the tracked label, the sprig, the hairline
       running out — now on the detail view's kickers too.

   THE BUG THIS FOUND (verified by pixel sample, not by reading CSS): the
   Loopvine head rule is `border-top: 1px solid var(--rule)` with
   `box-sizing: border-box` and `height: 1px` (frag-d). The 1px border eats
   the whole 1px box, so the padding-box the background is ORIGINED to is 0px
   tall and the hairline is clipped away entirely. Loopvine has been shipping
   a sprig floating over nothing. Every head rule here therefore carries
   `border-top: 0` before it paints.

   Laws honoured: no filter/mask/transform on the paper panel (nothing here
   touches it); no ink or contrast is lightened (the press can only raise
   measured contrast, --body/--ruleG/--a1OnCanvas are unchanged tokens); every
   box glow stays where it was (no box shadows are written here); relative
   URLs only; no user-visible garden vocabulary; container-scoped selectors.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── N1 · ONE ACCENT MARK PER HEAD ──────────────────────────────────────────
   parlor gives the Ask/Send head a 5px rule ABOVE the title (a 34px accent tab
   over a hairline) AND frag-c gives it a centred sprig below. Loopvine has
   only the sprig. Two marks on one head and one on the next is exactly what
   reads as "different pages"; the rule above is retired. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child::before {
  content: none !important;
}


/* ── N2 · ONE DISPLAY LINE ──────────────────────────────────────────────────
   Ask/Send sat at 45px, Loopvine at 56.32px, the detail card at 44px — three
   sizes for the same object. 45px is the house rung (it is also About's
   chapter-cover size and the size the wizard's 31px sentence and 21px
   sub-heads were calibrated against), so Loopvine comes down to it and the
   detail card comes up the one pixel.

   The press: `--p-press` is three currentColor plates, so it can only raise
   the measured ratio. parlor additionally gave any `font-size: 26px;
   font-variation-settings: "opsz" 48` title a misregistered --a2 plate at
   .034em — at 45px that is a 1.5px warm fringe that reads as a rendering
   fault, and frag-d had already stripped it from Loopvine only. One press,
   both heads. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child > [style*="font-size: 26px"],
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > [style*="font-family: Fraunces"][style*="font-size: 26px"],
.fl-root .fl-detail-enter [style*="font-size: clamp(32px, 8.6vw, 44px)"] {
  font-family: 'Fraunces', Georgia, serif !important;
  font-weight: 500 !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: clamp(33px, 4.4vw, 45px) !important;
  line-height: 1.02 !important;
  letter-spacing: -.026em !important;
  text-shadow: var(--p-press) !important;
  text-wrap: balance;
  /* the FALLBACK for a browser without text-box-trim: the untrimmed line box
     already carries ~11px of half-leading above the cap and ~10px below the
     baseline at 45px/1.02, so 3px of margin lands within a pixel or two of the
     trimmed 13.5px. Never 0 — the deck below carries no margin of its own. */
  margin: 3px 0 !important;
}
/* the cap-trim is what makes the air above and below a head IDENTICAL on a
   block page (Ask/Send, where the title's margins collapse through its
   wrapper) and on a flex head row (Loopvine, the detail card, where they do
   not). .30em of 45px = 13.5px on both. */
@supports (text-box: trim-both cap alphabetic) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child > [style*="font-size: 26px"],
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > [style*="font-family: Fraunces"][style*="font-size: 26px"],
  .fl-root .fl-detail-enter [style*="font-size: clamp(32px, 8.6vw, 44px)"] {
    text-box: trim-both cap alphabetic;
    margin-block: .30em .30em !important;
  }
}


/* ── N3 · ONE DECK VOICE ────────────────────────────────────────────────────
   §4.4 lists the "wizard deck" and the "Loopvine deck" at the SAME size in the
   SAME voice; only Loopvine ever got it. parlor left the wizard deck as
   'Instrument Serif' 500 ITALIC at clamp(17px,1.7vw,20px) over 54ch, which is
   a different face weight, a different slant, a different size and a different
   measure from the page next door. One voice: Newsreader 300 roman, 18.5px,
   1.44, 46ch. (The italic cut stays where §4.4 puts it — the rotating hero
   line and placeholders.)

   margin-top: 0 on both. The gap above a deck is the display line's own
   .30em of trimmed air, which is the only way the block page and the flex
   head row can produce the SAME gap. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="font: 400 14px / 1.6"][style*="color: var(--muted)"],
.fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] {
  font-family: 'Newsreader', Georgia, serif !important;
  font-style: normal !important;
  font-weight: 430 !important;   /* was 300 — owner 2026-08-19: "enhance the text. all pages, all palettes, all devices" */
  font-variation-settings: "opsz" 22 !important;
  font-size: var(--g-t4) !important;
  line-height: 1.44 !important;
  letter-spacing: .002em !important;
  color: var(--body) !important;
  max-width: 46ch !important;
  margin-top: 0 !important;
  margin-bottom: 0 !important;
  text-wrap: pretty;
}


/* ── N4 · ONE HEAD RULE: the sprig, hung left, on a hairline that runs ──────
   Geometry copied exactly from the house mark (About's chapter rule,
   frag-d D2): a 1px hairline in --ruleG across the whole column, the 58×24
   sprig in --a1OnCanvas hung at left 0 / top −12px so the glyph's own two
   dashes sit ON the hairline.

   `border-top: 0` is load-bearing, not tidying: with box-sizing:border-box and
   height:1px the 1px border consumes the entire box, leaving a 0px-tall
   padding box for background-origin — which is why Loopvine's hairline has
   been invisible in production. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"],
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
  position: relative;
  box-sizing: content-box !important;
  border: 0 !important;
  height: 1px !important;
  margin: 30px 0 26px !important;
  background-color: transparent !important;
  background-image: linear-gradient(90deg, var(--ruleG), var(--ruleG)) !important;
  background-size: 100% 1px !important;
  background-position: left top !important;
  background-repeat: no-repeat !important;
}
/* frag-c hangs the Ask/Send sprig on ::after and centres it; frag-d hangs the
   Loopvine sprig on ::before. Both are restated here so the two are the same
   object in the same place. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"]::after,
.fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::before {
  content: "" !important;
  position: absolute !important;
  top: -12px !important;
  left: 0 !important;
  right: auto !important;
  bottom: auto !important;
  width: 58px !important;
  height: 24px !important;
  margin: 0 !important;
  background-color: var(--a1OnCanvas) !important;
  background-image: none !important;
  -webkit-mask-image: var(--g-sprig);
          mask-image: var(--g-sprig);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  pointer-events: none;
}


/* ── N5 · ONE PLACE FOR THE HEAD'S RIGHT-HAND CONTROL ───────────────────────
   The app writes every head row as `align-items: baseline` — Loopvine (Show /
   Hide samples) and the detail card (Active · Stop loop) both. parlor pushed
   Loopvine's to flex-end with a 6px bottom nudge, so the stamp hung off the
   descender line instead of the baseline, and the two pages disagreed. The
   app's own intent is restored: the control's text baseline sits on the
   head's first-line baseline, which works for a one-line title (Loopvine) and
   a three-line one (the detail card) without a second rule.

   The stamp's own face — a tracked Archivo label on a hairline — is frag-d's
   and is left alone; only where it sits changes. */
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] {
  align-items: baseline !important;
  column-gap: 16px !important;
  row-gap: 4px;
  margin-bottom: 0 !important;
}
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn {
  align-self: baseline !important;
  margin-bottom: 0 !important;
  margin-top: 0 !important;
}
.fl-root .fl-detail-enter > [style*="align-items: baseline"] {
  align-items: baseline !important;
  column-gap: 16px !important;
  row-gap: 4px;
}


/* ── N6 · ONE SECTION-HEAD MARK ─────────────────────────────────────────────
   Loopvine's group heads read: tracked label · sprig · a hairline running out.
   The detail card's kickers (QUESTIONS, WHAT YOU MIGHT DO WITH THIS) had the
   label and nothing else. Same mark, same offsets as frag-d's, in the ink of
   whichever surface the kicker stands on (--a1Text follows THE SURFACE LAW:
   the accent on stock, the bed's own gold on the bed). */
.fl-root .fl-detail-enter .ui-label::after {
  content: "" !important;
  display: inline-block !important;
  width: 40px !important;
  height: 17px !important;
  margin: 0 0 -3px 12px !important;
  vertical-align: baseline !important;
  transform: none !important;
  background-color: var(--a1Text) !important;
  background-image: none !important;
  -webkit-mask-image: var(--g-sprig);
          mask-image: var(--g-sprig);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  pointer-events: none;
}


/* ── N7 · REDUCED MOTION ────────────────────────────────────────────────────
   This fragment introduces no animation and no transform-based state; the
   block is here so the head objects are explicitly inert when motion is off
   (an earlier fragment may transition the stamp's colour — that stays, it is
   a colour change, not movement). */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"]::after,
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::before,
  .fl-root .fl-detail-enter .ui-label::after {
    animation: none !important;
    transition: none !important;
    transform: none !important;
  }
}


/* ── N8 · PHONE (390) ───────────────────────────────────────────────────────
   The same grammar, one rung down. Both heads land on the SAME numbers here
   too: frag-d took Loopvine to clamp(30px, 9vw, 38px) on a phone while the
   wizard sat at its 33px floor, and frag-d took the Loopvine deck to 16px
   while the wizard deck stayed at 20px italic. */
@media (max-width: 480px) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="min-height: 44px"]:first-child > [style*="font-size: 26px"],
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > [style*="font-family: Fraunces"][style*="font-size: 26px"],
  .fl-root .fl-detail-enter [style*="font-size: clamp(32px, 8.6vw, 44px)"] {
    font-size: clamp(30px, 8.6vw, 34px) !important;
    letter-spacing: -.024em !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="font: 400 14px / 1.6"][style*="color: var(--muted)"],
  .fl-scroll:has(.v2-sent) > [style*="font: 400 12.5px / 1.55"] {
    font-size: 16px !important;
    max-width: 40ch !important;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"],
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
    margin: 24px 0 20px !important;
  }
  /* the stamp keeps its 40px target and drops to its own line when the title
     needs the width — the row already wraps */
  .fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn {
    align-self: flex-start !important;
  }
  .fl-root .fl-detail-enter .ui-label::after {
    width: 34px !important;
    margin-left: 10px !important;
  }
}



/* ═══ GARDEN FRAGMENT frag-o-edges.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT O — THE EDGE SYSTEM (owner 2026-08-19, verbatim: "zoom in on
   the borders of all these content boxes. there are extra lines on some. i see
   other lines around the corners. this is very sloppy.")

   THE AUDIT. Zoomed to 2x in all six rooms, every content box was carrying
   THREE marks on its edge, and two of them broke at the corners:

     1. a 1px white hairline at the very edge   (fragment F, `inset 0 1px 0`)
     2. a uniform 1px ring at the very edge     (fragment F, `inset 0 0 0 1px`)
     3. a plate line 3px inboard, made of FOUR one-directional 1px inset
        shadows in four different inks                        (fragment J)

   Marks 1 and 3 cannot draw a clean line on a rounded box. A one-directional
   inset shadow paints the region between the box and a copy of the box shifted
   one pixel; on the straight runs that is a 1px line, but at every rounded
   corner it becomes a crescent that tapers to nothing. So each corner had two
   crescents of DIFFERENT colour laid over each other, each ending in mid-arc:
   the bright top run hooked a third of the way down the left curve and simply
   stopped. In ember and midnight, where the lit run is the sun against a dark
   sheet, those hooks read as scratches — measured on the demo card at 2x, the
   top-left hook was a 6px bright arc with a hard terminus.
   On top of that, the big sheets carried a FOURTH mark: a disconnected L of
   two 40px legs in the bottom-left corner (J4b), a second corner nested inside
   the first, with four stub ends floating in the middle of the paper.

   THE DECISION, made once, carried by every box in the app:

     ONE BOUNDARY LINE — a uniform 1px ring on the trim edge. Uniform, so it is
     concentric with the box's own curve by construction and CANNOT mismatch at
     a corner. A trimmed sheet edge is uniform; this is the honest mark.
     The light it used to carry as a hairline is now a soft crown — a blurred
     inset with no terminus, so there is nothing to hook.

     ONE PLATE LINE — 1px, 3px inboard (2px on the phone), drawn as a GRADIENT
     RING: the pseudo-element is painted with a raking gradient and masked to a
     1px band by XOR-ing its content box against its border box. The band
     follows the border-radius exactly, all the way round, so the corners join
     perfectly at any zoom. The gradient runs 213deg — lit where the sun is
     (top right, fragment F), through the stock's own ink, to shade at the
     bottom left. It is one continuous object: no runs, no seams, no ends.
     That is the whole craft mark, and it is now the LIGHT as well.

   Two lines. Both closed. Both concentric. Nothing else on any edge.

   The two dark rooms get their own inks: the lit end is the room's --g-sun and
   the shade end is true black, because on a dark sheet white is not light, it
   is a scratch. Tuned against ember and midnight stock, not against cream.

   Fragment J is corrected at source for the faults that were its own geometry
   (the four-run plate, the 999px ring inside an 18px box on the ask tray, the
   open-topped plate with two stub ends, the J4b corner brace). This fragment
   owns the system: the inks, the boundary, and the gradient ring itself.

   Nothing here changes a layout metric — no padding, no width, no font size,
   no gap, no radius on any real element. Every mark is drawn INSIDE, on a
   pointer-events:none layer. --boxGlow never leaves a stack (LAW 4).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── O1 · THE EDGE INKS ────────────────────────────────────────────────────
   Declared on :root so they carry the PAPER ink family everywhere (builder A:
   custom properties resolve where they are declared) — every object below is
   stock, never bed.
   Measured on meadow stock (232,222,200): the lit end lands about +14 against
   the sheet, the mid about −4, the shade about −16. The line is never zero at
   any point of its travel, so it reads as one continuous ring rather than as
   a line that fades out and comes back.                                      */
:root {
  --g-edge-lit:   color-mix(in oklab, white 62%, transparent);   /* sun end — top right */
  --g-edge-mid:   color-mix(in oklab, var(--ink) 7%, transparent);
  --g-edge-shade: color-mix(in oklab, var(--ink) 17%, transparent); /* shade end — bottom left */
  --g-edge-lit-up:   color-mix(in oklab, white 88%, transparent);   /* under the hand */
  --g-edge-shade-up: color-mix(in oklab, var(--ink) 22%, transparent);
  /* 213deg: the gradient line points down-and-left, so 0% sits at the top
     right corner (where fragment F's sun is) and 100% at the bottom left
     (where its shade is). One vector, the same one the shadows use.
     Over that ramp sit two corner blooms — the sun pooling where it strikes
     the edge square-on, the shade pooling where the light never turns the
     corner. A real impression is not a linear ramp; it is brightest and
     deepest AT the corners, which is the one place a flat ramp reads dead.
     Both blooms are painted through the SAME 1px mask as the ramp, so they
     add light to the ring, never a second mark.                              */
  --g-edge-bloom-hi:
    radial-gradient(86px 86px at 100% 0%, var(--g-edge-lit) 0%, transparent 78%);
  --g-edge-bloom-lo:
    radial-gradient(74px 74px at 0% 100%, var(--g-edge-shade) 0%, transparent 76%);
  --g-edge-paint:
    var(--g-edge-bloom-hi), var(--g-edge-bloom-lo),
    linear-gradient(213deg, var(--g-edge-lit) 0%, var(--g-edge-mid) 47%, var(--g-edge-shade) 100%);
  --g-edge-paint-up:
    var(--g-edge-bloom-hi), var(--g-edge-bloom-lo),
    linear-gradient(213deg, var(--g-edge-lit-up) 0%, var(--g-edge-mid) 47%, var(--g-edge-shade-up) 100%);
  /* the boundary: one uniform ring, and a crown of light with no terminus */
  --g-edge-ring:  inset 0 0 0 1px color-mix(in oklab, var(--ink) 15%, transparent);
  --g-edge-crown: inset 0 2px 4px -3px color-mix(in oklab, white 88%, transparent);
}
[data-palette="ember"], [data-palette="midnight"] {
  --g-edge-lit:   color-mix(in oklab, var(--g-sun) 34%, transparent);
  --g-edge-mid:   rgba(0, 0, 0, .16);
  --g-edge-shade: rgba(0, 0, 0, .40);
  --g-edge-lit-up:   color-mix(in oklab, var(--g-sun) 52%, transparent);
  --g-edge-shade-up: rgba(0, 0, 0, .46);
  --g-edge-crown: inset 0 2px 4px -3px color-mix(in oklab, var(--g-sun) 46%, transparent);
}

/* ── O2 · THE BOUNDARY — one line, and the light stops being a line ────────
   Fragment F's stock shadow led with `inset 0 1px 0 white 42%`: a crisp white
   hairline sitting directly on top of the ring, which doubled the top edge and
   hooked around both top corners. Same job, no terminus: the light is a
   blurred crown now, so it wraps the curve and dies out instead of stopping.
   Everything else about F's stack is kept exactly — the contact shadow still
   falls down and to the LEFT, and --boxGlow is still the last layer (LAW 4). */
:root {
  --p-shadow:
    var(--g-edge-ring),
    var(--g-edge-crown),
    -6px 14px 26px -20px color-mix(in oklab, var(--ink) 82%, transparent),
    0 16px 42px -10px var(--boxGlow, transparent);
}
[data-palette="ember"], [data-palette="midnight"] {
  --p-shadow:
    var(--g-edge-ring),
    var(--g-edge-crown),
    -6px 14px 26px -18px rgba(0, 0, 0, .85),
    0 16px 42px -10px var(--boxGlow, transparent);
}

/* ── O3 · THE PLATE LINE, AS A RING ───────────────────────────────────────
   The technique. The pseudo-element already sits at `inset: var(--g-pl-in)`
   with the concentric radius (fragment J). Give it 1px of padding, paint it
   with the raking gradient, then mask it with two full-coverage layers — one
   clipped to the CONTENT box, one to the BORDER box — composited with exclude.
   What survives is exactly the 1px band between them, and because both boxes
   take their curves from the same border-radius, that band follows the corner
   perfectly. No runs to mismatch, no ends to leave a stub.

   Guarded by @supports: if a browser cannot composite masks, it keeps fragment
   J's plain uniform ring, which is a clean line too — just an unlit one. It
   never falls back to a filled rectangle, because the paint only exists inside
   the guard.                                                                  */
@supports ((mask-composite: exclude) or (-webkit-mask-composite: xor)) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift)::before,
  .ui-card::before,
  .fl-root .fl-ab-quote::before,
  .fl-root .fl-rp-frame::before,
  .fl-root .fl-rp-box::before,
  .fl-root .v2-ask::after,
  .fl-root .fl-pv-panel:not([style*="display: none"])::after,
  .fl-root .v2-svp__card::after,
  .fl-root .fl-sheen::after,
  .fl-root [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::after,
  .ui-sheet::after,
  body:not(:has(.fl-root)):not(.embed) .wrap > .card::after {
    box-sizing: border-box !important;
    padding: 1px !important;
    box-shadow: none !important;
    background-color: transparent !important;
    background-image: var(--g-edge-paint) !important;
    background-repeat: no-repeat !important;
    background-size: auto !important;
    background-position: 0 0 !important;
    -webkit-mask-image: linear-gradient(#000, #000), linear-gradient(#000, #000);
    -webkit-mask-clip: content-box, border-box;
    -webkit-mask-composite: xor;
    mask-image: linear-gradient(#000, #000), linear-gradient(#000, #000);
    mask-clip: content-box, border-box;
    mask-composite: exclude;
    opacity: 1;
  }

  /* under the hand: the same ring, the sun end opened up. The sheet's travel
     and its shadow carry the motion (fragment J); the line just catches more
     light, the way a raised edge does. No fill is tinted and no ink moves, so
     a hovered box measures exactly what it measures at rest (LAW 2).          */
  @media (hover: hover) {
    .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover::after,
    .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover::before,
    .ui-card:hover::before {
      background-image: var(--g-edge-paint-up) !important;
      box-shadow: none !important;
    }
  }
  /* keyboard: the room's own bright ring is added INSIDE the plate band, so
     the focus mark is the plate line itself going bright — still one line. */
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:focus-visible::after {
    background-image: linear-gradient(color-mix(in oklab, var(--a1) 72%, transparent),
                                      color-mix(in oklab, var(--a1) 72%, transparent)) !important;
    box-shadow: none !important;
  }
}

/* ── O4 · THE BOXES THAT RESTATE THEIR OWN EDGE ───────────────────────────
   Three families draw their boundary themselves instead of taking --p-shadow,
   and each had the same doubled top edge. They are re-pointed at the shared
   tokens so there is exactly one system in the app, not four dialects of one.
   (The loop row's rest state and hover state both come through here.)        */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
  box-shadow: var(--p-shadow) !important;
}
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift):hover {
    box-shadow: var(--g-lift-shadow) !important;
  }
}

/* the footer boxes and the standalone-page card keep the boundary only: their
   ::before is the tear and their ::after is the flowerbed, so there is no free
   layer for a plate line — and at a 3px planter radius a second ring 3px in
   would have square corners inside a rounded box, which is the exact fault
   this fragment exists to remove. One line is the right answer there.        */

/* ── O5 · reduced motion ──────────────────────────────────────────────────
   None of this is motion: the ring is a static fact about light and it stays
   exactly as it is. Only the paint swap under the cursor is dropped, so the
   hovered box reads through its shadow alone.                                */
@media (prefers-reduced-motion: reduce) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]::after,
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"]:not(.fl-lift)::before,
  .ui-card::before,
  .fl-root .fl-ab-quote::before,
  .fl-root .fl-rp-frame::before,
  .fl-root .fl-rp-box::before,
  .fl-root .v2-ask::after,
  .fl-root .fl-pv-panel:not([style*="display: none"])::after,
  .fl-root .v2-svp__card::after,
  .fl-root .fl-sheen::after,
  .fl-root [style*="border: 1.5px solid var(--rule)"][style*="margin-top: 22px"]::after,
  .ui-sheet::after,
  body:not(:has(.fl-root)):not(.embed) .wrap > .card::after {
    transition: none !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:hover {
    box-shadow: var(--g-lift-shadow) !important;
  }
}

/* ── O6 · the phone ───────────────────────────────────────────────────────
   The plate line moves in to 2px with fragment J, and its light comes down a
   stop: at 390 a 358px card is mostly edge, and a bright ring that close to
   the boundary reads as a double border rather than as a lit impression.
   Nothing here grows a box and no tap target is touched — every mark is on a
   pointer-events:none layer inside the box.                                  */
@media (max-width: 480px) {
  :root {
    --g-edge-lit:   color-mix(in oklab, white 44%, transparent);
    --g-edge-mid:   color-mix(in oklab, var(--ink) 6%, transparent);
    --g-edge-shade: color-mix(in oklab, var(--ink) 14%, transparent);
    --g-edge-crown: inset 0 2px 3px -2px color-mix(in oklab, white 76%, transparent);
  }
  [data-palette="ember"], [data-palette="midnight"] {
    --g-edge-lit:   color-mix(in oklab, var(--g-sun) 26%, transparent);
    --g-edge-mid:   rgba(0, 0, 0, .14);
    --g-edge-shade: rgba(0, 0, 0, .34);
    --g-edge-crown: inset 0 2px 3px -2px color-mix(in oklab, var(--g-sun) 38%, transparent);
  }
}



/* ═══ GARDEN FRAGMENT frag-p-ornament.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   GARDEN FRAGMENT P — THE ORNAMENT (owner 2026-08-19, verbatim: "the content
   boxes are all boring … other than the theme, the details on the site are not
   good. the whole site looks basic, like basic html. where are the fancy
   impressive design elements??" · "nav bar items are not acting properly. one
   is selected without it even looking so.")

   Fragments J and O answered the FIRST half of the note — the sloppy edges —
   by removing marks. That is why the page reads as plainer than before: a
   clean edge is not a design element, it is the absence of a mistake. This
   fragment puts the design element BACK, drawn rather than tinted, so the
   product looks like what it has always claimed to be: a botanical letterpress
   print shop.

   SEVEN PLATES, cut by garden's own hand (patterns/orn-*.svg, one vocabulary —
   a bezier stem, the house leaf on its normals, a fern crozier at every tip),
   and every one of them drawn AT ITS DISPLAY SIZE, because a 128px plate shown
   at 56px has 0.6px strokes and disappears:

     · THE RUNNING RULE — every section rule in the app stops being a 1px line
       and becomes a vine: a seamless tile, repeated, inked with the surface's
       own currentColor so it is right on stock and on the bed without a
       second declaration. This is the single most visible change here: those
       hairlines are on every page, above every list, and they were the most
       "basic html" thing on the screen;
     · THE ENGRAVED CORNER — a mitred double rule with a fern springing out of
       it, printed into the bottom-right of every major sheet. It rides the
       sheet's own PAPER STACK (a background layer, not a pseudo-element), so
       it takes nothing from fragment J's plate line or fragment O's edge ring
       — the two fragments compose instead of fighting over one ::after;
     · THE PRESSED SPECIMEN — a full frond debossed into the big paper panels
       and the loop rows, as a background layer beneath every word (a
       background is always behind content: no z-index, no isolation, nothing
       painted over a glyph). The ink is baked pale in the plate itself,
       because a background LAYER has no opacity of its own;
     · THE ENGRAVED FRAME — a nine-slice border with a leaf bracket at each
       corner and a double rule down every run, around the "what others see"
       demo phone. That phone is the object those three screens exist to show,
       and it was a rounded rectangle;
     · GOLD LEAF — in Lamplight and Blue Hour every sheet edge, the rail's
       masthead seam and the ask tray's cap are gilt, and the ornament plates
       swap to their gold cut. A dark room whose only material is matte paper
       reads as unlit; a bindery gilds a dark board so it catches the lamp;
     · THE NAV, LIT AND CONSISTENT — every active nav item, on the rail, in the
       "what others see" group and on the mobile bar, is the SAME filled, lit
       plaque, and every hover is the same wash.

   Laws kept: the paper panel is untouched (nothing here selects it); no fixed
   overlay is trapped (no transform / filter / backdrop-filter / contain is
   introduced anywhere); every box that gains a shadow keeps
   var(--boxGlow, transparent) in the stack; no ink is lightened; every mark is
   pointer-events:none or a background layer, so no tap target changes size and
   nothing grows a box; relative URLs only; palette colour comes from tokens
   (the naturals live inside the drawings, the way the relief plates already
   do); no user-visible garden vocabulary; no emoji.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── P1 · THE PLATES ───────────────────────────────────────────────────────
   Two inks: a sepia that sits into cream stock, a gold for the two lamplit
   rooms. The plates worn as MASKS (the rule, the crest, the flower) are cut in
   black and take whatever colour the surface hands them, so they need no
   second cut.                                                                */
:root {
  --g-orn-corner: url("patterns/orn-corner-ink.svg");
  --g-orn-spec:   url("patterns/orn-specimen-ink.svg");
  --g-orn-frame:  url("patterns/orn-frame-ink.svg");
  --g-orn-vine:   url("patterns/orn-vinetile.svg");

  --g-orn-corner-size: 62px;      /* the plate is drawn 64 — shown 1:1        */
  --g-orn-in: 11px;               /* held in from the trim, clear of the curve */
  --g-orn-spec-size: 250px;
  --g-orn-vine-h: 18px;           /* the tile's own height                     */
}
[data-palette="ember"], [data-palette="midnight"] {
  --g-orn-corner: url("patterns/orn-corner-gilt.svg");
  --g-orn-spec:   url("patterns/orn-specimen-gilt.svg");
  --g-orn-frame:  url("patterns/orn-frame-gilt.svg");
}


/* ── P2 · THE RUNNING RULE ─────────────────────────────────────────────────
   The app writes every section rule the same way — a flex span, 1px tall,
   filled with var(--rule):
       <span style="flex: 1 1 0%; height: 1px; background: var(--rule)">
   (the SPACED inline form is what the DOM actually holds — memory:
   inline-style-selectors). One hook, every list head in the product: Drafts,
   Active, the wizard's steps, the account bands.

   The span keeps its size and its place in the flex row — the vine is drawn on
   an absolutely-positioned pseudo that hangs 8px above and below a 1px box, so
   not one metric moves. The tile is SEAMLESS (a full sine period), repeated
   along x, so the rule is continuous at any column width.

   The ink is the accent the head rule already uses (--a1OnCanvas), so the
   sprig at the top of the page and every rule below it are one plant. MEASURED,
   not assumed: `currentColor` was the first cut and it came out at
   rgb(36,27,15) — the PAPER ink family — on a dark bed, because these section
   heads inherit their colour from the app's own inline `var(--muted)` and
   custom properties resolve where they are DECLARED (builder A). It was
   near-invisible. On stock the accent is restated below.                     */
@supports ((mask-image: url("patterns/orn-vinetile.svg")) or (-webkit-mask-image: url("patterns/orn-vinetile.svg"))) {
  .fl-root [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"],
  body:not(:has(.fl-root)):not(.embed) [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"] {
    position: relative;
    background: transparent !important;   /* the vine IS the rule now */
  }
  .fl-root [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  body:not(:has(.fl-root)):not(.embed) [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: calc(50% - var(--g-orn-vine-h) / 2);
    height: var(--g-orn-vine-h);
    pointer-events: none;
    opacity: .72;
    background-color: var(--a1OnCanvas);
    -webkit-mask-image: var(--g-orn-vine);
            mask-image: var(--g-orn-vine);
    -webkit-mask-size: auto var(--g-orn-vine-h);
            mask-size: auto var(--g-orn-vine-h);
    -webkit-mask-repeat: repeat-x;
            mask-repeat: repeat-x;
    -webkit-mask-position: left center;
            mask-position: left center;
  }
  /* on STOCK the canvas accent is the wrong ink (it is tuned against the room,
     not against cream), so every rule that runs inside a sheet takes the
     stock accent instead. Same plant, the surface's own ink. */
  .fl-root .ui-card [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .fl-root .fl-pv-panel [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .fl-root .v2-svp__card [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .fl-root .fl-rp-frame [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .fl-root .v2-pk [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .ui-sheet [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  body:not(:has(.fl-root)):not(.embed) [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before {
    background-color: var(--a1Text);
    opacity: .6;
  }
}


/* ── P3 · THE HEAD RULE, RUNNING ───────────────────────────────────────────
   Fragment N made one head rule for the whole product: a 1px hairline painted
   as a background gradient across the column, with the 58×24 sprig hung at its
   left end (on ::after for the Loopvine family, on ::before for the wizard
   family — so exactly one pseudo is free on each, and this fragment takes the
   free one on each).

   The hairline now stops at 62px — just past the sprig, which needs something
   to sit on — and the vine carries the rest of the run out to the right
   margin. Same object, same geometry, same ink family as N; it simply stops
   being a straight 1px line for 90% of its length.                           */
@supports ((mask-image: url("patterns/orn-vinetile.svg")) or (-webkit-mask-image: url("patterns/orn-vinetile.svg"))) {
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"],
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"] {
    background-size: 62px 1px !important;
    overflow: visible;
  }
  .fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf), :has(> [style*="min-height: 44px"] + [style*="font: 400 14px"] + [style*="border-top: 1px solid var(--rule)"] + [style*="margin: 20px 0px 3"])) > [style*="border-top: 1px solid var(--rule)"][style*="margin: 22px 0px 0px"]::before,
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::after {
    content: "";
    position: absolute;
    left: 62px;
    right: 0;
    top: calc(50% - var(--g-orn-vine-h) / 2);
    height: var(--g-orn-vine-h);
    pointer-events: none;
    opacity: .62;
    background-color: var(--a1OnCanvas);
    -webkit-mask-image: var(--g-orn-vine);
            mask-image: var(--g-orn-vine);
    -webkit-mask-size: auto var(--g-orn-vine-h);
            mask-size: auto var(--g-orn-vine-h);
    -webkit-mask-repeat: repeat-x;
            mask-repeat: repeat-x;
    -webkit-mask-position: left center;
            mask-position: left center;
  }
}

/* ·· THE CHAPTER RULE on About ·············································
   The About page repeats the same house mark down its whole length — a 1px
   hairline painted across the top of each `.fl-ab-ch2` block with the sprig
   hung at its left end (fragment D's D2). Six of them on one page, and they
   were six plain lines. Same treatment, same geometry: the flat rule stops
   just past the sprig and the vine runs the rest of the way. ::after is free
   on this block (the sprig is on ::before) — read off the running page.      */
@supports ((mask-image: url("patterns/orn-vinetile.svg")) or (-webkit-mask-image: url("patterns/orn-vinetile.svg"))) {
  .fl-root .fl-ab-ch2 { background-size: 62px 1px !important; }
  .fl-root .fl-ab-ch2::after {
    content: "";
    position: absolute;
    left: 62px;
    right: 0;
    top: calc(-1 * var(--g-orn-vine-h) / 2);
    height: var(--g-orn-vine-h);
    pointer-events: none;
    opacity: .62;
    background-color: var(--a1OnCanvas);
    -webkit-mask-image: var(--g-orn-vine);
            mask-image: var(--g-orn-vine);
    -webkit-mask-size: auto var(--g-orn-vine-h);
            mask-size: auto var(--g-orn-vine-h);
    -webkit-mask-repeat: repeat-x;
            mask-repeat: repeat-x;
    -webkit-mask-position: left center;
            mask-position: left center;
  }
}


/* ── P4 · THE ENGRAVED CORNER, printed into the paper ──────────────────────
   Fragment D gives every sheet of stock the same two-layer paper stack:
       background-image: var(--g-fibre), var(--p-paper-lit)
       background-size:  var(--g-fibre-size), auto
       background-repeat: repeat, no-repeat
       background-blend-mode: multiply, normal
   The ornament is added as the TOP layer of that same stack, restated
   faithfully underneath it. That choice is the whole reason this fragment can
   exist: fragment J owns ::before on these boxes (the plate line) and fragment
   O owns ::after (the edge ring), and a background layer needs neither.

   Printed bottom-right on purpose: this app's type is left-aligned and ragged
   right, so the bottom-right is the one corner reliably clear of a word. The
   loop rows are the exception — their bottom-right carries the timestamp and
   the delete word — so they take the specimen watermark below instead.

   TWO SHEETS ARE DELIBERATELY ABSENT, and both absences were measured on the
   running app rather than reasoned about: the demo phone carries the engraved
   FRAME below (a frame and a corner-piece in the same corner is a pile, not a
   composition — the first cut shipped both and it read exactly like the
   "extra lines around the corners" the owner is complaining about), and the
   respondent preview panel's last line runs the full width of the sheet, so
   any corner plate there lands on a word.

   The class is doubled on purpose. MEASURED: fragment D also paints these
   sheets through `.fl-root [style*="border-radius: 12px"][style*="border: 1px
   solid var(--rule)"]`, which is (0,3,0) and outranks a plain `.fl-root
   .fl-ab-quote` (0,2,0) no matter how late this fragment loads — the first cut
   of this rule simply never appeared. Doubling the class matches that weight
   and lets source order decide, which is what "one selector, one owner, later
   fragment wins" is supposed to mean.                                        */
.fl-root .v2-svp__card.v2-svp__card,
.fl-root .fl-ab-quote.fl-ab-quote,
.fl-root .fl-ab-cta.fl-ab-cta {
  background-color: var(--sheet) !important;
  background-image:
    var(--g-orn-corner),
    var(--g-fibre),
    var(--p-paper-lit) !important;
  background-size:
    var(--g-orn-corner-size) var(--g-orn-corner-size),
    var(--g-fibre-size),
    auto !important;
  background-position:
    right var(--g-orn-in) bottom var(--g-orn-in),
    0 0,
    0 0 !important;
  background-repeat: no-repeat, repeat, no-repeat !important;
  background-blend-mode: normal, multiply, normal !important;
}
/* the small panels take a smaller plate, cut to the margin they actually have
   below their last line — one size does not fit a 302px preview and a 664px
   callout */
.fl-root .fl-ab-quote { --g-orn-corner-size: 54px; }
.fl-root .v2-svp__card { --g-orn-corner-size: 56px; }


/* ── P5 · THE PRESSED SPECIMEN ─────────────────────────────────────────────
   A full frond pressed into the largest paper objects and into every loop row.
   It is a BACKGROUND LAYER, so it sits behind every word by construction —
   nothing is painted over a glyph and no contrast measurement moves by more
   than the plate's own baked 16% (on cream) / 10% (in lamplight).

   The loop rows get it alone: their corners are spoken for (the sample stamp
   top-right, the timestamp and the delete word bottom-right), and a watermark
   is the ornament that fits a box already full of type.                      */
.fl-root .fl-rp-frame.fl-rp-frame,
.fl-root .fl-pv-panel.fl-pv-panel:not([style*="display: none"]) {
  background-color: var(--sheet) !important;
  background-image:
    var(--g-orn-spec),
    var(--g-fibre),
    var(--p-paper-lit) !important;
  background-size:
    var(--g-orn-spec-size) var(--g-orn-spec-size),
    var(--g-fibre-size),
    auto !important;
  background-position:
    right -54px bottom -40px,
    0 0,
    0 0 !important;
  background-repeat: no-repeat, repeat, no-repeat !important;
  background-blend-mode: normal, multiply, normal !important;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
  background-color: var(--sheet) !important;
  background-image:
    var(--g-orn-spec),
    var(--g-fibre),
    var(--p-paper-lit) !important;
  background-size:
    190px 190px,
    var(--g-fibre-size),
    auto !important;
  background-position:
    right -10px bottom -32px,
    0 0,
    0 0 !important;
  background-repeat: no-repeat, repeat, no-repeat !important;
  background-blend-mode: normal, multiply, normal !important;
}
/* MEASURED, not assumed: every SECOND row is a different stock — an earlier
   fragment prints it on kraft (`var(--g-fibre), var(--g-kraft)`) through a
   `:nth-of-type(2n)` selector, which outranks the plain row rule. Restating the
   plain stack alone silently left half the list without a watermark. The kraft
   run keeps its own paper; it just gains the same pressed frond.             */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:nth-of-type(2n) {
  background-image:
    var(--g-orn-spec),
    var(--g-fibre),
    var(--g-kraft) !important;
  background-size:
    190px 190px,
    var(--g-fibre-size),
    auto !important;
  background-position:
    right -10px bottom -32px,
    0 0,
    0 0 !important;
  background-repeat: no-repeat, repeat, no-repeat !important;
  background-blend-mode: normal, multiply, normal !important;
}


/* ·· THE DRAFT CARDS ·······················································
   MEASURED on the running list: the cards in Loopvine are not the loop rows.
   They are plain divs carrying `overflow: hidden; background: var(--sheet)`,
   and they take the app-wide sheet paint — `var(--p-paper-lit), var(--p-grain)`
   at `auto, 128px 128px` — not fragment D's fibre stack. Restating D's stack
   here would have silently repainted half the list in the wrong material, so
   the card's own two layers are kept exactly and the frond is pressed on top
   of them. (128px is the grain's own tile, read off the computed value.)     */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden"][style*="background: var(--sheet)"] {
  background-image:
    var(--g-orn-spec),
    var(--p-paper-lit),
    var(--p-grain) !important;
  background-size:
    190px 190px,
    auto,
    128px 128px !important;
  background-position:
    right -10px bottom -32px,
    0 0,
    0 0 !important;
  background-repeat: no-repeat, no-repeat, repeat !important;
  background-blend-mode: normal, normal, multiply !important;
}


/* ── P6 · THE ENGRAVED FRAME on the demo phone ─────────────────────────────
   `.fl-rp-frame` is the object the whole "what others see" section exists to
   show. It gets a real frame: a nine-slice border-image cut at 26, so the four
   corners keep their leaf bracket at any size and the four runs are a pure
   double rule that stretches without a seam.

   ::after is free here (fragment J took ::before for the plate line, fragment
   O paints into it) — verified in the running app, not assumed.              */
.fl-root .fl-rp-frame::after {
  content: "";
  position: absolute;
  inset: 12px;
  z-index: 0;
  pointer-events: none;
  border: 26px solid transparent;
  border-image: var(--g-orn-frame) 26 round;
}


/* ── P7 · GOLD LEAF — Lamplight and Blue Hour ──────────────────────────────
   The owner is looking at the dark rooms tonight, and a dark room whose only
   material is matte paper reads as unlit rather than as evening. Gilding is
   what a bindery does to a dark board: a fine warm line along the edge that
   catches the lamp.

   Token-level, so every sheet in the app takes it at once: fragment O declares
   the edge ring and the crown as PARAMETERS, so this extends them rather than
   fighting a selector. Nothing here paints inside a box — every layer is a 1px
   rim or an outboard bloom — and --boxGlow stays last in the stack (LAW 4).  */
[data-palette="ember"], [data-palette="midnight"] {
  --g-gilt: #E7C489;
  --g-edge-lit:      color-mix(in oklab, var(--g-gilt) 46%, transparent);
  --g-edge-lit-up:   color-mix(in oklab, var(--g-gilt) 66%, transparent);
  --g-edge-crown:    inset 0 2px 5px -3px color-mix(in oklab, var(--g-gilt) 58%, transparent);
  --g-edge-ring:     inset 0 0 0 1px color-mix(in oklab, var(--g-gilt) 22%, transparent);
  /* NO directional `inset 0 1px 0` here, however tempting a gilt top edge is:
     a one-directional inset shadow on a rounded box paints a crescent that
     tapers out mid-arc at both top corners — the exact doubled edge fragment O
     was written to remove, and the exact thing the owner called sloppy. The
     gilding is carried by the uniform ring and the blurred crown, both of
     which close on themselves. */
  --p-shadow:
    var(--g-edge-ring),
    var(--g-edge-crown),
    -6px 14px 26px -18px rgba(0, 0, 0, .85),
    0 16px 42px -10px var(--boxGlow, transparent);
  --g-lift-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--g-gilt) 34%, transparent),
    inset 0 2px 5px -3px color-mix(in oklab, var(--g-gilt) 66%, transparent),
    -10px 22px 34px -16px rgba(0, 0, 0, .92),
    0 22px 56px -8px var(--boxGlow, transparent);
}
/* the rail's masthead seam and the tray's rim are the two hairlines a reader
   passes on every screen — in the dark rooms they are gilt, not grey */
[data-palette="ember"] .fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"],
[data-palette="midnight"] .fl-root > div[style*="width: 212px"][style*="position: sticky"] > div[style*="border-radius: 16px"][style*="margin-bottom: 2px"] {
  background-image: linear-gradient(90deg,
    color-mix(in oklab, var(--g-gilt) 62%, transparent),
    color-mix(in oklab, var(--g-gilt) 8%, transparent)) !important;
}


/* ── P8 · THE NAV, LIT — AND THE SAME EVERYWHERE ───────────────────────────
   THE BUG, read out of the app's own code rather than guessed: the rail draws
   its main rows with `activeStyle(on)`, which sets `background: var(--a1)`
   when lit, and the "what others see" rows with `groupRowStyle(on)`, which
   sets `background: var(--tint1)` and `border-radius: 10px`. Fragment B's lit
   rule only ever matched `var(--a1)` / `var(--cta)`, so Respondent, Survey and
   Recipient lit up as a 10px tint that fragment B then painted transparent —
   an active item with no active state, which is exactly what the owner saw:
   "one is selected without it even looking so".

   ONE state, three hooks: --a1 (the rail), --cta, and --tint1 (the group). And
   the plaque stops being a flat fill and becomes a LIT OBJECT: the lamp rakes
   it from the top right (fragment F's sun), its lower edge falls into shade, a
   hairline of light sits along the top, and the room's own glow pools under
   it. The label keeps --canvas, which fragment B measured at 5.25–8.51:1 on
   this plate in all six rooms; nothing here lightens it.                     */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"],
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"],
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"] {
  background-color: var(--a1OnCanvas) !important;
  background-image:
    radial-gradient(120% 160% at 88% -30%,
      color-mix(in oklab, white 34%, transparent) 0%,
      transparent 62%),
    linear-gradient(168deg,
      color-mix(in oklab, var(--a1OnCanvas) 96%, white) 0%,
      color-mix(in oklab, var(--a1OnCanvas) 84%, black) 100%) !important;
  color: var(--canvas) !important;
  border-radius: 999px !important;
  border-bottom-color: transparent !important;
  font-variation-settings: "wdth" 92, "wght" 600 !important;
  font-weight: 600 !important;
  text-shadow: none !important;
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 46%, transparent),
    inset 0 -1px 0 color-mix(in oklab, black 22%, transparent),
    0 1px 0 color-mix(in oklab, var(--canvas) 55%, transparent),
    0 8px 16px -11px rgba(0, 0, 0, .95),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* the row's glyph and its bullet take the plate's own dark, so a lit item is
   ONE object rather than a fill with two loose marks on it */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"] svg {
  color: color-mix(in oklab, var(--canvas) 78%, var(--a1OnCanvas)) !important;
  stroke: color-mix(in oklab, var(--canvas) 78%, var(--a1OnCanvas)) !important;
  opacity: 1;
}
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"]::after {
  background-color: color-mix(in oklab, var(--canvas) 70%, var(--a1OnCanvas));
  opacity: 1;
}
/* fragment B draws the group's seam hairline on the ROW; a lit row is a plaque
   and a plaque has no seam through it */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"][style*="border-bottom: 1px solid var(--rule)"] {
  border-bottom: 0 !important;
}

/* ONE HOVER, everywhere. Fragment B excludes a1/cta rows from its hover wash
   but not tint1 rows, so an active group row washed over its own plaque. The
   exclusion is completed and the wash restated at B's own strength, so rail
   rows and group rows behave identically under the hand.                     */
@media (hover: hover) {
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:hover:not([style*="background: var(--a1)"]):not([style*="background: var(--cta)"]):not([style*="background: var(--tint1)"]) {
    background-color: color-mix(in oklab, var(--onCanvas) 7%, transparent) !important;
    color: var(--onCanvas) !important;
    box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--a1OnCanvas) 26%, transparent) !important;
  }
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"]:hover {
    background-color: var(--a1OnCanvas) !important;
  }
  /* the lit plaque under the hand: the lamp comes up, the object does not move
     (a plaque bolted to the fence has nowhere to go) */
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--a1)"]:hover,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--cta)"]:hover,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"]:hover {
    box-shadow:
      inset 0 1px 0 color-mix(in oklab, white 62%, transparent),
      inset 0 -1px 0 color-mix(in oklab, black 22%, transparent),
      0 1px 0 color-mix(in oklab, var(--canvas) 55%, transparent),
      0 10px 20px -11px rgba(0, 0, 0, .95),
      0 20px 52px -10px var(--boxGlow, transparent) !important;
  }
}
/* keyboard: the same plaque plus the room's own bright ring, on every item */
.fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav:focus-visible {
  outline: 2px solid color-mix(in oklab, var(--a1OnCanvas) 80%, transparent) !important;
  outline-offset: 2px !important;
}

/* ·· THE MOBILE BAR — the same lit pill, laid flat ··························
   Fragment B decided the bar's active tab would be ink only ("a filled 66px
   plaque at 390px reads as a button someone forgot to remove"). The owner has
   now asked for the opposite in as many words — the same filled lit pill on
   the rail AND the bar — so the plaque comes back, drawn on a pseudo inset
   from the tab's own box so it reads as a lit key rather than a stray button.
   The tab keeps its 54px target and its ink measures on the plate.

   AND THE PLATE IS DECLARED, NOT ONLY DRAWN. A pseudo-element is paint, not a
   background: nothing that reads an element's own ground — the review harness,
   a contrast checker, forced-colors — can see it, so a tab that says
   `background: transparent` while carrying `color: var(--canvas)` describes
   bed ink on the bed. That is what the 2026-08-19 sweep reported: 78 "mark
   nearly invisible" (every active tab's glyph, 13 screens x 6 rooms, both
   bars) and the account tab's "@maya" at 1.02:1 — ink that in truth sits on a
   lit plate, measured against the bar behind it. The tab now declares that
   plate as its OWN ground, clipped to the content box: fragment B pads these
   tabs 7px 4px 8px, so the declared ground lies wholly under the ::before
   plaque and NOTHING on screen changes — the ground is simply true where the
   label and the glyph actually stand.

   The corner is the whole trick. A content box clipped at fragment B's 18px
   radius turns a tighter curve than the plaque's own cap, so its corners
   crossed the plaque's edge and flattened the pill by a pixel (seen at 10x
   against the previous build). The tab's radius is raised to 24px — invisible
   in itself, since the tab paints nothing at its own edge and its overflow
   clip stays clear of every label — which brings the clipped corner back
   INSIDE the cap. Verified by diffing the cap at 10x: pixel for pixel the
   plaque of the build before this change.                                    */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--tint1)"] {
  position: relative;
  background-color: var(--a1OnCanvas) !important;
  background-image: none !important;
  background-clip: content-box !important;
  color: var(--canvas) !important;
  box-shadow: none !important;
  z-index: 0;
}
/* The 24px is stated on its own because fragment E owns every corner in the
   app — its "Parlor leftovers" rule catches the desktop bar button by its
   inline `border-radius: 999px` and hands it --p-rad, at a weight above the
   rule above. This does not fight that decision: the tab paints nothing at
   its own edge (no border, no shadow, and its background is clipped to the
   content box), so its radius is invisible except as the shape of the
   declared ground and of its overflow clip — which stays well clear of every
   label at 390. E keeps the corners; the plate keeps its cap.                */
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn.fl-btn[style*="background: var(--a1)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn.fl-btn[style*="background: var(--cta)"],
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn.fl-btn.fl-btn[style*="background: var(--tint1)"] {
  border-radius: 24px !important;
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"]::before,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"]::before,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--tint1)"]::before {
  content: "";
  position: absolute;
  inset: 3px 2px;
  z-index: -1;
  border-radius: 999px;
  pointer-events: none;
  background-color: var(--a1OnCanvas);
  background-image:
    radial-gradient(120% 160% at 88% -30%,
      color-mix(in oklab, white 34%, transparent) 0%, transparent 62%),
    linear-gradient(168deg,
      color-mix(in oklab, var(--a1OnCanvas) 96%, white) 0%,
      color-mix(in oklab, var(--a1OnCanvas) 84%, black) 100%);
  box-shadow:
    inset 0 1px 0 color-mix(in oklab, white 46%, transparent),
    inset 0 -1px 0 color-mix(in oklab, black 22%, transparent),
    0 8px 16px -11px rgba(0, 0, 0, .95),
    0 16px 42px -10px var(--boxGlow, transparent);
}
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"] svg,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"] svg,
.fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--tint1)"] svg {
  color: color-mix(in oklab, var(--canvas) 82%, var(--a1OnCanvas)) !important;
  stroke: color-mix(in oklab, var(--canvas) 82%, var(--a1OnCanvas)) !important;
  opacity: 1;
}


/* ── P9 · REDUCED MOTION ───────────────────────────────────────────────────
   Every mark in this fragment is a printed one: nothing travels, nothing
   animates, and the lit plaque's hover is a change of light rather than a
   move. The block is explicit so the ornament is provably inert.             */
@media (prefers-reduced-motion: reduce) {
  .fl-root [style*="flex: 1 1 0%"][style*="height: 1px"][style*="background: var(--rule)"]::before,
  .fl-root .fl-rp-frame::after,
  .fl-scroll:has(.v2-sent) > [style*="margin: 22px 0px 20px"]::after,
  .fl-root > div[style*="width: 212px"][style*="position: sticky"] .fl-nav[style*="background: var(--tint1)"],
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--tint1)"]::before {
    transition: none !important;
    animation: none !important;
  }
}


/* ── P10 · THE PHONE (390) ─────────────────────────────────────────────────
   Every plate steps down a rung: a 62px corner on a 358px card is a poster and
   a 250px frond on a 358px sheet is wallpaper. The frame narrows so the phone
   keeps its inside width, and the running rule loses a little of its swing so
   a 130px section rule still reads as a vine rather than as a squiggle.
   Nothing grows a box — every mark is a background layer or a
   pointer-events:none pseudo — and no tap target is touched.                 */
@media (max-width: 480px) {
  :root {
    --g-orn-corner-size: 46px;
    --g-orn-in: 8px;
    --g-orn-spec-size: 180px;
    --g-orn-vine-h: 15px;
  }
  .fl-root .fl-ab-quote { --g-orn-corner-size: 44px; }
  .fl-root .v2-svp__card { --g-orn-corner-size: 44px; }
  /* the phone pulls fragment B's bar tabs in to 2px at the sides, which puts
     the lit tab's declared ground (above) flush with the plaque's own edge and
     lets its corner cross the cap. One pixel of side padding — the label still
     clears it by a wide margin at 390 — seats it back inside.                */
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--a1)"],
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--cta)"],
  .fl-root [style*="position: fixed"][style*="backdrop-filter"][style*="var(--sheet)"] .fl-btn[style*="background: var(--tint1)"] {
    padding-left: 3px !important;
    padding-right: 3px !important;
  }
  .fl-root .fl-rp-frame::after {
    inset: 6px;
    border-width: 20px;
    border-image: var(--g-orn-frame) 26 round;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"] {
    background-size: 150px 150px, var(--g-fibre-size), auto !important;
    background-position: right -22px bottom -28px, 0 0, 0 0 !important;
  }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"]:nth-of-type(2n) {
    background-size: 150px 150px, var(--g-fibre-size), auto !important;
    background-position: right -22px bottom -28px, 0 0, 0 0 !important;
  }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden"][style*="background: var(--sheet)"] {
    background-size: 150px 150px, auto, 128px 128px !important;
    background-position: right -22px bottom -28px, 0 0, 0 0 !important;
  }
  .fl-root .fl-rp-frame.fl-rp-frame,
  .fl-root .fl-pv-panel.fl-pv-panel:not([style*="display: none"]) {
    background-position: right -42px bottom -32px, 0 0, 0 0 !important;
  }
}



/* ═══ GARDEN FRAGMENT frag-q-chat.css ═══ */
/* ═══════════════════════════════════════════════════════════════════════════
   FRAGMENT Q — THE THREAD (the chat screen)
   Owner: builder Q.  Assembles after frag-n-parity, before frag-z-lead.

   Owner, live, 2026-08-19 (three screenshots of /#/chat/…):
     "major issues with the formatting here"
     "the subject and the message should be connected better, for page
      organization for user"

   ── WHAT THE SCREEN ACTUALLY IS (measured, not read off the template) ──────

   The thread is NOT a screen. `screen === 'chats'` has no template branch at
   all; the route `#/chat/<id>` sets `{ screen:'insights', openChatId:<id> }`,
   and the thread renders from an INDEPENDENT `sc-if {{ chatOpen }}` as a
   `position:fixed; inset:0; z-index:55` overlay that is a DOM child of the
   paper panel. The Loopvine screen underneath stays mounted by design.

   So this fragment takes the second route the brief allows: the overlay stays
   an overlay, and it is composed as a full-viewport SHEET — one working column
   on the room's own bed, the list sealed off behind it.

   ── THE FOUR FAULTS, EACH WITH ITS MEASURED CAUSE ─────────────────────────

   1 · THE LIST BLEEDS THROUGH.  Root cause, and not a guess: the overlay
       paints `background-color:var(--canvas); background-image:var(--wall)`,
       and TWO rules strip exactly that pair — parlor.css:716 (0,6,1) and
       frag-b-shell.css:290 (0,5,1), both saying

           background-color: transparent !important;
           background-image: none !important;

       on `[panel]:not(textarea) > [style*="background-color: var(--canvas)"]`.
       Their intent is "the SCREEN's canvas wrapper goes clear so the bed runs
       edge to edge". The thread overlay is ALSO a direct child of the panel
       and ALSO paints the canvas, so it was stripped too — leaving a
       transparent full-viewport sheet with the Loopvine list showing through
       it on every side. Not inferred: every rule matching the overlay was
       enumerated in the live page with `el.matches()`, and those two are the
       only ones touching its background; disabling the sheet brings the
       colour back. Q1 gives the overlay THE BED instead.

   2 · THE GIANT WORDMARK.  The overlay renders its own centred lockup
       (`.fl-lockup-card > .fl-logo.fl-hero-logo`, inline
       `font-size:clamp(22px,3.8vw,29px)`). `.fl-hero-logo` is the Garden's
       HOME MASTHEAD — frag-a sets `font-size: clamp(31px,7.2vw,82px)
       !important` on the bare class — so the inline clamp loses and the mark
       renders at 82px in a 632×190 cream pill over the head. It is not the
       mobile bar's `.fl-mlock` (that cannot render above 1024px); it is a
       bare lockup with no container hook. Q2 retires it: the thread is a
       reading view reached by Back, and the rail it covers already carries
       the mark.

   3 · NO PAGE ORGANISATION.  The card's own order is
       [masthead · identity chip · "Re: <subject>" · AI summary] then
       [messages] then [composer]. The subject was a 12.5px grey line 176px of
       summary card ABOVE the first message — the two things the page is
       actually about, pushed apart by the machine's commentary.

   4 · THE FOOTER MID-AIR.  It is the last child of `.fl-chat-scroll` and was
       always in the right place; on a transparent sheet it simply looked
       like it was floating over the list. Q1 fixes it by fixing the ground.

   ── THE COMPOSITION ───────────────────────────────────────────────────────

   `display: contents` on the card's header block is the whole move. The
   compiled DOM keeps NO `sc-if` wrapper elements (verified by walking the
   live subtree), so dissolving that one box promotes its children — masthead,
   chip, subject, summary — to siblings of the messages and the composer, and
   a single flex column can then order all of them:

     masthead (who · title · Reveal/Leave)      order 1
     identity chip                              order 2
     reveal / leave confirm bars                order 3
     ── hairline + sprig, the house head mark ──
     THE SUBJECT, set as the thread's title     order 4
     THE MESSAGES                               order 5   ← nothing between
     draft bar · identity requests              order 6–8
     the composer                               order 9
     rejoin / others-gone notices               order 10–11
     the AI summary, a quiet closing aside      order 12

   Subject and thread share one ground, with no rule, no card edge and no
   third object between them: the subject reads as the thread's title and the
   first bubble as its first line. The summary keeps every word — it is moved
   and quietened, never hidden or truncated (a summary you cannot open is
   worse than a loud one).

   The bubbles are polished only — the owner's third message says they read
   well. Line-height, row rhythm and one rung of size; no new colours, no new
   geometry, no change to the You/Them sides or inks.

   Laws honoured: nothing here touches the paper panel (no filter/mask/
   transform/clip-path/animation on it — the overlay is a CHILD of the panel,
   not the panel); no ink is lightened and no ground is tinted under text
   except where the ink is restated with it; `var(--boxGlow)` is never removed
   from a shadow stack (no shadow stack is rewritten here); relative URLs only,
   data URIs percent-encoded; container-scoped selectors throughout — every
   rule is prefixed with `.fl-chat-scroll`, which occurs exactly once in the
   bundle and cannot reach any other screen; no user-visible garden vocabulary
   and no CSS-injected text (the app is translated — `content:""` may carry a
   mark, never a word).

   SECOND PASS — what LOOKING at it changed (six rooms x 1280/390, plus the
   boot, draft, leave-confirm and received-thread states; the first pass was
   written but never rendered):
     · the BOOT state ("Opening your thread…") left the footer stranded in the
       middle of an empty bed. With no card in the column the scroller becomes
       a flex column and the footer takes the foot of the room. (Q2)
     · the draft bar and its delete confirmation kept the template's 16px
       gutter while the rest of the column stands on 20px — the "Saved as
       draft" pill sat 5px outside the subject's left edge, measured. (Q6)
     · at 390 the summary's kicker "CONVERSATION SUMMARY" broke onto two lines
       in ember (design review, med): the label never breaks now, and the
       version control drops under it only when the two cannot share a line.
   Measured on the finished screen, all six rooms: Back 9.2–11.6:1 at rest and
   8.6–13.0:1 hovered (on its own washed ground), focus ring 7.0–11.6:1, the
   subject 13.1–14.2:1, the demoted summary body 7.0–8.3:1.

   FOR THE LEAD — two things that belong to earlier fragments and are patched
   here only as container-scoped stopgaps, flagged in the report:
     · frag-b list C names `.fl-back-pill` as a STOCK object, so it restores
       the PAPER inks; on this screen it stands on the BED. Q3 re-flips it.
     · frag-b's canvas-strip (fault 1) should exclude the thread overlay at
       source rather than be out-specified here.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── Q1 · THE SHEET: give the overlay the room's own bed ────────────────────
   Layer for layer, size for size, repeat for repeat and blend for blend,
   identical to frag-b's `.fl-root` — the same restatement `.fl-foot-canvas
   ::before` already makes. Both boxes have their top-left at the viewport
   origin and both are viewport-fixed, so the `fixed` layers register exactly
   and the `scroll` layers start from the same corner: the sheet is
   indistinguishable from the room it covers, and the list behind it is gone.

   Specificity is the whole fight here, not source order: both strips are
   `!important`, and the stronger of the two (parlor.css:716) is (0,6,1). This
   selector is `.fl-root` + SIX attribute hooks + `:has(> .fl-chat-scroll)` =
   (0,8,0), which clears it. Every hook is a real, load-bearing part of the
   overlay's own inline style, so the selector still describes exactly one box
   in the bundle and nothing else can drift into it. */
.fl-root [style*="position: fixed"][style*="inset: 0px"][style*="z-index: 55"][style*="background-color: var(--canvas)"][style*="background-image: var(--wall)"][style*="background-size: 1140px"][style*="background-repeat: repeat"]:has(> .fl-chat-scroll) {
  background-color: var(--canvas) !important;
  background-image:
    var(--p-grain),
    radial-gradient(120% 70% at 82% -14%,
      color-mix(in oklab, var(--a2) 16%, transparent) 0%,
      color-mix(in oklab, var(--a2) 5%, transparent) 40%,
      transparent 70%),
    radial-gradient(60% 50% at 4% 104%,
      color-mix(in oklab, var(--a3) 26%, transparent) 0%, transparent 72%),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg,
      var(--velvet) 0%, var(--canvas) 48%, var(--g-bed-deep) 100%) !important;
  background-size: 128px 128px, auto, auto, var(--g-bed-repeat-size), auto, auto !important;
  background-repeat: repeat, no-repeat, no-repeat, repeat, repeat, no-repeat !important;
  background-attachment: scroll, fixed, fixed, scroll, scroll, fixed !important;
  background-blend-mode: soft-light, normal, normal, normal, normal, normal !important;
  /* the sheet is opaque, so it may as well be the scroll container's own
     isolation root — a bubble's glow can never bleed onto the list beneath */
  isolation: isolate;
}


/* ── Q2 · ONE WORKING COLUMN, AND NO STRAY MASTHEAD ────────────────────────
   Every other screen reads in the 760px column (frag-n states it for the page
   head; frag-b for the scroller). The thread was at 900px and centred on the
   VIEWPORT rather than on the column, so it sat off-axis from every screen it
   opens from. 760px, centred, with the room's own top air.

   The lockup goes with it. Both instances — the loading state's and the
   thread's — are `div[text-align:center] > span.fl-lockup-card`, and that
   pairing occurs nowhere else inside this container. */
.fl-chat-scroll {
  max-width: 760px !important;
  /* the bundle's own .fl-chat-scroll rule carries `margin: 0 !important`, which
     beats the template's inline `margin-left:auto` — the column was pinned to
     the left edge of the viewport, off-axis from every screen it opens from */
  margin-inline: auto !important;
  padding: 40px 24px 0 !important;
  scroll-behavior: smooth;
}
.fl-chat-scroll > [style*="text-align: center"]:has(> .fl-lockup-card) {
  display: none !important;
}

/* the Back control stands on the BED, and it was reading at 1.71:1 — measured,
   not guessed. Two earlier rules meet on it: frag-b list C names `.fl-back-pill`
   a STOCK object (so `--muted` becomes the paper muted), and frag-c's ghost-wash
   rule `.fl-root button.fl-btn[style*="color: var(--muted)"]` repaints it
   `--p-quiet` — a PAPER ink — at (0,3,1)!important. Fragment C's own law is the
   right one ("a button takes the ink of the surface it stands on"); the surface
   here is simply the bed, which C could not have known. So both paper inks are
   re-pointed at the bed's own, and the selector carries `.fl-root` + the type
   selector to clear (0,3,1). Tap target and hit area untouched. */
.fl-root .fl-chat-scroll > button.fl-btn.fl-back-pill {
  --muted: var(--onCanvasBody);
  --p-quiet: var(--onCanvasBody);
  color: var(--onCanvasBody) !important;
  border-radius: 999px !important;
  padding: 10px 16px 10px 12px !important;
  margin: 0 0 18px -12px !important;
  letter-spacing: .012em !important;
  transition: color var(--g-t-hover, 180ms) var(--g-e-out, ease),
              background-color var(--g-t-hover, 180ms) var(--g-e-out, ease);
}
.fl-root .fl-chat-scroll > button.fl-btn.fl-back-pill:hover {
  --muted: var(--onCanvas);
  --p-quiet: var(--onCanvas);
  color: var(--onCanvas) !important;
  background-color: color-mix(in oklab, var(--onCanvas) 10%, transparent) !important;
}
.fl-root .fl-chat-scroll > button.fl-btn.fl-back-pill:focus-visible {
  outline: 2px solid var(--a1OnCanvas);
  outline-offset: 3px;
}

/* the loading pill sits alone on the bed once the lockup is gone — centre it
   in the column's vertical air rather than at the very top of the scroll */
.fl-chat-scroll > [style*="text-align: center"][style*="padding: 40px 0px"] {
  padding: 96px 0 !important;
}
/* …and while the thread is still opening the footer was left stranded in the
   middle of an empty bed, one pill above it (verified in the boot state, not
   reasoned about). With no card in the column, the scroller becomes a flex
   column and the footer takes the foot of the room, where it belongs on every
   other screen. The `:not(:has(…))` is the card's own two hooks, so the moment
   the thread arrives this rule stops matching and normal flow resumes —
   nothing about the composed thread depends on it. */
.fl-chat-scroll:not(:has(> [style*="border-radius: 18px"][style*="overflow: hidden"])) {
  display: flex;
  flex-direction: column;
  min-height: 100%;
}
.fl-chat-scroll:not(:has(> [style*="border-radius: 18px"][style*="overflow: hidden"])) > .fl-about-foot.fl-foot-canvas {
  margin-top: auto !important;
}


/* ── Q3 · THE CARD BECOMES AN ORDERABLE COLUMN ─────────────────────────────
   The card is the only 18px/overflow-hidden box in this container. Making it
   a flex column costs nothing (its children were already full-width blocks in
   normal flow) and buys the ordering that the composition needs. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] {
  display: flex !important;
  flex-direction: column !important;
  overflow: hidden !important;
}

/* THE MOVE: dissolve the header box so its four children become siblings of
   the messages and the composer. Verified against the live DOM — the compiled
   template leaves no `sc-if` elements, so these are the header's real and only
   children. The box carried nothing but `padding:16px 20px` and a
   `border-bottom`; both are restated below on the children that need them. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] {
  display: contents !important;
}

/* the order. A child this fragment does not name lands at 3, i.e. with the
   masthead group — the place a notice about the thread belongs, and never
   between the subject and the first message. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > *,
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > * { order: 3; }

/* 1 · the masthead row (who · member · Inactive, and the Reveal/Leave pair).
   `gap: 12px` is what separates it from the confirm bars, which are also
   space-between + wrap but carry `gap: 14px` and a ground of their own. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="justify-content: space-between"][style*="gap: 12px"] {
  order: 1;
  padding: 18px 20px 0 !important;
}
/* 2 · the identity chip. A blockified inline-flex would stretch the whole
   column; it hugs its text, as a chip must. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 12px"][style*="display: inline-flex"] {
  order: 2;
  align-self: flex-start;
  max-width: calc(100% - 40px);
}
/* 3 · the reveal / leave confirmation bars keep their own 20px padding */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 12px 20px"] {
  order: 3;
  margin-top: 14px;
}
/* the safety net: any promoted header child with a margin-top of its own is
   inset to the card's 20px gutter, whether or not this fragment names it. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 12px"],
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 14px"],
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 11px"] {
  margin-left: 20px !important;
  margin-right: 20px !important;
}


/* ── Q4 · THE SUBJECT, SET AS THE THREAD'S TITLE ───────────────────────────
   "Re: <the question>" was 12.5px `--muted` with a 2px indent — the smallest
   thing on a page that is entirely about it. It becomes the display line, in
   the frag-n head grammar one rung down (the head of a card, not of a page):
   Fraunces, the house press, cap-tight, balanced, on a 32ch measure.

   The mark is frag-n's exactly — a hairline across the column with the sprig
   hung LEFT on it, `border-top: 0` so the 1px border cannot eat the 1px box
   (the bug frag-n found on Loopvine). It sits ABOVE the subject, not below:
   it closes the masthead and OPENS the thread, so the only thing under the
   subject is the conversation. That is the connection the owner asked for. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 10px"][style*="padding-left: 2px"] {
  order: 4;
  position: relative;
  box-sizing: content-box;
  border: 0;
  margin: 30px 20px 0 !important;
  padding: 26px 0 0 !important;
  font-family: 'Fraunces', Georgia, serif !important;
  font-weight: 500 !important;
  font-variation-settings: "wght" 600, "opsz" 144, "SOFT" 48, "WONK" 1 !important;
  font-size: clamp(22px, 2.1vw, 27px) !important;
  line-height: 1.14 !important;
  letter-spacing: -.02em !important;
  color: var(--ink) !important;
  text-shadow: var(--p-press) !important;
  text-wrap: balance;
  /* NO max-width: the hairline is this element's own background, so a measure
     here would cut the head rule short. frag-n's display line has no max-width
     either — `text-wrap: balance` is what keeps a long subject from running
     the full column as one line. */
  background-color: transparent !important;
  /* --ruleG is the BED's hairline (--onCanvas at 15%) and is invisible on the
     card's cream stock — measured at 0.15 alpha of #F0E4C8 over #F3E8D0. The
     stock hairline is --ruleS. */
  background-image: linear-gradient(90deg, var(--ruleS), var(--ruleS)) !important;
  background-size: 100% 1px !important;
  background-position: left top !important;
  background-repeat: no-repeat !important;
}
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 10px"][style*="padding-left: 2px"]::before {
  content: "";
  position: absolute;
  top: -12px;
  left: 0;
  width: 58px;
  height: 24px;
  background-color: var(--a1Text);
  -webkit-mask-image: var(--g-sprig);
          mask-image: var(--g-sprig);
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  pointer-events: none;
}


/* ── Q5 · THE MESSAGES, DIRECTLY UNDER THE SUBJECT ─────────────────────────
   Same ground, no rule, no gutter change: the thread block's top padding is
   the subject's own breathing room, so the title and the first bubble read as
   one object. The 20px side gutter matches the subject's margin exactly, so
   the column has ONE left edge from the masthead to the composer. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 20px"][style*="background: var(--sheet)"] {
  order: 5;
  padding: 18px 20px 4px !important;
}

/* the rows: one more step of air between turns, so a long thread reads as a
   sequence of moments rather than a stack. */
.fl-chat-scroll [style*="padding: 20px"][style*="background: var(--sheet)"] > [style*="flex-direction: column"][style*="margin-bottom: 12px"] {
  margin-bottom: 18px !important;
}
/* the bubbles: polish only — the owner reads them well as they are. One rung
   of size for the reading voice and a looser leading; the sides, the inks,
   the tails and the 78% measure are untouched. */
.fl-chat-scroll [style*="max-width: 78%"][style*="border-radius: 16px"] {
  font-size: 15px !important;
  line-height: 1.58 !important;
  padding: 12px 16px !important;
  letter-spacing: .002em !important;
  text-wrap: pretty;
}
/* the speaker label and the provenance line stay quiet and stay put — they
   are the bubble's furniture, not its voice. */
.fl-chat-scroll [style*="padding: 20px"][style*="background: var(--sheet)"] > [style*="flex-direction: column"] > [style*="font: 600 10.5px"] {
  letter-spacing: .05em !important;
  text-transform: uppercase !important;
  margin-bottom: 5px !important;
}
.fl-chat-scroll [style*="padding: 20px"][style*="background: var(--sheet)"] > [style*="flex-direction: column"] > [style*="margin-top: 4px"] {
  opacity: .78;
}


/* ── Q6 · THE REST OF THE COLUMN, IN READING ORDER ─────────────────────────
   Everything a person acts on sits with the composer; everything that is a
   note about the thread closes it. */

/* 6 · the "Saved as draft" bar, 7 · its delete confirmation. Both ship with the
   template's 16px gutter while every other row in this column stands on 20px —
   measured at 1280: the draft pill's left edge landed 5px outside the subject's.
   ONE left edge, masthead to composer, is the whole point of the composition. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 12px 16px 0px"] {
  order: 6;
  padding-left: 20px !important;
  padding-right: 20px !important;
}
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="margin: 12px 16px 0px"] {
  order: 7;
  margin-left: 20px !important;
  margin-right: 20px !important;
}
/* 8 · "they asked who sent this" — an action you take while replying, so it
   sits with the composer rather than at the top of the page */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 12px"][style*="background: var(--sheet)"] { order: 8; }
/* 9 · the composer */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 14px 16px"][style*="border-top: 1px solid var(--rule)"] {
  order: 9;
  padding: 16px 20px 18px !important;
  margin-top: 6px;
}
/* 10 · the rejoin bar for a thread you left */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px"][style*="border-top: 1px solid var(--rule)"][style*="justify-content: space-between"] { order: 10; }
/* 11 · "the others have gone" */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 12px"][style*="align-items: flex-start"] { order: 11; }


/* ── Q7 · THE SUMMARY, DEMOTED TO A CLOSING ASIDE ──────────────────────────
   It was 176px of gradient card wedged between the subject and the first
   message, its body set LARGER than the messages themselves. It is the
   machine's note about the conversation, so it now closes the conversation:
   last in the column, quiet ground, quiet measure, one step down in size —
   and every word still there, still regenerable, nothing collapsed away. */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 14px"][style*="linear-gradient(160deg"] {
  order: 12;
  margin: 4px 20px 20px !important;
  padding: 11px 14px !important;
  background-color: color-mix(in oklab, var(--rule) 26%, var(--sheet)) !important;
  background-image: none !important;
  border-color: var(--ruleG) !important;
}
/* the summary's body: below the bubbles, not above them */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] > [style*="font: 400 14px / 1.55"] {
  font-size: 13px !important;
  line-height: 1.5 !important;
  color: var(--body) !important;
  max-width: 62ch;
}
/* its kicker keeps the house label voice but loses the filled disc's weight */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] > [style*="margin-bottom: 7px"] {
  margin-bottom: 5px !important;
}
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] [style*="border-radius: 50%"][style*="width: 18px"] {
  opacity: .85;
}
/* the "consider for your next message" note follows the body down a rung */
.fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] > [style*="border-top: 1px dashed var(--rule)"] {
  margin-top: 9px !important;
  padding-top: 9px !important;
}


/* ── Q8 · THE FOOT OF THE COLUMN ───────────────────────────────────────────
   The footer was always the last child of the scroller; on a transparent
   sheet it merely looked like it was floating over the list. With the ground
   restored it only needs the room's own air above it. */
.fl-chat-scroll > .fl-about-foot.fl-foot-canvas {
  margin-top: 44px !important;
  margin-bottom: 40px !important;
}


/* ── Q9 · REDUCED MOTION ───────────────────────────────────────────────────
   This fragment adds one transition (the Back control's hover wash) and one
   smooth-scroll; both go. Nothing else here moves. */
@media (prefers-reduced-motion: reduce) {
  .fl-chat-scroll { scroll-behavior: auto; }
  .fl-root .fl-chat-scroll > button.fl-btn.fl-back-pill {
    transition: none !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 10px"][style*="padding-left: 2px"]::before {
    animation: none !important;
    transition: none !important;
    transform: none !important;
  }
}


/* ── Q10 · PHONE (390) ─────────────────────────────────────────────────────
   The same column, one rung down. Nothing here may grow a box's width: the
   gutters shrink before the type does, the subject drops to its own rung, and
   the composer's row is allowed to stack so the 44px targets survive. */
@media (max-width: 480px) {
  .fl-chat-scroll {
    padding: 20px 14px 0 !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="justify-content: space-between"][style*="gap: 12px"] {
    padding: 16px 16px 0 !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 12px"],
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 14px"],
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 11px"] {
    margin-left: 16px !important;
    margin-right: 16px !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 10px"][style*="padding-left: 2px"] {
    margin: 24px 16px 0 !important;
    padding-top: 22px !important;
    font-size: clamp(21px, 6.4vw, 25px) !important;
    max-width: 26ch;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 10px"][style*="padding-left: 2px"]::before {
    width: 48px;
    height: 20px;
    top: -10px;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 20px"][style*="background: var(--sheet)"] {
    padding: 15px 16px 4px !important;
  }
  .fl-chat-scroll [style*="max-width: 78%"][style*="border-radius: 16px"] {
    max-width: 86% !important;
    font-size: 14.5px !important;
    padding: 11px 14px !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 14px 16px"][style*="border-top: 1px solid var(--rule)"] {
    padding: 14px 16px 16px !important;
  }
  /* the phone gutter is 16px, so the draft bar's own padding is already right */
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 12px 16px 0px"] {
    padding-left: 16px !important;
    padding-right: 16px !important;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="margin: 12px 16px 0px"] {
    margin-left: 16px !important;
    margin-right: 16px !important;
  }
  /* the same selector as Q7's, to the attribute — a shorter one would lose
     to it on specificity, media query or not */
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="margin-top: 14px"][style*="linear-gradient(160deg"] {
    margin: 4px 16px 16px !important;
  }
  /* the summary's kicker row: at 390 the label and the version control together
     are ~3px wider than the card's inside measure, so "CONVERSATION SUMMARY"
     broke onto two lines (design review, ember @390). The label is one label —
     it never breaks; the control drops under it when the two cannot share a
     line, and stays beside it when they can. */
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] > [style*="margin-bottom: 7px"] {
    flex-wrap: wrap;
    gap: 8px 10px;
  }
  .fl-chat-scroll > [style*="border-radius: 18px"][style*="overflow: hidden"] > [style*="padding: 16px 20px"][style*="border-bottom: 1px solid var(--rule)"] > [style*="linear-gradient(160deg"] > [style*="margin-bottom: 7px"] > [style*="gap: 7px"] {
    white-space: nowrap;
  }
  .fl-chat-scroll > .fl-about-foot.fl-foot-canvas {
    margin-top: 32px !important;
    margin-bottom: 28px !important;
  }
}



/* ═══ GARDEN FRAGMENT frag-z-lead.css ═══ */
/* ═══ FRAGMENT Z — THE LEAD'S LAST WORD ═══════════════════════════════════════
   Cross-fragment fixes that must outrank every builder fragment (i · j · k · l).
   Keep it short; a rule belongs here only when the fragment that owns the
   object cannot win the cascade on its own. ═══ */

/* A DIMMED PRIMARY IS NOT A PRIMARY. The app dims "Continue"/"Reply" with
   opacity:.5 while there is nothing to continue with. Fragment C turns that
   into an unlit wash with the body ink; fragment K then re-declares the primary
   face (its raking light) and put the red back under the dark label
   (measured 1.36–1.71:1 on the received detail's Reply). The unlit face wins. */
.fl-root button.fl-btn[style*="opacity: 0.5"][style*="background: var(--a1)"],
.fl-root button.fl-btn[style*="opacity: 0.5"][style*="background: var(--cta)"],
.fl-root button.fl-btn[style*="opacity:.5"][style*="background:var(--a1)"] {
  background-color: color-mix(in oklab, var(--ink) 8%, transparent) !important;
  background-image: none !important;
  color: var(--body) !important;
  opacity: 1 !important;
  filter: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 22%, transparent) !important;
  transform: none !important;
}

/* THE LOOP DETAIL (a loop's results, opened from Looponomics) stands on the
   BED — its header controls and its question list were paper objects on a
   green ground (found by the review the day the detail views joined it):
   the "Edit name" pill in a light wash under a cream label, "Stop loop" in
   warm ink on green, "Locked after launch" a paper chip, and the question rows
   in paper ink with no paper under them. */
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) button.fl-btn[style*="background: color-mix(in oklab, var(--rule) 40%, var(--sheet))"],
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) button.fl-btn[style*="background: transparent"][style*="border: 1px solid var(--rule)"] {
  background: color-mix(in oklab, var(--onCanvas) 8%, transparent) !important;
  background-image: none !important;
  color: var(--onCanvas) !important;
  border-color: transparent !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--onCanvas) 38%, transparent) !important;
}
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) button.fl-btn[style*="background: transparent"][style*="border: 1px solid var(--rule)"] svg { color: var(--onCanvas) !important; }
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) [style*="border-radius: 999px"][style*="background: var(--rule)"]:not(button):not([style*="width: 42px"]) {
  background: color-mix(in oklab, var(--onCanvas) 10%, transparent) !important;
  background-image: none !important;
  color: var(--onCanvasBody) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--onCanvas) 26%, transparent) !important;
}
/* the question list is ONE sheet of stock (the rows sit on it in paper ink) */
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) :has(> .fl-btn.fl-lift[style*="border-bottom: 1px solid var(--rule)"]) {
  --ink: var(--inkS); --body: var(--bodyS); --muted: var(--mutedS);
  --a1Text: var(--a1TextS); --a2Text: var(--a2TextS); --a3Text: var(--a3TextS);
  --rule: var(--ruleS); --ruleStrong: var(--ruleS); --tint1: var(--tint1S); --tint2: var(--tint2S);
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-blend-mode: normal, multiply !important;
  border-radius: var(--p-rad) !important;
  border-color: transparent !important;
  overflow: hidden;
  box-shadow: var(--g-shadow-deep), 0 16px 42px -10px var(--boxGlow, transparent) !important;
}
.fl-root .fl-detail-enter:not([style*=", var(--sheet))"]) :has(> .fl-btn.fl-lift[style*="border-bottom: 1px solid var(--rule)"]) > .fl-btn.fl-lift { color: var(--ink) !important; }

/* THE RESPONSE DETAIL's kickers ("Feedback you sent" · "What they asked" ·
   "What you said") measured 3.8–4.4:1 in three rooms: a kicker is read, so it
   takes the body ink of its surface, not the muted one. */
.fl-root .fl-detail-enter .ui-label,
.fl-root .fl-detail-enter [style*="text-transform: uppercase"][style*="color: var(--muted)"] { color: var(--body) !important; }

/* TAP TARGETS the sweep still measured short: every footer link and credit,
   in the app and on the standalone pages — 26px rows on a desktop, 40px on a
   phone; the draft row's DELETE word 40px on a phone. */
.fl-root .fl-about-foot a, .fl-root .fl-foot-canvas a,
.fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit,
body:not(:has(.fl-root)) .pagefoot a, body:not(:has(.fl-root)) .pagefoot .fl-credit,
body:not(:has(.fl-root)) .wrap a[href^="mailto:"], body:not(:has(.fl-root)) .wrap > .card a {
  display: inline-flex !important; align-items: center !important;
  min-height: 26px; padding-block: 0 !important; padding-inline: 2px;
}
@media (pointer: coarse), (max-width: 759px) {
  .fl-root .fl-about-foot a, .fl-root .fl-foot-canvas a,
  .fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit,
  body:not(:has(.fl-root)) .pagefoot a, body:not(:has(.fl-root)) .pagefoot .fl-credit,
  body:not(:has(.fl-root)) .wrap a[href^="mailto:"], body:not(:has(.fl-root)) .wrap > .card a { min-height: 40px !important; }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] button.fl-btn[style*="border-radius: 8px"] { min-height: 40px !important; }
}
/* the draft row's foot on a phone: the kind chip never breaks its words; the
   time · DELETE group drops to its own line when the row is that narrow */
@media (max-width: 480px) {
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] > div[style*="justify-content: space-between"] { flex-wrap: wrap; row-gap: 4px; }
  .fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"] [style*="border-radius: 999px"][style*="text-transform: uppercase"] { white-space: nowrap !important; }
}

/* the response detail's accent kickers measured 4.40:1 on Afterglow stock —
   the same one-step lean toward the ink the kind chips take */
.fl-root .fl-detail-enter [style*="text-transform: uppercase"][style*="color: var(--a1Text)"] { color: color-mix(in oklab, var(--a1Text) 84%, var(--ink)) !important; }
.fl-root .fl-detail-enter [style*="text-transform: uppercase"][style*="color: var(--a2Text)"] { color: color-mix(in oklab, var(--a2Text) 84%, var(--ink)) !important; }
.fl-root .fl-detail-enter [style*="text-transform: uppercase"][style*="color: var(--a3Text)"] { color: color-mix(in oklab, var(--a3Text) 84%, var(--ink)) !important; }
/* the Show/Hide samples toggle: a 40px target on a phone */
@media (pointer: coarse), (max-width: 759px) {
  .fl-scroll:has(.v2-sent) button.fl-btn[style*="min-height: 38px"] { min-height: 40px !important; }
}
/* the sent-summary kickers (.fl-sent-sum-k) — the same lean */
.fl-root .fl-sent-sum-k { color: color-mix(in oklab, var(--a1Text) 80%, var(--ink)) !important; }

/* ═══ ONE SWITCH (owner 2026-08-18/19: "horrible toggle switches") ═══════════
   The app draws a switch three ways: <span role="switch"> (42×24, the access
   row), an inline 42×24 span (_togTrack: profile / share-graphic options) and a
   <button class="fl-btn"> 44×26 with padding (the results-link and reveal
   toggles). Fragment G styled the first two — and a self-referencing
   `--sheet: var(--sheet)` there made the first INVISIBLE; the third fell into
   the primary-button rule and rendered as a 66px disc. One rule, three hooks,
   explicit colours (never a token that may be invalid in scope). */
.fl-root [role="switch"],
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"],
.fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"] {
  display: inline-block !important; position: relative !important;
  box-sizing: border-box !important;
  width: 46px !important; height: 26px !important; min-height: 26px !important; min-width: 46px !important; max-width: 46px !important;
  padding: 0 !important; margin: 0 !important; flex: none !important; border: 0 !important;
  border-radius: 999px !important;
  background: color-mix(in oklab, var(--inkS, #251A22) 18%, var(--sheet, #F3E8D0)) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS, #251A22) 30%, transparent), inset 0 2px 3px color-mix(in oklab, var(--inkS, #251A22) 12%, transparent) !important;
  transition: background .18s ease, box-shadow .18s ease !important;
  cursor: pointer; overflow: visible !important;
  transform: none !important; filter: none !important; opacity: 1 !important;
}
.fl-root [role="switch"][aria-checked="true"],
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"][style*="background: var(--a1)"],
.fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"][style*="background: var(--a1)"] {
  background: var(--cta) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--cta) 70%, black), inset 0 2px 3px rgba(0,0,0,.18) !important;
}
.fl-root [role="switch"] > span,
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"] > span,
.fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"] > span {
  position: absolute !important; top: 3px !important; left: 3px !important; display: block !important;
  width: 20px !important; height: 20px !important; margin: 0 !important;
  border-radius: 50% !important;
  background: var(--sheet, #F3E8D0) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,.35), inset 0 0 0 1px color-mix(in oklab, var(--inkS, #251A22) 18%, transparent) !important;
  transform: translateX(0) !important;
  transition: transform .18s ease !important;
}
.fl-root [role="switch"][aria-checked="true"] > span,
.fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"][style*="background: var(--a1)"] > span,
.fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"][style*="background: var(--a1)"] > span { transform: translateX(20px) !important; }
/* the two dark rooms: the off-track lightens instead of darkening */
[data-palette="ember"] .fl-root [role="switch"]:not([aria-checked="true"]),
[data-palette="midnight"] .fl-root [role="switch"]:not([aria-checked="true"]),
[data-palette="ember"] .fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"]:not([style*="background: var(--a1)"]),
[data-palette="midnight"] .fl-root [style*="width: 42px"][style*="height: 24px"][style*="border-radius: 999px"]:not([style*="background: var(--a1)"]),
[data-palette="ember"] .fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"]:not([style*="background: var(--a1)"]),
[data-palette="midnight"] .fl-root button.fl-btn[style*="width: 44px"][style*="height: 26px"][style*="border-radius: 999px"]:not([style*="background: var(--a1)"]) {
  background: color-mix(in oklab, var(--inkS, #F4E6D3) 22%, var(--sheet, #2A211A)) !important;
}

/* ═══ CARD BUTTONS ARE CARDS (owner: "those big oval buttons are weird") ═════
   THE CURVE made every button a pill; the four share doors (Share a link ·
   Invite people · Post it · Public survey) are tall two-line cards and became
   ovals. A button laid out as a card keeps the card corner. */
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="flex: 1 1 168px"],
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="text-align: left"][style*="border-radius: 16px"][style*="padding: 16px"] {
  --p-rad: 18px;   /* THE CURVE hands buttons --p-rad: 999px; a card takes the card's corner back */
  border-radius: 18px !important;
  display: block !important; height: auto !important; min-height: 0 !important;
  padding: 16px 16px 14px !important;
  text-align: left !important;
  white-space: normal !important;
  transform: none;
}
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="flex: 1 1 168px"] > span[style*="width: 32px"] { border-radius: 50% !important; }
/* the selected door: a1 ring on stock, not a red bar */
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="flex: 1 1 168px"][style*="border: 2px solid var(--a1)"] {
  box-shadow: inset 0 0 0 2px var(--a1), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  border-color: transparent !important;
}

/* ═══ THE RULE-WASH CHIP, ON ANY SURFACE ══════════════════════════════════════
   `background: color-mix(in oklab, var(--rule) 40%, var(--sheet))` is the app's
   "quiet suggestion" button (Suggested: [Advancing career], Edit name, the
   step-2 title chips). Its wash and ink follow the surface: --ink is the paper
   ink on stock and the bed ink on the bed, so a wash mixed from --ink is
   always visible and its label always reads (measured cream-on-cream before). */
/* `:is(#fl-topic-main, .fl-root)` — the :is() takes the specificity of its most
   specific argument, so this outranks fragment C's ask-flow chip rule
   (`.fl-scroll:is(:has(#fl-topic-main)…)`, which paints a stock wash even on
   the bed) while still matching under any .fl-root. */
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="border-radius"][style*="cursor: pointer"][style*="color: var(--body)"][style*="background: color-mix(in oklab, var(--rule) 40%, var(--sheet))"] {
  background: color-mix(in oklab, var(--ink) 9%, transparent) !important;
  background-image: none !important;
  color: var(--ink) !important;
  border-color: transparent !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--ink) 34%, transparent), 0 16px 42px -10px var(--boxGlow, transparent) !important;
}
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="border-radius"][style*="cursor: pointer"][style*="color: var(--body)"][style*="background: color-mix(in oklab, var(--rule) 40%, var(--sheet))"] svg { color: var(--ink) !important; }
/* the survey door's glyph plate is a2 (gold in three rooms) — its cream glyph
   measured 1.85:1; the glyph takes the paper ink on that plate */
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="flex: 1 1 168px"] > span[style*="background: var(--a2)"] { color: color-mix(in oklab, var(--a2) 22%, black) !important; }
/* the send wizard's "who is this for" method chips (Email · @username · Text
   message) at 390: three chips in a 342px row wrapped their words; the row
   wraps its chips instead, never a word */
.fl-root .v2-sfm { flex-wrap: wrap; }
.fl-root .v2-sfm > button.fl-btn { white-space: nowrap !important; flex: 0 1 auto !important; }
/* survey.php's "Powered by … Privacy · Terms · Text Messaging" line: 14px links
   → 26px rows on a desktop, 40px on a phone */
body:not(:has(.fl-root)) .by a { display: inline-flex; align-items: center; min-height: 26px; padding-inline: 2px; }
@media (pointer: coarse), (max-width: 759px) {
  body:not(:has(.fl-root)) .by a { min-height: 40px; }
  /* the ask/send wizards' category chips: 36px → 40px on a phone */
  :is(#fl-topic-main, .fl-root) .fl-scroll button.fl-btn[style*="border-radius: 999px"][style*="border: 1px solid var(--rule)"] { min-height: 40px !important; }
}

/* ═══ 2026-08-19 morning batch (owner's phone review) ═══════════════════════ */

/* THE HOME HERO IS CENTRED on every device: the wordmark, the standfirst and
   the rotating line (owner: "logo name should be centered. same for the text
   under it… the rotating slogans should also be centered"). The standfirst
   reads as TWO lines: "…Or create public surveys." / "Responses are
   anonymized so everyone can be candid. Summarized by Loop." — the template's
   second <br> is hidden (FL_HERO_TWO_LINES adds the space before it). */
.fl-scroll > [style*="padding: 24px 0px 8px"] { align-items: center !important; text-align: center !important; }
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo { text-align: center !important; }
.fl-root .fl-hero-copy { text-align: center !important; margin-left: auto !important; margin-right: auto !important; }
.fl-root .fl-hero-copy > [style*="font-family: Fraunces"]:first-child { text-align: center !important; text-wrap: balance; }
/* the standfirst: br #1 breaks after "…public surveys.", a 9px block span is
   the owner's measured breath (2026-08-24, "smaller space… visual design
   appeal"), br #2 (mid-sentence, before "Summarized by Loop.") stays hidden. */
.fl-root .fl-hero-copy > [style*="font-family: Fraunces"]:first-child > br:nth-of-type(2) { display: none; }
.fl-root .fl-hero-line { text-align: center !important; padding: 0 !important; }
.fl-root .fl-hero-line::before { content: none !important; }

/* THE HERO PLANT on every device (owner: "why is there no plant graphic on
   mobile? should be on all devices"): below 900px it stands smaller, behind the
   wordmark's right shoulder, at a quieter ink so the text stays the text. */
@media (max-width: 900px) {
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after {
    display: block !important;
    right: -6px; top: 8px; width: 118px; height: 186px;
    background-color: color-mix(in oklab, var(--onCanvas) 46%, transparent);
    opacity: .9;
  }
  .fl-scroll > [style*="padding: 24px 0px 8px"] { padding-top: clamp(40px, 9vw, 72px) !important; }
}
@media (max-width: 480px) {
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after { right: -10px; top: 4px; width: 96px; height: 152px; }
}

/* THE FOOTER CREDIT LINE (owner: "remove the blank line between 'About
   Feedback Loop' and 'An initiative by Curioso Corp' — same line spaced apart
   if it fits, or one on top of the other with no space; all devices") */
.fl-root .fl-about-foot .fl-about-foot-link, .fl-root .fl-foot-canvas .fl-about-foot-link,
.fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit {
  display: inline-flex !important; align-items: center !important;
  margin: 0 6px !important; padding-block: 0 !important;
  min-height: 26px; line-height: 1.2;
}
@media (pointer: coarse), (max-width: 759px) {
  .fl-root .fl-about-foot .fl-about-foot-link, .fl-root .fl-foot-canvas .fl-about-foot-link,
  .fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit { min-height: 40px !important; }
}
@media (max-width: 480px) {
  /* on a phone card they stack: the credit's 40px target overlaps upward so
     the two read as one pair, not a line apart */
  .fl-root .fl-about-foot .fl-credit, .fl-root .fl-foot-canvas .fl-credit { margin-top: -14px !important; }
}

/* THE SAMPLE STAMP, louder (owner: "larger and more prominent when looking at
   the Loopvine page, all devices") */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] [style*="rotate(-8deg)"],
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > [style*="rotate(-8deg)"] {
  font-size: 11.5px !important; letter-spacing: .22em !important;
  padding: 6px 10px 5px 12px !important; right: 14px !important; top: 12px !important;
  color: var(--a2Text) !important;
  background: color-mix(in oklab, var(--a2) 16%, var(--sheet)) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a2Text) 70%, transparent) !important;
  transform: rotate(-6deg) !important;
}

/* THE WORDMARK'S OWN INK (owner 2026-08-19: "the logo name in all logo files on
   all devices for all color palettes should be a different color than all the
   other text — except for the 'oo' eyes, leave those as they are; in logos with
   no face inside the name, the entire name takes the new colour"). The name is
   set in the palette's leaf green — --a3OnCanvas on the bed, --a3Text on stock —
   the one ink no running text uses. The eyes keep their tokens (--eye, --pupil,
   --glint), which the name's colour does not touch. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-logo,
.fl-root > div[style*="width: 212px"] .fl-logo,
.fl-root > div[style*="width: 212px"] .fl-hero-logo,
.fl-root [style*="position: fixed"][style*="backdrop-filter"] .fl-logo,
.v2-brand .fl-logo, .v2-brand .fl-hero-logo,
.fl-mlock .fl-lockup-card .fl-logo, .fl-mlock .fl-lockup-card .fl-hero-logo,
body:not(:has(.fl-root)):has(.brand > a) .brand a { color: var(--a3OnCanvas) !important; }
/* the same mark standing on STOCK (preview cards, the respondent/recipient/survey frames) */
.fl-root .fl-pv-panel .fl-logo, .fl-root .fl-pv-panel .fl-hero-logo,
.fl-root .fl-rp-frame .fl-logo, .fl-root .fl-rp-frame .fl-hero-logo,
.fl-root .v2-svp__card .fl-logo, .fl-root .v2-svp__card .fl-hero-logo,
.fl-root .ui-card .fl-logo, .fl-root .ui-card .fl-hero-logo,
.fl-root .fl-sheen .fl-logo, .fl-root .fl-sheen .fl-hero-logo { color: var(--a3Text) !important; }
/* …and never the eyes: the hero face's ring and pupil keep the text ink they had */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo svg,
.fl-root .fl-hero-logo svg, .fl-root .fl-logo svg { color: var(--onCanvas); }
/* with the hero centred the standfirst runs under the plant's shoulder; the
   plant steps down beside the ask tray on a desktop (text and mark never meet) */
@media (min-width: 901px) {
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after { top: 236px; right: clamp(-48px, 1vw, 24px); }
  .fl-root .fl-hero-copy { max-width: min(760px, calc(100% - 60px)) !important; }
}

/* ═══ 2026-08-19 evening batch (owner's live review) ════════════════════════ */

/* SIGNED-IN HOME, ONE MEASURE (owner: "inconsistent widths for page items"):
   the ask tray was widened to 764 (frag-c) but the greeting, the section head
   and the loop rows kept parlor's 560 — three widths on one screen. One. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-greet,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-shead,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-loop,
.fl-scroll > [style*="padding: 24px 0px 8px"] > .v2-quick { width: min(764px, 100%) !important; }

/* THE DELETE CONFIRMATION, ONE COMPOSITION (owner: "sometimes the delete
   confirmation changes places"): with a long title the two buttons wrapped
   under the sentence, left; with a short one they sat right. Always: the
   sentence on its own line, the buttons in their own row, right. */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > div[style*="justify-content: space-between"][style*="flex-wrap: wrap"] {
  flex-direction: column !important;
  align-items: stretch !important;
  gap: 10px !important;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > div[style*="justify-content: space-between"][style*="flex-wrap: wrap"] > div[style*="gap: 8px"] {
  justify-content: flex-end !important;
}

/* THE ABOUT PORTRAITS IN THE DARK ROOMS (owner: "faces are too dark on dark
   theme palettes — lost against the dark background"): the disc kept the dark
   stock tint under a dark-inked face. The disc turns to lit paper — the face's
   own colours were drawn for paper — with a warm rim so it stands off the bed. */
[data-palette="ember"] .fl-ab-fig, [data-palette="midnight"] .fl-ab-fig,
[data-palette="ember"] .fl-ab-figL, [data-palette="midnight"] .fl-ab-figL,
[data-palette="ember"] .fl-ab-ctaface, [data-palette="midnight"] .fl-ab-ctaface {
  background: color-mix(in oklab, var(--onCanvas) 88%, var(--a2)) !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--a2OnCanvas) 45%, transparent),
              0 1px 2px rgba(0,0,0,.4),
              0 14px 30px -18px var(--boxGlow, transparent) !important;
}

/* ═══ THE VINE, UNCLIPPED FOR REAL (owner 2026-08-19: "the 3rd leaf is still
   being clipped. i already asked for this to be fixed") ═════════════════════
   Root cause: the vine was drawn on the TITLE cell, whose inline style carries
   `overflow: hidden` for its ellipsis — the cell crops the image whatever
   margin the drawing carries. The vine now hangs on the ROW (::before — parlor's
   dead spine slot, every one of its geometry declarations re-stated), which is
   tall enough to hold all 48px. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"]::after { content: none !important; }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow]::before {
  content: "" !important;
  position: absolute !important;
  left: auto !important; right: 74px !important; top: 10px !important; bottom: auto !important;
  width: 96px !important; height: 48px !important;
  background-color: transparent !important;
  background-image: var(--g-vine-0) !important;
  background-repeat: no-repeat !important; background-size: contain !important; background-position: right center !important;
  opacity: 1 !important; transform: none !important; border: 0 !important; box-shadow: none !important;
  pointer-events: none; z-index: 0;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"]::before { background-image: var(--g-vine-1) !important; }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"]::before { background-image: var(--g-vine-2) !important; }
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"]::before { background-image: var(--g-vine-3) !important; filter: drop-shadow(0 0 6px color-mix(in oklab, #7BA765 55%, transparent)); }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow]::before, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow]::before { background-image: var(--g-vine-dark-0) !important; }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"]::before, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="1"]::before { background-image: var(--g-vine-dark-1) !important; }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"]::before, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="2"]::before { background-image: var(--g-vine-dark-2) !important; }
[data-palette="ember"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"]::before, [data-palette="midnight"] .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow="3"]::before { background-image: var(--g-vine-dark-3) !important; }
@media (max-width: 620px) {
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow] > [style*="font: 600 14px"] { padding-bottom: 0 !important; }
  .fl-scroll:has(.v2-sent) > .fl-lift[role="button"][data-grow]::before { right: 12px !important; top: 8px !important; width: 76px !important; height: 38px !important; }
}

/* ═══ THE DIRECTION MEDALLION (owner 2026-08-19: "the arrow icons on the loop
   cards — what is the background?? where is the style??") ═══════════════════
   The plate was the card's cream 6% darker + a hatch — invisible work, and in
   the two dark rooms a dark disc on a dark card. It becomes a MEDALLION: a lit
   paper coin (light in every room, like the About portraits), a double
   engraved ring — coin edge + inner rule — the top edge catching THE LIGHT,
   and the direction glyph struck in the loop's own accent. */
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] > span:not([style*="border-radius: 999px"]):not([style*="border-radius:999px"]) {
  background-color: color-mix(in oklab, var(--onCanvas) 90%, var(--a2)) !important;
  background-image: radial-gradient(circle at 32% 26%,
      color-mix(in oklab, white 55%, transparent) 0%, transparent 42%) !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 55%, transparent),
    inset 0 0 0 4px color-mix(in oklab, var(--onCanvas) 90%, var(--a2)),
    inset 0 0 0 5px color-mix(in oklab, var(--a2Text) 38%, transparent),
    inset 0 1.5px 0 color-mix(in oklab, white 65%, transparent),
    0 2px 4px rgba(0,0,0,.28),
    0 8px 14px -8px rgba(0,0,0,.35) !important;
}
.fl-scroll:has(.v2-sent) > .fl-lift[role="button"] > div > span[style*="flex-wrap: wrap"] svg {
  color: color-mix(in oklab, var(--a2Text) 80%, black) !important;
  opacity: 1 !important;
}
/* the draft rows' pencil medallion joins the family (E9 drew its own plate) */
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::before {
  background-color: color-mix(in oklab, var(--onCanvas) 90%, var(--a2)) !important;
  background-image: radial-gradient(circle at 32% 26%,
      color-mix(in oklab, white 55%, transparent) 0%, transparent 42%) !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--a2Text) 55%, transparent),
    inset 0 0 0 4px color-mix(in oklab, var(--onCanvas) 90%, var(--a2)),
    inset 0 0 0 5px color-mix(in oklab, var(--a2Text) 38%, transparent),
    inset 0 1.5px 0 color-mix(in oklab, white 65%, transparent),
    0 2px 4px rgba(0,0,0,.28) !important;
}
.fl-scroll:has(.v2-sent) > [style*="overflow: hidden; background: var(--sheet)"] > .fl-lift[role="button"]::after {
  background-color: color-mix(in oklab, var(--a2Text) 80%, black) !important;
  opacity: 1 !important;
}

/* THE HERO PLANT, RETIRED (owner 2026-08-19: "remove the plant image from
   homepage") — every width. Overrides frag-c C1 and the earlier phone rules. */
.fl-scroll > [style*="padding: 24px 0px 8px"]::after { content: none !important; display: none !important; }
@media (max-width: 900px) {
  .fl-scroll > [style*="padding: 24px 0px 8px"]::after { content: none !important; display: none !important; }
}

/* THE RAIL CAMEO IN THE DARK ROOMS (owner 2026-08-19: "face in top left is
   still dark, blends into background too much") — the little face by the
   wordmark stands directly on the dark rail. It gets the portrait treatment:
   a lit paper coin with a warm rim. Dark rooms only; the light rooms read. */
[data-palette="ember"] .fl-root > div[style*="width: 212px"] .fl-lockup-card,
[data-palette="midnight"] .fl-root > div[style*="width: 212px"] .fl-lockup-card,
[data-palette="ember"] .fl-root [style*="position: fixed"][style*="backdrop-filter"] .fl-lockup-card,
[data-palette="midnight"] .fl-root [style*="position: fixed"][style*="backdrop-filter"] .fl-lockup-card {
  background-color: color-mix(in oklab, var(--onCanvas) 88%, var(--a2)) !important;
  background-image: radial-gradient(circle at 32% 26%,
      color-mix(in oklab, white 55%, transparent) 0%, transparent 45%) !important;
  border-radius: 50% !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--a2OnCanvas) 45%, transparent),
              0 1px 3px rgba(0,0,0,.45) !important;
  overflow: hidden !important;
  padding: 3px !important;
}

/* ═══ BED TEXT, ENHANCED (owner 2026-08-19: "not very easy to read this text
   against background. enhance the text — all palettes, all devices") ═════════
   Two levers. (1) The bed-reading inks step toward the full paper ink — the
   values are written out per room because a token may NEVER reference itself
   (the invisible-switch lesson). (2) The 300-weight reading voice gains weight
   on the bed: thin serif over a textured dark ground is the harder half of the
   problem. Stock text is untouched — it already reads. */
[data-palette="amethyst-night"] { --onCanvasBody: color-mix(in oklab, #F4E6D3 55%, #DCCCC0); --onCanvasMuted: color-mix(in oklab, #F4E6D3 42%, #B0A0AC); }
[data-palette="harbor"]         { --onCanvasBody: color-mix(in oklab, #EAEEE6 55%, #C7CFC8); --onCanvasMuted: color-mix(in oklab, #EAEEE6 42%, #96A2A0); }
[data-palette="meadow"]         { --onCanvasBody: color-mix(in oklab, #F0E4C8 55%, #E1D5B6); --onCanvasMuted: color-mix(in oklab, #F0E4C8 42%, #B6B79A); }
[data-palette="blush-study"]    { --onCanvasBody: color-mix(in oklab, #FAE7DC 55%, #DFC3B4); --onCanvasMuted: color-mix(in oklab, #FAE7DC 42%, #B79A8D); }
[data-palette="ember"]          { --onCanvasBody: color-mix(in oklab, #F5EAD8 55%, #D3C2AA); --onCanvasMuted: color-mix(in oklab, #F5EAD8 42%, #A08E78); }
[data-palette="midnight"]       { --onCanvasBody: color-mix(in oklab, #E9EFF9 55%, #C0CBDD); --onCanvasMuted: color-mix(in oklab, #E9EFF9 42%, #8E9BB0); }
/* the reading voice on the bed: 300 → 430, and a whisper more size on About */
.fl-scroll:has(> [style*="padding: 26px 0px 6px"]) [style*="color: var(--onCanvasBody)"],
.fl-root .fl-ab-ch2 [style*="var(--font-body)"],
.fl-root [style*="color: var(--onCanvasBody)"][style*="font-family"] {
  font-weight: 430 !important;
  font-variation-settings: "opsz" 16, "wght" 430;
}
.fl-scroll:has(> [style*="padding: 26px 0px 6px"]) .fl-ab-ch2 [style*="var(--font-body)"] { font-size: 17px !important; line-height: 1.62 !important; }

/* ═══ THE PROFILE COVER (owner 2026-08-19: "top bar of profile. what's going
   on? where is the design?") — it was a raw 120° smear of three accent washes,
   the one surface no fragment ever touched. It becomes a bed: the profile
   palette's velvet ground, the engraved botanical repeat, THE LIGHT from the
   top right, and the flower garden growing along its bottom edge (the same
   cached drawing the footers plant). */
.fl-root [style*="height: 96px"][style*="background-image: linear-gradient(120deg"] {
  background-color: var(--canvas) !important;
  background-image:
    radial-gradient(130% 100% at 84% -34%,
      color-mix(in oklab, var(--a2) 30%, transparent) 0%,
      color-mix(in oklab, var(--a2) 9%, transparent) 42%, transparent 68%),
    url("patterns/flowerbed-still.svg"),
    var(--g-bed-repeat),
    var(--g-rib),
    linear-gradient(163deg, var(--velvet) 0%, var(--canvas) 52%, var(--g-bed-deep) 100%) !important;
  background-size: auto, auto 86px, var(--g-bed-repeat-size), auto, auto !important;
  background-repeat: no-repeat, repeat-x, repeat, repeat, no-repeat !important;
  background-position: 0 0, left bottom, 0 0, 0 0, 0 0 !important;
  background-blend-mode: normal, normal, normal, normal, normal !important;
  box-shadow: inset 0 -1px 0 color-mix(in oklab, var(--a2OnCanvas) 30%, transparent),
              inset 0 1px 0 color-mix(in oklab, white 14%, transparent) !important;
}


/* ═══ THE BEES (owner 2026-08-19) — the CanadUS bees, garden-paced ═══════════
   Two bees over the bed's blank gutters. The creature is CanadUS's, verbatim;
   the flight is the Garden's: slow (28s/37s), small loops, opposite phases.
   Only where the gutters exist (≥1200px), never for reduced motion, never
   over the reading column (anchors sit in the outer strips of the viewport). */
.fl-amb { position: fixed; z-index: -1; pointer-events: none; display: none; }   /* negative z: bees live between the wallpaper and the paper — they can never cross a card */
@media (min-width: 1200px) and (prefers-reduced-motion: no-preference) {
  .fl-amb { display: block; }
}
.fl-amb--a { right: 48px; top: 26%; }
.fl-amb--b { left: 252px; bottom: 24%; }   /* clear of the 212px rail */
.fl-amb__fly { display: block; animation: g-bee-a 28s cubic-bezier(0.45,0,0.55,1) 1.2s infinite both; }
.fl-amb--b .fl-amb__fly { animation: g-bee-b 37s cubic-bezier(0.45,0,0.55,1) 4s infinite both; }
@keyframes g-bee-a {
  0%, 100% { transform: translate(-10px, -30px) rotate(-6deg); }
  22% { transform: translate(-64px, 22px) rotate(6deg); }
  47% { transform: translate(-18px, 74px) rotate(-4deg); }
  71% { transform: translate(-80px, 30px) rotate(8deg); }
}
@keyframes g-bee-b {
  0%, 100% { transform: translate(10px, 24px) rotate(5deg) scaleX(-1); }
  26% { transform: translate(64px, -20px) rotate(-6deg) scaleX(-1); }
  55% { transform: translate(22px, -70px) rotate(5deg) scaleX(-1); }
  78% { transform: translate(76px, -26px) rotate(-4deg) scaleX(-1); }
}
@keyframes wingFlap  { 0%, 100% { transform: scaleY(1) rotate(-20deg); } 50% { transform: scaleY(0.18) rotate(-2deg); } }
@keyframes wingFlapB { 0%, 100% { transform: scaleY(1) rotate(18deg); }  50% { transform: scaleY(0.18) rotate(2deg); } }
@keyframes beePop {
    0%   { transform: scale(0.72); opacity: 0; }
    100% { transform: scale(1); opacity: 1; }
  }
@media (prefers-reduced-motion: reduce) { .fl-amb { display: none !important; } }
@media (max-width: 480px) { .fl-amb { display: none !important; } }

/* ═══ 2026-08-20 morning batch ═══════════════════════════════════════════════ */

/* THE EYELIDS FOLLOW THE WORDMARK (owner: "for eyelid colors, use the same
   color as is used for the rest of logo letters. relative per palette").
   --logoSoft IS the eyelid token (FL_FACE_SCHEME); the wordmark is set in the
   leaf green — a3OnCanvas on the bed, a3Text on stock. Stated per palette with
   the data-palette prefix so it outranks the appended face-scheme sheet. */
[data-palette="amethyst-night"] .fl-root, [data-palette="harbor"] .fl-root,
[data-palette="meadow"] .fl-root, [data-palette="blush-study"] .fl-root,
[data-palette="ember"] .fl-root, [data-palette="midnight"] .fl-root,
[data-palette] body:not(:has(.fl-root)) { --logoSoft: var(--a3OnCanvas) !important; }
/* the same faces standing on STOCK (cards, frames, sheets) take the stock green */
[data-palette] .fl-root .fl-pv-panel, [data-palette] .fl-root .fl-rp-frame,
[data-palette] .fl-root .ui-card, [data-palette] .fl-root .fl-sheen,
[data-palette] .fl-root .v2-svp__card, [data-palette] .fl-root .ui-sheet,
[data-palette] .v2-door { --logoSoft: var(--a3Text) !important; }
/* …and on the pale portrait coins the stock green reads too */
[data-palette] .fl-root .fl-ab-fig, [data-palette] .fl-root .fl-ab-figL,
[data-palette] .fl-root .fl-ab-ctaface,
[data-palette="ember"] .fl-root > div[style*="width: 212px"] .fl-lockup-card,
[data-palette="midnight"] .fl-root > div[style*="width: 212px"] .fl-lockup-card { --logoSoft: var(--a3Text) !important; }

/* THE DARK ROOMS' FACES ON PALE COINS (owner: "facial features on dark themes
   are not correct. can't see pupils") — ember/midnight's face tokens are LIGHT
   inks drawn for dark grounds; on the pale portrait discs every feature washed
   out. Inside the discs the features take dark-ground inks: the ring leans to
   the room's accent darkened, the pupil goes near-black, the glint stays pale. */
[data-palette="ember"] .fl-root :is(.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface, .v2-ob__face),
[data-palette="midnight"] .fl-root :is(.fl-ab-fig, .fl-ab-figL, .fl-ab-ctaface, .v2-ob__face),
[data-palette="ember"] .fl-root > div[style*="width: 212px"] .fl-lockup-card,
[data-palette="midnight"] .fl-root > div[style*="width: 212px"] .fl-lockup-card {
  --eye: color-mix(in oklab, var(--a1) 72%, #241B0F);
  --pupil: #241B0F;
  --face2: color-mix(in oklab, var(--a1) 45%, #241B0F);
  --cheek: color-mix(in oklab, var(--a1) 60%, transparent);
  --glint: #FBF3E1;
}

/* THE LOOPVINE HEAD TOGGLE IS A LINK (owner: "show/hide samples up top should
   be a simple link") — frag-n's stamp treatment stands down here. */
.fl-scroll:has(.v2-sent) > [style*="align-items: baseline"] > button.fl-btn.fl-btn.fl-btn {
  background: none !important; background-image: linear-gradient(var(--a1OnCanvas), var(--a1OnCanvas)) !important;
  background-repeat: no-repeat !important; background-size: 100% 1px !important; background-position: left bottom !important;
  box-shadow: none !important; border: 0 !important; border-radius: 0 !important;
  padding: 2px 1px 4px !important; min-height: 32px !important;
  font-family: 'Public Sans', system-ui, sans-serif !important;
  font-size: 12.5px !important; font-weight: 600 !important;
  letter-spacing: .02em !important; text-transform: none !important;
  color: var(--a1OnCanvas) !important;
}

/* THE EMPTY-STATE ACTIONS, ONE STACK (owner: "the 'show samples' button below
   should be a normal button just like 'reset filters'. all 3 in vertical order
   on top of each other"). The samples button joins the chip family; the three
   controls read as one column. */
.fl-scroll:has(.v2-sent) [style*="flex-direction: column"][style*="margin-top: 18px"] {
  flex-direction: column !important; align-items: center !important; gap: 12px !important; margin-top: 12px !important;
}
.fl-scroll:has(.v2-sent) [style*="flex-direction: column"][style*="margin-top: 18px"] > button.fl-btn[style*="min-height: 38px"] {
  display: inline-flex !important; align-items: center !important; justify-content: center !important;
  min-height: 44px !important; padding: 0 18px !important;
  border-radius: var(--p-rad) !important;
  background: color-mix(in oklab, var(--onCanvas) 8%, transparent) !important;
  color: var(--onCanvas) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--a2OnCanvas) 60%, transparent), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-variation-settings: "wdth" 84, "wght" 650 !important;
  font-size: 10.5px !important; letter-spacing: .15em !important; text-transform: uppercase !important;
}

/* THE HOME VINES (owner: "loop cards on signed in homepage should also show
   the vine with 1/2/3 leaves") — same drawings, on the row's right end. */
.fl-root .v2-loop[data-grow] { padding-right: 118px !important; }
.fl-root .v2-loop[data-grow]::after {
  content: ""; position: absolute; right: 16px; top: 50%; margin-top: -24px;
  width: 96px; height: 48px;
  background-repeat: no-repeat; background-size: contain; background-position: right center;
  background-image: var(--g-vine-0); pointer-events: none;
}
.fl-root .v2-loop[data-grow="1"]::after { background-image: var(--g-vine-1); }
.fl-root .v2-loop[data-grow="2"]::after { background-image: var(--g-vine-2); }
.fl-root .v2-loop[data-grow="3"]::after { background-image: var(--g-vine-3); filter: drop-shadow(0 0 6px color-mix(in oklab, #7BA765 55%, transparent)); }
@media (max-width: 620px) {
  .fl-root .v2-loop[data-grow] { padding-right: 16px !important; padding-bottom: 40px !important; }
  .fl-root .v2-loop[data-grow]::after { right: 12px; top: auto; bottom: 6px; margin-top: 0; width: 76px; height: 34px; }
}

/* THE EYELIDS, ACTUALLY (owner 2026-08-20: "the eyelids did not change color…
   why not? i was very clear"). Root cause: frag-e's wordmark colourway block
   declares --logoSoft ON the face containers themselves; a closer declaration
   beats the root-scope override I shipped first. Same selectors, later
   fragment, the wordmark's own green — lids match the letters in every room. */
.fl-scroll > [style*="padding: 24px 0px 8px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-hero-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-logo,
.fl-scroll > [style*="padding: 26px 0px 6px"] > .fl-mlock .fl-lockup-card,
.fl-mlock .fl-lockup-card,
.fl-root > div[style*="width: 212px"] .fl-logo,
.fl-root > div[style*="width: 212px"] .fl-hero-logo,
.fl-root [style*="position: fixed"][style*="backdrop-filter"] .fl-logo,
.v2-brand .fl-logo, .v2-brand .fl-hero-logo,
body:not(:has(.fl-root)):has(.brand > a) .brand a {
  --logoSoft: var(--a3OnCanvas) !important;
}
/* the same faces standing on stock keep the stock green for their lids */
.fl-root .fl-pv-panel .fl-logo, .fl-root .fl-pv-panel .fl-hero-logo,
.fl-root .fl-rp-frame .fl-logo, .fl-root .fl-rp-frame .fl-hero-logo,
.fl-root .ui-card .fl-logo, .fl-root .ui-card .fl-hero-logo,
.fl-root .fl-sheen .fl-logo, .fl-root .fl-sheen .fl-hero-logo,
.fl-root .v2-svp__card .fl-logo, .fl-root .v2-svp__card .fl-hero-logo,
.fl-root .fl-ab-fig, .fl-root .fl-ab-figL, .fl-root .fl-ab-ctaface,
.v2-ob__face {
  --logoSoft: var(--a3Text) !important;
}


/* ═══ THE CATEGORY COLOURS, RESTORED (owner 2026-08-20: "you lost the color
   correlation for all the categories. each top level category was a unique
   color, and when clicked on all the sub categories are same color") ════════
   The app gives every cluster its own hue (CAT_HUES, painted inline as
   `oklch(var(--catL) var(--catC) <hue>)`); the Garden's stamp rules repainted
   every one of them in the accent, so all ten clusters read gold. CSS cannot
   read an inline value, so each hue is recognised by its own attribute match
   and re-published as --g-cat; everything downstream is generic. --catL and
   --catText are already tuned per room (light rooms .47 + pale text, dark
   rooms .74–.78 + dark text), so the ink stays legible everywhere. */
[style*="var(--catC, 0.13) 255)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 255); }
[style*="var(--catC, 0.13) 25)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 25); }
[style*="var(--catC, 0.13) 145)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 145); }
[style*="var(--catC, 0.13) 300)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 300); }
[style*="var(--catC, 0.13) 200)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 200); }
[style*="var(--catC, 0.13) 70)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 70); }
[style*="var(--catC, 0.13) 340)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 340); }
[style*="var(--catC, 0.13) 175)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 175); }
[style*="var(--catC, 0.13) 230)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 230); }
[style*="var(--catC, 0.13) 105)"] { --g-cat: oklch(var(--catL, 0.5) var(--catC, 0.13) 105); }

/* the SELECTED cluster tab and its name plate wear the cluster's own colour */
/* specificity note: fragment C's stamp rule is `.fl-scroll:is(:has(#fl-topic-main), …) button.fl-btn[..][..]` — an ID-level :has() plus three classes/attributes. A later fragment does NOT win on order against a higher count, so these carry the ID through :is() AND out-count it. */
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn[style*="oklch(var(--catL"][style*="border-radius: 999px"][style*="cursor: pointer"],
:is(#fl-topic-main, .fl-root) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"][style*="display: inline-block"][style*="letter-spacing"] {
  background: var(--g-cat, var(--a1)) !important;
  background-image: none !important;
  border-color: transparent !important;
  color: var(--catText, var(--ctaText)) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--g-cat, var(--a1)) 62%, black),
              inset 0 1px 0 color-mix(in oklab, white 26%, transparent),
              0 16px 42px -10px var(--boxGlow, transparent) !important;
}
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn[style*="oklch(var(--catL"][style*="border-radius: 999px"] svg { color: var(--catText, var(--ctaText)) !important; }
/* …and the whole sub-topic family underneath takes the same colour: the panel
   keeps its 7% wash, and every chip in it is keylined and inked in the family
   hue, so parent and children read as one at a glance. */
:is(#fl-topic-main, .fl-root) [style*="border: 1.5px solid color-mix(in oklab,"][style*="oklch(var(--catL"][style*="flex-wrap: wrap"] {
  border-color: color-mix(in oklab, var(--g-cat, var(--a1)) 34%, transparent) !important;
  background-color: color-mix(in oklab, var(--g-cat, var(--a1)) 7%, var(--sheet)) !important;
  background-image: none !important;
}
:is(#fl-topic-main, .fl-root) [style*="border: 1.5px solid color-mix(in oklab,"][style*="oklch(var(--catL"] button.fl-btn.fl-btn[style*="border-radius: 999px"] {
  color: color-mix(in oklab, var(--g-cat, var(--a1)) 62%, var(--inkS)) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--g-cat, var(--a1)) 48%, transparent),
              0 16px 42px -10px var(--boxGlow, transparent) !important;
  background: color-mix(in oklab, var(--g-cat, var(--a1)) 4%, var(--sheet)) !important;
}
@media (hover: hover) {
  :is(#fl-topic-main, .fl-root) [style*="border: 1.5px solid color-mix(in oklab,"][style*="oklch(var(--catL"] button.fl-btn.fl-btn[style*="border-radius: 999px"]:hover {
    background: color-mix(in oklab, var(--g-cat, var(--a1)) 12%, var(--sheet)) !important;
    box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--g-cat, var(--a1)) 72%, transparent), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  }
}

/* ═══ THE ABOUT PAGE ON A PHONE (owner 2026-08-20: "faces are all getting
   clipped on mobile… the formatting of the values are all jumbled") ═════════
   (1) The portrait coins float with a −4px outer margin — on a phone that hangs
   them past the panel, which clips (overflow: hidden). They sit inside the
   column now, one size down. (2) A values chip may never break its word:
   ACCOUNTABILITY was splitting across two lines. */
@media (max-width: 759px) {
  .fl-root .fl-ab-fig, .fl-root .fl-ab-figL, .fl-root .fl-ab-ctaface {
    width: 84px !important; height: 84px !important; padding: 11px !important;
    shape-outside: none !important;
  }
  .fl-root .fl-ab-fig { float: right !important; margin: 2px 0 10px 14px !important; }
  .fl-root .fl-ab-figL { float: left !important; margin: 2px 14px 10px 0 !important; }
  .fl-root .fl-ab-ctaface { margin-left: 0 !important; margin-right: 0 !important; }
}
.fl-root .fl-ab-chips { display: flex !important; flex-wrap: wrap !important; gap: 8px !important; align-items: center; }
.fl-root .fl-ab-chip {
  white-space: nowrap !important;
  flex: 0 0 auto !important;
  display: inline-flex !important; align-items: center !important;
  min-height: 32px;
}
@media (max-width: 480px) {
  .fl-root .fl-ab-chip { font-size: 10px !important; letter-spacing: .1em !important; padding: 7px 11px !important; }
}

/* fragment C also inks every CHILD of a category chip (`… [style*="background:
   oklch(var(--catL"][…] * { color: var(--a2Text) }`) — the label is a
   `.sc-interp` span, so the tab took its hue but kept a brown label (1.00:1 on
   the blue cluster, caught by the review). The label follows its plate. */
:is(#fl-topic-main, .fl-root) [style*="background: oklch(var(--catL"][style*="border-radius: 999px"][style*="display: inline-block"][style*="text-transform: uppercase"] *,
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn[style*="oklch(var(--catL"][style*="border-radius: 999px"][style*="cursor: pointer"] * {
  color: var(--catText, var(--ctaText)) !important;
}


/* ═══ THE receive / provide SELECTOR IS A LOOPVINE SLOT ═════════════════════
   (owner 2026-08-21 · REBUILT 2026-08-25: "on mobile it is still not correct
   — both are showing, one dimmed.")
   WHY THE REBUILD: the old rules keyed on the browser-serialized inline style
   ([style*="font: 700 18px"]) — iPhone Safari serializes the font shorthand
   differently, so on iOS every button-level rule silently missed and both
   words rendered. FL_RG_CLASS now stamps real classes from the vm
   (.v2-rg wrapper · .v2-rg-thumb · .v2-rg-cur shown word · .v2-rg-alt other
   choice) and everything below keys on those — identical in every engine.
   Behavior is unchanged: the CURRENT value reads as a word in the sentence
   with the accent underline; clicking it (FL_RG_SLOT) drops a small sheet
   with the other choice. Specificity: fragment C paints this control with an
   ID carried through :is(:has(#fl-topic-main)) — these carry an ID through
   :is() and stack classes to out-count it. */
:is(#fl-topic-main, .fl-root) .v2-rg.v2-rg.v2-rg {
  position: relative !important;
  display: inline-block !important;
  width: auto !important;
  background: none !important;
  background-image: none !important;
  border: 0 !important;
  padding: 0 !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  vertical-align: baseline;
}
/* the sliding thumb retires with the track */
:is(#fl-topic-main, .fl-root) .v2-rg > .v2-rg-thumb.v2-rg-thumb { display: none !important; }
/* both words speak the sentence's own voice */
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.fl-btn.fl-btn {
  flex: 0 0 auto !important;
  min-width: 0 !important;
  min-height: 0 !important;
  width: auto !important;
  padding: 2px 1px 4px !important;
  background-color: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  font-family: 'Fraunces', Georgia, serif !important;
  font-variation-settings: "wght" 500, "opsz" 48, "SOFT" 48, "WONK" 1 !important;
  font-weight: 500 !important;
  font-size: inherit !important;
  letter-spacing: inherit !important;
  font-style: normal !important;
  text-align: left !important;
  text-decoration-line: none !important;
  transition: color .18s ease, background-size .2s var(--g-e-out, ease) !important;
}
/* the little up/down arrows stay retired (owner 2026-08-21) */
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn svg { display: none !important; }
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn > span { gap: 0 !important; }
/* ── THE SHOWN VALUE — the slot itself ─────────────────────────────────── */
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-cur.v2-rg-cur.v2-rg-cur {
  display: inline-flex !important;
  align-items: center !important;
  position: relative !important;
  color: var(--onCanvas) !important;
  /* drawn, not text-decoration: the label sits in an inline-flex span and
     decoration never crosses that boundary */
  background-image: linear-gradient(var(--a1OnCanvas), var(--a1OnCanvas)) !important;
  background-repeat: no-repeat !important;
  background-position: left calc(100% - 1px) !important;
  background-size: 100% 2.5px !important;
}
/* the whole finger lands (full-finger law): invisible padded hit box */
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-cur::after {
  content: '';
  position: absolute;
  inset: -10px -8px;
}
/* ── THE OTHER CHOICE — hidden until the slot is opened ────────────────── */
:is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-alt.v2-rg-alt.v2-rg-alt { display: none !important; }
html.fl-rgopen :is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-alt.v2-rg-alt.v2-rg-alt {
  display: inline-flex !important;
  align-items: center !important;
  position: absolute !important;
  top: calc(100% + 10px) !important;
  left: -10px !important;
  z-index: 60 !important;
  padding: 10px 16px !important;
  background-color: var(--sheet) !important;
  background-image: none !important;
  border-radius: 14px !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 22%, transparent),
              0 4px 10px rgba(0,0,0,.28),
              0 22px 48px -14px var(--boxGlow, transparent) !important;
  color: var(--inkS) !important;
  white-space: nowrap !important;
  max-width: min(300px, calc(100vw - 40px)) !important;
  /* a menu item, not a second headline — Loopvine's popover words are 17px */
  font-size: 17px !important;
  font-variation-settings: "wght" 500, "opsz" 48 !important;
  animation: g-slot-in .18s var(--g-e-out, ease-out) both;
}
@keyframes g-slot-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
@media (hover: hover) {
  html.fl-rgopen :is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-alt.v2-rg-alt.v2-rg-alt:hover { background-color: color-mix(in oklab, var(--a1) 8%, var(--sheet)) !important; color: var(--a1Text) !important; }
}
/* a word is still a control: real targets on touch */
@media (pointer: coarse), (max-width: 759px) {
  :is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-cur.v2-rg-cur.v2-rg-cur { min-height: 40px !important; display: inline-flex !important; align-items: center !important; }
  html.fl-rgopen :is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-alt.v2-rg-alt.v2-rg-alt { min-height: 40px !important; }
}
@media (prefers-reduced-motion: reduce) {
  html.fl-rgopen :is(#fl-topic-main, .fl-root) .v2-rg > button.fl-btn.v2-rg-alt.v2-rg-alt.v2-rg-alt { animation: none !important; }
}

/* NO SEED DOTS ON THE FILTER SLOTS (owner 2026-08-21: "the dots shouldn't be
   in loopvine either, not sure why you added them") — fragment D hung an
   engraved seed under every slot word; the drawn rule is signal enough. The
   pseudo is killed outright so the app's older lozenge cannot return either. */
.fl-root .fl-scroll:has(.v2-sent) .v2-slot::before,
.fl-root .fl-scroll:has(.v2-sent) .v2-slot::after { content: none !important; }

/* ═══ THE THREE "WHAT OTHERS SEE" PAGES ARE ONE PAGE ════════════════════════
   (owner 2026-08-21: "respondent, survey, and recipient should all have same
   design and layout. changes to one should apply to all. currently survey looks
   differently. move the details and border from the other 2, keep a clean
   look. keep these 3 pages having same design treatments moving forward.")
   Respondent and Recipient were a 430x874 phone frame — engraved nine-slice
   border, pressed-specimen watermark, 26px bezel — while Survey was a plain
   392 card with a corner plate. One object now: the same stock, the same
   measure, the same corner, one quiet ring, no applied ornament. LAW: these
   three always move together. */
.fl-root .fl-rp-frame,
.fl-root .v2-svp__card {
  width: min(430px, 100%) !important;
  max-width: min(430px, 100%) !important;
  box-sizing: border-box !important;
  border: 0 !important;
  border-radius: 18px !important;
  padding: 26px 20px 22px !important;
  background-color: var(--sheet) !important;
  background-image: var(--p-paper-lit), var(--g-fibre) !important;
  background-size: auto, var(--g-fibre-size) !important;
  background-repeat: no-repeat, repeat !important;
  background-position: 0 0, 0 0 !important;
  background-blend-mode: normal, multiply !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--inkS) 16%, transparent),
    inset 0 1px 0 color-mix(in oklab, white 40%, transparent),
    0 18px 40px -24px rgba(0, 0, 0, .55),
    0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* the applied ornament comes off all three: engraved frame, specimen
   watermark, corner plate — "keep a clean look" */
.fl-root .fl-rp-frame::after,
.fl-root .fl-rp-frame::before,
.fl-root .v2-svp__card::after,
.fl-root .v2-svp__card::before { content: none !important; }
/* the cards inside them match each other too */
.fl-root .fl-rp-box, .fl-root .fl-arr-promises, .fl-root .v2-svp__in {
  border-radius: 14px !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 12%, transparent) !important;
}
@media (max-width: 480px) {
  .fl-root .fl-rp-frame, .fl-root .v2-svp__card { padding: 20px 16px 18px !important; }
}

/* ═══ THE FILTER BOX STAYS PUT (owner 2026-08-21: "when filter is used, the
   filter box jumps locations. filter box should stay in consistent location")
   The app anchors each choice sheet to its own word (`.v2-slotwrap` is the
   positioning context), so the box landed wherever that word sat — three
   places, and off the right edge on a phone. The sentence is the anchor now:
   every sheet opens at the same spot, under the sentence's left edge. */
.fl-root .fl-scroll:has(.v2-sent) .v2-slotwrap { position: static !important; }
.fl-root .fl-scroll:has(.v2-sent) .v2-sent { position: relative; }
.fl-root .fl-scroll:has(.v2-sent) .v2-sent .v2-frow.v2-pop2 {
  top: calc(100% + 10px) !important;
  left: 0 !important;
  right: auto !important;
  max-width: min(330px, calc(100vw - 36px)) !important;
}

/* ═══ THE REAL RESPONSE PAGES (owner 2026-08-23: "major formatting/display/
   design issues on mobile, with loop reply screens") ═══════════════════════
   A real visit (?r= / ?s=) wears `.fl-live` on its wrap. The app's own design
   for it: `.fl-rp-frame` is a TRANSPARENT wrapper and `.fl-rp-frame > div` is
   the card. The Garden painted the wrapper as a card as well (stock, border,
   ornament, a phone-height cap at 480) — so every real page was a card inside
   a card, the cap spilled the review's question cards out of the frame and
   dropped the footer above the Send button, the squeezed inner scroller cut
   the reveal-identity box, and the chip rule turned the 4px progress bars
   into 44px boxes. On a live visit the Garden now styles the card the app
   meant, and nothing else. Specificity (0,4,0)+ so the earlier fragments'
   (0,3,0) rules cannot win. */
.fl-root .fl-live .fl-rp-frame.fl-rp-frame,
.fl-root .fl-live .fl-rp-frame.fl-rp-frame.fl-rp-frame {
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow: visible !important;
  width: min(560px, 100%) !important;
  max-width: 100% !important;
  margin-left: auto !important; margin-right: auto !important;
  transform: none !important;
  animation: none !important;
}
.fl-root .fl-live .fl-rp-frame.fl-rp-frame::before,
.fl-root .fl-live .fl-rp-frame.fl-rp-frame::after { content: none !important; }
/* the card the app meant — the Garden's stock, the Garden's corner, one ring */
.fl-root .fl-live .fl-rp-frame.fl-rp-frame > div {
  background-color: var(--sheet) !important;
  background-image: var(--g-fibre), var(--p-paper-lit) !important;
  background-size: var(--g-fibre-size), auto !important;
  background-repeat: repeat, no-repeat !important;
  background-blend-mode: multiply, normal !important;
  border-radius: var(--p-rad, 18px) !important;
  border: 0 !important;
  box-shadow: var(--p-shadow), 0 16px 42px -10px var(--boxGlow, transparent) !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow: visible !important;
  position: relative;
}
/* no inner scroller on a real page — the page scrolls, the column grows */
.fl-root .fl-live .fl-rp-frame.fl-rp-frame > div > [style*="flex: 1 1 0%"][style*="flex-direction: column"],
.fl-root .fl-live .fl-rp-frame.fl-rp-frame [style*="overflow-y: auto"] {
  overflow: visible !important;
  min-height: 0 !important;
  max-height: none !important;
  flex: 1 1 auto !important;
}
/* the 4px progress bars are bars, not chips (they share the chip's two inline
   attributes: border-radius 999px + background var(--rule)) */
:is(#fl-topic-main, .fl-root) [style*="height: 4px"][style*="border-radius: 999px"][style*="flex: 1"] {
  height: 4px !important;
  min-height: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  box-shadow: none !important;
  background-image: none !important;
  border-radius: 999px !important;
  font-size: 0 !important;
  line-height: 0 !important;
}
/* the boxes INSIDE the card keep the inner-stock step (no second outer shadow —
   the owner saw a misregistered double edge) */
.fl-root .fl-live .fl-rp-box,
.fl-root .fl-live .fl-arr-promises {
  background-image: none !important;
  background-color: color-mix(in oklab, var(--sheet) 92%, var(--p-shade)) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 12%, transparent) !important;
  border: 0 !important;
  border-radius: 14px !important;
}
.fl-root .fl-live .fl-rp-box::before, .fl-root .fl-live .fl-rp-box::after,
.fl-root .fl-live .fl-arr-promises::before, .fl-root .fl-live .fl-arr-promises::after { content: none !important; }
@media (max-width: 480px) {
  .fl-root .fl-live .fl-rp-frame.fl-rp-frame.fl-rp-frame { width: 100% !important; height: auto !important; }
}

/* ═══ THE MARK'S PROPORTIONS ARE FIXED, EVERYWHERE (owner 2026-08-23: "the
   logo face is not in correct proportions. logo should be consistent
   everywhere — you don't change relative dimensions on different screens").
   The face svg is drawn at 2em x 2em of the wordmark's own font size — one
   relation at every scale. On live pages the app ships `.fl-live .fl-arr-logo
   .fl-hero-logo :is(svg, img, canvas) { width: auto !important }`, which
   discards the em sizing and rendered the face at ~1.45em beside 31px
   letters. The relation is restored at (0,4,1); img/canvas are left as the
   app set them. */
.fl-root .fl-live .fl-arr-logo .fl-hero-logo svg,
.fl-root .fl-live .fl-hero-logo svg,
.fl-root .fl-live .fl-logo svg {
  width: 2em !important;
  height: 2em !important;
}

/* ═══ LOOP LIFE + COMMONS KICKERS ON THE BED (found by the 2026-08-23 full
   sweep, the first ever to mount the owner-only pages): `.v2-com__kick` ships
   `color: var(--a1)` — a stock accent — but these kickers stand DIRECTLY on
   the dark bed (2.0–2.5:1 in all four dark rooms). On the bed a kicker takes
   the on-canvas accent; inside a card (the quote kickers) the stock ink is
   correct and a card ancestor re-scopes it back. */
.fl-root .v2-com__kick { color: var(--a2OnCanvas) !important; }
.fl-root :is(.ui-card, .v2-com__card, .v2-ph, .card) .v2-com__kick,
.fl-root :is(.ui-card, .v2-com__card, .v2-ph, .card) .v2-com__qkick { color: var(--a2Text) !important; }

/* ═══ LOOP LIFE + COMMONS: LAUNCH-READY (owner 2026-08-23: "do it now, so we
   are prepared to turn it live at any point") — the med-tier advisories the
   38-screen sweep left on the owner-only pages, cleared. ═══════════════════ */
/* 1 · the rail rows: the page name never glues to the owner pill and never
   breaks mid-word — the label keeps one line, the pill keeps its distance */
.fl-root .fl-nav .v2-com__nav {
  margin-left: 6px !important;
  flex: none !important;
  white-space: nowrap !important;
  /* fits INSIDE the active row's pill (the pill clips overflow: the stamp
     vanished on the active My Loop Life row — caught by eye 2026-08-23) */
  font-size: 7.5px !important;
  letter-spacing: .06em !important;
  padding: 2px 4px !important;
}
.fl-root .fl-nav:has(.v2-com__nav) > span { gap: 7px !important; }
.fl-root .fl-nav:has(.v2-com__nav) { padding-right: 8px !important; }
.fl-root .fl-nav:has(.v2-com__nav) > span {
  flex-wrap: nowrap !important;
  min-width: 0;
}
.fl-root .fl-nav:has(.v2-com__nav) {
  white-space: nowrap !important;
}
/* 2 · the owner pill sits on BOTH grounds (the active row's light fill and
   inactive dark rows) — no fixed ink/fill pair can pass on both. It inherits
   its row's own label ink (which passes everywhere by construction) and wears
   a keyline instead of a fill: a mini-stamp in the row's own voice. */
.fl-root .v2-com__nav {
  color: inherit !important;
  background: transparent !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, currentColor 55%, transparent) !important;
}
/* 3 · the accent smallcaps on stock: --a1 measured 4.10–4.41 in blush-study.
   One recipe for all six rooms — the accent deepened toward ink just enough
   to clear 4.5 everywhere while staying unmistakably the accent. Applies to
   the section kickers, card kickers, corner kickers and the wrapped chips. */
.fl-root .v2-com__qkick,
.fl-root .v2-com__ck,
.fl-root :is(.ui-card, .v2-com__card, .v2-ph, .card) .v2-com__kick {
  color: color-mix(in oklab, var(--a2Text) 74%, var(--ink)) !important;
}
.fl-root .v2-com__ask {
  color: color-mix(in oklab, var(--a1Text) 74%, var(--ink)) !important;
  text-decoration-color: color-mix(in oklab, var(--a1Text) 60%, transparent);
}
.fl-root .v2-wrapbtn {
  color: color-mix(in oklab, var(--a1Text) 74%, var(--ink)) !important;
}
/* 4 · "Take one into a loop →" is a control: a real target on touch */
.fl-root .v2-com__ask {
  min-height: 40px;
  display: inline-flex;
  align-items: center;
}

/* ═══ THE LAST TAP-TARGET ADVISORIES (owner 2026-08-23: "do it now") ════════
   Five controls measured under 40px. Each keeps its look; only the hit area
   grows. */
/* "Help me say this differently" (ask wizard, dashed chip, 38px) */
/* the rephrase chip's 38px lived in frag-m's own rule — fixed at the SOURCE
   (one selector, one owner); no override needed here. */
/* the two full-width toggle ROWS ("Password protect this Loop" 33px,
   "Show on my profile" 26px) — the row is the control */
:is(#fl-topic-main, .fl-root) button.fl-btn[style*="justify-content: space-between"][style*="width: 100%"][style*="background: transparent"][style*="cursor: pointer"] {
  min-height: 44px !important;
}
/* "Create your own Loops & Surveys" pill on the declined card (38px) */
.fl-root a[href="https://trustloop.me"] {
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  box-sizing: border-box;
}
/* the inline "Feedback Loop" link in the done-card's sentence (81x12): an
   inline link must not grow the line — the hit area extends invisibly */
.fl-root a[href="https://trustloop.me/"] {
  padding: 14px 4px;
  margin: -14px -4px;
}

/* ═══ THE GROW SUITE, SET PROPERLY (owner 2026-08-24: "off sized buttons…
   text cut off… this page does not carry the same uniform design elements as
   the rest of the site") — one grammar for the whole section, both places it
   renders (loop editor + wizard launch panel; the suite is single-sourced). */
/* 1 · the four DOOR cards: one geometry. The selected card's 2px accent ring
   made it half a pixel bigger than its 1.5px neighbours and the row read as
   staggered — every door now carries the same 2px box (the unselected ring is
   quiet), the same corner, the same minimum height, and the column stacks
   stretch equal. */
.fl-root .fl-doors { align-items: stretch !important; flex-wrap: wrap; }
.fl-root .fl-doors > button.fl-btn {
  display: flex !important;
  flex-direction: column !important;
  align-items: flex-start !important;
  justify-content: flex-start !important;
  border-width: 2px !important;
  border-style: solid !important;
  min-height: 108px;
  border-radius: var(--p-rad) !important;
}
.fl-root .fl-doors > button.fl-btn[style*="border: 1.5px solid var(--rule)"] {
  border-color: color-mix(in oklab, var(--rule) 80%, transparent) !important;
}
/* 2 · the SOCIAL row: the pills were raw white slabs (#fff on inline styles)
   with one label wrapping to two lines and X a different width. They speak
   the suite's own stock now, never wrap, and share one cell size. */
.fl-root [style*="minmax(128px, 1fr)"] { grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)) !important; }
.fl-root [style*="minmax(128px, 1fr)"] > button.fl-btn {
  background: var(--sheet) !important;
  color: var(--ink) !important;
  border: 1px solid color-mix(in oklab, var(--rule) 85%, transparent) !important;
  border-radius: var(--p-rad) !important;
  white-space: nowrap !important;
  min-height: 44px !important;
  box-shadow: 0 1px 2px var(--elev-1), 0 16px 42px -10px var(--boxGlow, transparent) !important;
}
/* 3 · a clipped placeholder never chops mid-word */
.fl-root .fl-door-panel input::placeholder { text-overflow: ellipsis; }
/* 4 · the survey panel's action row: ONE family — the primary keeps its
   weight; "Copy embed code" and the two quiet actions share the same pill
   geometry instead of three different species in a row. (ID-carried: the
   ask-flow fragments hold these buttons at ID level.) */
:is(#fl-topic-main, .fl-root) .fl-door-panel button.fl-btn.fl-btn[style*="background: transparent"][style*="color: var(--a1)"][style*="border: none"] {
  border: 1px solid color-mix(in oklab, var(--rule) 85%, transparent) !important;
  border-radius: 999px !important;
  min-height: 40px !important;
  padding: 8px 16px !important;
  display: inline-flex !important;
  align-items: center !important;
}
/* 5 · the SHAPE choices: circles with cramped two-line labels become proper
   chips — one size, readable sub-label, the chosen one wears the accent ring.
   (Their inline 12px corner was being re-rounded to a stamp by an ID-level
   fragment rule — same war, same escalation.) */
:is(#fl-topic-main, .fl-root) [style*="flex: 1 1 260px"] > button.fl-btn.fl-btn[style*="border-radius: 12px"] {
  border-radius: 12px !important;
  min-width: 96px;
  min-height: 54px;
  padding: 9px 14px !important;
  text-align: center !important;
  line-height: 1.25 !important;
}
/* 6 · the shape preview read as a broken empty box — it is a miniature of the
   pasted card, so it shows a card: keyline, a title bar and two body lines */
.fl-root [style*="width: 116px"][style*="height: 100px"] > div {
  position: relative;
  background-color: color-mix(in oklab, var(--sheet) 94%, var(--p-shade)) !important;
  box-shadow: inset 0 0 0 1.5px color-mix(in oklab, var(--inkS) 26%, transparent) !important;
  border-radius: 8px !important;
  overflow: hidden;
}
.fl-root [style*="width: 116px"][style*="height: 100px"] > div::before {
  content: "";
  position: absolute; left: 12%; top: 16%; right: 34%; height: 7px;
  border-radius: 4px;
  background: color-mix(in oklab, var(--inkS) 34%, transparent);
}
.fl-root [style*="width: 116px"][style*="height: 100px"] > div::after {
  content: "";
  position: absolute; left: 12%; top: 40%; right: 16%; height: 26px;
  background:
    linear-gradient(color-mix(in oklab, var(--inkS) 18%, transparent), color-mix(in oklab, var(--inkS) 18%, transparent)) 0 0 / 100% 5px no-repeat,
    linear-gradient(color-mix(in oklab, var(--inkS) 18%, transparent), color-mix(in oklab, var(--inkS) 18%, transparent)) 0 12px / 78% 5px no-repeat;
}
@media (max-width: 759px) {
  .fl-root .fl-doors > button.fl-btn { min-height: 0; }
}

/* ═══ REORDERING THE PACKET (owner 2026-08-24: arrows AND drag, both live;
   plus "the help-me-say-this-differently link looks like it's in the wrong
   question box" and "the separating lines should be more distinct") ════════ */
/* the grip: quiet dots that promise a drag; touch-action none so a phone
   drags the row instead of scrolling the page */
:is(#fl-topic-main, .fl-root) .fl-qgrip.fl-qgrip {
  touch-action: none;
  cursor: grab;
  color: color-mix(in oklab, var(--muted) 80%, transparent);
  background: transparent !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 8px !important;
  box-shadow: none !important;
  display: inline-flex; align-items: center; justify-content: center;
  flex: none; padding: 0 !important; min-height: 0 !important;
}
:is(#fl-topic-main, .fl-root) .fl-qgrip.fl-qgrip:active { cursor: grabbing; color: var(--a1Text); }
@media (hover: hover) { :is(#fl-topic-main, .fl-root) .fl-qgrip.fl-qgrip:hover { color: var(--a1Text); } }
/* the arrow pair: one quiet keyline family, stacked beside the remove */
:is(#fl-topic-main, .fl-root) .fl-qup.fl-qup, :is(#fl-topic-main, .fl-root) .fl-qdn.fl-qdn {
  border: 1.5px solid color-mix(in oklab, var(--rule) 85%, transparent) !important;
  background: var(--sheet) !important;
  background-image: none !important;
  border-radius: 7px !important;
  color: var(--body) !important;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0 !important; min-height: 0 !important;
  box-shadow: none !important;
}
@media (hover: hover) {
  :is(#fl-topic-main, .fl-root) :is(.fl-qup.fl-qup, .fl-qdn.fl-qdn):hover {
    color: var(--a1Text) !important;
    border-color: color-mix(in oklab, var(--a1Text) 45%, transparent) !important;
  }
}
/* a thumb needs real targets: on touch the pair lies side by side, full height */
@media (pointer: coarse), (max-width: 759px) {
  :is(#fl-topic-main, .fl-root) .fl-qud { flex-direction: row !important; gap: 6px !important; }
  :is(#fl-topic-main, .fl-root) .fl-qup.fl-qup, :is(#fl-topic-main, .fl-root) .fl-qdn.fl-qdn { width: 40px !important; height: 44px !important; }
  :is(#fl-topic-main, .fl-root) .fl-qgrip.fl-qgrip { width: 34px !important; height: 44px !important; }
}
/* THE ROW'S OWN GROUND: each packet question ends in its OWN distinct rule,
   BELOW the rephrase word-mark — so "Help me say this differently" can never
   read as the next question's furniture. The old faint line stays as the
   written line under the text; the separator is the wrapper's. */
/* frag-m's row transformation zeroes ALL borders at (1,5,0) — the repeated
   attribute out-counts it so the separator actually paints */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [data-qidx][data-qidx][data-qidx][data-qidx][data-qidx][data-qidx] {
  border-bottom: 1.5px solid color-mix(in oklab, var(--inkS) 26%, transparent) !important;
  padding-bottom: 7px !important;
  margin-bottom: 8px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [data-qidx][data-qidx][data-qidx][data-qidx][data-qidx][data-qidx]:last-of-type { border-bottom: 0 !important; }
/* the rephrase offer hugs ITS question */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [data-qidx] > [style*="padding-left: 32px"] { margin-top: 3px !important; }
/* ═══ THE SUGGESTION LISTS' SEPARATORS, DISTINCT (custom + library) ═════════
   the clickable suggestion rows get a firm rule and honest air between them */
/* ONE line per row: the fragments already drew their own hairline on these
   rows (that was the double boundary the owner flagged) — it goes, mine is
   the separator. Repeated attribute out-counts their (1,5,0). */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 8px solid var(--a2)"][style*="cursor"][style*="cursor"][style*="cursor"][style*="cursor"][style*="cursor"] {
  background-image: none !important;
  border-bottom: 1.5px solid color-mix(in oklab, var(--inkS) 26%, transparent) !important;
  padding-bottom: 13px !important;
  margin-bottom: 11px !important;
}
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [style*="border-left: 8px solid var(--a2)"][style*="cursor"][style*="cursor"][style*="cursor"][style*="cursor"][style*="cursor"]:last-of-type { border-bottom: 0 !important; }

/* on a row that offers the rephrase word-mark, frag-m's full-measure written
   line under the question read as a ROW BOUNDARY above the chip (the owner
   flagged it twice). There, the chip's own underline IS the written line —
   one line, one owner; rows without the chip keep the full-measure line. */
.fl-scroll:is(:has(#fl-topic-main), :has(#fl-topic-main-sf)) [data-qidx][data-qidx][data-qidx]:has([style*="border: 1px dashed"]) > [style*="align-items: center"] {
  background-image: none !important;
}

/* the empty Loopvine's "Reset filters" measured 34px at 390 (the battery's
   floor) — same dense-eye/full-finger trick as the rephrase word-mark */
.fl-root .v2-mlink.v2-mlink {
  padding-top: 13px !important;
  padding-bottom: 13px !important;
  margin-top: -5px !important;
  margin-bottom: -5px !important;
}

/* ═══ THE LINK NAME IS AN INLINE EDIT, NOT A FORM WELL (owner 2026-08-24) ═══
   The app draws each share-link's name as a quiet dashed-underline inline
   edit; the core's paper-well input treatment (and the 44px floor) turned it
   into a double-ringed lozenge. Restored to the app's own design. */
.fl-root input.v2-lknm.v2-lknm.v2-lknm.v2-lknm.v2-lknm.v2-lknm {
  background: transparent !important;
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  border: 0 !important;
  border-bottom: 1px dashed color-mix(in oklab, var(--a1) 45%, transparent) !important;
  border-radius: 0 !important;
  min-height: 0 !important;
  height: auto !important;
  padding: 1px 0 2px !important;
}
.fl-root input.v2-lknm.v2-lknm.v2-lknm.v2-lknm.v2-lknm.v2-lknm:focus {
  border-bottom-style: solid !important;
  border-bottom-color: var(--a1) !important;
}

/* ═══ THE SIGNED-IN HOME'S CROWN (owner 2026-08-25: "top of page has a blank
   space. add a thin row of flowers there. same flowers from the top of
   profile page. only the signed-in homepage.") — the profile cover's still
   flowerbed, as a quiet strip along the very top of the page. `.v2-greet`
   exists only on the authed home, so no other screen can grow it. */
/* desktop only (owner 2026-08-25: "flowers should only be top of sign-in
   homepage on desktop") — phones and tablets keep the clean top */
@media (min-width: 1025px) {
  .fl-root .fl-scroll:has(.v2-greet) { position: relative; }
  .fl-root .fl-scroll:has(.v2-greet)::before {
    content: "";
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 64px;
    background-image: url("patterns/flowerbed-still.svg");
    background-size: auto 52px;
    background-repeat: repeat-x;
    background-position: left bottom;
    opacity: .9;
    pointer-events: none;
  }
}

/* ═══ REDUCED MOTION REACHES THE ARRIVAL (found 2026-08-25 by the battery's
   new at-rest measurement): `.fl-arrive > *` ships opacity:0 and relies on
   flArriveUp to fade in — with motion off, a recipient's whole arrival card
   (Send feedback back, Decline, Keep this…) stayed a ghost. End states are a
   contract: everything lands visible, nothing moves. */
@media (prefers-reduced-motion: reduce) {
  .fl-root .fl-arrive > * {
    opacity: 1 !important;
    transform: none !important;
    animation: none !important;
  }
}

/* the arrival card's actions are REAL buttons on a card, not ghosts — the
   ghost treatment (2% ink over transparent) left them reading whatever sat
   behind the phone frame (1.09:1 in amethyst-night, surfaced by the at-rest
   sweep). Their inline intent (sheet fill, rule ring) is restored. */
:is(#fl-topic-main, .fl-root) .fl-arrive button.fl-btn.fl-btn[style*="background: var(--sheet)"],
:is(#fl-topic-main, .fl-root) .fl-arrive button.fl-btn.fl-btn[style*="background: transparent"][style*="min-height: 44px"] {
  background: var(--sheet) !important;
  background-image: none !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--inkS) 18%, transparent), 0 1px 2px var(--elev-1) !important;
}
:is(#fl-topic-main, .fl-root) .fl-arrive button.fl-btn.fl-btn[style*="background: var(--sheet)"] { color: var(--ink) !important; }

/* ═══ THE DIALOG CENTERS WITHOUT TRANSFORMS (found 2026-08-25 by the tablet
   sweep): ≥720px the app centers .ui-sheet with translate(-50%,-50%) — any
   reduced-motion transform-strip parks it half off-screen (the first-run
   sheet hung off the right edge). inset:0 + margin:auto centers a fixed
   element under EVERY motion setting. */
@media (min-width: 720px) {
  .fl-root .ui-sheet, .ui-sheet {
    inset: 0 !important;
    margin: auto !important;
    transform: none !important;
    width: min(520px, 92vw) !important;
    height: fit-content !important;
    max-height: 88vh !important;
  }
}

/* ═══ THE PROFILE CAROUSEL'S PAGER, REPAIRED (owner 2026-08-25) ═════════════
   The page dots ship 7px tall with an invisible 44px hit box clipped to
   content-box — garden button rules repainted the WHOLE box (a giant capsule
   and a cream oval). The dots keep their own geometry and clip. */
/* the visible dot IS the button's own rounded box (content-box painting can
   never show round corners — the strip sits mid-box); the 44px finger lands
   on an invisible ::after that inherits the button's click. */
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn.fl-btn.fl-btn[style*="height: 7px"][style*="height: 7px"][style*="border-radius: 999px"] {
  background-clip: border-box !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 999px !important;
  box-shadow: none !important;
  min-height: 0 !important;
  height: 7px !important;
  padding: 0 !important;
  margin: 0 4px !important;
  position: relative !important;
  box-sizing: border-box !important;
}
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn.fl-btn.fl-btn[style*="height: 7px"][style*="height: 7px"][style*="border-radius: 999px"]::after {
  content: "";
  position: absolute;
  inset: -19px -4px;
}
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn.fl-btn.fl-btn[style*="height: 7px"][style*="height: 7px"][style*="border-radius: 999px"][style*="background: var(--a1)"] { background-color: var(--a1) !important; }
:is(#fl-topic-main, .fl-root) button.fl-btn.fl-btn.fl-btn.fl-btn[style*="height: 7px"][style*="height: 7px"][style*="border-radius: 999px"][style*="background: var(--rule)"] { background-color: color-mix(in oklab, var(--inkS) 28%, transparent) !important; }
/* the top arrows: quiet 26px rings, full 44px finger through the hit-box trick */
:is(#fl-topic-main, .fl-root) .fl-pfnav.fl-pfnav {
  width: 26px; height: 26px;
  min-height: 0 !important;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 9px !important;
  margin: -9px 0 !important;
  box-sizing: content-box;
  background: transparent !important;
  background-clip: content-box !important;
  border: 0 !important;
  box-shadow: none !important;
  border-radius: 50% !important;
  color: var(--muted) !important;
  font-size: 14px;
  cursor: pointer;
}
@media (hover: hover) {
  :is(#fl-topic-main, .fl-root) .fl-pfnav.fl-pfnav:hover { color: var(--a1Text) !important; }
}


/* ═══ THE FOOTER PAYS ONLY FOR ITS INK ══════════════════════════════════════
   (owner 2026-08-25: "the footer is still too big, from top to bottom. remove
   some of the dead space area, shrink the height of the footer" — mobile
   first, then "same for desktop… same for tablet.")
   MEASURED, all three widths: 40-74px of real ink inside a 142/178/246px card.
   The air was a reserved band under the last row, an oversized top margin, and
   every link row standing 40-47px tall to hold 14px of type.
   WHAT IS *NOT* TOUCHED: the tap targets. Every line in this footer is a link
   — the credit reads as type but points at Curioso Corp — so shrinking a row
   shrinks a target, and targets that grow into each other steal taps (a first
   pass here let "About" swallow the top of "Terms of Service"; the probe
   caught it). So: a finger still gets 40px on touch, a mouse gets the 26px
   this footer already shipped on desktop, and NO two targets may overlap.
   The height comes out of the empty space instead. */
.fl-root .fl-foot-canvas, .fl-root .fl-about-foot,
.fl-foot-canvas, .fl-about-foot {
  padding-top: 18px !important;
}
/* every footer line is a link: one rhythm for all of them, sized for a mouse */
.fl-root .fl-foot-canvas a, .fl-root .fl-about-foot a,
.fl-root .fl-foot-canvas .fl-credit, .fl-root .fl-about-foot .fl-credit,
.fl-root .fl-foot-canvas .fl-about-foot-link, .fl-root .fl-about-foot .fl-about-foot-link,
.fl-foot-canvas a, .fl-about-foot a,
.fl-foot-canvas .fl-credit, .fl-about-foot .fl-credit,
.fl-foot-canvas .fl-about-foot-link, .fl-about-foot .fl-about-foot-link {
  min-height: 0 !important;
  line-height: 1.35 !important;
  padding-block: 6px !important;
  margin-block: 0 !important;
}
/* A FINGER GETS MORE THAN A CURSOR — but sized by ROLE, not one blanket number.
   Four stacked touch rows are what actually makes the phone footer tall, and
   the usual trick for this (an oversized invisible target pulled back with a
   negative margin) is UNAVAILABLE here: every line in this footer is a link,
   so a target that grows steals its neighbour's taps — a first pass let
   "About" swallow the top of "Terms of Service", which the probe caught.
   So the targets are sized to fit instead: 40px for the links people reach
   for, 30px for the courtesy credit (the least-pressed link on the page).
   Both clear the WCAG 2.5.8 floor (24px) with room, and none overlap. */
@media (pointer: coarse) {
  .fl-root .fl-foot-canvas a, .fl-root .fl-about-foot a,
  .fl-root .fl-foot-canvas .fl-about-foot-link,
  .fl-root .fl-about-foot .fl-about-foot-link,
  .fl-foot-canvas a, .fl-about-foot a,
  .fl-foot-canvas .fl-about-foot-link, .fl-about-foot .fl-about-foot-link {
    padding-block: 10px !important;
  }
  .fl-root .fl-foot-canvas .fl-credit, .fl-root .fl-about-foot .fl-credit,
  .fl-foot-canvas .fl-credit, .fl-about-foot .fl-credit,
  .fl-root .fl-foot-canvas .fl-credit a, .fl-foot-canvas .fl-credit a {
    padding-block: 5px !important;
  }
}
/* the language codes are WIDE targets already (36-41px across) — they need no
   extra height on top of that, so the row stands at the height of its type */
.fl-root .fl-foot-canvas .fl-foot-lang, .fl-foot-canvas .fl-foot-lang,
.fl-root .fl-about-foot .fl-foot-lang, .fl-about-foot .fl-foot-lang {
  line-height: 1 !important;
}
.fl-root .fl-foot-canvas .fl-foot-lang button, .fl-foot-canvas .fl-foot-lang button,
.fl-root .fl-foot-canvas .fl-foot-lang .fl-btn, .fl-foot-canvas .fl-foot-lang .fl-btn,
.fl-root .fl-about-foot .fl-foot-lang button, .fl-about-foot .fl-foot-lang button,
.fl-root .fl-about-foot .fl-foot-lang .fl-btn, .fl-about-foot .fl-foot-lang .fl-btn {
  min-height: 38px !important;
  height: 38px !important;
  padding-block: 0 !important;
  margin-block: 0 !important;
}
/* the rows themselves stop carrying their own spare margins */
.fl-root .fl-foot-canvas .fl-foot-pal,
.fl-foot-canvas .fl-foot-pal { margin-bottom: 6px !important; }
.fl-root .fl-foot-canvas .fl-foot-lang,
.fl-foot-canvas .fl-foot-lang { margin: 0 !important; }
.fl-root .fl-foot-canvas .fl-foot-lang button,
.fl-foot-canvas .fl-foot-lang button { min-height: 40px !important; }
@media (max-width: 480px) {
  .fl-root .fl-foot-canvas, .fl-root .fl-about-foot,
  .fl-foot-canvas, .fl-about-foot { padding-top: 12px !important; }
}

