/* The design system's shared stylesheet — every door page (admin., tenant., app.) loads it before control.css. Here, once:
   the tokens (both colour sets and the meanings bound to them), the base text rendering, text links, the controls, the
   panel, the tables, the pills, the hints and action rows, the ? mark, the sheets and dialogs, the fixed header and the
   pop-up menus. control.css may place and space these and never restyles them (house rule 21). The guide is DESIGN.md in
   this repository. Its home is here since 2026-09-11; before that a copy of emictech-web's protected/admin-shared.css.
   Never copy a rule from here into a page: duplication is how the pages drifted apart three times. */

*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
[hidden]{display:none!important}

/* The doors' colour sets (DESIGN.md, Tokens). Dark is the doors today; light is the day set of 2026-09-12. A set is scoped by
   attribute as well as by root, so one panel can wear the other set (the Palette page) and, once a switch exists, <html
   data-theme> wears a person's choice. Every text token and every meaning reads at 4.5:1 or better on both grounds of its
   own set — tests/test_palette.py holds it. Pages use meanings, never hues; a tint is color-mix(in srgb, var(--x) 35%,
   transparent). The dark hues are VS Code Dark+; the light ones keep the meanings, darkened to read on white. */
:root,[data-theme=dark]{
  color-scheme:dark;
  --bg:#0a0a0a;--bg2:#141414;--bg3:#262626;      /* bg3: the third ground — an inset: inline code, a bar, a box; the hairline's tone */
  --border:#262626;--border2:#3a3a3a;
  --text:#f5f5f5;--text3:#cfcfcf;--text4:#808080;   /* text4 7a→80 on 2026-09-12: the muted grey now passes 4.5:1 on a card */
  --scrollbar:#4d4d4d;                               /* the scrollbar's thumb, on no track */
  --c-azure:#4daafc;--c-blue:#3794ff;--c-sky:#9cdcfe;--c-teal:#4ec9b0;--c-green:#89d185;--c-olive:#6a9955;--c-yellow:#cca700;
  --c-sand:#dcdcaa;--c-orange:#ce9178;--c-amber:#d18616;--c-red:#f14c4c;--c-purple:#c586c0;--c-violet:#b180d7;
  --nav-bg:rgba(10,10,10,0.85);
}
[data-theme=light]{
  color-scheme:light;
  --bg:#f4f4f4;--bg2:#ffffff;--bg3:#e2e2e2;      /* raised surfaces are white on a light grey ground — the reverse of dark;
                                                      the inset in the hairline's tone, as in the dark set */
  --border:#e3e3e3;--border2:#c9c9c9;
  --text:#111111;--text3:#3d3d3d;--text4:#6e6e6e;
  --scrollbar:#aaaaaa;
  --c-azure:#0b64c0;--c-blue:#1a5fd6;--c-sky:#0a7391;--c-teal:#0f766e;--c-green:#1f7a3a;--c-olive:#5a7a1e;--c-yellow:#8a6100;
  --c-sand:#7a6b2a;--c-orange:#aa4f1c;--c-amber:#a05a00;--c-red:#c8202c;--c-purple:#8b3f9e;--c-violet:#6d3fc9;
  --nav-bg:rgba(244,244,244,0.85);
}
/* meanings bound to hues — one hue, one meaning — resolved on the same element as the set they read, so a panel of the other
   set gets the other hues */
:root,[data-theme]{
  --accent:var(--text3);         /* the primary button's fill: not white (Qing, 2026-09-10: "too bright") */
  --link:var(--c-azure);         /* clickable text — VS Code Dark Modern textLink.foreground */
  --ok:var(--c-green);           /* live, done, active */
  --warn:var(--c-yellow);        /* pending, attention, in progress */
  --danger:var(--c-red);         /* error, blocked, destructive */
  --chat:var(--c-sky);--voice:var(--c-teal);--phone:var(--c-orange);--sms:var(--c-violet);   /* the channels */
  --series-1:var(--c-blue);--series-2:var(--c-teal);--series-3:var(--c-orange);--series-4:var(--c-purple);
  --series-5:var(--c-green);--series-6:var(--c-yellow);                                       /* chart series, in order */
  --f:'Helvetica Neue',Helvetica,Arial,sans-serif;
  --scrim:rgba(0,0,0,.65);              /* the ground behind a sheet or a dialog — black at an opacity in both sets */
  --shadow:0 8px 24px rgba(0,0,0,.18);  /* a pop-up's shadow: the menus, the mark's bubble — one shadow, black in both sets */
}

