/* shell-rulings.css: production rules that sit on top of the owner's design layer (responsive.css).
   Carried from the retired responsive-shell.css on 8 Sep 2026: configuration visibility, native drawers and overlays,
   and the owner rulings made since the design was drawn (side panel edge, copy rule). Load last. */

/* Tokens the retired layer defined and the drawers below rely on. */
:root { --z-sticky: 100; --z-dropdown: 200; --z-backdrop: 500; --z-sheet: 600; --z-dialog: 700; --z-media: 800; --z-status: 900; --scrollbar-track: var(--surface-alt, #f2f4f7); --scrollbar-thumb: var(--muted, #6b7280); color-scheme: light; }
[hidden] { display: none !important; }

/* Configuration visibility must win over retained mobile forced-display rules. */
html body #toggleScreen #gatePartnerLockup[hidden],
html body.aios-active #aiosCanvas .aios-dock .powered-by-gallea.aios-attribution[hidden] { display: none !important; }
* { scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-track { background: var(--scrollbar-track); }
*::-webkit-scrollbar-thumb { border: 2px solid var(--scrollbar-track); border-radius: 8px; background: var(--scrollbar-thumb); }
:where(button, a, input, textarea, select, [tabindex]):focus-visible {
  outline: 3px solid var(--aios-blue, #31557a);
  outline-offset: 3px;
}
:where(button, a, input, textarea, select) { touch-action: manipulation; }
textarea { resize: none; }
:where(button, p, h1, h2, h3, td, th, figcaption) { overflow-wrap: anywhere; }
:where(.aios-container, .aios-answer, .turn-widgets, .aios-topbar-left, .welcome-action, .composer-input-row) { min-width: 0; }
:where(.navbar-hamburger, .side-panel-close, .chrome-overlay-close, .content-overlay-close, .input-send, .input-mic, .lang-dropdown-item, .toggle-legal-bar button) { min-width: 44px; min-height: 44px; }
@media (pointer: coarse) { :where(.side-panel-legal button, .side-panel-plate-link) { min-height: 44px; } }
.lang-dropdown { z-index: var(--z-dropdown); max-width: calc(100vw - 32px); }
.lang-dropdown-item { white-space: normal; }

/* Native modal drawers and sheets share overlays.js focus and inert behavior. */
.side-panel-backdrop { z-index: var(--z-backdrop); }
.side-panel {
  left: auto;
  right: 0;
  z-index: var(--z-sheet);
  width: 280px;
  height: 100vh;
  height: 100dvh;
  max-height: 100dvh;
  transform: translateX(100%);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-bottom: env(safe-area-inset-bottom, 0px);
  box-shadow: -4px 0 16px rgb(0 0 0 / 10%);
}
.side-panel.open { transform: translateX(0); }
.side-panel > * { flex-shrink: 0; }
.side-panel-nav-item { min-height: 48px; }
.side-panel-close { align-items: center; justify-content: center; }
.side-panel-legal { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; }
body .side-panel #tenantFooterLinks:not([hidden]) { display: flex !important; flex-wrap: wrap; gap: 12px; }

.content-overlay { top: 0; z-index: var(--z-dialog); isolation: isolate; }
.chrome-overlay { z-index: var(--z-dialog); }
.chrome-overlay-head { flex: 0 0 auto; gap: 12px; padding-top: max(12px, env(safe-area-inset-top, 0px)); }
.chrome-overlay-close { flex: 0 0 44px; }
.chrome-overlay-body { min-height: 0; overscroll-behavior: contain; }
.content-overlay-close { width: 44px; height: 44px; position: sticky; top: 16px; float: right; margin: 16px 20px 0 0; }
.content-overlay-inner { padding-top: 28px; padding-bottom: calc(48px + env(safe-area-inset-bottom, 0px)); }
.content-overlay-inner > h2 { padding-right: 56px; }
.access-toggle { width: 100%; font: inherit; text-align: left; min-height: 48px; }
.aios-vplate .vplate__box,
.aios-vplate .vplate__header-box,
.aios-vplate .vplate__strip-box { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; }
.legal-table { width: 100%; table-layout: fixed; }
.legal-table th, .legal-table td { overflow-wrap: anywhere; }
.legal-doc-note { overflow-wrap: anywhere; }

/* Side panel (owner ruling 8 Sep 2026): one left edge at 18 px for the brand, the nav icons, the Guest block, the lockup, the plate link and the legal links; the Guest block sits directly above the footer with no dead space. */
.side-panel-nav { padding-left: 4px !important; padding-right: 4px !important; }
.side-panel-user { margin-top: auto !important; padding: 16px 18px !important; }
.side-panel-footer { margin-top: 0 !important; padding: 12px 18px 16px !important; gap: 10px !important; align-items: flex-start !important; }
.side-panel-brand-lockup { justify-content: flex-start !important; padding: 0 !important; }
.side-panel-brand-lockup .attr-mark-composite { height: 28px; width: auto; max-width: 100%; object-fit: contain; }

/* Starters (owner ruling 9 Sep 2026): title and subtext are shown when all six fit their tiles cleanly at this screen; if any
   subtext cannot fit, none of the six shows it (scale.js measures and sets .subtext-hidden). Copy rule (8 Sep 2026): nothing
   in a tile is ever cut with an ellipsis or a clamp. */
#welcomeActions .welcome-action-sub { display: block !important; -webkit-line-clamp: unset !important; line-clamp: unset !important; overflow: visible !important; }
#welcomeActions.subtext-hidden .welcome-action-sub { display: none !important; }
#welcomeActions .welcome-action-title { -webkit-line-clamp: unset !important; line-clamp: unset !important; overflow: visible !important; white-space: normal !important; text-overflow: clip !important; }
#welcomeActions .welcome-action { height: auto !important; max-height: none !important; }

/* ---- Carried forward from the retired responsive-shell.css, line by line by git blame, from the owner-ruling commits
   c6bf917 (shell polish: logo never clips, trail right with the version pill's casing, balanced attribution, no legal bar on the gate),
   96f23c7 (clipping fixes), bdf9cf1 (touch targets, side panel footer). The gate layout itself now comes from the design layer. ---- */

/* Client logo never clips: the brand box sizes to the image, the image keeps its aspect (c6bf917). */
.aios-topbar .aios-topbar-brand, .aios-topbar .navbar-logo { overflow: visible !important; flex: 0 0 auto; min-width: 0; }
.aios-topbar .navbar-logo { background: transparent; border: 0; padding: 0; }
.aios-topbar .navbar-logo img { height: 32px !important; width: auto !important; max-width: min(46vw, 240px) !important; object-fit: contain; }
@media (max-width: 767px) { .aios-topbar .navbar-logo img { height: 28px !important; max-width: 44vw !important; } }

/* Attribution wraps balanced, never an orphan word (c6bf917); the design layer's two-line cap stays as the ceiling. */
.aios-attribution-line, .toggle-poweredby .aios-attribution-line, .aios-dock #dockAttribution, #toggleScreen #gateAttribution { text-wrap: balance; text-align: center; white-space: normal; max-width: 100%; }

/* Trail (owner ruling 7 Sep 2026, later than the design's R4): in the right cluster beside the version pill, same casing as the version pill, hidden below 1024. */
.aios-topbar-controls { display: flex; align-items: center; gap: 10px; }
.aios-topbar .trailslot, .aios-topbar-controls .trailslot { position: static !important; inset: auto !important; order: 0 !important; flex: 0 1 auto !important; margin: 0 !important; padding-left: 0 !important; }
.aios-topbar-controls .aios-version-mark { order: 1; }
.aios-topbar-controls .navbar-hamburger { order: 2; }
.aios-topbar .trailslot.empty { display: none !important; }
.aios-trail { min-height: 0; }
.aios-trail .tnode { font-size: 11px; font-weight: 600; letter-spacing: 0.05em; }
.aios-trail .tnode.t-home { min-width: 0; min-height: 0; }
@media (pointer: coarse) { .tnode { min-width: 44px; min-height: 44px; } .aios-trail { min-height: 44px; } .aios-trail .tnode.t-home { min-width: 0; min-height: 0; } }
@media (max-width: 1023px) { .aios-topbar .trailslot { display: none !important; } }

/* Gate: no legal bar (owner ruling: legal links removed from the gate). */
#toggleScreen .toggle-legal-bar { display: none !important; }

/* Touch targets and clipping fixes (bdf9cf1, 96f23c7). */
:where(.navbar-hamburger, .side-panel-close, .chrome-overlay-close, .content-overlay-close, .input-send, .input-mic, .lang-dropdown-item) { min-width: 44px; min-height: 44px; }
@media (pointer: coarse) { :where(.side-panel-legal button, .side-panel-plate-link) { min-height: 44px; } }
html { scrollbar-gutter: auto; }
.aios-dock .input-bar-wrap { position: relative; }
.voice-status { position: absolute; right: calc(var(--content-gut) + 54px); bottom: calc(100% + 12px); z-index: var(--z-status); }
@media (min-width: 1024px) and (max-height: 850px) { #welcomeActions .welcome-action { padding-block: 14px; gap: 8px; } }

/* Side panel footer rows left-aligned (bdf9cf1), alongside the 18 px edge rule above. */
.side-panel-plate-link { justify-content: flex-start !important; padding: 4px 0 !important; min-height: 0 !important; margin: 0 !important; }
.side-panel-legal { justify-content: flex-start !important; gap: 8px !important; }
.side-panel-legal button { padding: 2px 0 !important; min-height: 0 !important; }

/* Trail casing (owner ruling 8 Sep 2026): the trail pill is identical to the version pill in height, fill and border (11 px, 600, white, 1 px line, 999 radius, 5 px 11 px padding, 29 px tall like the version pill); the home icon is plain, no box of its own; a chevron separates every step, Home included; the pill grows to fit its content and never clips. Overrides the design layer's R4 boxes. */
.aios-topbar .trailslot .trailrow { overflow: visible !important; gap: 0 !important; }
.aios-topbar .trailslot .aios-trail { display: inline-flex !important; align-items: center !important; gap: 6px !important; max-width: none !important; overflow: visible !important; font-size: 11px !important; font-weight: 600 !important; letter-spacing: 0.05em !important; line-height: normal !important; box-sizing: border-box !important; min-height: 29px !important; border: 1px solid var(--line, #E5E7EB) !important; background: #fff !important; border-radius: 999px !important; padding: 5px 11px !important; color: var(--aios-blue, var(--accent)) !important; }
.aios-topbar .trailslot .tnode, .aios-topbar .trailslot .tnode:not(.t-home), .aios-topbar .trailslot .tnode.t-home { height: auto !important; width: auto !important; min-width: 0 !important; min-height: 0 !important; padding: 0 !important; margin: 0 !important; border: 0 !important; border-radius: 0 !important; background: none !important; color: var(--aios-blue, var(--accent)) !important; font: inherit !important; overflow: visible !important; text-overflow: clip !important; white-space: nowrap !important; }
.aios-topbar .trailslot .tnode[aria-current="page"] { background: none !important; color: var(--ink, #1a1a1a) !important; font-weight: 700 !important; }
.aios-topbar .trailslot .tnode.t-home svg { width: 12px !important; height: 12px !important; display: block; }
.aios-topbar .trailslot .aios-trail-chevron, .aios-topbar .trailslot .trailrow > span { color: var(--muted, #9AA3AF) !important; font-size: 12px !important; line-height: 1 !important; margin: 0 7px !important; }

/* ---- Screen-size policy (owner ruling 8 Sep 2026). scale.js judges the window against the class's drawn frames and sets
   --app-zoom (uniform zoom, never below 1), --app-vh (the held drawn height, only in the taller case) and data-size-case
   (drawn, larger, wider, taller, short) on <html>. The design layer's `body { zoom: 1 }` is superseded here because the
   design is drawn at seven frames and the policy governs every window in between and beyond. ---- */
html { --app-vh: calc(100dvh / var(--app-zoom, 1)); }
/* Viewport units inside a zoomed body are multiplied by the zoom; every rule that reads the viewport is divided back so the
   layout at a zoomed window is exactly the drawn frame, scaled. At zoom 1 every value below is identical to the layer it overrides. */
.side-panel { height: var(--app-vh) !important; max-height: var(--app-vh) !important; }
/* The design's side panel widths (tablet 320, phone min(320, window minus 48)) had been overridden by the carried 280 above; restored. */
@media (min-width: 768px) and (max-width: 1023px) { .side-panel { width: 320px; } }
@media (max-width: 767px) { .side-panel { width: min(320px, calc(100vw / var(--app-zoom, 1) - 48px)); } }
.lang-dropdown { max-width: calc(100vw / var(--app-zoom, 1) - 32px); }
/* A legal page and the plate cover the screen (owner, 10 Sep 2026). The 92vh cap left the overlay 68 px short of a 844 px
   phone and the composer showed underneath it; the dynamic viewport unit is what that cap was reaching for, so the
   overlay ends exactly where the browser's own chrome begins. vh stays as the fallback for engines without dvh. */
@media (max-width: 1023px) { .chrome-overlay { max-height: calc(100vh / var(--app-zoom, 1)); max-height: calc(100dvh / var(--app-zoom, 1)); } }
@media (max-width: 767px) { .modal-content { min-height: calc(100vh / var(--app-zoom, 1)); } }
.aios-lightbox .lb { max-width: min(calc(92vw / var(--app-zoom, 1)), 1600px); width: min(calc(92vw / var(--app-zoom, 1)), 1600px); max-height: calc(88vh / var(--app-zoom, 1)); }
.aios-lightbox .lb-stage { height: min(calc(72vh / var(--app-zoom, 1)), 820px); max-height: calc(88vh / var(--app-zoom, 1) - 72px); }
.media { max-height: min(280px, calc(42vh / var(--app-zoom, 1))); }
.pc-hero, .aios-media-stage--photo .aios-media-canvas { max-height: min(440px, calc(50vh / var(--app-zoom, 1))); }
.aios-media-stage--plan .aios-media-canvas { height: min(520px, calc(60vh / var(--app-zoom, 1))); }
@media (max-width: 767px) {
  .media, .pc-hero, .aios-media-stage--photo .aios-media-canvas { max-height: min(240px, calc(40vh / var(--app-zoom, 1))); }
  .aios-media-stage--plan .aios-media-canvas { height: min(420px, calc(55vh / var(--app-zoom, 1))); }
}
@media (min-width: 768px) {
  .aios-canvas:not(.has-messages) .orb-wrapper-large .orb,
  #aiosCanvas:not(.has-messages) .orb-wrapper .orb { width: clamp(110px, calc(14.3vh / var(--app-zoom, 1)), 145px) !important; height: clamp(110px, calc(14.3vh / var(--app-zoom, 1)), 145px) !important; }
}
.aios-canvas:not(.has-messages) .aios-welcome,
#aiosCanvas:not(.has-messages) .discovery-welcome { margin-bottom: clamp(8px, calc(1.4vh / var(--app-zoom, 1)), 16px) !important; }
/* Viewport-width units that still bind at drawn widths (the rest sit at their caps by 1440 or belong to layers not rendered). */
@media (min-width: 1024px) { .aios-topbar { padding-inline: clamp(20px, calc(2.2vw / var(--app-zoom, 1)), 44px); } }
/* The gate is a fixed 840 px block; its only width-fluid values are these, capped at their 1440-frame values so every wider canvas renders the gate as the 1440 frame, scaled. */
.toggle-card { padding: clamp(32px, min(calc(3vw / var(--app-zoom, 1)), 43.2px), 48px) clamp(28px, min(calc(2.6vw / var(--app-zoom, 1)), 37.44px), 40px); }
.toggle-card-body { font-size: clamp(13px, min(calc(0.95vw / var(--app-zoom, 1)), 13.68px), 15px); }
.content-overlay-inner { padding-inline: clamp(24px, calc(3vw / var(--app-zoom, 1)), 48px); }
/* Copy rule on the gate card title: the two-line box from the demo stylesheets keeps its height as a minimum (frames unchanged)
   but grows for a third line instead of clamping it (seen when the zoomed canvas is wider than 1440). */
#toggleScreen .toggle-card-title { height: auto !important; max-height: none !important; -webkit-line-clamp: unset !important; line-clamp: unset !important; overflow: visible !important; }
/* History (owner ruling 8 Sep 2026): tenant-branded head, search over question and answer, time pills. */
.history-head { display: flex; align-items: center; gap: 14px; margin-bottom: 14px; }
.history-head h2 { margin: 0; }
.history-logo { height: 25.3px; width: auto; display: block; }
.history-tools { display: flex; flex-direction: column; gap: 10px; margin: 0 0 16px; max-width: 760px; }
.history-search { width: 100%; box-sizing: border-box; font: inherit; font-size: 14px; padding: 10px 14px; border: 1px solid var(--line, #E5E7EB); border-radius: 10px; background: #fff; color: var(--ink, #1a1a1a); }
.history-search:focus { outline: none; border-color: var(--aios-blue, #31557a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--aios-blue, #31557a) 18%, transparent); }
.history-pills { display: flex; flex-wrap: wrap; gap: 8px; }
.history-pill { font: inherit; font-size: 12px; font-weight: 700; letter-spacing: 0.02em; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--line, #E5E7EB); background: #fff; color: var(--ink, #1a1a1a); cursor: pointer; min-height: 32px; }
.history-pill.on { background: var(--aios-blue, #31557a); border-color: var(--aios-blue, #31557a); color: #fff; }
.history-item[hidden] { display: none !important; }
.history-item-title, .history-item-preview { overflow: visible; white-space: normal; text-overflow: clip; }

/* Gate block on tablets (design of record 9 Sep 2026): the design sizes the two cards as a share of the block, which needs a
   definite block width; the base block is content-sized and capped at 1100, so the share resolved against the cap and the
   fit shrank the whole gate. The block takes the window minus the fit's 24 px margins at every tablet width. */
@media (min-width: 768px) and (max-width: 1023px) { #toggleScreen:not(.hidden) .toggle-screen { width: calc(100% - 48px) !important; flex: 0 1 auto !important; } }

/* ---------- Lightbox (9 Sep 2026): lightbox.js builds #lightbox with .lb- classes; these are its styles. ---------- */
#lightbox { position: fixed; inset: 0; z-index: 1200; background: rgba(12, 18, 28, .9); display: flex; align-items: center; justify-content: center; padding: 24px; }
#lightbox[hidden] { display: none !important; }
#lightbox .lb-figure { margin: 0; max-width: min(1400px, 92vw); max-height: 88vh; display: flex; flex-direction: column; align-items: center; gap: 12px; }
#lightbox .lb-img { max-width: 92vw; max-height: 76vh; width: auto; height: auto; object-fit: contain; border-radius: 10px; background: #000; box-shadow: 0 12px 40px rgba(0, 0, 0, .5); }
#lightbox .lb-cap { color: #fff; font-size: 14px; line-height: 1.4; text-align: center; margin: 0; max-width: 80ch; }
#lightbox .lb-count { position: absolute; left: 24px; bottom: 20px; color: rgba(255, 255, 255, .85); font-size: 13px; font-weight: 700; letter-spacing: .04em; }
#lightbox .lb-close { position: absolute; top: 18px; right: 18px; width: 44px; height: 44px; border-radius: 999px; border: 0; background: rgba(255, 255, 255, .14); color: #fff; font-size: 22px; line-height: 44px; cursor: pointer; }
#lightbox .lb-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 48px; height: 48px; border-radius: 999px; border: 0; background: rgba(255, 255, 255, .14); color: #fff; font-size: 24px; cursor: pointer; }
#lightbox .lb-prev { left: 18px; } #lightbox .lb-next { right: 18px; }
#lightbox .lb-close:hover, #lightbox .lb-nav:hover { background: rgba(255, 255, 255, .28); }
#lightbox .lb-close:focus-visible, #lightbox .lb-nav:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
#lightbox .lb-error { color: #fff; }
@media (max-width: 767px) { #lightbox { padding: 12px; } #lightbox .lb-nav { width: 40px; height: 40px; } #lightbox .lb-prev { left: 8px; } #lightbox .lb-next { right: 8px; } #lightbox .lb-img { max-height: 70vh; } }

/* ---------- The set decides the fact shape (owner, 10 Sep 2026). The renderer writes data-fact-rows on the grid. ---------- */
.set[data-fact-rows="1"] .card .facts { min-height: 62px; }
.set[data-fact-rows="1"] .card .fact:nth-child(n+3) { display: none; }
.set[data-fact-rows="0"] .card .facts { display: none; }
.set[data-fact-rows="0"] .card .cid { border-bottom: 0; }
/* the pill shows only when the set mixes offerings; a detail always keeps it */
.set[data-pills="same"] .card .media .offer { display: none; }
/* cards are objects: hover lifts, keyboard focus shows */
.set .card { transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease; }
.set .card:hover { transform: translateY(-2px); border-color: #C2CAD4; box-shadow: 0 6px 18px rgba(16, 24, 40, .10); }
.set .card:focus-visible { outline: 2px solid var(--ac, #1e4f9d); outline-offset: 2px; }
/* the overview sits in a text column; cards use the full column beneath it */
.aios-answer-text { max-width: 75ch; }
.aios-answer-text .readmore { display: inline; background: none; border: 0; padding: 0; margin-left: 6px; color: var(--ac, #1e4f9d); font: inherit; font-weight: 700; cursor: pointer; }
.aios-answer-text .readmore:focus-visible { outline: 2px solid var(--ac, #1e4f9d); outline-offset: 2px; }
/* quieter count line and reveal bar */
.page-bar .page-count { color: var(--sub, #66727F); font-size: 12px; }
/* body copy: sections with room, lists as lists */
.copyblk h3.md-h1, .copyblk h4.md-h2, .copyblk h5.md-h3 { margin: 18px 0 6px; font-weight: 800; color: var(--ink, #1B2430); line-height: 1.25; }
.copyblk h3.md-h1 { font-size: 16px; } .copyblk h4.md-h2 { font-size: 14px; } .copyblk h5.md-h3 { font-size: 13px; letter-spacing: .04em; text-transform: uppercase; color: var(--sub, #66727F); }
.copyblk ul, .copyblk ol { margin: 6px 0 12px 20px; padding: 0; } .copyblk li { margin: 3px 0; }

/* ---------- Content column (owner, 10 Sep 2026): 1120 px maximum on desktop, centred, at every desktop width; the composer and the
   answers share it; the top bar and the attribution run full width; phones and tablets unchanged. Overrides the design's 1440 column and
   62 percent rule until the next export carries the same numbers. ---------- */
@media (min-width: 1024px) {
  :root { --content-max: 1120px !important; --col-w: min(calc(var(--app-w) - 2 * var(--edge)), 1120px) !important; --ui-up: 1 !important; }
  .aios-container, .aios-canvas, #aiosCanvas, .chat-scroll > *, #welcomeFit, .aios-dock .input-bar-wrap, .aios-dock .chips-row, .aios-dock .composer-meta, .aios-dock .powered-by-gallea, .aios-dock .aios-attribution-line, .aios-dock #dockAttribution { max-width: 1120px; margin-left: auto; margin-right: auto; }
  .aios-topbar { zoom: 1; }
}

/* ---------- Body copy inside details and tabs (10 Sep 2026): a 70-character measure, rhythm, subheads with room ---------- */
.pane .copyblk p, .copyblk p { max-width: 70ch; font-size: 14px; line-height: 1.6; margin: 0 0 12px; }
.pane .copyblk ul, .copyblk ul { max-width: 70ch; }
.factlines { margin: 12px 0 0; } .factline { padding: 7px 0; }

/* ---------- Detail overview tab (10 Sep 2026): body, body lines and contact rows share the pane's padding and width ---------- */
.pane .factlines { margin: 12px 0 0; }
.pane .contact-blk { margin: 16px 0 0; }
.pane .contact-blk h4 { margin: 0 0 6px; font-size: 13px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; color: var(--sub, #66727F); }
.pane .contact-blk .contact { border: 0; padding: 0; margin: 0; width: 100%; max-width: none; }
.pane .contact-blk .contact .crow { padding: 10px 0; }

/* tab band wraps when the tabs do not fit; body lines align with the copy */
.pc .tabrow { flex-wrap: wrap; }
.pane .factlines .factline { padding-left: 0; padding-right: 0; }

/* ---------- One height per set (owner, 10 Sep 2026) ----------
   "They stay the same length no matter what information is filled out." The name block is the only part of a face card that
   grows: a name that wraps to two lines made the live commercial set 418 px beside 440 px. kit-renderer measures the set's
   tallest name block and writes --cid-h on the grid; the card standard itself is not touched. */
.set .card .cid { min-height: var(--cid-h, 74px); }
.set .card .pricerow { min-height: var(--price-h, 0px); }
.set .card .facts .fact:nth-child(-n+2) { min-height: var(--fact-r1, 44px); }
.set .card .facts .fact:nth-child(n+3) { min-height: var(--fact-r2, 62px); }
.set > .card { min-height: var(--card-h, 0px); }

/* ---------- Large screens (owner, 10 Sep 2026, from his 100 percent versus 150 percent monitor pictures): wider than the 1440 frame the whole shell
   scales up uniformly by the smaller of width over 1440 and height over 900, never below 1, capped at 2. A 2560x1350 monitor shows the
   1440 layout at 1.5, which is the picture he approved; a 1512 laptop is 1.05. The 1120 column, the composer and every card scale with it.
   Replaces the design file's chrome-scale rule (ui-up) above 1440 until the next export carries this. Round 21 (never below 1) stands. ---------- */
@media (min-width: 1441px) {
  :root { --app-zoom: min(2, max(1, min(tan(atan2(100vw, 1440px)), tan(atan2(100vh, 900px))))) !important; --ui-up: 1 !important; }
  body.aios-active { zoom: var(--app-zoom); }
}

/* reveal: a failed page says so in a plain line and keeps the buttons */
.page-bar .page-note { font-size: 12px; color: var(--sub, #66727F); margin-top: 8px; }
.page-bar .page-note[hidden] { display: none; }
