/* Clay site — theme system + bento grid + glass widgets + editor chrome.
   Lifted from nxtwk's liquid-glass bento. A "theme" = a token scope below;
   add a new [data-theme="x"] block to add a theme. */
/* ── self-hosted variable fonts (served from /fonts) ── */
@font-face { font-family:'Satoshi'; src:url(/fonts/Satoshi-Variable.woff2) format('woff2'); font-weight:300 900; font-display:swap; }
@font-face { font-family:'Mona Sans'; src:url(/fonts/MonaSans-VF.woff2) format('woff2'); font-weight:200 900; font-stretch:75% 125%; font-display:swap; }
@font-face { font-family:'Montserrat'; src:url(/fonts/Montserrat.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Space Grotesk'; src:url(/fonts/SpaceGrotesk.woff2) format('woff2'); font-weight:300 700; font-display:swap; }
@font-face { font-family:'Fraunces'; src:url(/fonts/Fraunces.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Awesome Serif'; src:url(/fonts/AwesomeSerif-VF.woff2) format('woff2'); font-weight:100 700; font-style:normal; font-display:swap; }
@font-face { font-family:'Awesome Serif'; src:url(/fonts/AwesomeSerif-Italic-VF.woff2) format('woff2'); font-weight:100 700; font-style:italic; font-display:swap; }
@font-face { font-family:'Victor Mono'; src:url(/fonts/VictorMono.woff2) format('woff2'); font-weight:100 700; font-display:swap; }
@font-face { font-family:'Inter'; src:url(/fonts/Inter.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Anton'; src:url(/fonts/Anton.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Pixelify Sans'; src:url(/fonts/PixelifySans.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Sora'; src:url(/fonts/Sora.woff2) format('woff2'); font-weight:100 800; font-display:swap; }
@font-face { font-family:'JetBrains Mono'; src:url(/fonts/JetBrainsMono.woff2) format('woff2'); font-weight:100 800; font-display:swap; }
@font-face { font-family:'Bricolage Grotesque'; src:url(/fonts/Bricolage.woff2) format('woff2'); font-weight:200 800; font-display:swap; unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; }
@font-face { font-family:'Bricolage Grotesque'; src:url(/fonts/Bricolage-ext.woff2) format('woff2'); font-weight:200 800; font-display:swap; unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF; }
@font-face { font-family:'Figtree'; src:url(/fonts/Figtree.woff2) format('woff2'); font-weight:300 900; font-display:swap; unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; }
@font-face { font-family:'Figtree'; src:url(/fonts/Figtree-ext.woff2) format('woff2'); font-weight:300 900; font-display:swap; unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF; }
@font-face { font-family:'Instrument Serif'; src:url(/fonts/InstrumentSerif.woff2) format('woff2'); font-weight:400; font-style:normal; font-display:swap; }
@font-face { font-family:'Instrument Serif'; src:url(/fonts/InstrumentSerif-Italic.woff2) format('woff2'); font-weight:400; font-style:italic; font-display:swap; }
@font-face { font-family:'Space Mono'; src:url(/fonts/SpaceMono.woff2) format('woff2'); font-weight:400 700; font-display:swap; }
@font-face { font-family:'Gabarito'; src:url(/fonts/Gabarito.woff2) format('woff2'); font-weight:400 900; font-display:swap; }
@font-face { font-family:'Clay Area'; src:url(/fonts/ic-area.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Ashford'; src:url(/fonts/ic-fontspringdemoashf.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Bentona'; src:url(/fonts/ic-bentonawilson.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Benzin'; src:url(/fonts/ic-benzinregular.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Causten'; src:url(/fonts/ic-caustenregular.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Chloe'; src:url(/fonts/ic-chloe.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay F37 Moon'; src:url(/fonts/ic-f37moon.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Fifties'; src:url(/fonts/ic-vvdsfifties.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Flatline'; src:url(/fonts/ic-flatlinesans.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Genty'; src:url(/fonts/ic-gentydemo.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Growth'; src:url(/fonts/ic-growth.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Gunterz Round'; src:url(/fonts/ic-fontspringdemogunt.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Gunterz'; src:url(/fonts/ic-gunterz.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Inge'; src:url(/fonts/ic-inge.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Kapra Neue'; src:url(/fonts/ic-kapraneuepro.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Lapoya'; src:url(/fonts/ic-lapoya.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Lemon'; src:url(/fonts/ic-lemon.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Love'; src:url(/fonts/ic-love.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Mathreal'; src:url(/fonts/ic-mathreal.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Morning'; src:url(/fonts/ic-morningmemories.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Neiko'; src:url(/fonts/ic-neiko.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Nimbus'; src:url(/fonts/ic-nimbus.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Didot'; src:url(/fonts/ic-nndidotmodernstd.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Right Slab'; src:url(/fonts/ic-pprightslab.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Runalto'; src:url(/fonts/ic-runalto.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Sigurd'; src:url(/fonts/ic-sigurd.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Simplicité'; src:url(/fonts/ic-hvsimplicite.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Singleton'; src:url(/fonts/ic-singleton.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Swell'; src:url(/fonts/ic-swell.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Versailles'; src:url(/fonts/ic-versailles.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
@font-face { font-family:'Clay Voyage'; src:url(/fonts/ic-voyage.woff2) format('woff2'); font-weight:100 900; font-display:swap; }
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
:root {
  --gutter: clamp(12px, 3vw, 26px);
  --maxw: 1100px;
  /**
   * CLAY app chrome — FIXED, never follows the site theme.
   *
   * The brand is black and white with ONE warm accent. `--qck` is the accent's old name and stays
   * as one: every rule in this file and in the editor reads it, and renaming a token nobody sees
   * is churn with a chance of a miss. Clay's own type is Bricolage Grotesque for anything that is
   * a heading or the wordmark, Figtree for everything that is read.
   */
  --qck: #C87F5E;
  --qck-ink: #1a0a04;
  --qck-font: "Figtree", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --brand-font: "Bricolage Grotesque", "Figtree", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  /* page background (per-site) */
  --page-bg: #07070a;
  /* site-theme fallbacks (the real values are injected on .wrap) */
  --ink: #F4F2EE; --ink-dim: rgba(244,242,238,0.62); --ink-faint: rgba(244,242,238,0.34);
  --hair: rgba(255,255,255,0.10); --accent: #C87F5E; --on-accent: #1a0a04;
  --card-bg: rgba(255,255,255,0.06); --card-border: rgba(255,255,255,0.14);
  --card-shadow: 0 22px 50px -24px rgba(0,0,0,0.55); --radius: 30px; --gap: 14px; --blur: 22px;
  --font: var(--qck-font);
}
/* ------------------------------- base ------------------------------- */
body {
  min-height: 100dvh;
  background: var(--page-bg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  font: 16px/1.5 var(--qck-font);           /* chrome default font */
  -webkit-font-smoothing: antialiased;
  padding: var(--gutter);
  transition: background-color .3s;
}
a { color: inherit; }
/* the SITE CANVAS — theme tokens are injected here, so the site changes but the
   Clay chrome (toolbar, modals) outside it never does */
.wrap {
  max-width: var(--maxw); margin: 0 auto;
  color: var(--ink);
  font-family: var(--font);
  container-type: inline-size;            /* so device preview triggers the real layout */
  transition: max-width .45s cubic-bezier(.32,.72,0,1);
}
/* leave room under the last block so the floating editor bar never covers it (editor only, not preview) */
body.is-owner:not(.preview) .wrap { padding-bottom: 96px; }
/* device preview (desktop only) — constrain the canvas width */
body.dev-mobile .wrap { max-width: 400px; }
body.dev-tablet .wrap { max-width: 800px; }
/* site header (logo + name) */
.site-head {
  display: flex; align-items: center; gap: 14px;
  padding: 8px 4px 22px;
}
.site-logo {
  width: 48px; height: 48px; border-radius: 14px; object-fit: cover;
  background: var(--card-bg); border: 1px solid var(--card-border);
  display: grid; place-items: center; font-weight: 700; font-size: 20px;
}
.site-id { min-width: 0; }
.site-name { font-family: var(--h1-font, var(--font)); font-size: clamp(20px, 4vw, 30px); font-weight: 650; letter-spacing: -0.02em; }
.site-tagline { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); font-size: clamp(13px, 2vw, 15px); margin-top: 2px; }
/* ------------------------------- grid ------------------------------- */
/* nxtwk-style bento: 12 cols + a FIXED row track so width and height are
   independent tiers. Height tiers span whole rows, so "1 tall = 2 short
   stacked" always lines up (4 rows + 3 gaps === two ×(2 rows + 1 gap) + gap). */
.clay-grid {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr)); /* minmax(0,..) prevents min-content blowout */
  grid-auto-rows: var(--row, 94px);
  grid-auto-flow: row dense;
  gap: var(--gap);
}
/* width tiers: small=4 (1/3) · medium=8 (2/3) · large=12 (full) */
.w { grid-column: span 8; min-width: 0; }
.w.s { grid-column: span 4; }
.w.m { grid-column: span 8; }
.w.l { grid-column: span 12; }
/* height tiers: compact · short · medium · tall (every .w carries exactly one) */
.w.h-xs { grid-row: span 1; }
.w.h-s { grid-row: span 2; }
.w.h-m { grid-row: span 3; }
.w.h-l { grid-row: span 4; }
/* v23: the portrait tier. Additive — every span above is unchanged, so nothing that already
   exists moves. 7 rows = 742px, which at the narrow width is the 0.5-ish portrait the widgets
   were drawn against. */
.w.h-xl { grid-row: span 8; }
/* mobile: single column. Height tiers still apply (short/medium/tall) so the height
   tool works on the phone too — a min-height per tier, content can grow past it. */
@container (max-width: 720px) {
  .clay-grid { grid-auto-rows: auto; }
  .w, .w.s, .w.m, .w.l { grid-column: 1 / -1; }
  .w.h-xs, .w.h-s, .w.h-m, .w.h-l, .w.h-xl { grid-row: auto; }
  .w.h-xs { min-height: 0; }
  .w.h-s { min-height: 150px; }
  .w.h-m { min-height: 240px; }
  .w.h-l { min-height: 360px; }
}
/* ===== BENTO (P1): 3-col positioned grid · fixed square-ish cells · gaps show the themed backdrop ===== */
#grid.bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-auto-rows: var(--bcell, 300px); grid-auto-flow: row dense; gap: 20px; max-width: 1200px; margin: 0 auto; }
#grid.bento .w { margin: 0; width: auto; min-width: 0; min-height: 0; height: auto; }
#grid.bento .w > .card, #grid.bento .w > .wg-image, #grid.bento .w > .wg-gallery, #grid.bento .w > .wg-map, #grid.bento .w > .wg-header, #grid.bento .w > .wg-hero { height: 100%; min-height: 0; }
/* filler tile — one of the business's photos, fills a leftover slot so the grid is never holey */
#grid.bento .wg-filler { height: 100%; border-radius: var(--radius, 20px); background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--accent, #C87F5E) 14%, rgba(255,255,255,0.045)); box-shadow: inset 0 1px 0 rgba(255,255,255,.08); }
#grid.bento .bx-filler[data-filler] { opacity: .96; }
/* THE LAYOUT LIBRARY — a card per layout in Design, shaped like the theme cards next door because
   it is the same act: a big drawing of the thing, the one you are on marked, the page changing
   underneath. The sketch is a 3-column mini of the layout's first few blocks. */
.gp-prev { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(var(--rows, 1), 1fr); gap: 4px; height: 100%; width: 100%; }
.gp-prev > span { background: rgba(255,255,255,0.30); border-radius: 4px; }
.vibe-prev.lay { background: #101011; padding: 12px; display: flex; align-items: center; justify-content: center; }
/* Square cells, so the drawing is the shape of the real grid rather than a squashed version of it:
   three columns against however many rows the sketch drew. */
.vibe-prev.lay .gp-prev { height: 100%; width: auto; aspect-ratio: calc(3 / var(--rows, 3)); }
.vibe.on .gp-prev > span { background: color-mix(in srgb, #C87F5E 75%, #fff); }
/* mobile: one column, stacked, full-width; positions ignored */
#grid.bento.m-stack { display: flex; flex-direction: column; gap: 16px; max-width: 520px; }
#grid.bento.m-stack .w { grid-column: auto !important; grid-row: auto !important; min-height: 150px; }
#grid.bento.m-stack .w > .card { height: auto; }
/* ------------------------- smart layout (sections) ------------------------- */
/* #grid in sections mode is a vertical stack of bento blocks; each .sec is its own
   12-col × N-row grid with fixed slots — no auto-flow, so nothing ever reflows on resize. */
.clay-grid.sec-mode { display: flex; flex-direction: column; gap: var(--gap); grid-template-columns: none; grid-auto-flow: initial; }
.sec { position: relative; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-template-rows: repeat(var(--rows, 1), minmax(var(--rowmin, 200px), auto)); gap: var(--gap); }
.sec-slot { position: relative; min-width: 0; min-height: 0; }
.sec-slot > .w { height: 100%; width: 100%; margin: 0; min-height: 0; }
.sec-slot > .w, .sec-slot > .w.s, .sec-slot > .w.m, .sec-slot > .w.l { grid-column: auto; grid-row: auto; }
/* the SECTION/slot drives height in smart mode — clear the widgets' intrinsic min-heights so the
   chosen section height actually applies (the row's --rowmin is the floor; tall content still grows). */
.clay-grid.sec-mode .sec-slot .card, .clay-grid.sec-mode .sec-slot .wg-image, .clay-grid.sec-mode .sec-slot .wg-gallery, .clay-grid.sec-mode .sec-slot .wg-map { min-height: 0; }
/* empty slot — invisible on the live site, a dashed "add" target in the editor */
.sec-empty { border-radius: var(--radius); }
body.is-owner:not(.preview) .sec-empty { border: 1.5px dashed rgba(255,255,255,0.26); background: rgba(15,15,18,0.28); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); display: grid; place-items: center; }
.sec-add { display: inline-flex; align-items: center; gap: 7px; background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.85); border: 0; border-radius: 999px; padding: 9px 15px 9px 12px; font: inherit; font-size: 13px; font-weight: 650; cursor: pointer; }
/* editor chrome lives inside the themed grid — always Clay UI font, never the site's theme font */
.sec-add, .sec-addrow, .sec-addrow span, .sec-tray, .sec-tray-h, .sec-chip, .sec-tools, .w-tools, .w-hidebadge, .m-infobox { font-family: var(--qck-font) !important; }
.sec-add svg { width: 17px; height: 17px; }
.sec-add:hover { background: color-mix(in srgb, var(--qck) 30%, rgba(255,255,255,0.1)); color: #fff; }
body.preview .sec-empty, body:not(.is-owner) .sec-empty { display: none; }
/* a fully-empty section collapses on the LIVE site (owner keeps it visible to fill it) */
/* An empty BENTO section is not drawn for a visitor. Scoped to the bento canvas: `.sec` is a plain
   name and a clay page uses it for its bands, which have no `.sec-slot` in them — so unscoped this
   rule hid every band of every clay page the moment you pressed Preview. */
body:not(.is-owner) .wrap .sec:not(:has(.sec-slot .w)), body.preview .wrap .sec:not(:has(.sec-slot .w)) { display: none; }
/* section toolbar (owner) — floats top-center INSIDE the section (so a backdrop's overflow:hidden
   never clips it), appears on hover, clear of the widget tools (top-right) and hide badge (top-left) */
.sec-tools { display: none; }
/* only on real hover/mouse devices — never on touch (so phones never get stuck-hover section chrome) */
@media (hover: hover) and (pointer: fine) {
  /* desktop-only: a vertical strip STRADDLING the section's left edge — half in the gutter, half over the
     edge, so it touches the section (hover never drops) and never clips off-screen. Top-aligned for short
     sections. The whole left edge is a reliable hover+click zone. */
  body.is-owner:not(.preview):not(.dev-mobile):not(.dev-tablet) .sec > .sec-tools { display: none; position: absolute; top: 10px; left: 10px; z-index: 14; flex-direction: column; gap: 6px; }
  body.is-owner:not(.preview):not(.dev-mobile):not(.dev-tablet) .sec:hover > .sec-tools,
  body.is-owner:not(.preview):not(.dev-mobile):not(.dev-tablet) .sec-tools:hover { display: flex; }
}
.sec-btn { display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 10px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.16); background: rgba(18,18,20,0.92); color: #fff; backdrop-filter: blur(8px); cursor: pointer; font: inherit; font-size: 12px; font-weight: 600; }
.sec-btn svg { width: 15px; height: 15px; }
.sec-btn:hover { background: #000; }
.sec-btn.sec-del:hover { background: #e0392b; border-color: #e0392b; }
.sec-btn[disabled] { opacity: .35; pointer-events: none; }
.sec-slot.drop { outline: 2px dashed var(--qck); outline-offset: -3px; border-radius: var(--radius); }
.sec-dragsrc { opacity: .35; }
/* section background — styled by a chosen PRESET (full card system; glass/gradient/image all work) */
.sec.has-bg { position: relative; border-radius: var(--radius); overflow: hidden; padding: clamp(16px, 2.2cqw, 30px); }
.sec.has-bg > .sec-slot { z-index: 1; }
.sec.has-bg > .sec-tools { z-index: 9; }
.sec-bg { position: absolute; inset: 0; z-index: 0; border-radius: var(--radius); background-size: cover; background-position: center; }
/* dock "+" chooser popover */
.add-chooser { position: fixed; z-index: 65; width: 230px; background: #161617; border: 1px solid rgba(255,255,255,0.14); border-radius: 16px; padding: 7px; box-shadow: 0 22px 50px -16px rgba(0,0,0,0.7); display: flex; flex-direction: column; gap: 4px; }
.add-chooser button { display: flex; align-items: center; gap: 12px; width: 100%; padding: 11px 12px; border: 0; border-radius: 12px; background: transparent; color: #fff; font: inherit; cursor: pointer; text-align: left; }
.add-chooser button:hover { background: rgba(255,255,255,0.08); }
.add-chooser .ac-ic { width: 34px; height: 34px; border-radius: 10px; background: color-mix(in srgb, var(--qck) 16%, transparent); color: var(--qck); display: grid; place-items: center; flex: 0 0 auto; }
.add-chooser .ac-ic svg { width: 17px; height: 17px; }
.add-chooser .ac-tx { display: flex; flex-direction: column; }
.add-chooser .ac-tx b { font-size: 14.5px; font-weight: 700; }
.add-chooser .ac-tx small { font-size: 12px; color: rgba(255,255,255,0.5); }
/* "Add section" CTA in the add-mode modal */
.sm-addbtn { width: 100%; margin-top: 16px; display: inline-flex; align-items: center; justify-content: center; gap: 8px; }
.sm-addbtn[disabled] { opacity: .45; cursor: default; }
.sm-addbtn svg { width: 17px; height: 17px; }
/* section background preset tiles + "New style" */
/* layout panel: action row + saved-layout delete badge */
.lay-row2 { display: flex; gap: 10px; margin: 14px 0; }
.lay-row2 .btn { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 7px; white-space: nowrap; padding: 12px 10px; }
.lay-bico { display: inline-flex; }
.lay-bico svg { width: 16px; height: 16px; }
.tpl-opt { position: relative; }
.tpl-x { position: absolute; top: 6px; right: 6px; width: 22px; height: 22px; border: 0; border-radius: 50%; background: rgba(0,0,0,0.55); color: #fff; cursor: pointer; display: grid; place-items: center; opacity: 0; transition: opacity .12s; }
.tpl-opt:hover .tpl-x, .tpl-opt.saved .tpl-x { opacity: 1; }
.tpl-x svg { width: 12px; height: 12px; }
/* section editor modal */
.sec-modal { max-width: 440px; width: 92vw; }
.sec-modal .sm-body { margin: 0 -4px; padding: 0 4px; max-height: 68vh; overflow-y: auto; }
/* filter the shapes by how many widgets they hold */
.sm-cnt { display: flex; flex-wrap: wrap; gap: 7px; margin: 2px 0 14px; }
.sm-cntpill { min-width: 38px; height: 34px; padding: 0 14px; border-radius: 999px; border: 0; cursor: pointer; font: inherit; font-weight: 700; font-size: 13.5px; background: rgba(255,255,255,0.08); color: rgba(255,255,255,0.6); transition: background .15s, color .15s; white-space: nowrap; }
.sm-cntpill:hover { color: #fff; }
.sm-cntpill.on { background: var(--qck, #C87F5E); color: #fff; }
.sm-lbl { font-size: 11px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: rgba(255,255,255,0.45); margin: 4px 0 10px; }
.sm-lbl .ep-mut { color: rgba(255,255,255,0.3); }
/* smaller shape icons; ~2.5 rows visible then scrolls. align-items:start so the cards keep
   their aspect ratio instead of stretching to fill the (auto) grid-row height. */
.sm-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; align-items: start; max-height: 380px; overflow-y: auto; padding: 2px 6px 2px 2px; }
.sm-grid .sec-pat { aspect-ratio: 1.5; height: auto; align-self: start; }
.sm-grid .sec-pat-prev { gap: 2px; padding: 5px; }
.sm-bgrow { display: flex; align-items: center; gap: 9px; }
.sm-bgthumb { width: 56px; height: 40px; border-radius: 9px; background-size: cover; background-position: center; flex: 0 0 auto; }
.sm-bgbtn { flex: 1; }
.sm-bgbtn.ghost { flex: 0 0 auto; opacity: .75; }
.sm-bgadd { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; padding: 13px; border: 1px dashed rgba(255,255,255,0.24); border-radius: 12px; background: transparent; color: rgba(255,255,255,0.72); font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.sm-bgadd:hover { border-color: rgba(255,255,255,0.45); color: #fff; }
.sm-bgadd svg { width: 18px; height: 18px; }
/* the preset tiles inside the section modal — a touch tighter */
.sm-vibes { display: grid; grid-template-columns: repeat(2, 1fr); gap: 9px; max-height: 230px; overflow-y: auto; padding: 2px; }
/* preview mode: editor-only section chrome is hidden */
body.preview .sec-addrow, body.preview .sec-tray { display: none; }
/* "change widget type" row at the top of a widget's settings */
.wtype-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 13px; padding: 11px 13px; cursor: pointer; font: inherit; color: #fff; margin-bottom: 16px; }
.wtype-row:hover { border-color: rgba(255,255,255,0.28); }
.wtype-l { display: flex; align-items: center; gap: 11px; }
.wtype-ic { width: 30px; height: 30px; border-radius: 9px; background: rgba(255,255,255,0.08); display: grid; place-items: center; }
.wtype-ic svg { width: 16px; height: 16px; }
.wtype-l > span:last-child { display: flex; flex-direction: column; text-align: left; }
.wtype-lbl { font-size: 11px; color: rgba(255,255,255,0.45); font-weight: 600; }
.wtype-cur { font-size: 14px; font-weight: 700; }
.wtype-go { display: inline-flex; align-items: center; gap: 3px; font-size: 13px; font-weight: 650; color: var(--qck); }
.wtype-go svg { width: 14px; height: 14px; }
/* unplaced-widgets tray + add-section button (owner only) */
.sec-tray { margin-top: 6px; border: 1.5px dashed rgba(255,255,255,0.28); border-radius: 16px; padding: 12px 14px; background: rgba(15,15,18,0.5); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); }
.sec-tray .sec-chip-t { color: #fff; }
.sec-tray .sec-chip-n { color: rgba(255,255,255,0.55); }
.sec-tray .sec-chip { background: rgba(255,255,255,0.1); }
.sec-tray-h { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 650; color: rgba(255,255,255,0.72); margin-bottom: 10px; }
.sec-tray-h svg { width: 16px; height: 16px; }
.sec-tray-row { display: flex; flex-wrap: wrap; gap: 8px; }
.sec-chip { display: inline-flex; align-items: center; gap: 8px; background: color-mix(in srgb, var(--ink) 7%, transparent); border-radius: 11px; padding: 8px 8px 8px 12px; cursor: grab; user-select: none; }
.sec-chip-t { font-size: 12.5px; font-weight: 700; color: var(--ink); }
.sec-chip-n { font-size: 12px; color: var(--ink-dim); max-width: 130px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.sec-chip-x { width: 22px; height: 22px; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--ink) 10%, transparent); color: var(--ink-dim); cursor: pointer; display: grid; place-items: center; }
.sec-chip-x svg { width: 12px; height: 12px; }
.sec-addrow { margin-top: 4px; display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; padding: 14px; border: 1.5px dashed rgba(255,255,255,0.34); border-radius: 16px; background: rgba(15,15,18,0.5); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); color: rgba(255,255,255,0.85); font: inherit; font-size: 13.5px; font-weight: 650; cursor: pointer; }
.sec-addrow:hover { border-color: var(--qck); color: #fff; }
.sec-addrow svg { width: 18px; height: 18px; }
/* pattern picker popover */
.sec-pop { position: fixed; z-index: 120; width: 268px; background: #161617; border: 1px solid rgba(255,255,255,0.14); border-radius: 16px; padding: 14px; box-shadow: 0 28px 60px -20px rgba(0,0,0,0.7); }
.sec-pop-h { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: rgba(255,255,255,0.5); margin-bottom: 10px; }
.sec-pop-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.sec-pat { aspect-ratio: 1.3; padding: 0; border: 1px solid rgba(255,255,255,0.14); border-radius: 10px; background: #1f1f22; cursor: pointer; overflow: hidden; }
.sec-pat.on { border-color: var(--qck, #C87F5E); box-shadow: 0 0 0 1px var(--qck, #C87F5E); }
.sec-pat-prev { display: grid; grid-template-columns: repeat(12, 1fr); grid-template-rows: repeat(var(--rows, 1), 1fr); gap: 3px; width: 100%; height: 100%; padding: 6px; }
.sec-pat-prev > span { background: rgba(255,255,255,0.34); border-radius: 3px; }
/* templates gallery (Layout panel) */
.tpl-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-bottom: 14px; }
.tpl-opt { padding: 10px; border: 1px solid rgba(255,255,255,0.12); border-radius: 14px; background: #161617; cursor: pointer; font: inherit; color: #fff; display: flex; flex-direction: column; gap: 8px; }
.tpl-opt:hover { border-color: rgba(255,255,255,0.34); }
.tpl-prev { display: flex; flex-direction: column; gap: 4px; height: 76px; }
.tpl-row { display: grid; grid-template-columns: repeat(12, 1fr); grid-template-rows: repeat(var(--rows, 1), 1fr); gap: 4px; flex: 1; }
.tpl-row > span { background: rgba(255,255,255,0.22); border-radius: 4px; }
.lay-smart { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 14px; border: 1px solid rgba(255,255,255,0.14); border-radius: 14px; background: #161617; margin-bottom: 16px; }
.lay-smart-tx { display: flex; flex-direction: column; gap: 3px; }
.lay-smart-tx b { font-size: 14px; color: #fff; }
.lay-smart-tx span { font-size: 12px; color: rgba(255,255,255,0.55); }
.lay-hint { font-size: 12.5px; color: rgba(255,255,255,0.5); margin-bottom: 10px; }
/* undo / redo dock — top-left, owner editor */
/* UNDO AND REDO CLEAR THE SITE'S OWN BAR. On a designed page the top-left corner belongs to the
   business — their name or their mark, in a bar that sticks — and these were landing straight on
   it. `--ed-top` is measured from the page itself (site.js), never assumed: how tall that bar is
   is the theme's business, and the product asks rather than guesses. */
.undo-dock { position: fixed; top: calc(var(--ed-top, 0px) + 16px); left: 16px; z-index: 70; display: flex; gap: 8px; }
body.preview .undo-dock { display: none; }
/**
 * AND NOT OVER A MODAL.
 *
 * Undo and redo float above the page at a fixed position, so opening anything — a product's detail
 * sheet, a widget's settings, the side panel — left two round buttons sitting on top of the thing
 * you had just opened, over its heading, doing nothing useful. There is nothing to undo *in* a
 * modal: what they act on is the page behind it, and the page behind it is not what you are
 * looking at. They come back the moment it closes.
 *
 * `wm-open` is a widget modal, `sheet-open` a designed page's section sheet, `fb-open` the feedback
 * form — all three are things laid OVER the page. The side panel is not: on a desktop it is a
 * column down the right and undo is the most-used control in the editor, so hiding it whenever the
 * panel is open would hide it almost always. On a phone the panel IS the screen, and there it goes
 * with the rest (below).
 */
body.wm-open .undo-dock, body.sheet-open .undo-dock, body.fb-open .undo-dock {
  opacity: 0; pointer-events: none; transform: translateY(-6px);
  transition: opacity .16s, transform .16s; }
.ud-btn { width: 40px; height: 40px; border-radius: 12px; border: 1px solid rgba(255,255,255,0.16); background: rgba(18,18,20,0.86); color: #fff; backdrop-filter: blur(10px); cursor: pointer; display: grid; place-items: center; box-shadow: 0 10px 26px -12px rgba(0,0,0,0.6); transition: opacity .12s, background .12s; }
.ud-btn svg { width: 18px; height: 18px; }
.ud-btn:hover { background: #000; }
.ud-btn:disabled { opacity: .3; pointer-events: none; }
/* mobile: sections collapse to a single stacked column. Section EDITING is desktop-only for now —
   on a phone we just show clean stacked widgets (each with its gear); no section tools/slots/add/tray. */
@container (max-width: 720px) {
  .sec { display: flex; flex-direction: column; height: auto; gap: var(--gap); }
  .sec-slot { grid-column: auto !important; grid-row: auto !important; }
  .sec-slot > .w { height: auto; }
  .sec-empty, .sec-tools, .sec-addrow, .sec-tray { display: none !important; }
  body:not(.is-owner) .sec-slot:has(> .w.hide-mobile), body.preview .sec-slot:has(> .w.hide-mobile) { display: none; }
}
/* real phones + device-preview — same cleanup regardless of how the breakpoint resolves */
/* UNDO STAYS. The rest of this row is the bento grid's section tooling, which mobile genuinely has
   none of — undo and redo are not that. They are the only way back from a mis-tap, and a phone is
   where mis-taps happen. Top-left, where they have always been. */
@media (max-width: 700px) { .sec-empty, .sec-tools, .sec-addrow, .sec-tray { display: none !important; } }
/* UNDER THE HEADER, NOT BEHIND IT. This dropped the `--ed-top` offset on a phone and hard-coded
   12px, so the moment a theme's nav became fixed the undo buttons sat underneath it — invisible,
   and the first tap hit the nav instead. The offset is measured for a reason; keep it. */
@media (max-width: 700px) {
  /* CLEAR OF IT, not flush against it. 10px under a fixed nav put the buttons touching its bottom
     edge, so on a page whose nav has no shadow they read as part of it — and the first tap went to
     whichever the thumb was nearer. A whole button's breathing room instead. */
  .undo-dock { top: calc(var(--ed-top, 0px) + 18px); left: 10px; }
  /* and feedback comes up out of the bottom-left corner to sit opposite them, under the same bar —
     a pill floating over the page's last band is a pill covering somebody's content */
  #fb-dock { top: calc(var(--ed-top, 0px) + 18px); left: auto; right: 10px; bottom: auto; }
}
body.dev-mobile .sec-empty, body.dev-mobile .sec-tools, body.dev-mobile .sec-addrow, body.dev-mobile .sec-tray,
body.dev-tablet .sec-tools { display: none !important; }
/* ===== mobile editor — the m-stack render: a flat single column of widgets (no sections) ===== */
#grid.m-stack .m-list { display: flex; flex-direction: column; gap: var(--gap); }
#grid.m-stack .m-list > .w { width: 100%; margin: 0; }
body.preview .w-mtools { display: none !important; }
body.preview .m-infobox, body:not(.is-owner) .m-infobox { display: none !important; } /* mobile-editing hint is owner-only — never on a draft/visitor */
/* a generated DRAFT is a clean preview (claim → then edit): no editor chrome, just the Save & edit button */
/* small hint at the bottom of the mobile editor — point users to a bigger screen for desktop */
.m-infobox { display: flex; align-items: center; gap: 11px; padding: 13px 15px; margin-top: 4px; border-radius: 14px; border: 1px dashed color-mix(in srgb, var(--ink) 22%, transparent); background: color-mix(in srgb, var(--ink) 4%, transparent); color: var(--ink-dim, rgba(130,130,140,0.85)); font-size: 12.5px; line-height: 1.45; }
.m-infobox b { color: var(--ink, inherit); font-weight: 700; }
.m-info-ic { display: inline-flex; flex: 0 0 auto; opacity: .8; }
.m-info-ic svg { width: 19px; height: 19px; }
/* mobile stack: cards size to content by default (no desktop min-height bleed); JS sets an inline
   min-height only for visual widgets + explicit mobile-height overrides (inline wins over this) */
#grid.m-stack .w.h-xs, #grid.m-stack .w.h-s, #grid.m-stack .w.h-m, #grid.m-stack .w.h-l { min-height: 0; }
/* explicit mobile height: media FILLS the card (no empty gap); content CENTRES so a taller card looks intentional */
#grid.m-stack .card.m-fill { overflow: hidden; }
#grid.m-stack .card.m-fill .wg-body, #grid.m-stack .card.m-fill .wg-strip { flex: 1 1 auto; min-height: 0; }
#grid.m-stack .card.m-fill .wg-shot { height: 100%; aspect-ratio: auto; }
#grid.m-stack .card.m-center .wg-body { justify-content: safe center; }
/* the section modal is a dark sheet — keep its text readable on any theme (was inheriting theme ink) */
/* floating "which view am I editing" toggle — top-center, edit mode only */
body:not(.is-owner) .dev-float, body.preview .dev-float, body.tilt .dev-float { display: none !important; }
/* desktop only — on a phone you're inherently editing mobile, so no switch is shown there */
@media (max-width: 760px) { .dev-float { display: none !important; } }
/* Layout (sections/templates) is a desktop-only surface — mobile is a flat list, so hide it there */
body.dev-mobile #ed-bar [data-act="layout"] { display: none !important; }
@media (max-width: 760px) { #ed-bar [data-act="layout"] { display: none !important; } }
/* clear the floating toggle so it never overlaps the first section (desktop edit only) */
@media (min-width: 761px) { body.is-owner:not(.preview):not(.tilt) .wrap { padding-top: 56px; } }
/* with the floating toggle handling edit, the dock's device row is just for Preview */
body:not(.preview) .ed-bar .ed-devices { display: none !important; }
/* --------- card: the look is driven by the theme's FILL style --------- */
.card {
  position: relative; height: 100%;
  border-radius: var(--radius);
  overflow: hidden; isolation: isolate;
  padding: clamp(18px, 2.4cqw, 26px);
  transition: transform .18s cubic-bezier(.32,.72,0,1), border-radius .25s, box-shadow .2s;
}
a.card:hover { filter: brightness(1.04); }
/* button/anchor cards (teasers, link, map-compact) — kill the UA button chrome so there's no double border */
button.card { -webkit-appearance: none; appearance: none; border: 0; font: inherit; text-align: inherit; color: inherit; }
.card.w-openable { cursor: pointer; }
/* Squircle corner tier = continuous curvature (iOS superellipse), not a circular arc with
   dead-straight sides. corner-shape needs a non-zero border-radius (already set) and falls
   back to normal rounding on browsers without support (Chrome 139+). */
[data-corner="squircle"] .card { corner-shape: squircle; }
.vibe-card.is-squircle, .tmini-card.is-squircle, .preset-btn.is-squircle { corner-shape: squircle; }
/* Fill styles are set per-widget (.w[data-i][data-fill]) so a widget can override the theme.
   The section header in inline mode is not a widget and carries no data-i, so it is named
   explicitly rather than by loosening the widget selector: dropping an attribute from fourteen
   rules changes their specificity, and a paint rule that starts losing to a rule it used to beat
   is a fault nobody can see coming. */
/* GLASS — nxtwk "liquid glass": multi-layer inset bevel + soft drop + radial sheen */
.w[data-i][data-fill="glass"] .card, .w.sec-headw[data-fill="glass"] .card {
  background: var(--card-bg); outline: var(--border-w, 1px) solid var(--card-border); outline-offset: 0;
  backdrop-filter: blur(22px) saturate(140%); -webkit-backdrop-filter: blur(22px) saturate(140%);
  box-shadow:
    inset 0 1px 0 0 rgba(255,255,255,0.25),
    inset 0 -1px 0 0 rgba(0,0,0,0.30),
    inset 1px 0 0 0 rgba(255,255,255,0.04),
    inset -1px 0 0 0 rgba(0,0,0,0.10),
    var(--card-drop, 0 20px 50px -20px rgba(0,0,0,0.55)),
    var(--card-glow, 0 0 transparent);
}
.w[data-i][data-fill="glass"] .card::before, .w.sec-headw[data-fill="glass"] .card::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(140% 100% at 0% 0%, rgba(255,255,255,0.08), transparent 45%); }
.w[data-i][data-fill="solid"] .card, .w.sec-headw[data-fill="solid"] .card { background: var(--card-bg); outline: var(--border-w, 1px) solid var(--card-border); outline-offset: 0; box-shadow: var(--card-drop, 0 16px 40px -30px rgba(0,0,0,0.4)), var(--card-glow, 0 0 transparent); }
.w[data-i][data-fill="gradient"] .card, .w.sec-headw[data-fill="gradient"] .card {
  --ink: #fff; --ink-dim: rgba(255,255,255,0.82); --ink-faint: rgba(255,255,255,0.62); --hair: rgba(255,255,255,0.28);
  color: #fff;
  background: var(--card-grad, linear-gradient(150deg, hsl(var(--w-hue, 18) 88% 60%), hsl(calc(var(--w-hue, 18) + 34) 82% 46%)));
  border: 1px solid rgba(255,255,255,0.16);
  box-shadow: var(--card-drop, 0 26px 54px -24px hsl(var(--w-hue, 18) 80% 40% / .55)), var(--card-glow, 0 0 transparent);
}
.w[data-i][data-fill="gradient"] .card::before, .w.sec-headw[data-fill="gradient"] .card::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(120% 100% at 0 0, rgba(255,255,255,0.24), transparent 45%); }
.w[data-i][data-fill="gradient"] .wg-header .btn-cta { background: rgba(255,255,255,0.92); color: #111; }
.w[data-i][data-fill="outline"] .card, .w.sec-headw[data-fill="outline"] .card { background: var(--card-bg); outline: var(--border-w, 2px) solid var(--card-border); outline-offset: 0; box-shadow: var(--card-drop, none), var(--card-glow, 0 0 transparent); }
/* bold = filled block, no border, heavy drop shadow (punchy/elevated) */
.w[data-i][data-fill="bold"] .card, .w.sec-headw[data-fill="bold"] .card { background: var(--card-bg); border: var(--border-w, 0) solid var(--card-border); box-shadow: var(--card-drop, 0 24px 50px -22px rgba(0,0,0,0.6)), var(--card-glow, 0 0 transparent); }
.w[data-i][data-fill="plain"] .card, .w.sec-headw[data-fill="plain"] .card { background: var(--card-bg); border: 0; box-shadow: none; border-radius: 0; padding: clamp(6px,1.2cqw,12px) clamp(2px,1cqw,8px) clamp(16px,2cqw,22px); border-bottom: 1px solid var(--card-border); }
/* gradglow — translucent glass surface with a coloured radial glow inside (refs #166/#168) */
.w[data-i][data-fill="gradglow"] .card, .w.sec-headw[data-fill="gradglow"] .card { background: var(--card-bg); outline: var(--border-w, 1px) solid var(--card-border); outline-offset: 0; backdrop-filter: blur(20px) saturate(150%); -webkit-backdrop-filter: blur(20px) saturate(150%); box-shadow: inset 0 1px 0 0 rgba(255,255,255,0.18), var(--card-drop, 0 22px 54px -24px rgba(0,0,0,0.55)), var(--card-glow, 0 0 transparent); overflow: hidden; }
.w[data-i][data-fill="gradglow"] .card::before, .w.sec-headw[data-fill="gradglow"] .card::before { content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 0; background: radial-gradient(120% 120% at 18% 0%, color-mix(in srgb, var(--accent) 34%, transparent), transparent 58%), radial-gradient(120% 120% at 100% 100%, color-mix(in srgb, var(--accent) 20%, transparent), transparent 60%); }
.w[data-i][data-fill="gradglow"] .card > *:not(.wim):not(.ti-bg):not(.ti-scrim):not(.w-expand):not(.w-tools):not(.w-hidebadge):not(.lk-ext) { position: relative; z-index: 1; }
.w[data-i][data-fill="gradglow"] .wg-image > .wim, .w[data-i][data-fill="gradglow"] .wg-gallery .wim, .w[data-i][data-fill="gradglow"] .wg-hero .ti-bg, .w[data-i][data-fill="gradglow"] .wg-hero .ti-scrim { z-index: 1; } /* keep absolute-fill backgrounds (image widget + hero poster) — glow must not collapse them */
/* duotone — a hard two-tone split block (--card-grad carries the split) */
.w[data-i][data-fill="duotone"] .card, .w.sec-headw[data-fill="duotone"] .card { background: var(--card-grad, linear-gradient(180deg, var(--card-bg) 52%, var(--accent) 52%)); border: 0; box-shadow: var(--card-drop, 0 20px 46px -24px rgba(0,0,0,0.5)), var(--card-glow, 0 0 transparent); }
/* bare — no card at all, just the content (cardless header / section label) */
.w[data-i][data-fill="bare"] .card, .w.sec-headw[data-fill="bare"] .card { background: none !important; outline: 0 !important; border: 0 !important; box-shadow: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; padding: clamp(4px,1cqw,10px) clamp(2px,0.8cqw,6px); }
.wm-card[data-fill="gradglow"] { outline: var(--border-w, 1px) solid var(--card-border); backdrop-filter: blur(24px) saturate(150%); -webkit-backdrop-filter: blur(24px) saturate(150%); box-shadow: var(--card-drop, 0 24px 60px -24px rgba(0,0,0,0.6)), var(--card-glow, 0 0 transparent); }
.wm-card[data-fill="duotone"] { background: var(--card-grad, var(--card-bg)); }
/* multi = each card a different colour from the theme palette; ink derives per card */
.w[data-i][data-fill="multi"] .card, .w.sec-headw[data-fill="multi"] .card {
  background: var(--w-card, #1c1c22);
  border: var(--border-w, 0) solid var(--card-border, transparent); /* honors the Border tab */
  --ink: var(--w-cardink, #fff); --ink-dim: var(--w-carddim, rgba(255,255,255,0.7)); --ink-faint: var(--w-cardfaint, rgba(255,255,255,0.45));
  --hair: var(--w-cardhair, rgba(255,255,255,0.18));
  color: var(--w-cardink, #fff);
  box-shadow: var(--card-drop, 0 22px 50px -26px rgba(0,0,0,0.5)), var(--card-glow, 0 0 transparent);
}
.w[data-i][data-fill="multi"] .wg-header p, .w[data-i][data-fill="multi"] .wg-dsc, .w[data-i][data-fill="multi"] .lk-desc { color: var(--w-carddim, rgba(255,255,255,0.7)); }
.w[data-i][data-fill="multi"] .ic, .w[data-i][data-fill="multi"] .wg-ico { background: var(--w-cardhair, rgba(255,255,255,0.16)); border-color: var(--w-cardhair, rgba(255,255,255,0.22)); color: var(--w-cardink); }
/* accent-driven bits (hours time, link arrow) read as the card ink on a coloured card */
.w[data-i][data-fill="multi"] .hr-time, .w[data-i][data-fill="multi"] .hr-s-time, .w[data-i][data-fill="multi"] .lk-go { color: var(--w-cardink, #fff); opacity: .9; }
/* IMAGE — an uploaded image as the card background, with a darken scrim for legibility */
.w[data-i][data-fill="image"] .card, .w.sec-headw[data-fill="image"] .card {
  background-image: var(--card-img); background-size: cover; background-position: center;
  --ink: #fff; --ink-dim: rgba(255,255,255,0.84); --ink-faint: rgba(255,255,255,0.62); --hair: rgba(255,255,255,0.22); --card-border: rgba(255,255,255,0.22);
  color: #fff; outline: var(--border-w, 0) solid var(--card-border); outline-offset: 0;
  box-shadow: var(--card-drop, 0 22px 50px -26px rgba(0,0,0,0.5)), var(--card-glow, 0 0 transparent);
}
.w[data-i][data-fill="image"] .card::after { content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none; background: linear-gradient(180deg, rgba(0,0,0,calc(var(--card-scrim, 0.4) * 0.45)), rgba(0,0,0,var(--card-scrim, 0.4))); }
/* lift TEXT/content above the scrim — but never clobber absolutely-positioned helpers
   (.wim = the widget's own picture, the expand +, the editor tools/badge) */
.w[data-i][data-fill="image"] .card > *:not(.wim):not(.ti-bg):not(.ti-scrim):not(.w-expand):not(.w-tools):not(.w-hidebadge):not(.lk-ext) { position: relative; z-index: 1; }
.w[data-i][data-fill="image"] .wg-hero .ti-bg, .w[data-i][data-fill="image"] .wg-hero .ti-scrim { z-index: 1; }
/* ── the expand modal wears the OPENING widget's fill style (matches the card it came from) ── */
.wm-card[data-fill="glass"] { outline: var(--border-w, 1px) solid var(--card-border); backdrop-filter: blur(26px) saturate(140%); -webkit-backdrop-filter: blur(26px) saturate(140%); box-shadow: inset 0 1px 0 0 rgba(255,255,255,0.22), inset 0 -1px 0 0 rgba(0,0,0,0.3), var(--card-drop, 0 24px 60px -24px rgba(0,0,0,0.6)), var(--card-glow, 0 0 transparent); }
.wm-card[data-fill="solid"] { outline: var(--border-w, 1px) solid var(--card-border); box-shadow: var(--card-drop, 0 24px 60px -30px rgba(0,0,0,0.5)), var(--card-glow, 0 0 transparent); }
.wm-card[data-fill="bold"] { box-shadow: var(--card-drop, 0 24px 60px -22px rgba(0,0,0,0.6)), var(--card-glow, 0 0 transparent); }
.wm-card[data-fill="outline"] { background: var(--wm-solid); outline: var(--border-w, 2px) solid var(--card-border); }
.wm-card[data-fill="gradient"] { color: #fff; background: var(--card-grad, linear-gradient(150deg, hsl(var(--w-hue, 18) 88% 60%), hsl(calc(var(--w-hue, 18) + 34) 82% 46%))); }
.wm-card[data-fill="image"] { color: #fff; background-image: var(--card-img); background-size: cover; background-position: center; }
.wm-card[data-fill="image"]::after { content: ""; position: absolute; inset: 0; z-index: 0; border-radius: inherit; pointer-events: none; background: linear-gradient(180deg, rgba(0,0,0,calc(var(--card-scrim, 0.4) * 0.5)), rgba(0,0,0,var(--card-scrim, 0.4))); }
.wm-card[data-fill="image"] > * { position: relative; z-index: 1; }
/* a Link block whose card fill is an image → clean featured-link look: label bottom, badge corner, no extra thumbnail */
.w[data-i][data-fill="image"] .wg-link { flex-direction: column; align-items: flex-start; justify-content: flex-end; min-height: 130px; }
.w[data-i][data-fill="image"] .wg-link .lk-ic { background: rgba(0,0,0,0.42); color: #fff; backdrop-filter: blur(4px); border: 1px solid rgba(255,255,255,0.18); }
.w[data-i][data-fill="image"] .wg-link .lk-ic svg { color: #fff; }
/* media widgets render their OWN picture full-bleed — it sits above the theme card-image + scrim */
.w[data-i][data-fill="image"] .wg-image > .wim, .w[data-i][data-fill="image"] .wg-gallery .wim { z-index: 1; }
.w[data-i][data-fill="image"] .wg-image::after { display: none; }
/* ── button styles (per-preset, set via data-btnstyle) ── */
[data-btnstyle="soft"] .btn-cta, [data-btnstyle="soft"] .wg-btn { background: color-mix(in srgb, var(--btn-bg) 18%, transparent) !important; color: var(--btn-bg) !important; }
[data-btnstyle="outline"] .btn-cta, [data-btnstyle="outline"] .wg-btn { background: transparent !important; border: 1.5px solid var(--btn-bg); color: var(--btn-bg) !important; }
[data-btnstyle="arrow"] .btn-cta { border-radius: 999px; padding: 8px 8px 8px 22px; gap: 12px; }
[data-btnstyle="arrow"] .btn-cta::after { content: "→"; display: inline-grid; place-items: center; width: 30px; height: 30px; flex: 0 0 auto; border-radius: 50%; background: var(--btn-text, #fff); color: var(--btn-bg, #111); font-size: 16px; font-weight: 700; line-height: 1; }
[data-btnstyle="arrow"] .wg-btn { position: relative; border-radius: 999px; padding-right: 46px; }
[data-btnstyle="arrow"] .wg-btn::after { content: "→"; position: absolute; right: 7px; top: 50%; transform: translateY(-50%); width: 30px; height: 30px; display: grid; place-items: center; border-radius: 50%; background: var(--btn-text, #111); color: var(--btn-bg, #fff); font-size: 16px; font-weight: 700; line-height: 1; }
/* soft / outline button styles apply to the Buttons widget too */
[data-btnstyle="soft"] .wg-btn { background: color-mix(in srgb, var(--btn-bg) 18%, transparent) !important; color: var(--btn-bg) !important; }
[data-btnstyle="outline"] .wg-btn { background: transparent !important; border: 1.5px solid var(--btn-bg); color: var(--btn-bg) !important; }
/* ── shared content elements themes can use ── */
.badge-pill { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; letter-spacing: .02em; padding: 4px 10px; border-radius: 999px; background: color-mix(in srgb, var(--accent) 16%, transparent); color: var(--accent); white-space: nowrap; }
.badge-pill svg { width: 13px; height: 13px; }
.circ-btn { width: 46px; height: 46px; flex: 0 0 auto; border-radius: 50%; display: grid; place-items: center; background: var(--accent); color: var(--on-accent); border: 0; cursor: pointer; text-decoration: none; transition: transform .14s, filter .14s; }
.circ-btn:hover { transform: translateY(-2px); filter: brightness(1.05); }
.circ-btn svg { width: 20px; height: 20px; }
.circ-row { display: flex; gap: 10px; flex-wrap: wrap; }
/* inner group: image + gradient fills, optional glow */
[data-infill="image"] .wg-inner { background-image: var(--in-img); background-size: cover; background-position: center; }
.wg-inner { box-shadow: var(--in-glow, none); }
/* icon chip style */
[data-icons="solid"] .wg-link .ic { background: var(--icon-color, var(--accent)); border-color: transparent; color: #fff; }
[data-icons="line"] .wg-link .ic svg { color: var(--icon-color, var(--ink)); }
.w[data-i][data-fill="gradient"] .wg-link .ic { background: rgba(255,255,255,0.22); border-color: rgba(255,255,255,0.3); color: #fff; }
/* ------------------------- widget: header ------------------------- */
.wg-header { display: flex; flex-direction: column; justify-content: center; gap: 10px; }
.wg-header h1 { overflow-wrap: anywhere; margin: 0; font-family: var(--h1-font, var(--font)); font-size: calc(clamp(28px, 5cqw, 48px) * var(--h1-scale, 1)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); text-shadow: var(--h1-glow, none); letter-spacing: -0.03em; line-height: 1.05; }
.wg-header p { margin: 0; font-family: var(--h2-font, var(--font)); color: var(--h2-color, var(--ink-dim)); font-size: calc(clamp(15px, 2cqw, 19px) * var(--h2-scale, 1)); font-weight: var(--h2-weight, 600); font-style: var(--h2-style, normal); text-shadow: var(--h2-glow, none); max-width: 34ch; }
[data-display="huge"] .wg-header h1 { font-size: calc(clamp(34px, 8cqw, 66px) * var(--h1-scale, 1)); letter-spacing: -0.045em; text-transform: uppercase; line-height: .92; }
[data-display="serif"] .wg-header h1 { letter-spacing: -0.012em; font-size: calc(clamp(32px, 6.5cqw, 58px) * var(--h1-scale, 1)); }
.wg-header .btn-cta {
  align-self: flex-start; margin-top: 8px;
  background: var(--btn-bg, #fff); color: var(--btn-text, #111);
  text-decoration: none; font-family: var(--btn-font, var(--lb-font, var(--font))); font-weight: var(--btn-weight, 650); font-size: calc(15px * var(--btn-size, 1));
  padding: 12px 20px; border-radius: var(--btn-radius, calc(var(--radius) * 0.55 + 6px));
  transition: transform .18s var(--ease, ease), filter .18s, box-shadow .18s; will-change: transform;
}
/* button hover animations (set per theme via data-bthover on .wrap) */
[data-bthover="lift"] .wg-header .btn-cta:hover { transform: translateY(-2px); box-shadow: 0 10px 22px -10px rgba(0,0,0,.5); }
[data-bthover="grow"] .wg-header .btn-cta:hover { transform: scale(1.05); }
[data-bthover="fade"] .wg-header .btn-cta:hover { filter: brightness(.9); }
[data-fill="gradient"] .wg-header .btn-cta { background: rgba(255,255,255,0.92); color: #111; }
/* header with an image — reuses the text+image layout (.wg-textimage), styled as a hero */
.wg-hero .ti-text { gap: 11px; }
.wg-hero .ti-text > .wg-social, .wg-hero .ti-overtext > .wg-social { margin-top: 6px; }
.wg-hero .ti-text > h1 { margin: 0; font-family: var(--h1-font, var(--font)); font-size: calc(clamp(26px, 4.6cqw, 44px) * var(--h1-scale, 1)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); text-shadow: var(--h1-glow, none); letter-spacing: -0.03em; line-height: 1.05; }
[data-display="huge"] .wg-hero .ti-text > h1 { font-size: calc(clamp(30px, 6.5cqw, 56px) * var(--h1-scale, 1)); letter-spacing: -0.045em; text-transform: uppercase; line-height: .94; }
[data-display="serif"] .wg-hero .ti-text > h1 { letter-spacing: -0.012em; }
.wg-hero .ti-text > p, .wg-hero .ti-overtext > p { margin: 0; font-family: var(--h2-font, var(--font)); color: var(--h2-color, var(--ink-dim)); font-size: calc(clamp(14px, 1.9cqw, 17px) * var(--h2-scale, 1)); font-weight: var(--h2-weight, 600); font-style: var(--h2-style, normal); max-width: 40ch; }
.wg-hero .ti-overtext { display: flex; flex-direction: column; gap: 11px; align-items: flex-start; }
.wg-hero.ti-over .ti-overtext > p { color: rgba(255,255,255,0.9); }
.wg-hero .ti-overtext > h1 { margin: 0; font-family: var(--h1-font, var(--font)); font-size: calc(clamp(26px, 5cqw, 46px) * var(--h1-scale, 1)); font-weight: var(--h1-weight, 700); color: #fff; letter-spacing: -0.03em; line-height: 1.05; }
[data-display="huge"] .wg-hero .ti-overtext > h1 { letter-spacing: -0.045em; text-transform: uppercase; line-height: .94; }
.wg-hero.ti-over .ti-bg { position: absolute; inset: 0; background-size: cover; background-position: center; }
/* stacked hero (image on top / below) — a banner sized to the card's height tier (never a deep
   tall crop that cuts faces, never taller than the block). Text fills + centres in the rest. */
.wg-hero.ti-below:not(.sz-l) .ti-img, .wg-hero.ti-above:not(.sz-l) .ti-img { flex: 0 0 auto; min-height: 0; aspect-ratio: auto; }
.wg-hero.h-s.ti-below:not(.sz-l) .ti-img, .wg-hero.h-s.ti-above:not(.sz-l) .ti-img { height: 78px; }
.wg-hero.h-m.ti-below:not(.sz-l) .ti-img, .wg-hero.h-m.ti-above:not(.sz-l) .ti-img { height: 146px; }
.wg-hero.h-l.ti-below:not(.sz-l) .ti-img, .wg-hero.h-l.ti-above:not(.sz-l) .ti-img { height: 224px; }
.wg-hero:not(.sz-l):not(.ti-over) .ti-text { flex: 1 1 auto; justify-content: center; }
.wg-hero.ti-over .wg-ov { color: rgba(255,255,255,0.82); }
.wg-hero.ti-over .ws-tx { color: rgba(255,255,255,0.9); }
.wg-hero.ti-over .ws-tx b { color: #fff; }
.wg-hero .btn-cta {
  align-self: flex-start; margin-top: 11px;
  background: var(--btn-bg, #fff); color: var(--btn-text, #111);
  text-decoration: none; font-family: var(--btn-font, var(--lb-font, var(--font))); font-weight: var(--btn-weight, 650); font-size: calc(15px * var(--btn-size, 1));
  padding: 12px 20px; border-radius: var(--btn-radius, calc(var(--radius) * 0.55 + 6px));
  transition: transform .18s var(--ease, ease), filter .18s, box-shadow .18s;
}
[data-bthover="lift"] .wg-hero .btn-cta:hover { transform: translateY(-2px); box-shadow: 0 10px 22px -10px rgba(0,0,0,.5); }
[data-bthover="grow"] .wg-hero .btn-cta:hover { transform: scale(1.05); }
[data-bthover="fade"] .wg-hero .btn-cta:hover { filter: brightness(.9); }
/* ---- header sizing: read well at every block size ---- */
.wg-hero { overflow: hidden; }
/* large (wide) — side by side, big title */
.wg-hero.sz-l .ti-text > h1 { font-size: calc(clamp(28px, 4.4cqw, 46px) * var(--h1-scale, 1)); }
/* medium — stacked banner + text, moderate title */
.wg-hero.sz-m .ti-text > h1, .wg-hero.sz-m .ti-overtext > h1 { font-size: calc(clamp(21px, 3cqw, 30px) * var(--h1-scale, 1)); }
.wg-hero.sz-m .ti-text > p, .wg-hero.sz-m .ti-overtext > p { font-size: calc(clamp(13.5px, 1.6cqw, 16px) * var(--h2-scale, 1)); }
/* small — compact poster: smaller title, tighter padding, smaller button + social */
.wg-hero.sz-s .ti-overtext > h1 { font-size: calc(clamp(18px, 2.4cqw, 24px) * var(--h1-scale, 1)); line-height: 1.08; }
.wg-hero.sz-s .ti-overtext { padding: 14px; gap: 7px; }
.wg-hero.sz-s .btn-cta, .wg-hero.sz-m.h-s .btn-cta { padding: 9px 14px; font-size: calc(13px * var(--btn-size, 1)); margin-top: 6px; }
.wg-hero.sz-s .ti-text > .wg-social, .wg-hero.sz-s .ti-overtext > .wg-social { margin-top: 3px; }
.wg-hero.sz-s .ws-star { width: 13px; height: 13px; }
.wg-hero.sz-s .ws-tx { font-size: 12px; }
.wg-hero.sz-s .ws-av { width: 24px; height: 24px; margin-left: -8px; }
/* no-image header: sane title size for a small block (fit shrinks further if needed) */
.wg-header.sz-s h1 { font-size: calc(clamp(20px, 2.6cqw, 28px) * var(--h1-scale, 1)); }
/* narrow canvas (mobile) — the wide side-by-side hero stacks (image on top, text below) so it never cramps */
@container (max-width: 560px) {
  .wg-hero.sz-l:not(.ti-over) { flex-direction: column !important; align-items: stretch; gap: 14px; }
  .wg-hero.sz-l:not(.ti-over) .ti-img { width: 100% !important; flex: 0 0 auto !important; height: 200px; min-height: 0; }
  .wg-hero.sz-l:not(.ti-over) .ti-text { flex: 1 1 auto; width: 100%; min-width: 0; }
  .wg-hero.sz-l .ti-text > h1 { font-size: calc(clamp(26px, 8cqw, 38px) * var(--h1-scale, 1)); }
}
/* ------------------------------- header -------------------------------------
   ONE ARRANGEMENT, PARTS THAT APPEAR WHEN THEY HAVE SOMETHING TO SHOW. A background photo, a text
   block and a side photo: fill in a background and the text sits on it, fill in an image and it
   takes the other side, fill in both and you get both, fill in neither and the card is the preset's
   own colour. There is no second drawing to keep in step with the first.

   Both photos ANCHOR TO THE CARD AND SIZE FROM THE CARD — the background and the bled side photo
   are the only absolutely positioned things here, and both position against `.card`.

   No colour, radius or button shape is set here: surface, ink, accent and button radius are the
   preset's. The one exception is the legibility wash under text that sits ON the background photo,
   which exists so a title stays readable over whatever photo a business has — not a theme decision.
   The theme's own grade and overlay ride above it on ::after. */
.hd { position: relative; display: flex; flex-direction: row; align-items: stretch; justify-content: flex-start; gap: clamp(14px, 2cqw, 26px); }
.hd .hd-tx > h1, .hd .hd-tx > p { overflow-wrap: anywhere; }
.hd .hd-tx { position: relative; z-index: 1; flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; gap: 11px; }
.hd .hd-photo { background-size: cover; background-position: center; }
/* WHICH SIDE THE TEXT TAKES — the theme's call. `justify-content` is reset because `.wg-header`
   centres its column, and in a row that centres horizontally: with a bled side photo (absolute, out
   of the flow) the text would be the only item on the line and would centre into the photo's half. */
.hd.hd-al-right { flex-direction: row-reverse; }
.hd.hd-al-right .hd-tx { align-items: flex-end; text-align: right; }
.hd.hd-al-center .hd-tx { align-items: center; text-align: center; }
.hd.hd-al-center:not(.hd-hasside) .hd-tx { margin: 0 auto; }
.hd:not(.hd-hasside) .hd-tx { max-width: 44ch; }
.hd.hd-al-center:not(.hd-hasside) .hd-tx { max-width: 52ch; }

/* THE BACKGROUND PHOTO — the card itself. The card's own overflow clips it to the corner radius. */
/* `inset: 0` stops at the border box, so a card with a border shows a ring of its own surface
   around the photo — the lilac corner under a gradient card. The photo covers the border too. */
.w[data-i] .hd .hd-photo.hd-bg { position: absolute; inset: calc(-1 * var(--border-w, 0px)); z-index: 0;
  /* corner-shape must be inherited alongside the radius: a squircle theme sets it on `.card` only,
     so a photo with the SAME radius but a plain round corner cuts more than the card does and lets
     the card's own fill leak past it — a sliver of accent in the corner of the photo. Same fault the
     image+text photo layer carries a note about further down this file. */
  border-radius: inherit; corner-shape: inherit; }
.hd.hd-hasbg .hd-bg::before { content: ""; position: absolute; inset: 0; z-index: 1; border-radius: inherit; pointer-events: none; background: linear-gradient(to right, rgba(0,0,0,.62), rgba(0,0,0,.28) 62%, rgba(0,0,0,.08)); }
.w[data-base="light"] .hd.hd-hasbg .hd-bg::before { background: linear-gradient(to right, rgba(255,255,255,.78), rgba(255,255,255,.44) 62%, rgba(255,255,255,.12)); }
.hd.hd-al-right.hd-hasbg .hd-bg::before { background: linear-gradient(to left, rgba(0,0,0,.62), rgba(0,0,0,.28) 62%, rgba(0,0,0,.08)); }
.w[data-base="light"] .hd.hd-al-right.hd-hasbg .hd-bg::before { background: linear-gradient(to left, rgba(255,255,255,.78), rgba(255,255,255,.44) 62%, rgba(255,255,255,.12)); }
.hd.hd-al-center.hd-hasbg .hd-bg::before { background: linear-gradient(to top, rgba(0,0,0,.62), rgba(0,0,0,.34) 60%, rgba(0,0,0,.18)); }
.w[data-base="light"] .hd.hd-al-center.hd-hasbg .hd-bg::before { background: linear-gradient(to top, rgba(255,255,255,.80), rgba(255,255,255,.50) 60%, rgba(255,255,255,.24)); }
/* a cardless (bare) preset drops the card's padding — with a photo behind it there IS a surface, so
   the text needs the inset back or it sits on the card's very edge */
.w[data-i][data-fill="bare"] .hd.hd-hasbg { padding: clamp(18px, 2.4cqw, 26px); }

/* THE SIDE PHOTO — inset as a block inside the card, or bled to the card's edge. The theme picks. */
.hd-hasside .hd-tx { flex: 1 1 52%; }
.w[data-i] .hd .hd-side.hd-inset { position: relative; flex: 0 0 46%; align-self: stretch; border-radius: calc(var(--radius) * 0.66); }
/* BLED: a half that runs to the card's three edges. It stays IN THE FLOW and the card's padding
   moves onto the text instead — as an absolutely-positioned layer it was out of the flow, so the
   text's share was a percentage of the CONTENT box while the photo's was a percentage of the
   PADDING box, and the two disagreed by exactly the padding: the text ran 21px under the photo.
   In the flow the two halves are measured by the same box and cannot overlap.
   No radius: the card's own overflow clips it to the corners. */
.w[data-i] .hd .hd-side.hd-fill { position: relative; flex: 0 0 48%; align-self: stretch; }
.w[data-i] .hd:has(> .hd-side.hd-fill) { padding: 0; gap: 0; }  /* outranks the bare preset's own padding */
.w[data-i] .hd:has(> .hd-side.hd-fill) .hd-tx { padding: clamp(18px, 2.4cqw, 26px); }

/* COMPACT SHAPES — the same drawing with the parts that cannot fit dropped, never a clipped one.
   (The rest of that ladder is fitOneHeader, which drops parts once the title hits its floor.) */
.hd.h-xs .hd-tx > p, .hd.sz-s.h-s .hd-tx > p { display: none; }
.hd.h-xs .wg-social, .hd.sz-s .wg-social { display: none; }
.hd.h-xs .hd-tx { gap: 6px; }
.hd.h-xs { padding: clamp(9px, 1.2cqw, 14px); }
.hd.sz-s.hd-hasside { flex-direction: column; }
.hd.sz-s .hd-tx, .hd.sz-s.hd-hasside .hd-tx { max-width: 100%; }
.w[data-i] .hd.sz-s .hd-side.hd-inset { flex: 0 0 40%; }
.w[data-i] .hd.sz-s .hd-side.hd-fill { flex: 0 0 40%; width: 100%; }
.hd.h-xs .hd-side { display: none; }

/* HEIGHT — half the screen or all of it, `dvh` so a phone's URL bar cannot make "full" overflow.
   Applied where the header owns its row: the bento's auto-sized first row, and the mobile stack,
   which has no fixed track at all. */
#grid.bento.hd-row1 { grid-template-rows: auto; } /* row 1 sizes to the header; the rest stay on --bcell */
#grid.bento .w > .card.hd-h-half { min-height: 50dvh; }
#grid.bento .w > .card.hd-h-full { min-height: 100dvh; }
#grid.m-stack .w > .card.hd-h-half { min-height: 50dvh; }
#grid.m-stack .w > .card.hd-h-full { min-height: 92dvh; } /* a hair under, so the next card peeks and the page reads as scrollable */
/* the menu floats ON a big header — the card runs up behind it instead of losing that band to
   background. `--snav-h` is the bar's measured height, set in renderNav. LIVE AND PREVIEW ONLY:
   in the editor the header starts below the menu, where its top edge and tools can be reached. */
.wrap.nav-over #site-nav { margin-bottom: calc(-1 * var(--snav-h, 0px)); z-index: 40; }
.wrap.nav-over #grid { position: relative; z-index: 1; }

/* narrow canvas (phones, the mobile stack, a narrow preview) — the side photo goes under the text */
@container (max-width: 560px) {
  .hd.hd-hasside { flex-direction: column !important; }
  .hd.hd-hasside .hd-tx, .hd .hd-tx { max-width: 100%; }
  /* A PERCENTAGE BASIS NEEDS A DEFINITE HEIGHT TO RESOLVE AGAINST. In a grid slot the card has one
     and `flex: 0 0 46%` is a photo half; in the mobile stack the card is sized by its own content,
     so the same percentage resolves against nothing and the photo collapses to zero height — a
     header that silently loses its photo on phones. An aspect ratio takes its height from the
     width, which is definite in both places. */
  .w[data-i] .hd .hd-side.hd-inset { flex: 0 0 auto; width: 100%; aspect-ratio: 16 / 10; }
  .w[data-i] .hd .hd-side.hd-fill { flex: 0 0 auto; width: 100%; aspect-ratio: 16 / 10; }
  /* the text spans the whole width here, so the wash runs up the card rather than across it — a
     left-to-right one fades out exactly where the last words sit */
  .hd.hd-hasbg .hd-bg::before,
  .hd.hd-al-right.hd-hasbg .hd-bg::before { background: linear-gradient(to top, rgba(0,0,0,.68), rgba(0,0,0,.30) 58%, rgba(0,0,0,.06)); }
  .w[data-base="light"] .hd.hd-hasbg .hd-bg::before,
  .w[data-base="light"] .hd.hd-al-right.hd-hasbg .hd-bg::before { background: linear-gradient(to top, rgba(255,255,255,.82), rgba(255,255,255,.46) 58%, rgba(255,255,255,.10)); }
}
/* social-proof line (header) — star rating OR stacked avatars + a count/label */
.wg-social { display: inline-flex; align-items: center; gap: 9px; margin: 2px 0; flex-wrap: wrap; }
.ws-stars { display: inline-flex; gap: 2px; }
.ws-star { width: 15px; height: 15px; display: inline-grid; place-items: center; color: color-mix(in srgb, var(--ink) 26%, transparent); }
.ws-star.on { color: #f5a623; }
.ws-star svg { width: 100%; height: 100%; }
.ws-avs { display: inline-flex; padding-left: 2px; }
.ws-av { width: 32px; height: 32px; border-radius: 50%; background-size: cover; background-position: center; box-shadow: 0 0 0 2.5px var(--card-bg, #fff), 0 2px 5px -1px rgba(0,0,0,.28); margin-left: -11px; }
.ws-avs .ws-av:first-child { margin-left: 0; }
.wg-hero.ti-over .ws-av { box-shadow: 0 0 0 2.5px rgba(0,0,0,.35), 0 2px 5px -1px rgba(0,0,0,.4); }
.ws-tx { font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ink-dim); font-weight: 600; }
.ws-tx b { color: var(--ink); font-weight: 750; }
/* ============================ THE STATEMENT TILES ============================
   One vocabulary shared by the widgets on /widgets: a giant number or headline, a small accent
   eyebrow, a muted subline, and either a circular arrow or a pill button in a fixed corner.

   THE DESIGN DOES NOT CHANGE WITH THE SIZE — ONLY THE SCALE. Everything inside is sized in `em`
   off one unit, and the unit is the only thing the size classes touch, so a corner icon stays in
   its corner and centred text stays centred at every shape the grid can make. (`cqw` would not do
   it: the container here is the page, not the card, so every card would get the same number.)

   NOTHING PRESET-OWNED IS PAINTED HERE. The surface is the card's, the ink is `--ink`, the eyebrow
   and the arrow are the preset's accent and button colours, and the pill is `.btn-cta` so it wears
   the theme's own button shape. */
/* a tile that IS a link must not wear the page's link styling — the card is the button, and an
   underline through a phone number reads as a mistake */
a.card.wd, a.card.wd:hover, a.card.wd * { text-decoration: none; }
.wd { --wd-w: 15px; --wd-h: 1; font-size: calc(var(--wd-w) * var(--wd-h));
  position: relative; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
.wd.sz-s { --wd-w: 11px; } .wd.sz-m { --wd-w: 15px; } .wd.sz-l { --wd-w: 19px; }
.wd.h-xs { --wd-h: .58; } .wd.h-s { --wd-h: .78; } .wd.h-m { --wd-h: 1; } .wd.h-l { --wd-h: 1.12; } .wd.h-xl { --wd-h: 1.28; }
/* where the block sits in the card — the three arrangements the sheet uses */
.wd-end { justify-content: flex-end; }
.wd-mid { justify-content: center; }
.wd-split { justify-content: space-between; }

.wd-eyebrow { font-family: var(--lb-font, var(--font)); font-size: 1.15em; font-weight: 700; color: var(--accent); line-height: 1.2; }
.wd-num { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 900); font-size: 7.4em; line-height: .85; letter-spacing: -0.04em; color: var(--h1-color, var(--ink)); }
.wd-num small { font-size: .34em; color: var(--accent); font-weight: inherit; letter-spacing: 0; }
.wd-num .wd-stop { color: var(--accent); font-size: .42em; letter-spacing: 0; vertical-align: baseline; }
.wd-hero { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 900); font-size: 3.1em; line-height: 1.02; letter-spacing: -0.02em; color: var(--h1-color, var(--ink)); overflow-wrap: anywhere; }
.wd-ask { font-size: 2.5em; line-height: 1.1; }
/* An INSTRUCTION, not a statement. "Call us now" reads as one phrase, so it keeps the display size
   and gets room to breathe under the icon; what was breaking it into a stack of single words was
   `wdLines` forcing a break at every space, not the size. `balance` is the safety net for the
   narrowest tiles, where three words genuinely cannot share a line. */
.wd-say { margin-top: .5em; overflow-wrap: normal; text-wrap: balance; }
.wd.h-xs .wd-say, .wd.h-s .wd-say { margin-top: .28em; }
.wd-sub { font-family: var(--ds-font, var(--font)); font-size: 1.4em; font-weight: 700; color: var(--ink-dim); line-height: 1.25; }
.wd-gap { height: .5em; flex: 0 0 auto; }
/* the circular arrow — the preset's button, kept in one corner at every size */
.wd-arrow { width: 3.6em; height: 3.6em; border-radius: 50%; display: grid; place-items: center; flex: 0 0 auto;
  background: var(--btn-bg); color: var(--btn-text); }
.wd-arrow svg { width: 1.4em; height: 1.4em; stroke: currentColor; }
.wd-tr { position: absolute; top: 2.1em; right: 2.1em; }
.wd-br { position: absolute; bottom: 2.1em; right: 2.1em; }
.wd-selfend { align-self: flex-end; }
.wd-pill { align-self: flex-end; display: inline-flex; align-items: center; gap: .55em; font-size: 1.05em; }
.wd-pill svg { width: 1em; height: 1em; stroke: currentColor; }
.wd-name { font-family: var(--h1-font, var(--font)); font-weight: 800; font-size: 1.85em; line-height: 1.1; color: var(--h1-color, var(--ink)); letter-spacing: -0.01em; }
.wd-num.wd-accent { color: var(--accent); font-size: 4.2em; line-height: 1; }
.wd-mark { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 900); font-size: 10em; line-height: .78; color: var(--accent); letter-spacing: -0.04em; }
.wd.wd-center { align-items: center; text-align: center; }
.wd-ring { position: relative; width: 11em; height: 11em; align-self: center; }
.wd-ring-svg { width: 100%; height: 100%; display: block; }
.wd-ring-bg { fill: none; stroke: color-mix(in srgb, var(--ink) 12%, transparent); stroke-width: 10; }
.wd-ring-fg { fill: none; stroke: var(--accent); stroke-width: 10; stroke-linecap: round; }
.wd-ring-c { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .15em; }
.wd-ring-t { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 900); font-size: 1.5em; line-height: 1; color: var(--h1-color, var(--ink)); }
.wd-ring-s { font-family: var(--ds-font, var(--font)); font-size: .95em; font-weight: 700; color: var(--ink-dim); }
.wd-icons { display: flex; gap: .5em; }
.wd-ic-sm { width: 2.2em; height: 2.2em; display: grid; place-items: center; color: var(--icon-color, var(--accent)); }
.wd-ic-sm svg { width: 100%; height: 100%; }
.wd-ic { width: 3.4em; height: 3.4em; display: grid; place-items: center; color: var(--accent); }
.wd-ic svg { width: 100%; height: 100%; }
.wd-hd2 { display: flex; flex-direction: column; gap: .35em; }
.wd-spacer { display: block; }
/* a phone number is one line on the sheet — the fit pass shrinks it rather than wrapping it */
.wd-hero.wd-phone { white-space: nowrap; }
.wd-hd { display: flex; align-items: flex-end; justify-content: space-between; gap: 1em; }
.wd-stack { display: flex; flex-direction: column; gap: .55em; align-items: flex-start; }
.wd-status { display: flex; align-items: center; gap: .6em; }
.wd-dot { width: .75em; height: .75em; border-radius: 50%; flex: 0 0 auto; background: var(--status-closed); }
.wd-dot.on { background: var(--status-open); }
.wd-arrow.wd-big { width: 5em; height: 5em; }
.wd-arrow.wd-big svg { width: 1.8em; height: 1.8em; }
.wd-cartslot .sh-cartpill { position: static; }
/* a tile whose corner holds an arrow keeps clear of it */
.wd-hasarrow .wd-hd, .wd-hasarrow .wd-stack { padding-right: 4.4em; }
.wd-tiny .wd-sub { font-size: 1.15em; }
/* THE 94px SHAPE. A tile at that height has room for one line and nothing else, so everything but
   the statement comes off — the same ladder the header uses, and for the same reason: a part that
   is dropped is not a part that is clipped. */
.wd.h-xs { padding: clamp(9px, 1.2cqw, 14px) clamp(12px, 1.6cqw, 18px); justify-content: center; }
.wd.h-xs .wd-sub, .wd.h-xs .wd-eyebrow, .wd.h-xs .wd-arrow, .wd.h-xs .wd-icons,
.wd.h-xs .wd-ic, .wd.h-xs .wd-ring, .wd.h-xs .wd-status { display: none; }
.wd.h-xs .wd-hero br, .wd.h-xs .wd-num br { display: none; }
.wd.h-xs .wd-hero, .wd.h-xs .wd-ask { font-size: 2em; line-height: 1.05; }
.wd.h-xs .wd-num { font-size: 2.6em; line-height: 1; }
.wd.h-xs .wd-mark { font-size: 3em; line-height: 1; }
.wd.h-xs .wd-name { font-size: 1.3em; }
.wd.h-xs .wd-hd, .wd.h-xs .wd-hd2, .wd.h-xs .wd-stack { gap: .2em; }
.wd.h-xs .wd-hasarrow .wd-stack { padding-right: 0; }

/* ------------------------- widget: link ------------------------- */
a.wg-link { display: flex; flex-direction: column; gap: 10px; text-decoration: none; }
.ic {
  width: 44px; height: 44px; flex: 0 0 auto; border-radius: calc(var(--radius) * 0.4 + 4px);
  background: var(--icon-chip, color-mix(in srgb, var(--ink) 9%, transparent)); border: 1px solid var(--card-border);
  display: grid; place-items: center;
}
.ic svg { width: 22px; height: 22px; }
.wg-link .lk-label { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); font-size: 18px; letter-spacing: -0.01em; }
.wg-link .lk-desc { font-family: var(--ds-font, var(--font)); color: var(--ds-color, var(--ink-dim)); font-size: calc(14px * var(--ds-scale, 1)); font-weight: var(--ds-weight, 400); font-style: var(--ds-style, normal); }
.wg-link .lk-host { font-family: var(--ds-font, var(--font)); color: var(--ink-faint); font-size: 12px; margin-top: auto; word-break: break-all; }
.w.s a.wg-link .lk-desc { display: none; }
/* ------------------------- widget: hours ------------------------- */
/* inner card: a styled group inside the widget (theme-controlled via Cards/Border → Inner) */
.wg-inner { background: var(--in-bg); border: var(--in-border-w, 0) solid var(--in-border, transparent); border-radius: var(--in-radius, 18px); padding: 6px 12px; margin: 14px 0 2px; }
[data-infill="glass"] .wg-inner { backdrop-filter: blur(var(--in-blur, 20px)) saturate(140%); -webkit-backdrop-filter: blur(var(--in-blur, 20px)) saturate(140%); box-shadow: inset 0 1px 0 rgba(255,255,255,0.12), inset 0 -1px 0 rgba(0,0,0,0.30), 0 8px 24px -14px rgba(0,0,0,0.5), var(--in-glow, 0 0 transparent); }
[data-infill="glass"] .wg-hours .row { border-bottom-color: rgba(255,255,255,0.08); }
.wg-hours .row { display: flex; justify-content: space-between; padding: 9px 0; border-bottom: 1px solid var(--hair); font-family: var(--lb-font, var(--font)); font-size: calc(15px * var(--lb-scale, 1)); font-weight: var(--lb-weight, 400); font-style: var(--lb-style, normal); color: var(--lb-color, var(--ink)); }
.wg-hours .row:last-child { border-bottom: 0; }
.wg-hours .row.today { color: var(--accent); font-weight: 600; }
.wg-hours .row .cl { font-family: var(--ds-font, var(--font)); color: var(--ds-color, var(--ink-dim)); font-weight: var(--ds-weight, 400); font-size: calc(1em * var(--ds-scale, 1) / var(--lb-scale, 1)); }
.wg-hours .row.closed .cl { color: var(--ink-faint); }
.w.s .wg-hours .row:nth-child(n+4) { display: none; } /* compact in square */
/* ===================== widgets v2 — every widget × every size its own layout ===================== */
.wg-link, .wg-text, .wg-contact, .wg-whatsapp, .wg-form, .wg-map, .wg-icons, .wg-gallery, .wg-hours { display: flex; flex-direction: column; }
/* universal heading (overline) — consistent across every widget */
.wg-h { margin: 0 0 12px; font-family: var(--lb-font, var(--font)); font-size: 11.5px; text-transform: uppercase; letter-spacing: .1em; font-weight: 700; color: var(--lb-color, var(--ink-faint)); }
.wg-bighead { margin: 0 0 6px; font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 800); font-style: var(--h1-style, normal); font-size: clamp(22px, 3.4cqw, 34px); color: var(--h1-color, var(--ink)); letter-spacing: -0.02em; line-height: 1.05; }
/* shared base head: overline LABEL · TITLE · DESCRIPTION — each hidden when empty.
   Typography tracks the theme's per-element roles (label/title/description). */
.wg-head2 { flex: 0 0 auto; display: flex; flex-direction: column; gap: 4px; margin: 0 0 12px; min-width: 0; }
.wg-head2:last-child { margin-bottom: 0; }
/* ── unified body: pinned head above, body fills the remaining card height ──
   so widgets never leave a dead gap at the bottom and never overlap themselves. */
.wg-body { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.wg-body.bd-top { justify-content: flex-start; }
.wg-body.bd-center { justify-content: safe center; } /* "safe" → never spill content over the head when it doesn't fit */
.wg-body.bd-between { justify-content: space-between; }
.wg-body.bd-fill > * { flex: 1 1 auto; min-height: 0; }
/* text widget: even breathing room between overline / title / paragraph (was cramped) */
.wg-text .wg-body { gap: 10px; }
.wg-text .wg-bighead, .wg-text .wg-ttl { margin-bottom: 0; }
.wg-ov { font-family: var(--lb-font, var(--font)); font-size: 11.5px; text-transform: uppercase; letter-spacing: .1em; font-weight: 700; color: var(--lb-color, var(--ink-faint)); }
.wg-ttl { margin: 0; font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); text-shadow: var(--h1-glow, none); letter-spacing: -0.02em; line-height: 1.08; font-size: calc(clamp(18px, 2.4cqw, 23px) * var(--h1-scale, 1)); }
.wg-dsc { margin: 0; font-family: var(--ds-font, var(--font)); color: var(--ds-color, var(--ink-dim)); font-weight: var(--ds-weight, 400); font-style: var(--ds-style, normal); font-size: calc(14px * var(--ds-scale, 1)); line-height: 1.5; }
/* per-role text case (Aa / UPPER / lower / Title) — set per element in Design → Text, and on buttons in Design → Buttons */
.wg-header p, .wg-hero .ti-text > p, .wg-hero .ti-overtext > p { text-transform: var(--h2-transform, none); }
.wg-dsc, .wg-sub { text-transform: var(--ds-transform, none); }
.sz-l .wg-ttl { font-size: calc(clamp(22px, 3.2cqw, 32px) * var(--h1-scale, 1)); }
.sz-l .wg-dsc { font-size: calc(15px * var(--ds-scale, 1)); }
.sz-s .wg-ttl { font-size: calc(16px * var(--h1-scale, 1)); }
.sz-s .wg-head2 { margin-bottom: 8px; }
.ic.sm { width: 36px; height: 36px; }
.ic.sm svg { width: 18px; height: 18px; }
.lk-fav { width: 22px; height: 22px; border-radius: 5px; object-fit: cover; }
.wim-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 130px; color: var(--ink-faint); background: color-mix(in srgb, var(--ink) 5%, transparent); }
.wim-empty svg { width: 36px; height: 36px; }
/* "Add an image / Add photos" hint under the placeholder icon */
.wim-hint { display: block; font-family: var(--ds-font, var(--font)); font-size: 12px; font-weight: 600; letter-spacing: .01em; margin-top: 7px; opacity: .85; text-align: center; }
/* ---- LINK — the whole card IS the button (one destination, opens a new tab) ---- */
.wg-link { position: relative; text-decoration: none; cursor: pointer; transition: transform .15s, filter .15s; }
.wg-link:hover { transform: translateY(-2px); }
/* icon chip uses the same --icon-bg/-bd/-fg tokens as every other widget (contact, form, …) so the Icons setting is consistent */
.wg-link .lk-ic { width: 42px; height: 42px; flex: 0 0 auto; border-radius: calc(var(--radius) * 0.3 + 4px); display: grid; place-items: center; background: var(--icon-bg, color-mix(in srgb, var(--accent) 14%, transparent)); border: 1px solid var(--icon-bd, transparent); color: var(--icon-fg, var(--accent)); overflow: hidden; }
.wg-link .lk-ic svg { width: 22px; height: 22px; }
.wg-link .lk-ic.lk-img { background-size: cover; background-position: center; border: 0; }
.wg-link .lk-label { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); font-size: clamp(16px, 2cqw, 19px); letter-spacing: -0.01em; min-width: 0; }
/* external-link badge — top-right corner, like the + (signals: opens a new tab) */
.wg-link .lk-ext { position: absolute; top: 12px; right: 12px; z-index: 2; width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center; background: color-mix(in srgb, var(--ink) 9%, transparent); color: var(--ink); border: 1px solid color-mix(in srgb, var(--ink) 16%, transparent); opacity: .85; transition: opacity .15s; }
.wg-link:hover .lk-ext { opacity: 1; }
.wg-link .lk-ext svg { width: 15px; height: 15px; }
/* link bar — thumb left · label (wide & short); reserve room for the corner badge */
.wg-link.lk-bar { flex-direction: row; align-items: center; gap: 14px; padding-right: clamp(50px, 7cqw, 58px); }
.wg-link.lk-bar .lk-label { flex: 1; }
/* link tile — thumb on top · label under (small square, or any tall block) */
.wg-link.lk-tile { flex-direction: column; align-items: flex-start; justify-content: center; gap: 12px; }
.wg-link.lk-tile .lk-ic { width: 50px; height: 50px; }
.wg-link.lk-tile .lk-ic svg { width: 26px; height: 26px; }
.wg-link.lk-tile.sz-s { justify-content: space-between; }
.wg-link.lk-tile .lk-label { font-size: clamp(17px, 2.2cqw, 22px); }
/* ---- TEXT ---- */
.wg-text { gap: 8px; justify-content: center; min-height: 0; }
.wg-text .wg-body { min-height: 0; max-height: 100%; overflow: hidden; position: relative; }
.wg-p { margin: 0; font-family: var(--ds-font, var(--font)); color: var(--ds-color, var(--ink-dim)); font-size: calc(15px * var(--ds-scale, 1)); line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; }
/* clipped text fades out at the bottom so it's clear there's more — tap the card to read it all */
.wg-text.is-clamped .wg-body::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 36px; background: linear-gradient(transparent, var(--card-bg, rgba(0,0,0,0.4))); pointer-events: none; }
.wg-text.sz-l .wg-p { font-size: 17px; }
/* ---- IMAGE ---- */
.wg-image { padding: 0 !important; position: relative; min-height: 150px; }
.wg-image.sz-l { min-height: 320px; }
.wim { position: absolute; inset: 0; background-size: cover; background-position: center; z-index: 1; }
/* INSET frame (preset "Media edge → Padded"): the photo becomes a rounded block inside the card padding */
.w[data-frame="inset"] .wg-image { --fpad: clamp(14px, 2.2cqw, 20px); padding: var(--fpad) !important; background: var(--card-bg); }
.w[data-frame="inset"] .wg-image > .wim, .w[data-frame="inset"] .wg-image > .wim-empty { inset: var(--fpad); border-radius: var(--in-radius, 16px); overflow: hidden; }
.w[data-frame="inset"] .wg-image .wg-imgcap { padding: 0 var(--fpad) var(--fpad); }
/* deferred (lazy) photo placeholder — a faint fill until the image scrolls into view */
.lbg-ph { background-color: color-mix(in srgb, var(--ink) 7%, transparent); }
/* blurhash placeholder — the photo's own decoded low-res preview, upscaled (soft) until it loads */
.lbg-bh { background-size: cover !important; background-position: center !important; }
/* ── QR widget ── */
.wg-qr { display: flex; align-items: center; gap: clamp(12px, 3cqw, 22px); }
.qr-img { flex: 0 0 auto; width: clamp(92px, 34%, 160px); aspect-ratio: 1; display: block; }
.qr-img svg { width: 100%; height: 100%; display: block; }
.qr-empty { width: 100%; height: 100%; display: grid; place-items: center; border-radius: 16px; background: color-mix(in srgb, var(--ink) 8%, transparent); color: var(--ink-faint); }
.qr-tx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 9px; }
.qr-ov { white-space: nowrap; }
.qr-title { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); font-size: clamp(18px, 2.4cqw, 25px); color: var(--h1-color, var(--ink)); line-height: 1.1; letter-spacing: -0.01em; }
.qr-desc { margin: 0; }
.wg-qr.sz-s { gap: 12px; }
.wg-qr.sz-s .qr-img { width: clamp(74px, 40%, 96px); }
.wg-qr.sz-s .qr-title { font-size: 16px; }
/* tall/portrait cards → stack the QR on top, text centred below */
.wg-qr.h-l { flex-direction: column; text-align: center; justify-content: center; }
.wg-qr.h-l .qr-img { width: clamp(120px, 52cqw, 220px); }
.wg-qr.h-l .qr-tx { align-items: center; }
/* styled dropdown (app-native replacement for native <select>) */
/* QR preview in the preset design tab */
.qr-prevbox { display: grid; place-items: center; padding: 18px; border-radius: 16px; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.08); margin-bottom: 16px; }
.qr-prevbox svg { width: 156px; height: 156px; max-width: 100%; }
/* master-template editor banner */
.tpl-banner { position: fixed; top: 12px; left: 50%; transform: translateX(-50%); z-index: 120; display: inline-flex; align-items: center; gap: 8px; max-width: calc(100vw - 24px); background: rgba(15,15,18,0.82); color: rgba(255,255,255,0.9); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255,255,255,0.16); border-radius: 999px; padding: 9px 18px; font-family: var(--qck-font); font-size: 13px; line-height: 1.3; box-shadow: 0 12px 36px -12px rgba(0,0,0,0.6); pointer-events: none; }
.tpl-banner b { color: #fff; }
.tpl-banner svg { width: 15px; height: 15px; flex: 0 0 auto; }
body.is-template .undo-dock { top: 56px; }
/* the image widget's picture covers the card edge-to-edge — never blur it through the card fill */
.w[data-i] .card.wg-image { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }
.card.wg-image::before { display: none; }
.wg-cap { font-family: var(--ds-font, var(--font)); position: absolute; left: 0; right: 0; bottom: 0; padding: 26px 18px 14px; color: #fff; font-size: 13.5px; font-weight: 500; background: linear-gradient(transparent, rgba(0,0,0,.65)); }
.wg-imgcap { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; display: flex; flex-direction: column; gap: 3px; padding: 30px 18px 16px; background: linear-gradient(transparent, rgba(0,0,0,.74)); }
.wg-imgcap .wg-ov { color: rgba(255,255,255,0.82); }
.wg-imgttl { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); font-size: clamp(17px, 2cqw, 23px); color: #fff; letter-spacing: -0.01em; line-height: 1.1; }
.wg-imgdsc { font-family: var(--ds-font, var(--font)); font-size: 13.5px; color: rgba(255,255,255,0.84); }
/* ---- TEXT + IMAGE ---- */
.wg-textimage { display: flex; flex-direction: column; gap: 14px; }
.wg-textimage .ti-text { display: flex; flex-direction: column; justify-content: center; }
.wg-textimage .ti-text .wg-head2 { margin: 0; }
.ti-img { width: 100%; flex: 1 1 auto; min-height: 120px; background-size: cover; background-position: center; border-radius: 16px; }
/* Image shape + shadow now come from the PRESET (Design → Images), via the .w node's data-img-shape / data-img-shadow. */
[data-img-shape="square"] .ti-img { border-radius: 0; }
[data-img-shape="round"] .ti-img { border-radius: 16px; }
[data-img-shape="squircle"] .ti-img { border-radius: 34px; corner-shape: squircle; }
[data-img-shape="pill"] .ti-img { border-radius: 999px; }
/* circle = a perfect circle: lock 1:1 and drop the min-height that was making it an oval */
[data-img-shape="circle"] .ti-img { border-radius: 50%; aspect-ratio: 1 / 1; min-height: 0; flex: 0 0 auto; width: clamp(160px, 74%, 340px); height: auto; align-self: center; }
[data-img-shadow="soft"] .ti-img { box-shadow: 0 14px 34px -18px rgba(0,0,0,0.45); }
[data-img-shadow="strong"] .ti-img { box-shadow: 0 22px 50px -18px rgba(0,0,0,0.6); }
/* link logo / favicon image follows the same shape */
[data-img-shape="square"] .wg-link .lk-ic { border-radius: 6px; }
[data-img-shape="squircle"] .wg-link .lk-ic { corner-shape: squircle; }
[data-img-shape="circle"] .wg-link .lk-ic, [data-img-shape="pill"] .wg-link .lk-ic { border-radius: 50%; }
[data-img-shadow="soft"] .wg-link .lk-ic.lk-img { box-shadow: 0 8px 20px -10px rgba(0,0,0,0.45); }
[data-img-shadow="strong"] .wg-link .lk-ic.lk-img { box-shadow: 0 12px 26px -10px rgba(0,0,0,0.6); }
/* below = image then text (default column); above = text then image */
.wg-textimage.ti-above:not(.sz-l) { flex-direction: column-reverse; }
/* large = side by side; align left → image left, right → image right */
.wg-textimage.sz-l:not(.ti-over) { flex-direction: row; align-items: stretch; gap: clamp(18px, 2.5cqw, 32px); }
.wg-textimage.sz-l.ti-al-right:not(.ti-over) { flex-direction: row-reverse; }
.wg-textimage.sz-l .ti-img { width: 46%; flex: 0 0 46%; min-height: 100%; }
[data-img-shape="circle"] .wg-textimage.sz-l .ti-img { width: clamp(160px, 40%, 340px); min-height: 0; height: auto; flex: 0 0 auto; align-self: center; }
.wg-textimage.sz-l .ti-text { flex: 1; min-width: 0; }
/* over = image as full background, text overlaid (poster) */
.wg-textimage.ti-over { padding: 0 !important; position: relative; overflow: hidden; background-size: cover; background-position: center; }
.ti-scrim { position: absolute; inset: 0; background: linear-gradient(0deg, rgba(0,0,0,.62), rgba(0,0,0,.12) 55%, transparent); }
.ti-noimg { position: absolute; inset: 0; display: grid; place-items: center; color: var(--ink-faint); background: color-mix(in srgb, var(--ink) 6%, transparent); }
.ti-noimg svg { width: 40px; height: 40px; }
.ti-overtext { position: relative; z-index: 1; margin-top: auto; padding: clamp(18px, 2.4cqw, 28px); }
.ti-over .ti-overtext .wg-ttl, .ti-over .ti-overtext .wg-ov { color: #fff; }
.ti-over .ti-overtext .wg-dsc { color: rgba(255,255,255,0.82); }
.ti-over .ti-overtext .wg-head2 { margin: 0; }
/* ── Image + text (the universal maker) ──────────────────────────────────────
   Photo · title · description · button, any of them optional. Scoped to .wg-timaker
   so the header — which reuses .wg-textimage as a hero — keeps its own layout. */
.wg-timaker .ti-overtext, .wg-timaker .ti-text { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
/* The scrim rides on the TEXT block, not the card, so however tall the text grows it always
   carries its own contrast — a card-anchored gradient leaves text stranded on a bright photo
   as soon as the card is short (mobile, 1×1 tiles). Fades out above the first line.
   Colour comes from the CARD, so the fade reads as part of the theme instead of a generic black
   wash. It's mixed INTO black rather than layered over it: light themes have white/cream cards,
   and overlaying those would wash the scrim out from under the white text. A red card gives a
   deep red, a cream card a warm charcoal — tinted, always dark enough to read on.
   Many stops on purpose: a 3-stop alpha ramp visibly bands over flat colour. */
.wg-timaker.ti-over .ti-overtext {
  --ti-tint: color-mix(in srgb, var(--card-bg, #101014) 24%, #000);
  background: linear-gradient(to top,
    color-mix(in srgb, var(--ti-tint) 84%, transparent) 0%,
    color-mix(in srgb, var(--ti-tint) 78%, transparent) 16%,
    color-mix(in srgb, var(--ti-tint) 66%, transparent) 33%,
    color-mix(in srgb, var(--ti-tint) 48%, transparent) 50%,
    color-mix(in srgb, var(--ti-tint) 29%, transparent) 66%,
    color-mix(in srgb, var(--ti-tint) 14%, transparent) 81%,
    color-mix(in srgb, var(--ti-tint) 5%, transparent) 92%,
    transparent 100%);
  padding-top: clamp(30px, 7cqw, 64px); }
.wg-timaker .ti-overtext > .wg-head2, .wg-timaker .ti-text > .wg-head2 { width: 100%; }
/* over a photo the button spans the card (it's the tile's one action); on a text-only card it hugs */
.wg-timaker.ti-over .ti-btn { align-self: stretch; justify-content: center; text-align: center; }
.wg-timaker .ti-btn { margin-top: 2px; }
/* small tiles: tighten the overlay so title + button still fit a 1×1 */
.wg-timaker.sz-s .ti-overtext { padding: 14px; gap: 8px; }
/* The maker is title-led, so its headline runs bigger than the generic widget title and steps
   up with the tile — otherwise a wide card reads as a small title floating in a lot of photo. */
.wg-timaker .wg-ttl { font-size: calc(clamp(20px, 2.9cqw, 27px) * var(--h1-scale, 1)); }
.wg-timaker.sz-m .wg-ttl { font-size: calc(clamp(23px, 3.6cqw, 34px) * var(--h1-scale, 1)); }
.wg-timaker.sz-l .wg-ttl { font-size: calc(clamp(27px, 4.4cqw, 42px) * var(--h1-scale, 1)); }
/* Text sits at the BOTTOM whether or not there's a photo — centring the text-only state made the
   copy jump the moment you removed the image. */
.wg-timaker.ti-textonly { justify-content: flex-end; }
/* INSET frame (preset "Media edge → Padded") — the photo becomes a rounded block inside the
   card's own padding, and the text overlay rides inside it so the copy still sits on the photo
   rather than on the card edge. Matches how .wg-image / .wg-map already read this preset. */
.w[data-frame="inset"] .wg-timaker.ti-over {
  --fpad: clamp(14px, 2.2cqw, 20px); padding: var(--fpad) !important; background: var(--card-bg); }
/* [data-i] is carried here only to out-specify the base .ti-photo fill rule further down the
   sheet — without it the two selectors tie and source order keeps the photo edge-to-edge. */
.w[data-i][data-frame="inset"] .wg-timaker.ti-over .ti-photo {
  inset: var(--fpad); border-radius: var(--in-radius, 16px); corner-shape: round; }
.w[data-frame="inset"] .wg-timaker.ti-over .ti-overtext {
  border-bottom-left-radius: var(--in-radius, 16px); border-bottom-right-radius: var(--in-radius, 16px); }
/* text-only (image removed) — a tidy themed card, no empty image box */
.wg-textimage.ti-textonly .ti-text { flex: 0 1 auto; }
.wg-textimage.ti-al-center.ti-textonly .ti-text { text-align: center; align-items: center; }
.wg-textimage.ti-al-right.ti-textonly .ti-text { text-align: right; align-items: flex-end; }
/* keep the icon + hint grouped and centered in the empty image box (.wim-hint styled globally) */
.ti-noimg { display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--ink-faint); }
/* ---- GALLERY ---- */
.wg-gallery.sz-s { padding: 0 !important; position: relative; min-height: 150px; }
.gal-badge { font-family: var(--ds-font, var(--font)); position: absolute; right: 10px; bottom: 10px; z-index: 2; background: rgba(0,0,0,.6); color: #fff; font-size: 12px; font-weight: 700; padding: 3px 9px; border-radius: 999px; }
.wg-gallery { display: flex; flex-direction: column; }
.wg-strip { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; margin: 0 -2px; padding: 2px; flex: 1 1 auto; min-height: 0; }
.wg-strip::-webkit-scrollbar { display: none; }
.wg-shot { flex: 0 0 auto; width: 33%; min-width: 120px; height: 100%; min-height: 0; aspect-ratio: 4 / 3; border-radius: 14px; background-size: cover; background-position: center; scroll-snap-align: start; }
.wg-gallery.sz-m .wg-shot { width: 44%; }
/* smallest gallery → cover image with the title overlaid */
.wg-gallery.gal-cover { padding: 0 !important; position: relative; overflow: hidden; background-size: cover; background-position: center; justify-content: flex-end; --ink: #fff; --lb-color: #fff; --ink-dim: rgba(255,255,255,0.86); --ink-faint: rgba(255,255,255,0.72); }
.gal-cover .gal-scrim { position: absolute; inset: 0; background: linear-gradient(transparent 35%, rgba(0,0,0,0.7)); }
.gal-cover .gal-overtext { position: relative; z-index: 1; padding: clamp(14px, 2.5cqw, 18px); }
.gal-cover .gal-overtext .wg-head2 { margin: 0; }
.gal-cover .wim-empty { position: absolute; inset: 0; }
/* small gallery → 2×2 photo mosaic (shows the gallery, not one over-zoomed crop) */
.wg-gallery.gal-mosaic { padding: 0 !important; position: relative; display: grid; gap: 3px; overflow: hidden; }
.gal-mosaic.m-1 { grid-template-columns: 1fr; }
.gal-mosaic.m-2 { grid-template-columns: 1fr 1fr; }
.gal-mosaic.m-3, .gal-mosaic.m-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; }
.gal-mosaic.m-3 .gal-cell:first-child { grid-row: span 2; }
.gal-cell { background-size: cover; background-position: center; width: 100%; height: 100%; min-height: 0; }
.gal-more { font-family: var(--ds-font, var(--font)); position: absolute; right: 8px; bottom: 8px; z-index: 2; background: rgba(0,0,0,0.62); color: #fff; border-radius: 8px; padding: 3px 8px; font-size: 12px; font-weight: 700; }
/* gallery lightbox modal — one big image + thumbnails to pick from */
.wx-lightbox { display: flex; flex-direction: column; gap: 14px; }
.wx-main { width: 100%; aspect-ratio: 16/10; border-radius: 16px; background-size: cover; background-position: center; background-color: rgba(255,255,255,0.05); }
.wx-thumbs { display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
.wx-thumbs::-webkit-scrollbar { display: none; }
.wx-thumb { flex: 0 0 auto; width: 96px; height: 72px; border-radius: 10px; background-size: cover; background-position: center; border: 2px solid transparent; cursor: pointer; padding: 0; opacity: .6; transition: opacity .15s, border-color .15s; }
.wx-thumb:hover { opacity: 1; }
.wx-thumb.on { opacity: 1; border-color: var(--ink, #fff); }
/* gallery editor — reorder arrows on each photo */
.wg-mini { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.wg-mcell { aspect-ratio: 1; border-radius: 12px; background-size: cover; background-position: center; min-height: 64px; }
/* ---- HOURS ---- */
.wg-htop { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 14px; padding-right: 34px; }
.wg-htop .wg-h { margin: 0; }
/* ============================ OPENING HOURS (redesign) ============================ */
/* status block: red/green dot + bold label + accent "Opens 09:00" sub-line */
/* day = an inner-card row (wears the preset's inner-card design). today = accent. */
/* on mobile (real device AND the editor's mobile preview) a 2-col week never fits — go single column */
@media (max-width: 600px) { .hr-days.grid2 { grid-template-columns: 1fr; } }
/* today = the inner group filled with the accent + light text (works on every theme) */
/* card layouts — status on top, days fill the rest */
/* small · short → status + big today time + sub */
/* small · medium → upcoming relative rows (plain, no card) */
/* wide · short → banner: status left, big today time right */
/* large · tall → ring + week list side by side */
/* 24h ring dial */
.hr-ring { display: flex; flex-direction: column; align-items: center; gap: 12px; }
.hr-ring-dial { position: relative; width: 100%; max-width: 220px; aspect-ratio: 1; }
.hr-ring-svg { width: 100%; height: 100%; display: block; }
.hr-ring-bg { fill: none; stroke: color-mix(in srgb, var(--ink) 13%, transparent); stroke-width: 8; }
.hr-ring-fg { fill: none; stroke: var(--accent); stroke-width: 8; stroke-linecap: round; }
.hr-ring-c { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; }
/* The markup has emitted `.on` / `.off` here since the ring was written and only one of them was
   ever styled, so CLOSED NOW rendered in the open colour. Pre-existing — byte-identical before this
   session — and fixed here rather than left, since it is one line and it says the wrong thing.
   On the preset pair, like the tile's dot. */
.hr-ring-st { font-family: var(--lb-font, var(--font)); font-size: 12px; font-weight: 800; letter-spacing: .05em; color: var(--status-open, #34C759); }
.hr-ring-st.off { color: var(--status-closed, #F0563C); }
.hr-ring-h { font-family: var(--h1-font, var(--font)); font-weight: 700; font-size: clamp(34px, 7cqw, 52px); color: var(--ink); line-height: 1; }
.hr-ring-sub { font-family: var(--ds-font, var(--font)); font-size: 13px; color: var(--ink-dim); }
.hr-ring-now { font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ink-dim); }
/* modal content — ring left + full week list right (uses the standard modal chrome) */
.hr-modal { display: grid; grid-template-columns: minmax(160px, 230px) 1fr; gap: 32px; align-items: center; }
.hr-modal-left { display: flex; justify-content: center; }
.hr-modal-right .wx-head { margin-bottom: 16px; }
.hr-modal .hr-ring-dial { max-width: 200px; }
@media (max-width: 680px) { .hr-modal { grid-template-columns: 1fr; gap: 22px; } .hr-modal-right .wx-head { justify-content: center; } .wg-hours.hr-showcase { grid-template-columns: 1fr; gap: 18px; } }
.wx-cal { display: flex; flex-direction: column; }
.wx-cal-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 6px; border-bottom: 1px solid var(--hair); }
.wx-cal-row:last-child { border-bottom: 0; }
.wx-cal-day { display: flex; align-items: baseline; gap: 10px; font-family: var(--lb-font, var(--font)); }
.wx-cal-day b { font-weight: 650; font-size: 17px; color: var(--ink); }
.wx-cal-row.today .wx-cal-day b { color: var(--accent); }
.wx-cal-date { font-family: var(--ds-font, var(--font)); font-size: 13px; color: var(--ink-faint); }
.wx-cal-time { font-family: var(--ds-font, var(--font)); font-size: 16px; color: var(--ink-dim); }
.wx-cal-row.today .wx-cal-time { color: var(--accent); font-weight: 650; }
.wx-cal-time.shut { color: var(--ink-faint); }
.wk-list { display: flex; flex-direction: column; }
.wk-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--hair); }
.wk-row:last-child { border-bottom: 0; }
.wk-row.today { color: var(--accent); }
.wk-day { display: flex; align-items: baseline; gap: 8px; font-family: var(--lb-font, var(--font)); }
.wk-day b { font-weight: 650; }
.wk-date { font-family: var(--ds-font, var(--font)); font-size: 12px; color: var(--ink-faint); }
.wk-row.today .wk-date { color: var(--accent); }
.wk-time { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); }
.wk-row.today .wk-time { color: var(--accent); font-weight: 650; }
/* ---- CONTACT ---- */
/* accent icon chip (rounded square) — the shared element across every contact layout */
.ct-chip { width: 44px; height: 44px; flex: 0 0 auto; border-radius: min(var(--in-radius, 14px), 14px); display: grid; place-items: center; background: var(--icon-bg, color-mix(in srgb, var(--accent) 14%, transparent)); border: 1px solid var(--icon-bd, transparent); color: var(--icon-fg, var(--accent)); }
.ct-chip svg { width: 22px; height: 22px; }
.ct-chip.lg { width: 50px; height: 50px; }
.ct-chip.lg svg { width: 24px; height: 24px; }
.ct-title { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: clamp(20px, 2.4cqw, 26px); color: var(--h1-color, var(--ink)); margin-bottom: 6px; }
/* value rows (chip + value) — floating, no tile */
.ct-rows { display: flex; flex-direction: column; gap: 14px; width: 100%; }
.ct-rows.two { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 20px; }
.ct-row { display: flex; align-items: center; gap: 14px; min-width: 0; }
.ct-val { font-family: var(--lb-font, var(--font)); font-weight: 650; font-size: 16px; color: var(--lb-color, var(--ink)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* horizontal label banner (chip + LABEL/value) — wide + short */
.ct-banner { display: flex; flex-wrap: wrap; align-items: center; gap: 16px 40px; width: 100%; }
.ct-lrow { display: flex; align-items: center; gap: 14px; min-width: 0; }
.ct-lr-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ct-lr-l { font-family: var(--lb-font, var(--font)); font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ds-color, var(--ink-faint)); }
.ct-lr-v { font-family: var(--lb-font, var(--font)); font-weight: 650; font-size: 16px; color: var(--lb-color, var(--ink)); white-space: nowrap; }
/* labelled groups (chip + label/value) — spacious, large + tall */
.ct-groups { display: flex; flex-direction: column; gap: 18px; width: 100%; }
.ct-groups.two { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 28px; }
.ct-groups .ct-chip { width: 48px; height: 48px; }
.ct-groups .ct-lr-v { font-size: clamp(17px, 2cqw, 21px); }
.ct-groups.two .ct-lr-v { font-size: 17px; }
/* teaser (chat chip + title + subtitle) — medium + short */
.wg-contact.ct-teaser .wg-body { flex-direction: row; align-items: center; gap: 16px; }
.ct-teaser-tx { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ct-teaser-t { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: clamp(19px, 2.2cqw, 24px); color: var(--h1-color, var(--ink)); }
.ct-teaser-s { font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ds-color, var(--ink-dim)); text-transform: capitalize; }
/* ---- CONTACT PANEL — one channel, its value, the action, and Copy ----
   Deliberately the smallest modal in the product. It replaced a list of every channel on the card,
   which was the wrong shape from the moment a card became ONE way in: a list of one is just a row
   with a chevron. The width is capped here rather than on .wm-card so it stays centred by the
   scrim's own `margin:auto` and still morphs from the card it came out of. */
/* `height: auto` is doing the real work. A modal wears `.card` as well as `.wm-card`, and `.card`
   is `height: 100%` because in the grid a card fills its cell — so every modal has always been
   stretched to the full scrim. No modal had ever noticed, because they are all tall enough to fill
   anyway. This is the first SHORT one, and it drew a 250px panel inside an 870px box. */
.wm-card.wg-contact { width: min(400px, 100%); height: auto; align-self: center; margin-inline: auto; text-align: center; }
.ctx { display: flex; flex-direction: column; align-items: center; gap: 0; }
/* THE GLYPH IS THE CARD'S OWN INK, AND THAT IS DELIBERATE.
   Drawing it in the accent — which is what widget icons do — is invisible on any preset whose card
   IS the accent, and there is no way to spot that in CSS: it happens on a `solid` fill whose card
   colour happens to be the brand colour, so keying off the fill name catches only some of them.
   Ink always contrasts with the card it sits on, by construction. The accent still shows, as the
   tint behind it, where being wrong costs nothing. */
.ctx-ic { display: inline-grid; place-items: center; width: 56px; height: 56px; border-radius: 18px; margin-bottom: 16px;
  color: inherit; background: color-mix(in srgb, var(--accent) 16%, transparent); }
.ctx-ic svg { width: 27px; height: 27px; }
.ctx-lbl { font-family: var(--lb-font, var(--font)); font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ds-color, var(--ink-faint)); }
/* The value is the reason the panel exists — big enough to read down a phone, and selectable,
   because somebody will always want to drag over it rather than press Copy. */
.ctx-val { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: clamp(22px, 4.4cqw, 30px);
  line-height: 1.22; color: var(--h1-color, var(--ink)); margin: 7px 0 0; word-break: break-word; user-select: text; }
.ctx-sub { font-family: var(--ds-font, var(--font)); font-size: 14.5px; line-height: 1.45; color: var(--ds-color, var(--ink-dim)); margin: 7px 0 0; user-select: text; }
.ctx-go { margin-top: 22px; width: 100%; justify-content: center; text-decoration: none; }
.ctx-copy { margin-top: 9px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; width: 100%;
  padding: 11px 14px; border: 0; border-radius: 12px; cursor: pointer; font-family: var(--font); font-weight: 620; font-size: 14px;
  color: var(--ink-dim); background: color-mix(in srgb, var(--ink) 7%, transparent); transition: background .14s, color .14s; }
.ctx-copy svg { width: 16px; height: 16px; }
.ctx-copy:hover { background: color-mix(in srgb, var(--ink) 12%, transparent); color: var(--ink); }
.ctx-copy.done { color: var(--ink); }
.wx-sub { font-family: var(--ds-font, var(--font)); font-size: 15px; color: var(--ink-dim); margin: 6px 0 0; }
/* ---- WHATSAPP ---- */
/* ============================ WHATSAPP (chat) — accent-coloured ============================ */
.wg-whatsapp { gap: 14px; }
.wa-head { display: flex; align-items: center; gap: 13px; }
.wa-ic { width: 46px; height: 46px; flex: 0 0 auto; border-radius: 13px; background: var(--icon-bg, var(--accent)); border: 1px solid var(--icon-bd, transparent); color: var(--icon-fg, var(--on-accent)); display: grid; place-items: center; }
.wa-ic svg { width: 24px; height: 24px; }
.wa-ic.lg { width: 56px; height: 56px; border-radius: 16px; }
.wa-ic.lg svg { width: 28px; height: 28px; }
.wa-htx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.wa-title, .wa-mtitle { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); font-size: clamp(18px, 2.1cqw, 22px); color: var(--h1-color, var(--ink)); }
.wa-status { display: flex; align-items: center; gap: 7px; font-family: var(--ds-font, var(--font)); font-size: 13.5px; color: var(--accent); }
.wa-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); flex: 0 0 auto; }
/* faux message input (display only — the whole card opens the modal) */
.wa-faux { font-family: var(--ds-font, var(--font)); flex: 1; min-width: 0; display: flex; align-items: center; padding: 0 16px; height: 48px; border-radius: min(var(--input-radius, 12px), 24px); background: var(--input-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: 1px solid var(--input-bd, var(--card-border)); color: color-mix(in srgb, var(--input-ink, var(--ink)) 55%, transparent); font-size: 15px; }
/* the send button wears the preset's BUTTON style */
.wa-sendbtn { width: 48px; height: 48px; flex: 0 0 auto; border-radius: var(--btn-radius, 12px); background: var(--btn-bg); color: var(--btn-text); display: grid; place-items: center; }
.wa-sendbtn svg { width: 20px; height: 20px; }
.wa-bar { display: flex; align-items: center; gap: 10px; }
.wa-bar.grow { flex: 1; }
/* banner (wide · short) */
.wg-whatsapp.wa-banner .wg-body { flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; }
.wg-whatsapp.wa-banner .wa-head { flex: 0 0 auto; }
/* chat layout (header + greeting bubble + message bar) */
.wg-whatsapp.wa-chat { gap: 14px; }
.wa-stream { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.wg-whatsapp.wa-chat .wa-bar { margin-top: auto; }
/* greeting bubble = the INNER CARD (styleable via the Inner card design) */
.wa-bubble { align-self: flex-start; max-width: 92%; background: var(--in-bg, color-mix(in srgb, var(--ink) 8%, transparent)); border: var(--in-border-w, 1px) solid var(--in-border, var(--card-border)); border-radius: min(var(--in-radius, 16px), 20px); border-bottom-left-radius: 5px; padding: 11px 15px; font-family: var(--ds-font, var(--font)); font-size: 15px; color: var(--in-ink, var(--ink)); }
.wa-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.wg-sub { margin: 0 0 14px; font-family: var(--ds-font, var(--font)); color: var(--ink-dim); font-size: 14.5px; line-height: 1.5; }
/* ---- FORM ---- */
/* form widget — a clean PREVIEW (opens the form modal, like WhatsApp) + small teaser */
.wg-form { gap: 12px; justify-content: flex-start; }
.wg-form.form-teaser { flex-direction: row; align-items: center; gap: 14px; cursor: pointer; text-align: left; font: inherit; color: var(--ink); width: 100%; -webkit-appearance: none; appearance: none; }
.form-teaser .ct-teaser-s { text-transform: none; }
.ff-head { display: flex; flex-direction: column; gap: 3px; flex: 0 0 auto; }
.ff-title { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: clamp(18px, 2.3cqw, 24px); color: var(--h1-color, var(--ink)); letter-spacing: -0.01em; line-height: 1.1; }
.ff-sub { font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ds-color, var(--ink-dim)); }
/* preview fields (non-interactive faux inputs that mirror the real form) */
.ff-preview { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; flex: 1 1 auto; min-height: 0; align-content: start; }
.ff-field { min-width: 0; }
.ff-field.wide { grid-column: 1 / -1; }
.ff-faux { width: 100%; background: var(--input-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: 1px solid var(--input-bd, var(--card-border)); border-radius: min(var(--input-radius, 14px), 22px); color: color-mix(in srgb, var(--input-ink, var(--ink)) 50%, transparent); padding: 13px 15px; font-family: var(--ds-font, var(--font)); font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; pointer-events: none; }
.ff-faux.ff-area { min-height: 64px; }
.ff-choice.faux { display: flex; gap: 8px; flex-wrap: wrap; pointer-events: none; }
.ff-choice.faux .ff-opt { display: inline-block; }
/* corner send pill — small, bottom-right, wears the preset button tokens */
.ff-send { align-self: flex-end; } /* styling comes from .btn-cta + the preset's data-btnstyle */
.ff-send-ic { display: inline-grid; place-items: center; width: 24px; height: 24px; border-radius: 50%; background: color-mix(in srgb, var(--btn-text, #111) 16%, transparent); }
.ff-send-ic svg { width: 15px; height: 15px; color: var(--btn-text, #111); }
/* MODAL form (the real, functional one) */
.wg-forminline { display: flex; flex-direction: column; gap: 10px; }
.ff-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.wg-input { width: 100%; background: var(--input-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: 1px solid var(--input-bd, var(--card-border)); border-radius: min(var(--input-radius, 14px), 22px); color: var(--input-ink, var(--ink)); padding: 13px 15px; font: inherit; font-size: 15px; outline: none; transition: border-color .12s; }
.wg-input::placeholder { color: color-mix(in srgb, var(--input-ink, var(--ink)) 48%, transparent); }
.wg-input:focus { border-color: var(--input-color, var(--ink)); }
textarea.wg-input { resize: vertical; min-height: 88px; line-height: 1.45; }
.ff-choice { display: flex; gap: 8px; flex-wrap: wrap; }
.ff-opt { flex: 1 1 auto; min-width: 84px; padding: 12px 14px; border-radius: min(var(--input-radius, 14px), 22px); border: 1px solid var(--input-bd, var(--card-border)); background: var(--input-bg, color-mix(in srgb, var(--ink) 6%, transparent)); color: var(--input-ink, var(--ink)); font: inherit; font-weight: 600; font-size: 14px; cursor: pointer; transition: border-color .12s, background .12s, color .12s; }
.ff-opt:hover { border-color: var(--accent); }
.ff-opt.on { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 16%, transparent); color: var(--accent); font-weight: 700; }
.ff-submit { width: 100%; margin-top: 2px; }
/* short height → one inline row: head · fields · send */
.wg-form.form-banner { flex-direction: row; align-items: center; gap: 16px; }
.form-banner .ff-head { max-width: 34%; }
/* lowest height → no fields, just title + Send (title grows so Send sits on the right) */
.wg-form.form-bannerteaser { cursor: pointer; }
.form-bannerteaser .ff-head { flex: 1 1 auto; max-width: none; }
.form-bannerteaser .ff-send { align-self: center; flex: 0 0 auto; }
.form-banner .ff-preview { display: flex; flex: 1 1 auto; gap: 10px; align-items: center; min-width: 0; }
.form-banner .ff-field { flex: 1 1 0; min-width: 0; }
.form-banner .ff-field.wide { display: none; }
.form-banner .ff-faux.ff-area { display: none; }
.form-banner .ff-send { align-self: center; flex: 0 0 auto; }
/* whatsapp preset shown as a chat bubble */
.wa-bubble { align-self: flex-start; max-width: 90%; background: color-mix(in srgb, var(--ink) 8%, transparent); border: 1px solid var(--card-border); border-radius: 14px 14px 14px 4px; padding: 10px 13px; font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ds-color, var(--ink-dim)); margin: 2px 0 10px; }
/* ---- COUNTDOWN ---- */
/* ============================ COUNTDOWN (redesign) ============================ */
/* the big hero number (accent gradient) */
/* unit tiles (inner-card style; last/most-urgent = accent) */
/* s·s big */
/* s·m hero + tiles */
/* s·l stacked rows */
/* l·s inline banner */
/* tiles row (m·s / m·m / l·m) */
/* showcase (tall) */
/* end state — message replaces the countdown */
/* ---- MAP ---- */
.wg-map { gap: 12px; }
/* themeable faux-map illustration (land + roads + accent pin) */
.map-art-wrap { position: relative; display: block; width: 100%; height: 100%; border-radius: 14px; overflow: hidden; background: var(--map-land); }
/* the map makes its own rounded rect (border-radius + overflow), so it won't follow a squircle card on its own — match the corner shape */
[data-corner="squircle"] .map-art-wrap, [data-corner="squircle"] .map-pill { corner-shape: squircle; }
.map-art { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
/* real-tile basemap (static slippy-map mosaic) */
.map-tiles { position: absolute; inset: 0; overflow: hidden; }
.map-tile { position: absolute; width: 256px; height: 256px; max-width: none; user-select: none; -webkit-user-drag: none; }
/* THE CREDIT STAYS, IT JUST STOPS SHOUTING. OSM's data is ODbL and CARTO's free tiles carry their
   own terms, so this line is a licence condition on every site we serve — it cannot go. What it can
   do is read as texture: no pill behind it, no full-strength ink, and it takes the tone of whatever
   the map is (light basemap → dark text, dark basemap → light), so it disappears into the corner
   instead of sitting on top of it. */
.map-attr { position: absolute; right: 5px; bottom: 3px; z-index: 2; font-size: 8px; line-height: 1;
  letter-spacing: .01em; color: rgba(0,0,0,0.34); background: none; padding: 0; border-radius: 0;
  pointer-events: none; font-family: var(--font); text-shadow: 0 0 2px rgba(255,255,255,0.45); }
[data-mapstyle="dark"] .map-attr, [data-base="dark"] .map-attr { color: rgba(255,255,255,0.30); text-shadow: 0 0 2px rgba(0,0,0,0.45); }
.map-art-wrap.has-tiles { background: #e8eaed; }
.map-pin { position: absolute; left: 50%; top: 50%; width: 24px; transform: translate(-50%, -88%); filter: drop-shadow(0 4px 5px rgba(0,0,0,0.35)); pointer-events: none; z-index: 1; }
.map-pin svg { width: 100%; height: auto; display: block; }
/* marker with a photo (a rounded image card above a glowing dot) */
.map-dot { position: absolute; left: 50%; top: 50%; width: 16px; height: 16px; border-radius: 50%; transform: translate(-50%, -50%); background: var(--map-pin, var(--accent)); border: 3px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,0.12), 0 0 16px 2px color-mix(in srgb, var(--map-pin, var(--accent)) 70%, transparent); z-index: 1; pointer-events: none; }
.map-photo { position: absolute; left: 50%; bottom: calc(50% + 14px); transform: translateX(-50%); width: 84px; height: 60px; border-radius: 12px; background-size: cover; background-position: center; border: 3px solid #fff; box-shadow: 0 10px 22px -6px rgba(0,0,0,0.45); z-index: 2; pointer-events: none; }
.map-photo::after { content: ""; position: absolute; left: 50%; bottom: -7px; transform: translateX(-50%); border: 5px solid transparent; border-top-color: #fff; }
/* custom photo marker — the image IS the marker, clipped to the shape, sized to fit (never overflows) */
.map-imark { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: clamp(40px, 22%, 54px); aspect-ratio: 1 / 1; background-size: cover; background-position: center; border: 3px solid #fff; box-shadow: 0 6px 16px -5px rgba(0,0,0,0.5); z-index: 2; pointer-events: none; }
.map-imark.mim-circle { border-radius: 50%; }
.map-imark.mim-square { border-radius: 12px; }
.map-imark .mim-tail { position: absolute; left: 50%; bottom: -7px; transform: translateX(-50%); width: 0; height: 0; border: 5px solid transparent; border-top-color: #fff; }
/* standalone marker shapes (Design → Map → Marker shape) */
.map-dot.solo { width: 18px; height: 18px; }
.map-square { position: absolute; left: 50%; top: 50%; width: 22px; height: 22px; border-radius: 7px; transform: translate(-50%, -50%); background: var(--map-pin, var(--accent)); border: 3px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,0.12), 0 6px 14px -4px color-mix(in srgb, var(--map-pin, var(--accent)) 70%, transparent); z-index: 1; pointer-events: none; }
/* blinking marker — a pulsing ring under the pin/dot, centred on the marker point */
.map-pulse { position: absolute; left: 50%; top: 50%; width: 14px; height: 14px; border-radius: 50%; transform: translate(-50%, -50%); background: var(--map-pin, var(--accent)); z-index: 1; pointer-events: none; animation: mapPulse 1.9s ease-out infinite; }
@keyframes mapPulse { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--map-pin, var(--accent)) 55%, transparent); opacity: .85; } 70% { box-shadow: 0 0 0 16px transparent; opacity: 0; } 100% { box-shadow: 0 0 0 0 transparent; opacity: 0; } }
/* with a custom photo marker, sit the pulse at the marker's base so the ring radiates below it (not hidden behind) */
.map-pulse.mp-img { top: calc(50% + clamp(20px, 11%, 27px)); }
@media (prefers-reduced-motion: reduce) { .map-pulse { animation: none; opacity: 0; } }
.map-tx { display: block; min-width: 0; }
/* titles/addresses WRAP (up to 2 lines) instead of truncating to one ellipsis'd line */
.map-ot { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: clamp(16px, 2.1cqw, 20px); color: var(--h1-color, var(--ink)); letter-spacing: -0.01em; line-height: 1.2; text-wrap: balance; }
.map-os { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-family: var(--ds-font, var(--font)); color: var(--ds-color, var(--ink-dim)); font-size: 14px; margin-top: 3px; line-height: 1.3; }
/* ---- MAP: the map core fills the card; text/button carve space out of it (overlay when wide,
   a bottom panel when small). Two frames, theme-decided: BLEED = map is the card surface
   (edge-to-edge) · INSET = a rounded map sitting inside the card's padding. ---- */
.wg-map.map-full { gap: 0; position: relative; overflow: hidden; display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 150px; }
.map-hit { position: absolute; inset: 0; z-index: 1; background: transparent; border: 0; padding: 0; cursor: pointer; }
/* the map art */
.map-full .map-art-wrap { position: relative; flex: 1 1 auto; min-height: 0; z-index: 0; }
/* scrims + overlaid text/button (wide) */
.map-scrim { position: absolute; left: 0; right: 0; z-index: 2; pointer-events: none; }
.map-scrim-top { top: 0; height: 46%; background: linear-gradient(to bottom, rgba(0,0,0,0.6), transparent); }
.map-scrim-bot { bottom: 0; height: 56%; background: linear-gradient(to top, rgba(0,0,0,0.66), transparent); }
.map-head { position: absolute; top: 0; left: 0; right: 0; z-index: 3; padding: clamp(16px, 2.4cqw, 26px); pointer-events: none; }
.map-foot { position: absolute; bottom: 0; left: 0; right: 0; z-index: 3; padding: clamp(14px, 2.2cqw, 22px); display: flex; justify-content: flex-end; pointer-events: none; }
.map-wide.map-bleed .map-ot { color: #fff; font-size: clamp(20px, 3.4cqw, 34px); }
.map-wide.map-bleed .map-os { color: rgba(255,255,255,0.85); font-size: clamp(13px, 1.7cqw, 16px); }
.map-wide .map-ot { font-size: clamp(20px, 3.4cqw, 34px); }
.map-btn { pointer-events: auto; flex: 0 0 auto; }
/* small (tall / square) → content sits in a bottom panel; the map fills (and centres) above it */
.map-sm .map-panel { position: relative; z-index: 3; padding: clamp(15px, 5cqw, 20px); display: flex; flex-direction: column; gap: 11px; }
.map-sm .map-panel .map-btn { align-self: stretch; text-align: center; justify-content: center; }
/* ---- BLEED frame: the map IS the card surface ---- */
.wg-map.map-bleed { padding: 0 !important; background: var(--map-land); }
.w[data-i] .card.map-bleed, .wm-card.map-bleed { outline: none !important; border: 0 !important; box-shadow: var(--card-drop, 0 16px 40px -30px rgba(0,0,0,0.4)) !important; }
.wg-map.map-bleed::after { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px solid color-mix(in srgb, var(--map-ink) 12%, transparent); pointer-events: none; z-index: 4; }
.map-bleed .map-art-wrap { border-radius: inherit; }
.map-bleed.map-wide .map-art-wrap { position: absolute; inset: 0; } /* wide: overlays float on the full map */
.map-bleed.map-sm .map-art-wrap { border-radius: 0; } /* small: bottom sits flush against the panel (card overflow rounds the top) — no corner notch */
.map-bleed.map-sm .map-panel { background: var(--card-bg); border-top: 1px solid var(--card-border); }
.map-bleed.map-sm .map-panel .map-ot { color: var(--h1-color, var(--ink)); }
.map-bleed.map-sm .map-panel .map-os { color: var(--ds-color, var(--ink-dim)); }
/* ---- INSET frame: a rounded map inside the card's own padding + surface ---- */
.wg-map.map-inset { --map-pad: clamp(14px, 2.2cqw, 20px); padding: var(--map-pad) !important; background: var(--card-bg); }
.map-inset .map-art-wrap { border-radius: var(--in-radius, 16px); overflow: hidden; }
.map-inset.map-wide .map-art-wrap { position: absolute; inset: var(--map-pad); } /* wide: map fills the padded area, overlays float on it */
.map-inset.map-wide .map-head { padding: calc(var(--map-pad) + 12px); }
.map-inset.map-wide .map-foot { padding: calc(var(--map-pad) + 12px); }
.map-inset.map-wide .map-ot { color: #fff; }
.map-inset.map-wide .map-os { color: rgba(255,255,255,0.85); }
/* inset small → map on top, content below inside the card surface (no separate solid strip) */
.map-inset.map-sm .map-panel { padding: clamp(13px, 3cqw, 16px) 2px 2px; }
.map-inset.map-sm .map-panel .map-ot { color: var(--h1-color, var(--ink)); }
.map-inset.map-sm .map-panel .map-os { color: var(--ds-color, var(--ink-dim)); }
/* map preview in the preset Map tab */
.map-prevbox { position: relative; width: 100%; height: 92px; border-radius: 12px; overflow: hidden; margin-bottom: 6px; }
/* empty-space block — invisible on the live site, a faint guide in the editor */
.wg-spacer { position: relative; width: 100%; height: 100%; min-height: 32px; display: flex; align-items: center; justify-content: center; }
.wg-spacer.is-edit { min-height: 44px; border: 1.5px dashed var(--hair, rgba(255,255,255,0.16)); border-radius: 14px; }
.wg-spacer .sp-hint { font-family: var(--font); font-size: 12px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint, rgba(255,255,255,0.4)); pointer-events: none; }
/* in Preview / on the live site the spacer is pure whitespace — no guide, no label */
body.preview .wg-spacer.is-edit { border: none; }
body.preview .wg-spacer .sp-hint { display: none; }
/* ---- BUTTONS (multiple links) ---- */
.wg-buttons { gap: 10px; justify-content: center; }
.wg-btnstack { display: flex; flex-direction: column; gap: 9px; }
.wg-btn { display: flex; align-items: center; justify-content: center; gap: 9px; text-decoration: none; padding: 14px 16px; border-radius: var(--btn-radius, calc(var(--radius) * 0.55 + 6px)); background: var(--btn-bg, #fff); color: var(--btn-text, #111); font-family: var(--btn-font, var(--lb-font, var(--font))); font-weight: var(--btn-weight, 650); font-size: calc(15px * var(--btn-size, 1)); transition: transform .15s, filter .15s; }
.wg-btn:hover { transform: translateY(-1px); filter: brightness(.96); }
.wg-btn-ic { display: grid; }
.wg-btn-ic svg { width: 18px; height: 18px; }
/* ---- INSTAGRAM (profile) ---- */
/* ---- ICONS ---- */
.wg-icons { justify-content: center; }
.wg-iconrow { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.wg-ico { width: 46px; height: 46px; border-radius: calc(var(--radius) * 0.4 + 4px); display: grid; place-items: center; background: var(--icon-bg, color-mix(in srgb, var(--ink) 8%, transparent)); border: 1px solid var(--icon-bd, var(--card-border)); color: var(--icon-fg, var(--icon-color, var(--ink))); transition: transform .15s; }
.wg-ico:hover { transform: translateY(-2px); }
.wg-ico svg { width: 22px; height: 22px; }
/* buttons everywhere: keep their icon small (was rendering giant) */
/* base CTA button — wears the preset's button tokens (incl. pill radius) everywhere */
/* + expand affordance — TOP-right, like nxtwk */
/* + expand: derives from the card's own ink, so it auto-matches every card style
   (glass, solid, coloured multi…) with no separate setting. */
.w-expand { position: absolute; right: 12px; top: 12px; width: 32px; height: 32px; border-radius: 50%; border: 1px solid color-mix(in srgb, var(--ink) 20%, transparent); cursor: pointer; display: grid; place-items: center; background: color-mix(in srgb, var(--ink) 12%, transparent); color: var(--ink); backdrop-filter: blur(10px); opacity: .9; transition: opacity .15s, transform .15s; z-index: 6; }
.w-expand:hover { opacity: 1; transform: scale(1.08); }
.w-expand svg { width: 17px; height: 17px; }
body.is-owner .w-expand { display: none; } /* hide while editing (tools take the corner); shows in preview/public */
body.is-owner.preview .w-expand { display: grid; }
/* ===================== expand modal — centered, max 1240, themed glass (nxtwk morph) ===================== */
/* scrim itself scrolls; the card centres via margin:auto when it fits, and top-aligns (top reachable)
   when it's taller than the viewport — align-items:center would clip the top out of the scroll area */
.wm-scrim { position: fixed; inset: 0; z-index: 200; display: none; overflow-y: auto; padding: clamp(14px, 3cqw, 40px); background: rgba(4,4,8,0.42); opacity: 0; transition: opacity .26s ease; }
.wm-scrim.on { display: flex; opacity: 1; }
.wm-card { margin: auto; }
/* opaque element background so a low-opacity / glass card never shows the page through the modal (scroll-safe, covers every fill; image/gradient/duotone paint their own opaque bg on top) */
.wm-card { display: block; position: relative; width: min(1240px, 100%); max-height: 100%; overflow-y: auto; -webkit-overflow-scrolling: touch; border-radius: clamp(22px, 3cqw, 34px); color: var(--ink); padding: clamp(26px, 4cqw, 52px); background: var(--wm-solid, #15151b); }
/* the morph: source card (name set inline in JS, old state) and modal share a
   name so the browser tweens card → modal. */
.wm-card { view-transition-name: wmorph; }
::view-transition-group(wmorph) { animation-duration: .42s; animation-timing-function: cubic-bezier(.32,.72,0,1); }
::view-transition-old(wmorph), ::view-transition-new(wmorph) { border-radius: clamp(22px, 3cqw, 34px); overflow: clip; height: 100%; }
/* siblings recede while a card is expanded */
body.wm-open #grid .w { transition: opacity .3s ease, transform .3s ease; }
body.wm-open #grid .w.wm-source { opacity: 0; }
/* the modal mirrors a big glass card so it reads as part of the theme */
/* fallback glass — only when the modal has no specific fill (otherwise the fill rules above win) */
[data-base="dark"] .wm-card:not([data-fill]) { background: rgba(18,18,24,0.5); border: 1px solid rgba(255,255,255,0.16); box-shadow: inset 0 1px 0 0 rgba(255,255,255,0.22), inset 0 -1px 0 0 rgba(0,0,0,0.25), 0 50px 100px -30px rgba(0,0,0,0.7); backdrop-filter: blur(44px) saturate(160%); -webkit-backdrop-filter: blur(44px) saturate(160%); }
[data-base="light"] .wm-card:not([data-fill]) { background: rgba(252,250,247,0.72); border: 1px solid rgba(0,0,0,0.08); box-shadow: inset 0 1px 0 0 rgba(255,255,255,0.6), 0 50px 100px -30px rgba(0,0,0,0.3); backdrop-filter: blur(44px) saturate(150%); -webkit-backdrop-filter: blur(44px) saturate(150%); }
.wm-body { max-width: 1040px; margin: 0 auto; }
/* text-led modals read better narrow; media-led ones use the full width */
.wg-contact .wm-body, .wg-whatsapp .wm-body, .wg-form .wm-body, .wg-hours .wm-body { max-width: 680px; }
/* sticky top bar keeps the close button visible while the modal scrolls */
.wm-top { position: sticky; top: 0; height: 0; z-index: 20; pointer-events: none; }
.wm-x { position: absolute; top: 4px; right: 0; width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--card-border); background: color-mix(in srgb, var(--wm-solid, #15151b) 88%, var(--ink)); color: var(--ink); display: grid; place-items: center; cursor: pointer; z-index: 20; pointer-events: auto; backdrop-filter: blur(6px); }
/* keep the expanded map a sensible size (not full-screen) */
.wx-mapart { aspect-ratio: 16 / 9; max-height: min(46vh, 380px); margin-left: auto; margin-right: auto; }
.wm-x:hover { background: color-mix(in srgb, var(--ink) 16%, transparent); }
.wm-x svg { width: 17px; height: 17px; }
/* ---- REVIEWS ---- */
.wg-reviews { display: flex; flex-direction: column; gap: 14px; justify-content: center; }
.rv-rating { display: flex; align-items: center; gap: 14px; }
.rv-num { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 800); font-size: clamp(34px, 7cqw, 54px); line-height: 1; color: var(--ink); letter-spacing: -0.02em; }
.rv-rmeta { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.rv-stars { display: inline-flex; gap: 2px; color: color-mix(in srgb, var(--ink) 28%, transparent); flex: 0 0 auto; }
.rv-star { width: 16px; height: 16px; display: inline-grid; place-items: center; }
.rv-star svg { width: 100%; height: 100%; }
.rv-star.on { color: #f5a623; }
.rv-stars.sm .rv-star { width: 13px; height: 13px; }
.rv-count { font-family: var(--ds-font, var(--font)); font-size: 13px; color: var(--ink-dim); }
.rv-cards { display: flex; flex-direction: column; gap: 10px; }
.wg-reviews.sz-l .rv-cards { display: grid; grid-template-columns: 1fr 1fr; }
.rv-card { background: var(--in-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: var(--in-border-w, 1px) solid var(--in-border, transparent); border-radius: min(var(--in-radius, 16px), 18px); padding: 14px 15px; display: flex; flex-direction: column; gap: 8px; }
.rv-quote { font-family: var(--ds-font, var(--font)); font-size: 14.5px; line-height: 1.5; color: var(--in-ink, var(--ink)); margin: 0; }
/* truncate long reviews on the CARD; the popup shows them in full */
.wg-reviews .rv-quote { display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
.rv-card-full .rv-quote { display: block; -webkit-line-clamp: unset; overflow: visible; }
.rv-by { display: flex; align-items: center; gap: 8px; }
.rv-av { width: 24px; height: 24px; border-radius: 50%; background-size: cover; background-position: center; flex: 0 0 auto; background-color: color-mix(in srgb, var(--ink) 12%, transparent); }
.rv-author { font-family: var(--lb-font, var(--font)); font-weight: 650; font-size: 13px; color: var(--lb-color, var(--ink)); }
.rv-when { font-family: var(--ds-font, var(--font)); font-size: 12px; color: var(--ink-faint); }
.rv-invite { font-family: var(--ds-font, var(--font)); font-size: 14px; color: var(--ink-dim); margin: 0; }
/* popup: content-sized panel — card stays display:block so the sticky .wm-top keeps the X pinned
   to the top while the reviews list scrolls (a flex card breaks position:sticky on its scroller) */
/* the MODAL reviews card must stay block (the inline .wg-reviews rule above flexes + centres it, which
   pushes a tall review list's top out of the scroll area — top becomes unreachable). Block = top-aligned. */
.wm-card.wg-reviews { display: block; }
.wm-card.wg-reviews .wm-body { display: flex; flex-direction: column; }
.rv-modal { display: flex; flex-direction: column; gap: 18px; }
.wm-card.wg-reviews .rv-cta { margin-top: 4px; }
.rv-mhead { display: flex; align-items: center; gap: 16px; margin: 0; }
.rv-bignum { font-family: var(--h1-font, var(--font)); font-weight: 800; font-size: clamp(40px, 9cqw, 62px); line-height: 1; color: var(--ink); }
.rv-bigmeta { display: flex; flex-direction: column; gap: 6px; }
.rv-bigmeta .rv-star { width: 20px; height: 20px; }
.rv-mlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; align-content: start; }
.rv-mfoot { display: flex; flex-direction: column; align-items: center; gap: 16px; margin-top: 22px; }
.rv-modal .rv-cta { justify-content: center; min-width: 240px; } /* use the preset's button style (colour/style/radius), not a hardcoded accent */
.rv-cta svg { width: 16px; height: 16px; }
.rv-seeall { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); font-size: 13.5px; font-weight: 600; text-decoration: none; }
.rv-seeall:hover { color: var(--ink); }
@container (max-width: 720px) { .wg-reviews.sz-l .rv-cards { grid-template-columns: 1fr; } }
/* ── Menu widget — themed rows, inset (never-bleeding) thumbnail, accent price ── */
.wg-menu .mn-list { display: flex; flex-direction: column; }
.mn-row { display: flex; align-items: center; gap: 14px; padding: 9px 0; border-bottom: 1px solid var(--hair); }
.mn-list .mn-row:last-child { border-bottom: 0; }
.mn-thumb { width: 56px; height: 56px; flex: 0 0 auto; background-size: cover; background-position: center; border-radius: 14px; }
.mn-tx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.mn-nm { font-family: var(--lb-font, var(--font)); font-weight: 700; color: var(--lb-color, var(--ink)); display: flex; align-items: center; gap: 8px; font-size: 16px; line-height: 1.2; }
.mn-desc { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); font-size: 13.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mn-price { font-family: var(--lb-font, var(--font)); flex: 0 0 auto; font-weight: 700; color: var(--accent); font-size: 15px; }
.mn-tag { font-size: 10.5px; font-weight: 800; letter-spacing: .02em; padding: 2px 8px; border-radius: 999px; background: color-mix(in srgb, var(--accent) 16%, transparent); color: var(--accent); }
.mn-min { gap: 8px; }
.mn-min .mn-dots { flex: 1 1 auto; align-self: flex-end; border-bottom: 1.5px dotted var(--ink-faint); margin: 0 4px 6px; }
.mn-min .mn-nm { font-size: 15px; }
.mn-more { margin-top: 13px; align-self: flex-start; background: none; border: 0; cursor: pointer; color: var(--accent); font-weight: 700; font-family: inherit; font-size: 14px; display: inline-flex; align-items: center; gap: 7px; padding: 0; }
.mn-more-ar, .mn-more-ar svg { width: 16px; height: 16px; display: inline-grid; }
.mn-empty { display: flex; flex-direction: column; align-items: center; gap: 10px; color: var(--ink-faint); padding: 18px 0; }
.mn-empty svg { width: 28px; height: 28px; }
/* thumbnails follow the preset's image shape/shadow (Design → Images), like .ti-img */
[data-img-shape="square"] .mn-thumb { border-radius: 4px; }
[data-img-shape="round"] .mn-thumb { border-radius: 14px; }
[data-img-shape="squircle"] .mn-thumb { border-radius: 20px; corner-shape: squircle; }
[data-img-shape="pill"] .mn-thumb, [data-img-shape="circle"] .mn-thumb { border-radius: 50%; }
[data-img-shadow="soft"] .mn-thumb { box-shadow: 0 8px 18px -10px rgba(0,0,0,.45); }
[data-img-shadow="strong"] .mn-thumb { box-shadow: 0 12px 26px -10px rgba(0,0,0,.6); }
/* expand modal — the full menu (left-aligned head, category pills, zoomable photos) */
.mn-modal .mn-htx { display: flex; flex-direction: column; align-items: flex-start; gap: 5px; }
.mn-modal .mn-mlist { display: flex; flex-direction: column; }
.mn-modal .mn-row { padding: 14px 0; }
/* tag section titles — shown only under "All" (hidden when a single tag is filtered) */
.mn-grouph { font-family: var(--lb-font, var(--font)); font-size: 12.5px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); margin: 20px 0 4px; }
.mn-group:first-child .mn-grouph { margin-top: 2px; }
.mn-modal .mn-thumb { width: 64px; height: 64px; }
.mn-group { display: none; }
.mn-group.on { display: block; }
.mn-zoomable { cursor: zoom-in; }
.mn-zoom { position: fixed; inset: 0; z-index: 400; background: rgba(0,0,0,0.82); backdrop-filter: blur(8px); display: grid; place-items: center; padding: 24px; cursor: zoom-out; animation: mnZoomIn .16s ease; }
@keyframes mnZoomIn { from { opacity: 0; } to { opacity: 1; } }
.mn-zoom img { max-width: min(92vw, 720px); max-height: 86vh; border-radius: 22px; box-shadow: 0 30px 80px -20px rgba(0,0,0,.7); }
.mn-zoom-x { position: absolute; top: 18px; right: 18px; width: 42px; height: 42px; border-radius: 50%; border: 0; background: rgba(255,255,255,0.16); color: #fff; cursor: pointer; display: grid; place-items: center; }
.mn-zoom-x svg { width: 20px; height: 20px; }
/* item editor: multi-select tag chips (+ add new) + tag chips on a settings row */
.mn-tagsel { display: flex; flex-wrap: wrap; gap: 7px; align-items: center; }
.mn-tchip { padding: 7px 13px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.14); background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.72); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; transition: background .12s, color .12s, border-color .12s; }
.mn-tchip:hover { background: rgba(255,255,255,0.1); color: #fff; }
.mn-tchip.on { background: #fff; color: #111; border-color: #fff; }
.mn-tagadd { display: inline-flex; align-items: center; gap: 5px; }
.mn-taginput { height: 36px !important; width: 124px; padding: 6px 12px !important; font-size: 13px !important; border-radius: 999px !important; }
.mn-tagaddbtn { width: 36px; height: 36px; flex: 0 0 auto; border-radius: 50%; border: 1px dashed rgba(255,255,255,0.26); background: transparent; color: rgba(255,255,255,0.7); cursor: pointer; display: grid; place-items: center; }
.mn-tagaddbtn:hover { color: #fff; border-color: rgba(255,255,255,0.5); }
.mn-tagaddbtn svg { width: 16px; height: 16px; }
/* settings rows + item modal */
.fm-2col { display: flex; gap: 10px; }
.fm-2col .field { flex: 1 1 0; min-width: 0; }
/* picker preview + settings editor */
.pk-rvnum { font-weight: 800; font-size: 15px; color: var(--ink, #fff); }
.pk-rvstars { color: var(--qck, #C87F5E); font-size: 10px; letter-spacing: 1px; }
.rv-edit { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; padding: 10px; margin-bottom: 8px; }
.rv-edit-top { display: flex; gap: 8px; margin-bottom: 8px; }
.rv-edit-top .input { flex: 1; min-width: 0; }
.rv-rate-stars { display: inline-flex; gap: 1px; flex: 0 0 auto; }
.rv-rs { width: 26px; height: 26px; padding: 4px; background: none; border: 0; cursor: pointer; color: rgba(255,255,255,0.18); display: grid; place-items: center; }
.rv-rs svg { width: 100%; height: 100%; }
.rv-rs.on { color: var(--qck, #C87F5E); }
.rv-rate-lg .rv-rs { width: 38px; height: 38px; padding: 5px; }
/* settings: compact review rows (tap to edit in a modal) */
.rv-row { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; padding: 11px 12px; margin-bottom: 8px; cursor: pointer; color: inherit; font: inherit; }
.rv-row:hover { border-color: rgba(255,255,255,0.2); }
.rv-row-stars { flex: 0 0 auto; }
.rv-row-stars .rv-star { width: 12px; height: 12px; }
.rv-row-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.rv-row-author { font-weight: 650; font-size: 13px; color: #fff; }
.rv-row-snippet { font-size: 12.5px; color: rgba(255,255,255,0.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rv-row-del { flex: 0 0 auto; width: 28px; height: 28px; border: 0; background: none; color: rgba(255,255,255,0.4); cursor: pointer; border-radius: 8px; display: grid; place-items: center; }
.rv-row-del:hover { background: rgba(255,255,255,0.1); color: #fff; }
.rv-row-del svg { width: 15px; height: 15px; }
/* card — collect mode */
.rv-collect { gap: 12px; }
.rv-fakebtn { display: inline-flex; align-items: center; gap: 8px; align-self: flex-start; padding: 11px 18px; border-radius: var(--btn-radius, 999px); background: var(--btn-bg, var(--accent)); color: var(--btn-text, #fff); font-family: var(--btn-font, var(--font)); font-weight: 700; font-size: 14px; }
.rv-fakebtn svg { width: 15px; height: 15px; }
.rv-tag { font-family: var(--ds-font, var(--font)); display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--accent); font-weight: 650; margin-top: 6px; }
.rv-tag svg { width: 12px; height: 12px; }
/* modal — write panel (collect) */
.rv-write { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; padding: 22px; border-radius: 18px; background: var(--in-bg, color-mix(in srgb, var(--ink) 6%, transparent)); }
.rv-write-t { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-size: 20px; color: var(--ink); }
.rv-write .rv-stars.big .rv-star { width: 30px; height: 30px; }
.rv-write .rv-cta { align-self: stretch; }
.rv-write-note { font-family: var(--ds-font, var(--font)); font-size: 12px; color: var(--ink-faint); }
.wx-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 24px; }
.wx-head h2 { margin: 0; font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); font-size: clamp(28px, 5cqw, 44px); color: var(--ink); letter-spacing: -0.02em; }
/* hours week */
.wx-week { display: flex; flex-direction: column; }
.wk-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 4px; border-bottom: 1px solid var(--hair); }
.wk-row:last-child { border-bottom: 0; }
.wk-row.today { color: var(--accent); }
.wk-day { display: flex; align-items: baseline; gap: 8px; font-family: var(--lb-font, var(--font)); }
.wk-day b { font-weight: 650; }
.wk-date { font-family: var(--ds-font, var(--font)); font-size: 12px; color: var(--ink-faint); }
.wk-row.today .wk-date { color: var(--accent); }
.wk-time { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); }
.wk-row.today .wk-time { color: var(--accent); font-weight: 650; }
/* image / gallery expanded */
.wx-image { width: 100%; aspect-ratio: 4/3; border-radius: 16px; background-size: cover; background-position: center; }
/* expanded image modal: centered, as big as fits the screen, natural aspect */
.wx-image-box { display: grid; place-items: center; width: 100%; }
.wx-image-img { max-width: 100%; max-height: 72vh; border-radius: 14px; display: block; object-fit: contain; }
/* "Open full screen" means FULL screen: max-width alone never scales a photo UP, so a modest
   source sat tiny in the middle of a big empty sheet. Fill the width, cap on height. */
.wx-photo { width: 100%; height: auto; }
.wx-cap { font-family: var(--ds-font, var(--font)); margin-top: 12px; color: var(--ink-dim); font-size: 14px; }
.wx-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 12px; }
.wx-cell { aspect-ratio: 1; border-radius: 14px; background-size: cover; background-position: center; }
/* whatsapp / form expanded */
.wx-form { display: flex; flex-direction: column; gap: 14px; }
/* whatsapp modal — chat composer */
/* whatsapp modal — a real chat window: header + bubble + chips at top, composer pinned bottom */
.wg-whatsapp .wm-body { height: 100%; display: flex; flex-direction: column; }
.wa-modal { display: flex; flex-direction: column; gap: 18px; flex: 1 1 auto; min-height: 0; }
.wa-mhead { display: flex; align-items: center; gap: 14px; flex: 0 0 auto; }
.wa-mstream { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.wa-composer { flex: 0 0 auto; }
.wa-mstream .wa-bubble { font-size: 16px; padding: 13px 17px; }
/* quick replies wear the preset's BUTTON style (sized as chips) */
.wa-qr { padding: 9px 16px; font-size: 14px; min-width: 0; }
.wa-composer { display: flex; align-items: stretch; gap: 10px; margin-top: 6px; }
.wa-input2 { flex: 1; min-width: 0; height: 54px; border-radius: min(var(--input-radius, 14px), 27px); background: var(--input-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: 1px solid var(--input-bd, var(--card-border)); color: var(--input-ink, var(--ink)); padding: 0 18px; font: inherit; font-size: 16px; outline: none; }
.wa-input2::placeholder { color: color-mix(in srgb, var(--input-ink, var(--ink)) 50%, transparent); }
/* focus colour follows the input's own Colour setting (not the accent) */
.wa-input2:focus, .wg-input:focus { border-color: var(--input-color, var(--ink)); }
/* generic themeable input class (for the preview + future fields) */
.wg-input { background: var(--input-bg); border: 1px solid var(--input-bd); border-radius: min(var(--input-radius, 14px), 27px); color: var(--input-ink); }
.wa-send2 { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 9px; height: 54px; padding: 0 22px; }
.wa-send2 svg { width: 20px; height: 20px; }
/* whatsapp settings: quick-reply rows (subtle remove, tidy spacing) */
.wa-presets { display: flex; flex-direction: column; gap: 10px; margin-bottom: 10px; }
.wa-prow { display: flex; align-items: center; gap: 8px; }
.wa-prow .input { flex: 1; }
.wa-prow .wa-px { width: 38px; height: 46px; flex: 0 0 auto; border: 0; background: transparent; color: rgba(255,255,255,0.4); display: grid; place-items: center; border-radius: 9px; cursor: pointer; transition: background .12s, color .12s; }
.wa-prow .wa-px:hover { background: rgba(255,255,255,0.08); color: #fff; }
.wa-prow .wa-px svg { width: 16px; height: 16px; }
.ff { display: flex; flex-direction: column; gap: 7px; }
.ff > span { font-family: var(--lb-font, var(--font)); font-size: 13px; font-weight: 600; color: var(--ink-dim); }
.wx-form .input, .wa-compose .input { background: color-mix(in srgb, var(--ink) 5%, transparent); border: 1px solid var(--card-border); color: var(--ink); border-radius: 12px; padding: 12px 14px; font: inherit; font-family: var(--ds-font, var(--font)); }
/* map expanded */
.wx-mapart { position: relative; width: 100%; aspect-ratio: 16/10; border-radius: 16px; overflow: hidden; margin-bottom: 14px; }
.wx-mapart .map-art-wrap { width: 100%; height: 100%; border-radius: 16px; }
.wx-mapart .map-pin { width: 30px; }
.wx-addr { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-radius: 12px; background: color-mix(in srgb, var(--ink) 5%, transparent); margin-bottom: 12px; }
.wx-addr-ic { color: var(--accent); display: grid; place-items: center; flex: 0 0 auto; }
.wx-addr-ic svg { width: 20px; height: 20px; }
.wx-addr-tx { font-family: var(--ds-font, var(--font)); flex: 1 1 auto; min-width: 0; font-size: 14px; color: var(--ink-dim); line-height: 1.4; }
.wx-copy { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 5px; background: var(--btn-bg, #fff); color: var(--btn-text, #111); border: 0; border-radius: 9px; padding: 8px 12px; font-family: var(--font); font-weight: 650; font-size: 13px; cursor: pointer; }
.wx-copy svg { width: 15px; height: 15px; color: var(--btn-text, #111); }
.wx-copy:hover { filter: brightness(1.05); }
/* instagram expanded */
.wm-body .btn-cta { align-self: center; margin-top: 4px; }
/* widget content editor extras */
.gal-add { aspect-ratio: 1; border: 1px dashed rgba(255,255,255,0.22); background: rgba(255,255,255,0.04); border-radius: 10px; color: rgba(255,255,255,0.6); cursor: pointer; display: grid; place-items: center; }
.ff-row, .ic-row { display: flex; gap: 7px; align-items: center; margin-bottom: 8px; position: relative; }
.ff-row .input, .ic-row .input { flex: 1; min-width: 0; }
.ff-row .th-seg { flex: 0 0 auto; }
.ff-row .gal-x, .ic-row .gal-x { position: static; flex: 0 0 auto; background: rgba(255,255,255,0.1); }
.ic-sel { flex: 0 0 110px; }
/* ------------------------- editor chrome ------------------------- */
.w { position: relative; }
.w-tools { display: none; }
body.is-owner .w-tools {
  display: flex; gap: 6px; position: absolute; top: 10px; right: 10px; z-index: 5;
}
body.is-owner .w[data-i] { user-select: none; -webkit-user-select: none; }
body.is-owner .w[data-i] a, body.is-owner .w[data-i] img { -webkit-user-drag: none; user-select: none; }
body.preview .w[data-i] { user-select: auto; }
/* ── per-block device visibility ── public site hides; editor keeps it (dimmed + badge) */
/* public site AND Preview mode hide the block (grid reflows); the editor keeps it (dimmed + badge) */
/* simulated device preview (owner picks Mobile/Tablet — shrinks the canvas, not the viewport)
   → class-based and authoritative so the right blocks hide regardless of real screen width */
body.preview.dev-mobile .w.hide-mobile { display: none !important; }
body.preview.dev-tablet .w.hide-tablet { display: none !important; }
/* real viewport — the public site, and preview with no device simulation (desktop / actual phone) */
@media (max-width: 600px) { body:not(.is-owner) .w.hide-mobile, body.preview:not(.dev-mobile):not(.dev-tablet):not(.dev-desktop):not(.tilt) .w.hide-mobile { display: none !important; } }
@media (min-width: 601px) and (max-width: 1024px) { body:not(.is-owner) .w.hide-tablet, body.preview:not(.dev-mobile):not(.dev-tablet):not(.dev-desktop):not(.tilt) .w.hide-tablet { display: none !important; } }
@media (min-width: 1025px) { body:not(.is-owner) .w.hide-desktop, body.preview:not(.dev-mobile):not(.dev-tablet):not(.dev-desktop):not(.tilt) .w.hide-desktop { display: none !important; } }
/* tilt = a desktop-width canvas previewed on a phone → treat as desktop: show mobile/tablet-hidden, hide desktop-hidden */
body.preview.tilt .w.hide-desktop { display: none !important; }
/* "off" — a block disabled for everyone. Visitors + preview never see it; owner sees it dimmed with an Off badge so it can be turned back on. */
body:not(.is-owner) .w.w-off, body.preview .w.w-off { display: none !important; }
body:not(.is-owner) .wrap .sec-slot:has(> .w.w-off), body.preview .wrap .sec-slot:has(> .w.w-off) { display: none; }
body.is-owner:not(.preview) .w.w-off > .card { opacity: .42; filter: grayscale(.4); }
.w-offbadge { background: rgba(0,0,0,.78) !important; }
/* payment celebration: confetti + thank-you toast */
.clay-confetti { position: fixed; inset: 0; z-index: 300; pointer-events: none; overflow: hidden; }
.clay-confetti i { position: absolute; top: -24px; display: block; border-radius: 2px; animation-name: confFall; animation-timing-function: cubic-bezier(.25,.6,.55,1); animation-fill-mode: forwards; }
@keyframes confFall { 0% { transform: translateY(0) rotate(0); opacity: 1; } 100% { transform: translateY(108vh) rotate(560deg); opacity: .5; } }
.thanks-toast { position: fixed; left: 50%; bottom: 24px; transform: translate(-50%, 160%); z-index: 301; display: flex; align-items: center; gap: 13px; width: max-content; max-width: min(460px, calc(100vw - 28px)); padding: 13px 14px 13px 17px; border-radius: 16px; background: rgba(20,20,22,0.96); border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 18px 50px -16px rgba(0,0,0,0.7); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); transition: transform .32s cubic-bezier(.2,.8,.2,1); }
.thanks-toast.on { transform: translate(-50%, 0); }
.tt-emoji { font-size: 26px; flex: 0 0 auto; line-height: 1; }
.tt-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.tt-tx b { color: #fff; font-size: 14.5px; }
.tt-tx > span { color: rgba(255,255,255,0.6); font-size: 12.5px; }
.tt-share { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; background: #fff; color: #111; border: 0; border-radius: 10px; padding: 9px 13px; font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; }
.tt-share svg { width: 15px; height: 15px; }
.tt-x { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%; border: 0; background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.7); cursor: pointer; display: grid; place-items: center; }
.tt-x:hover { background: rgba(255,255,255,0.18); color: #fff; }
.tt-x svg { width: 14px; height: 14px; }
/* Pro-widget heads-up toast (owner, free site) */
.pro-toast { position: fixed; left: 50%; top: 16px; transform: translate(-50%, -180%); z-index: 301; display: flex; align-items: center; gap: 13px; width: max-content; max-width: min(480px, calc(100vw - 28px)); padding: 13px 14px 13px 16px; border-radius: 16px; background: rgba(20,20,22,0.96); border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 18px 50px -16px rgba(0,0,0,0.7); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); transition: transform .32s cubic-bezier(.2,.8,.2,1); }
.pro-toast.on { transform: translate(-50%, 0); }
.pt-ic { flex: 0 0 auto; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; background: rgba(200,127,94,0.16); color: #C87F5E; }
.pt-ic svg { width: 18px; height: 18px; }
.pt-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pt-tx b { color: #fff; font-size: 14px; }
.pt-tx > span { color: rgba(255,255,255,0.6); font-size: 12.5px; line-height: 1.4; }
.pt-up { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; background: #C87F5E; color: #fff; border: 0; border-radius: 10px; padding: 9px 14px; font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; }
.pt-up svg { width: 15px; height: 15px; }
.pt-up:hover { filter: brightness(1.06); }
.pt-x { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%; border: 0; background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.7); cursor: pointer; display: grid; place-items: center; }
.pt-x:hover { background: rgba(255,255,255,0.18); color: #fff; }
.pt-x svg { width: 14px; height: 14px; }
@media (max-width: 520px) { .pro-toast { flex-wrap: wrap; max-width: calc(100vw - 24px); } .pt-tx { flex: 1 1 100%; order: 2; } }
/* hidden blocks keep full opacity in the editor (the badge tells the story) so you can still design them; check the real layout in Preview */
/* on mobile the editor is a single column — the width tool does nothing, so hide it (height + reorder + settings stay) */
@media (max-width: 600px) { body.is-owner .w-tools [data-act="resize"] { display: none; } }
.w-hidebadge { position: absolute; left: 10px; top: 10px; z-index: 5; display: inline-flex; align-items: center; gap: 6px; background: rgba(0,0,0,0.62); color: #fff; border: 1px solid rgba(255,255,255,0.18); border-radius: 999px; padding: 5px 11px 5px 9px; font-size: 11.5px; font-weight: 650; backdrop-filter: blur(8px); text-transform: capitalize; }
.w-hidebadge svg { width: 14px; height: 14px; }
body.preview .w-hidebadge { display: none; }
/* visibility tab toggles */
.vis-offrow { display: flex; align-items: center; gap: 14px; width: 100%; text-align: left; background: #161617; border: 1px solid rgba(255,255,255,0.1); border-radius: 14px; padding: 14px 16px; margin-bottom: 22px; cursor: pointer; font: inherit; color: #fff; transition: border-color .12s; }
.vis-offrow:hover { border-color: rgba(255,255,255,0.26); }
.vis-offrow.off { border-color: rgba(200,127,94,.45); background: rgba(200,127,94,.07); }
.vis-offtx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.vis-offtx b { font-size: 14px; font-weight: 700; }
.vis-offtx span { font-size: 12.5px; color: rgba(255,255,255,0.55); line-height: 1.35; }
.vis-switch { flex: 0 0 auto; width: 46px; height: 28px; border-radius: 999px; background: rgba(255,255,255,0.16); position: relative; transition: background .15s; }
.vis-switch.on { background: #30D158; }
.vis-knob { position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%; background: #fff; transition: transform .15s; }
.vis-switch.on .vis-knob { transform: translateX(18px); }
.dev-toggles { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.dev-tog { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 16px 8px 12px; border: 1px solid rgba(255,255,255,0.12); border-radius: 14px; background: #161617; color: rgba(255,255,255,0.55); cursor: pointer; font: inherit; position: relative; transition: border-color .12s, color .12s; }
.dev-tog .dev-ic svg { width: 26px; height: 26px; }
.dev-tog .dev-l { font-size: 13px; font-weight: 650; }
.dev-tog:hover { border-color: rgba(255,255,255,0.3); }
.dev-tog.on { color: #fff; border-color: #fff; }
.dev-ck { position: absolute; top: 7px; right: 7px; color: var(--qck); }
.dev-ck svg { width: 15px; height: 15px; }
.dev-preset-row { display: flex; align-items: center; gap: 11px; width: 100%; margin-bottom: 10px; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; padding: 11px 13px; cursor: pointer; font: inherit; color: #fff; }
.dev-preset-row:hover { border-color: rgba(255,255,255,0.28); }
.dev-preset-row > svg:first-child { width: 19px; height: 19px; color: rgba(255,255,255,0.55); flex: 0 0 auto; }
.dev-preset-row .dpr-l { font-size: 14px; font-weight: 650; }
.dev-preset-row .dpr-cur { margin-left: auto; font-size: 13px; color: var(--qck); font-weight: 650; }
.dev-preset-row > svg:last-child { width: 14px; height: 14px; color: rgba(255,255,255,0.4); flex: 0 0 auto; }
.w-btn {
  width: 32px; height: 32px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.2);
  background: rgba(0,0,0,0.5); color: #fff; backdrop-filter: blur(8px);
  display: grid; place-items: center; cursor: pointer; padding: 0;
}
.w-btn:hover { background: rgba(0,0,0,0.72); }
.w-btn svg { width: 16px; height: 16px; }
.w-btn:disabled { opacity: .35; pointer-events: none; }
/* No move arrows on a card at all: sections reorder, widgets do not. The mobile stack keeps its
   own (.w-mtools), because there the order IS the layout. */
/* owner toolbar — centered pill in edit mode; collapses to a corner "Edit"
   button in preview mode (animated). */
/* claim-this-site (pre-built outreach sites) */
.claim-fab { position: fixed; left: 50%; bottom: 18px; z-index: 50; display: inline-flex; align-items: center; gap: 9px; padding: 13px 18px; border-radius: 999px; border: 0; cursor: pointer; background: #fff; color: #111; font: inherit; font-weight: 700; font-size: 15px; white-space: nowrap; box-shadow: 0 12px 30px -8px rgba(0,0,0,0.5); transform: translateX(-50%); animation: claimpulse 2.6s ease-in-out infinite; }
.claim-fab svg { width: 18px; height: 18px; }
@keyframes claimpulse { 0%,100% { transform: translateX(-50%) translateY(0); } 50% { transform: translateX(-50%) translateY(-3px); } }
.claim-ov { position: fixed; inset: 0; z-index: 70; background: rgba(4,4,8,0.55); backdrop-filter: blur(6px); display: flex; align-items: flex-end; justify-content: center; }
.claim-card { width: 100%; max-width: 540px; background: #161617; border: 1px solid rgba(255,255,255,0.1); border-bottom: 0; border-radius: 26px 26px 0 0; padding: 14px 22px calc(22px + env(safe-area-inset-bottom)); color: #f4f3f0; text-align: left; animation: claimUp .26s cubic-bezier(.2,.8,.2,1); }
@keyframes claimUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
.claim-card h2 { margin: 4px 0 6px; font-size: 22px; }
.claim-card p { margin: 0 0 16px; color: rgba(255,255,255,0.6); font-size: 14px; line-height: 1.5; }
.cb-ic { width: 32px; height: 32px; border-radius: 9px; background: color-mix(in srgb, var(--qck) 16%, transparent); color: var(--qck); display: grid; place-items: center; flex: 0 0 auto; }
.cb-ic svg { width: 17px; height: 17px; }
.claim-fine { margin: 11px 0 0 !important; text-align: center; color: rgba(255,255,255,0.42) !important; font-size: 12px !important; }
.claim-card .input { width: 100%; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.14); border-radius: 12px; color: #fff; font: inherit; font-size: 15px; padding: 13px 15px; outline: none; }
.claim-go { width: 100%; margin-top: 12px; background: #fff; color: #111; border: 0; border-radius: 12px; padding: 14px; font-weight: 700; font-size: 15px; cursor: pointer; }
.claim-google { width: 100%; margin-top: 12px; display: flex; align-items: center; justify-content: center; gap: 11px; background: #fff; color: #1f1f1f; border: 0; border-radius: 12px; padding: 14px; font: inherit; font-weight: 650; font-size: 15.5px; cursor: pointer; }
.claim-google:hover { background: #f3f3f3; }
.claim-google .g-logo { width: 20px; height: 20px; flex: 0 0 auto; }
.claim-peek { display: block; margin: 14px auto 2px; background: none; border: 0; color: rgba(255,255,255,0.55); font: inherit; font-size: 14px; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.claim-peek:hover { color: rgba(255,255,255,0.85); }
.claim-err { color: #ff8a8a; font-size: 13px; min-height: 16px; margin-top: 8px; }
.claim-x { background: none; border: 0; color: rgba(255,255,255,0.5); font: inherit; cursor: pointer; margin-top: 6px; }
/* no-signup draft: the "save & edit" fab is the primary action — orange, bottom-centre */
.draft-fab { left: 50%; transform: translateX(-50%); bottom: 22px; background: var(--qck, #C87F5E); color: #fff; padding: 13px 22px; font-size: 15px; white-space: nowrap; box-shadow: 0 14px 34px -12px rgba(200,127,94,.55); }
@media (max-width: 560px) { .draft-fab { bottom: 16px; padding: 11px 19px; font-size: 14px; gap: 7px; animation: none; box-shadow: 0 10px 26px -10px rgba(200,127,94,.5); } .draft-fab svg { width: 16px; height: 16px; } }
/* Draft "lite editor" bar — Design · Layout · Save(orange). Mirrors the editor pill so a pre-signup
   visitor can restyle their generated site (and it persists through the Google claim). */
.draft-bar { display: flex; position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%); z-index: 60; gap: 2px; padding: 7px; border-radius: 999px; align-items: center; max-width: calc(100vw - 20px); background: rgba(0,0,0,0.72); border: 1px solid rgba(255,255,255,0.16); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); font-family: var(--qck-font); box-shadow: 0 16px 40px -14px rgba(0,0,0,0.6); }
.draft-bar .db-btn { border: 0; cursor: pointer; font: inherit; font-size: 13.5px; font-weight: 600; color: #fff; background: transparent; padding: 10px 15px; border-radius: 999px; display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; }
.draft-bar .db-btn:hover { background: rgba(255,255,255,0.12); }
.draft-bar .db-btn svg { width: 16px; height: 16px; flex: 0 0 16px; }
.draft-bar .db-save { background: var(--qck,#C87F5E); color: #fff; margin-left: 4px; }
.draft-bar .db-save:hover { background: var(--qck,#C87F5E); filter: brightness(1.07); }
@media (max-width: 560px) { .draft-bar { bottom: 14px; } .draft-bar .db-btn { padding: 10px 13px; } }
.draft-info { position: fixed; left: 18px; bottom: 24px; z-index: 50; width: 44px; height: 44px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.16); background: rgba(20,20,23,0.9); color: #fff; backdrop-filter: blur(10px); cursor: pointer; display: grid; place-items: center; box-shadow: 0 12px 30px -8px rgba(0,0,0,0.5); }
.draft-info svg { width: 21px; height: 21px; }
.draft-info:hover { background: #000; }
.claim-bullets { list-style: none; text-align: left; margin: 2px 0 18px; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.claim-bullets li { display: flex; align-items: center; gap: 11px; font-size: 14px; font-weight: 550; color: #fff; line-height: 1.35; }
.claim-card .fm-phone { display: flex; gap: 8px; }
.claim-card .fm-phone .wa-cc { flex: 0 0 auto; }
.claim-card .fm-phone .input { flex: 1; }
/* narrow screens: the nav buttons go icon-only so the whole bar always fits the pill */
/* collapsible group (Add / Settings / separator) — margin gives the spacing so a
   collapsed group leaves NO phantom gap before the Edit button. */
/* device-preview group (desktop only) — reverse-collapses IN during preview */
.ed-dev { width: 38px; height: 38px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: transparent; border: 0; color: rgba(255,255,255,0.55); cursor: pointer; padding: 0; line-height: 0; flex: 0 0 38px; }
.ed-dev:hover { background: rgba(255,255,255,0.10); color: #fff; }
.ed-dev.on { background: rgba(255,255,255,0.26); color: #fff; }
.ed-dev svg { width: 19px; height: 19px; display: block; }
/* preview mode: slide pill to bottom-right, collapse Add/Settings out, devices in */
body.preview .ed-bar { transform: translateX(calc(50vw - 18px - 100%)); }
body.preview .ed-bar .ed-collapse { max-width: 0; opacity: 0; gap: 0; margin-right: 0; }
body.preview .ed-bar .ed-devices { max-width: 140px; opacity: 1; margin-right: 8px; }
@media (max-width: 760px) {
  .ed-bar .ed-devices { display: none !important; }   /* on a phone there's no desktop preview — just preview mobile on mobile */
}
/* hide per-widget editor chrome smoothly in preview */
.w-tools { transition: opacity .3s ease; }
body.preview .w-tools { opacity: 0; pointer-events: none; }
body.preview .w { cursor: default; }
/* save pill */
/* ------------------------- modal / sheet ------------------------- */
/* Clay builder chrome: black surfaces, warm top-glow, vivid orange (--qck). */
@media (min-width: 640px) {
  .scrim { place-items: center; padding: 24px; }
  .sheet { border-radius: 26px; }
}
/* big inputs */
/* contact settings: compact list of fields + per-field edit bottom-sheet */
.ic-trigger { width: 66px; height: 66px; border-radius: 16px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.05); color: #fff; display: grid; place-items: center; cursor: pointer; transition: background .12s, border-color .12s; }
.ic-trigger:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.32); }
.ic-trigger svg { width: 26px; height: 26px; }
.cf-list { display: flex; flex-direction: column; gap: 10px; margin: 4px 0 10px; }
.cf-row { display: flex; align-items: center; gap: 11px; padding: 10px 11px; border-radius: 14px; background: #141415; border: 1px solid rgba(255,255,255,0.08); }
.cf-row.cf-off { opacity: .5; }
/* A row with no icon. Sections all carry the same mark, so it identifies nothing and only pushes
   the name off the edge; the padding it was providing is put back here instead. */
.cf-row-plain { padding: 13px 15px; cursor: pointer; }
.cf-row-plain.on { outline: 2px solid var(--qck, #C87F5E); outline-offset: -2px; }
.cf-row-plain .cf-tx { min-width: 0; }
.cf-icon { width: 44px; height: 44px; flex: 0 0 auto; border-radius: 12px; }
.cf-icon svg { width: 20px; height: 20px; }
.cf-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.cf-name { font-size: 15px; font-weight: 700; color: #fff; }
.cf-val { font-size: 12.5px; color: rgba(255,255,255,0.5); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cf-val.empty { color: rgba(255,255,255,0.3); font-style: italic; }
.cf-acts { display: flex; gap: 5px; flex: 0 0 auto; }
.cf-mv, .cf-gear { width: 32px; height: 32px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.04); color: #fff; display: grid; place-items: center; cursor: pointer; transition: background .12s; }
.cf-mv:hover:not(:disabled), .cf-gear:hover { background: rgba(255,255,255,0.12); }
.cf-mv:disabled { opacity: 0.28; cursor: default; }
.cf-mv svg, .cf-gear svg { width: 16px; height: 16px; }
/* FINISH YOUR SITE — the generation list, ticked off. A box you tap, the job, and the door to where
   it is done. A ticked line stays visible and struck through rather than vanishing: seeing the ones
   you have finished is most of what makes a list worth opening a second time. */
.fin-row { align-items: flex-start; }
.fin-row .cf-name { font-weight: 600; white-space: normal; line-height: 1.35; }
.fin-row.done .cf-name { color: rgba(255,255,255,0.4); text-decoration: line-through; }
.fin-tick { flex: 0 0 auto; width: 22px; height: 22px; margin-top: 1px; border-radius: 7px; cursor: pointer;
  border: 1.5px solid rgba(255,255,255,0.28); background: transparent; display: grid; place-items: center; padding: 0; }
.fin-tick:hover { border-color: rgba(255,255,255,0.55); }
.fin-row.done .fin-tick { background: var(--qck, #C87F5E); border-color: var(--qck, #C87F5E); }
.fin-tick span { width: 10px; height: 6px; border-left: 2px solid #fff; border-bottom: 2px solid #fff;
  transform: rotate(-45deg) translate(1px, -1px); opacity: 0; }
.fin-row.done .fin-tick span { opacity: 1; }
.cf-icon-static { display: grid; place-items: center; background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.85); }
.cf-icon-static svg { width: 20px; height: 20px; }
/* Calendar-sync entry card (booking settings) — opens the sync wizard */
.cal-card { width: 100%; display: flex; align-items: center; gap: 12px; padding: 12px 13px; border-radius: 14px; background: #141415; border: 1px solid rgba(255,255,255,0.08); color: inherit; cursor: pointer; text-align: left; transition: border-color .12s, background .12s; }
.cal-card:hover { border-color: rgba(255,255,255,0.2); background: #18181a; }
.cal-card-ic { width: 42px; height: 42px; flex: 0 0 auto; border-radius: 12px; display: grid; place-items: center; background: color-mix(in srgb, #C87F5E 16%, transparent); color: #C87F5E; }
.cal-card-ic svg { width: 20px; height: 20px; }
.cal-card-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.cal-card-t { font-size: 15px; font-weight: 700; color: #fff; }
.cal-card-s { font-size: 12.5px; color: rgba(255,255,255,0.5); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cal-card-go { flex: 0 0 auto; font-size: 13px; font-weight: 650; color: #C87F5E; padding: 6px 12px; border-radius: 999px; background: color-mix(in srgb, #C87F5E 14%, transparent); }
/* field-modal: required toggle + choice options editor */
.fm-reqrow { margin: 14px 0 4px; }
.fm-opts { display: flex; flex-direction: column; gap: 8px; margin: 4px 0 10px; }
.fm-orow { display: flex; align-items: center; gap: 8px; }
.fm-oinp { flex: 1; min-width: 0; }
.fm-ox { flex: 0 0 auto; width: 36px; height: 36px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.7); display: grid; place-items: center; cursor: pointer; }
.fm-ox:hover { background: rgba(255,255,255,0.12); }
.fm-ox svg { width: 15px; height: 15px; }
.fm-oadd { margin-top: 2px; }
/* field edit bottom-sheet */
/* image picker (Your photos / Stock / Upload) */
/* uploads manager: search · filter · grid badges (bg flag, colour strip, multi quick-add) */
/* ── Desktop tilt preview (phone) ── */
.tilt-fab { position: fixed; bottom: 84px; right: 16px; z-index: 90; display: inline-flex; align-items: center; gap: 8px; padding: 11px 18px; border-radius: 999px; border: 0; background: rgba(20,20,22,0.94); color: #fff; font: inherit; font-weight: 650; cursor: pointer; box-shadow: 0 8px 30px rgba(0,0,0,.5); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.tilt-fab svg { width: 18px; height: 18px; }
body.tilt { overflow: hidden; background: #000; }
body.tilt .ed-fab { display: none !important; } /* keep the 📱/🖥 pill visible so you can flip back */
body.tilt .wrap { position: fixed; top: 0; left: 0; width: var(--tdw, 1180px); height: var(--tth); transform-origin: top left; overflow-y: auto; -webkit-overflow-scrolling: touch; z-index: 1; }
body.tilt:not(.tilt-flat) .wrap { transform: translateX(var(--tvw)) rotate(90deg) scale(var(--tts)); }
body.tilt.tilt-flat .wrap { transform: scale(var(--tts)); }
.tilt-exit { position: fixed; bottom: 18px; left: 50%; transform: translateX(-50%); z-index: 100002; display: inline-flex; align-items: center; gap: 8px; padding: 11px 20px; border-radius: 999px; border: 0; background: rgba(20,20,22,0.94); color: #fff; font: inherit; font-weight: 650; cursor: pointer; box-shadow: 0 8px 30px rgba(0,0,0,.5); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.tilt-exit svg { width: 16px; height: 16px; }
.tilt-hint { position: fixed; inset: 0; z-index: 100003; display: grid; place-items: center; background: rgba(0,0,0,0.72); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); padding: 24px; }
.tilt-hint-card { background: #18181b; color: #fff; border-radius: 22px; padding: 30px 26px; max-width: 330px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 16px; }
.tilt-hint-card > svg { width: 42px; height: 42px; color: #fff; }
.tilt-hint-card span { font-size: 16px; line-height: 1.5; color: rgba(255,255,255,.85); }
.tilt-hint-card .btn-cta { background: #fff; color: #111; border-radius: 12px; padding: 12px 26px; border: 0; font-weight: 700; cursor: pointer; }
.w-probadge { position: absolute; left: 10px; bottom: 10px; z-index: 6; display: inline-flex; align-items: center; gap: 5px; background: #C87F5E; color: #fff; border: 0; border-radius: 999px; padding: 5px 11px 5px 10px; font-size: 11.5px; font-weight: 700; cursor: pointer; box-shadow: 0 4px 14px rgba(200,127,94,.4); font-family: var(--qck-font); }
.w-probadge svg { width: 13px; height: 13px; }
body.preview .w-probadge { display: none; }
.conflict-ov { z-index: 100050; }
/* ── Pricing modal ── */
.pricing-card { width: min(600px, 94vw); max-width: none; } /* fixed so the card never resizes when the currency/price changes */
.pr-social { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: rgba(255,255,255,.62); margin: 0 0 18px; }
.pr-dot { width: 8px; height: 8px; border-radius: 50%; background: #30D158; box-shadow: 0 0 0 4px rgba(48,209,88,.18); flex: 0 0 auto; }
.pr-plans { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.pr-plans { margin-top: 22px; } /* breathing room between the title/social and the card (badge sits above it) */
.pr-plans.pr-one { grid-template-columns: 1fr; width: 100%; max-width: 520px; margin: 22px auto 0; } /* single Pro plan — fills the fixed-width modal */
.pr-one .pr-plan { padding: 26px 26px 24px; }
.pr-one .pr-pricerow { display: flex; gap: 34px; align-items: center; margin-bottom: 22px; flex-wrap: wrap; }
.pr-one .pr-priceblock { flex: 0 0 auto; }
.pr-one .pr-bill { margin: 6px 0 0; }
.pr-one .pr-feats { margin: 0; flex: 1 1 180px; }
/* currency selector (custom dropdown, app style) + header row */
.pr-headr { display: flex; align-items: center; gap: 10px; }
.pr-cursel { position: relative; }
.pr-curbtn { display: inline-flex; align-items: center; gap: 6px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.14); color: #fff; font: inherit; font-size: 13px; font-weight: 650; border-radius: 999px; padding: 8px 13px; cursor: pointer; }
.pr-curbtn:hover { border-color: rgba(255,255,255,.28); }
.pr-curcar { display: inline-flex; opacity: .6; transition: transform .15s; }
.pr-curcar svg { width: 14px; height: 14px; }
.pr-cursel.open .pr-curcar { transform: rotate(180deg); }
.pr-curmenu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 5; min-width: 130px; padding: 5px; border-radius: 13px; background: #1b1b20; border: 1px solid rgba(255,255,255,.12); box-shadow: 0 16px 40px -12px rgba(0,0,0,.6); display: flex; flex-direction: column; gap: 2px; }
.pr-curmenu[hidden] { display: none; }
.pr-curopt { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; text-align: left; background: transparent; border: 0; color: rgba(255,255,255,.82); font: inherit; font-size: 13.5px; font-weight: 600; padding: 9px 11px; border-radius: 9px; cursor: pointer; }
.pr-curopt:hover { background: rgba(255,255,255,.08); color: #fff; }
.pr-curopt.on { color: #fff; }
.pr-curck { display: inline-flex; color: var(--accent, #C87F5E); }
.pr-curck svg { width: 15px; height: 15px; }
.pr-plan { position: relative; border: 1px solid rgba(255,255,255,.12); border-radius: 20px; padding: 22px 20px; background: rgba(255,255,255,.03); display: flex; flex-direction: column; }
.pr-plan.pro { border-color: rgba(200,127,94,.5); background: linear-gradient(180deg, rgba(200,127,94,.12), rgba(255,255,255,.02)); }
.pr-badge { position: absolute; top: -10px; left: 20px; font-size: 11px; font-weight: 800; padding: 3px 10px; border-radius: 999px; background: #C87F5E; color: #fff; }
.pr-feats li::before { color: #C87F5E; }
.pr-name { font-size: 15px; font-weight: 700; color: rgba(255,255,255,.7); margin-bottom: 8px; }
.pr-price { display: flex; align-items: baseline; gap: 4px; }
.pr-amt { font-size: 40px; font-weight: 800; letter-spacing: -.03em; color: #fff; line-height: 1; }
.pr-per { font-size: 15px; color: rgba(255,255,255,.5); font-weight: 600; }
.pr-bill { font-size: 13px; color: rgba(255,255,255,.45); margin: 6px 0 16px; }
.pr-feats { list-style: none; margin: 0 0 20px; padding: 0; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.pr-feats li { position: relative; padding-left: 24px; font-size: 14px; color: rgba(255,255,255,.78); line-height: 1.4; }
.pr-feats li::before { content: "✓"; position: absolute; left: 0; top: 0; color: #30D158; font-weight: 800; }
.pr-go { width: 100%; border: 0; cursor: pointer; font: inherit; font-weight: 700; font-size: 15px; padding: 14px; border-radius: 13px; background: rgba(255,255,255,.1); color: #fff; }
.pr-go:hover { background: rgba(255,255,255,.16); }
.pr-go.primary { background: #C87F5E; color: #fff; }
.pr-go.primary:hover { background: #C87F5E; filter: brightness(1.06); }
.pr-go.pr-current { background: rgba(48,209,88,.15); color: #30D158; cursor: default; }
.pr-badge.cur { background: #30D158; }
.pr-plan.current { border-color: rgba(48,209,88,.4); }
.pr-plan.current.pro { background: linear-gradient(180deg, rgba(48,209,88,.08), rgba(255,255,255,.02)); }
.pr-go:disabled { opacity: .6; cursor: default; }
.pr-note { text-align: center; font-size: 13px; color: rgba(255,255,255,.4); margin-top: 16px; }
/* monthly / yearly interval toggle */
.pr-ivtog { display: flex; width: fit-content; gap: 4px; padding: 4px; margin: 20px auto 0; border-radius: 999px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1); }
.pr-ivopt { border: 0; background: transparent; color: rgba(255,255,255,.6); font: inherit; font-weight: 650; font-size: 13.5px; padding: 8px 18px; border-radius: 999px; cursor: pointer; transition: background .15s, color .15s; }
.pr-ivopt.on { background: #C87F5E; color: #fff; }
.pr-exvat { text-align: center; font-size: 12px; color: rgba(255,255,255,.4); margin-top: 10px; }
@media (max-width: 600px) { .pr-plans { grid-template-columns: 1fr; } .pr-amt { font-size: 34px; } }
/* TOP-RIGHT, not bottom-left — the feedback pill lives in that corner now, and an upgrade nudge
   sitting on top of it meant one of the two could not be pressed. The top right is the better
   home for it anyway: it is the only corner of the editor with nothing in it. */
/* TOP CENTRE. In the right-hand corner it sat on whatever the site put there — a basket, a
   button, the section gear — and it is the one control that belongs to us rather than to their
   page. The middle of the top edge is the one strip nothing else uses. */
.upgrade-fab { position: fixed; left: 50%; transform: translateX(-50%); top: 14px; z-index: 70; display: inline-flex; align-items: center; gap: 8px; background: #C87F5E; color: #fff; border: 0; border-radius: 999px; padding: 12px 20px; font-weight: 700; font-size: 14px; cursor: pointer; box-shadow: 0 8px 30px rgba(200,127,94,.45); font-family: var(--qck-font); }
.upgrade-fab svg { width: 17px; height: 17px; }
/* …and while the dashboard is up: it sits exactly where the filter bar's close button is. */
body.preview .upgrade-fab, body.panel-open .upgrade-fab, body.tilt .upgrade-fab,
body.stats-on .upgrade-fab { display: none; }
/* mobile: collapse the activate fab to a tidy circle so it never crowds the dock */
/* …and on a phone it stays in the middle, under the site's own bar rather than over it —
   `--ed-top` is measured from the page (site.js), so it clears whatever height that bar has. */
@media (max-width: 700px) { .upgrade-fab { top: calc(var(--ed-top, 0px) + 12px); bottom: auto; right: auto; padding: 8px 16px; font-size: 13px; } .upgrade-fab svg { width: 17px; height: 17px; } }
#acc-upgrade { background: #C87F5E !important; color: #fff !important; border: 0; }
#acc-upgrade:hover { filter: brightness(1.06); }
/* "Made with Clay" badge — free sites, on the live page + preview, hidden while editing. Wears the site's
   own resolved tokens (set inline by renderBadge) so it matches the theme. */
.qck-badge { position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%); z-index: 60; display: none; align-items: center; gap: 8px; height: 46px; padding: 0 20px 0 16px; white-space: nowrap; max-width: calc(100vw - 24px); border-radius: 999px; font-family: var(--lb-font, var(--font)); font-size: 13.5px; font-weight: 650; line-height: 1; text-decoration: none; color: var(--ink, #f4f3f1); background: var(--card-bg, rgba(20,20,22,0.92)); border: 1px solid var(--card-border, rgba(255,255,255,0.14)); box-shadow: 0 10px 30px -12px rgba(0,0,0,0.55); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); transition: transform .15s ease; }
.qck-badge:hover { transform: translateX(-50%) translateY(-2px); }
/* the mark is the WORDMARK now — a word needs width, and a word in a circle is a word in a hole */
.qck-badge .qb-mark { display: inline-flex; align-items: center; flex: 0 0 auto; }
.qck-badge .qb-mark svg { height: 17px; width: auto; display: block; }
.qck-badge b { font-weight: 800; }
body:not(.is-owner) .qck-badge, body.preview .qck-badge { display: inline-flex; }
body.panel-open .qck-badge { display: none; } /* don't fight the settings panel while it's open */
/* reserve room at the bottom so the centred badge never covers the last widget when scrolled all the way down */
body.has-qbadge:not(.is-owner) .wrap, body.has-qbadge.preview .wrap { padding-bottom: 96px; }
/* Design → Badge tab + Domain upsell (panel context — light ink on the dark panel) */
.badge-up, .dom-up { display: flex; gap: 12px; align-items: flex-start; margin-top: 14px; padding: 14px; border-radius: 14px; border: 1px solid rgba(200,127,94,.32); background: rgba(200,127,94,.09); }
.badge-up .bu-ic, .dom-up .du-ic { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: rgba(200,127,94,.18); color: #C87F5E; }
.badge-up .bu-ic svg, .dom-up .du-ic svg { width: 16px; height: 16px; }
.bu-tx, .du-tx { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.bu-tx b, .du-tx b { font-size: 14px; font-weight: 700; color: #f4f3f1; }
.bu-tx span, .du-tx span { font-size: 12.5px; line-height: 1.45; color: rgba(244,243,241,.62); }
/* pricing: pro-widgets-on-your-site warning */
.pr-prowarn { display: flex; align-items: center; gap: 10px; margin: 0 0 16px; padding: 11px 14px; border-radius: 12px; background: rgba(200,127,94,.12); border: 1px solid rgba(200,127,94,.3); font-size: 13px; line-height: 1.4; color: rgba(255,255,255,.84); }
.pr-prowarn svg { width: 16px; height: 16px; flex: 0 0 auto; color: #C87F5E; }
.pr-prowarn b { font-weight: 800; color: #fff; }
.acc-plan { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border: 1px solid rgba(255,255,255,.1); border-radius: 14px; background: rgba(255,255,255,.03); }
.acc-plan-l { display: flex; flex-direction: column; gap: 2px; }
.acc-plan-name { font-weight: 700; font-size: 15px; color: #fff; }
.acc-plan-sub { font-size: 12.5px; color: rgba(255,255,255,.5); }
.acc-plan-dot { width: 10px; height: 10px; border-radius: 50%; background: rgba(255,255,255,.25); flex: 0 0 auto; }
.acc-plan-dot.live { background: #30D158; box-shadow: 0 0 0 4px rgba(48,209,88,.18); }
.conflict-list { list-style: none; margin: 0 0 18px; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.conflict-list li { position: relative; padding-left: 18px; font-size: 14px; line-height: 1.5; color: rgba(255,255,255,0.66); }
.conflict-list li::before { content: ""; position: absolute; left: 2px; top: 8px; width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,0.4); }
.conflict-list b { color: #fff; font-weight: 700; }
/* image detail sheet */
.im-detail .im-big { width: 100%; aspect-ratio: 16 / 10; border-radius: 16px; background-size: cover; background-position: center; margin-bottom: 14px; }
.im-colors { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; min-height: 34px; align-items: center; }
.im-sw { width: 34px; height: 34px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.16); cursor: pointer; position: relative; transition: transform .12s; }
.im-sw:hover { transform: scale(1.08); }
.im-sw.copied::after { content: "✓"; position: absolute; inset: 0; display: grid; place-items: center; color: #fff; font-weight: 800; text-shadow: 0 1px 3px rgba(0,0,0,.7); }
.im-toggle { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0 2px; cursor: pointer; font-weight: 600; color: #fff; }
.im-toggle input { width: 20px; height: 20px; accent-color: var(--qck, #C87F5E); cursor: pointer; }
.im-foot { display: flex; gap: 10px; }
.im-foot .btn-cta { flex: 1; justify-content: center; }
.fm-lbl { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.5); margin: 16px 0 8px; }
.confirm-msg { color: rgba(255,255,255,0.6); font-size: 14px; line-height: 1.5; margin: 6px 4px 18px; }
.confirm-sub { margin: -4px 0 18px; color: rgba(255,255,255,0.55); font-size: 13.5px; line-height: 1.5; font-family: var(--qck-font); }
.confirm-acts { display: flex; gap: 10px; padding-bottom: 4px; }
.confirm-acts > button { flex: 1; justify-content: center; padding: 14px; border-radius: 12px; font-weight: 650; }
/* bottom-sheets (confirm, item editors, pickers) are Clay chrome — they live inside
   .wrap, so override the site theme's button colour/style (arrow/soft/outline + themed
   accent) and keep our standard white-on-black CTA. The widget PREVIEW modal (.wm-card)
   is intentionally themed and unaffected. */
/* ── Calendar-sync wizard (inside .fm-card) ── */
.cal-wiz .cal-dots { display: flex; gap: 6px; justify-content: center; margin: 2px 0 16px; flex: 0 0 auto; }
.cal-dot { width: 22px; height: 4px; border-radius: 99px; background: rgba(255,255,255,0.14); transition: background .18s; }
.cal-dot.on { background: #C87F5E; }
.cal-dot.done { background: rgba(200,127,94,0.5); }
.cal-h2 { font-size: 20px; font-weight: 800; color: #fff; margin: 2px 0 4px; }
.cal-sub { font-size: 13.5px; line-height: 1.5; color: rgba(255,255,255,0.55); margin: 0 0 16px; }
.cal-opt { display: block; width: 100%; text-align: left; padding: 15px 16px; margin-bottom: 10px; border-radius: 15px; border: 1px solid rgba(255,255,255,0.1); background: rgba(255,255,255,0.03); color: #fff; cursor: pointer; transition: border-color .12s, background .12s; }
.cal-opt:hover { border-color: rgba(200,127,94,0.5); background: rgba(200,127,94,0.06); }
.cal-opt-t { display: block; font-size: 16px; font-weight: 700; color: #fff; margin-bottom: 3px; }
.cal-opt-s { display: block; font-size: 13px; line-height: 1.45; color: rgba(255,255,255,0.55); }
.cal-provs { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.cal-prov { padding: 15px; border-radius: 14px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.03); color: #fff; font: inherit; font-size: 15px; font-weight: 650; cursor: pointer; transition: border-color .12s, background .12s; }
.cal-prov:hover { border-color: rgba(255,255,255,0.28); }
.cal-prov.on { border-color: #C87F5E; background: color-mix(in srgb, #C87F5E 12%, transparent); }
.cal-steps { font-size: 14px; line-height: 1.6; color: rgba(255,255,255,0.72); background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); border-radius: 13px; padding: 14px 15px; margin: 0 0 14px; }
.cal-copy { display: flex; gap: 8px; align-items: stretch; }
.cal-copy .input { flex: 1; min-width: 0; }
.cal-copybtn { flex: 0 0 auto; padding: 0 18px; border-radius: 14px; border: 0; background: #fff; color: #111; font: inherit; font-weight: 700; cursor: pointer; }
.cal-copybtn:hover { filter: brightness(0.94); }
.cal-err { font-size: 13.5px; color: #ff6b6b; margin: 10px 2px 0; line-height: 1.45; }
.cal-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding-top: 16px; flex: 0 0 auto; }
.cal-back { padding: 12px 18px; border-radius: 12px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.05); color: #fff; font: inherit; font-weight: 650; cursor: pointer; }
.cal-back:hover { background: rgba(255,255,255,0.1); }
.cal-next { padding: 13px 24px; border-radius: 12px !important; }
.cal-next[disabled] { opacity: 0.6; cursor: default; }
.fm-typewrap { position: relative; }
.fm-typesel { width: 100%; display: flex; align-items: center; gap: 12px; padding: 8px 14px; height: 60px; border-radius: 14px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.04); color: #fff; cursor: pointer; }
.fm-typesel:focus-visible { outline: 2px solid #3b82f6; }
.fm-type-ic { width: 42px; height: 42px; flex: 0 0 auto; border-radius: 11px; display: grid; place-items: center; background: color-mix(in srgb, #f0563c 18%, transparent); color: #f0563c; }
.fm-type-ic svg { width: 20px; height: 20px; }
.fm-type-n { flex: 1; text-align: left; font-size: 17px; font-weight: 700; }
.fm-type-ch { flex: 0 0 auto; color: rgba(255,255,255,0.4); display: grid; }
.fm-type-ch svg { width: 18px; height: 18px; }
.fm-typemenu { position: absolute; z-index: 5; top: calc(100% + 6px); left: 0; right: 0; background: #1d1d1f; border: 1px solid rgba(255,255,255,0.14); border-radius: 14px; box-shadow: 0 20px 44px -16px rgba(0,0,0,0.75); padding: 6px; display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
.fm-typemenu[hidden] { display: none; }
.fm-type { display: flex; align-items: center; gap: 9px; padding: 12px 13px; border-radius: 11px; border: 0; background: rgba(255,255,255,0.03); color: #fff; cursor: pointer; font-size: 14.5px; font-weight: 700; }
.fm-type:hover { background: rgba(255,255,255,0.09); }
.fm-type.on { box-shadow: inset 0 0 0 1.5px #3b82f6; }
.fm-type svg { width: 18px; height: 18px; color: #f0563c; flex: 0 0 auto; }
.fm-phone { display: grid; grid-template-columns: 124px 1fr; gap: 10px; }
.fm-cc { padding: 0 10px; }
.fm-searchwrap { position: relative; }
.fm-searchwrap > svg { position: absolute; left: 16px; top: 50%; transform: translateY(-50%); width: 18px; height: 18px; color: rgba(255,255,255,0.4); pointer-events: none; }
.fm-search { padding-left: 44px !important; }
.fm-spin { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); width: 18px; height: 18px; border: 2px solid rgba(255,255,255,0.16); border-top-color: #f0563c; border-radius: 50%; animation: fm-spin .7s linear infinite; display: none; }
.fm-searchwrap.busy .fm-spin { display: block; }
@keyframes fm-spin { to { transform: translateY(-50%) rotate(360deg); } }
.fm-results { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.fm-result { display: flex; align-items: center; gap: 13px; width: 100%; text-align: left; padding: 11px 13px; border-radius: 14px; border: 1px solid rgba(255,255,255,0.1); background: rgba(255,255,255,0.03); color: #fff; cursor: pointer; }
.fm-result:hover { background: rgba(255,255,255,0.08); }
.fm-result-ic, .fm-addr-ic { width: 42px; height: 42px; flex: 0 0 auto; border-radius: 11px; display: grid; place-items: center; background: color-mix(in srgb, #f0563c 18%, transparent); color: #f0563c; }
.fm-result-ic svg, .fm-addr-ic svg { width: 19px; height: 19px; }
.fm-result-tx, .fm-addr-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.fm-result-n, .fm-addr-n { font-size: 15px; font-weight: 700; }
.fm-result-a, .fm-addr-a { font-size: 13px; color: rgba(255,255,255,0.5); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fm-addr { display: flex; align-items: center; gap: 13px; padding: 11px 13px; border-radius: 14px; border: 1px solid color-mix(in srgb, #f0563c 45%, transparent); background: color-mix(in srgb, #f0563c 7%, transparent); }
.fm-addr-ok { flex: 0 0 auto; color: #f0563c; }
.fm-addr-ok svg { width: 20px; height: 20px; }
.fm-change { display: block; width: 100%; text-align: center; margin-top: 12px; padding: 0; background: transparent; border: 0; color: #f0563c; font-size: 14.5px; font-weight: 600; cursor: pointer; }
.fm-foot { display: flex; gap: 12px; margin-top: 18px; flex: 0 0 auto; }
.fm-foot .btn { height: 56px; font-size: 16px; font-weight: 700; }
.fm-del { flex: 0 0 auto; min-width: 124px; display: flex; align-items: center; justify-content: center; gap: 8px; }
.fm-del svg { width: 18px; height: 18px; }
.fm-done { flex: 1; }
/* date+time picker trigger + calendar */
.dp-trigger { display: flex; align-items: center; justify-content: space-between; gap: 10px; cursor: pointer; text-align: left; }
.dp-trigger svg { width: 19px; height: 19px; color: rgba(255,255,255,0.45); flex: 0 0 auto; }
.dp-trigger.empty span { color: rgba(255,255,255,0.4); }
.dp-card { max-width: 420px; }
.dp-nav { display: flex; align-items: center; justify-content: space-between; margin: 14px 0 10px; }
.dp-title { font-size: 16px; font-weight: 700; color: #fff; }
.dp-prev, .dp-next { width: 38px; height: 38px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.04); color: #fff; display: grid; place-items: center; cursor: pointer; }
.dp-prev:hover, .dp-next:hover { background: rgba(255,255,255,0.1); }
.dp-prev svg, .dp-next svg { width: 18px; height: 18px; }
.dp-wd { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-bottom: 4px; }
.dp-wd span { text-align: center; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: rgba(255,255,255,0.35); padding: 4px 0; }
.dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.dp-cell { aspect-ratio: 1; display: grid; place-items: center; border-radius: 10px; border: 0; background: transparent; color: #fff; font-size: 14px; font-weight: 600; cursor: pointer; }
.dp-cell.empty { visibility: hidden; }
.dp-cell:not(.empty):hover { background: rgba(255,255,255,0.09); }
.dp-cell.on { background: #f0563c; color: #fff; }
.dp-time { display: flex; align-items: center; gap: 8px; }
.dp-time .input { width: auto; flex: 1; height: 52px; text-align: center; font-size: 18px; font-weight: 700; }
.dp-colon { font-size: 22px; font-weight: 800; color: rgba(255,255,255,0.4); }
/* wide variant (link widget): icon + label */
.ic-trigger-wide { width: 100%; height: 56px; display: flex; align-items: center; justify-content: flex-start; gap: 12px; padding: 0 18px; }
.ic-trigger-wide svg { width: 24px; height: 24px; color: var(--accent, #f0563c); flex: 0 0 auto; }
.ic-trigger-wide span { font-size: 14px; font-weight: 600; color: rgba(255,255,255,0.7); }
/* place-search suggestions */
/* A field straight after an Add button needs air — otherwise its label reads as a caption
   belonging to the button above it rather than to the input below it. */
.cf-add + .field { margin-top: 16px; }
/* The `.place-*` suggestion dropdown went with `attachPlaceSearch`: the Contact panel's own
   address field is gone, and address search now happens inside the ⚙ modal, which draws
   `.fm-result` rows instead. */
/* scrollable icon picker (Heroicons) */
.ipick-scrim { position: fixed; inset: 0; z-index: 260; display: flex; align-items: flex-end; justify-content: center; background: rgba(4,4,8,0.55); }
.ipick-card { width: 100%; max-width: 540px; max-height: 88vh; display: flex; flex-direction: column; background: #161617; border: 1px solid rgba(255,255,255,0.1); border-bottom: 0; border-radius: 26px 26px 0 0; padding: 14px 20px 20px; }
.ipick-head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.ipick-var { flex: 0 0 auto; }
.ipick-search { flex: 1; }
.ipick-x { width: 38px; height: 38px; flex: 0 0 auto; border-radius: 11px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.05); color: #fff; display: grid; place-items: center; cursor: pointer; }
.ipick-x:hover { background: rgba(255,255,255,0.12); }
.ipick-x svg { width: 16px; height: 16px; }
.ipick-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(56px, 1fr)); gap: 8px; overflow-y: auto; padding: 2px; }
.ipick-cell { aspect-ratio: 1; display: grid; place-items: center; border-radius: 12px; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.03); color: #fff; cursor: pointer; transition: background .1s, border-color .1s; }
.ipick-cell:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.3); }
.ipick-cell.on { border-color: #f0563c; color: #f0563c; }
.ipick-cell svg { width: 24px; height: 24px; }
/* selects: strip the native control + add a consistent chevron (Safari was ugly) */
select.input { appearance: none; -webkit-appearance: none; cursor: pointer; padding-right: 40px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-opacity='0.5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");
  background-repeat: no-repeat; background-position: right 13px center; background-size: 16px; }
select.input::-ms-expand { display: none; }
.dp-time select.input { padding-right: 32px; background-position: right 9px center; }
/* upload field (logo / favicon / meta image) */
.upl { display: flex; align-items: center; gap: 14px; padding: 11px 13px; border: 1px solid rgba(255,255,255,0.10); border-radius: 14px; background: #161617; cursor: pointer; transition: border-color .15s, background .15s; }
.upl:hover { border-color: rgba(255,255,255,0.28); background: #1c1c1e; }
.upl-prev { width: 48px; height: 48px; border-radius: 11px; background: rgba(255,255,255,0.05); display: grid; place-items: center; overflow: hidden; flex: 0 0 48px; color: rgba(255,255,255,0.4); }
/* a chosen video previews like a chosen photograph does */
.upl-prev video{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit}

.upl-prev img { width: 100%; height: 100%; object-fit: cover; }
.upl-prev svg { width: 22px; height: 22px; }
.upl-main { flex: 1; min-width: 0; }
.upl-t { font-size: 15px; font-weight: 600; display: flex; align-items: center; gap: 7px; }
.upl-t svg { width: 15px; height: 15px; color: rgba(255,255,255,0.6); }
.upl-h { font-size: 12px; color: rgba(255,255,255,0.42); margin-top: 2px; }
.upl-x { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 8px; border: 1px solid rgba(255,255,255,0.12); background: transparent; color: rgba(255,255,255,0.6); cursor: pointer; display: grid; place-items: center; }
.upl-x:hover { background: rgba(255,138,138,0.14); color: #ff8a8a; border-color: #4a2a2a; }
.upl-x svg { width: 15px; height: 15px; }
/* 2-col field grid (mobile collapses) */
.fgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
.fgrid .wide { grid-column: 1 / -1; }
@media (max-width: 560px) { .fgrid { grid-template-columns: 1fr; } }
/* tabbed settings modal */
.m-head { position: relative; padding: 24px clamp(20px, 3vw, 28px) 0; }
.m-head h2 { margin: 0 0 4px; font-size: 26px; }
.m-head .sub { margin: 0; }
.m-close {
  position: absolute; top: 20px; right: 20px; width: 38px; height: 38px; border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.10); background: rgba(255,255,255,0.05); color: #fff;
  display: grid; place-items: center; cursor: pointer;
}
.m-close:hover { background: rgba(255,255,255,0.12); }
.m-close svg { width: 18px; height: 18px; }
.m-tabs { display: flex; gap: 22px; padding: 16px clamp(20px, 3vw, 28px) 0; border-bottom: 1px solid rgba(255,255,255,0.07); overflow-x: auto; }
.m-tab { background: none; border: 0; color: rgba(255,255,255,0.5); font: inherit; font-size: 15px; font-weight: 650; padding: 2px 0 14px; cursor: pointer; position: relative; white-space: nowrap; }
.m-tab.on { color: #fff; }
.m-tab.on::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--qck); border-radius: 2px; }
.m-body { padding: 22px clamp(20px, 3vw, 28px); overflow-y: auto; flex: 1; min-height: 170px; }
.m-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 16px clamp(20px, 3vw, 28px) calc(18px + env(safe-area-inset-bottom)); border-top: 1px solid rgba(255,255,255,0.07); }
.m-foot .btn { min-width: 120px; }
/* theme tab — vibes + make-it-yours */
.th-label { font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: rgba(255,255,255,0.45); margin: 0 0 12px; }
.vibe-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
@media (max-width: 560px) { .vibe-grid { grid-template-columns: repeat(2, 1fr); } }
.vibe { text-align: left; cursor: pointer; border: 2px solid rgba(255,255,255,0.10); border-radius: 18px; background: #161617; padding: 12px; transition: border-color .12s ease; }
.vibe:hover { border-color: rgba(255,255,255,0.3); }
.vibe.on { border-color: var(--qck); }
.vibe-prev { height: 140px; border-radius: 12px; overflow: hidden; display: flex; flex-direction: column; justify-content: center; padding: 9px; gap: 6px; }
.vibe-prev.grid { padding: 0; }
.vibe-card { padding: 10px 11px; display: flex; flex-direction: column; gap: 6px; }
/* preview top row: icon chip + title bar */
.vibe-top { display: flex; align-items: center; gap: 7px; }
.vibe-chip { width: 15px; height: 15px; border-radius: 5px; flex: 0 0 auto; display: block; }
.vibe-top .vibe-bar { flex: 0 0 auto; }
.vibe-card.big { padding: 12px 12px; gap: 6px; }
.vibe-card2 { padding-top: 8px; padding-bottom: 8px; }
/* bento theme preview — real-styled cards (header + row of 3) over the theme's page background */
.tpv { display: flex; flex-direction: column; gap: 7px; padding: 12px; height: 100%; justify-content: center; background-size: cover; background-position: center; }
.tpv-b { height: 4px; border-radius: 99px; display: block; }
.tpv-head { flex: 0 0 auto; display: flex; align-items: center; gap: 9px; padding: 11px 12px; position: relative; overflow: hidden; }
.tpv-av { width: 22px; height: 22px; border-radius: 50%; flex: 0 0 auto; box-shadow: 0 2px 6px -2px rgba(0,0,0,0.35); }
.tpv-htx { display: flex; flex-direction: column; gap: 5px; flex: 1; min-width: 0; }
.tpv-row { flex: 0 0 auto; display: flex; gap: 7px; }
.tpv-card { flex: 1; min-width: 0; min-height: 48px; display: flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 8px; padding: 10px; position: relative; overflow: hidden; }
.tpv-dot { width: 14px; height: 14px; border-radius: 50%; flex: 0 0 auto; }
.tpv-head.is-squircle, .tpv-card.is-squircle { corner-shape: squircle; }
/* button chip in preset card preview */
.preset-btn { height: 9px; width: 34%; margin-top: 3px; display: block; }
.vibe-bar { height: 5px; border-radius: 3px; display: block; }
.vibe-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 11px 2px 1px; }
.vibe-name { font-size: 15px; font-weight: 700; color: #fff; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vibe-ck, .vibe-x { flex: 0 0 auto; }
.vibe-ck { width: 17px; height: 17px; color: var(--qck); flex: 0 0 auto; }
.vibe-x { width: 20px; height: 20px; flex: 0 0 auto; display: grid; place-items: center; border-radius: 6px; color: rgba(255,255,255,0.5); background: rgba(255,255,255,0.06); }
.vibe-x:hover { color: #fff; background: rgba(255,255,255,0.16); }
.vibe-x svg { width: 13px; height: 13px; }
.th-seg { display: flex; gap: 4px; background: #161617; border: 1px solid rgba(255,255,255,0.10); border-radius: 12px; padding: 4px; }
.th-seg button { flex: 1; border: 0; cursor: pointer; font: inherit; font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.6); background: transparent; padding: 9px 6px; border-radius: 9px; white-space: nowrap; }
.th-seg button.on { background: #fff; color: #111; }
.th-seg-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.th-seg-scroll::-webkit-scrollbar { display: none; }
.th-seg-scroll button { flex: 0 0 auto; }
/* card-style picker has 6 options — let it wrap to 2 rows instead of overflowing */
#d-fill { flex-wrap: wrap; }
#d-fill button { flex: 1 1 28%; }
/* buttons-editor link rows — a card per link with a visual icon picker */
.link-edit { background: #161617; border: 1px solid rgba(255,255,255,0.08); border-radius: 14px; padding: 10px; margin-bottom: 10px; }
.link-row { display: flex; gap: 8px; align-items: center; }
#biz-links { display: flex; flex-direction: column; gap: 10px; margin-bottom: 10px; }
.link-ico { width: 46px; height: 46px; flex: 0 0 auto; border-radius: 12px; border: 1px solid rgba(255,255,255,0.14); background: #1f1f21; color: #fff; display: grid; place-items: center; cursor: pointer; transition: border-color .12s, background .12s; }
.link-ico:hover { border-color: rgba(255,255,255,0.34); background: #262628; }
.link-ico svg { width: 21px; height: 21px; }
.link-row .input { flex: 1; min-width: 0; }
.link-del { width: 32px; height: 32px; flex: 0 0 auto; border: 0; border-radius: 9px; background: rgba(255,255,255,0.07); color: rgba(255,255,255,0.55); cursor: pointer; display: grid; place-items: center; padding: 0; }
.link-del:hover { background: rgba(255,138,138,0.16); color: #ff8a8a; }
.link-del svg { width: 15px; height: 15px; }
.link-url { margin-top: 8px; }
.link-icons { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-top: 10px; padding-top: 10px; border-top: 1px solid rgba(255,255,255,0.07); }
.link-icons .ic-opt { aspect-ratio: 1; display: grid; place-items: center; border: 1px solid rgba(255,255,255,0.12); border-radius: 10px; background: transparent; color: #fff; cursor: pointer; padding: 0; }
.link-icons .ic-opt:hover { border-color: rgba(255,255,255,0.4); }
.link-icons .ic-opt.on { background: #fff; color: #111; border-color: #fff; }
.link-icons .ic-opt svg { width: 18px; height: 18px; }
/* accent — swatches + hue slider (Clay style, no native picker) */
.sw-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.sw { width: 30px; height: 30px; border-radius: 50%; border: 2px solid transparent; box-shadow: 0 0 0 1px rgba(255,255,255,0.12) inset; cursor: pointer; padding: 0; }
.sw.on { border-color: #fff; box-shadow: 0 0 0 2px rgba(0,0,0,0.3) inset; }
.hue { -webkit-appearance: none; appearance: none; width: 100%; height: 14px; border-radius: 999px; outline: none; cursor: pointer;
  background: linear-gradient(to right,#ff0000,#ff8000,#ffff00,#00ff00,#00ffff,#0080ff,#8000ff,#ff00ff,#ff0000); }
.hue::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: 50%; background: #fff; border: 2px solid rgba(0,0,0,0.25); cursor: pointer; }
.hue::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: #fff; border: 2px solid rgba(0,0,0,0.25); cursor: pointer; }
#d-bgbody { margin-top: 16px; }
.bg-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; align-content: start; }
.bg-scroll { overflow-y: auto; overscroll-behavior: contain; padding-right: 4px; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.25) transparent; }
.bg-scroll::-webkit-scrollbar { width: 6px; }
.bg-scroll::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.22); border-radius: 4px; }
@media (max-width: 560px) { .bg-grid { grid-template-columns: repeat(5, 1fr); } }
.bg-sw { aspect-ratio: 1; border-radius: 11px; border: 2px solid rgba(255,255,255,0.12); cursor: pointer; padding: 0; position: relative; display: grid; place-items: center; color: rgba(255,255,255,0.7); overflow: hidden; }
.bg-sw.on { border-color: var(--qck); }
.bg-sw.bg-none { background: rgba(255,255,255,0.05); }
.bg-sw.bg-none svg { width: 40%; height: 40%; }
.bg-up svg { width: 18px; height: 18px; }
/* ===================== slide-out on-page editor panel ===================== */
/* push the page out of the way so you SEE the change (desktop) */
@media (min-width: 700px) { body.panel-open { padding-right: calc(min(380px, 92vw) + var(--gutter)); } }
body.panel-open .ed-bar { transform: translateX(calc(-50% - min(190px, 46vw))); }
/* inline Design sub-tabs: pin below the main Content/Design/Visibility tabs while scrolling */
/* only the panel's very first label hugs the top — nested/conditional sub-blocks
   (e.g. "Card image", "Glow colour") keep their normal breathing room */
/* sub-tabs (e.g. Text → Title/Subtitle/Body) — same language as the top tabs */
/* font picker — each chip rendered in its own typeface */
.font-grid { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; max-height: 336px; overflow-y: auto; padding-right: 4px; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.25) transparent; }
.font-grid::-webkit-scrollbar { width: 6px; }
.font-grid::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.22); border-radius: 4px; }
.font-chip { display: flex; flex-direction: column; gap: 3px; background: #161617; border: 1px solid rgba(255,255,255,0.10); color: #fff; border-radius: 11px; padding: 11px 12px; cursor: pointer; text-align: left; overflow: hidden; transition: border-color .12s; }
.font-chip .fc-name { font-size: 18px; line-height: 1.15; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.font-chip .fc-lbl { font-family: var(--qck-font); font-size: 10.5px; font-weight: 600; letter-spacing: .01em; color: rgba(255,255,255,0.42); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.font-chip:hover { border-color: rgba(255,255,255,0.3); }
.font-chip.on { border-color: #fff; box-shadow: inset 0 0 0 1px #fff; }
.font-chip.on .fc-lbl { color: rgba(255,255,255,0.7); }
.lay-info { display: flex; gap: 12px; align-items: flex-start; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); border-radius: 14px; padding: 14px; margin-top: 2px; }
.lay-info > svg { width: 20px; height: 20px; color: rgba(255,255,255,0.5); flex: 0 0 auto; margin-top: 1px; }
.lay-info > div { display: flex; flex-direction: column; gap: 4px; }
.lay-info b { font-size: 13.5px; font-weight: 650; color: #fff; }
.lay-info span { font-size: 12.5px; line-height: 1.5; color: rgba(255,255,255,0.55); }
/* match the Add-a-widget card chrome: solid card, inset preview, label row below */
.theme-list .vibe { background: #161617; border: 2px solid rgba(255,255,255,0.10); border-radius: 18px; padding: 12px; transition: border-color .12s ease; }
.theme-list .vibe:hover { border-color: rgba(255,255,255,0.30); }
.theme-list .vibe.on { border-color: var(--qck); }
.theme-list .vibe-prev { height: 150px; border-radius: 12px; overflow: hidden; }
.theme-list .vibe-meta { margin: 11px 2px 1px; }
.theme-list .vibe-name { font-size: 16px; font-weight: 700; flex: 0 1 auto; }
.vibe-tag { font-size: 13px; color: rgba(255,255,255,0.45); flex: 1; text-align: right; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.theme-list .vibe.on .vibe-tag { margin-right: 6px; }
.theme-list .vibe-ck { width: 16px; height: 16px; }
/* THE DESIGN PICKER — each card drawn in that theme's own paper, ink, accent and display face, so
   the choice is visible before anything is applied. The values come from the theme's `swatch`. */
.dp-word { font-size: 30px; line-height: 1; font-weight: 600; margin-bottom: 4px; display: block; }
.dp-note { font-size: 12.5px; margin: 0 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* multi-colour palette editor rows */
.pal-row { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; }
.pal-row .cf { flex: 1; min-width: 0; margin-top: 0; }
.pal-x { flex: 0 0 auto; background: rgba(255,255,255,0.1); }
.pal-tx { display: flex; gap: 2px; flex: 0 0 auto; background: #161617; border: 1px solid rgba(255,255,255,0.1); border-radius: 9px; padding: 3px; }
.pal-tx button { width: 26px; height: 26px; border: 0; border-radius: 6px; background: transparent; color: rgba(255,255,255,0.6); font-size: 13px; cursor: pointer; padding: 0; }
.pal-tx button.on { background: #fff; color: #111; }
.saved-row { display: flex; flex-wrap: wrap; gap: 8px; }
.saved-chip { display: inline-flex; align-items: center; gap: 6px; background: #18181a; border: 1px solid rgba(255,255,255,0.12); color: #fff; border-radius: 10px; padding: 8px 10px; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
.saved-chip:hover { border-color: rgba(255,255,255,0.3); }
.saved-x { display: grid; place-items: center; opacity: .5; }
.saved-x:hover { opacity: 1; }
.saved-x svg { width: 12px; height: 12px; }
.saved-add { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; background: transparent; border: 1px dashed rgba(255,255,255,0.2); color: rgba(255,255,255,0.6); border-radius: 12px; padding: 14px; font: inherit; font-size: 14px; font-weight: 600; cursor: pointer; transition: border-color .12s, color .12s; }
.saved-add:hover { color: rgba(255,255,255,0.9); border-color: rgba(255,255,255,0.38); }
.saved-add svg { width: 16px; height: 16px; }
.saved-add-top { margin-bottom: 16px; }
/* the preset-library "Add preset" gets breathing room */
#d-presetadd { margin-top: 12px; }
/* grid layout shuffler modal */
.lay-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 10px 0 16px; }
.lay-opt { position: relative; display: flex; flex-direction: column; gap: 11px; background: #161617; border: 2px solid rgba(255,255,255,0.1); border-radius: 18px; padding: 12px; cursor: pointer; color: #fff; transition: border-color .12s ease; }
.lay-opt:hover { border-color: rgba(255,255,255,0.3); }
.lay-opt.on { border-color: var(--qck); box-shadow: none; }
.lay-prev { display: flex; flex-direction: column; gap: 6px; height: 92px; padding: 12px; border-radius: 12px; background: #0e0e0f; }
.lay-row { display: flex; gap: 6px; flex: 1; min-height: 0; }
.lay-cell { flex: 1; border-radius: 6px; background: rgba(255,255,255,0.14); }
.lay-cell.acc { background: rgba(240,86,30,0.55); }
.lay-name { font-size: 16px; font-weight: 700; text-align: left; padding-left: 2px; }
.lay-ck { position: absolute; top: 20px; right: 20px; width: 22px; height: 22px; border-radius: 99px; background: var(--qck); display: none; place-items: center; color: #111; }
.lay-ck svg { width: 13px; height: 13px; }
.lay-opt.on .lay-ck { display: grid; }
.lay-shuffle { width: 100%; display: flex; align-items: center; justify-content: center; gap: 9px; }
.lay-shuffle svg { width: 18px; height: 18px; }
/* preset library tiles */
.preset-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.preset-prev { height: 96px; }
.preset-tile { border: 2px solid rgba(255,255,255,0.10); border-radius: 18px; background: #161617; padding: 12px; transition: border-color .12s ease; }
.preset-tile:hover { border-color: rgba(255,255,255,0.3); }
.preset-tile.on { border-color: var(--qck); }
.preset-prev { width: 100%; height: 86px; border: 0; cursor: pointer; display: flex; flex-direction: column; justify-content: center; padding: 12px; gap: 6px; border-radius: 12px; overflow: hidden; }
.preset-prev .vibe-card { padding: 9px 10px; display: flex; flex-direction: column; gap: 5px; }
.preset-meta { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin: 11px 2px 1px; }
.preset-name { font-size: 15px; font-weight: 700; color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; flex: 1; }
.preset-acts { display: flex; gap: 5px; flex: 0 0 auto; }
.preset-acts button { width: 28px; height: 28px; border: 1px solid rgba(255,255,255,0.12); border-radius: 8px; background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.55); cursor: pointer; display: grid; place-items: center; padding: 0; transition: background .12s, color .12s; }
.preset-acts button:hover { background: rgba(255,255,255,0.14); color: #fff; }
.preset-acts button.on { background: var(--qck); border-color: var(--qck); color: #fff; }
.preset-acts svg { width: 14px; height: 14px; }
/* inline (widget) Design tab — already inside the padded #ep-body, so drop the extra inset */
/* the design content body must NOT be its own scroll container (it's nested inside #ep-body) — that
   nested scroll let the sub-tabs and the content scroll apart, leaving a gap. Make it a plain block. */
#ep-dbody { overflow: visible; flex: none; padding: 16px 0 40px; }
.preset-star { color: var(--qck); font-size: 9px; vertical-align: middle; }
/* selected widget highlight while its panel is open */
.w.selected .card { outline: 2px solid var(--qck); outline-offset: 2px; }
/* compact colour field — swatch + hex, expands to the full picker on tap */
.cf { margin: 10px 0 6px; }
.cf-head { display: flex; align-items: center; gap: 11px; width: 100%; background: #161617; border: 1px solid rgba(255,255,255,0.10); border-radius: 12px; padding: 9px 12px; cursor: pointer; font: inherit; }
.cf-head:hover { border-color: rgba(255,255,255,0.2); }
.cf-sw { width: 26px; height: 26px; border-radius: 7px; border: 1px solid rgba(255,255,255,0.18); flex: 0 0 auto; }
.cf-hex { color: #fff; font-size: 14px; font-weight: 600; letter-spacing: .02em; }
.cf-caret { margin-left: auto; color: rgba(255,255,255,0.4); display: grid; transition: transform .2s; }
.cf-caret svg { width: 16px; height: 16px; }
.cf.open .cf-caret { transform: rotate(90deg); }
.cf-body { margin-top: 10px; }
/* range slider (opacity, angle) */
/* clear "upload your own" button */
/* settings/domain inside the side panel: left-aligned, stacked actions that fit the narrow width */
.copy-row { display: flex; align-items: center; gap: 8px; background: #161617; border: 1px solid rgba(255,255,255,0.10); border-radius: 12px; padding: 6px 6px 6px 13px; }
.copy-url { flex: 1; min-width: 0; color: #fff; font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dom-live { display: flex; align-items: center; justify-content: space-between; gap: 10px; background: #161617; border: 1px solid rgba(255,255,255,0.10); border-radius: 12px; padding: 13px 15px; }
.dom-name { color: #fff; font-size: 15px; font-weight: 650; overflow: hidden; text-overflow: ellipsis; }
.dom-ok { display: inline-flex; align-items: center; gap: 5px; color: #75FB90; font-size: 13px; font-weight: 600; flex: 0 0 auto; }
.dom-ok svg { width: 15px; height: 15px; }
.dom-remove { margin-top: 12px; width: 100%; color: #ff8a8a; }
/* colour target toggle + colour picker */
.cp-target { flex-wrap: wrap; }
.cp-target button { flex: 1 1 22%; min-width: 68px; }
.cp-target-label { font-size: 13px; font-weight: 650; color: #fff; margin: 14px 0 10px; }
.cp-sub { margin-bottom: 6px; }
.cp-sub-lbl { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.55); margin: 12px 0 8px; }
.cp-sub-lbl:first-child { margin-top: 4px; }
.cp { margin-top: 4px; }
.cp-swatches { margin-bottom: 14px; }
.cp-sw-lbl { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.55); margin: 0 0 8px; }
.cp-sw-row { display: flex; flex-wrap: wrap; gap: 8px; }
.cp-dot { width: 26px; height: 26px; border-radius: 50%; cursor: pointer; padding: 0; flex: 0 0 auto; border: 1px solid rgba(255,255,255,0.18); box-shadow: inset 0 0 0 2px rgba(0,0,0,0.12); transition: transform .1s; }
.cp-dot:hover { transform: scale(1.12); }
.cp-dot.on { box-shadow: 0 0 0 2px #161617, 0 0 0 4px #fff; }
.cp-sv { position: relative; width: 100%; height: 140px; border-radius: 12px; cursor: crosshair; margin-bottom: 12px; touch-action: none; }
.cp-thumb { position: absolute; width: 15px; height: 15px; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,0.45); transform: translate(-50%, -50%); pointer-events: none; }
.cp-hue { margin: 0 0 12px; }
.cp-foot { display: flex; align-items: center; gap: 10px; }
.cp-prev { width: 36px; height: 36px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.18); flex: 0 0 auto; }
.cp-hex { flex: 1; background: #161617; border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; color: #fff; font: inherit; font-family: ui-monospace, Menlo, monospace; text-transform: uppercase; padding: 10px 12px; outline: none; }
.cp-hex:focus { border-color: rgba(255,255,255,0.34); }
.cp-or { font-size: 12px; color: rgba(255,255,255,0.4); margin: 16px 0 0; }
/* ---- mobile ---- */
@media (max-width: 700px) {
  .ed-panel { width: 100vw; max-height: 82dvh; top: auto; bottom: 0; border-left: 0; border-top: 1px solid rgba(255,255,255,0.12); border-radius: 22px 22px 0 0; transform: translateY(102%); box-shadow: 0 -24px 60px -24px rgba(0,0,0,0.7); }
  .ed-panel.open { transform: translateY(0); }
  body.panel-open { padding-right: var(--gutter) !important; }
  body.panel-open .ed-bar { display: none; }
}
@media (max-width: 560px) {
  .ed-bar button span { display: none; }
  .ed-bar button { padding: 11px; }
  .ed-bar { gap: 2px; }
}
.bg-up svg { width: 18px; height: 18px; }
/* address tab columns */
.addr-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
@media (max-width: 560px) { .addr-grid { grid-template-columns: 1fr; } }
.sub-field { display: flex; align-items: center; gap: 8px; }
.sub-field .input { text-align: right; font-weight: 600; }
.sub-field .suffix { color: rgba(255,255,255,0.5); white-space: nowrap; font-weight: 600; }
/* widget-type picker grid (add widget) */
.type-grid { display: grid; grid-template-columns: 1fr; gap: 12px; --pk: #f0561e; }
.type-card { text-align: left; cursor: pointer; border: 1px solid rgba(255,255,255,0.10); background: #161617; border-radius: 18px; padding: 12px; color: #fff; transition: border-color .12s ease, transform .12s ease; }
.type-card:hover { border-color: rgba(255,255,255,0.42); }
.type-card:active { transform: scale(0.985); }
.tc-label { font-weight: 700; font-size: 16px; margin-top: 11px; padding-left: 2px; display: flex; align-items: center; gap: 8px; }
.tc-pro { font-size: 10.5px; font-weight: 800; letter-spacing: .02em; padding: 2px 8px; border-radius: 999px; background: #C87F5E; color: #fff; }
.type-card.is-pro { border-color: rgba(200,127,94,0.32); }
.type-card.is-soon { opacity: .5; cursor: default; }
.type-card.is-soon .tc-pro { background: rgba(255,255,255,0.16); color: rgba(255,255,255,0.8); }
.type-card.is-soon:hover { border-color: rgba(255,255,255,0.10); }
.addpro-note { width: 100%; margin-top: 14px; display: flex; align-items: center; gap: 12px; text-align: left; background: linear-gradient(135deg, rgba(200,127,94,0.14), rgba(200,127,94,0.05)); border: 1px solid rgba(200,127,94,0.3); color: #fff; border-radius: 16px; padding: 13px 15px; cursor: pointer; font-family: var(--qck-font); }
.apn-ic { width: 34px; height: 34px; flex: 0 0 auto; border-radius: 10px; display: grid; place-items: center; background: #C87F5E; color: #fff; }
.apn-ic svg { width: 18px; height: 18px; }
.apn-tx { flex: 1; font-size: 13px; line-height: 1.4; color: rgba(255,255,255,0.78); }
.apn-tx b { color: #fff; font-weight: 700; }
.apn-go { flex: 0 0 auto; font-size: 13px; font-weight: 800; color: #C87F5E; }
/* preview panel */
.tc-prev { position: relative; display: flex; flex-direction: column; justify-content: center; gap: 7px; height: 96px; padding: 16px; border-radius: 12px; background: #0e0e0f; overflow: hidden; }
.pk-bar { display: block; height: 7px; border-radius: 99px; background: rgba(255,255,255,0.16); }
.pk-qr { width: 20px; height: 20px; flex: 0 0 auto; border-radius: 5px; background: #fff; background-image: radial-gradient(rgba(0,0,0,0.82) 1px, transparent 1.4px); background-size: 4px 4px; }
.pk-bar.acc { background: var(--pk); }
.pk-bar.h8 { height: 8px; } .pk-bar.h9 { height: 9px; }
.pk-bar.w34 { width: 34%; } .pk-bar.w36 { width: 36%; } .pk-bar.w40 { width: 40%; }
.pk-bar.w45 { width: 45%; } .pk-bar.w50 { width: 50%; } .pk-bar.w55 { width: 55%; }
.pk-bar.w60 { width: 60%; } .pk-bar.w66 { width: 66%; } .pk-bar.w70 { width: 70%; }
.pk-row { display: flex; align-items: center; gap: 10px; }
.pk-col { display: flex; flex-direction: column; gap: 7px; flex: 1; min-width: 0; }
.pk-li { display: flex; align-items: center; gap: 9px; }
.pk-dot { width: 7px; height: 7px; border-radius: 99px; flex: none; background: rgba(255,255,255,0.3); }
.pk-dot.acc { background: var(--pk); } .pk-dot.green { background: #34c759; }
.pk-chip { width: 30px; height: 30px; border-radius: 9px; flex: none; background: rgba(255,255,255,0.2); }
.pk-chip.acc { background: var(--pk); }
.pk-arrow { width: 15px; height: 15px; color: rgba(255,255,255,0.45); margin-left: auto; flex: none; }
.pk-img { display: block; border-radius: 9px; background: #222 center/cover no-repeat; }
.pk-img.big { width: 100%; height: 64px; background-image: url('/bg/bg-mq07xtv7uws.jpg'); }
.pk-img.sq { width: 42px; height: 42px; flex: none; background-image: url('/bg/bg-mpzms547qrv.jpg'); }
.pk-row.g3 { gap: 8px; }
.pk-row.g3 .pk-img { flex: 1; height: 52px; }
.pk-app { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 13px; margin: 0 auto; }
.pk-app svg { width: 28px; height: 28px; }
.pk-app.wa { background: #25d366; }
.pk-map { display: block; width: 100%; height: 64px; border-radius: 9px; background: radial-gradient(120% 100% at 50% 0%, #1e2a1e, #14160f); display: flex; align-items: center; justify-content: center; }
.pk-pin { width: 26px; height: 26px; fill: var(--pk); }
/* icon picker (link widget) */
.icon-pick { display: flex; flex-wrap: wrap; gap: 8px; }
.ic-opt { width: 46px; height: 42px; display: grid; place-items: center; border: 1px solid rgba(255,255,255,0.12); border-radius: 11px; background: transparent; color: #fff; cursor: pointer; font: inherit; font-size: 12px; font-weight: 600; }
.ic-opt:hover { border-color: rgba(255,255,255,0.34); }
.ic-opt.on { background: #fff; color: #111; border-color: #fff; }
.ic-opt svg { width: 18px; height: 18px; }
/* hours editor rows */
.hours-row { display: grid; grid-template-columns: 54px 1fr auto; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid rgba(255,255,255,0.07); }
.hours-row .d { font-weight: 600; }
.hours-row .times { display: flex; gap: 8px; align-items: center; }
.hours-row .times .input { padding: 9px 10px; font-size: 14px; }
.hours-row.is-closed .times { opacity: .35; pointer-events: none; }
.toggle { display: inline-flex; align-items: center; cursor: pointer; }
.toggle input { display: none; }
.toggle .track { width: 46px; height: 28px; border-radius: 999px; background: rgba(255,255,255,0.16); position: relative; transition: background .18s; }
.toggle .track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%; background: #fff; transition: transform .18s; }
.toggle input:checked + .track { background: var(--qck); }
.toggle input:checked + .track::after { transform: translateX(18px); }
/* custom-domain stepper */
.dstepper { display: flex; align-items: center; justify-content: center; margin: 4px 0 22px; }
.dnode { display: flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.4); font-size: 14px; font-weight: 600; }
.dnode .num { width: 26px; height: 26px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.18); display: grid; place-items: center; font-size: 13px; }
.dnode.on { color: #fff; } .dnode.on .num { background: #fff; color: #111; border-color: #fff; }
.dnode.done .num { background: var(--qck); color: var(--qck-ink); border-color: var(--qck); }
.dnode.done .num svg { width: 14px; height: 14px; }
.dline { width: 34px; height: 1px; background: rgba(255,255,255,0.14); margin: 0 8px; }
.dctr { text-align: center; }
.dctr h2 { text-align: center; }
.dctr .sub { text-align: center; }
.drec { background: #161617; border: 1px solid rgba(255,255,255,0.08); border-radius: 16px; overflow: hidden; margin: 16px 0; text-align: left; }
.drec .r { display: flex; align-items: center; gap: 12px; padding: 14px 16px; border-bottom: 1px solid rgba(255,255,255,0.06); }
.drec .r:last-child { border-bottom: 0; }
.drec .k { width: 56px; color: rgba(255,255,255,0.4); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; }
.drec .v { flex: 1; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 14px; word-break: break-all; }
.drec .cp { border: 1px solid rgba(255,255,255,0.14); background: transparent; color: #fff; font: inherit; font-size: 12px; font-weight: 600; padding: 6px 12px; border-radius: 9px; cursor: pointer; }
.drec .cp:hover { background: rgba(255,255,255,0.1); }
.dbadge { width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center; margin: 0 auto 14px; }
.dbadge.ok { background: rgba(95,208,138,0.14); color: #5fd08a; }
.dbadge.err { background: rgba(255,138,138,0.14); color: #ff8a8a; }
.dbadge svg { width: 30px; height: 30px; display: block; }
/* ============================== BOOKING WIDGET ============================== */
.wg-booking { container-type: inline-size; display: flex; flex-direction: column; gap: 14px; padding: clamp(16px, 3cqw, 26px); }
.bk-clickable { cursor: pointer; }
.bk-empty, .bk-noslots { color: var(--ink-faint); font-size: 14px; padding: 10px 2px; }
.bk-ic { width: 46px; height: 46px; border-radius: 14px; flex: 0 0 auto; display: grid; place-items: center; background: color-mix(in srgb, var(--accent) 16%, transparent); color: var(--accent); }
.bk-ic svg { width: 22px; height: 22px; }
.bk-thumb { width: 46px; height: 46px; border-radius: 14px; flex: 0 0 auto; background-size: cover; background-position: center; }
/* your-booking banner */
.bk-mine { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px 14px; border-radius: 14px; background: color-mix(in srgb, var(--accent) 12%, transparent); }
.bk-mine-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bk-mine-tx b { font-size: 13px; } .bk-mine-tx span { font-size: 12px; color: var(--ink-dim); }
.bk-mine-btn { flex: 0 0 auto; border: 0; cursor: pointer; font: inherit; font-weight: 700; font-size: 13px; padding: 8px 14px; border-radius: 999px; background: var(--accent); color: var(--on-accent); }
/* compact (s) */
.bk-srow { display: flex; align-items: center; gap: 13px; }
.bk-ctx { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.bk-nm { font-weight: 700; font-size: clamp(16px, 4cqw, 20px); color: var(--ink); }
.bk-meta { font-size: 13px; color: var(--ink-dim); }
.bk-bookbtn, .bk-allbtn { width: 100%; }
.bk-allbtn { border: 0; cursor: pointer; font: inherit; font-weight: 700; background: transparent; color: var(--accent); padding: 6px; }
/* list (multi-service) */
.bk-listttl { font-weight: 800; font-size: clamp(17px, 3cqw, 22px); color: var(--ink); margin-bottom: 2px; }
.bk-list { display: flex; flex-direction: column; gap: 10px; }
.bk-row { display: flex; align-items: center; gap: 13px; width: 100%; text-align: left; cursor: pointer; border: 1px solid color-mix(in srgb, var(--ink) 9%, transparent); background: color-mix(in srgb, var(--ink) 3%, transparent); border-radius: 16px; padding: 12px 14px; font: inherit; }
.bk-row:hover { border-color: color-mix(in srgb, var(--ink) 18%, transparent); }
.bk-row-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.bk-row-nm { font-weight: 700; color: var(--ink); }
.bk-row-meta { font-size: 13px; color: var(--ink-dim); }
.bk-row-go { flex: 0 0 auto; padding: 9px 18px; font-size: 14px; }
/* mid (m) */
.bk-midhead { display: flex; flex-direction: column; gap: 3px; margin-bottom: 2px; }
.bk-chips { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; }
.bk-chip { border: 1px solid color-mix(in srgb, var(--ink) 10%, transparent); background: color-mix(in srgb, var(--ink) 6%, transparent); color: var(--ink); border-radius: 14px; padding: 14px 8px; font: inherit; font-weight: 700; cursor: pointer; }
.bk-chip:hover, .bk-tbtn:hover, .bk-cd:not(.off):not(.on):hover { border-color: var(--accent); }
.bk-chip.on, .bk-tbtn.on { background: var(--accent); color: var(--on-accent); border-color: transparent; }
/* large (detail + calendar + times) */
.bk-large { display: flex; flex-direction: column; gap: 16px; align-items: stretch; }
.bk-next { display: flex; align-items: center; gap: 9px; color: var(--ink-dim); font-size: 14px; font-weight: 600; }
.bk-next svg { width: 17px; height: 17px; opacity: .8; }
.bk-next.off { opacity: .55; }
.bk-bookbtn { width: 100%; }
.bk-detail { display: flex; flex-direction: column; gap: 14px; }
.bk-detail .bk-ic { width: 52px; height: 52px; }
.bk-dt { display: flex; flex-direction: column; gap: 12px; }
.bk-dt .bk-nm { font-size: clamp(22px, 4cqw, 30px); font-weight: 800; line-height: 1.05; }
.bk-facts { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.bk-facts li { display: flex; align-items: center; gap: 11px; color: var(--ink-dim); font-size: 15px; }
.bk-facts svg { width: 18px; height: 18px; flex: 0 0 auto; opacity: .8; }
.bk-desc { color: var(--ink-faint); font-size: 14px; line-height: 1.5; margin: 0; }
/* calendar */
.bk-cal-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.bk-cal-h b { font-size: 19px; font-weight: 800; color: var(--ink); }
.bk-cal-nav { display: flex; gap: 8px; }
.bk-nav { width: 34px; height: 34px; border-radius: 10px; border: 1px solid color-mix(in srgb, var(--ink) 12%, transparent); background: transparent; color: var(--ink); cursor: pointer; display: grid; place-items: center; }
.bk-nav svg { width: 16px; height: 16px; }
.bk-cal-dh { display: grid; grid-template-columns: repeat(7, 1fr); margin-bottom: 6px; }
.bk-cdh { text-align: center; font-size: 11px; font-weight: 700; letter-spacing: .04em; color: var(--ink-faint); text-transform: uppercase; }
.bk-cal-days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.bk-cd { aspect-ratio: 1; border: 0; background: transparent; color: var(--ink); font: inherit; font-weight: 600; font-size: 15px; border-radius: 12px; cursor: pointer; display: grid; place-items: center; }
.bk-cd.empty { pointer-events: none; }
.bk-cd.off { color: var(--ink-faint); opacity: .45; cursor: default; }
.bk-cd.on { background: var(--accent); color: var(--on-accent); font-weight: 800; }
/* times column */
.bk-times { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.bk-times-h { font-weight: 700; color: var(--ink); font-size: 15px; }
.bk-tlist { display: flex; flex-direction: column; gap: 9px; }
.bk-tbtn { border: 1px solid color-mix(in srgb, var(--ink) 10%, transparent); background: color-mix(in srgb, var(--ink) 6%, transparent); color: var(--ink); border-radius: 14px; padding: 13px 10px; font: inherit; font-weight: 700; cursor: pointer; }
/* ---- booking flow modal — a centred, theme-coloured card (like the other widgets' modal) ---- */
.bk-flowcard { width: min(960px, 100%); padding: clamp(22px, 3cqw, 38px); }
.bk-mbody { display: flex; flex-direction: column; gap: 16px; max-width: none; }
.bk-formcol { width: 100%; max-width: 460px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; }
.bk-mhead { font-size: clamp(20px, 3cqw, 26px); font-weight: 800; letter-spacing: -.02em; margin: 0; color: var(--ink); }
.bk-flow-pick { display: grid; gap: clamp(18px, 2.6cqw, 30px); grid-template-columns: 1fr; }
@media (min-width: 560px) and (max-width: 819px) { .bk-flow-pick { grid-template-columns: 1.5fr 1fr; align-items: start; } .bk-flow-pick .bk-cal { display: none; } }
@media (min-width: 820px) { .bk-flow-pick { grid-template-columns: 0.9fr 1.4fr 0.85fr; align-items: start; } }
.bk-flowcard .bk-detail .bk-nm { font-size: 22px; }
.bk-flowcard .bk-detail .bk-thumb, .bk-flowcard .bk-detail .bk-ic { width: 100%; height: 150px; border-radius: 16px; }
.bk-flowcard .bk-cont { width: 100%; margin-top: 4px; }
.bk-flowcard .input { width: 100%; height: 54px; border-radius: 14px; border: 1px solid color-mix(in srgb, var(--ink) 16%, transparent); background: color-mix(in srgb, var(--ink) 5%, transparent); color: var(--ink); font: inherit; font-size: 16px; font-weight: 600; padding: 0 16px; }
.bk-flowcard .input::placeholder { color: var(--ink-dim, rgba(128,128,128,.7)); }
.bk-flowcard .input:focus { outline: none; border-color: var(--accent); }
.bk-sum { border: 1px solid color-mix(in srgb, var(--ink, #fff) 10%, transparent); border-radius: 16px; padding: 14px 16px; display: flex; flex-direction: column; gap: 3px; }
.bk-sum-nm { font-weight: 800; font-size: 17px; }
.bk-sum-when { color: var(--accent); font-weight: 700; font-size: 14px; }
.bk-sum-meta { color: var(--ink-dim, #999); font-size: 13px; }
.bk-in { width: 100%; }
.bk-pay { display: flex; align-items: center; gap: 10px; color: var(--ink-dim, #999); font-size: 14px; }
.bk-pay svg { width: 18px; height: 18px; }
.bk-err { color: #ff8a8a; font-size: 13px; font-weight: 600; }
/* confirmation */
.bk-done { display: flex; flex-direction: column; align-items: center; gap: 14px; text-align: center; padding-top: 6px; }
.bk-done-ic { color: var(--accent); } .bk-done-ic svg { width: 52px; height: 52px; }
.bk-done-h { font-size: 24px; font-weight: 800; margin: 0; }
.bk-done .bk-sum { width: 100%; text-align: left; }
.bk-done-acts { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; width: 100%; }
.bk-cal-btn { display: inline-flex; align-items: center; gap: 8px; text-decoration: none; }
.bk-cal-btn svg { width: 17px; height: 17px; }
.bk-done-note { font-size: 13px; color: var(--ink-faint, #888); margin: 0; }
.bk-done-note a { color: var(--accent); }
/* manage modal */
.bk-mlist { display: flex; flex-direction: column; gap: 10px; }
.bk-mrow { display: flex; align-items: center; justify-content: space-between; gap: 12px; border: 1px solid color-mix(in srgb, var(--ink, #fff) 10%, transparent); border-radius: 14px; padding: 12px 14px; }
.bk-mrow.past { opacity: .5; }
.bk-mrow-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bk-mrow-tx span { font-size: 13px; color: var(--ink-dim, #999); }
.bk-mcancel { flex: 0 0 auto; border: 1px solid color-mix(in srgb, #ff8a8a 50%, transparent); background: transparent; color: #ff8a8a; border-radius: 999px; padding: 7px 13px; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
.bk-mhint { color: var(--ink-dim, #999); font-size: 14px; margin: 0 0 4px; }
/* booking settings (owner) */
.bk-days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-bottom: 14px; }
.bk-daychip { border: 1px solid rgba(255,255,255,0.12); background: #161617; color: rgba(255,255,255,0.6); border-radius: 10px; padding: 10px 2px; font: inherit; font-size: 12px; font-weight: 700; cursor: pointer; }
.bk-daychip.on { background: var(--brand-accent, #C87F5E); color: #fff; border-color: transparent; }
.bk-calrow { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; background: #1d1d22; border: 1px solid rgba(255,255,255,.1); border-radius: 14px; padding: 12px 14px; cursor: pointer; font: inherit; color: inherit; transition: border-color .15s, background .15s; }
.bk-calrow:hover { border-color: rgba(255,255,255,.28); background: rgba(255,255,255,.04); }
.bk-calrow.on { cursor: default; }
.bk-calic { flex: 0 0 auto; width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center; background: rgba(255,255,255,.07); }
.bk-calic svg { width: 20px; height: 20px; }
.bk-calic.ok { background: rgba(48,209,88,.14); color: #30D158; }
.bk-caltx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.bk-caltx b { font-size: 14px; font-weight: 600; }
.bk-caltx span { font-size: 12.5px; color: rgba(255,255,255,.55); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bk-calgo { flex: 0 0 auto; color: rgba(255,255,255,.4); display: grid; place-items: center; }
.bk-calgo svg { width: 18px; height: 18px; }
.bk-caldis { flex: 0 0 auto; border: 1px solid rgba(255,255,255,.16); background: transparent; color: rgba(255,255,255,.6); border-radius: 999px; padding: 7px 13px; font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; }
.bk-caldis:hover { border-color: rgba(255,138,138,.5); color: #ff8a8a; }
.bk-set-empty { text-align: center; padding: 30px 10px; }
.bk-set-emic { color: var(--accent, #C87F5E); display: inline-flex; margin-bottom: 12px; } .bk-set-emic svg { width: 44px; height: 44px; }
.bk-set-empty h3 { margin: 0 0 8px; font-size: 18px; }
.bk-set-empty p { color: rgba(255,255,255,.55); font-size: 14px; line-height: 1.5; margin: 0 0 6px; }
/* ============================ SHOP widget ============================ */
.wg-shop { container-type: inline-size; display: flex; flex-direction: column; gap: 18px; padding: clamp(16px, 3cqw, 26px); }
.sh-empty { color: var(--ink-faint, rgba(255,255,255,.4)); text-align: center; padding: 24px; font-size: 14px; }
/* storefront header band — text (natural width) · thumbnail strip (fills the gap, clips extras) · CTA.
   Stacks to a tidy vertical card when the widget is narrow (compact size). */
.sh-head { display: flex; align-items: center; gap: 16px; min-width: 0; }
.sh-thumbs { display: flex; gap: 8px; flex: 1 1 auto; min-width: 0; overflow: hidden; }
.sh-thumb, .sh-noimg { width: clamp(46px, 7cqw, 72px); aspect-ratio: 1; border-radius: 14px; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 8%, transparent); display: block; flex: 0 0 auto; }
.sh-noimg { display: grid; place-items: center; overflow: hidden; }
/* no image → a soft accent block with the product's initial (same height, on-brand, never a broken-looking box) */
.sh-mono { background: linear-gradient(145deg, color-mix(in srgb, var(--accent) 26%, var(--card-bg, #1a1a1f)), color-mix(in srgb, var(--accent) 8%, var(--card-bg, #1a1a1f))); }
.sh-headtx { flex: 0 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.sh-over { font-size: 11.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); }
.sh-storenm { font-size: clamp(19px, 3cqw, 28px); font-weight: 800; letter-spacing: -.02em; line-height: 1.1; color: var(--ink); margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sh-meta { font-size: 14px; color: var(--ink-dim, rgba(255,255,255,.6)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sh-headcta { flex: 0 0 auto; }
.sh-browse { flex: 0 0 auto; white-space: nowrap; }
.sh-headonly { justify-content: center; }
/* narrow + TALL (compact size, roomy height) → stack: thumbnail row on top, identity, full-width CTA */
.sh-stack .sh-head { flex-wrap: wrap; gap: 13px; }
.sh-stack .sh-headtx { flex: 1 1 100%; order: 1; }
.sh-stack .sh-thumbs { flex: 1 1 100%; order: 0; }
.sh-stack .sh-thumbs .sh-thumb, .sh-stack .sh-thumbs .sh-noimg { flex: 1 1 0; width: auto; }
.sh-stack .sh-thumbs .sh-thumb:nth-child(n+4), .sh-stack .sh-thumbs .sh-noimg:nth-child(n+4) { display: none; }
.sh-stack .sh-headcta { flex: 1 1 100%; order: 2; }
.sh-stack .sh-headcta .sh-browse, .sh-stack .sh-headcta .sh-cartpill { width: 100%; justify-content: center; }
/* narrow + SHORT → one tidy row, drop the thumbnails so nothing overflows */
.sh-tight .sh-thumbs { display: none; }
.sh-tight .sh-headtx { flex: 1 1 auto; }
.sh-cartpill { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 8px; border: 1px solid color-mix(in srgb, var(--ink) 14%, transparent); background: color-mix(in srgb, var(--ink) 5%, transparent); color: var(--ink); border-radius: 999px; padding: 9px 15px; font: inherit; font-size: 13.5px; font-weight: 700; cursor: pointer; }
.sh-cartpill svg { width: 17px; height: 17px; }
.sh-cartpill:hover { border-color: color-mix(in srgb, var(--ink) 30%, transparent); }
/* grid head */
.sh-gridhead { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.sh-gridttl { margin: 0; font-size: clamp(18px, 2.6cqw, 24px); font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
.sh-viewall { display: inline-flex; align-items: center; gap: 5px; border: 0; background: none; color: var(--accent); font: inherit; font-size: 14px; font-weight: 700; cursor: pointer; }
.sh-viewall svg { width: 15px; height: 15px; }
/* product grid */
.sh-grid { display: grid; gap: clamp(10px, 1.6cqw, 16px); grid-template-columns: repeat(2, 1fr); }
@container (min-width: 540px) { .sh-grid { grid-template-columns: repeat(3, 1fr); } }
@container (min-width: 760px) { .sh-grid { grid-template-columns: repeat(4, 1fr); } }
.sh-card { display: flex; flex-direction: column; gap: 0; border: 1px solid color-mix(in srgb, var(--ink) 9%, transparent); border-radius: 16px; overflow: hidden; background: color-mix(in srgb, var(--ink) 3%, transparent); cursor: pointer; transition: border-color .14s, transform .14s; text-align: left; }
.sh-card:hover { border-color: color-mix(in srgb, var(--ink) 22%, transparent); transform: translateY(-2px); }
.sh-cardimg { width: 100%; aspect-ratio: 16/10; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 7%, transparent); display: block; }
.sh-card .sh-noimg { width: 100%; aspect-ratio: 16/10; border-radius: 0; }
.sh-cardbody { display: flex; flex-direction: column; gap: 10px; padding: 13px 14px 14px; flex: 1 1 auto; }
.sh-cardtx { display: flex; flex-direction: column; gap: 2px; }
.sh-cardnm { font-weight: 700; font-size: 15px; color: var(--ink); }
.sh-cardsub { font-size: 12.5px; color: var(--ink-dim, rgba(255,255,255,.55)); }
.sh-cardfoot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: auto; }
.sh-price { font-weight: 800; font-size: 17px; color: var(--ink); }
.sh-add { display: inline-flex; align-items: center; gap: 6px; border: 0; background: var(--accent); color: var(--on-accent, #fff); border-radius: 11px; padding: 8px 12px; font: inherit; font-weight: 700; font-size: 13.5px; cursor: pointer; }
.sh-add svg { width: 16px; height: 16px; }
.sh-add .sh-addtx { display: none; }
@container (min-width: 540px) { .sh-add { padding: 8px 14px; } .sh-add .sh-addtx { display: inline; } .sh-add svg { display: none; } }
/* ---- shop modals (themed wm-card) ---- */
.sh-prodcard { width: min(980px, 100%); padding: clamp(20px, 3cqw, 38px); }
.sh-prodbody { display: grid; gap: clamp(20px, 3cqw, 36px); grid-template-columns: 1fr; max-width: none; }
@media (min-width: 720px) { .sh-prodbody { grid-template-columns: 1fr 1fr; align-items: start; } }
.sh-gallery { display: flex; flex-direction: column; gap: 12px; }
.sh-galimg, .sh-gallery .sh-noimg { display: block; width: 100%; aspect-ratio: 1; border-radius: 18px; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 8%, transparent); }
.sh-galthumbs { display: flex; gap: 10px; }
.sh-galt { flex: 1 1 0; aspect-ratio: 1; border-radius: 12px; overflow: hidden; border: 2px solid transparent; background: none; padding: 0; cursor: pointer; }
.sh-galt.on { border-color: var(--accent); }
.sh-galtimg, .sh-galt .sh-noimg { display: block; width: 100%; height: 100%; border-radius: 0; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 8%, transparent); }
.sh-prodinfo { display: flex; flex-direction: column; gap: 14px; }
.sh-bcrumb { font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); }
.sh-bcrumb span { color: var(--ink-faint, rgba(255,255,255,.45)); font-weight: 600; }
.sh-badge { align-self: flex-start; font-size: 11.5px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--accent); }
.sh-prodttl { margin: 0; font-size: clamp(26px, 4cqw, 38px); font-weight: 800; letter-spacing: -.02em; line-height: 1.02; color: var(--ink); }
.sh-rating { display: flex; align-items: center; gap: 9px; font-size: 14px; color: var(--ink-dim, rgba(255,255,255,.6)); }
.sh-stars { display: inline-flex; letter-spacing: 1px; }
.sh-star { color: color-mix(in srgb, var(--ink) 22%, transparent); } .sh-star.on { color: var(--accent); }
.sh-proddsc { margin: 0; font-size: 15px; line-height: 1.55; color: var(--ink-dim, rgba(255,255,255,.7)); }
.sh-optgrp { display: flex; flex-direction: column; gap: 9px; }
.sh-optlbl { font-size: 11.5px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-faint, rgba(255,255,255,.5)); }
.sh-optrow { display: flex; flex-wrap: wrap; gap: 9px; }
.sh-swatch { width: 38px; height: 38px; border-radius: 11px; border: 2px solid transparent; outline: 1px solid color-mix(in srgb, var(--ink) 14%, transparent); outline-offset: -1px; cursor: pointer; padding: 0; }
.sh-swatch.on { border-color: var(--ink); outline-color: var(--ink); }
.sh-optbtn { border: 1px solid color-mix(in srgb, var(--ink) 16%, transparent); background: transparent; color: var(--ink); border-radius: 11px; padding: 9px 16px; font: inherit; font-weight: 700; font-size: 14px; cursor: pointer; }
.sh-optbtn.on { background: var(--accent); color: var(--on-accent, #fff); border-color: transparent; }
.sh-check { display: flex; align-items: center; gap: 9px; font-size: 14px; color: var(--ink-dim, rgba(255,255,255,.65)); }
.sh-check svg { width: 17px; height: 17px; flex: 0 0 auto; }
.sh-check.ok svg { color: #30D158; }
.sh-check.off { color: #ff8a8a; font-weight: 600; }
.sh-prodbuy { display: flex; align-items: center; gap: 14px; margin-top: 6px; flex-wrap: wrap; }
.sh-prodprice { font-size: 30px; font-weight: 800; color: var(--ink); }
.sh-qty { display: inline-flex; align-items: center; gap: 4px; border: 1px solid color-mix(in srgb, var(--ink) 14%, transparent); border-radius: 12px; padding: 4px; }
.sh-qty button { width: 34px; height: 34px; border: 0; background: none; color: var(--ink); font: inherit; font-size: 19px; cursor: pointer; border-radius: 9px; }
.sh-qty button:hover { background: color-mix(in srgb, var(--ink) 8%, transparent); }
.sh-qty span { min-width: 26px; text-align: center; font-weight: 700; color: var(--ink); }
.sh-addcart { flex: 1 1 auto; min-width: 160px; }
.sh-addcart[disabled] { opacity: .5; pointer-events: none; }
/* cart modal */
.sh-cartcard { width: min(460px, 100%); padding: clamp(22px, 3cqw, 34px); }
.sh-mhead { margin: 0; font-size: clamp(20px, 3cqw, 26px); font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
.sh-clist { display: flex; flex-direction: column; gap: 12px; }
.sh-citem { display: flex; align-items: center; gap: 13px; border: 1px solid color-mix(in srgb, var(--ink) 10%, transparent); border-radius: 14px; padding: 11px 13px; }
.sh-cthumbimg, .sh-citem .sh-noimg { display: block; width: 46px; height: 46px; border-radius: 11px; flex: 0 0 auto; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 8%, transparent); }
.sh-ctx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sh-ctx b { font-size: 14.5px; color: var(--ink); } .sh-ctx span { font-size: 12.5px; color: var(--ink-dim, rgba(255,255,255,.55)); }
.sh-cqty { display: inline-flex; align-items: center; gap: 2px; flex: 0 0 auto; }
.sh-cqty button { width: 28px; height: 28px; border: 1px solid color-mix(in srgb, var(--ink) 14%, transparent); background: none; color: var(--ink); border-radius: 8px; font: inherit; font-size: 16px; cursor: pointer; }
.sh-cqty span { min-width: 24px; text-align: center; font-weight: 700; font-size: 14px; color: var(--ink); }
.sh-ctotal { display: flex; align-items: center; justify-content: space-between; padding: 4px 2px; }
.sh-ctotal span { color: var(--ink-dim, rgba(255,255,255,.6)); font-size: 15px; }
.sh-ctotal b { font-size: 24px; font-weight: 800; color: var(--ink); }
.sh-checkout { display: inline-flex; align-items: center; justify-content: center; gap: 9px; width: 100%; }
.sh-checkout svg { width: 18px; height: 18px; }
/* browse modal */
.sh-browsecard { width: min(1080px, 100%); padding: clamp(20px, 3cqw, 38px); }
.sh-browsebody { display: flex; flex-direction: column; gap: 18px; max-width: none; }
.sh-browsehead { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.sh-browsen { font-size: 13px; color: var(--ink-faint, rgba(255,255,255,.45)); }
.sh-browsegrid { grid-template-columns: repeat(2, 1fr); }
@media (min-width: 620px) { .sh-browsegrid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 900px) { .sh-browsegrid { grid-template-columns: repeat(4, 1fr); } }
.sh-browsecart { position: sticky; bottom: 0; }
/* product editor (owner sub-modal, inside fm-card) */
.sh-edopt { border: 1px solid rgba(255,255,255,.1); border-radius: 14px; margin-bottom: 9px; overflow: hidden; }
.sh-edopt.open { background: rgba(255,255,255,.02); }
.sh-edopthd { display: flex; align-items: center; gap: 10px; width: 100%; padding: 13px 14px; background: none; border: 0; font: inherit; color: #fff; cursor: pointer; text-align: left; }
.sh-edchev { flex: 0 0 auto; display: inline-flex; color: rgba(255,255,255,.45); transition: transform .15s; }
.sh-edchev svg { width: 16px; height: 16px; }
.sh-edopt.open .sh-edchev { transform: rotate(90deg); }
.sh-edopttx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sh-edopttx b { font-size: 14px; font-weight: 700; }
.sh-edopttx span { font-size: 12.5px; color: rgba(255,255,255,.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sh-edoptbody { padding: 0 14px 14px; display: flex; flex-direction: column; gap: 10px; }
.sh-edopt .input, .sh-edoptn { height: 44px !important; font-size: 14px !important; border-radius: 11px !important; }
.sh-edtype { display: inline-flex; gap: 4px; background: rgba(255,255,255,.05); border-radius: 11px; padding: 4px; align-self: flex-start; }
.sh-edtypebtn { border: 0; background: none; color: rgba(255,255,255,.6); font: inherit; font-size: 13px; font-weight: 700; padding: 7px 18px; border-radius: 8px; cursor: pointer; }
.sh-edtypebtn.on { background: #fff; color: #111; }
.sh-edx { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 9px; border: 0; background: rgba(255,255,255,.06); color: rgba(255,255,255,.55); cursor: pointer; display: grid; place-items: center; }
.sh-edx:hover { background: rgba(255,138,138,.18); color: #ff8a8a; }
.sh-edx svg { width: 13px; height: 13px; }
.sh-edvals { display: flex; flex-direction: column; gap: 7px; }
/* wraps so the colour field can expand to the full picker on its own line */
.sh-edval { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.sh-edvaln { flex: 1 1 140px; min-width: 0; }
/* holds our own colour field (swatch + hex + caret), not a native 44px colour box */
.sh-edcolor { flex: 0 1 auto; min-width: 118px; }
.sh-edcolor .cf { width: 100%; }
.sh-edcolor .cf.open { flex: 1 1 100%; }
.sh-edval:has(.cf.open) .sh-edcolor { flex: 1 1 100%; order: 2; }
.sh-edvaladd { display: inline-flex; align-items: center; gap: 6px; align-self: flex-start; border: 1px dashed rgba(255,255,255,.2); background: none; color: rgba(255,255,255,.6); border-radius: 10px; padding: 8px 13px; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
.sh-edvaladd svg { width: 15px; height: 15px; }
/* floating cart bar — flows at the top of the page whenever the cart has items */
.sh-cartbar { position: fixed; top: 14px; left: 50%; transform: translateX(-50%); z-index: 150; display: inline-flex; align-items: center; gap: 9px; border: 0; cursor: pointer; font: inherit; font-weight: 700; font-size: 14px; padding: 11px 20px; border-radius: 999px; background: var(--sh-bar-bg, #C87F5E); color: var(--sh-bar-fg, #fff); box-shadow: 0 10px 30px -8px rgba(0,0,0,.45); animation: sh-bar-in .26s cubic-bezier(.2,.9,.3,1); }
.sh-cartbar svg { width: 18px; height: 18px; }
.sh-cartbar:hover { filter: brightness(1.05); }
@keyframes sh-bar-in { from { opacity: 0; transform: translate(-50%, -12px); } to { opacity: 1; transform: translate(-50%, 0); } }
body.wm-open .sh-cartbar { opacity: 0; pointer-events: none; }
/* ============================ FAQ widget ============================ */
.wg-faq { container-type: inline-size; display: flex; flex-direction: column; gap: 14px; padding: clamp(14px, 2.5cqw, 22px); }
.faq-head { font-size: clamp(18px, 2.6cqw, 24px); font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
.faq-list { display: flex; flex-direction: column; gap: 10px; }
.faq-item { border: 1px solid color-mix(in srgb, var(--ink) 9%, transparent); border-radius: 16px; overflow: hidden; background: color-mix(in srgb, var(--ink) 3%, transparent); transition: background .15s, border-color .15s; }
.faq-item.open { background: color-mix(in srgb, var(--ink) 6%, transparent); border-color: color-mix(in srgb, var(--ink) 13%, transparent); }
.faq-q { display: flex; align-items: center; gap: 14px; width: 100%; text-align: left; background: none; border: 0; font: inherit; color: var(--ink); cursor: pointer; padding: 16px 18px; }
.faq-qtx { flex: 1 1 auto; min-width: 0; font-family: var(--h1-font, var(--font)); font-weight: 700; font-size: clamp(15px, 1.8cqw, 17px); line-height: 1.3; }
.faq-tog { flex: 0 0 auto; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; background: color-mix(in srgb, var(--ink) 8%, transparent); color: var(--ink); transition: background .15s, color .15s; }
.faq-tog svg { width: 18px; height: 18px; }
.faq-item.open .faq-tog { background: var(--accent); color: var(--on-accent, #fff); }
.faq-a { padding: 0 18px 18px; color: var(--ink-dim, rgba(255,255,255,.62)); font-size: clamp(14px, 1.6cqw, 15px); line-height: 1.6; max-width: 62ch; }
.faq-empty { color: var(--ink-faint, rgba(255,255,255,.4)); text-align: center; padding: 22px; font-size: 14px; }
/* card preview → whole card opens the modal; items don't capture clicks */
.faq-clickable { cursor: pointer; }
.faq-clickable .faq-item { pointer-events: none; }
.faq-more { font-size: 13.5px; font-weight: 700; color: var(--accent); padding: 6px 4px 0; }
/* compact → opens the modal */
.wg-faq-compact { padding: clamp(14px, 2.5cqw, 20px); }
.faq-compact { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; background: none; border: 0; font: inherit; color: var(--ink); cursor: pointer; }
.faq-ctx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.faq-cover { font-size: clamp(18px, 3cqw, 24px); font-weight: 800; letter-spacing: -.02em; }
.faq-cmeta { font-size: 13.5px; color: var(--ink-dim, rgba(255,255,255,.55)); }
.faq-cgo { flex: 0 0 auto; color: var(--ink-dim, rgba(255,255,255,.45)); display: grid; place-items: center; }
.faq-cgo svg { width: 18px; height: 18px; }
/* modal */
.faq-modalcard { width: min(680px, 100%); padding: clamp(22px, 3cqw, 38px); }
.faq-modalbody { display: flex; flex-direction: column; gap: 18px; max-width: none; }
.faq-mhead { margin: 0; font-size: clamp(22px, 3cqw, 28px); font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
/* ===================== Onboarding tour (spotlight) ===================== */
#onb { position: fixed; inset: 0; z-index: 9000; pointer-events: none; font-family: var(--qck-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif); }
.onb-mask { position: fixed; background: rgba(6,6,10,.66); pointer-events: auto; transition: all .28s cubic-bezier(.2,.8,.2,1); -webkit-backdrop-filter: blur(1px); backdrop-filter: blur(1px); }
.onb-ring { position: fixed; border-radius: 14px; box-shadow: 0 0 0 2px #C87F5E, 0 0 0 6px rgba(200,127,94,.25), 0 0 28px 4px rgba(200,127,94,.35); pointer-events: none; transition: all .28s cubic-bezier(.2,.8,.2,1); }
.onb-tip { position: fixed; z-index: 9002; background: #161617; color: #fff; border: 1px solid rgba(255,255,255,.12); border-radius: 16px; padding: 15px 16px; box-shadow: 0 24px 60px -18px rgba(0,0,0,.75); pointer-events: auto; transition: top .28s cubic-bezier(.2,.8,.2,1), left .28s cubic-bezier(.2,.8,.2,1); }
.onb-tip::before { content: ""; position: absolute; top: -7px; left: 28px; width: 14px; height: 14px; background: #161617; border-left: 1px solid rgba(255,255,255,.12); border-top: 1px solid rgba(255,255,255,.12); transform: rotate(45deg); }
.onb-tip.above::before { top: auto; bottom: -7px; transform: rotate(225deg); }
.onb-tx { font-size: 14.5px; line-height: 1.5; font-weight: 500; margin-bottom: 12px; }
.onb-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.onb-step { font-size: 12px; font-weight: 700; color: rgba(255,255,255,.4); }
.onb-acts { display: inline-flex; align-items: center; gap: 6px; }
.onb-skip { background: none; border: 0; color: rgba(255,255,255,.5); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; padding: 7px 10px; border-radius: 9px; }
.onb-skip:hover { color: #fff; }
.onb-next { background: #C87F5E; border: 0; color: #fff; font: inherit; font-size: 13.5px; font-weight: 700; cursor: pointer; padding: 8px 16px; border-radius: 9px; }
.onb-next:hover { filter: brightness(1.06); }
/* centred welcome / finish card */
#onb.onb-center { background: rgba(6,6,10,.74); pointer-events: auto; -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); }
.onb-center .onb-mask, .onb-center .onb-ring { display: none; }
.onb-center .onb-tip { left: 50% !important; top: 50% !important; transform: translate(-50%,-50%); width: min(440px, 92vw) !important; padding: 26px; text-align: center; }
.onb-center .onb-tip::before { display: none; }
.onb-card h3, .onb-tip h3 { margin: 0 0 8px; font-size: 22px; font-weight: 800; letter-spacing: -.02em; }
.onb-card p, .onb-tip p { margin: 0 0 20px; font-size: 15px; line-height: 1.55; color: rgba(255,255,255,.62); }
.onb-cardacts { display: flex; align-items: center; justify-content: center; gap: 12px; }
.onb-never { display: block; margin: 16px auto 0; background: none; border: 0; color: rgba(255,255,255,.4); font: inherit; font-size: 13px; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.onb-never:hover { color: rgba(255,255,255,.7); }
.onb-cardacts .btn-cta, .onb-done { background: #C87F5E !important; color: #fff !important; border: 0 !important; border-radius: 12px !important; padding: 13px 22px !important; font-weight: 700 !important; font-size: 15px; cursor: pointer; }
.onb-cardacts .btn-cta::after, .onb-done::after { content: none !important; }
.onb-finrow { display: flex; gap: 8px; margin-bottom: 16px; }
.onb-url { flex: 1 1 auto; min-width: 0; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.14); border-radius: 11px; color: #fff; font: inherit; font-size: 14px; padding: 11px 13px; outline: none; }
.onb-copy { flex: 0 0 auto; background: rgba(255,255,255,.1); border: 0; color: #fff; border-radius: 11px; padding: 0 16px; font: inherit; font-weight: 700; font-size: 13.5px; cursor: pointer; }
.onb-copy:hover { background: rgba(255,255,255,.18); }
.onb-done { width: 100%; }
/* ===================== Sites switcher + add-site ===================== */
.site-list { display: flex; flex-direction: column; gap: 8px; }
.site-row { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.09); border-radius: 13px; padding: 10px 12px; cursor: pointer; font: inherit; color: #fff; transition: border-color .12s, background .12s; }
.site-row:hover:not(:disabled) { border-color: rgba(255,255,255,.26); background: rgba(255,255,255,.06); }
.site-row.on { border-color: rgba(200,127,94,.5); background: rgba(200,127,94,.08); cursor: default; }
.site-thumb { flex: 0 0 auto; width: 42px; height: 42px; border-radius: 10px; background-size: cover; background-position: center; background-color: rgba(255,255,255,.08); display: grid; place-items: center; overflow: hidden; }
.site-mono { font-weight: 800; font-size: 17px; color: rgba(255,255,255,.6); }
.site-tx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.site-nm { font-weight: 700; font-size: 14.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.site-sub { font-size: 12.5px; color: rgba(255,255,255,.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.site-cur { flex: 0 0 auto; font-size: 12px; font-weight: 700; color: #C87F5E; }
.site-go { flex: 0 0 auto; color: rgba(255,255,255,.4); } .site-go svg { width: 18px; height: 18px; }
/* add-site modal */
.as-card { max-width: 520px; }
.as-modes { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; background: rgba(255,255,255,.05); border-radius: 12px; padding: 4px; margin-bottom: 14px; }
.as-mode { border: 0; background: none; color: rgba(255,255,255,.6); font: inherit; font-size: 13.5px; font-weight: 700; padding: 9px; border-radius: 9px; cursor: pointer; }
.as-mode.on { background: #fff; color: #111; }
.as-results { display: flex; flex-direction: column; gap: 7px; margin-top: 8px; max-height: 260px; overflow-y: auto; }
.as-picked { display: flex; align-items: center; gap: 9px; margin-top: 10px; color: #30D158; font-size: 14px; font-weight: 600; }
.as-picked svg { width: 18px; height: 18px; }
.as-tstrip { display: flex; gap: 12px; overflow-x: auto; padding: 4px 2px 14px; scroll-snap-type: x proximity; }
.as-tstrip::-webkit-scrollbar { height: 0; }
.as-tcard { flex: 0 0 140px; scroll-snap-align: start; border-radius: 16px; border: 1.5px solid rgba(255,255,255,.08); background: rgba(255,255,255,.03); cursor: pointer; overflow: hidden; padding: 0; position: relative; display: flex; flex-direction: column; transition: border-color .15s, transform .15s, box-shadow .15s; }
.as-tcard:hover { transform: translateY(-3px); border-color: rgba(255,255,255,.22); }
.as-tcard.on { border-color: var(--qck, #C87F5E); box-shadow: 0 0 0 3px color-mix(in srgb, var(--qck, #C87F5E) 26%, transparent); }
.as-tcard .tprev { height: 110px; overflow: hidden; }
.as-tcard.on::after { content: "✓"; position: absolute; top: 8px; right: 8px; width: 22px; height: 22px; border-radius: 50%; background: var(--qck, #C87F5E); color: #fff; font-size: 12px; font-weight: 800; display: grid; place-items: center; box-shadow: 0 2px 8px rgba(0,0,0,.45); }
.as-tname { display: block; padding: 9px 11px; color: #fff; font-size: 12.5px; font-weight: 700; letter-spacing: -.01em; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.as-tcard.on .as-tname { color: var(--qck, #C87F5E); }
/* ===================== Subscribe widget ===================== */
.wg-subscribe { container-type: inline-size; display: flex; flex-direction: column; gap: 12px; padding: clamp(16px, 3cqw, 24px); }
.sub-ttl { margin: 0; }
.sub-dsc { margin: 0; }
.sub-form { display: flex; flex-direction: column; gap: 10px; margin-top: 2px; }
.sub-names { display: grid; grid-template-columns: 1fr; gap: 10px; }
.sub-names.two { grid-template-columns: 1fr 1fr; }
.sub-mainrow { display: flex; gap: 10px; }
.sub-in { flex: 1 1 auto; min-width: 0; width: 100%; background: color-mix(in srgb, var(--ink) 6%, transparent); border: 1px solid color-mix(in srgb, var(--ink) 14%, transparent); color: var(--ink); border-radius: 12px; font: inherit; font-size: 15px; padding: 13px 15px; outline: none; }
.sub-in::placeholder { color: color-mix(in srgb, var(--ink) 42%, transparent); }
.sub-in:focus { border-color: var(--accent); }
.sub-btn { flex: 0 0 auto; white-space: nowrap; }
.sub-err { color: #ff8a8a; font-size: 13px; font-weight: 600; }
.sub-done { display: flex; align-items: center; justify-content: center; gap: 10px; text-align: center; padding: 10px 4px; color: var(--ink); font-weight: 600; font-size: 15px; min-height: 40px; }
.sub-done svg { width: 22px; height: 22px; color: var(--accent); flex: 0 0 auto; }
/* narrow → stack the button under the input */
@container (max-width: 360px) { .sub-mainrow { flex-direction: column; } .sub-btn { width: 100%; } .sub-names.two { grid-template-columns: 1fr; } }
/* short heights → hide the description so it fits */
.wg-subscribe.h-xs .sub-dsc, .wg-subscribe.h-s .sub-dsc { display: none; }
/* Assets tab — compact business-info overview card (details open in a modal) */
.ai-card { display:block; width:100%; text-align:left; background:rgba(255,255,255,0.045); border:1px solid rgba(255,255,255,0.12); border-radius:15px; padding:14px 15px; color:#fff; cursor:pointer; font:inherit; margin-bottom:20px; }
.ai-card:hover { background:rgba(255,255,255,0.08); }
.ai-card-h { display:flex; align-items:center; justify-content:space-between; margin-bottom:9px; }
.ai-card-h b { font-size:15px; }
.ai-edit { font-size:13px; color:var(--accent,#C87F5E); font-weight:650; display:inline-flex; align-items:center; gap:3px; }
.ai-rows { display:flex; flex-direction:column; gap:8px; }
.ai-row { display:flex; align-items:center; gap:9px; font-size:13.5px; color:rgba(255,255,255,0.82); }
.ai-row svg { width:16px; height:16px; opacity:.7; flex:none; }
.ai-row span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* ===== Floating top nav (site menu) ===== */
#site-nav { position: sticky; top: 12px; z-index: 40; width: 100%; max-width: 1200px; margin: 0 auto 14px; padding: 0 4px; box-sizing: border-box; }
#site-nav .snav-inner { display: flex; align-items: center; gap: 14px; padding: 9px 14px; border-radius: 999px; background: color-mix(in srgb, var(--ink,#111) 82%, transparent); backdrop-filter: blur(18px) saturate(150%); -webkit-backdrop-filter: blur(18px) saturate(150%); border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 12px 34px -18px rgba(0,0,0,0.55); }
:root:not([data-x]) #site-nav .snav-inner { background: rgba(20,20,24,0.72); }
.snav-brand { display: inline-flex; align-items: center; flex: none; text-decoration: none; color: var(--paper,#fff); font-weight: 800; font-size: 16px; }
.snav-brand img { height: 26px; width: auto; max-width: 120px; object-fit: contain; display: block; }
.snav-brandtx { letter-spacing: -0.01em; }
.snav-links { display: flex; align-items: center; justify-content: flex-start; gap: 4px; flex: 1 1 auto; overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none; }
.snav-links::-webkit-scrollbar { display: none; }
.snav-link { flex: none; text-decoration: none; color: var(--paper,#fff); opacity: .82; font-weight: 600; font-size: 13.5px; padding: 7px 12px; border-radius: 999px; white-space: nowrap; cursor: pointer; transition: opacity .15s, background .15s; }
.snav-link:hover { opacity: 1; background: rgba(255,255,255,0.08); }
.snav-gear { flex: none; width: 34px; height: 34px; display: grid; place-items: center; border-radius: 999px; border: 0; background: rgba(255,255,255,0.08); color: var(--paper,#fff); cursor: pointer; }
.snav-gear:hover { background: rgba(255,255,255,0.16); }
.snav-gear svg { width: 17px; height: 17px; }
@media (min-width: 641px) { body.is-owner:not(.preview) #site-nav { top: 74px; } }   /* sit below the Desktop/Mobile toggle in edit mode only (desktop) */
body.is-owner:not(.preview) #site-nav.nav-off .snav-inner { opacity: .5; outline: 1px dashed rgba(255,255,255,.3); }
body.preview .snav-gear, body.preview .sfoot-gear { display: none; }   /* no editor gear in preview/live */
body.preview #site-nav.nav-off, body.preview #site-footer.nav-off { display: none; }
/* The [+] add card that used to fill an empty layout slot is gone with the empty slots themselves —
   the layout closes its own tail now, so there is nowhere for one to go. Adding lives in the dock. */
/* Absorbed remainder: a lone trailing widget spans the FULL row — its card fills the whole width (so its
   background covers the row, no empty gaps) while the content inside stays a centred ~2×1 column. If the
   card has no background it just reads as content centred in the middle, which is fine. Desktop bento only. */
.w.w-fillrow > .card { width: 100%; box-sizing: border-box; padding-inline: max(22px, calc((100% - 720px) / 2)); }

/* ── SECTION HEADERS ── eyebrow · title · description · button, above a band or as a card in it.
   Everything here comes from the theme's own type tokens, so a header is the same voice as the rest
   of the page rather than a fifth typeface: --lb-* for the eyebrow, --h2-* for the title, --ds-* for
   the description, and the theme's button for the button. */
.sh { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.sh-eyebrow { font-family: var(--lb-font, var(--font)); font-size: calc(13px * var(--lb-scale, 1)); font-weight: var(--lb-weight, 600); font-style: var(--lb-style, normal); letter-spacing: .12em; text-transform: var(--lb-transform, uppercase); color: var(--lb-color, var(--ink-dim, currentColor)); }
.sh-title { margin: 0; font-family: var(--h2-font, var(--font)); font-size: calc(30px * var(--h2-scale, 1)); font-weight: var(--h2-weight, 700); font-style: var(--h2-style, normal); text-transform: var(--h2-transform, none); color: var(--h2-color, var(--ink, currentColor)); line-height: 1.12; text-wrap: balance; }
.sh-text { margin: 0; max-width: 62ch; font-family: var(--ds-font, var(--font)); font-size: calc(15.5px * var(--ds-scale, 1)); font-weight: var(--ds-weight, 400); color: var(--ds-color, var(--ink-dim, currentColor)); line-height: 1.55; }
/* THE BAND. It is not a card and it is not in the grid's cell track — it sits in a row of its own
   height (renderLayout writes the track), so it takes exactly the space its words need. */
.sec-head { padding: 26px 4px 2px; position: relative; }
.sec-head > .w-tools { top: 22px; right: 4px; }
.sec-headw { position: relative; }
#grid.bento .sec-head { grid-column: 1 / -1; }
.sh-center { align-items: center; text-align: center; }
.sh-center .sh-text { margin-inline: auto; }
/* THE CARD. Inline mode: the header takes the first slot of the section's cycle, so the layout flows
   around it exactly as it would around a widget — and it is the same material, painted from the
   preset of the block it leads. */
.sec-headw > .sh-card { height: 100%; display: flex; flex-direction: column; justify-content: center; padding: clamp(18px, 4%, 34px); box-sizing: border-box; }
.sec-headw .sh-title { font-size: calc(26px * var(--h2-scale, 1)); }
.sec-headw .sh-text { font-size: calc(14.5px * var(--ds-scale, 1)); }
@media (max-width: 760px) {
  .sec-head { padding: 18px 2px 0; }
  .sh-title { font-size: calc(24px * var(--h2-scale, 1)); }
}
.snav-burger { display: none; flex: none; width: 34px; height: 34px; border: 0; background: rgba(255,255,255,0.08); border-radius: 999px; cursor: pointer; padding: 0; flex-direction: column; align-items: center; justify-content: center; gap: 4px; }
.snav-burger span { display: block; width: 16px; height: 2px; border-radius: 2px; background: var(--paper,#fff); transition: transform .2s, opacity .2s; }
#site-nav.nav-open .snav-burger span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
#site-nav.nav-open .snav-burger span:nth-child(2) { opacity: 0; }
#site-nav.nav-open .snav-burger span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
/* Mobile nav = hamburger. Triggered by the .snav-mobile class (set from JS whenever the RENDER is mobile —
   real phones AND the desktop editor's Mobile preview), not by viewport width, so it shows in both. */
#site-nav.snav-mobile .snav-inner { gap: 10px; padding: 8px 11px; position: relative; }
#site-nav.snav-mobile .snav-brand img { height: 22px; }
#site-nav.snav-mobile .snav-burger { display: flex; margin-left: auto; }
#site-nav.snav-mobile .snav-links { position: absolute; top: calc(100% + 8px); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: 2px; overflow: visible; padding: 8px; border-radius: 18px; background: rgba(20,20,24,0.97); border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 18px 40px -18px rgba(0,0,0,0.6); backdrop-filter: blur(18px) saturate(150%); -webkit-backdrop-filter: blur(18px) saturate(150%); display: none; }
#site-nav.snav-mobile .snav-link { color: #fff; font-size: 14.5px; padding: 11px 14px; }
#site-nav.snav-mobile.nav-open .snav-links { display: flex; }
/* ===== Footer ===== */
#site-footer { width: 100%; max-width: 1200px; margin: 30px auto 0; padding: 0 4px; box-sizing: border-box; }
#site-footer .sfoot-inner { padding: 26px 22px 20px; border-radius: 20px 20px 0 0; background: rgba(20,20,24,0.55); border: 1px solid rgba(255,255,255,0.08); border-bottom: 0; }
.sfoot-proof { display: inline-flex; align-items: center; gap: 8px; margin-bottom: 18px; color: var(--paper,#fff); font-size: 14px; opacity: .9; }
.sfoot-stars { color: #FFC93C; letter-spacing: 1px; }
.sfoot-avs { display: inline-flex; }
.sfoot-avs span { width: 24px; height: 24px; border-radius: 999px; background-size: cover; background-position: center; margin-left: -6px; border: 2px solid rgba(20,20,24,1); }
.sfoot-avs span:first-child { margin-left: 0; }
.sfoot-cols { display: flex; flex-wrap: wrap; gap: 34px 60px; }
.sfoot-col { display: flex; flex-direction: column; gap: 8px; min-width: 120px; }
.sfoot-t { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; opacity: .55; color: var(--paper,#fff); margin-bottom: 3px; }
.sfoot-link { text-decoration: none; color: var(--paper,#fff); opacity: .78; font-size: 14px; cursor: pointer; }
.sfoot-link:hover { opacity: 1; }
.sfoot-base { display: flex; align-items: center; gap: 12px; margin-top: 24px; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.08); color: var(--paper,#fff); }
.sfoot-brand img { height: 24px; width: auto; }
.sfoot-brand span { font-weight: 800; }
.sfoot-copy { opacity: .5; font-size: 13px; }
.sfoot-gear { margin-left: auto; color: var(--ink,#fff); background: color-mix(in srgb, var(--ink) 10%, transparent); }
.sfoot-gear:hover { background: color-mix(in srgb, var(--ink) 18%, transparent); }
.sfoot-gear svg { color: var(--ink,#fff); }
#site-footer.nav-off .sfoot-inner { opacity: .5; outline: 1px dashed rgba(255,255,255,.25); }
/* footer settings modal */
.footset-group { border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; padding: 10px 12px; margin-bottom: 12px; }
.footset-ghead { display: flex; gap: 8px; align-items: center; margin-bottom: 4px; }
.footset-title { flex: 1 1 auto; font-weight: 650; }
/* cf-row icon as a button (assets link cards) */
.cf-iconbtn { border: 0; cursor: pointer; padding: 0; background: rgba(255,255,255,0.06); color: #fff; transition: background .12s; }
.cf-iconbtn:hover { background: rgba(255,255,255,0.14); }
/* no icon set → a faded dashed "+" so deselecting is clearly visible (not a fallback link icon) */
.cf-icon.cf-icon-empty { background: transparent; border: 1.5px dashed rgba(255,255,255,0.22); color: rgba(255,255,255,0.5); }
.cf-icon.cf-icon-empty:hover { border-color: rgba(255,255,255,0.4); color: rgba(255,255,255,0.8); }
.snav-ic { display: inline-flex; margin-right: 6px; vertical-align: -2px; }
.snav-ic svg { width: 15px; height: 15px; }
/* footer as one clean line (nxtwk-style) */
#site-footer .sfoot-inner.sfoot-line { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 12px; padding: 20px 22px; border-radius: 20px 20px 0 0; }
.sfoot-line .sfoot-brand img { height: 22px; }
.sfoot-line .sfoot-copy { opacity: .6; font-size: 13.5px; color: var(--paper,#fff); }
.sfoot-line .sfoot-copy-end { margin-left: auto; } /* menu links sit left; copyright + gear pushed right */
.sfoot-line .sfoot-sep { opacity: .3; color: var(--paper,#fff); }
.sfoot-line .sfoot-link { font-size: 13.5px; display: inline-flex; align-items: center; }
.sfoot-lic { display: inline-flex; margin-right: 5px; opacity: .8; }
.sfoot-lic svg { width: 14px; height: 14px; }
.sfoot-line .sfoot-socialwrap { margin-left: 6px; }
.sfoot-line .sfoot-proof { margin: 0; }
.sfoot-line .sfoot-gear { margin-left: auto; }
/* Footer = cardless: no background, text uses the theme ink (contrasts the page bg) */
#site-footer .sfoot-inner.sfoot-line { background: none !important; border: 0 !important; box-shadow: none !important; border-radius: 0; backdrop-filter: none; -webkit-backdrop-filter: none; padding: 22px 8px; }
#site-footer .sfoot-line .sfoot-copy, #site-footer .sfoot-line .sfoot-link, #site-footer .sfoot-line .sfoot-sep, #site-footer .sfoot-line .sfoot-proof span { color: var(--ink, #fff); }
#site-footer .sfoot-line .sfoot-link { opacity: .8; }
#site-footer .sfoot-line .sfoot-link:hover { opacity: 1; }
/* ── Phase 3 · Theme photo treatments — applied PER WIDGET (data-imgfilter /
   data-imgoverlay on each .w node) so a preset can override the theme default.
   Targets content photos only (hero/gallery/text-image/menu-thumb/image) — never
   logos, avatars, maps, icons. FILTERS = tonal grade (filter:). OVERLAYS = a layer
   on top (::after). Both are non-destructive; the photo file is never touched. */
.w :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { transition: filter .25s ease; }
.w[data-imgfilter="bw"]    :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: grayscale(1) contrast(1.04); }
.w[data-imgfilter="film"]  :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: sepia(.26) contrast(1.07) saturate(.9) brightness(1.01); }
.w[data-imgfilter="fade"]  :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: contrast(.9) saturate(.8) brightness(1.06); }
.w[data-imgfilter="warm"]  :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: sepia(.2) saturate(1.14) contrast(1.02); }
.w[data-imgfilter="cool"]  :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: saturate(1.06) hue-rotate(-8deg) brightness(1.02); }
.w[data-imgfilter="vivid"] :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: saturate(1.24) contrast(1.06); }
.w[data-imgfilter="grain"] :is(.ti-img, .ti-bg, .hd-photo, .wg-shot, .gal-cell, .mn-thumb, .wim) { filter: contrast(1.05) saturate(1.02); }
/* film-grain veil over the whole canvas when the theme default filter is grain */
.wrap[data-imgfilter="grain"]::after { content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 60; opacity: .07; mix-blend-mode: overlay; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); background-size: 140px 140px; }
/* Overlays — a colour/gradient/pixel layer ON TOP of the photo (::after). */
.w[data-imgoverlay]:not([data-imgoverlay="none"]) :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim) { position: relative; isolation: isolate; }
.w[data-imgoverlay]:not([data-imgoverlay="none"]) :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 1; }
.w[data-imgoverlay="scrim"]      :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: linear-gradient(to top, rgba(0,0,0,.52), rgba(0,0,0,0) 58%); }
.w[data-imgoverlay="dark"]       :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: rgba(0,0,0,.26); }
.w[data-imgoverlay="accent"]     :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: var(--accent, #C87F5E); opacity: .22; mix-blend-mode: multiply; }
.w[data-imgoverlay="accentGrad"] :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: linear-gradient(145deg, color-mix(in srgb, var(--accent, #C87F5E) 60%, transparent), transparent 68%); mix-blend-mode: multiply; }
.w[data-imgoverlay="duotone"]    :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: linear-gradient(150deg, var(--accent, #C87F5E), #0a0a12); mix-blend-mode: color; opacity: .62; }
.w[data-imgoverlay="vignette"]   :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after { background: radial-gradient(120% 120% at 50% 38%, transparent 54%, rgba(0,0,0,.5)); }
/* Pixel dissolve — the photo breaks into a grid of squares toward the edges; the
   focal centre stays solid. The square "gaps" are the page colour (--pxc), so the
   photo appears to dissolve into the background. Pure mask — photo untouched. */
.w[data-imgoverlay="pixel"] :is(.ti-img, .ti-photo, .hd-photo, .gal-cell, .wg-shot, .mn-thumb, .wim)::after {
  background-image: conic-gradient(var(--pxc, #101014) 0.75turn, transparent 0); background-size: 8px 8px;
  -webkit-mask-image: radial-gradient(132% 132% at 68% 58%, transparent 24%, #000 74%);
          mask-image: radial-gradient(132% 132% at 68% 58%, transparent 24%, #000 74%); }
/* The Image+text photo layer fills its card. Declared AFTER the treatments above and with
   enough specificity to beat them: they set `position: relative` on photo elements, which
   would drop this layer out of its absolute fill. */
.w[data-i] .wg-timaker.ti-over .ti-photo {
  position: absolute; inset: 0;
  /* corner-shape must be inherited alongside the radius: squircle themes set it on .card only,
     so a photo with the same radius but a plain round corner lets the card's fill leak past it. */
  border-radius: inherit; corner-shape: inherit;
  background-size: cover; background-position: center; background-repeat: no-repeat; }
/* ── Phase 4 · Adaptive Shop tile (image-forward showcase / themed list) ──────
   The tile opens the browse modal on click; add-to-cart lives in the modal. */
.sh-ov, .sh-sv, .sh-sh { padding: 0; gap: 0; }
.sh-media { position: relative; background-size: cover; background-position: center; background-color: color-mix(in srgb, var(--ink) 8%, transparent); }
.sh-body { padding: clamp(15px, 3cqw, 22px); display: flex; flex-direction: column; gap: 7px; height: 100%; box-sizing: border-box; min-width: 0; }
.sh-tt { font-size: clamp(19px, 3cqw, 28px); font-weight: 800; letter-spacing: -.02em; line-height: 1.05; margin: 0; color: var(--ink); }
.sh-ds { color: var(--ink-dim, rgba(255,255,255,.6)); font-size: 14px; line-height: 1.35; margin: 0; overflow: hidden; }
.sh-tag { color: var(--accent); font-weight: 650; font-size: 14px; }
.sh-body .sh-browse, .sh-body .sh-cartpill { margin-top: auto; }
/* tall (1×2): media top grows, text below */
.sh-sv { display: grid; grid-template-rows: 1fr auto; }
.sh-sv .sh-media { min-height: 0; }
/* wide: media left, text right */
.sh-sh { display: grid; grid-template-columns: 46% 1fr; }
.sh-sh .sh-media { height: 100%; }
/* overlay (square / large): media full-bleed, name+price over a scrim */
.sh-ov { position: relative; display: block; }
.sh-ov .sh-media { position: absolute; inset: 0; }
.sh-scrim { position: absolute; inset: 0; background: linear-gradient(to top, rgba(0,0,0,.72), rgba(0,0,0,0) 52%); z-index: 1; }
.sh-ovbody { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; padding: clamp(15px, 3cqw, 22px); display: flex; flex-direction: column; gap: 4px; }
.sh-ov .sh-tt, .sh-onimg { color: #fff; }
/* carousel dots — clear of text: on the media (split) or at the TOP in overlay */
.sh-dots { position: absolute; display: flex; gap: 5px; z-index: 3; bottom: 12px; left: 14px; }
.sh-dots i { width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,.42); }
.sh-dots i.on { background: #fff; }
.sh-ov .sh-dots { top: 14px; bottom: auto; }
/* NO photos → themed list (menu-style, dotted leaders) in the inner-card surface. Shared by Shop + Menu. */
.sh-listtile { padding: clamp(15px, 3cqw, 24px); display: flex; flex-direction: column; gap: 14px; }
.sh-lthead { display: flex; flex-direction: column; gap: 2px; }
.mlist { display: flex; flex-direction: column; background: var(--in-bg); border: var(--in-border-w, 0) solid var(--in-border, transparent); border-radius: var(--in-radius, 18px); -webkit-backdrop-filter: blur(var(--in-blur, 0)); backdrop-filter: blur(var(--in-blur, 0)); padding: 4px clamp(14px, 2.4cqw, 20px); }
.mlist-row { display: flex; align-items: baseline; gap: 8px; padding: 12px 0; }
.mlist-row + .mlist-row { border-top: 1px solid color-mix(in srgb, var(--ink) 9%, transparent); }
.mlist-nm { font-weight: 650; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 0 1 auto; }
.mlist-lead { flex: 1 1 auto; min-width: 14px; align-self: center; border-bottom: 1.5px dotted color-mix(in srgb, var(--ink) 26%, transparent); }
.mlist-pr { color: var(--accent); font-weight: 750; white-space: nowrap; flex: 0 0 auto; }
.sh-listtile .sh-browse, .sh-listtile .sh-cartpill { margin-top: auto; width: 100%; justify-content: center; text-align: center; }
/* shop list tile: a small subdued label (not a header) so the LIST is the widget */
.sh-ltlabel { font-size: 12px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-dim, rgba(255,255,255,.55)); }
/* ── Phase 4 · Adaptive Reviews layouts ──────────────────────────────────────
   square = rating + one quote · wide = title/rating/CTA beside a quote ·
   tall/large = title+rating over stacked quotes. Cards keep the inner-card surface. */
.wg-reviews.rv-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: 0; padding: 0; align-items: stretch; }
.rv-left { padding: clamp(15px, 3cqw, 22px); display: flex; flex-direction: column; gap: 10px; justify-content: center; min-width: 0; }
.rv-left .rv-seebtn { align-self: flex-start; margin-top: 4px; }
.rv-right { padding: clamp(12px, 2.2cqw, 16px); display: flex; align-items: center; min-width: 0; }
.rv-right .rv-card { width: 100%; }
.wg-reviews.rv-tile, .wg-reviews.rv-stack { gap: 12px; }
.rv-topline { display: flex; flex-direction: column; gap: 8px; }
.rv-dots { position: static; margin-top: 2px; justify-content: center; }
.rv-seebtn { display: inline-flex; align-items: center; }
@media (max-width: 560px) { .wg-reviews.rv-split { grid-template-columns: 1fr; } .rv-right { display: none; } }
.wg-reviews.rv-stack { justify-content: flex-start; }

/* ======================= v23 · OPENING TIMES ==============================
   Three designs, twelve shapes. NOT ONE COLOUR IS SET HERE — every value below is a preset
   variable, which is the rule this widget is the first to be held to. The status dot included:
   the status dot included — it reads --status-open / --status-closed, a preset pair that defaults
   to green and red, so the semantic survives every theme while a theme can still make it legible
   on its own surface. */
/* A WIDGET NEVER EXCEEDS ITS TILE. A tile is a fixed rectangle in a grid, so a design that renders
   taller either spills over its neighbour or gets clipped, and both are wrong in a way that only
   shows on the one shape nobody opened. `scripts/check-fit.mjs` holds this across every widget,
   every shape and both polarities. */
.wg-hours.hr-v23 { display: flex; flex-direction: column; gap: var(--gap-row, 12px);
  height: 100%; min-height: 0; overflow: hidden;
  /* `size`, not `inline-size`: the rules below use cqh, which silently falls back to the
     viewport under inline-size — the same fault as the title sized off the wrong axis. */
  container-type: size; }
.hr-v23 .hr-st { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.hr-v23 .hr-st-top { display: flex; align-items: center; gap: 9px; }
/* Open/closed is the one thing a visitor reads without reading, so it keeps green and red — as a
   PRESET pair, not a hard-code. A theme can shift both to stay legible on its own surface; what it
   cannot do is collapse them into one colour, because the distinction is the information. */
.hr-v23 .hr-st-dot { width: 9px; height: 9px; flex: 0 0 auto; border-radius: 50%;
  background: var(--status-open); }
.hr-v23 .hr-st-dot.off { background: var(--status-closed); }
.hr-v23 .hr-st-label { font-family: var(--lb-font, var(--font)); font-weight: 700;
  font-size: clamp(13px, 1.6cqw, 15px); color: var(--ink); }
.hr-v23 .hr-st-sub { font-family: var(--ds-font, var(--font)); font-size: clamp(12px, 1.4cqw, 13.5px);
  color: var(--accent); }
/* the hours in display type. mono comes from the preset when it names one — a theme decision */
/* sized against the tile's HEIGHT as well as its width: at the shortest tier the tile is 94px and
   40px display type cannot fit inside it however wide the tile is */
.hr-v23 .hr-bigtime { font-family: var(--mono-font, var(--h1-font, var(--font)));
  font-weight: var(--h1-weight, 800); font-size: min(clamp(20px, 5.2cqw, 40px), 26cqh);
  line-height: 1.05; letter-spacing: -0.01em; color: var(--ink); font-variant-numeric: tabular-nums; }

/* GAP 2px, NOT 8. The reference puts 1px between a 185px row — half a percent — and 8px on a
   64px row is twelve. That is the "more gap than row" fault: rows in this widget nearly touch. */
.hr-v23 .hr-days { display: flex; flex-direction: column; gap: 2px; min-height: 0; }
.hr-v23 .hr-day { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 11px 14px; border-radius: min(var(--in-radius, 14px), 10px);
  background: var(--in-bg, color-mix(in srgb, var(--ink) 6%, transparent));
  border: var(--in-border-w, 0px) solid var(--in-border, transparent); }
/* the reference sets the day name in the same mono face as the time, not in the label face —
   a row reads as one line of a timetable rather than as a label with a value beside it */
.hr-v23 .hr-day-n { font-family: var(--mono-font, var(--ds-font, var(--font))); font-weight: 600;
  font-size: clamp(12px, 1.5cqw, 14px); color: var(--in-ink, var(--ink)); }
.hr-v23 .hr-day-t { font-family: var(--mono-font, var(--ds-font, var(--font)));
  font-size: clamp(12px, 1.5cqw, 14px); color: var(--in-ink-dim, var(--ink-dim));
  font-variant-numeric: tabular-nums; }
.hr-v23 .hr-day-t.shut { color: var(--ink-faint); }
/* today is the one row the accent claims */
.hr-v23 .hr-day.today { background: var(--accent); }
.hr-v23 .hr-day.today .hr-day-n, .hr-v23 .hr-day.today .hr-day-t { color: var(--on-accent); }

/* wide: status left, three days right. The days column takes the room it needs and the status
   block takes the rest, so a long "Opens Monday 09:00" never squeezes the rows. */
.hr-v23.hr-wide { flex-direction: row; align-items: center; gap: var(--gap-section, 20px); }
.hr-v23.hr-wide .hr-st { flex: 1 1 0; }
.hr-v23.hr-wide .hr-days { flex: 0 1 46%; }
/* tall: rows stack at their own height and the leftover space falls at the BOTTOM. They were
   `justify-content: space-between`, which spread seven rows down the full tile and gave a gap
   bigger than a row — the reference has them nearly touching. A row's height is the row's, not the
   tile's.

   ROW HEIGHT AGAINST THE PORTRAIT TIER. The reference puts seven rows at a pitch of 186 into a card
   of 1381–1520 reference px — so the week occupies 86–94% of the card, and each row is an eighth of
   it rather than a fixed pixel value. Stated as a share of the tile so it holds at whatever the
   portrait tier's height settles at, instead of being retuned every time that number moves. */
.hr-v23.hr-tall .hr-days { flex: 1 1 auto; min-height: 0; }
/* The ROWS grow, the gaps do not — which is the difference between this and the
   `justify-content: space-between` it replaced. That spread seven content-height rows down the
   tile and put the space between them; this grows each row to fill the tile and leaves the 2px
   between them alone, which is the reference: tall rows, hairline gaps. It also cannot overflow,
   because the rows divide the space that exists rather than asking for space that does not. */
.hr-v23.hr-tall .hr-day { flex: 1 1 0; min-height: 0; }
.hr-v23.hr-small { justify-content: center; }
@media (max-width: 700px) {
  .hr-v23.hr-wide { flex-direction: column; align-items: stretch; }
  .hr-v23.hr-wide .hr-days { flex: 0 0 auto; }
}

/* ======================= v23 · IMAGE + TEXT ===============================
   One arrangement at every shape — what shows is what the owner filled in. The only colour set
   here is the SCRIM, which is the widget's by decision: it keeps text legible over any photo,
   under any preset, and a preset that could make it illegible would break the widget rather than
   restyle it. Card surface, text and the button are all preset. */
/* padding:0 on the CARD, stated strongly enough to beat `.card`'s own — the button is the card's
   bottom edge, and a card that keeps its padding leaves a band of photo under the button. */
.wg-timaker.ti-v23, .w .card.wg-timaker.ti-v23 { position: relative; display: flex;
  flex-direction: column; justify-content: flex-end; overflow: hidden; padding: 0;
  height: 100%; min-height: 0; }
.ti-v23 .ti-overtext { position: relative; z-index: 2; padding: var(--pad, 18px);
  display: flex; flex-direction: column; gap: 4px; }
/* the scrim rides ON the text block, so it always covers the text however tall the block gets —
   a card-anchored gradient only fades in at the bottom and short cards push text out of it */
/* THE SCRIM IS ANCHORED TO THE CARD, not to the text block. Anchored to the block it ended at the
   block's lower edge — and with a button below it, that edge is mid-photo, which drew a hard
   horizontal line across the picture. It now runs to the bottom of the card and fades upward, so
   it has no edge anywhere a visitor can see. */
/* THE SCRIM STOPS WHERE THE BUTTON STARTS. It ran to the card's bottom edge and under the button,
   so the button read as part of the photograph rather than as a control sitting clear of it. The
   scrim exists to make TEXT legible; a button carries its own surface and needs no help. */
/* 40%, NOT 78%. The reference starts darkening 55% down the card and reaches the button at 91%,
   so the scrim covers about 36% of the height — a band behind the words. At 78% it began 15% down
   and dimmed most of the photograph, which is the opposite of the point: the scrim is there so the
   TEXT reads, not so the picture is quieter. */
.ti-v23.ti-over::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: 40%; z-index: 1; pointer-events: none;
  background: linear-gradient(to top, rgba(0,0,0,.72), rgba(0,0,0,.34) 42%, rgba(0,0,0,0)); }
.ti-v23.ti-over.ti-hasbtn::after { bottom: calc(var(--pad, 18px) + 2.9em); }
.ti-v23.ti-over .ti-overtext { color: #fff; }
.ti-v23.ti-over .ti-overtext .wg-ttl, .ti-v23.ti-over .ti-overtext h2 { color: #fff; }
.ti-v23.ti-over .ti-overtext .wg-dsc, .ti-v23.ti-over .ti-overtext p { color: rgba(255,255,255,0.88); }
/* text-only: same position, on the preset's own surface, so it reads as the same widget */
.ti-v23.ti-textonly .ti-overtext { color: var(--ink); }
/* TYPE SIZED AGAINST THE TILE, measured by cap-height ratio against the reference: its title band
   is 10.90% of card width and its description 4.27%, against 6.46% and 2.58% here — both 1.68x too
   small, uniformly, which is what says it is one error and not two.
   Expressed as a share of the tile because that relationship is LAYOUT, which is the widget's;
   the face, the weight and the colour stay the preset's. Clamped so a 1200px-wide tile does not
   set a 180px headline. */
/* THE SHORTER SIDE, NOT THE WIDTH. Measured on both reference cards:

     tall 679x1519  title band 74px = 10.90% of width, 4.87% of height, 10.90% of the shorter side
     wide 1104x558  title band 57px =  5.16% of width, 10.22% of height, 10.22% of the shorter side

   Only the shorter side is constant. I derived 15.1cqw from the TALL card alone and applied it to
   all twelve shapes, so on a wide tile the title came out 62px inside a 353px-tall card — right on
   the one shape I measured and grossly oversized on the shape production actually shows. That is
   why the numbers said it matched: I measured the shape that did.

   `cqmin` is the shorter side, and it needs `container-type: size` rather than `inline-size` —
   which the same mistake makes silently: `cqh` and `cqmin` fall back to the viewport without it. */
.ti-v23 { container-type: size; }
.ti-v23 .ti-overtext .wg-ttl, .ti-v23 .ti-overtext h1,
.ti-v23 .ti-overtext h2, .ti-v23 .ti-overtext h3 {
  font-size: clamp(18px, 14.6cqmin, 64px); line-height: 1.04; margin: 0; }
.ti-v23 .ti-overtext .wg-dsc, .ti-v23 .ti-overtext p {
  font-size: clamp(11px, 5.9cqmin, 24px); line-height: 1.3; margin: 0; }
/* the old v21 maker rule put 64px of top padding on this block; the v23 one owns its own spacing */
.ti-v23 .ti-overtext { padding: 14px 16px !important; }
.ti-v23.ti-hasbtn .ti-overtext { padding-bottom: 10px !important; }
.ti-v23.ti-blank { min-height: 0; }

/* THE BUTTON IS THE CARD'S BOTTOM EDGE. Full width, flush, at every size — never inline in the
   text block, which is what made it look like a size decision in the reference. */
/* THE BUTTON TAKES THE THEME'S RADIUS. It was `border-radius: 0` — hard-coded, so square under
   every theme including the pill ones, which is the same fault as the status dot: a value written
   here that the preset should own. It reads `--btn-radius` now, the variable every other button in
   the product reads.
   A radius needs room to be seen, so the button is inset by the card's padding rather than bleeding
   to the edges. Still full width of the text column, still the last thing in the card. */
/* MEASURED against the reference, which puts a 120px button inside a 1519px card with a 20/19/19
   inset — 69px and 12px at this card's scale. It was 51 tall and inset 18, so the button was both
   too small and too far in from the edges it is supposed to sit against. */
.ti-v23 .ti-btn { position: relative; z-index: 3; display: flex; align-items: center;
  justify-content: center; width: auto; margin: 0 12px 12px;
  border-radius: var(--btn-radius, 12px);
  padding: 25px 18px; line-height: 1; text-decoration: none; }
.ti-v23.ti-hasbtn .ti-overtext { padding-bottom: 12px; }

/* ---- the shortest tier shows less, which is the design, not a truncation -----
   At h-xs a tile is 94px and the preset's own card padding is 52 of them. A widget shows less at
   its smallest and what gets dropped is a decision per widget (phase-1 brief): Opening times keeps
   the dot, the words and the hours, and drops the "opens tomorrow" line — the one part that is a
   detail rather than the answer. Image + text drops nothing; it simply has less room for type. */
.h-xs .hr-v23, .h-xs .ti-v23 { padding: 10px 14px; }
.h-xs .hr-v23 { gap: 2px; }
.h-xs .hr-v23 .hr-st-sub { display: none; }
.h-xs .hr-v23 .hr-bigtime { font-size: min(clamp(16px, 4cqw, 26px), 34cqh); line-height: 1; }
.h-xs .ti-v23 .ti-overtext { padding: 10px 14px; gap: 2px; }
/* wide at the shortest tier is a 94px BANNER: the status block lies along it rather than stacking,
   because three stacked lines cannot fit 94px however small the type gets. Same three parts, laid
   on the axis the tile actually has. */
.h-xs .hr-v23.hr-wide { flex-direction: row; align-items: center; gap: 14px; }
.h-xs .hr-v23.hr-wide .hr-st { flex-direction: row; align-items: center; gap: 12px; }
.h-xs .hr-v23.hr-wide .hr-days { display: none; }
/* and Image + text clamps its description to one line there, rather than growing the card */
.h-xs .ti-v23 .wg-dsc, .h-xs .ti-v23 .ti-overtext p {
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; margin: 0; }
/* the title is display type and scales with the tile's WIDTH, so at full width in a 94px tile it
   asked for more height than the tile has. Capped against the height as well, same as the hours. */
.h-xs .ti-v23 .ti-overtext .wg-ttl, .h-xs .ti-v23 .ti-overtext h2,
.h-xs .ti-v23 .ti-overtext h1 { font-size: min(1em, 30cqh); line-height: 1.15; margin: 0; }
.h-xs .ti-v23 .ti-btn { padding: 7px 12px; margin: 0 10px 10px; }

/* ================= OPENING TIMES — THE MODAL ==============================
   RESTORED. These rules were shared between the seven old tile designs and `exHours`, and I
   deleted them with the tile designs — so the modal's markup was untouched but its styling was
   gone. It read as a rewrite (a bare progress ring, "Now 20:53", a serif heading) because those
   parts had always been there and were suddenly unstyled, and "Monday09:00 – 17:00" is simply
   `.hr-day` losing its flex.

   Nothing here is new. It is what `exHours` rendered before this session, verbatim from git.
   The tile's own rules are all `.hr-v23`-scoped and outrank these, so the two do not meet.

   The lesson for the rest of phase 1: a widget's tile and its modal share CSS, so deleting a tile
   design is not a local act. Check what else reads a rule before removing it. */
.hr-st { display: flex; align-items: flex-start; gap: 9px; }
.hr-st.inline { align-items: center; flex-wrap: wrap; }
.hr-st-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; margin-top: 5px; }
.hr-st.inline .hr-st-dot { margin-top: 0; }
.hr-st-dot.off { background: #F0563C; box-shadow: 0 0 0 3px color-mix(in srgb, #F0563C 22%, transparent); }
.hr-st-dot.on { background: #34C759; box-shadow: 0 0 0 3px color-mix(in srgb, #34C759 22%, transparent); }
.hr-st-tx { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.hr-st-label { font-family: var(--h1-font, var(--font)); font-weight: var(--h1-weight, 700); font-style: var(--h1-style, normal); color: var(--h1-color, var(--ink)); font-size: 17px; line-height: 1.15; }
.hr-st-sub { font-family: var(--ds-font, var(--font)); color: var(--accent); font-size: 13.5px; }
.hr-st.inline .hr-st-sub { margin-left: 4px; }
.hr-days { flex: 1 1 auto; min-height: 0; }
.hr-days.col { display: flex; flex-direction: column; gap: 8px; }
.hr-days.col .hr-day { flex: 1 1 0; min-height: 0; }
.hr-days.grid2 { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 1fr; gap: 8px; }
.hr-days.grid2 .hr-day { min-width: 0; }
.hr-day { font-family: var(--ds-font, var(--font)); display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 13px 18px; border-radius: var(--in-radius, 16px); background: var(--in-bg, color-mix(in srgb, var(--ink) 6%, transparent)); border: var(--in-border-w, 1px) solid var(--in-border, color-mix(in srgb, var(--ink) 10%, transparent)); }
.hr-day-n { font-family: var(--lb-font, var(--font)); font-weight: 600; color: var(--in-ink, var(--ink)); white-space: nowrap; }
.hr-day-t { font-family: var(--ds-font, var(--font)); color: var(--in-ink-dim, var(--ink-dim)); white-space: nowrap; }
.hr-day-t.shut { color: var(--in-ink-dim, var(--ink-faint)); }
.hr-day.today { background: var(--accent); border-color: var(--accent); }
.hr-day.today .hr-day-n { color: var(--on-accent, #fff); font-weight: 700; }
.hr-day.today .hr-day-t { color: var(--on-accent, #fff); font-weight: 700; }
.wg-hours.hr-list, .wg-hours.hr-grid, .wg-hours.hr-upcoming { gap: 14px; }
.hr-mini .hr-mini-top { display: flex; align-items: center; gap: 8px; }
.hr-mini .hr-bigtime { font-family: var(--h1-font, var(--font)); font-weight: 700; font-size: clamp(24px, 8cqw, 32px); color: var(--ink); line-height: 1.05; margin: 6px 0 4px; }
.hr-mini .hr-st-sub { color: var(--accent); font-size: 14px; }
.hr-rel { display: flex; flex-direction: column; }
.hr-rel-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--hair); }
.hr-rel-row:last-child { border-bottom: 0; }
.hr-rel-d { font-family: var(--lb-font, var(--font)); font-weight: 600; color: var(--lb-color, var(--ink)); }
.hr-rel-t { font-family: var(--ds-font, var(--font)); color: var(--ink-dim); white-space: nowrap; }
.hr-rel-t.shut { color: var(--ink-faint); }
.wg-hours.hr-banner .wg-body { flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; }
.hr-banner-today { display: flex; flex-direction: column; align-items: flex-end; text-align: right; }
.hr-banner-lbl { font-family: var(--lb-font, var(--font)); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--lb-color, var(--ink-dim)); }
.hr-banner-time { font-family: var(--h1-font, var(--font)); font-weight: 700; font-size: clamp(24px, 4cqw, 40px); color: var(--ink); line-height: 1; white-space: nowrap; }
.wg-hours.hr-showcase { display: grid; grid-template-columns: minmax(170px, 260px) 1fr; gap: 28px; align-items: center; }
.hr-show-list { min-width: 0; align-self: stretch; display: flex; }
.hr-show-list .hr-days.col { flex: 1; }
.hr-modal .hr-days.col { gap: 11px; }
.hr-modal .hr-days.col .hr-day { flex: 0 0 auto; padding: 17px 22px; font-size: 16px; }

/* ═══ REVIEWS HERO ═══
   One composition at every size. Type scales from the CONTAINER's SHORTER side (cqmin), not its
   width — sizing off one axis is how a tall card looked right and a wide one shipped wrong. The
   container is the hero itself, with `container-type: size`, because `inline-size` silently falls
   back to the viewport for cqmin and cqh.

   PAINT IS THE PRESET'S. Surface is --card-bg on .card, the caption is --ink at reduced opacity
   rather than a grey literal, the disc is --btn-bg with a --btn-text glyph. The 50% radius on the
   disc is the widget's by construction — a circle is its shape, not a radius a theme picks. */
/* `display: block` because `.wg-reviews` is a flex column and `.rv-split` a flex ROW — as a row
   item the hero shrank to its content, 127px inside a 260px card, which is what put the arrow near
   the middle. The hero is the whole card in every branch, so it is not a flex item at all. */
/* A FLEX COLUMN, NOT A BLOCK. `display: block` stopped the hero being squeezed by `.rv-split`'s
   flex row, but it also meant `height: 100%` had an auto-height parent to resolve against — so on
   mobile, where the card is `height: auto`, the hero collapsed to its content, sat at the top and
   took the absolutely-positioned arrow with it. A column with `flex: 1` fills both axes. */
.rv-heroed { position: relative; padding: 0; overflow: hidden;
  display: flex; flex-direction: column; }
.rv-heroed > .rv-hero { flex: 1 1 auto; min-height: 0; width: 100%; align-self: stretch; }
/* THE CONTAINER CARRIES NO PADDING OF ITS OWN. Under `container-type: size` the container IS its
   content box, so padding written in cqmin shrinks the container, which shrinks the padding, which
   shrinks the container — it settles at a fraction of the real size. On a 353px card every cqmin
   value resolved against 177px and the numeral came out at exactly half. The padding lives on an
   inner element so cqmin means what it says. */
/* THE UNIT GROWS WITH THE CARD, NOT WITH ITS SHORTER SIDE. `cqmin` is the width on any tall card,
   so a 1x2 rendered its rating at exactly the 1x1's size and looked lost in twice the space. This
   is weighted 60/40 toward width: on a square it equals cqmin, so the 1x1 is unchanged, and on a
   1x2 it comes out ~1.4x — the same design, grown. */
.rv-hero {
  --rv-u: calc(0.6cqw + 0.4cqh);
  container-type: size;
  position: static; width: 100%; height: 100%; min-height: 0;
  display: flex; flex-direction: column; justify-content: center;
}
.rv-hpad { display: flex; flex-direction: column; min-width: 0;
  padding: calc(9 * var(--rv-u)) calc(7 * var(--rv-u)) calc(7 * var(--rv-u)) calc(11 * var(--rv-u)); }
.rv-hmain { display: flex; align-items: center; gap: calc(1.6 * var(--rv-u)); min-width: 0; }
.rv-hnum {
  font-family: var(--ds-font, var(--font, inherit));
  font-size: clamp(24px, calc(34.8 * var(--rv-u)), 214px); font-weight: 800; letter-spacing: -.055em;
  line-height: .9; font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* the star centres on the numeral's middle, not its baseline — a shape has no baseline to sit on */
.rv-hstar { display: block; flex: none; width: clamp(9px, calc(6.4 * var(--rv-u)), 60px); height: clamp(9px, calc(6.4 * var(--rv-u)), 60px);
  color: var(--accent); }
.rv-hstar svg { display: block; width: 100%; height: 100%; }
.rv-hcount {
  margin-top: calc(1.4 * var(--rv-u)); font-size: clamp(10px, calc(6.6 * var(--rv-u)), 46px); font-weight: 700;
  letter-spacing: -.01em; opacity: .46; overflow-wrap: anywhere;
}
.rv-hdisc {
  position: absolute; right: calc(7 * var(--rv-u)); bottom: calc(7 * var(--rv-u));
  width: clamp(28px, calc(14 * var(--rv-u)), 120px); height: clamp(28px, calc(14 * var(--rv-u)), 120px);
  display: grid; place-items: center; flex: none; padding: 0; border: 0; cursor: pointer;
  background: var(--btn-bg); color: var(--btn-text); text-decoration: none;
  transition: filter .15s, transform .15s;
}
/* the shape, on its own class, so the disc's PAINT stays inside the guard */
.rv-circle { border-radius: 50%; }
.rv-hdisc:hover { filter: brightness(1.06); }
.rv-hdisc svg { width: 46%; height: 46%; display: block; }

/* THE 94px SLOT. At h-xs the tile is one grid row and there is no room for a numeral, a caption and
   a disc — check-fit measured 120px of content in a 94px box. Show less rather than shrink: the
   rating alone, sized to the row, and the card still opens. The disc and the caption go rather than
   being squeezed into something unreadable. */
.rv-hero.rvh-h-xs .rv-hpad { padding: 0 5cqmin; }
.rv-hero.rvh-h-xs .rv-hdisc, .rv-hero.rvh-h-xs .rv-hcount { display: none; }
.rv-hero.rvh-h-xs .rv-hnum { font-size: clamp(18px, 42cqh, 46px); line-height: 1; }
.rv-hero.rvh-h-xs .rv-hstar { width: clamp(8px, 14cqh, 16px); height: clamp(8px, 14cqh, 16px); }

/* ═══ REVIEWS HERO ON MOBILE ═══
   One column, centred: rating and star on the middle line, the count under it. The arrow stays
   pinned bottom-right — it is a corner affordance, and centring it would read as a play button.
   Applies to the mobile stack at both heights, and to any phone-width viewport. */
/* LEFT-ALIGNED EVERYWHERE. There is no centred variant — the rating reads from the left edge on
   every card at every size, and the arrow sits in the bottom-right corner. Trying to centre it on
   narrow cards was my invention and it was wrong at every width. */



/* an asset row inside a widget's settings — the same card the Assets tab uses, selectable */
.cf-row.ct-pick { width: 100%; text-align: left; background: none; border: 0; cursor: pointer; }
.cf-row.ct-pick.on { outline: 2px solid var(--accent, #C87F5E); outline-offset: -2px; border-radius: 14px; }

/* a price field wears the site's currency, so nobody types the symbol into the number */
.fm-ccy { position: relative; display: flex; align-items: center; }
.fm-ccy-sym { position: absolute; left: 14px; font-weight: 700; color: rgba(255,255,255,0.5); pointer-events: none; }
.fm-ccy .input { padding-left: 34px; }


/* ---------------------------- the footer ----------------------------------
   IT IS THE END OF THE PAGE, NOT A CARD. The site's own background, a hairline above it, and
   nothing of its own — a surface here reads as one more widget. Columns across the top (brand,
   the link groups, the newsletter), a rule, then the copyright and the socials. */
#site-footer { width: 100%; max-width: 1200px; margin: 34px auto 0; padding: 0 4px 26px; box-sizing: border-box; }
/* NO LINE ABOVE AND NO RADIUS. The footer's old rule still carried `border-radius: 20px 20px 0 0`,
   so the hairline I put on top curved at both corners and read as the top of a card. The only rule
   in the footer is the one above the copyright. */
#site-footer .sfoot-inner { background: none; border: 0; border-radius: 0; padding: 8px 0 0; box-shadow: none; backdrop-filter: none; -webkit-backdrop-filter: none; }
#site-footer .sfoot-top { display: flex; align-items: flex-start; gap: clamp(24px, 5vw, 72px); flex-wrap: wrap; }
#site-footer .sfoot-brandcol { flex: 1 1 220px; min-width: 0; display: flex; flex-direction: column; gap: 10px; }
/* a logo is a logo, not a banner — it was filling the column at whatever aspect it had */
#site-footer .sfoot-logo { height: 30px; width: auto; max-width: 180px; object-fit: contain; object-position: left center; display: block; }
#site-footer .sfoot-name { font-family: var(--h1-font, var(--font)); font-weight: 800; font-size: 18px; color: var(--ink); }
#site-footer .sfoot-tag { margin: 0; max-width: 34ch; font-size: 14px; line-height: 1.5; color: var(--ink-dim); }
#site-footer .sfoot-cols { flex: 1 1 auto; display: flex; gap: clamp(24px, 5vw, 72px); flex-wrap: wrap; }
/* a column of untagged links can be long — it flows into two rather than shoving the newsletter
   onto a line of its own */
#site-footer .sfoot-colgroup { display: flex; flex-direction: column; gap: 12px; min-width: 110px; max-height: 210px; flex-wrap: wrap; }
#site-footer .sfoot-ghead { font-size: 14px; font-weight: 700; color: var(--ink); }
#site-footer .sfoot-link { display: inline-flex; align-items: center; gap: 5px; font-size: 14px; color: var(--ink-dim); text-decoration: none; cursor: pointer; }
#site-footer .sfoot-link:hover { color: var(--ink); }
#site-footer .sfoot-ext svg { width: 12px; height: 12px; }
#site-footer .sfoot-news { flex: 0 0 clamp(230px, 24%, 300px); display: flex; flex-direction: column; gap: 10px; }
#site-footer .sfoot-newstx { margin: 0; font-size: 14px; line-height: 1.5; color: var(--ink-dim); }
#site-footer .sfoot-newsform { display: flex; align-items: center; gap: 8px; background: color-mix(in srgb, var(--ink) 7%, transparent); border-radius: 999px; padding: 5px 5px 5px 16px; }
#site-footer .sfoot-newsin { flex: 1 1 auto; min-width: 0; background: none; border: 0; outline: 0; color: var(--ink); font: inherit; font-size: 14px; padding: 9px 0; }
#site-footer .sfoot-newsbtn { width: 38px; height: 38px; flex: 0 0 auto; border: 0; border-radius: 50%; cursor: pointer; display: grid; place-items: center; background: var(--btn-bg); color: var(--btn-text); }
#site-footer .sfoot-newsbtn svg { width: 16px; height: 16px; stroke: currentColor; }
#site-footer .sfoot-newsmsg { font-size: 13px; color: var(--ink-dim); }
#site-footer .sfoot-bottom { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  margin-top: 28px; padding-top: 16px; border-top: 1px solid color-mix(in srgb, var(--ink) 12%, transparent); }
/* the gear belongs where every other widget's does — the top-right corner */
#site-footer { position: relative; }
#site-footer .sfoot-gear { position: absolute; top: 8px; right: 6px; }
#site-footer .sfoot-copy { font-size: 13px; color: var(--ink-dim); }
#site-footer .sfoot-end { display: inline-flex; align-items: center; gap: 12px; margin-left: auto; }
#site-footer .sfoot-socials { display: inline-flex; align-items: center; gap: 12px; }
#site-footer .sfoot-soc { width: 18px; height: 18px; color: var(--ink-dim); display: grid; place-items: center; }
#site-footer .sfoot-soc:hover { color: var(--ink); }
#site-footer .sfoot-soc svg { width: 100%; height: 100%; }
@media (max-width: 700px) {
  #site-footer .sfoot-top { flex-direction: column; gap: 26px; }
  #site-footer .sfoot-news { flex: 1 1 auto; width: 100%; }
}

/* a link row says where it shows: two little switches, on or off, per menu */
.lk-acts { display: inline-flex; align-items: center; gap: 6px; }
.lk-sw { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; padding: 5px 8px; border-radius: 8px; cursor: pointer;
  background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.45); border: 1px solid rgba(255,255,255,0.10); }
.lk-sw.on { background: var(--accent, #C87F5E); color: #fff; border-color: transparent; }

#site-footer .sfoot-brandcol .wg-social { margin-top: 4px; }
.lk-where { display: flex; flex-direction: column; gap: 2px; margin-bottom: 4px; }
.lk-acts { display: inline-flex; align-items: center; gap: 6px; }

/* the map card carries nothing but the map — the caption, address and button live in its modal */
.wg-map.map-bare { padding: 0; }
.wg-map.map-bare .map-art-wrap, .wg-map.map-bare .map-art { border-radius: inherit; }

/* ---------------------- feedback ------------------------------------------
   ONE PILL, IN CLAY'S OWN CHROME. The same dark translucent pill as the Desktop/Mobile toggle —
   this belongs to the product's layer, not the tenant's theme, so it must not take the site's
   colours the way a widget does. */
/* ALWAYS REACHABLE. The whole point is reporting what you are looking at, and what you are looking
   at is often a modal — a button that hides behind the thing you want to report on is no use. It
   sits above the modal scrim (2147483100) so it can be pressed from anywhere. */
#fb-dock { position: fixed; left: 16px; bottom: 18px; z-index: 2147483300; }
#fb-dock.busy { opacity: .55; pointer-events: none; }
/* …but not over its own form, where it landed on the Send button. */
body.fb-open #fb-dock { display: none; }
.fb-btn { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px 0 13px; cursor: pointer;
  border-radius: 999px; border: 1px solid rgba(255,255,255,0.12); background: rgba(20,20,22,0.92); color: rgba(255,255,255,0.86);
  font: inherit; font-size: 13px; font-weight: 650; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  box-shadow: 0 10px 30px -10px rgba(0,0,0,0.6); transition: transform .15s, color .15s; }
.fb-btn:hover { color: #fff; transform: translateY(-1px); }
.fb-btn svg { width: 17px; height: 17px; }
/* NOT IN PREVIEW. Preview is the owner looking at their site as a visitor, and a visitor's page
   carries none of this — a button floating over it is the one thing in shot that is not the site.
   The rule that was here named `.fb-fab` and `[class*="feedback"]`, and this is `#fb-dock`: it
   matched nothing, so it never hid. Its own form is a separate case, above. */
body.preview #fb-dock { display: none; }
/* ON A PHONE IT PARKS AT THE MIDDLE OF THE RIGHT EDGE and rides up to the top corner once you
   have scrolled a screen. Bottom-left put it on the dock, and the dock is what you are reaching
   for; the top corner is where a section's own edit gear sits, which is what it was landing on
   before — so it only goes up there once you are a screen down and the first section's gear is
   long gone. `.up` is set by fbFollowScroll() in site.js, on a phone only. */
@media (max-width: 760px) {
  #fb-dock { left: auto; right: 12px; top: 50%; bottom: auto; transform: translateY(-50%);
             transition: top .28s cubic-bezier(.2,.7,.25,1), transform .28s cubic-bezier(.2,.7,.25,1); }
  /* UNDER THE NAVIGATION, NOT ON IT. `.up` parked it at a hard 12px from the top of the window —
     which is exactly where a designed page's fixed nav is, so once you had scrolled a screen the
     button rode up and sat on the business's own logo. `--ed-top` is that bar's measured height and
     every other floating control already clears it; this one was the exception. */
  #fb-dock.up { top: calc(var(--ed-top, 0px) + 12px); transform: translateY(0); }
  .fb-btn span { display: none; } .fb-btn { padding: 0 12px; }
}
/* four ways in, two by two — an icon and a plain sentence, nothing else */
.fb-kinds { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 14px; }
.fb-kind { display: inline-flex; align-items: center; gap: 9px; text-align: left; padding: 12px 13px; cursor: pointer;
  border-radius: 13px; font-size: 13.5px; font-weight: 600; line-height: 1.25;
  background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.7); border: 1px solid rgba(255,255,255,0.10); }
.fb-kind svg { width: 18px; height: 18px; flex: 0 0 auto; opacity: .75; }
.fb-kind.on { background: #fff; color: #14120F; border-color: transparent; }
.fb-kind.on svg { opacity: 1; }
@media (max-width: 460px) { .fb-kinds { grid-template-columns: 1fr; } }
/* the form takes a dropped image anywhere on it, not only on the button */
.fb-card.drop { outline: 2px dashed var(--qck, #C87F5E); outline-offset: -6px; }
.fb-shotrow { display: flex; align-items: center; gap: 10px; margin-top: 4px; flex-wrap: wrap; }
.fb-shot { display: inline-flex; align-items: center; gap: 9px; padding: 6px 12px 6px 6px; border-radius: 12px; background: rgba(255,255,255,0.06); font-size: 12.5px; color: rgba(255,255,255,0.55); }
.fb-shot img { width: 48px; height: 33px; object-fit: cover; border-radius: 8px; display: block; }
.fb-shot-empty svg { width: 18px; height: 18px; opacity: .5; }
.fb-imgs { margin-top: 10px; }
.fb-pro { margin: 12px 0 0; font-size: 12.5px; line-height: 1.5; color: rgba(255,255,255,0.5); }
.fb-sent { margin: 6px 0 0; font-size: 14px; line-height: 1.55; color: rgba(255,255,255,0.75); }

/* ============================================================================================
   ANALYTICS — the site becomes the dashboard
   ============================================================================================
   This layer deliberately does NOT wear the tenant's theme. Everything else on the page is
   painted by whatever the owner picked; this is Clay talking to its owner about their site, so
   it is Clay's own surface — near-black ground, one orange, and colour used only where it means
   something (green up, red down, amber warning). The ground travelling from the theme's
   background to this black is the whole reason it reads as ARRIVING somewhere rather than as a
   panel dropped on top.
   ============================================================================================ */
body.stats-on { --st-bg: #08080a; --st-card: #131316; --st-card2: #17171b; --st-line: rgba(255,255,255,.09);
  --st-ink: #f4f2ee; --st-dim: rgba(244,242,238,.56); --st-faint: rgba(244,242,238,.34);
  --st-accent: #C87F5E; --st-up: #5FD08A; --st-down: #FF7A72; --st-warn: #F5B544; }
body.stats-on { background: var(--st-bg); }
/* The canvas, painted explicitly. `html` carries no background of its own, so during a view
   transition anything a snapshot doesn't cover falls through to the browser's default white. */
html { background: var(--vt-ground, transparent); }
/* The filter bar starts where the site menu was — so the morph lands true — then closes the gap the
   editor's device toggle occupies, which is not on screen here. After the transition, and gently. */
/* `.is-owner` is in the selectors these override (the editor's own top offsets), so it has to be in
   these too — without it they lose on specificity and the gap never closes. */
body.stats-on .wrap { transition: max-width .45s cubic-bezier(.32,.72,0,1), padding-top .45s cubic-bezier(.32,.72,0,1); }
body.stats-on #site-nav { transition: top .45s cubic-bezier(.32,.72,0,1); }
body.is-owner.stats-on.stats-tight .wrap { padding-top: 16px; }
body.is-owner.stats-on.stats-tight #site-nav { top: 14px; }
/* a refresh updates in place: the numbers travel, the bars and lines do not redraw */
.st.st-instant .st-bar i, .st.st-instant .st-track i { transition: none !important; }
.st.st-instant .st-sparkline, .st.st-instant .st-arealine { transition: none !important; }
.st.st-instant .st-sparkfill, .st.st-instant .st-areafill, .st.st-instant .st-areadot { animation: none !important; opacity: 1 !important; }
.st.st-instant .st-card { animation: none !important; }
body.stats-on .wrap { background: var(--st-bg) !important; }
body.stats-on .wrap::before, body.stats-on .wrap::after { display: none !important; }
/* `#clay-page` is the clay renderer's page, and it is hidden here for the same reason `#grid` is:
   the dashboard REPLACES the site. Left out, the board was appended under a page that stayed put
   and the whole morph read as broken. */
body.stats-on #grid, body.stats-on #site-footer, body.stats-on .qck-badge, body.stats-on .sec-tools,
body.stats-on .dev-float, body.stats-on .undo-dock, body.stats-on #clay-page,
body.stats-on .clay-badge { display: none !important; }
/* No `.wrap` on a clay page, so the board and the filter bar hang off the body — which needs the
   top room the wrap's padding gave them. */
body.stats-on #stats { padding-top: 84px; transition: padding-top .45s cubic-bezier(.32,.72,0,1); }
body.stats-on.stats-tight #stats { padding-top: 64px; }
body.stats-on .wrap #stats { padding-top: 4px; }
/* the dock keeps ONE button while the dashboard is up — the way back is the way in */
body.stats-on #ed-bar .ed-collapse > button:not([data-act="stats"]),
body.stats-on #ed-bar .ed-collapse .sep,
body.stats-on #ed-bar .ed-devices,
body.stats-on #ed-bar [data-act="preview"] { display: none !important; }
#ed-bar [data-act="stats"].on { background: var(--qck, #C87F5E); color: #fff; }
/* With one button left in it, .ed-collapse's 8px right margin is the whole gap between the button
   and the bar's own padding — so Close sat 8px left of centre inside the capsule. */
body.stats-on #ed-bar .ed-collapse { margin-right: 0; }

.st { max-width: 1200px; margin: 0 auto; padding: 4px 4px 140px; font-family: var(--qck-font, Inter, system-ui, sans-serif); color: var(--st-ink); }
.st-fade { opacity: .35; transition: opacity .18s; }

/* ---- the filter bar (the site menu, re-tasked) ---- */
#site-nav.st-navbar .st-navinner { background: rgba(19,19,22,.86) !important; border-color: var(--st-line) !important; gap: 10px; }
.st-navttl { display: inline-flex; align-items: center; gap: 8px; flex: none; color: #fff; font-weight: 700; font-size: 14px; }
.st-navttl svg { width: 17px; height: 17px; color: var(--qck, #C87F5E); }
.st-chips { display: flex; align-items: center; gap: 4px; flex: 1 1 auto; overflow-x: auto; scrollbar-width: none; padding-right: 6px; -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 14px), transparent); mask-image: linear-gradient(90deg, #000 calc(100% - 14px), transparent); }
.st-chips::-webkit-scrollbar { display: none; }
.st-chip { flex: none; display: inline-flex; align-items: center; gap: 5px; border: 0; background: transparent; color: rgba(255,255,255,.62);
  font: inherit; font-weight: 650; font-size: 13px; padding: 7px 13px; border-radius: 999px; cursor: pointer; white-space: nowrap; transition: background .15s, color .15s; }
.st-chip:hover { color: #fff; background: rgba(255,255,255,.08); }
.st-chip.on { background: #fff; color: #111; }
.st-chip svg { width: 12px; height: 12px; opacity: .7; }
.st-chip.pro { color: rgba(255,255,255,.4); }
.st-navx { flex: none; width: 34px; height: 34px; display: grid; place-items: center; border: 0; border-radius: 999px; background: rgba(255,255,255,.08); color: #fff; cursor: pointer; }
.st-navx:hover { background: rgba(255,255,255,.16); }
.st-navx svg { width: 15px; height: 15px; }

/* ---- the grid ---- */
/* The row height has to hold label row + value + footer, because .st-body clips rather than
   spilling over the heading. 128 never did — the numbers were riding up over their own labels long
   before anything clipped. Checked by measurement, not by eye — scripts/check-stats-fit.mjs. */
.st-grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 140px; gap: 14px; }
.st-card { position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 8px; overflow: hidden;
  grid-column: span 1; grid-row: span 1; padding: 16px 18px; border-radius: 20px; border: 1px solid var(--st-line);
  background: var(--st-card); color: var(--st-ink); font: inherit; text-align: left; cursor: default;
  transition: border-color .2s, background .2s, transform .2s; }
.st-card.w2 { grid-column: span 2; } .st-card.w3 { grid-column: span 3; } .st-card.w4 { grid-column: span 4; }
.st-card.h2 { grid-row: span 2; } .st-card.h3 { grid-row: span 3; }
.st-card.has-more { cursor: pointer; }
.st-card.has-more:hover { border-color: rgba(255,255,255,.2); background: var(--st-card2); transform: translateY(-2px); }
.st-card.is-locked { cursor: pointer; }
body.no-vt .st-card { animation: st-rise .5s cubic-bezier(.32,.72,0,1) backwards; animation-delay: calc(var(--i, 0) * 26ms); }
@keyframes st-rise { from { opacity: 0; transform: translateY(14px) scale(.985); } }

.st-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; flex: none; }
.st-lbl { font-size: 12.5px; font-weight: 700; color: var(--st-dim); letter-spacing: .01em; }
.st-ic { flex: none; width: 30px; height: 30px; display: grid; place-items: center; border-radius: 10px;
  background: rgba(200,127,94,.14); color: var(--st-accent); }
.st-ic svg { width: 16px; height: 16px; }
/* A big number HANGS at the bottom of its card. A list has to grow from the top instead — with
   flex-end an over-tall list spills UPWARD, straight over the card's own heading. */
.st-body { display: flex; flex-direction: column; justify-content: flex-end; gap: 6px; flex: 1 1 auto; min-height: 0; }
.st-listbody { justify-content: flex-start; padding-top: 4px; }
/* A safety net for the same fault the list hit: whatever is in here, it clips rather than painting
   over the card's own heading. */
.st-body { overflow: hidden; }
.st-foot { display: flex; align-items: center; gap: 8px; flex: none; flex-wrap: wrap; font-size: 12px; }
/* line-height 1.04 was clipping the ASCENDER, not the layout: the ink box of this face is taller
   than a 1.04 line box, so .st-body's overflow:hidden shaved the top off every number. */
.st-val { display: block; font-weight: 800; font-size: 36px; line-height: 1.16; letter-spacing: -.03em; font-variant-numeric: tabular-nums; }
.st-hero .st-val { font-size: 66px; line-height: 1.08; }
.st-note { font-size: 12.5px; color: var(--st-faint); font-weight: 600; }
.st-name { font-weight: 800; font-size: 26px; line-height: 1; letter-spacing: -.02em; }
.st-vs { color: var(--st-faint); font-size: 11.5px; font-weight: 600; }
.st-delta { display: inline-flex; align-items: center; gap: 3px; font-weight: 750; font-size: 12px; padding: 3px 8px 3px 5px; border-radius: 999px; }
.st-delta svg { width: 12px; height: 12px; }
.st-delta.up { color: var(--st-up); background: rgba(95,208,138,.13); }
.st-delta.down { color: var(--st-down); background: rgba(255,122,114,.13); }
.st-delta.down svg { transform: rotate(180deg); }
.st-delta.flat { color: var(--st-faint); background: rgba(255,255,255,.05); padding: 3px 9px; }
.st-delta.flat svg { display: none; }

/* live */
.st-livewrap { display: flex; align-items: center; gap: 10px; }
.st-pulse { width: 10px; height: 10px; border-radius: 50%; background: var(--st-up); box-shadow: 0 0 0 0 rgba(95,208,138,.6); animation: st-pulse 2s infinite; flex: none; }
@keyframes st-pulse { 70% { box-shadow: 0 0 0 12px rgba(95,208,138,0); } 100% { box-shadow: 0 0 0 0 rgba(95,208,138,0); } }
.st-liveCard .st-val { font-size: 34px; }

/* sparkline + area */
.st-spark { display: block; width: 100%; height: 40px; margin-top: 2px; }
/* the dash is set from the measured path in stDraw() — see the note there */
.st-sparkline { fill: none; stroke: var(--st-accent); stroke-width: 2; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
.st-sparkfill { opacity: 0; }
.st-spark.st-in .st-sparkfill { animation: st-fade .8s .35s forwards; }
@keyframes st-fade { to { opacity: 1; } }
.st-areawrap { position: relative; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.st-area { display: block; width: 100%; flex: 1 1 auto; min-height: 90px; }
.st-arealine { fill: none; stroke: var(--st-accent); stroke-width: 2.5; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
.st-areafill { opacity: 0; }
.st-areawrap.st-in .st-areafill { animation: st-fade .9s .4s forwards; }
.st-areadot { position: absolute; width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%; background: var(--st-accent);
  box-shadow: 0 0 0 4px rgba(200,127,94,.22); opacity: 0; }
.st-areawrap.st-in .st-areadot { animation: st-fade .4s 1.1s forwards; }
.st-axis { display: flex; justify-content: space-between; gap: 6px; margin-top: 6px; font-size: 10.5px; color: var(--st-faint); font-weight: 600; flex: none; }

/* bars */
.st-bars { display: flex; align-items: flex-end; gap: 6px; flex: 1 1 auto; min-height: 0; margin-top: 10px; }
.st-bar { flex: 1 1 0; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; gap: 5px; min-width: 0; height: 100%; }
.st-bar i { display: block; width: 100%; height: 0; min-height: 2px; border-radius: 7px 7px 4px 4px; background: rgba(255,255,255,.11);
  transition: height .7s cubic-bezier(.32,.72,0,1); transition-delay: calc(var(--i, 0) * 26ms); }
.st-bars.st-in .st-bar i { height: var(--h); }
.st-bar.hi i { background: var(--st-accent); }
.st-bar em { display: block; height: 13px; font-style: normal; font-size: 9.5px; line-height: 13px; color: var(--st-faint);
  font-weight: 650; white-space: nowrap; overflow: visible; }
.st-bar.hi em { color: var(--st-ink); }
/* 24 hour labels would collide, so only every sixth carries text — the rest just hold the row open */
.st-bars.st-hours { gap: 2px; }
.st-bars.st-hours .st-bar em { position: relative; left: 0; }

/* rows */
.st-rows { display: flex; flex-direction: column; gap: 9px; width: 100%; }
.st-row { display: flex; flex-direction: column; gap: 5px; }
.st-rowtop { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; font-size: 12.5px; }
.st-rowtop b { font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.st-rowtop em { font-style: normal; color: var(--st-faint); font-weight: 650; font-variant-numeric: tabular-nums; flex: none; }
.st-track { display: block; height: 6px; border-radius: 999px; background: rgba(255,255,255,.07); overflow: hidden; }
.st-track i { display: block; height: 100%; width: 0; border-radius: 999px; background: var(--st-accent);
  transition: width .8s cubic-bezier(.32,.72,0,1); transition-delay: calc(var(--i, 0) * 55ms); }
.st-rows.st-in .st-track i { width: var(--w); }
.st-row:nth-child(2) .st-track i { background: color-mix(in srgb, var(--st-accent) 74%, #fff); }
.st-row:nth-child(3) .st-track i { background: color-mix(in srgb, var(--st-accent) 52%, #fff); }
.st-row:nth-child(n+4) .st-track i { background: rgba(255,255,255,.3); }
.st-none { color: var(--st-faint); font-size: 13px; line-height: 1.5; }

/* locked — a promise and a lock, never a fake number */
.st-card.is-locked { background: rgba(255,255,255,.022); border-style: dashed; border-color: rgba(255,255,255,.11); gap: 4px; }
.st-card.is-locked .st-body { justify-content: center; }
.st-card.is-locked:hover { border-color: rgba(200,127,94,.45); background: rgba(200,127,94,.045); transform: none; }
.st-iclock { background: rgba(255,255,255,.06) !important; color: var(--st-faint) !important; }
.st-card.is-locked:hover .st-iclock { background: rgba(200,127,94,.14) !important; color: var(--st-accent) !important; }
.st-promise { font-size: 13px; line-height: 1.45; color: var(--st-dim); }
.st-unlock { display: inline-flex; align-items: center; gap: 5px; color: var(--st-accent); font-weight: 700; }
.st-unlock svg { width: 12px; height: 12px; }
.st-sec { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 28px 2px 12px; }
.st-sec b { font-size: 15px; font-weight: 750; }
.st-sec span { font-size: 12.5px; color: var(--st-faint); }

/* the hero's number and its note sit on one baseline, so the sparkline gets the room */
.st-line1 { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.st-line1 .st-val { display: inline-block; }
.st-hero .st-spark { height: 64px; margin-top: 10px; }

/* loading — the real board, breathing, with its numbers still on the way */
.st.st-loading .st-card { pointer-events: none; }
.st.st-loading .st-val, .st.st-loading .st-name, .st.st-loading .st-delta,
.st.st-loading .st-rows, .st.st-loading .st-none, .st.st-loading .st-spark, .st.st-loading .st-areawrap { opacity: 0; }
.st.st-loading .st-bars { opacity: .25; }
.st.st-loading .st-card::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
  background: linear-gradient(100deg, transparent 34%, rgba(255,255,255,.045) 50%, transparent 66%);
  background-size: 300% 100%; animation: st-shine 1.5s infinite; }
@keyframes st-shine { to { background-position: -170% 0; } }
.st-first { display: flex; align-items: center; gap: 14px; padding: 16px 18px; margin: 0 0 14px; border-radius: 18px;
  border: 1px solid rgba(200,127,94,.28); background: rgba(200,127,94,.07); }
.st-first > svg { width: 22px; height: 22px; color: var(--st-accent); flex: none; }
.st-first b { display: block; font-size: 14.5px; margin-bottom: 2px; }
.st-first span { display: block; font-size: 13px; color: var(--st-dim); line-height: 1.5; }
.st-fine { margin: 18px 2px 0; font-size: 11.5px; line-height: 1.6; color: var(--st-faint); max-width: 620px; }

/* ---- the detail modal ---- */
.st-scrim { position: fixed; inset: 0; z-index: 2147483200; display: grid; place-items: center; padding: 20px;
  background: rgba(4,4,6,.7); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); opacity: 0; transition: opacity .2s; }
.st-scrim.on { opacity: 1; }
.st-modal { width: min(680px, 100%); max-height: min(84vh, 780px); display: flex; flex-direction: column; overflow: hidden;
  border-radius: 26px; border: 1px solid var(--st-line, rgba(255,255,255,.09)); background: #131316; color: #f4f2ee;
  font-family: var(--qck-font, Inter, system-ui, sans-serif); box-shadow: 0 40px 90px -30px rgba(0,0,0,.8); }
.st-mhead { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding: 22px 24px 14px; flex: none; }
.st-mhead h3 { margin: 0; font-size: 19px; font-weight: 800; letter-spacing: -.02em; }
.st-mhead p { margin: 4px 0 0; font-size: 13px; color: rgba(244,242,238,.56); }
.st-mx { flex: none; width: 34px; height: 34px; display: grid; place-items: center; border: 0; border-radius: 999px;
  background: rgba(255,255,255,.08); color: #fff; cursor: pointer; }
.st-mx:hover { background: rgba(255,255,255,.16); }
.st-mx svg { width: 15px; height: 15px; }
.st-mbody { padding: 4px 24px 8px; overflow-y: auto; flex: 1 1 auto; }
.st-mbody .st-areawrap { height: 190px; margin-bottom: 16px; }
.st-mbody .st-bars { height: 150px; }
.st-mnote { margin: 0; padding: 14px 24px 20px; font-size: 12.5px; line-height: 1.6; color: rgba(244,242,238,.5); flex: none; border-top: 1px solid rgba(255,255,255,.07); }
.st-dh { margin: 20px 0 10px; font-size: 12.5px; font-weight: 700; color: rgba(244,242,238,.56); }
.st-dtable { display: flex; flex-direction: column; }
.st-drow { display: flex; align-items: baseline; gap: 12px; padding: 11px 0; border-bottom: 1px solid rgba(255,255,255,.06); font-size: 13.5px; }
.st-drow:last-child { border-bottom: 0; }
.st-drow b { font-weight: 650; min-width: 74px; flex: none; }
.st-drow span { color: rgba(244,242,238,.44); font-size: 12.5px; flex: 1 1 auto; }
.st-drow em { font-style: normal; font-weight: 750; font-variant-numeric: tabular-nums; flex: none; }
.st-ringwrap { display: grid; place-items: center; padding: 10px 0 18px; }
.st-ring { position: relative; width: 150px; height: 150px; }
.st-ring svg { width: 100%; height: 100%; transform: rotate(-90deg); }
.st-ringbg { fill: none; stroke: rgba(255,255,255,.08); stroke-width: 13; }
.st-ringfg { fill: none; stroke: var(--st-accent, #C87F5E); stroke-width: 13; stroke-linecap: round;
  transition: stroke-dashoffset 1s cubic-bezier(.32,.72,0,1); }
.st-ringc { position: absolute; inset: 0; display: grid; place-items: center; }
.st-ringc .st-val { font-size: 30px; }

/* ---- narrower ---- */
@media (max-width: 1080px) {
  .st-grid { grid-template-columns: repeat(2, 1fr); }
  .st-card.w3, .st-card.w4 { grid-column: span 2; }
  .st-hero .st-val { font-size: 54px; }
}
@media (max-width: 620px) {
  /* One-column cards have room for a delta OR a note, not both — wrapped to two lines the footer
     pushed the value up over the label. The delta is the one that carries information. */
  .st-card:not(.w2):not(.w3):not(.w4) .st-foot { flex-wrap: nowrap; }
  .st-card:not(.w2):not(.w3):not(.w4) .st-foot .st-delta + .st-vs { display: none; }
  .st { padding-bottom: 120px; }
  /* The row height is not decoration: label row + value + footer has to FIT, because .st-body clips
     rather than spilling over the heading. Measured against the tallest of them (a 30px value with a
     delta chip under it), not guessed. */
  .st-grid { grid-auto-rows: 128px; gap: 10px; }
  .st-card { padding: 12px 14px; border-radius: 17px; gap: 5px; }
  .st-card.w2, .st-card.w3, .st-card.w4 { grid-column: span 2; }
  .st-ic { width: 26px; height: 26px; border-radius: 9px; }
  .st-ic svg { width: 14px; height: 14px; }
  .st-body { gap: 4px; }
  .st-val { font-size: 30px; }
  .st-hero .st-val { font-size: 46px; }
  .st-navttl b { display: none; }
  .st-chip { padding: 7px 11px; font-size: 12.5px; }
  .st-modal { border-radius: 22px; max-height: 88vh; }
  .st-mhead, .st-mbody { padding-left: 17px; padding-right: 17px; }
  .st-mnote { padding-left: 17px; padding-right: 17px; }
}
@media (prefers-reduced-motion: reduce) {
  .st-card, .st-bar i, .st-track i, .st-ringfg { transition: none !important; animation: none !important; }
  .st-sparkline, .st-arealine { stroke-dasharray: none !important; stroke-dashoffset: 0 !important; transition: none !important; }
  .st-sparkfill, .st-areafill, .st-areadot { opacity: 1 !important; animation: none !important; }
  .st-bars.st-in .st-bar i { transition: none; }
}

/* ---------------------------------------------------------------------------------------------
   THE MORPH, STAGGERED
   ---------------------------------------------------------------------------------------------
   Each widget card and the stat card that replaces it share a name (stx0…stx39), so the browser
   tweens one rectangle into the other. Naming them is enough to make it work; the DELAY is what
   makes it readable. Fired together, fourteen cards changing at once is a single blink and the eye
   has nothing to follow. Offset by a few frames each, it reads as a sweep across the page — which
   is the moment worth having, and the reason the whole thing is a morph rather than a route.

   `backwards` fill matters: without it a card would jump to its end state and wait out its own
   delay, which is the opposite of a stagger.

   #site-nav carries `stnav` for the length of the transition only (set in openStats/closeStats), so
   the menu is SEEN turning into the range filters instead of being swapped underneath the fade.
   -------------------------------------------------------------------------------------------- */
/* the bar gets the same treatment as the cards: the old menu text laid over the new filter chips
   was the same fault in miniature */
::view-transition-group(stnav) { animation-duration: .5s; animation-timing-function: cubic-bezier(.32,.72,0,1); }
::view-transition-old(stnav) { animation: none; opacity: 0; }
::view-transition-new(stnav) { animation: none; opacity: 1; }

/* ---------------------------------------------------------------------------------------------
   THE PAGE CUTS, IT DOES NOT CROSS-FADE
   ---------------------------------------------------------------------------------------------
   The default root animation fades the old page out while the new one fades in, so for the whole
   620ms the page's PREVIOUS background is still on screen at falling opacity — a brown wash on a
   warm theme, a white one on a light theme. That is the "flash": not a stray colour, the old
   colour outstaying its welcome.

   Fading it out FAST wasn't enough either, and the reason is that `root` is not just the ground: it
   is everything not carrying a transition name — the editor dock, the Desktop/Mobile toggle, the
   section headings, the fine print. At 114ms into a 180ms fade all of it was still plainly on
   screen, the old dock ghosting through the new one, the previous page's warm glow still in the
   corners. THAT is what reads as a flash of the old site, not the cards.

   So root does not animate at all. The new page is there from the first frame and the old one is
   never drawn. The only thing that moves is the cards, which is the only thing that should.

   Scoped to .st-vt — set for the length of this transition only — so the widget-modal morphs keep
   the browser's ordinary root cross-fade. -------------------------------------------------------- */
:root.st-vt::view-transition-new(root) { animation: none; opacity: 1; }
:root.st-vt::view-transition-old(root) { animation: none; opacity: 0; }


/* ---------------------------------------------------------------------------------------------
   THE DEPARTURE IS UNIFORM, THE ARRIVAL SWEEPS
   ---------------------------------------------------------------------------------------------
   The stagger is what makes fourteen cards changing read as a sweep rather than a blink — but put
   on the OLD snapshot it also holds every old card at full opacity through its own delay. So the
   map, the photos, the menu sat there on the black ground for a third of a second before moving,
   which is the "flash": the old card outstaying the page it belonged to.

   So only the arrival is staggered. Every old snapshot starts fading the instant the transition
   begins and is gone in 200ms; the group and the new snapshot carry the per-card offset. Nothing
   from the previous page is on screen while the new one is still arriving.
   -------------------------------------------------------------------------------------------- */


/* ---------------------------------------------------------------------------------------------
   ONLY THE SHAPE TRAVELS
   ---------------------------------------------------------------------------------------------
   A view transition cross-fades the old snapshot into the new one by default. That is wrong here,
   and it is the whole of the "flash": while an analytics card fades UP from nothing, the widget
   card it replaces is still on screen at falling opacity — so for a couple of hundred milliseconds
   you see the map, the photos, "Do I need a reservation?" laid over a board that is already black.
   Bright photographs over dark cards, so the old one wins the eye every time.

   So there is no cross-fade. The old snapshot is dropped outright and the new card is solid from
   the first frame, sitting exactly where the widget card was, at exactly its size. What animates
   is the GROUP: the rectangle travelling and resizing into its place on the board. The card
   genuinely takes the form of the card that replaces it, rather than dissolving into it — and
   nothing from the previous page is ever on screen at the same time as the new one.

   The delay is per card, so it reads as a sweep instead of one blink.
   -------------------------------------------------------------------------------------------- */
::view-transition-old(stx0), ::view-transition-old(stx1), ::view-transition-old(stx2), ::view-transition-old(stx3),
::view-transition-old(stx4), ::view-transition-old(stx5), ::view-transition-old(stx6), ::view-transition-old(stx7),
::view-transition-old(stx8), ::view-transition-old(stx9), ::view-transition-old(stx10), ::view-transition-old(stx11),
::view-transition-old(stx12), ::view-transition-old(stx13), ::view-transition-old(stx14), ::view-transition-old(stx15),
::view-transition-old(stx16), ::view-transition-old(stx17), ::view-transition-old(stx18), ::view-transition-old(stx19),
::view-transition-old(stx20), ::view-transition-old(stx21), ::view-transition-old(stx22), ::view-transition-old(stx23),
::view-transition-old(stx24), ::view-transition-old(stx25), ::view-transition-old(stx26), ::view-transition-old(stx27),
::view-transition-old(stx28), ::view-transition-old(stx29), ::view-transition-old(stx30), ::view-transition-old(stx31),
::view-transition-old(stx32), ::view-transition-old(stx33), ::view-transition-old(stx34), ::view-transition-old(stx35),
::view-transition-old(stx36), ::view-transition-old(stx37), ::view-transition-old(stx38), ::view-transition-old(stx39) {
  animation: none; opacity: 0;
}
::view-transition-new(stx0), ::view-transition-new(stx1), ::view-transition-new(stx2), ::view-transition-new(stx3),
::view-transition-new(stx4), ::view-transition-new(stx5), ::view-transition-new(stx6), ::view-transition-new(stx7),
::view-transition-new(stx8), ::view-transition-new(stx9), ::view-transition-new(stx10), ::view-transition-new(stx11),
::view-transition-new(stx12), ::view-transition-new(stx13), ::view-transition-new(stx14), ::view-transition-new(stx15),
::view-transition-new(stx16), ::view-transition-new(stx17), ::view-transition-new(stx18), ::view-transition-new(stx19),
::view-transition-new(stx20), ::view-transition-new(stx21), ::view-transition-new(stx22), ::view-transition-new(stx23),
::view-transition-new(stx24), ::view-transition-new(stx25), ::view-transition-new(stx26), ::view-transition-new(stx27),
::view-transition-new(stx28), ::view-transition-new(stx29), ::view-transition-new(stx30), ::view-transition-new(stx31),
::view-transition-new(stx32), ::view-transition-new(stx33), ::view-transition-new(stx34), ::view-transition-new(stx35),
::view-transition-new(stx36), ::view-transition-new(stx37), ::view-transition-new(stx38), ::view-transition-new(stx39) {
  animation: none; opacity: 1;
}
::view-transition-group(stx0) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 0ms; animation-fill-mode: backwards; }
::view-transition-group(stx1) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 14ms; animation-fill-mode: backwards; }
::view-transition-group(stx2) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 28ms; animation-fill-mode: backwards; }
::view-transition-group(stx3) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 42ms; animation-fill-mode: backwards; }
::view-transition-group(stx4) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 56ms; animation-fill-mode: backwards; }
::view-transition-group(stx5) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 70ms; animation-fill-mode: backwards; }
::view-transition-group(stx6) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 84ms; animation-fill-mode: backwards; }
::view-transition-group(stx7) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 98ms; animation-fill-mode: backwards; }
::view-transition-group(stx8) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 112ms; animation-fill-mode: backwards; }
::view-transition-group(stx9) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 126ms; animation-fill-mode: backwards; }
::view-transition-group(stx10) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 140ms; animation-fill-mode: backwards; }
::view-transition-group(stx11) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 154ms; animation-fill-mode: backwards; }
::view-transition-group(stx12) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 168ms; animation-fill-mode: backwards; }
::view-transition-group(stx13) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 182ms; animation-fill-mode: backwards; }
::view-transition-group(stx14) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx15) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx16) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx17) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx18) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx19) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx20) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx21) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx22) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx23) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx24) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx25) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx26) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx27) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx28) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx29) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx30) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx31) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx32) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx33) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx34) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx35) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx36) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx37) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx38) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }
::view-transition-group(stx39) { animation-duration: .58s; animation-timing-function: cubic-bezier(.32,.72,0,1); animation-delay: 190ms; animation-fill-mode: backwards; }


@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation-duration: .01ms !important; animation-delay: 0ms !important; }
}

/* the dock answers the tap even when the numbers take a moment */
#ed-bar [data-act="stats"].is-busy { opacity: .6; }
#ed-bar .st-closebtn svg { width: 14px; height: 14px; }


/* SECTIONS IS THE WAY AROUND A PAGE DRAWN BY A DESIGN, at every width. It is hidden on a phone for
   the bento grid, where mobile is a flat list with no sections in it — but a design has the same
   sections on a phone as on a desktop, and this is how you reach every one of them. */
body.clay #ed-bar [data-act="layout"] { display: inline-flex !important; }
/* THE FEEDBACK BUTTON STEPS ASIDE ON A PHONE. There it is a floating button over the Done you are
   reaching for; on a desktop there is room for both — the panel takes the right, a modal sits in
   the middle, and the button is in a corner neither of them uses. */
@media (max-width: 760px) {
  body.wm-open #fb-dock, body.sheet-open #fb-dock, body.panel-open #fb-dock { display: none; }
  /* on a phone the side panel IS the screen, so undo goes with it — see the rule beside .undo-dock */
  body.panel-open .undo-dock { opacity: 0; pointer-events: none; }
}

/* THE ADD PANEL'S LAST ROW — when there is nothing left to add, the way to ask for more. A row on
   a panel of rows reads as a statement; this one is a control, so it is dressed as one. */
.cf-row-ask { width: 100%; text-align: left; cursor: pointer; border: 1px dashed rgba(255,255,255,0.16); background: rgba(255,255,255,0.02); }
.cf-row-ask:hover { border-color: var(--qck, #C87F5E); background: rgba(255,255,255,0.045); }
.cf-plus { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 999px; background: var(--qck, #C87F5E); color: #fff; }
.cf-plus svg { width: 18px; height: 18px; }

/* a dish with no category, on a menu that has them — a loose end, marked as one */
.mn-ecat.mn-none { background: transparent; border: 1px dashed rgba(255,255,255,0.22); color: rgba(255,255,255,0.4); }

/* WHICH REVIEW IS SET LARGE. Every theme pulls one out and prints it as the quote; without a way to
   choose, it was whatever Google returned first — on a real page, one that said "Good." */
.rv-row-pin { flex: 0 0 auto; width: 30px; height: 30px; display: grid; place-items: center;
  border: 0; border-radius: 50%; background: transparent; color: rgba(255,255,255,0.28);
  cursor: pointer; font-size: 14px; line-height: 1; transition: color .15s, background .15s; }
.rv-row-pin:hover { color: rgba(255,255,255,0.7); background: rgba(255,255,255,0.08); }
.rv-row-pin.on { color: var(--qck, #C87F5E); }
.rv-row.big { border-color: color-mix(in oklab, var(--qck, #C87F5E) 45%, transparent); }
.rv-big { margin-left: 7px; font-style: normal; font-size: 10.5px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--accent, #C87F5E); vertical-align: middle; }

/* DROP A SCREENSHOT ANYWHERE ON THE FORM. Reporting something means you have just taken a picture
   of it — the file picker was the only way in, and dropping the file on the card did nothing at all
   (the browser was quietly navigating to the JPEG instead). The whole card is the target, and it
   says so while something is over it. */
.fb-card.drop { outline: 2px dashed var(--qck, #C87F5E); outline-offset: -6px; }
.fb-card.drop .fb-shotrow { opacity: .35; }
.fb-card.busy { pointer-events: none; }
.fb-card.busy .fb-add { opacity: .5; }