/* color-scheme makes the browser render its own widgets (select popups,
   scrollbars, pickers) dark. Dialogs like confirm()/alert() are browser
   chrome and can never be themed — use askConfirm()/askNotice() from
   admin-shared.js instead. */
html{background:var(--bg);color:var(--text);font-family:var(--f);-webkit-font-smoothing:antialiased;letter-spacing:-0.01em}   /* color-scheme comes with the set */
input,select,textarea,button{letter-spacing:inherit} /* browsers reset letter-spacing on form controls; they take the root rule like everything else (William, 2026-09-08) */
body{background:var(--bg);color:var(--text);min-height:100vh}
/* ── A panel: one box, one name. Every panel of the doors — a stat card, a chart, a documentation panel — is this box
   with this name, defined here once (house rule 21; Qing, 2026-09-15: "the design, font, color, layout should be
   always global definition"). control.css may space them (a chart's margin, a card's tighter name) and never restyle
   them. What a panel holds, in order, is DESIGN.md "A panel's anatomy". ── */
.card,.chart,.doc .panel{background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:18px 20px}
.card .k,.chart .k{font-size:12px;font-weight:600;color:var(--text);text-transform:uppercase;letter-spacing:.08em}

/* Text links — one look on every admin page: the link colour, never an underline; on hover only the colour changes,
   lighter, derived from the link hue. Navigation, tabs, buttons, menus and row links are components with their own
   rules, never plain links (DESIGN.md, "Text links"). */
a{color:var(--link);text-decoration:none}
a:hover{color:color-mix(in srgb, var(--link) 65%, var(--text))}

/* Controls — one size for every button, field and select on the admin pages (DESIGN.md, "Controls"): 36 px tall, 13 px
   type, 9 px radius, the same border. One declared variant only: a touch action on a sheet (.sheet .acts .pbtn) is 44px. A row action in a table is
   the same 36px button (Qing, 2026-09-12: a smaller Restore beside a full-size Save read as an error, twice). */
.pbtn{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;height:36px;min-width:92px;padding:0 16px;font:600 13px var(--f);border-radius:9px;cursor:pointer;border:1px solid var(--border2);background:none;color:var(--text3);text-decoration:none;white-space:nowrap}   /* one width floor, so a column of Save · Copy · Remove · Add lines up on both edges (Qing, 2026-09-12); a longer label widens its button */
.pbtn:hover{color:var(--text)}
.pbtn.primary{background:var(--accent);color:var(--bg);border-color:var(--accent)}
.pbtn.primary:hover{opacity:.85;color:var(--bg)}
.pbtn.danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}
.pbtn.danger:hover{border-color:var(--danger)}   /* every button answers a hover with one change: the ghost its text, the primary its shade, the destructive its border (Qing, 2026-09-17) */
.sheet .acts .pbtn{height:44px;padding:0 20px;font-size:14px}
input:where(:not([type]),[type=text],[type=number],[type=url],[type=email],[type=tel],[type=password],[type=search],[type=time],[type=date]),select,textarea{box-sizing:border-box;font:400 13px var(--f);color:var(--text);background:var(--bg);border:1px solid var(--border2);border-radius:9px}
input:where(:not([type]),[type=text],[type=number],[type=url],[type=email],[type=tel],[type=password],[type=search],[type=time],[type=date]),select{height:36px;padding:0 12px}
select{appearance:none;-webkit-appearance:none;padding-right:28px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5'%3E%3Cpath d='M1 1l3 3 3-3' fill='none' stroke='%23888888' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}
select{width:150px}   /* one width for every select on a page, in a table and in a row alike (Qing, 2026-09-16): the longest option on the doors measures 107px of text ("The website's font"; the widest audit action name 97px), plus 12px padding and 28px for the arrow = 147. An option longer than that is cut, so options stay short. */
textarea{padding:8px 12px;line-height:1.5;min-height:72px;resize:none}   /* no grip (Qing, 2026-09-12); a long text scrolls inside, with a visible bar */
input[type=color]{box-sizing:border-box;width:48px;height:36px;padding:3px;border:1px solid var(--border2);border-radius:9px;background:var(--bg)}
input[type=file]{box-sizing:border-box;height:36px;padding:6px 12px;font:400 13px var(--f);color:var(--text3);background:var(--bg);border:1px solid var(--border2);border-radius:9px}
:where(input,select,textarea):focus{outline:none;border-color:var(--text4)}
:where(input,select,textarea):disabled{color:var(--text4);border-style:dashed;cursor:not-allowed}

/* Scrollbars are visible wherever something scrolls, in both sets (Qing, 2026-09-12: the bar could not be seen on the light
   ground, and earlier attempts removed bars instead of showing them): thin, the set's --scrollbar on no track, drawn as long
   as there is overflow — the standard properties where the browser has them, the WebKit pseudo-elements elsewhere. The rail
   is the one exception and hides its own (control.css). Never hide a bar to solve its visibility. */
*{scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}   /* on every element: scrollbar-width does not inherit */
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--scrollbar);border-radius:5px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-track{background:transparent}
.sheet .acts select{height:44px;font-size:14px}

