
    .sk-tool { background:#222; color:#ccc; border:1px solid #333; border-radius:4px; padding:3px 9px; font-size:11px; cursor:pointer; white-space:nowrap; }
    .sk-tool:hover { background:#333; color:#fff; }
    .sk-tool.active { background:var(--brand,#1a56db); color:#fff; border-color:var(--brand,#1a56db); }
  

/* ── Settings v2 (Dale 2026-08-12): sidebar sub-nav, horizontal tabs, aligned form rows ── */
.settings-subnav{display:none!important}
.stg-tabbar{display:flex;gap:4px;flex-wrap:wrap;align-items:flex-end;margin:-18px -18px 20px;padding:10px 12px 0;border-bottom:1px solid var(--border)}
.stg-tab{padding:11px 22px;border:1px solid var(--border);border-bottom:0;border-radius:10px 10px 0 0;background:var(--surface);color:var(--text2);font-size:12.5px;font-weight:600;cursor:pointer;margin-bottom:-1px;transition:color var(--t)}
.stg-tab:hover{color:var(--text)}
.stg-tab.active{background:var(--panel);color:var(--brand-ink);font-weight:700;border-bottom:1px solid var(--panel)}
.stg-tabbed .settings-section>h3{display:none}
.settings-section .settings-row{display:grid;grid-template-columns:220px minmax(0,1fr);gap:2px 28px;align-items:start;padding:15px 0;margin:0;border-bottom:1px solid var(--border)}
.settings-section .settings-row:last-child{border-bottom:0}
.settings-section .settings-row>label{font-size:12.5px;font-weight:700;color:var(--text);padding-top:7px;line-height:1.35}
.settings-row span[class^="u"]{font-size:11.5px;color:var(--text2)}
@media (max-width:900px){.settings-section .settings-row{grid-template-columns:1fr;gap:6px}}

/* ── Settings tabs on a phone ──────────────────────────────────────────────
   flex-wrap turned the tab strip into a staircase of overlapping chips at
   412px — each tab on its own line, indented, half sitting on the one below.
   One scrolling row instead: tabs keep their shape, you swipe to reach the
   rest, and the edge fade says there are more (Dale, 12 Aug 2026). */
@media(max-width:768px){
  .stg-tabbar{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
    margin:-14px -14px 16px;padding:10px 12px 0;
    -webkit-mask:linear-gradient(90deg,#000 calc(100% - 24px),transparent);
    -webkit-overflow-scrolling:touch}
  .stg-tabbar::-webkit-scrollbar{display:none}
  .stg-tab{flex:0 0 auto;padding:9px 14px;font-size:12px;white-space:nowrap}
}

/* GST / cash-sale row in the job modal. Sits under Payment; the note only appears
   when GST is off, so the normal case stays quiet (Dale, 12 Aug 2026). */
.d1gstrow{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:2px 0 4px}
.d1gstrow .d1c69fcs{margin:0}
/* .modal input{width:100%} sizes checkboxes too — pin this one back to its natural box. */
.d1gstrow input[type=checkbox]{width:auto;flex:0 0 auto;margin:0;accent-color:var(--brand-ink)}
.d1gstcash{font-size:11.5px;font-weight:600;color:var(--green);text-transform:none;letter-spacing:0}

/* Column headings for the scope rows. The name box carried only a placeholder, so an
   AI-filled row with an empty name read as an unexplained blank field — Dale asked what
   it was meant to be. Widths mirror the inputs: qty 54px, price 86px, ✕ 24px, name flexes.
   Uses .modal-scoped overrides because .modal label/uppercase would otherwise shout. */
.jmai-scope-hd{display:flex;gap:6px;padding:0 8px 4px;font-size:10px;font-weight:700;
  letter-spacing:.4px;text-transform:uppercase;color:var(--text3)}
.jmai-scope-hd .jsh-name{flex:1}
.jmai-scope-hd .jsh-qty{width:54px;flex:0 0 54px}
.jmai-scope-hd .jsh-price{width:86px;flex:0 0 86px}
.jmai-scope-hd .jsh-x{width:24px;flex:0 0 24px}
@media(max-width:768px){.jmai-scope-hd{display:none}}
/* No rows yet = no point showing column headings. */
.jmai-scope-hd:has(+ #jmai-scope-rows:empty){display:none}

/* ══ Floating action stack — phone ═════════════════════════════════════════
   The AI tab and the "+" quick-add both live bottom-right. Two problems, both
   visible on the Projects list: they sat ~6px apart so they read as one collided
   blob, and nothing reserved space for them, so they covered real content — the
   #057 row had its "$3,575 incl. GST" hidden underneath (Dale, 18 Aug 2026).

   Fixed by giving the stack real geometry and reserving the space ONCE on the
   scroll container every page shares, instead of per-page padding that only the
   job page ever got. */
@media (max-width:768px){
  :root{ --fab-size:56px; --fab-gap:12px; --fab-inset:16px; }
  body #qa-fab{
    bottom:calc(var(--fab-inset) + env(safe-area-inset-bottom));
    right:var(--fab-inset);
    width:var(--fab-size); height:var(--fab-size);
  }
  /* The assistant moves into the header on phones (Dale OKd 18 Aug 2026): a second
     floating button was clipping list content mid-scroll ($3,71… on #059) and no
     amount of bottom padding fixes the middle of a list. The corner belongs to +. */
  body #chat-fab{ display:none!important; }
  /* Reserve the stack's height on the shared scroller so nothing is ever hidden
     beneath it. 2 FABs + gaps + breathing room. */
  .content{
    padding-bottom:calc(var(--fab-inset)*2 + var(--fab-size) + 24px + env(safe-area-inset-bottom));
  }
  /* The job page scrolls in its own pane, so it needs the same reservation. */
  #jp-content, #page-job .jp-tab-body{
    padding-bottom:calc(var(--fab-inset)*2 + var(--fab-size) + 24px + env(safe-area-inset-bottom));
  }
}

/* ══ One gutter, phone ═════════════════════════════════════════════════════
   Measured on the dashboard at 412px: the greeting sat at 16px, the panels at
   10px, and the day strip at 0 left / 32 right — three different left edges and
   one asymmetric block on a single screen. That mismatch is most of why the app
   reads as "assembled" rather than designed (Dale, 18 Aug 2026).

   One variable now sets it. 10px was also simply too tight for a phone; 16px is
   the standard touch-UI margin and gives the content room to breathe. */
@media (max-width:768px){
  :root{ --gutter:16px; }
  .content{ padding-left:var(--gutter); padding-right:var(--gutter); }
  /* Panels inherit the container gutter — drop any extra of their own. */
  .dash-panel, .dash-cols, #dash-utility, .m-stack2{ margin-left:0; margin-right:0; }
}
@media (max-width:768px){
  /* The day strip carried an explicit width (380px = viewport - 2x gutter) while ALSO
     using -16px side margins to bleed. The two fought: it started flush left and
     stopped 32px short on the right. Let it size to its padded box and bleed evenly. */
  body #dash-daystrip{
    width:auto;
    /* Now it spans the full width it can hold 4+ counters, so it must scroll rather
       than clip a word mid-letter at the right edge. Same affordance as the settings
       tabs and the job tabs: one row, swipe for the rest, fade says there is more. */
    overflow-x:auto; scrollbar-width:none; -webkit-overflow-scrolling:touch;
    -webkit-mask:linear-gradient(90deg,#000 calc(100% - 28px),transparent);
  }
  body #dash-daystrip::-webkit-scrollbar{ display:none }
  /* The scroller needs a child WIDER than itself or there is nothing to scroll:
     the inner row was pinned to 100% and its counters simply spilled past the edge. */
  body #dash-daystrip > *{ flex-wrap:nowrap!important; width:max-content!important; min-width:100%; }
}

/* ══ Metric cards — phone ═══════════════════════════════════════════════════
   Were 138–155px each, so four of them ate ~590px and pushed the actual work
   below the fold. The 2026 pattern every serious dashboard uses (Linear, Stripe,
   Vercel) is: one primary number, one short label, one supporting figure. No prose.

   `.dkpi-sub` was pure restatement — "Active Projects" was followed by "jobs on the
   go right now", which tells you nothing you didn't just read. It goes. `.dkpi-ext`
   carries the only real second fact (the dollar value), so it stays and loses its
   apologetic brackets styling.

   Result: ~78px a card. Same information, a third of the height. (Dale, 18 Aug 2026) */
@media (max-width:768px){
  #page-dashboard .dkpi-card{
    padding:12px 30px 12px 14px;
    min-height:0;
    row-gap:0;
  }
  /* The restating sentence — gone. The card's label already says it. */
  #page-dashboard .dkpi-sub{ display:none; }
  /* The supporting figure becomes a real second line, not a footnote. */
  #page-dashboard .dkpi-ext{
    order:3; margin-top:5px; padding-top:0; border-top:0;
    font-size:12px; font-weight:600; color:var(--text2);
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis; width:100%;
  }
  #page-dashboard .dkpi-num{ font-size:24px; line-height:1.05; }
  #page-dashboard .dkpi-lbl{ font-size:10px; letter-spacing:.5px; margin-top:3px; }
  /* Cards in a row should be the same height whatever their content. */
  #page-dashboard .m-stack2{ align-items:stretch; }
  /* The chevron sat top-right, disconnected from a card that IS the tap target.
     Centre it so it reads as "this whole card opens". */
  #page-dashboard .dkpi-card > .dkpi-chev,
  #page-dashboard .dkpi-card::after{ top:50%; transform:translateY(-50%); }
}

/* ══ Project rows — phone ═══════════════════════════════════════════════════
   Were 128–172px each, so barely two jobs fit a screen. Every field sat on its
   OWN line: the job number had a whole row to itself, the name wrapped to two,
   and "incl. GST" took a third line under every dollar figure while the section
   header already says "(incl. GST where applicable)".

   Rebuilt as the two-line "comfortable" row the 2026 list standard describes
   (~64px + metadata): identity on line one, supporting facts on line two.

     #063  Perth Flying Squadron Yacht Club — …        $2,660.00
     Julie Abelha · note…                          ▓▓▓▓░░ 4/6

   No markup changed — `display:contents` promotes the existing wrappers' children
   into the card's grid, so every click handler, id and data binding still works
   exactly as before. (Dale, 18 Aug 2026) */
@media (max-width:768px){
  /* part-01.css:1527 pins this to display:block!important, so match it. */
  body .jm-card{
    display:grid!important;
    grid-template-columns:auto 1fr auto;
    grid-template-areas:
      "num  name  val"
      "cli  cli   prog";
    align-items:center;
    column-gap:8px; row-gap:3px;
    padding:11px 14px;
  }
  /* Wrappers step aside so their children become grid items of the card itself. */
  body .jm-card .jm-row1, .jm-card .jm-foot, .jm-card .jm-foot-l, .jm-card .jm-foot-r{ display:contents; }

  body .jm-card .jm-num { grid-area:num; font-size:12px; font-weight:700; }
  body .jm-card .jm-name{ grid-area:name; font-size:14px; line-height:1.25;
                     white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; }
  body .jm-card .jm-val { grid-area:val; font-size:15px; font-weight:700; text-align:right; white-space:nowrap; }
  /* Constant on every row, and already stated in the phase header — drop the line. */
  body .jm-card .jm-gst { display:none; }

  body .jm-card .jm-client{ grid-area:cli; font-size:12px; min-width:0;
                       white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  /* The status note joins the client line rather than claiming its own. */
  body .jm-card .jm-note{ grid-area:cli; justify-self:end; font-size:11.5px; opacity:.85;
                     max-width:52%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
                     border:0; padding:0; margin:0; }
  body .jm-card .jm-prog{ grid-area:prog; justify-self:end; }
}

/* Assistant in the header: phone-only — desktop keeps its right-edge tab. */
.ai-topbar-btn{ display:none; }
@media (max-width:768px){
  .ai-topbar-btn{ display:inline-flex; }
}

/* ══ One chip family (S5) ═══════════════════════════════════════════════════
   The "✨ Suggest" action sat inside the filter row styled as a form button —
   third treatment in one control group. It keeps its meaning (action, not
   filter) via the brand outline, but adopts the pill geometry so the row reads
   as one family. */
#ny-hd #dash-ai-refresh.btn{
  font-size:10.5px; font-weight:700; padding:3px 10px; border-radius:10px;
  border:1px solid var(--brand); background:transparent; color:var(--brand-ink);
  box-shadow:none; line-height:inherit;
}
@media (max-width:768px){
  #ny-hd #dash-ai-refresh.btn{ padding:4px 10px; }
}

/* ══ Projects: reclaim the runway (phone) ═══════════════════════════════════
   Above the first job: 48px tabs + 88px controls + 137px Due-Today widget +
   assorted gaps = first card at y=549. Tighten the widget and the gaps; the
   first card lands ~80px sooner. No control is removed. */
@media (max-width:768px){
  #upcoming-tasks-widget{ padding:9px 12px; margin:8px 0 10px; }
  /* The header ✕ was a full 40px form button; the overdue link row another 48.
     Together they doubled the widget. Keep the hit areas honest (>=28px) but stop
     them dictating row height. */
  #upcoming-tasks-widget .dv1rdft .btn{ min-height:40px; padding:1px 10px; display:inline-flex; align-items:center; }
  #upcoming-tasks-widget .dv1rdft{ margin-bottom:2px; }
  #upcoming-tasks-widget .d3mnxkh{ height:auto; min-height:40px; display:flex; align-items:center; padding:4px 2px; }
  #upcoming-tasks-widget .d1lqb8c3{ padding:2px 0; }
  #upcoming-tasks-list > *{ padding:3px 0; min-height:40px; align-items:center; }
  /* the job-name jump link inside a task row: full-height touch strip */
  #upcoming-tasks-list .d1fps1r7{ display:inline-flex; align-items:center; min-height:40px; }
  #jobs-list-controls{ margin-top:8px; row-gap:8px; }
  #jobs-toolbar-lane{ margin-bottom:0; }
  #page-jobs .page-content{ padding-top:10px; }
}

/* ══ Attention rows: the title owns the width (phone) ═══════════════════════
   "#057 Valerie — Vivid White Collapsib…" was ellipsised while a fixed-width
   "Actions ▾" button sat beside it. On a phone the standard resolution is the
   kebab: the menu survives, the words go. Same button, same handler, same
   dropdown — only the label is swapped, so nothing about how it works changes. */
@media (max-width:768px){
  .ny-card .ndg-actions{
    font-size:0;                                   /* hides "Actions ▾" */
    width:34px; height:34px; padding:0;
    display:inline-flex; align-items:center; justify-content:center;
    border-radius:50%;
  }
  .ny-card .ndg-actions::after{
    content:'⋯'; font-size:17px; font-weight:800; line-height:1;
    color:var(--text2); letter-spacing:1px;
  }
}

/* ══ Expenses on a phone ════════════════════════════════════════════════════
   Three space leaks per row: an empty description still printed "—" on its own
   line; the Bill/Bank badge claimed another; and a six-column desktop SORT
   header (122px tall once wrapped) sat above rows that render as cards, so its
   labels described nothing. Cards carry their own labels — the header goes; the
   month grouping already keeps the list in date order, and column sorting
   remains on desktop where the columns exist. */
@media (max-width:768px){
  #fin-exp-body .d1eed45v{ display:none; }
  #fin-exp-body .fin-exp-row{
    grid-template-areas:"proj proj amt" "date supp type" "desc desc desc"!important;
    padding:10px 12px!important; gap:2px 8px!important;
  }
  #fin-exp-body .fin-exp-row>div:nth-child(4):empty{ display:none; }
  #fin-exp-body .fin-exp-row>div:nth-child(5){ margin-top:0; justify-self:end; }
}

/* ══ Job page header — phone ════════════════════════════════════════════════
   679px of header before the first tab. Four cuts, no feature removed:
   1. The back button had a 50px row to itself and the phase chip another —
      share one line: chip rides right of the back button.
   2. `.jp-now-note` repeated what the card already says twice — the headline
      states the status ("Awaiting deposit") and the flag row states the next
      step; the note line was "<status> — next: <step>". Gone on phone.
   3. The action chips (Edit Job / Timeline / …) overflowed clipped, with no
      hint more existed. One scrolling row with the standard edge fade.
   4. General slack: gate-chip and section margins trimmed. */
@media (max-width:768px){
  /* Back button and phase chip share one line: the chip (its column is out of
     the title row anyway) pins to the right of the back-button row, and the
     title flows full-width beneath. A wrapping title cannot share a flex row
     with a floating button without hiding under it — absolute is the honest fix. */
  #page-job #jp-header{ position:relative; }
  #page-job .jp-backrow{ margin-bottom:6px; }
  #page-job .jp-backrow .btn{ height:38px; }
  #page-job .djezfpk{ position:absolute; top:16px; right:16px; }
  #page-job .jp-now-note{ display:none; }
  #page-job .jp-chiprow{
    flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none;
    -webkit-overflow-scrolling:touch;
    -webkit-mask:linear-gradient(90deg,#000 calc(100% - 28px),transparent);
  }
  #page-job .jp-chiprow::-webkit-scrollbar{ display:none; }
  #page-job .jp-chiprow .btn{ flex:0 0 auto; }
}
@media (max-width:768px){
  /* Separates the phase strip from the gates when they share a ROW (desktop).
     Stacked on a phone it floated as a lone 1px tick under the address. */
  #page-job .phase-divider{ display:none; }
}

/* Website Assistant KPIs: `minmax(155px,1fr)` fell to ONE column at 412px, so four
   full-width ~230px cards ate 930px before any conversation was visible. Two-up
   and compact, same as the dashboard metric cards. */
@media (max-width:768px){
  #wa-kpis{ grid-template-columns:1fr 1fr; gap:10px; }
  #wa-kpis .dkpi-card{ padding:12px 14px; }
  #wa-kpis .dkpi-val{ font-size:22px; }
}

/* Expenses filters fold behind one chip on a phone — the 4 selects were a
   ~180px wall above the money. The badge counts active filters so a narrowed
   list is always visibly narrowed. Desktop keeps the flat row. */
.fin-filter-n{display:inline-flex;align-items:center;justify-content:center;
  min-width:16px;height:16px;padding:0 4px;margin-left:5px;border-radius:8px;
  background:var(--brand);color:var(--white);font-size:10px;font-weight:800}
#fin-exp-filter-toggle.on{background:var(--surface2)}
@media (max-width:768px){
  #fin-exp-filter-toggle{display:inline-flex!important;align-items:center;height:36px}
  #fin-exp-filters{display:none;width:100%}
  #fin-exp-filters.open{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}
  #fin-exp-filters .fsel{width:100%;max-width:none}
}
@media (min-width:769px){
  #fin-exp-filters{display:contents}   /* desktop: as if the wrapper never existed */
}

/* Page-title explainer sentences ("Manage projects through quoting, design…").
   Premium apps don't caption their own pages — the nav item said where you are,
   and in-app Help (?) owns the teaching. Phones already hid these; now desktop
   matches. CSS-only, so one line brings them back if they're ever missed. */
.ph-info p{ display:none; }

/* Settings tabs: 35-37px tall — 3-5px under the 40px touch floor. */
.stg-tab{ min-height:40px; }

/* Due-Today tick: the 13px box rode bare in the row — now a 40px label strip is
   the target and the box is 18px inside it. .modal label rules don't reach here. */
.utw-tick{display:inline-flex;align-items:center;justify-content:center;
  min-width:40px;min-height:40px;margin:-8px 0;cursor:pointer}
.utw-tick input{width:18px;height:18px;margin:0;accent-color:var(--brand)}

/* ══ Item 2 — the NOW card answers all four questions ══════════════════════
   Status and next step were already there; "what's blocking" meant reading the
   gate strip and "where's the money" meant opening the Finance tab. Both now sit
   on the card, styled as quiet meta lines so the next step stays the loud one. */
@media (max-width:768px){
  .jp-now-blocked, .jp-now-money{
    margin-top:6px; display:flex; align-items:center; gap:8px;
    font-size:12px; color:var(--text2);
  }
  .jp-now-blocked{ color:var(--red); font-weight:600; }
  .jp-now-blocked span, .jp-now-money span{ flex:0 0 auto; opacity:.8 }
  .jp-now-money em, .jp-now-blocked em{ font-style:normal; min-width:0;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
  .jp-now-money{ font-variant-numeric:tabular-nums }
}

/* Tab group separators (item 2). A hairline + the group name, so the strip reads
   as three intentions rather than eleven equal buttons. */
.jp-tabsep{ display:inline-flex; align-items:center; gap:8px; align-self:stretch;
  padding:0 12px 0 4px; flex:0 0 auto; pointer-events:none; }
.jp-tabsep::before{ content:''; width:1px; align-self:center; height:16px;
  background:var(--border2); }
.jp-tabsep i{ font-style:normal; font-size:9px; font-weight:800; letter-spacing:.1em;
  text-transform:uppercase; color:var(--text3); align-self:center; }
@media (max-width:768px){
  /* On a phone the strip already scrolls — labels cost width the tabs need. */
  .jp-tabsep i{ display:none }
  .jp-tabsep{ padding:0 8px 0 2px }
  /* The chip row was still wrapping: the late-arriving buttons (Job Emails, Xero
     Quote) land after layout, and the earlier nowrap rule lost to the base
     `.jp-chiprow` flex-wrap. Pin it, and let it scroll like every other strip. */
  body #page-job .jp-chiprow{ flex-wrap:nowrap!important; overflow-x:auto;
    scrollbar-width:none; -webkit-overflow-scrolling:touch;
    -webkit-mask:linear-gradient(90deg,#000 calc(100% - 28px),transparent); }
  body #page-job .jp-chiprow::-webkit-scrollbar{ display:none }
  body #page-job .jp-chiprow .btn{ flex:0 0 auto }
}
/* Eleven tabs + two separators wrap to two rows at 1440px, which breaks the strip's
   underline and hides the grouping. One row that scrolls, same as the phone. */
.jp-tabs{ flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none;
  -webkit-overflow-scrolling:touch;
  -webkit-mask:linear-gradient(90deg,#000 calc(100% - 30px),transparent); }
.jp-tabs::-webkit-scrollbar{ display:none }
.jp-tabs .jp-tab{ flex:0 0 auto }

/* ══ Item 3 — Quotes: one page, five views ═════════════════════════════════
   The five sidebar entries were five views of one small dataset. Chips switch
   view in place; same chip family as the Today filters. */
.qp-chips{display:flex;gap:7px;flex-wrap:wrap;margin:0 0 12px}
.qp-chip{font-size:11.5px;font-weight:700;padding:6px 13px;border-radius:999px;
  border:1px solid var(--border);background:var(--surface2);color:var(--text2);
  cursor:pointer;transition:all var(--t);min-height:34px;display:inline-flex;
  align-items:center;gap:6px;white-space:nowrap}
.qp-chip:hover{color:var(--text)}
.qp-chip.on{background:var(--brand);border-color:var(--brand);color:var(--white)}
.qp-chip-n{font-size:10px;font-weight:800;font-variant-numeric:tabular-nums;opacity:.85}
.qp-chip-n:empty{display:none}
@media (max-width:768px){
  .qp-chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
    -webkit-mask:linear-gradient(90deg,#000 calc(100% - 24px),transparent)}
  .qp-chips::-webkit-scrollbar{display:none}
  .qp-chip{flex:0 0 auto}
}

/* Item 4 — settings sub-nav groups. Labels only; every button keeps its id. */
.settings-navgroup{font-size:9.5px;font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;color:var(--text3);padding:14px 12px 4px}
.settings-navgroup:first-child{padding-top:4px}
@media (max-width:768px){ .settings-navgroup{display:none} }

/* Item 5 — the register kebab. One control, every register. */
.reg-kebab{width:32px;height:32px;border-radius:50%;border:1px solid var(--border);
  background:var(--surface);color:var(--text2);font-size:15px;font-weight:800;
  line-height:1;letter-spacing:1px;cursor:pointer;display:inline-flex;
  align-items:center;justify-content:center;flex:0 0 auto;transition:all var(--t)}
.reg-kebab:hover{background:var(--surface2);color:var(--text)}
@media (max-width:768px){ .reg-kebab{width:40px;height:40px} }

/* Item 6 — Finance Overview: say each number once. The quick-link cards repeated
   the tiles above them; the tiles are already clickable to the same pages. */
/* components.css loads LAST, so a single class ties and loses on source order.
   Doubled selector (0,2,0) — the same convention the generated sheet uses. */
.fov-quicklinks.fov-quicklinks{display:none}

/* Item 8 — nav entries whose content moved into another surface. Hidden from the
   sidebar, kept in the DOM: navTo() resolves pages through these elements, so
   every deep link and in-app link keeps working. */
.sb-item.sb-merged{display:none}
