/* ==========================================================================
   f27 - the filter control, and four spacing faults it sat next to.
   Loaded last, so it settles the arguments the earlier sheets were having.
   ========================================================================== */

/* --- 1. the deck list had no gap at all -----------------------------------
   `.deck-list{display:grid;gap:10px}` was written, but every row is inside
   #dbody, which is .deck-list's ONLY child - so the gap was between one item
   and nothing. The cards sat border to border and read as one slab. */
#dbody{display:grid;gap:10px}

/* --- 2. the filter control ------------------------------------------------ */
/* The menu opened UNDER the first card. A dropdown is the one thing on these
   screens that has to paint over its neighbours, and the rows that follow it
   in the document were winning by document order. The bar it sits in is given
   a stacking context of its own, above the list; the menu then only has to
   beat what is inside that bar. */
.deck-toolbar,.client-toolbar,.f26-topline{position:relative;z-index:80}
.f26-activity-list{position:relative;z-index:1}
.deck-list,.client-list,.f26-news-feed{position:relative;z-index:1}
/* The Activity bar keeps its count on the right; the menu lives on the left. */
.f26-topline{justify-content:space-between}
.f26-topline>.pf{margin-right:auto}
.pf{position:relative;display:inline-block;z-index:2}
.pf-btn{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:8px 13px;
  border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink-2);
  font-size:12.5px;font-weight:500;cursor:pointer;white-space:nowrap}
.pf-btn:hover{border-color:var(--line-2);color:var(--ink)}
.pf-btn.is-on{border-color:var(--sig);color:var(--sig);background:var(--sig-bg);font-weight:600}
.pf-btn[aria-expanded="true"]{border-color:var(--sig);color:var(--sig)}
.pf-btn .pf-caret{margin-left:2px;opacity:.65;transition:transform .16s ease}
.pf-btn[aria-expanded="true"] .pf-caret{transform:rotate(180deg)}
.pf-count{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;
  border-radius:9px;background:var(--sig);color:var(--paper);font-size:10.5px;font-style:normal;
  font-weight:700;line-height:1}

/* Sized to its contents, because a property filter lists addresses and a
   deck filter lists two words. Capped, so one long address cannot drag the
   menu across the page. */
.pf-menu{position:absolute;z-index:40;top:calc(100% + 6px);left:0;
  width:max-content;min-width:248px;max-width:min(92vw,360px);
  border:1px solid var(--line-2);border-radius:11px;background:var(--card);
  box-shadow:0 14px 34px rgba(20,32,26,.13);padding:8px 6px 6px;display:grid;gap:2px}
.pf-menu[hidden]{display:none}
/* Thirteen client types is a real list, and a menu as tall as the page is not
   a menu. Each group scrolls on its own so the Clear/Done row stays put. */
.pf-group{max-height:252px;overflow:auto;overscroll-behavior:contain}
.pf-group::-webkit-scrollbar{width:8px}
.pf-group::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:4px}
.pf-group + .pf-group{margin-top:4px;padding-top:6px;border-top:1px solid var(--line)}
.pf-group-h{padding:6px 9px 4px;font-size:10px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-3)}
.pf-opt{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:7px;
  font-size:13px;color:var(--ink);cursor:pointer}