/* body > nav only: pages may contain nested <nav> elements (e.g. the
   chatbot section rail) that must not inherit the fixed header styling. */
body > nav{position:fixed;top:0;left:0;width:100%;z-index:1000;background:var(--nav-bg);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--border)}
.nav-in{max-width:none;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 24px;height:56px}
.logo{font-family:Helvetica,Arial,sans-serif;font-weight:bold;font-size:22px;color:var(--text);text-decoration:none;display:flex;align-items:center;gap:6px}
.logo svg{height:32px;width:auto;display:block}
.logo:hover{color:var(--text)}   /* the logo is drawn in the current colour and is not a text link: the base a:hover (2026-09-10) must not tint it (Qing, 2026-09-11) */
.admin-tabs{display:flex;gap:4px;margin:0 auto 0 28px}
.admin-tabs a{font-size:14px;font-weight:600;color:var(--text3);text-decoration:none;padding:6px 14px;border-radius:8px}
.admin-tabs a:hover{color:var(--text)}
.admin-tabs a.active{background:var(--bg2);color:var(--text)}
.nav-right{display:flex;align-items:center;gap:12px}
.nav-email{font-size:13px;color:var(--text4)}
.btn-ghost{background:none;border:1px solid var(--border);cursor:pointer;color:var(--text3);font-size:13px;font-family:var(--f);padding:0 12px;border-radius:8px;height:32px;transition:background 0.2s,color 0.2s;white-space:nowrap}
.btn-ghost:hover{background:var(--border);color:var(--text)}
/* The account control (2026-09-09): a 32px circle with a user glyph at the nav's right; its menu holds the person's
   e-mail and the way out, plus the room's links. The public site's nav carries the same rules inline. */
.acct{position:relative}
.acct-btn{width:32px;height:32px;border-radius:50%;border:1px solid var(--border2);background:var(--bg2);color:var(--text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:border-color .2s}
.acct-btn:hover{border-color:var(--text3)}
/* the door's pop-up menus — the account menu, the Tenants list under its tab, the tenant switcher in the side column — one look
   (Qing, 2026-09-11: "make it consistent", "too big"): a raised surface (--bg2), as wide as its names need, 13px items, the
   hovered item sinks to the ground colour. The look lives here; a page's rule places its menu and nothing more. */
.acct-menu,.tab-menu .menu,details.switch .menu{position:absolute;min-width:160px;background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:4px;box-shadow:var(--shadow);z-index:1200}
.acct-menu,.tab-menu .menu{display:none}
.acct-menu{top:40px;right:0;min-width:230px}   /* room for the address */
.acct-menu.open{display:block}
.acct-who{padding:8px 8px 10px;border-bottom:1px solid var(--border);margin-bottom:4px}
.acct-who span{font:13px var(--f);color:var(--text3);word-break:break-all}
/* Appearance (decision 2026-09-12): the icon button beside the account circle — the same circle, one menu look — shows the
   choice in force; before the head script has run, System */
.theme-btn svg{display:none}
html:not([data-theme-choice]) .theme-btn .i-system,html[data-theme-choice=system] .theme-btn .i-system,html[data-theme-choice=light] .theme-btn .i-light,html[data-theme-choice=dark] .theme-btn .i-dark{display:block}
.theme .acct-menu{min-width:150px}
.acct-menu button.active{background:var(--bg);color:var(--text)}
.acct-menu a,.acct-menu button,.tab-menu .menu a,details.switch .menu a{display:block;width:100%;text-align:left;padding:7px 10px;font:500 13px var(--f);color:var(--text3);text-decoration:none;border-radius:7px;background:none;border:0;cursor:pointer}
.acct-menu a:hover,.acct-menu button:hover,.tab-menu .menu a:hover,details.switch .menu a:hover{background:var(--bg);color:var(--text)}
/* the Tenants tab opens on hover: every tenant by name; the tab itself is the overview (Qing, 2026-09-11) */
.tab-menu{position:relative;display:flex}   /* the link is a flex item like its sibling tabs, not an inline box sitting high */
.tab-menu .menu{top:calc(100% + 6px);left:0}
.tab-menu .menu::before{content:"";position:absolute;left:0;right:0;top:-8px;height:8px}   /* the pointer's bridge from the tab */
.tab-menu:hover .menu,.tab-menu:focus-within .menu{display:block}
.tab-menu .menu a.active,.acct-menu a.active{color:var(--text)}


/* ═══ The components of the doors — every panel's parts, declared once (2026-09-15, lifted out of control.css, where they
   had been page rules since the file began as one page's <style>). control.css places and spaces them; a page never
   restyles them (house rule 21). What a panel holds, and in what order, is DESIGN.md "A panel's anatomy". ═══ */

/* The page name — the one headline; a tenant page's is the tenant's own (h1.tenant, control.css) */
h1{font-size:clamp(28px,4vw,44px);font-weight:700;letter-spacing:-0.03em;line-height:1.1;margin-bottom:40px}

/* Figures — a row of stat cards: the value, its second line, and the colours of a figure near its cap */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:28px}
.card .v{font-size:28px;font-weight:800;font-variant-numeric:tabular-nums}
.card .s{font-size:13px;color:var(--text4);margin-top:2px}
.card .s.warn{color:var(--warn)}.card .s.bad{color:var(--danger)}
.card .v.words{font-size:18px}   /* a value that is words — a time, a name — not a figure */   /* a capped figure near or at its cap (DESIGN.md, "Figures") */

/* The hint — the one note beside a field (a format, a limit), 13px muted; never a paragraph under a name. .mcost is the
   second line under a value — a price, a rate. Both stay at a measure a reader can follow. */
.hint{font-size:13px;color:var(--text4);margin-bottom:14px}
.hint.status{color:var(--text3)}   /* what an action produced — the reader's sentence, a count, an upload's notice — reads in the table's text (three pages had three colours) */
.mcost{font-size:12px;color:var(--text4);margin-top:5px}
.hint,.mcost{max-width:900px}
.page-src{font-size:12px;color:var(--text4);margin:0 0 14px}.page-src:empty{display:none}

/* Tables — a list reads at 14px; the header row 11px uppercase muted; a cell is the table's text (--text3), figures tabular */
table{width:100%;border-collapse:collapse;font-size:14px}
th,.facts dt{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--text4)}   /* a column's or a fact's label */
th{text-align:left;padding:10px 12px;border-bottom:1px solid var(--border)}
td{padding:11px 12px;border-bottom:1px solid var(--border);color:var(--text3);font-variant-numeric:tabular-nums}
tbody tr{cursor:default}
.chart table{font-size:13px}   /* a table inside a panel reads at the size of the fields beside it; a list page's table keeps 14px (14 panel tables said so inline, 10 did not) */
.sub{color:var(--text4)}   /* secondary: a cell or a part of a value that is context — a hash, an author, a timestamp, a kind, "of 100" beside a figure — or a panel with nothing live in it */
.aside{font-size:12px;color:var(--text4);margin-left:10px}   /* a value's aside on its own line: since when, the release's hash, the running figure */
.nowrap{white-space:nowrap}   /* a timestamp or a size never breaks */
.clip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
td.label{width:220px}   /* the label column of a panel's table (seven tables said 220 inline, two 180) */
td.label.top{vertical-align:top;padding-top:14px}   /* beside a value that runs to several lines */   /* a long value in a narrow column ends in an ellipsis; the column's width is the page's */
/* Bare tables sit next to cards (1px border + 20px padding = 21px inset): match their edges */
section>table th:first-child,section>table td:first-child{padding-left:21px}
section>table th:last-child,section>table td:last-child{padding-right:21px}
/* A table inside a card spans the card's text width: its first column starts where the card's name starts, its last column —
   a value, a field, a row action — ends where the Save button ends (Qing, 2026-09-12: Restore stood 12px short of Save, the
   labels 12px right of the title). The cells' own 12px stay between columns. */