.pf-opt:hover{background:var(--card-2)}
.pf-opt input{flex:none;width:15px;height:15px;margin:0;accent-color:var(--sig);cursor:pointer}
.pf-opt span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pf-opt em{font-style:normal;font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.pf-opt.is-empty{opacity:.42;cursor:default}
.pf-opt.is-empty:hover{background:none}
.pf-foot{display:flex;justify-content:space-between;gap:8px;margin-top:4px;padding:6px 3px 2px;
  border-top:1px solid var(--line)}
.pf-foot button{padding:6px 11px;border:0;border-radius:7px;background:none;color:var(--ink-3);
  font-size:12px;cursor:pointer}
.pf-foot button:hover:not(:disabled){color:var(--ink);background:var(--card-2)}
.pf-foot button:disabled{opacity:.4;cursor:default}
.pf-foot .pf-done{color:var(--sig);font-weight:600}

/* The clients bar had the search alone on the right; it now holds a pair. */
.client-toolbar{justify-content:space-between}
@media (max-width:760px){
  .pf,.pf-btn{width:100%}
  .pf-btn{justify-content:flex-start}
  .pf-menu{left:0;right:0;min-width:0}
  .client-toolbar{flex-direction:column;align-items:stretch;gap:10px}
}

/* --- 3. the news card was 164px tall for three lines of text --------------
   A 76px logo tile set the height and the padding added to it, so a feed of
   short items scrolled like a feed of long ones. The tile is the thing that
   shrinks: it is an identifier, not an illustration. */
.f26-news-card{grid-template-columns:44px minmax(0,1fr);gap:13px;padding:11px 13px;border-radius:10px}
.f26-news-visual{width:44px;height:44px;border-radius:7px;align-self:start;margin-top:1px}
.f26-news-visual .f26-publisher{font-size:11.5px}
.f26-news-visual .f26-publisher.has-mark{padding:5px}
.f26-news-body{gap:3px}
.f26-news-card .f26-news-source{font-size:11px}
.f26-news-card .f26-news-title{font-size:14.5px;line-height:1.3;margin:1px 0 0}
.f26-news-card p{font-size:12px;line-height:1.45;max-width:86ch}
.f26-news-foot{margin-top:5px;gap:7px}
.f26-news-foot .ghost{min-height:0;padding:5px 10px;font-size:11.5px;border-radius:7px}
.f26-news-day-items{gap:8px}

/* --- 4. the Walkthrough search bar painted over its own placeholder -------
   `html[data-theme="light"] input{background:…!important}` is a blanket rule
   and outranks `.tour-library-bar input{background:transparent!important}`,
   so the field that was meant to be invisible got a filled slab with no left
   padding and the words sat against its edge. The field moves to the label,
   where the icon lives, and the input is put back to nothing - with enough
   specificity to mean it this time. */
html .tour-library-bar>label:first-child{display:flex;align-items:center;gap:9px;width:340px;
  max-width:100%;height:40px;padding:0 12px;border:1px solid var(--line);border-radius:9px;
  background:var(--card)}
html .tour-library-bar>label:first-child:focus-within{border-color:var(--sig)}
html .tour-library-bar>label:first-child .plinth-icon{width:15px;height:15px;color:var(--ink-3);flex:none}
html .tour-library-bar>label:first-child input{flex:1;min-width:0;height:100%;font-size:13px;
  background:transparent!important;border:0!important;box-shadow:none!important;padding:0!important}
@media (max-width:760px){html .tour-library-bar>label:first-child{width:100%}}

/* ==========================================================================
   f27c - cards that actually have an edge.
   The page is #EAE9E3 and a card border was #D6D4CB: about 8% apart, which is
   below what most screens and most eyes separate reliably. The cards were
   there, they just did not read as objects sitting ON something.
   Three things, together, because no one of them is enough:
     border   - one shared, stronger edge instead of three different weak ones
     lift     - a short shadow, so the card is above the page rather than in it
     glint    - a 1px highlight on the top inside edge, the way a real raised
                surface catches light. It is what makes an edge look deliberate
                rather than drawn.
   Stated as tokens so every surface uses the same edge, and so the dark
   themes can flip the glint without restating the rest.
   ========================================================================== */
:root{
  --card-edge:color-mix(in srgb, var(--ink) 28%, transparent);
  --card-edge-strong:color-mix(in srgb, var(--ink) 42%, transparent);
  --card-glint:inset 0 1px 0 rgba(255,255,255,.07);
  --card-lift:0 1px 1px rgba(16,22,19,.05), 0 3px 8px -4px rgba(16,22,19,.16);
  --card-lift-hover:0 2px 3px rgba(16,22,19,.06), 0 10px 22px -10px rgba(16,22,19,.26);
}
/* A light surface catches light on its top edge; a dark one barely does. */
html[data-theme="light"],html[data-theme="nature-light"]{
  --card-glint:inset 0 1px 0 rgba(255,255,255,.85);
}

:is(.deck-row,.client-row,.f26-activity,.f26-news-card,.f26-panel,.f26-deck,
    .sent-row,.f26-shared-group,.pf-menu,.deck14-modal-card){
  border:1px solid var(--card-edge)!important;
  box-shadow:var(--card-glint), var(--card-lift);
}
:is(.deck-row,.client-row,.f26-activity,.f26-news-card,.f26-deck,.sent-row){
  transition:border-color .16s ease, box-shadow .16s ease, background .16s ease;
}
:is(.deck-row,.client-row,.f26-activity,.f26-news-card,.f26-deck,.sent-row):hover{
  border-color:var(--card-edge-strong)!important;
  box-shadow:var(--card-glint), var(--card-lift-hover);
}
/* The menu is already lifted off the page by its own drop shadow; it only
   wants the edge and the glint, not a second shadow underneath. */
.pf-menu{box-shadow:var(--card-glint), 0 14px 34px rgba(20,32,26,.16)!important}

/* Controls take the same edge so the page reads as one set of surfaces, but
   no lift - a button that floats like a card looks like a card. */
:is(.pf-btn,.deck-toolbar .search,.client-toolbar .search,.tbar .search){
  border-color:var(--card-edge)!important;
  box-shadow:var(--card-glint);
}
:is(.pf-btn,.deck-toolbar .search,.client-toolbar .search):hover,
:is(.deck-toolbar .search,.client-toolbar .search):focus-within{
  border-color:var(--card-edge-strong)!important;
}


/* ==========================================================================
   f27d
   ========================================================================== */

/* The list kept a full-width rule top and bottom from when it was a table.
   Now that the rows are cards, that rule runs straight into the first card's
   own border - two lines touching, one of them belonging to nothing. */
.deck-list,.client-list{border-top:0!important;border-bottom:0!important}

/* Secondary text was set light enough to disappear against a card. These are
   not decoration - they are the price, the date and what happened - so they
   go up to something readable while staying quieter than the heading. */
:root{--ink-3:color-mix(in srgb, var(--ink) 72%, transparent)}
.f26-muted,.deck-last,.client-meta,.tile-caption p,.f26-news-card p{
  color:color-mix(in srgb, var(--ink) 72%, transparent)}
.f26-news-card .f26-news-source span,.deck-sub{
  color:color-mix(in srgb, var(--ink) 66%, transparent)}

/* --- the Walkthrough ------------------------------------------------------ */
/* Same edge as everything else. The tour list was a table with hairlines that
   barely showed, so the rows read as text on a page rather than as rows. */
.tour-app{--card-edge:color-mix(in srgb, var(--ink) 28%, transparent);
  --card-edge-strong:color-mix(in srgb, var(--ink) 42%, transparent)}
.tour-table{border:1px solid var(--card-edge);border-radius:12px;overflow:hidden;
  box-shadow:var(--card-glint), var(--card-lift)}
.tour-table-head{border-bottom:1px solid var(--card-edge)}
.tour-library-row{border-top:1px solid var(--card-edge)}
.tour-library-row:first-of-type{border-top:0}
.tour-library-bar{border-top:0;border-bottom:1px solid var(--card-edge)}
html .tour-library-bar>label:first-child{border-color:var(--card-edge);
  box-shadow:var(--card-glint)}
html .tour-library-bar>label:first-child:focus-within{border-color:var(--card-edge-strong)}
.tour-library-bar .tour-button,.tour-pagination button,.tour-button,.tour-work-head .tour-button{
  border-color:var(--card-edge);box-shadow:var(--card-glint)}
.tour-button:hover{border-color:var(--card-edge-strong)}
.tour-app .tour-work-head span,.tour-app .tour-pagination{
  color:color-mix(in srgb, var(--ink) 66%, transparent)}

/* The property name sat in a white slab that started at the text and ran to
   the far side of the header: no space before the first letter, and a box
   three times wider than anything in it. It is a field now - padded, and
   only as wide as a long address needs. */
html .tour-work-head input{
  width:100%;max-width:26ch;padding:8px 13px!important;border-radius:10px;
  border:1px solid transparent!important;background:transparent!important;
  box-shadow:none;transition:border-color .16s ease, background .16s ease}
html .tour-work-head input:hover{border-color:var(--card-edge)!important}
html .tour-work-head input:focus{border-color:var(--card-edge-strong)!important;
  background:var(--card)!important;box-shadow:var(--card-glint);outline:none}
html .tour-work-head>div:first-of-type{flex:0 1 auto}
.tour-work-head span{padding-left:14px}

/* ==========================================================================
   f27e - fewer lines, less floating, bolder edges.
   ========================================================================== */

/* --- Research: the lines ---------------------------------------------------
   Four rules stacked down the page before any data appeared: the deck tabs,
   the section strip, the section heading, then the panel's own border. Each
   one was drawn by a different sheet and none of them knew about the others.
   Two survive - the deck tabs, and the section strip - because those separate
   navigation from content. The heading rule goes: a 24px heading with space
   around it already separates itself. */
.research-head-v5{border-bottom:0!important;padding:14px 1px 4px!important;margin-bottom:14px!important}
.research-head-v5 h2{font-size:22px}

/* The panel was a bordered card inside a bordered card inside the page. The
   card it sits in is enough; this is just its contents now. */
.research-main-v5>.data-panel-v5{border:0;background:transparent;padding:0;border-radius:0}
.research-main-v5>.data-panel-v5+.data-panel-v5{margin-top:22px}
.data-panel-title-v5 h3{font-size:11px;letter-spacing:.09em;text-transform:uppercase;
  color:color-mix(in srgb, var(--ink) 58%, transparent);font-weight:700}

/* THE RAGGED HAIRLINES. The rows are a two-column grid with a line on top of
   each cell, so with an odd number of rows the last line stopped halfway
   across and the column beside it had none. Nothing was wrong with the data;
   the lines just could not describe it.
   Bands instead: one tint per pair of cells, no rules at all. A band cannot
   be ragged, and it says "these two belong to the same row" - which is what
   the line was failing to say. */
.kv-v5{border-top:0!important;padding:11px 14px!important;border-radius:8px}
.kv-grid-v5{gap:0 10px}
.kv-grid-v5>.kv-v5:nth-child(4n+1),.kv-grid-v5>.kv-v5:nth-child(4n+2){
  background:color-mix(in srgb, var(--ink) 4.5%, transparent)}
.kv-v5 span{color:color-mix(in srgb, var(--ink) 62%, transparent)}
.kv-v5 b{font-size:13px}

/* Two chips looked chosen: the active one, and "Top selling points", which
   was tinted all the time. One of them is a filter; the other is a colour. */
.deck17-research-tabs button.sell{background:transparent;color:var(--ink-3)}
.deck17-research-tabs button.sell:hover{background:var(--card-2);color:var(--ink-2)}
.deck17-research-tabs button.sell[aria-current="true"]{background:var(--card);color:var(--ink);
  box-shadow:0 0 0 1px var(--card-edge)}
.deck17-research-tabs button[aria-current="true"]{box-shadow:0 0 0 1px var(--card-edge)}
.deck17-research-tabs{border-bottom-color:var(--card-edge)!important}

/* --- the deck workspace: a bolder edge ------------------------------------ */
:is(.deck17-shell,.deck16-builder-body,.deck16-side,.finance-inputs-v7,.radius-panel-v7,
    .slide-summary-v5,.research-nav-v5,.sent-list,.deck14-modal-card){
  border-color:var(--card-edge)!important}
.deck17-shell{border-width:1.5px!important;border-radius:14px;box-shadow:var(--card-glint), var(--card-lift)}
:is(.deck-row,.client-row,.f26-activity,.f26-news-card,.f26-panel,.f26-deck,
    .sent-row,.pf-menu,.tour-table,.library-card){border-width:1.5px!important}

/* --- the Walkthrough ------------------------------------------------------ */
/* The search bar's bottom rule sat directly on the table's top border: two
   lines, one gap of nothing between them. The bar keeps no rule of its own -
   the table under it has an edge already. */
.tour-library-bar{border-bottom:0!important;padding-bottom:14px}
.tour-table{margin-top:2px}

/* 1500px of workspace for two columns of content left everything drifting
   apart with the eye travelling between them. */
.tour-app{max-width:1200px}
.tour-main{padding:22px}
.tour-room-rail{padding:16px 0;border-right-color:var(--card-edge)}
.tour-room-list>button{padding:13px 18px;border-bottom-color:var(--card-edge)}
.tour-mode-nav{gap:22px;border-bottom-color:var(--card-edge)}
.tour-mode-nav button{padding:12px 0;font-size:12.5px}
.tour-work-head{padding-bottom:16px}
.tour-page-head{padding:34px 0 20px}

/* Secondary text in the tour was the lightest on the page. */
.tour-app{--muted-strong:color-mix(in srgb, var(--ink) 66%, transparent)}
.tour-app :is(.tour-room-list small,.tour-map-caption,.tour-kicker,
  .tour-table-head,.tour-pagination,.tour-engine-note,.tour-rail-head,.tour-empty p){
  color:var(--muted-strong)}
.tour-app .tour-table-head{color:var(--muted-strong);font-weight:700}

/* f27f - the tab underline sat directly on the workbench's own top border.
   One separator, not two: the tabs keep theirs, the workbench drops its top
   edge and gains a gap, so the panel hangs below the rule instead of doubling
   it. */
.tour-mode-nav{margin-bottom:0}
.tour-workbench{border-top:0!important;margin-top:16px;border-radius:0 0 12px 12px}
.tour-workbench{border:1px solid var(--card-edge);border-top:0!important;
  box-shadow:var(--card-lift)}
.tour-room-rail{border-radius:0 0 0 11px}

/* f27g - the customer deck's panels are styled by a <style> that
   customer-deck.js injects at RUN TIME, so those rules land after this
   stylesheet however the page is ordered, and an !important here loses the
   tie on document order alone. Every selector below therefore carries an
   `html body` prefix: same declaration, higher specificity, no longer a
   question of who was parsed last. */
html body :is(.setup-card,.recommend-card,.editor,.plate,.preview-panel,.dropzone,
    .notice,.future,.review-toolbar,.published-url,.draft-select,.redesigner-entry,
    .deck16-builder-body,.deck16-side,.deck17-shell){
  border-color:var(--card-edge)!important}
html body :is(.setup-card,.recommend-card,.editor,.plate,.preview-panel,
    .deck16-builder-body,.deck16-side){
  border-width:1.5px!important;box-shadow:var(--card-glint), var(--card-lift)!important}
html body .deck17-shell{border-width:1.5px!important}

/* ==========================================================================
   f27h - checkboxes you can actually see.
   Every one in the app was a native control: the browser draws it, and the
   only things CSS can change are its size and its FILL. The unchecked box is
   whatever hairline the platform feels like, which here was lighter than the
   card it sat on - so an empty checkbox read as a smudge, and on some rows
   the box got squeezed out of square by the flex parent around it.
   Drawn from scratch instead: fixed square, the same edge as every card, and
   a mark that is part of the control rather than a glyph sitting near it.
   `flex:none` and the min sizes are the anti-squash - a native checkbox has
   no intrinsic size a flex parent must respect.
   Every selector is prefixed `html body`, because the themes carry a blanket
   `html[data-theme="light"] input{background:...!important}` that outranks a
   plain `input[type=checkbox]` rule and was repainting these flat grey.
   ========================================================================== */
html body input[type=checkbox],html body input[type=radio]{
  appearance:none!important;-webkit-appearance:none!important;
  flex:none!important;display:inline-grid!important;place-content:center!important;
  width:17px!important;height:17px!important;min-width:17px!important;min-height:17px!important;max-width:17px!important;max-height:17px!important;
  padding:0!important;margin:0!important;vertical-align:middle!important;position:relative!important;cursor:pointer!important;
  border:1.5px solid var(--card-edge-strong,rgba(0,0,0,.42))!important;border-radius:5px!important;
  background:var(--card,#fff)!important;box-shadow:var(--card-glint,none)!important;
  transition:background .12s ease,border-color .12s ease}
html body input[type=radio]{border-radius:50%!important}
html body input[type=checkbox]:hover:not(:disabled),html body input[type=radio]:hover:not(:disabled){
  border-color:var(--sig,#2f5d46)!important}
html body input[type=checkbox]:focus-visible,html body input[type=radio]:focus-visible{
  outline:2px solid var(--sig,#2f5d46);outline-offset:2px}
html body input[type=checkbox]:disabled,html body input[type=radio]:disabled{opacity:.42;cursor:default!important}

html body input[type=checkbox]::before{
  content:'';width:11px!important;height:11px!important;transform:scale(0);transition:transform .13s ease;
  background:var(--tick,#fff)!important;
  clip-path:polygon(14% 46%,2% 60%,39% 96%,100% 20%,87% 7%,39% 68%)}
html body input[type=checkbox]:checked::before{transform:scale(1)}
html body input[type=radio]::before{
  content:'';width:7px!important;height:7px!important;border-radius:50%!important;background:var(--tick,#fff)!important;
  transform:scale(0);transition:transform .13s ease}
html body input[type=radio]:checked::before{transform:scale(1)}
html body input[type=checkbox]:checked,html body input[type=radio]:checked{
  background:var(--sig,#2f5d46)!important;border-color:var(--sig,#2f5d46)!important}
html body input[type=checkbox]:indeterminate{background:var(--sig,#2f5d46)!important;border-color:var(--sig,#2f5d46)!important}
html body input[type=checkbox]:indeterminate::before{
  transform:scale(1);clip-path:none;height:2px!important;width:9px!important;border-radius:1px!important}

/* The mark follows the app's own rule for text on the signature colour:
   dark on the gold used by the dark themes, white on the green used by the
   light ones. Same pairing the filter chips already use. */
:root{--tick:#1B2124}
html[data-theme="light"],html[data-theme="nature-light"]{--tick:#fff}
/* The filter menu sized its own boxes before this existed. */
.pf-opt input{width:17px!important;height:17px!important}

/* ==========================================================================
   v72 — Market prices gets a real chart.
   The 19-quarter table is now the fallback behind a computed SVG: PSF as an
   accent line over a soft gradient, sales per quarter as faint bars, four
   gridlines with money labels, and a change badge. Nothing is hard-coded —
   the scale comes from the rows.
   ========================================================================== */
.mkt-chart-v72{padding:4px 2px 0}
.mkt-chart-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:0 2px 12px;
  font-size:11.5px;color:var(--ink-3)}
.mkt-key{display:inline-flex;align-items:center;gap:7px;font-weight:600}
.mkt-key .k-line{width:18px;height:3px;border-radius:2px;background:var(--sig);display:inline-block}
.mkt-key .k-bar{width:10px;height:10px;border-radius:3px;display:inline-block;
  background:color-mix(in srgb,var(--sig) 28%,transparent)}
.mkt-delta{margin-left:auto;font-weight:750;font-size:11.5px;padding:4px 11px;border-radius:999px}
.mkt-delta.up{color:var(--sig);background:color-mix(in srgb,var(--sig) 12%,transparent);
  border:1.5px solid color-mix(in srgb,var(--sig) 42%,transparent)}
.mkt-delta.down{color:#a54931;background:color-mix(in srgb,#a54931 10%,transparent);
  border:1.5px solid color-mix(in srgb,#a54931 40%,transparent)}
.mkt-chart-v72 svg{width:100%;height:auto;display:block}
.mkt-grid{stroke:color-mix(in srgb,var(--ink) 16%,transparent);stroke-width:1;stroke-dasharray:2 5}
.mkt-ax{font:10.5px 'Archivo',Arial,sans-serif;fill:var(--ink-3)}
.mkt-line{fill:none;stroke:var(--sig);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.mkt-bar{fill:color-mix(in srgb,var(--sig) 26%,transparent)}
.mkt-bar:hover{fill:color-mix(in srgb,var(--sig) 44%,transparent)}
.mkt-pt{cursor:default}
.mkt-pt .halo{fill:transparent;transition:fill .15s}
.mkt-pt .dot{fill:var(--card);stroke:var(--sig);stroke-width:2.5;transition:r .15s}
.mkt-pt .dot.last{fill:var(--sig)}
.mkt-pt:hover .halo{fill:color-mix(in srgb,var(--sig) 16%,transparent)}
.mkt-pt:hover .dot{r:5.5}
.mkt-table-v72>summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:8px;
  font-size:12px;font-weight:650;color:var(--ink-2);padding:7px 12px;border:1.5px solid var(--card-edge);
  border-radius:8px;background:var(--card-2)}
.mkt-table-v72>summary::before{content:'▸';font-size:10px;transition:transform .15s}
.mkt-table-v72[open]>summary::before{transform:rotate(90deg)}
.mkt-table-v72[open]>summary{margin-bottom:12px}
.mkt-table-v72>summary:hover{border-color:var(--sig);color:var(--sig)}

/* ==========================================================================
   v72 — the news card, calmed and clickable.
   One card = source, headline, who it affects. The summary paragraph lives
   in the article view, not the feed. A stretched button makes the whole
   card the way in; the real links sit above it and still work.
   ========================================================================== */
.f26-card-v72{position:relative;cursor:pointer;
  transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}
.f26-card-v72:hover{border-color:var(--sig)!important;transform:translateY(-1px);
  box-shadow:0 8px 22px rgba(16,22,19,.10)}
.f26-news-open{position:absolute;inset:0;z-index:1;background:none;border:0;cursor:pointer;
  border-radius:inherit;padding:0;margin:0}
.f26-news-open:focus-visible{outline:2px solid var(--sig);outline-offset:2px}
.f26-card-v72 .f26-news-body :is(a,button:not(.f26-news-open)){position:relative;z-index:2}
.f26-card-v72 h3.f26-news-title{font-size:15.5px;line-height:1.4;letter-spacing:-.01em;
  font-weight:650;margin:6px 0 0;color:var(--ink);text-align:left}
.f26-card-v72 .f26-news-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px}
.f26-reach-v72{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;
  color:var(--sig);background:color-mix(in srgb,var(--sig) 11%,transparent);
  border:1.5px solid color-mix(in srgb,var(--sig) 38%,transparent);border-radius:999px;padding:4px 11px}

/* v72 — tour workspace: unplaced tray, doorway badge. */

/* v72b — the news article: one story card, then the work. */

/* ==========================================================================
   v72c — the activity timeline, drawn properly.
   Every event carried the same boxed clock — decoration repeated six times —
   and the connector was a fixed-length stub that cut across taller rows.
   Now: one continuous rail behind plain dots, sized by the rows themselves,
   so nothing overlaps. The fold under it reads "See more".
   ========================================================================== */
.f26-event{grid-template-columns:76px 14px minmax(0,1fr) auto!important;position:relative}
.f26-event>i{width:11px!important;height:11px!important;min-width:0!important;min-height:0!important;
  border-radius:50%!important;background:var(--sig)!important;border:0!important;
  box-shadow:0 0 0 3px var(--card)!important;display:block!important;margin-top:5px;
  position:relative;z-index:1;padding:0!important}
.f26-event>i svg{display:none!important}
.f26-event i:after{content:none!important}
.f26-event::before{content:'';position:absolute;left:92px;top:0;bottom:0;width:2px;
  background:var(--line-2);border-radius:1px}
.f26-disclosure{border-top:1.5px solid var(--card-edge)}
.f26-disclosure>summary{list-style:none;display:inline-flex;align-items:center;gap:8px;
  margin-top:12px;padding:8px 13px;border:1.5px solid var(--card-edge);border-radius:8px;
  background:var(--card-2);font-size:12px;font-weight:650;color:var(--ink-2);cursor:pointer}
.f26-disclosure>summary::-webkit-details-marker{display:none}
.f26-disclosure>summary:hover{border-color:var(--sig);color:var(--sig)}
.f26-disclosure[open] .more{display:none}
.f26-disclosure:not([open]) .less{display:none}
.f26-disclosure[open]>summary{margin-bottom:6px}

/* v72c — client profile: the loose chip strip is a card like everything else,
   and the grey address band inside Shared duplicated the deck title. */

/* v72c — the price trend sits in its own framed card inside the panel. */
.mkt-chart-v72{border:1.5px solid var(--card-edge);border-radius:12px;
  background:var(--card-2);padding:14px 16px 8px;box-shadow:var(--card-glint)}
.mkt-chart-head{margin:0 0 12px}

/* v72c — the created-decks list folds away under its heading. */
.deck16-fold>summary{list-style:none;display:flex;align-items:center;gap:14px;cursor:pointer;padding:2px 0}
.deck16-fold>summary::-webkit-details-marker{display:none}
.deck16-fold>summary h2{margin:0}
.deck16-fold>summary>span{font-size:12px;color:var(--ink-3);font-weight:600;
  border:1.5px solid var(--card-edge);border-radius:999px;padding:4px 11px;background:var(--card-2)}
.deck16-fold>summary::after{content:'▸';margin-left:auto;font-size:13px;color:var(--ink-3);
  transition:transform .15s}
.deck16-fold[open]>summary::after{transform:rotate(90deg)}
.deck16-fold[open]>summary{margin-bottom:12px}
.deck16-fold>summary:hover>span{border-color:var(--sig);color:var(--sig)}

/* v72e — the 3D tour headings used plain Georgia while the app's serif is
   Fraunces; they now share the brand serif so the pages read as one product. */
.tour-page-head h1,.tour-room-head h2,.tour-empty h2,.plinth-dialog h2{font-family:'Fraunces',Georgia,serif}
.brand:after{font-family:'Plus Jakarta Sans',ui-sans-serif,system-ui,sans-serif!important}

/* ==========================================================================
   v72i — ONE typeface everywhere: Plus Jakarta Sans.
   OWNER: fonts kept switching. Every remaining serif (Georgia) and stray
   Arial/Archivo is replaced with the app font, sized and weighted to match
   the dashboard headings. Supersedes the earlier Fraunces rule above.
   ========================================================================== */
:root{--app-font:'Plus Jakarta Sans',ui-sans-serif,system-ui,sans-serif}
body .brand{font-family:var(--app-font)!important;font-weight:650!important;
  font-size:23px!important;letter-spacing:-.035em!important}
.tour-page-head h1{font-family:var(--app-font);font-weight:650;font-size:31px;letter-spacing:-.045em}
.tour-room-head h2{font-family:var(--app-font);font-weight:650;font-size:22px;letter-spacing:-.03em}
.tour-empty h2{font-family:var(--app-font);font-weight:650;font-size:22px;letter-spacing:-.03em}
.plinth-dialog h2{font:650 19px/1.3 var(--app-font);letter-spacing:-.02em}
.connection-heading h2{font:650 21px/1.2 var(--app-font);letter-spacing:-.03em;margin:0 0 7px}
.connection-review b{font:600 14px/1.4 var(--app-font)}
.connection-inspector h3{font:650 13.5px/1.3 var(--app-font);margin:0}
.connection-inspector select{font:11px var(--app-font)}
.tour-schematic text{font-family:var(--app-font)}
.rent50-total{font-family:var(--app-font);font-weight:650;letter-spacing:-.04em}
.mkt-ax{font:10.5px var(--app-font);fill:var(--ink-3)}
.dealask h3{font:650 20px/1.3 var(--app-font);letter-spacing:-.02em}

/* v72j — the nuclear option: every element in the app, one font, no exceptions. */
body,body *,dialog,dialog *,svg text{font-family:'Plus Jakarta Sans',ui-sans-serif,system-ui,sans-serif!important}

/* ==========================================================================
   v72k — the 3D tour library reads like the Decks page: green heading,
   no table, each tour its own soft floating card on the page.
   ========================================================================== */
:root{--h1-ink:var(--ink)}
html[data-theme="light"]{--h1-ink:#163b29}
html[data-theme="nature"]{--h1-ink:#17251C}
.tour-page-head h1{color:var(--h1-ink)}
.tour-page-head{padding:42px 0 18px}
.tour-library-bar{border:0!important;padding:2px 0 18px;gap:16px}
.tour-library-bar>label:first-child{background:var(--card);border:1px solid var(--line-2);
  border-radius:10px;padding:2px 14px;width:380px}
.tour-table{border:0!important;background:transparent!important;border-radius:0!important;overflow:visible!important}
.tour-table-head{display:none!important}
.tour-library-row{border:1px solid var(--line-2)!important;border-radius:12px!important;
  background:var(--card)!important;margin-bottom:14px;min-height:78px;padding:18px 22px}
.tour-library-row:hover{background:var(--card-2)!important}
.tour-workbench{border-radius:14px;overflow:hidden}
.tour-empty h2,.tour-room-head h2{color:var(--h1-ink)}
/* v72l — tour library on the Decks scale, flat cards. */
.tour-library-row{min-height:70px!important;padding:16px 20px!important;box-shadow:none!important}
.tour-library-row b{font-size:13.5px!important;font-weight:600!important}
.tour-library-row span{font-size:12px!important}
.tour-page-head p{font-size:13px}
.tour-workbench{box-shadow:none!important}
/* v72m — same for the 3D tour on photo themes: one frosted solid panel. */
html[data-theme="dark"] .tour-app,html[data-theme="nature"] .tour-app{
  background:color-mix(in srgb,var(--paper) 90%,transparent);
  backdrop-filter:blur(16px);border:1px solid var(--line);border-radius:16px;
  padding:4px 26px 26px;margin-top:8px}
html[data-theme="dark"] .tour-page-head h1{color:var(--ink)}

/* ==========================================================================
   v72u — 3D tours gets the same treatment as the Redesigner: the title
   stays on the page like every other section, and one card holds the
   search row, the tour list and the paging. The card always runs down the
   page instead of hugging however many tours you have.
   ========================================================================== */
.tour-library-card{background:color-mix(in srgb,var(--card) 86%,transparent);
  backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  border:1px solid var(--line-2);border-radius:16px;padding:18px 24px 16px;
  display:flex;flex-direction:column;min-height:640px;margin-top:2px}
.tour-library-card .tour-library-bar{padding:0 0 16px!important;margin:0}
.tour-library-card .tour-table{flex:1 1 auto;align-content:start}
.tour-library-card .tour-pagination{margin-top:auto;border-top:1px solid var(--line-2);padding:14px 0 2px}
.tour-library-row{background:var(--paper)!important}
/* the tour app itself no longer needs the dark-theme wrapper panel */
html[data-theme="dark"] .tour-app,html[data-theme="nature"] .tour-app{
  background:transparent;backdrop-filter:none;border:0;border-radius:0;padding:0;margin-top:0}
/* match the 38px page title the other sections use */
.tour-page-head h1{font-size:38px;letter-spacing:-.05em}
.tour-page-head{padding:42px 0 20px}
.tour-page-head h1{font-size:38px!important;font-weight:650!important}
/* the list shouldn't stretch into a big empty bordered box — it keeps its
   natural height and the leftover space sits below it. */
.tour-library-card .tour-table{flex:0 0 auto;border:0!important;background:transparent!important}
.tour-library-card .tour-table-head{display:none!important}
.tour-library-card .tour-library-row{border:1px solid var(--line-2)!important;border-radius:12px;
  margin-bottom:12px;background:var(--paper)!important}
.tour-library-card .tour-library-row:hover{background:var(--card-2)!important}
.tour-library-card .tour-table{box-shadow:none!important}
.tour-library-card .tour-library-row{background:var(--card)!important;box-shadow:none!important}
.tour-library-card .tour-library-row:hover{background:var(--sig-bg)!important}
/* ==========================================================================
   v73 — rooms first, photo plumbing out of the way.
   OWNER: the tour workflow was still complicated. Every photo carried four
   icon controls, the matching engine narrated its five stages and asked to
   review matches, and the screen used graph words (unplaced, separate
   areas, export graph). Now: rooms are the thing you touch, photo controls
   live in one ··· menu per photo, matching applies itself quietly, and
   where visitors arrive is a room choice.
   ========================================================================== */
.photo-menu>summary{list-style:none;border:1px solid var(--line-2);border-radius:8px;
  padding:5px 9px;font-size:11px;color:var(--ink-3);cursor:pointer}
.photo-menu>summary:after{display:none!important}
.photo-menu[open]{position:relative}
.photo-menu[open]>summary+*{margin-top:6px}
.photo-menu button,.photo-menu .photo-move{display:block;width:100%;text-align:left;
  font-size:12px;padding:10px 12px;border:1px solid var(--line-2);border-top:0;background:var(--card);color:var(--ink)}
.photo-menu .photo-move{display:grid;gap:5px;font-size:10.5px;color:var(--ink-3)}
.photo-menu .photo-move select{font-size:12px;padding:6px;border:1px solid var(--line-2);border-radius:7px;background:var(--card);color:var(--ink)}

/* v117-j — zoom level in Tour settings */
.tp114-section label small{display:block;font-weight:400;color:var(--ink-3);font-size:11px;margin-top:2px}
.tp114-section input[type=range]{width:100%;margin-top:8px;accent-color:var(--sig)}
.tp117-range{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--ink-3);margin-top:6px}
.tp117-range input{width:88px}

/* ==========================================================================
   v117 — research places: real routed walks, directions, and the map.
   ========================================================================== */
.rp-table{border:1px solid var(--line-2);border-radius:12px;overflow:hidden;background:var(--card)}
.rp-thead,.rp-row>summary,.rp-row:not(details){display:grid;
  grid-template-columns:28px minmax(0,1fr) 84px 92px 104px 16px;gap:12px;align-items:center;padding:11px 16px}
.rp-thead{font-size:11px;font-weight:650;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);
  background:var(--card-2,#F7F7F4);border-bottom:1px solid var(--line-2)}
.rp-row{border-top:1px solid var(--line);font-size:13px}
.rp-thead+.rp-row{border-top:0}
/* Rows carry a Walk button in the last column (research-places.js); a 16px column
   let the table's overflow cut it off. On a phone the five columns crushed the
   place name to a word per line and laid the distance over it, so the row keeps
   name and distance stacked beside the fastest time. */
.rp-table:has(.rw-go)>:is(.rp-thead,.rp-row:not(details)),.rp-table:has(.rw-go)>.rp-row>summary{grid-template-columns:28px minmax(0,1fr) 84px 92px 104px 52px}
.rp-chev>.rw-go{margin-right:0}
@media(max-width:640px){
  .rp-table>:is(.rp-thead,.rp-row:not(details)),.rp-table>.rp-row>summary,.rp-table:has(.rw-go)>:is(.rp-thead,.rp-row:not(details)),.rp-table:has(.rw-go)>.rp-row>summary{grid-template-columns:26px minmax(0,1fr) 54px 52px;column-gap:10px;row-gap:2px;padding:11px 14px}
  .rp-thead>:nth-child(3),.rp-thead>:nth-child(4),.rp-row .rp-walk{display:none}
  .rp-table>.rp-row:not(details),.rp-table>.rp-row>summary{grid-template-areas:"dot name best chev" "dot dist best chev"}
  .rp-row .rp-ic{grid-area:dot}.rp-row .rp-name{grid-area:name}.rp-row .rp-dist{grid-area:dist;font-size:11.5px}.rp-row .rp-best{grid-area:best}.rp-row .rp-chev{grid-area:chev;justify-self:end}}
.rp-row>summary{list-style:none;cursor:pointer}
.rp-row>summary::-webkit-details-marker{display:none}
.rp-row>summary:after{display:none!important}
.rp-row>summary:hover{background:var(--tint)}
.rp-row.rw-row{cursor:pointer}
.rp-row.rw-row:hover,.rp-row.rw-row:focus-visible{background:var(--tint)}
.rp-row.rw-row:focus-visible{outline:2px solid var(--sig);outline-offset:-2px}
/* The client brief's icon disc (js/brief-fixes.js .v2-ic): pale ground, glyph in the category colour. */
.rp-ic{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;background:var(--ic-bg);color:var(--ic-fg);flex:none}
.rp-ic svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
html[data-theme="dark"] .rp-ic{background:color-mix(in srgb,var(--ic-fg) 30%,var(--card));color:color-mix(in srgb,var(--ic-bg) 85%,#fff)}
.rp-svc{display:flex!important;flex-wrap:wrap;gap:4px;margin-top:5px!important}
.rp-svc>span{font-size:11px;font-weight:600;line-height:1;padding:3px 6px;border-radius:5px;background:color-mix(in srgb,#3E5E77 10%,var(--card));color:color-mix(in srgb,#3E5E77 80%,var(--ink));font-variant-numeric:tabular-nums}
.rp-svc>.rp-svc-k{background:none;color:var(--ink-3);font-weight:500;padding-left:0}
.rp-lines{display:flex!important;gap:4px;margin-top:5px!important}
.rp-walk{white-space:nowrap}.rp-est{font-size:10px!important;color:var(--ink-3);border:1px solid var(--line-2);border-radius:4px;padding:0 4px;margin-left:3px;line-height:1.3}
.rp-name{min-width:0;font-weight:500}
.rp-name small{display:block;font-size:11.5px;font-weight:400;color:var(--ink-3);margin-top:2px}
.rp-dist,.rp-walk{font-size:12.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.rp-best{display:flex;flex-direction:column;line-height:1.15}
.rp-best b{font-size:13px;font-weight:650;font-variant-numeric:tabular-nums}
.rp-best small{font-size:11px;color:var(--ink-3)}
.rp-chev{color:var(--ink-3);font-size:14px;transition:transform .15s}
.rp-row[open] .rp-chev{transform:rotate(180deg)}
.rp-legs{list-style:none;margin:0;padding:4px 16px 6px 42px;display:grid;gap:9px;position:relative}
.rp-legs:before{content:'';position:absolute;left:52px;top:14px;bottom:14px;width:2px;background:var(--line-2)}
.rp-legs li{display:flex;align-items:center;gap:11px;font-size:12.5px;position:relative}
.rp-leg-ic{min-width:22px;height:22px;padding:0 6px;border-radius:6px;display:inline-grid;place-items:center;
  font-size:10.5px;font-weight:700;color:#fff;position:relative;z-index:1}
.rp-leg-ic.rp-walk{background:var(--card);border:2px solid #9AA29B;width:14px;min-width:14px;height:14px;padding:0;border-radius:50%;margin:0 4px}
.rp-leg-ic.rp-bus{background:#4A6C86}
.rp-leg-ic.rp-rail{background:#B4442F}
.rp-legs-foot{font-size:11.5px;color:var(--ink-3);padding:4px 16px 14px 42px;margin:0}
.rp-block{margin-top:22px}
.rp-block h3{font-size:15px;font-weight:650;margin:0 0 10px}


/* v117-map — the Map section, second pass.
   Groups are chips along the top, the map and a list sit side by side, and
   picking a place in either one shows it in the other. */
.rp-head{display:flex;align-items:flex-end;gap:16px}
.rp-deck-toggle{margin-left:auto;display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--ink-2);cursor:pointer;white-space:nowrap}
.rp-deck-toggle input{position:absolute;opacity:0;pointer-events:none}
.rp-sw{width:34px;height:20px;border-radius:99px;background:#D3D7D1;position:relative;transition:background .15s}
.rp-sw:after{content:'';position:absolute;left:2px;top:2px;width:16px;height:16px;border-radius:50%;background:#fff;
  box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s}
.rp-deck-toggle input:checked+.rp-sw{background:var(--sig)}
.rp-deck-toggle input:checked+.rp-sw:after{transform:translateX(14px)}

.rp-chips{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 12px}
.rp-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px 7px 9px;border-radius:99px;cursor:pointer;
  border:1px solid var(--line-2);background:var(--card);font-size:12.5px;color:var(--ink-3);transition:all .12s}
.rp-chip svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.rp-chip em{font-style:normal;font-size:11px;opacity:.7}
.rp-chip[aria-pressed=true]{background:var(--c);border-color:var(--c);color:#fff}
.rp-chip:hover{border-color:var(--c)}

.rp-body{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:0;border:1px solid var(--line-2);
  border-radius:16px;overflow:hidden;background:var(--card);box-shadow:0 1px 3px rgba(16,22,19,.04)}
.rp-map{position:relative;height:600px;overflow:hidden;background:#EEF0EA;cursor:grab;touch-action:none;user-select:none;
  background-image:radial-gradient(rgba(23,27,24,.07) 1px,transparent 1px);background-size:18px 18px}
.rp-map.rp-dragging{cursor:grabbing}
.rp-tiles img{position:absolute;left:0;top:0;width:256px;height:256px;pointer-events:none;opacity:0;transition:opacity .25s}
.rp-tiles img.in{opacity:1}
.rp-ring{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.rp-ring circle{fill:rgba(27,53,44,.06);stroke:#1b352c;stroke-width:1.5;stroke-dasharray:4 5}
.rp-ring text{font:600 11px 'Plus Jakarta Sans',system-ui,sans-serif;fill:#1b352c;paint-order:stroke;stroke:#fff;stroke-width:3px}
.rp-dark .rp-ring circle{stroke:#DCE6DE;fill:rgba(220,230,222,.07)}
.rp-dark .rp-ring text{fill:#EEF2EE;stroke:#1d2a24}

.rp-pins{position:absolute;inset:0;pointer-events:none}
/* A pin moved off a neighbour keeps a thin leader to a dot on its true spot. */
.rp-leaders{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.rp-leaders line{stroke:var(--c);stroke-width:1.5;opacity:.8}
.rp-leaders circle{fill:var(--c);stroke:#fff;stroke-width:1.5}
/* Four or more places on one spot: a numbered bubble; tapping it zooms in. */
.rp-group{position:absolute;width:34px;height:34px;margin:-17px 0 0 -17px;padding:0;border-radius:50%;border:2.5px solid #fff;
  background:#1b352c;color:#fff;display:grid;place-items:center;cursor:zoom-in;pointer-events:auto;
  box-shadow:0 0 0 4px rgba(27,53,44,.18),0 2px 6px rgba(16,22,19,.3);transition:transform .12s}
.rp-group b{font-size:12.5px;font-weight:700;font-variant-numeric:tabular-nums}
.rp-group:hover{transform:scale(1.12);z-index:3}
.rp-group:hover .rp-tip{opacity:1}
.rp-pin{position:absolute;width:30px;height:30px;margin:-15px 0 0 -15px;padding:0;border-radius:50%;border:2.5px solid #fff;
  background:var(--c);color:#fff;display:grid;place-items:center;cursor:pointer;pointer-events:auto;
  box-shadow:0 2px 6px rgba(16,22,19,.28);transition:transform .12s}
.rp-pin svg{width:15px;height:15px;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.rp-pin:hover,.rp-pin.hl{transform:scale(1.18);z-index:3}
.rp-pin.on{transform:scale(1.28);z-index:4;box-shadow:0 0 0 4px rgba(255,255,255,.7),0 4px 12px rgba(16,22,19,.35)}
.rp-tip{position:absolute;bottom:calc(100% + 7px);left:50%;transform:translateX(-50%);white-space:nowrap;
  background:#1d2521;color:#fff;font-size:11.5px;font-weight:500;padding:4px 8px;border-radius:6px;opacity:0;pointer-events:none;transition:opacity .12s}
.rp-pin:hover .rp-tip,.rp-pin.hl .rp-tip,.rp-pin.on .rp-tip{opacity:1}
.rp-home{position:absolute;margin:-19px 0 0 -19px;z-index:5;display:flex;align-items:center;gap:6px;
  height:38px;padding:0 13px 0 8px;border-radius:99px;background:#1b352c;border:3px solid #fff;
  box-shadow:0 4px 14px rgba(16,22,19,.35);color:#fff;pointer-events:none}
.rp-home svg{width:17px;height:17px;fill:#fff}
.rp-home b{font-size:12px;font-weight:650}

.rp-tools{position:absolute;right:14px;top:14px;display:flex;flex-direction:column;gap:8px;z-index:6}
.rp-zoom{display:flex;flex-direction:column;border-radius:10px;overflow:hidden;background:var(--card);box-shadow:0 2px 10px rgba(16,22,19,.16)}
.rp-zoom button,.rp-tool{width:38px;height:38px;border:0;background:var(--card);cursor:pointer;color:var(--ink);font-size:18px;display:grid;place-items:center}
.rp-zoom button+button{border-top:1px solid var(--line)}
.rp-tool{border-radius:10px;box-shadow:0 2px 10px rgba(16,22,19,.16)}
.rp-tool svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.rp-tool[data-rp-zoom="0"] svg{fill:currentColor;stroke:none}
.rp-tool[aria-pressed=true]{background:#1b352c;color:#fff}
.rp-styles{position:absolute;left:14px;top:14px;z-index:6;display:flex;gap:2px;padding:3px;border-radius:10px;
  background:var(--card);box-shadow:0 2px 10px rgba(16,22,19,.16)}
.rp-styles button{border:0;background:none;font-size:12px;padding:6px 11px;border-radius:7px;color:var(--ink-3);cursor:pointer}
.rp-styles button[aria-pressed=true]{background:#1b352c;color:#fff;font-weight:600}

.rp-card{position:absolute;left:14px;bottom:30px;width:320px;max-width:calc(100% - 28px);z-index:7;background:var(--card);
  border-radius:14px;box-shadow:0 12px 34px rgba(16,22,19,.22);padding:15px 16px 13px;animation:rpUp .18s ease-out}
@keyframes rpUp{from{opacity:0;transform:translateY(6px)}}
.rp-card-top{display:flex;gap:11px;align-items:flex-start;padding-right:18px}
.rp-card-top h4{font-size:15px;font-weight:650;margin:0 0 2px;line-height:1.25}
.rp-card-top span{font-size:12px;color:var(--ink-3)}
.rp-badge{width:30px;height:30px;border-radius:9px;background:var(--c);display:grid;place-items:center;flex:none}
.rp-badge svg{width:16px;height:16px;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.rp-card-times{display:flex;gap:10px;margin:12px 0 4px}
.rp-card-times>div{flex:1;padding:9px 11px;border-radius:10px;background:var(--tint)}
.rp-card-times>div.best{background:#EAF1EB}
.rp-card-times b{display:block;font-size:17px;font-weight:650}
.rp-card-times small{font-size:11px;color:var(--ink-3)}
.rp-card .rp-legs{padding:8px 0 2px}
.rp-card .rp-legs:before{left:10px}
.rp-x{position:absolute;right:9px;top:7px;width:26px;height:26px;border:0;border-radius:50%;background:none;color:var(--ink-3);cursor:pointer;
  display:grid;place-items:center;padding:0}
.rp-x svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.rp-x:hover{background:var(--tint)}
.rp-attr{position:absolute;right:0;bottom:0;z-index:6;font-size:10px;color:#4A534E;background:rgba(255,255,255,.86);padding:3px 8px;border-top-left-radius:6px}
.rp-offline{position:absolute;left:50%;bottom:12px;transform:translateX(-50%);z-index:6;font-size:11px;color:#4A534E;
  background:rgba(255,255,255,.9);padding:4px 10px;border-radius:99px}

.rp-list{border-left:1px solid var(--line-2);display:flex;flex-direction:column;min-height:0;height:600px}
.rp-list-head{padding:14px 16px 10px;font-size:13px;font-weight:650;border-bottom:1px solid var(--line)}
.rp-list-head span{font-weight:400;color:var(--ink-3);font-size:12px;margin-left:4px}
.rp-items{overflow:auto;flex:1;padding:6px}
.rp-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:none;padding:9px 10px;
  border-radius:10px;cursor:pointer;font-family:inherit;color:var(--ink)}
.rp-item:hover{background:var(--tint)}
.rp-item.on{background:#EAF1EB}
.rp-item .rp-badge{width:28px;height:28px;border-radius:8px}
.rp-item .rp-badge svg{width:14px;height:14px}
.rp-item-name{flex:1;min-width:0;font-size:13px;font-weight:500;line-height:1.3}
.rp-item-name small{display:block;font-size:11px;font-weight:400;color:var(--ink-3)}
.rp-item-time{text-align:right;line-height:1.2;flex:none}
.rp-item-time b{display:block;font-size:13px;font-weight:650;font-variant-numeric:tabular-nums}
.rp-item-time small{font-size:10.5px;color:var(--ink-3)}
.rp-empty{font-size:12.5px;color:var(--ink-3);padding:18px 12px;text-align:center}

@media(max-width:900px){
  .rp-body{grid-template-columns:1fr}
  .rp-map{height:440px}
  .rp-list{border-left:0;border-top:1px solid var(--line-2);height:auto;max-height:360px}
  .rp-head{flex-wrap:wrap}.rp-deck-toggle{margin-left:0}
  .rp-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px}
  .rp-card{left:10px;right:10px;width:auto;bottom:26px}}

/* F4 — honest-UI notes, the two video tools' sub-lines, the deal step's way back. */
.nav .nl .ns{display:block;font-size:10.5px;line-height:1.3;font-weight:400;letter-spacing:0;color:var(--ink-3);white-space:normal;margin-top:1px}
.nav button[aria-current="true"] .ns{color:inherit;opacity:.72}
.shell.narrow .nav .ns{display:none}
.nav button>.p71-icon{margin:0}
.deck16-fold{padding:14px 18px 16px}
.deck16-fold[open]{padding-bottom:18px}
.dealask-back{margin:0 0 14px;padding:4px 0;border:0;background:none;color:var(--ink-3);font-size:12px;cursor:pointer}
.dealask-back:hover{color:var(--ink)}

/* The session pill is fixed to the bottom-left at true pixels (it undoes the root --uz zoom), so the sidebar
   keeps that strip clear and the account row sits above it. Below 681px the pill is static (plinth-v50.css). */
@media(min-width:681px){#side{padding-bottom:calc(66px / var(--uz,1))!important}}

/* Mobile ergonomics — additive; dashboard86 follows the scaled content width. */
@media screen {
 @container dashboard86 (max-width:900px) {
  #view :is(button,summary,.ghost,.solid,.tour-button,.tour-primary){min-height:44px!important}
  #view :is(button,summary){min-width:44px!important}
  #view :is(input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),select,textarea){font-size:16px!important;min-height:44px!important;max-width:100%;min-width:0}
  #view :is(.htop,.tools,.deck-toolbar,.client-toolbar,.tour-library-bar,.ve-library-bar,.ms-actions){flex-wrap:wrap;gap:10px}
  #view :is(.pf-opt,.srow:has(input[type=checkbox])){min-height:44px!important}
  #view .pf-menu{max-width:min(340px,calc(100cqw - 32px));max-height:min(480px,65dvh);overflow-y:auto}
  #view :is(.f26-activity-who,.f26-activity-who>span:last-child,.ve-row-text){min-width:0}
  #view :is(.f26-activity-who b,.f26-activity-who p,.ve-row-text b,.ms-url){overflow-wrap:anywhere}
  #view .vm-frame{min-height:calc(100dvh - 160px)}
 }
 @container dashboard86 (max-width:600px) {
  /* Keep identity readable: activity time takes its own row. */
  #view .f26-activity{display:grid!important;grid-template-columns:minmax(0,1fr) 24px!important;gap:14px;padding:20px!important}
  #view .f26-activity-who{grid-column:1;grid-row:1}
  #view .f26-activity-when{grid-column:1;grid-row:2;text-align:left;align-items:flex-start;padding-left:0}
  #view .f26-activity>.arw{grid-column:2;grid-row:1 / span 2;align-self:center}
  #view .f26-activity-who>span:last-child{flex:1}
  #view .f26-activity-when b{justify-content:flex-start}
  #view :is(.client-toolbar,.deck-toolbar)>.search{flex:1 1 100%;min-width:0;width:100%}
  #view .f26-news-card{padding:20px}
  #view .tour-library-bar>label{min-width:0;flex:1 1 100%}
  #view .ve-lib-filter{width:100%}
  #view .ve-row{grid-template-columns:minmax(0,1fr)!important;gap:12px}
  #view .ve-row>span{min-width:0}
  #view .ve-row-chips{justify-content:flex-start;flex-wrap:wrap}
 }
}
@media screen and (max-width:900px) {
 /* Controls outside #view cannot use its container. */
 #basis-session button{min-width:44px!important;min-height:44px!important}
 :is(dialog,.modal,.modal-backdrop) :is(button,summary){min-width:44px!important;min-height:44px!important}
 :is(dialog,.modal) :is(input:not([type=checkbox]):not([type=radio]),select,textarea){font-size:16px!important;max-width:100%}
 dialog[open]{max-height:calc(100dvh - 32px);max-width:calc(100vw - 24px);overflow-y:auto}
}


/* Phones in landscape and small tablets get true-pixel controls: the desktop scale dial otherwise shrinks these
   widths to miniature ones. The shell itself (the sidebar drawer, #view's gutters) is css/plinth-mobile.css (ruling 103). */
@media screen and (max-width:900px){
 html,html body{zoom:1!important;--uz:1!important}
 #basis-session{position:static!important;margin:12px 15px!important;width:auto!important;max-width:100%!important}
 .uiscale-track{min-height:44px}
}
}


/* ==========================================================================
   Research feedback pass — property record edits, market readout, honest
   empty states, place symbols, one transport list, selling points.
   ========================================================================== */
/* Property record: unit and asking price edit in place. The field reads as
   the value until pointed at; the pen says it can be changed. */
.rec-field{display:inline-flex;align-items:center;gap:4px;max-width:100%;cursor:text}
.rec-field input{font:inherit;font-size:13px;font-weight:600;color:var(--ink);background:transparent;border:1px solid transparent;
  border-radius:7px;padding:4px 8px;margin:-5px 0 -5px -9px;width:min(280px,60vw);min-width:0}
.rec-field input::placeholder{color:var(--ink-3);font-weight:500}
.rec-field:hover input{border-color:var(--line-2);background:var(--card)}
.rec-field input:focus{outline:none;border-color:var(--sig);background:var(--card);box-shadow:0 0 0 3px color-mix(in srgb,var(--sig) 16%,transparent)}
.rec-field i{display:inline-grid;place-items:center;color:var(--ink-3);font-style:normal}
.rec-field i svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.rec-field:hover i,.rec-field:focus-within i{color:var(--sig)}
.rec-field.is-unset input::placeholder{color:color-mix(in srgb,#A0640F 80%,var(--ink))}
.rec-warn{display:flex;flex-direction:column;gap:4px;margin-top:9px;font-weight:400}
.rec-warn-badge{align-self:flex-start;display:inline-flex;align-items:center;gap:5px;padding:3px 8px 3px 6px;border-radius:999px;font-size:11px;font-weight:650;
  background:color-mix(in srgb,#E8A33A 18%,var(--card));color:color-mix(in srgb,#9A5A06 88%,var(--ink));border:1px solid color-mix(in srgb,#E8A33A 45%,transparent)}
.rec-warn-badge svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.rec-warn small{font-size:11.5px;line-height:1.45;color:var(--ink-2);max-width:46ch}

/* Money with nothing to work from says so, and offers the one fix. */
.money-empty-v7{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}
.money-empty-v7 p{margin:0;max-width:62ch;line-height:1.5}
.money-empty-v7 b{display:block;margin-bottom:2px}

/* Market: the latest quarter reads above the chart, not over its last point. */
.mkt-now{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:0 0 10px}
.mkt-now span{font-size:11px;font-weight:650;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3)}
.mkt-now b{font-size:22px;font-weight:700;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums}
.mkt-now small{font-size:12px;color:var(--ink-3)}

/* Walk map: the close cross sits dead centre; the far end carries its symbol. */
.rw-card .rw-x{display:grid;place-items:center;padding:0}
.rw-card .rw-x svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.rw-dest{position:absolute;width:30px;height:30px;transform:translate(-50%,calc(-100% - 11px));border-radius:50%;background:var(--c);
  border:2.5px solid #fff;box-shadow:0 2px 8px rgba(16,22,19,.32);display:grid;place-items:center;pointer-events:none}
.rw-dest:after{content:'';position:absolute;left:50%;bottom:-8px;transform:translateX(-50%);border:5px solid transparent;border-top:6px solid #fff;border-bottom:0}
.rw-dest svg{width:15px;height:15px;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.rw-dest.is-plain{width:14px;height:14px;background:#C2412D}
.rw-dest.is-plain:after{display:none}

/* Outlook: one plain line when there is nothing, cards only for what was found. */
.outlook-none-v7{margin:4px 0 0;font-size:14px;line-height:1.5;color:var(--ink)}
.outlook-gap-v7{margin:8px 0 0;font-size:12px;line-height:1.5;color:var(--ink-3)}
.outlook-card-v7 p+p{margin-top:3px}
.outlook-foot-v7{font-weight:600;color:var(--ink-2)!important}

/* Top selling points: full width like every other section, a real action,
   and a body that fills the card instead of one line of grey type. */
.deck17-selling{max-width:none!important}
.deck17-selling-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;flex-wrap:wrap}
.deck17-selling-head p{max-width:64ch;line-height:1.5}
.deck17-selling-go{flex:none}
.deck17-selling-empty{display:grid;place-items:center;min-height:220px;border:1px dashed var(--line-2);border-radius:12px;background:var(--card-2);color:var(--ink-3);font-size:13px;text-align:center;padding:24px}
.deck17-selling-empty p{margin:0}
/* Nothing cleared the bar: one quiet block where the cards would be; the head and its action stay. */
.deck17-selling-none{margin-top:clamp(14px,1.8vw,20px);padding:22px;border:1px dashed var(--line-2);border-radius:12px;text-align:center;color:var(--ink-3);font-size:13px}
.deck17-selling-none b{display:block;color:var(--ink);font-size:14px;margin-bottom:4px}
.deck17-selling-none p{margin:0}
/* Cards past the first four, folded. */
.sp-more{margin-top:clamp(10px,1.3vw,14px)}
.sp-more>summary{cursor:pointer;font-size:12.5px;font-weight:600;color:var(--ink-2);padding:6px 2px}
/* Top selling points as cards, strongest first. Each card: the rank, pills
   for what the point rests on and who it lands with, the headline, the argument, and the measurement under a
   rule. Text never meets the card's top edge; spacing breathes with the
   viewport rather than jumping at one breakpoint. */
.sp-list{list-style:none;margin:clamp(14px,1.8vw,20px) 0 0;padding:0;display:grid;gap:clamp(10px,1.3vw,14px)}
.sp-card{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;
  gap:clamp(12px,1.8vw,20px);padding:clamp(18px,2.2vw,24px) clamp(16px,2.4vw,26px) clamp(16px,2vw,22px);
  border:1px solid var(--line);border-radius:14px;background:var(--card);overflow:hidden}
.sp-card::before{content:'';position:absolute;left:0;top:clamp(18px,2.2vw,24px);bottom:clamp(18px,2.2vw,24px);width:3px;
  border-radius:0 3px 3px 0;background:var(--hue);opacity:.8}
.sp-lead{border-color:color-mix(in srgb,var(--hue) 45%,var(--line));
  background:linear-gradient(180deg,color-mix(in srgb,var(--hue) 9%,var(--card)) 0,var(--card) 72%)}
.sp-rank{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-size:13px;font-weight:700;line-height:1;
  font-variant-numeric:tabular-nums;color:var(--ink);background:color-mix(in srgb,var(--hue) 20%,var(--card));
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--hue) 50%,transparent)}
.sp-main{min-width:0;display:grid;gap:clamp(7px,.8vw,9px)}
.sp-tags{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-height:34px}
.sp-pill{display:inline-flex;align-items:center;gap:6px;min-height:24px;padding:3px 10px;border-radius:999px;
  font-size:11px;font-weight:600;line-height:1.2;color:var(--ink-2);background:var(--card-2);box-shadow:inset 0 0 0 1px var(--line)}
.sp-dim::before{content:'';flex:none;width:7px;height:7px;border-radius:50%;background:var(--hue)}
.sp-head{margin:2px 0 0;font-size:clamp(15.5px,1.25vw,17px);line-height:1.38;font-weight:650;letter-spacing:-.015em;
  color:var(--ink);max-width:64ch;text-wrap:balance}
.sp-lead .sp-head{font-size:clamp(16.5px,1.45vw,19px)}
.sp-body{margin:0;font-size:13.5px;line-height:1.62;color:var(--ink-2);max-width:74ch;text-wrap:pretty}
.sp-evidence{margin:3px 0 0;padding-top:10px;border-top:1px dashed var(--line-2);font-size:12px;line-height:1.55;
  color:var(--ink-3);max-width:84ch}
.sp-evidence span{display:inline-block;margin-right:8px;font-size:10px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:var(--ink-2)}
/* On a phone the rank moves into the pill row, so the argument gets the
   card's full width instead of a column beside a number. */
@media(max-width:560px){
  .sp-card{column-gap:10px;row-gap:9px;border-radius:12px}
  .sp-main{display:contents}
  .sp-rank{grid-column:1;grid-row:1;width:28px;height:28px;font-size:12px}
  .sp-tags{grid-column:2;grid-row:1;min-height:28px}
  .sp-head,.sp-body,.sp-evidence{grid-column:1/-1}
  .sp-body{font-size:13px;line-height:1.58}
}

/* ==========================================================================
   Empty states are LOCAL (DECISIONS 2026-10-06). An empty list keeps its
   page: header, toolbar, filter menu and count render as they do with rows,
   and the emptiness is one modest block in the list's own slot -
   PlinthFilter.empty() in js/dashboard-filter.js. A small picture, a bold
   line no larger than 20px, one line of explanation, one action; 28px of
   padding. Framed like the rows it stands in for, never page-sized.
   ========================================================================== */
.slot-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  box-sizing:border-box;padding:28px 20px;text-align:center;color:var(--ink);
  border:1px solid var(--card-edge-strong,var(--card-edge,var(--line)));border-radius:6px;background:var(--card)}
.slot-empty-art{display:block;width:var(--slot-w,176px);max-width:100%;height:auto;margin:0 0 4px;border-radius:8px;object-fit:contain}
html:is([data-theme="dark"],[data-theme="nature-dark"],:not([data-theme])) .slot-empty-art{filter:brightness(.9) saturate(.95)}
.slot-empty .slot-empty-title{margin:0;font-size:20px;line-height:1.25;font-weight:700;letter-spacing:-.01em;color:var(--ink);text-wrap:balance}
.slot-empty .slot-empty-line{margin:0;max-width:46ch;font-size:13.5px;line-height:1.5;color:var(--ink-2);text-wrap:pretty}
.slot-empty .slot-empty-cta{margin-top:6px}
.slot-empty .slot-empty-link{min-height:36px;padding:0 4px;border:0;background:none;color:var(--ink-2);font:inherit;font-size:13.5px;
  text-decoration:underline;text-underline-offset:4px;text-decoration-color:var(--line-2);cursor:pointer}
.slot-empty .slot-empty-link:hover{color:var(--ink);text-decoration-color:currentColor}
.slot-empty :is(.slot-empty-cta,.slot-empty-link):focus-visible{outline:2px solid var(--sig);outline-offset:3px}
/* the search palette's results list is already a panel: no frame, a smaller line */
#pres .slot-empty{border:0;background:none;padding:22px 16px}
#pres .slot-empty .slot-empty-title{font-size:16px}
@media(max-width:760px){
  .slot-empty{padding:24px 12px}
  .slot-empty .slot-empty-title{font-size:18px}
  .slot-empty-art{width:min(var(--slot-w,176px),150px)}
}

/* New deck's address search: a card at the page's own scale, not a stage. */
.es-finder .finder-card{box-sizing:border-box;padding:28px;border:1px solid var(--card-edge-strong,var(--card-edge,var(--line)));
  border-radius:12px;background:var(--card)}
.es-finder .finder-card .fbar.es-fbar{min-height:52px;padding:4px 14px!important}
/* the light theme paints every input; inside the bar that drew a box within the box */
.es-finder .finder-card .fbar.es-fbar input{min-height:42px;font-size:16px!important;background:transparent!important}
.es-finder .finder-card .finder-try{margin-top:16px;min-height:40px;padding:8px 14px;font-size:14px}
.es-finder .finder-card .finder-try .p71-icon{width:17px;height:17px;flex:none}
@media(max-width:760px){.es-finder .finder-card{padding:20px 16px}}
/* the bar, label, help line and results the finder kept from the retired empty-state sheet */
.es-fbar{border:1px solid var(--line-2);border-radius:12px;background:var(--card)}
.es-finder .sugg:not(:empty){margin-top:8px;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.es-chip{display:inline-flex;align-items:center;gap:9px;min-height:46px;padding:9px 18px;border:0;border-radius:10px;background:var(--sig-bg);color:var(--ink);font:inherit;font-size:14px;cursor:pointer}
.es-chip:hover{background:color-mix(in srgb,var(--sig) 18%,transparent)}
.es-chip:focus-visible{outline:2px solid var(--sig);outline-offset:3px}
/* Clients: the add form is a bordered card at the top of the list, two columns, with the
   areas and tags it routes news by as dropdowns; rows are avatar, name and an arrow. */
#addBtn[hidden]{display:none!important}
#view .card.cf{position:relative;z-index:85;margin:6px auto 18px!important;padding:24px!important;border:1px solid var(--line-2)!important;border-radius:8px!important;background:var(--card)!important;box-shadow:none!important;overflow:visible!important}
#view .cf .addgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px 24px;align-items:start}
#view .cf .cf-field{display:flex;flex-direction:column;gap:8px;min-width:0;font-size:13px;font-weight:600;color:var(--ink);letter-spacing:0}
#view .cf .cf-lab{font:inherit}
#view .cf .cf-field>input{width:100%;height:42px;margin:0;padding:0 13px;border:1px solid var(--line-2)!important;border-radius:6px;background:var(--card)!important;color:var(--ink);font:inherit;font-size:14px;font-weight:400}
#view .cf .cf-field>input::placeholder{color:var(--ink-3)}
#view .cf .cf-field>input:focus{outline:none;border-color:var(--sig)!important;box-shadow:0 0 0 1px var(--sig)}
#view .cf .v27-localnote{margin:-2px 0 0;font-size:12px;font-weight:400;color:var(--ink-3)}
#view .cf .cf-pick{position:relative}
#view .cf .cf-pick-btn{display:flex;align-items:center;justify-content:space-between;gap:10px;height:42px;padding:0 13px;border:1px solid var(--line-2);border-radius:6px;background:var(--card);color:var(--ink);font-size:14px;font-weight:400;cursor:pointer;list-style:none}
#view .cf .cf-pick-btn::-webkit-details-marker{display:none}
#view .cf .cf-pick-btn::after,#view .cf .cf-pick-btn::before{content:none!important;display:none!important}
#view .cf .cf-pick-btn:focus-visible,#view .cf .cf-pick[open]>.cf-pick-btn{outline:none;border-color:var(--sig);box-shadow:0 0 0 1px var(--sig)}
#view .cf .cf-pick-btn svg{flex:none;color:var(--ink-2);transition:transform .16s ease}
#view .cf .cf-pick[open]>.cf-pick-btn svg{transform:rotate(180deg)}
#view .cf .cf-pick-val{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#view .cf .cf-pick-val.is-empty{color:var(--ink-3)}
#view .cf .cf-pick-menu{position:absolute;z-index:40;top:calc(100% + 6px);left:0;right:0;max-height:280px;overflow:auto;overscroll-behavior:contain;padding:6px;border:1px solid var(--line-2);border-radius:8px;background:var(--card);box-shadow:0 14px 34px rgba(20,32,26,.16);font-weight:400}
#view .cf .cf-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:24px;padding-top:20px;border-top:1px solid var(--line)}
#view .cf .cf-foot button{min-height:42px;padding:0 22px;border-radius:6px;font-size:14px}
#view .cf .cf-pick-menu .pf-opt{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;font-size:14px;color:var(--ink);cursor:pointer}
#view .cf .cf-pick-menu .pf-opt:hover{background:var(--card-2)}
#view .cf .cf-pick-menu .pf-opt input{flex:none;width:16px!important;height:16px!important;margin:0;padding:0;accent-color:var(--sig)}
#view .client-list .client-row-v4{min-height:0!important;padding:14px 22px!important;gap:16px!important;align-items:center}
#view .client-list .client-row-v4 .mono{width:40px!important;height:40px!important;border-radius:8px!important;font-size:13px!important}
#view .client-list .client-row-v4 .client-main{gap:2px}
#view .client-list .client-row-v4 .client-main b{font-size:15px;font-weight:600}
#view .client-list .client-row-v4 .arw{display:grid;place-items:center;color:var(--ink)}
#view .client-list .client-row-v4 .arw svg{width:20px;height:20px}
#view .client-list #cbody{display:grid;gap:10px}
@media(max-width:640px){
  #view .cf .addgrid{grid-template-columns:1fr;gap:16px}
  #view .card.cf{padding:18px!important}
  #view .cf .cf-foot button{flex:1}
}

/* ==========================================================================
   f27z - drawn edges everywhere (owner, 8 Oct 2026: "raise borders and
   contrast everywhere"). The theme blocks set --line at 7-13% ink, which is
   under 1.4:1 on the tinted surfaces. The tour workspace's comps set the
   standard; its values go product-wide, mixed from each theme's own ink so all
   four themes move together. --line-2 sits at 34% so no theme's control edge
   comes out lighter than it was.
   ========================================================================== */
:root,:root[data-theme]{
  --line:color-mix(in srgb, var(--ink) 22%, transparent)!important;
  --line-2:color-mix(in srgb, var(--ink) 34%, transparent)!important;
  --card-edge:color-mix(in srgb, var(--ink) 36%, transparent);
}
/* News was drawn to its comps at 1.5px on the earlier card edge; it keeps it. */
#view .nw2{--card-edge:color-mix(in srgb, var(--ink) 28%, transparent)}
/* The theme blocks in dashboard.html state their own card, field and ghost
   edges as fixed colours (#C9C7BD and kin, about 1.39:1 on the page). Here
   they take the shared edge instead, in every theme. The tour workspace and
   News keep the edges their comps set. */
:root[data-theme] :is(.data-panel-v5,.slide-summary-v5,.research-nav-v5,.finance-inputs-v7,.radius-panel-v7,
  .route-result-v7,.data-summary-v9,.amenity-group-v9,.settings-card-v4,.card,.basis15-card,.basis16-card,
  .basis17-card,.basis18-card,.basis19-card,.basis20-card,.amenity-filter-v9):not(.tour-app *,.nw2 *){
  border-color:var(--card-edge)!important}
:root[data-theme] :is(input:not([type=checkbox],[type=radio],[type=range]),select,textarea,.sinput,.sselect,.search,.ghost):not(.tour-app *,.nw2 *,:focus,:focus-within){
  border-color:var(--card-edge)!important}
:root[data-theme] .ghost.v26-danger-btn:hover{border-color:rgba(168,67,58,.45)!important}
/* The sidebar's current page and the theme picker: a filled row needs an edge too. */
:root[data-theme] .side button[aria-current="true"]:not(:focus-visible){outline:1px solid var(--card-edge);outline-offset:-1px}
:root[data-theme] .side-theme-grid-v23 button{border-color:var(--card-edge)}
:root[data-theme] .side-theme-grid-v23 button[aria-pressed="true"]{border-color:var(--card-edge-strong)}
/* Tabs and pills that marked "you are here" with a tint alone. */
:root[data-theme] #view .deck17-research-tabs button[aria-current="true"]{box-shadow:inset 0 0 0 1px var(--card-edge-strong)!important}
:root[data-theme] #view .tour-activity-tabs button[aria-current="true"]{box-shadow:inset 1px 1px 0 var(--card-edge-strong),inset -1px 0 0 var(--card-edge-strong)!important}
:root[data-theme] .deal-chip.rent{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--sig) 50%,transparent)}
:root[data-theme] .deal-chip.both{box-shadow:inset 0 0 0 1px var(--card-edge)}
.es-chip{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--sig) 50%,transparent)}
/* Search palette: the row the keyboard is on, and the agent deck's current slide. */
:root[data-theme] .prow:is(:hover,[data-on="1"]){box-shadow:inset 0 0 0 1px var(--card-edge-strong)!important}
.viewing-outline>div.active{box-shadow:inset 0 0 0 1px var(--card-edge-strong)}
/* Map controls are controls (the map itself already sits in a drawn frame):
   Standard | Grey | Night is drawn like the tour's Editing | Buyer view
   switch, and the tools carry an edge. They sit on the map's own light
   tiles in every theme, so the edge is a dark one, not the theme's ink. */
.rp-styles{border:1px solid rgba(21,24,23,.56)}
.rp-zoom,.rp-tool{border:1px solid rgba(21,24,23,.42)}
/* A field drawn by its label keeps one edge: the theme's own field fill inside it read as a second, edgeless box. */
:root[data-theme] input[data-cp82-search]{background:transparent!important}
/* BUG-16: a long client name wraps inside its row (two lines, then an ellipsis) instead of running under the arrow. */
#view .client-list .client-row-v4 .client-main{min-width:0}
#view .client-list .client-row-v4 .client-main b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
/* BUG-30: the 3D tours library lines up with the other zone pages (the workspace itself stays full width). */
@media (min-width:861px){
  #view .tour-app:has(>.tour-page-head){max-width:1280px!important;margin-inline:auto!important}
}