.chart table th:first-child,.chart table td:first-child{padding-left:0}
.chart table th:last-child,.chart table td:last-child{padding-right:0}
td.acts{white-space:nowrap;text-align:right;padding-top:6px;padding-bottom:6px}   /* the 36px button in a 48px row: the cell gives, not the button */
td.acts .pbtn{margin-left:6px}
.empty{color:var(--text4);padding:32px 12px;text-align:center}
/* A table of files — the Media page: what the file is for, the file the website serves, and the upload that
   replaces it. The picker's width is the browser's own otherwise, and Safari's is not Chrome's, so the row says what
   it is: a file picker is not a select (Qing, 2026-09-16) — it takes the room the button leaves and shows as much of
   the file's name as it can, and the button is one box, so the row ends where the panel's fields end. */
table.files{table-layout:fixed}
table.files th:first-child,table.files td:first-child{width:30%}
table.files th:nth-child(2),table.files td:nth-child(2){width:26%}
table.files .msel{flex:1 1 0;min-width:140px;width:auto}
table.files .pbtn{flex:0 0 auto;min-width:150px}
/* Every row has its own status line — the waiting text and the message that replaces it — under the row it belongs
   to and across the whole table, so a long sentence reads in three lines rather than down one column. The line
   under a row is the note row's, and until it has something to say it takes no room at all. */
table.files tbody tr:not(.note) td{border-bottom:0}
table.files tr.note td{padding:0}
table.files tr.note .src{display:block;padding:0 0 11px}
table.files tr.note .src:empty{display:none}

/* Checkboxes — drawn, not the browser's (DESIGN.md, Components) */
input[type="checkbox"]{appearance:none;-webkit-appearance:none;width:17px;height:17px;border:1px solid var(--border2);border-radius:5px;background:var(--bg);cursor:pointer;vertical-align:middle}
label input[type="checkbox"]{margin:0 8px 0 0}   /* a box keeps its distance from its word */
.opt{font-size:13px;color:var(--text3)}   /* a word beside its box — a checkbox or a radio with its label — in the table's text */
input[type="checkbox"]:checked{border-color:var(--accent);background:var(--accent) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8.5 6.5 12 13 4.5' fill='none' stroke='%230a0a0a' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/11px no-repeat}   /* filled like the primary button: --accent, the tick in the ground's colour (Qing, 2026-09-12: --text was too white, too black) */
[data-theme=light] input[type="checkbox"]:checked{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8.5 6.5 12 13 4.5' fill='none' stroke='%23f4f4f4' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}   /* the tick in the light ground's colour */

/* Pills — a state or a channel: one hue, one meaning; the tint is the hue at 35–40% (DESIGN.md, Colour) */
.pill{display:inline-block;font-size:11px;font-weight:700;padding:2px 9px;border-radius:99px;border:1px solid var(--border2)}
.pill.voice{color:var(--voice);border-color:color-mix(in srgb, var(--voice) 35%, transparent)}
.pill.text{color:var(--chat);border-color:color-mix(in srgb, var(--chat) 35%, transparent)}
.pill.phone{color:var(--phone);border-color:color-mix(in srgb, var(--phone) 35%, transparent)}
.pill.sms{color:var(--sms);border-color:color-mix(in srgb, var(--sms) 35%, transparent)}
.pill.ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 35%, transparent)}.pill.warn{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 40%, transparent)}.pill.bad{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}

/* Action rows — the Save row at the end of a form (.prow: status left in .src, buttons right), the add row at the top of a
   card (.addrow: fields then button), and the button's marks: unsaved, the one being shown, the square arrow */
.prow{display:flex;align-items:center;gap:12px}
.src{font-size:12px;color:var(--text4)}   /* the status text a script writes: in the Save row, under the room */
.prow .src{margin-right:auto}
.addrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.addrow .greet-in,.addrow input:where([type=text],[type=email],[type=url],[type=number],:not([type])){flex:1 1 200px;width:auto;margin:0}   /* an add row: fields then the button, one line */
.pbtn.dirty::after{content:" •"}   /* one meaning: this form has changes that are not saved. It stood on a day
   that had its own rule and on the letter being shown as well, so the same mark said three things
   (Qing, 2026-09-14: "why a dot in the end of the button of this day?") — those say it themselves now. */
.pbtn[aria-current]{border-color:var(--text);color:var(--text)}   /* the one of a row that is being shown */
a.pbtn{text-decoration:none}   /* a link button keeps .pbtn's flex centring — inline-block sat the glyph at the top */
form.inline{display:inline}
/* a square arrow button: the one control height on both sides, the glyph large enough to be seen */
.pbtn.sq{width:36px;min-width:0;padding:0}
/* A chevron drawn, not typed. ‹ and › are quotation marks: 3.5 × 8.4 px of ink in a 36 px button, sitting
   high on the baseline, so they read as small and off-centre however the box is aligned (Qing, 2026-09-14:
   "the arrows look strange and not in the middle … both horizontally and vertically"). A viewBox centres
   itself, on every platform and in every font. */
.pbtn.sq svg{width:18px;height:18px;display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.swatch{display:inline-block;width:18px;height:18px;border-radius:5px;border:1px solid var(--border2);vertical-align:middle;margin-right:6px}
.error{border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);color:var(--danger);border-radius:12px;padding:12px 14px;margin:0 0 16px}

/* A code box — the embed line, a diff: an inset in the ground colour, monospace 12.5px; a diff wraps its lines, a line of code scrolls */
.code,.diff{background:var(--bg);border:1px solid var(--border2);border-radius:10px;padding:12px 14px;font:12.5px/1.5 ui-monospace,Menlo,monospace;color:var(--text3);overflow-x:auto}
.diff{white-space:pre-wrap}
.diff .add{color:var(--ok)}.diff .del{color:var(--danger)}

/* ── The distances (2026-09-15, replacing 40 margins set inline, six different ones on the Save row alone). A panel's rhythm
   is 14px: name to body, body to Save row, a row of fields to the next thing. Panels stand 24px apart (control.css
   .chart{margin-bottom}), and nothing sets a top margin to meet them. ── */
.chart .prow,.sheet-b .prow{margin-top:14px}                       /* the Save row after a table, fields or a text box */
.prompt-ta{margin-bottom:0}                                        /* the box above a Save row leaves the distance to the row */
table + .addrow,.addrow + table,.addrow + .hint.status,table + .hint.status{margin-top:14px}   /* an add row and its list; a status line under either */
.addrow + .addrow{margin-top:8px}                                  /* stacked rows: a list of origins, then the add row */
.chart .daynav{margin-bottom:12px}                                 /* a day's navigation inside a panel */
.addrow .fill,.addrow .code{flex:1 1 200px;min-width:0}            /* the part of a row that takes the width left */
.right{margin-left:auto}                                           /* the one thing pushed to a row's end */
:is(.addrow,.acts,.frow,.daynav) .hint{margin:0}                   /* a hint inside a row is one of its items */
.opt + .opt{margin-left:16px}input[type=color] + .opt{margin-left:10px}   /* words beside their boxes, in a row */

/* Bars — the usage chart: a column per day, the figure on hover */
.bars{display:flex;align-items:flex-end;gap:3px;height:90px}
.bar{flex:1;background:var(--text4);border-radius:2px 2px 0 0;min-height:2px;position:relative}
.bar:hover{background:var(--text)}
.bar .tip{display:none;position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--text);color:var(--bg);font-size:11px;padding:2px 7px;border-radius:5px;white-space:nowrap;margin-bottom:4px}
.bar:hover .tip{display:block}

/* The mark — a panel explains itself when asked (2026-09-14/15) */
/* A panel explains itself when asked, not in a paragraph nobody reads (Qing, 2026-09-14). The mark sits beside
   the name it belongs to; hover, keyboard focus or a tap opens the bubble.
   It rides that name's cap height, and the offset is in em against the NAME — which is why the mark takes
   font-size:inherit: em on the mark would otherwise resolve against its own 10px and move it a seventh of
   what was meant. Measured from the rendered baseline: a 12px panel name wants .308em, a page name .175em
   the other way (its cap is taller than the mark). Both hold at any size those names take. */
.ask{appearance:none;-webkit-appearance:none;position:relative;display:inline-block;margin-left:7px;width:16px;height:16px;padding:0;border:1px solid var(--border2);border-radius:50%;background:none;color:var(--text4);font:600 10px/1 var(--f);font-size:inherit;cursor:help;vertical-align:middle;top:-.1em}
.ask:hover,.ask:focus-visible,.ask.on{color:var(--text);border-color:var(--text4);outline:none}
/* the mark itself is drawn too: a typed ? is centred in Chrome and not in Safari, because the offset is
   the font's, not the box's (Qing, 2026-09-14: "again not in the middle"). A viewBox has no such argument. */
button.ask svg{position:absolute;left:1px;top:1px;width:12px;height:12px;display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ask [role=tooltip]{position:absolute;left:-8px;top:24px;z-index:40;display:none;width:min(360px,80vw);max-height:min(60vh,440px);overflow:auto;padding:12px 14px;border:1px solid var(--border2);border-radius:10px;background:var(--bg2);color:var(--text3);font:400 12px/1.55 var(--f);letter-spacing:-0.01em;text-align:left;text-transform:none;font-weight:400;box-shadow:var(--shadow)}
.ask [role=tooltip] b{display:block;color:var(--text);margin-bottom:5px}
h1 .ask{margin-left:12px}
/* a page name is clamp(28px,4vw,44px), so the mark rides it in em: measured at the plain baseline its middle
   sat 34.0px down a 48.4px line, and the cap height's middle — where a mark belongs beside a word — is at
   26.3px. 7.7px of a 44px name is .175em, and it holds at every size the clamp gives. */
.ask [role=tooltip] ul{margin:6px 0 0;padding-left:16px}
.ask [role=tooltip] li{margin-bottom:6px}
.ask [role=tooltip] p{margin:8px 0 0}
.ask:hover [role=tooltip],.ask:focus-visible [role=tooltip],.ask.on [role=tooltip]{display:block}
@media(max-width:700px){.ask [role=tooltip]{width:min(320px,72vw)}}

/* Sheets and dialogs — one scrim (--scrim) under a sheet (a booking, a note, the floor plan editor) and under the themed
   confirm/notice dialog control.js injects (.cf-*; the browser's confirm() can never be themed). The dialog stands above a sheet. */
.overlay,.cf-overlay{position:fixed;inset:0;background:var(--scrim);display:none;align-items:center;justify-content:center;padding:24px;z-index:2000}
.cf-overlay{z-index:3000}
.overlay.show,.cf-overlay.show{display:flex}
.sheet{background:var(--bg2);border:1px solid var(--border2);border-radius:14px;max-width:640px;width:100%;max-height:80vh;display:flex;flex-direction:column}
.sheet-h{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border)}
.sheet-h .t{font-weight:700}
.sheet-h button,.sheet-h .close{background:none;border:none;color:var(--text4);font-size:20px;cursor:pointer;text-decoration:none}
.sheet-b{padding:18px 20px;overflow-y:auto}
.sheet .acts{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.sheet .acts form{display:inline-flex;gap:8px;align-items:center}
.cf-box{background:var(--bg2);border:1px solid var(--border2);border-radius:14px;max-width:440px;width:100%;padding:20px}
.cf-msg{font-size:14px;line-height:1.6;color:var(--text3);white-space:pre-wrap;margin-bottom:18px}
.cf-row{display:flex;justify-content:flex-end;gap:10px}
.cf-btn{font:600 13px var(--f);padding:9px 18px;border-radius:9px;cursor:pointer;border:1px solid var(--border2);background:none;color:var(--text3)}
.cf-btn:hover{color:var(--text)}
.cf-btn.primary{background:var(--accent);color:var(--bg);border-color:var(--accent)}
.cf-btn.primary:hover{opacity:.85}
