/* ============================================================================
   fm-theme.css — the ONE source for F/m tokens and shared component styles
   (2026-09-19). Linked LAST in <head> on every page so it wins the cascade over
   a page's inline rules: change a token here and every tool follows. The audit
   (scripts/site_audit.py) fails a page that does not link it. Extend here; do
   not restyle components per page.

   How the rules are written
   - IDENTITY (colour, type, border, radius, button and chiclet padding) is set
     with `html body …` so it beats any page-inline rule: a button, a chiclet, a
     readout card, a chart panel and a data table look the same on every tool.
   - DENSITY and LAYOUT that a page may legitimately tune (a table's min-width and
     cell padding, a readout cell's flex-basis, a chart's height) are given as
     `:where()` defaults: zero specificity, so a page rule still wins.
   - ICONS are drawn here, once, as CSS masks (`data-act` on an action button,
     `data-ico` anywhere else). Pages and scripts never put a glyph character in
     the label: the label is words, the icon is an attribute.
   ========================================================================== */
html:root{
  --fm-navy:#003366; --fm-navy-deep:#00182B; --fm-red:#BB3D32; --fm-flame:#D04438; --fm-electric:#FB4D3D;
  --fm-green:#2A7D4F; --fm-steel:#4D7A9D; --fm-gray:#9AA9B5; --fm-gold:#D9A838; --fm-mute:#758D99;
  --fm-paper:#FCFCFD; --fm-panel:#FFFFFF; --fm-line:#E8EAED; --fm-ice:#EAF3FA; --fm-row:#DEEDF8; --fm-sky:#9FC0DC;
  --fm-head:#0e2236; --fm-head-line:#1c3450; --fm-zebra:#dfeaf3;
  --fm-mute-text:#54707F;                             /* muted TEXT: 5.25:1 on white, 4.67:1 on ice (AA); --fm-mute stays for lines and fills */
  --fm-steel-text:#3E6D99; --fm-ink-soft:#40566A;     /* design D (2026-09-26): tab text on ice (4.9:1) and body copy (7.4:1 on white) */
  --fm-ice-line:#CDDFEE;                               /* design D: the rule and borders on the light-blue strip */
  --fm-night:#002649;                                  /* the phone menu's gradient foot (IT's fminvest.com nav reference, 2026-10-23) */
  --fm-oxford:#002147;                                 /* Oxford blue: the utility bar (Chris, 2026-10-06; the usual hex, to confirm with him) */
  --fm-hero-art:none;                                   /* a collection's hero graphic; fm-shell.js sets it per page */
  --fm-radius:12px; --fm-radius-sm:9px; --fm-shadow:0 1px 2px rgba(11,31,58,.06),0 8px 24px rgba(11,31,58,.06);
  --fm-font:"Aaux Next","Source Sans 3",system-ui,sans-serif; --fm-mono:"Roboto Mono",ui-monospace,monospace;
  /* legacy per-page names resolve to the same values */
  --navy:var(--fm-navy); --red:var(--fm-red); --warm-red:var(--fm-flame); --panel:var(--fm-panel);
  --line:var(--fm-line); --mute:var(--fm-mute-text); --ice:var(--fm-ice); --electric:var(--fm-electric);
  --teal:var(--fm-green); --gold:var(--fm-gold); --shadow:var(--fm-shadow);
  /* icons (SVG masks; drawn in the current text colour) */
  --fm-ico-pdf:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5'/%3E%3Cpath d='M12 11v6'/%3E%3Cpath d='M9.5 14.5 12 17l2.5-2.5'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-xlsx:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Cpath d='M3 9.5h18M3 14.5h18M9.5 4v16M15 4v16'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-share:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6'/%3E%3Cpath d='M20 4l-9 9'/%3E%3Cpath d='M18 14v4a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-download:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11'/%3E%3Cpath d='M7.5 11 12 15.5 16.5 11'/%3E%3Cpath d='M5 20h14'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-copy:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V6a2 2 0 0 1 2-2h9'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-play:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M7 4.5v15l12-7.5z'/%3E%3C/svg%3E");
  --fm-ico-pause:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M7 5h3.6v14H7zM13.4 5H17v14h-3.6z'/%3E%3C/svg%3E");
  --fm-ico-refresh:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 12a8 8 0 1 1-2.4-5.7'/%3E%3Cpath d='M20 4v5h-5'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-reset:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12a8 8 0 1 0 2.4-5.7'/%3E%3Cpath d='M4 4v5h5'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-swap:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8h15'/%3E%3Cpath d='M16 5l3 3-3 3'/%3E%3Cpath d='M20 16H5'/%3E%3Cpath d='M8 13l-3 3 3 3'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-up:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12 6l7 11H5z'/%3E%3C/svg%3E");
  --fm-ico-down:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12 18 5 7h14z'/%3E%3C/svg%3E");
  --fm-ico-right:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M18 12 7 19V5z'/%3E%3C/svg%3E");
  --fm-ico-left:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M6 12l11-7v14z'/%3E%3C/svg%3E");
  --fm-ico-warn:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4l9 16H3z'/%3E%3Cpath d='M12 10v5'/%3E%3Cpath d='M12 17.6v.1'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-done:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.5'/%3E%3Cpath d='M8.5 12.2l2.4 2.4 4.6-5'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-plus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/g%3E%3C/svg%3E");
  --fm-ico-flat:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M5 10.4h14v3.2H5z'/%3E%3C/svg%3E");
}

/* No graph paper (Alex, 2026-09-19). The grid IT painted on <html> in fm-ui.css is the LABS
   skin, and nothing is being built there: every tool and utility is an Investor Tool on the
   plain fminvest.com page surface. This rule wins because the theme is linked last; a page
   that ever needs the labs surface opts in with <html data-fm-skin="labs">. */
html:root:not([data-fm-skin="labs"]){background-image:none;background-color:var(--fm-page,#FCFCFD)}
html:root{--fm-page:#FCFCFD}

/* ------------------------------------------------------------------ icons
   <button class="btn" data-act="pdf">Export to PDF</button>   action buttons
   <button class="btn" data-ico="play">Play</button>           any other control
   <span data-ico="warn"></span>                                a bare icon        */
/* Only the NAMED icon actions draw an icon: the manage screens use data-act="tool-edit" and the like as
   their own JS hooks, and an unknown value has no mask, which painted a solid square (fixed 2026-09-19). */
html body :is([data-act="pdf"],[data-act="xlsx"],[data-act="share"],[data-act="csv"],[data-act="png"],[data-act="download"],[data-act="copy"])::before,
html body [data-ico]::before{content:"";display:inline-block;flex:none;width:1.08em;height:1.08em;
  vertical-align:-.17em;margin-right:.45em;background-color:currentColor;
  -webkit-mask:var(--fm-ico) center/contain no-repeat;mask:var(--fm-ico) center/contain no-repeat}
html body .btn[data-act]::before,html body .btn[data-ico]::before,html body [data-ico]:empty::before{margin-right:0}
[data-act="pdf"]{--fm-ico:var(--fm-ico-pdf)} [data-act="xlsx"]{--fm-ico:var(--fm-ico-xlsx)} [data-act="share"]{--fm-ico:var(--fm-ico-share)}
[data-act="csv"],[data-act="png"],[data-act="download"]{--fm-ico:var(--fm-ico-download)} [data-act="copy"]{--fm-ico:var(--fm-ico-copy)}
[data-ico="pdf"]{--fm-ico:var(--fm-ico-pdf)} [data-ico="xlsx"]{--fm-ico:var(--fm-ico-xlsx)} [data-ico="share"]{--fm-ico:var(--fm-ico-share)}
[data-ico="download"]{--fm-ico:var(--fm-ico-download)} [data-ico="copy"]{--fm-ico:var(--fm-ico-copy)} [data-ico="close"]{--fm-ico:var(--fm-ico-close)}
[data-ico="play"]{--fm-ico:var(--fm-ico-play)} [data-ico="pause"]{--fm-ico:var(--fm-ico-pause)} [data-ico="refresh"]{--fm-ico:var(--fm-ico-refresh)}
[data-ico="reset"]{--fm-ico:var(--fm-ico-reset)} [data-ico="swap"]{--fm-ico:var(--fm-ico-swap)} [data-ico="warn"]{--fm-ico:var(--fm-ico-warn)}
[data-ico="done"]{--fm-ico:var(--fm-ico-done)} [data-ico="plus"]{--fm-ico:var(--fm-ico-plus)} [data-ico="flat"]{--fm-ico:var(--fm-ico-flat)}
[data-ico="up"]{--fm-ico:var(--fm-ico-up)} [data-ico="down"]{--fm-ico:var(--fm-ico-down)} [data-ico="right"]{--fm-ico:var(--fm-ico-right)} [data-ico="left"]{--fm-ico:var(--fm-ico-left)}

/* ---------------------------------------------------------------- buttons */
html body .btn{appearance:none;-webkit-appearance:none;cursor:pointer;font-family:inherit;font-size:13px;font-weight:600;
  border:1px solid var(--fm-line);background:var(--fm-panel);color:var(--fm-navy);border-radius:var(--fm-radius-sm);padding:9px 14px;
  text-decoration:none}
html body .btn:hover{border-color:var(--fm-navy)}
html body .btn:focus-visible{outline:2px solid var(--fm-red);outline-offset:2px}
html body .btn.primary{background:var(--fm-navy);color:#fff;border-color:var(--fm-navy)}
html body .btn.sm{font-size:11px;padding:5px 10px}              /* compact button (inside a heading or a control row) */
html body .btn.end{float:right}
html body .btn[data-act],html body .btn[data-ico]{display:inline-flex;align-items:center;justify-content:center;gap:7px}
:where(.btn):disabled{opacity:.45;cursor:default}

/* the actions row under a tool's data: Export to PDF, Export to Excel, Share (in that order) */
html body .fm-actions{display:flex;justify-content:center;align-items:center;gap:10px;flex-wrap:wrap}
:where(.fm-actions){margin:14px 0 4px}
html body .fm-actions .btn,html body .fm-actions > button,html body .fm-actions > a.btn{appearance:none;-webkit-appearance:none;cursor:pointer;font-family:inherit;
  font-size:13px;font-weight:600;color:var(--fm-navy);background:var(--fm-panel);border:1px solid var(--fm-line);
  border-radius:var(--fm-radius-sm);padding:9px 14px;display:inline-flex;align-items:center;justify-content:center;gap:7px}
html body .fm-actions .btn:hover,html body .fm-actions > button:hover{border-color:var(--fm-navy)}
html body .fm-actions .btn[data-act]{background:var(--fm-panel);color:var(--fm-navy);border-color:var(--fm-line)}
html body .fm-actions .btn[data-act]:hover{border-color:var(--fm-navy)}
html body .fm-actions .btn.btn-share{background:var(--fm-flame);border-color:var(--fm-flame);color:#fff}
html body .fm-actions .btn.btn-share:hover{background:var(--fm-flame);border-color:var(--fm-flame);color:#fff}

/* ------------------------------------------------ controls: label + chiclets */
html body .ctl label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--fm-mute-text);margin-bottom:7px;font-weight:600}
html body .seg{display:inline-flex;border:1px solid var(--fm-line);border-radius:10px;overflow:hidden;background:var(--fm-panel);flex-wrap:wrap}
html body .seg button{appearance:none;-webkit-appearance:none;border:0;background:none;cursor:pointer;padding:8px 13px;font-family:inherit;
  font-size:13px;font-weight:600;color:var(--fm-mute-text)}
html body .seg button[aria-pressed="true"]{background:var(--fm-navy);color:#fff}
:where(.controls){display:flex;flex-wrap:wrap;gap:22px;align-items:flex-end;margin:14px 0}
/* a checkbox row inside a control:  <div class="ctl"><label>Field name</label><label class="chk"><input type="checkbox"> Words</label></div>
   It takes the box metrics of a chiclet row / .fm-ctl-input (8px block padding, a 1px border, 13px/600 type) so it sits on the
   same line as the controls beside it, and it is sentence case: the caps-and-tracking above are for the field name only. */
html body .ctl label.chk{display:inline-flex;align-items:center;gap:8px;margin:0;padding:8px 0;border:1px solid transparent;
  font-size:13px;font-weight:600;line-height:normal;text-transform:none;letter-spacing:0;color:var(--fm-navy);cursor:pointer}
html body .ctl label.chk input{flex:none;margin:0;accent-color:var(--fm-navy);cursor:pointer}
html body .ctl label.chk input:focus-visible{outline:2px solid var(--fm-red);outline-offset:2px}

/* ------------------------------------------- readout: ONE long card of cells */
html body .cards{display:flex;flex-wrap:wrap;background:var(--fm-panel);border:1px solid var(--fm-line);border-radius:var(--fm-radius);
  box-shadow:var(--fm-shadow);padding:4px 2px}
:where(.cards){margin-bottom:16px}
html body .cards > .card{background:none;border:0;border-left:1px solid var(--fm-line);border-radius:0;box-shadow:none;margin:6px 0}
html body .cards > .card:first-child{border-left:0}
:where(.cards) > :where(.card){flex:1 1 150px;padding:10px 16px}
html body .cards .card .k,html body .stat .k{font-size:10.5px;text-transform:uppercase;color:var(--fm-mute-text);font-weight:600}
:where(.cards .card .k){letter-spacing:.1em} :where(.stat .k){letter-spacing:.12em}
html body .cards .card .v{font-family:var(--fm-mono);font-weight:600;font-size:20px;color:var(--fm-navy)}
html body .stat .v{font-family:var(--fm-mono);font-weight:600;font-size:18px;color:var(--fm-navy)}
html body .cards .card .s{font-size:11px;color:var(--fm-mute-text)}
html body .stat.ff{margin-left:auto;text-align:right}
html body .readout{background:var(--fm-panel);border:1px solid var(--fm-line);border-radius:var(--fm-radius);box-shadow:var(--fm-shadow)}
:where(.readout){display:flex;flex-wrap:wrap;gap:24px;padding:14px 18px;margin-bottom:16px}

/* ----------------------------------------------------- chart panel + captions */
html body .chartbox{background:var(--fm-panel);border:1px solid var(--fm-line);border-radius:var(--fm-radius);box-shadow:var(--fm-shadow)}
:where(.chartbox){padding:16px 14px 8px;margin-bottom:16px}
html body .chartbox h3{margin:0 0 4px;font-size:14px;color:var(--fm-navy)}
html body .chartbox .sub{font-size:11.5px;color:var(--fm-mute-text)}
:where(.chartbox .sub){margin:0 0 8px}
html body .axislabel{font-size:11px;color:var(--fm-mute-text)}
:where(.axislabel){margin:8px 2px 14px}
html body .axislabel b{color:var(--fm-navy)}
html body .legend{color:var(--fm-mute-text)}

/* ------------------------------------------------------------- data tables */
html body .gridwrap{overflow-x:auto;border:1px solid var(--fm-line);border-radius:var(--fm-radius);background:var(--fm-panel);box-shadow:var(--fm-shadow)}
:where(.gridwrap){margin-bottom:16px}
html body table.fmtab{border-collapse:collapse;width:100%}
:where(table.fmtab){font-size:13.5px;min-width:560px}
html body table.fmtab caption{caption-side:top;text-align:left;color:var(--fm-mute-text)}
:where(table.fmtab caption){padding:14px 16px 6px;font-size:13px}
/* A caption that stays whole in a scrolling grid on a phone (2026-10-02, phase 3; plan 1c L6: "captions clipped in
   scroll boxes"): the caption is as wide as the table, so at 390px its end sat off-screen. Opt in by wrapping the
   caption's words, <caption><span class="fm-cap-fit">...</span></caption>: the words wrap to the visible width and
   stay put while the grid scrolls. New and opt-in; no other rule changes. */
html body .gridwrap:has(.fm-cap-fit){container-type:inline-size}
html body .fm-cap-fit{position:sticky;left:16px;display:block;max-width:calc(100cqw - 32px);white-space:normal}
/* a phone's scrolling grid keeps its caption in view (2026-10-02, Phase 3, 1c L6: a caption as wide as its 560px table
   ran off the 344px box at 390px and was read only by scrolling): it wraps to the box and stays put while the grid
   scrolls. Wider screens, where the table fits, are untouched. */
@media (max-width:700px){html body .gridwrap>table.fmtab>caption{position:sticky;left:0;max-width:calc(100vw - 46px);box-sizing:border-box}}
html body .fmtab thead th{background:var(--fm-head);font-weight:600;color:#fff;border-right:1px solid var(--fm-head-line);text-align:center}
:where(.fmtab thead th){font-size:12.5px;padding:11px 12px}
html body .fmtab thead th.corner{text-align:center;vertical-align:middle;background:var(--fm-ice);color:var(--fm-navy);font-size:11.5px;
  text-transform:uppercase;letter-spacing:.06em;font-weight:700}
html body .fmtab tbody th{background:var(--fm-ice);text-align:left;font-weight:600;color:var(--fm-navy-deep);
  border-right:1px solid var(--fm-line);border-bottom:1px solid var(--fm-line)}
:where(.fmtab tbody th){padding:10px 16px;white-space:nowrap}
html body .fmtab tbody tr:nth-child(even) th{background:var(--fm-zebra)}
html body .fmtab td{font-weight:500;color:var(--fm-navy-deep);border-bottom:1px solid var(--fm-line);border-right:1px solid var(--fm-line);
  text-align:center;font-variant-numeric:tabular-nums}
:where(.fmtab td){padding:10px 12px}
html body .fmtab td b{font-weight:700}
/* Tables on a phone (2026-10-03, next version 1c L6, "enough columns at 390px"): the 560px floor and the one-line row
   labels left the label column most of a 346px box, so only the first data column (derby: none) showed without
   scrolling. Under 700px the floor goes, row labels wrap at spaces (no narrower than an ISO date in parentheses, which
   Chrome would otherwise break at a hyphen), data cells keep their values on one line (a date or a range never splits)
   while a left-aligned cell (a sentence) or one marked .fm-wrap still wraps, cells pad less, and a row label's tag
   (.fm-th-tag, e.g. derby's "lowest error on shared windows") takes its own line without its separator. Measured on
   the 58 tools with tables (scratch probe, 390px): the median table shows 4 columns of 5 or more instead of 2 or 3, and
   fewer cells split mid-date than before. These beat the copies of the old
   table rules many pages still carry (table.fmtab{min-width:560px}, .fmtab tbody th{white-space:nowrap}); a page's
   rule for one table by id still wins, and a table too wide for the box still scrolls in its .gridwrap.
   A cell that spans columns (td[colspan]) is a message or a divider, never one value, so it wraps too (repair pass
   2026-10-03: derby's "None scored" sentence printed as one 780px line in a 346px box). A centered one-column cell
   that holds a phrase, not a value, opts in with class fm-wrap (dials' trigger and as-of, payroll-revisions' flag).
   The one-line data cells are the tools' rule only (Phase 8, 2026-10-04): an Admin screen (html.fm-staff, fm-site.js:
   the hub, the feeds board, every manage page) lists names, files and sentences in its cells, and nowrap made those
   tables several screens wide on a phone; there every cell wraps. */
@media (max-width:700px){
  html body table.fmtab{min-width:0}
  html body .fmtab tbody th{white-space:normal;padding:8px 10px;min-width:calc(12.5ch + 20px)}
  html body .fmtab td{padding:8px 8px;white-space:nowrap}
  html.fm-staff body .fmtab td{white-space:normal;overflow-wrap:anywhere}
  html body .fmtab td:is([style*="text-align:left"],[style*="text-align: left"],.left,.l,.fm-wrap){white-space:normal;min-width:calc(10.5ch + 16px)}
  html body .fmtab td[colspan]{white-space:normal}
  html body .fmtab td > div{white-space:normal}
  html body .fmtab thead th{padding:9px 8px}
  html body .fmtab .fm-th-tag{display:block;font-size:11.5px;line-height:1.3;margin-top:2px}
  html body .fmtab .fm-th-tag .fm-th-sep{display:none}
  /* a table wider than its box scrolls in it (.gridwrap): the row labels stay in view (later list, Phase 8, 2026-10-04:
     autopsy, rates-vol, term-premium, ibond, seasonality's grid, cpi-pce-categories' table, 120 to 370px wider than a
     390px phone's box). The label column and the header's corner cell stick to the box's left edge on their own opaque
     fills; the header row scrolls with its columns, so each heading stays over its numbers. */
  html body .gridwrap table.fmtab tbody th:first-child,
  html body .gridwrap table.fmtab thead th:first-child{position:sticky;left:0;z-index:1}
}
/* TABLE ALIGNMENT (2026-10-09, Alex's decision 7: "Tables site-wide: text left, numbers centered, headers follow their
   column, exports match the screen; the nominal rates heat map unchanged"; docs/style-guide.md "Table alignment").
   FmUi.tableAlign (assets/fm-ui.js) reads what each column of a table.fmtab holds and marks its cells: a text column
   data-fm-al="l" (left), a number column "c" (centered), the row-label column included, and each one-column heading
   with its column's mark (the corner too); a heading spanning several columns keeps the centering above. These rules
   come after every table rule here, so they win over the theme's row-label and corner defaults and over the old copies
   of the table rules many pages still carry; a heat matrix and a table marked data-fm-align="own" carry no marks and
   keep their own (the nominal rates heat map: TABLE_ALIGN_OWN in scripts/site_audit.py). */
html body table[data-fm-al-on] :is(th,td)[data-fm-al="l"]{text-align:left}
html body table[data-fm-al-on] :is(th,td)[data-fm-al="c"]{text-align:center}
/* click-to-sort indicator (assets/fm-sort.js sets the class); an icon, not a glyph */
html body table.fmtab thead th.fm-s-asc::after,html body table.fmtab thead th.fm-s-desc::after{content:"";display:inline-block;width:8px;height:8px;
  margin-left:5px;opacity:.9;background-color:currentColor;-webkit-mask:var(--fm-ico-up) center/contain no-repeat;mask:var(--fm-ico-up) center/contain no-repeat}
html body table.fmtab thead th.fm-s-desc::after{-webkit-mask-image:var(--fm-ico-down);mask-image:var(--fm-ico-down)}

/* ------------------------------------------------------------ status + notes */
html body .asof{font-size:13px;color:var(--fm-mute-text);font-weight:600}
:where(.asof){margin:16px 0 8px}
html body .asof .live{color:var(--fm-green);font-weight:700}
html body .asof .offline{color:var(--fm-flame);font-weight:700}
/* GLYPHS (2026-10-02, next version 1b-A 2 and 1c L2; scripts/check_glyphs.py). The data line's dot is drawn, never
   typed: U+25CF is not in Aaux Next, so a typed dot fell back to whatever face the machine had, or a box. The span is
   empty (FmUi.freshBadge / setBadge write it; a page's own offline line uses the same span) and takes its color from
   the text it leads. */
.fm-fresh-dot{display:inline-block;width:.56em;height:.56em;border-radius:50%;background:currentColor;
  margin-right:.42em;vertical-align:.04em;flex:none}
/* Mathematics prints in STIX Two Math (self-hosted, OFL, fonts/OFL-STIXTwoMath.txt), the one face here with tau,
   sigma, Sigma, arrows and the rest: every <math>, and every formula pill, which FmUi.mathPills renders through MathML */
@font-face{font-family:"STIX Two Math";src:url("../fonts/STIXTwoMath-Regular.woff2") format("woff2");font-display:swap}
math,code.fm-formula math,.fm-d-pill math{font-family:"STIX Two Math",math;font-style:normal}
code.fm-formula math,.fm-d-pill math,.eqs math{font-size:1.12em;line-height:1}
/* a formula pill never widens a phone's page: MathML does not break across lines, so a pill wider than its column (the
   Real Yield to Real Return fit, 2px at 390px) takes a line of its own and scrolls inside its box (Phase 8, 2026-10-04) */
@media (max-width:700px){html body code.fm-formula{display:inline-block;max-width:100%;overflow-x:auto;overflow-y:hidden;vertical-align:bottom}}
/* quiet explanatory note (replaces the retired yellow flag boxes; .demo-flag is kept only so a stray one can never be yellow again) */
.tool-note,html body .demo-flag{display:block;color:var(--fm-mute-text);font-size:12.5px;line-height:1.5;margin:0 0 12px;max-width:95ch;
  background:none;border:0;padding:0;font-weight:400}

/* ------------------------------------------------------------- share dialog */
/* THE SHARE SWITCH (compliance, 2026-10-02): every Share control shows only while the catalog's site.share is on
   (fm-site.js puts fm-share-on on <html> once the publication says so). Off, or before the catalog is in, none is
   drawn and none keeps its room: the export row closes up, the tool row too, and no box reserves the pill's corner
   (fm-shell-d.css keeps that room only under fm-share-on). Export to PDF and Export to Excel are not touched. */
html:not(.fm-share-on) .fm-share-pill,
html:not(.fm-share-on) .fm-actions .btn-share,
html:not(.fm-share-on) .fm-d-act[data-d="share"],
html:not(.fm-share-on) .fm-share-overlay{display:none!important}
/* .fm-share-ctl (2026-10-02): a Share control or section on a page that is not a tool (the deck presenter's "Share this
   page", the Widget Studio's placement mockups), hidden by the same switch */
html:not(.fm-share-on) .fm-share-ctl{display:none!important}
html body .fm-share-pill{background:var(--fm-flame);display:inline-flex;align-items:center;gap:5px}
html body .fm-share-pill::before{margin-right:0}
html body .fm-share-x{font-size:16px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--fm-mute-text)}
html body .fm-share-x:hover{color:var(--fm-navy)}

/* ---------------------------------------------------------------- CMS-published notices
   Site-wide notices and per-tool custom disclaimers from the Compliance Manager, printed at the
   end of a tool page's footer in the same small legal type as the page's own notices. */
html body .fm-notices{margin-top:12px;padding-top:12px;border-top:1px solid var(--fm-line)}
/* inside the footer's Disclaimers block (2026-09-26) the CMS notices continue the list: the block already has its rule */
html body .fm-disclaimers .fm-notices{margin-top:0;padding-top:0;border-top:0}
html body .fm-notices p,
html body .fm-notices > div[data-rich="1"]{margin:0 0 8px;font-size:12px;line-height:1.55;color:var(--fm-mute-text)}
html body .fm-notices b{color:var(--fm-navy);font-weight:600}

/* ---------------------------------------------------------------- generated footer parts (2026-09-26)
   scripts/build_footers.py writes two parts of every tool page's footer from the Admin stores: the last lines of
   Methods & Data ("Calculations used", each calculation a link to its Methods entry; "Data sources") and the
   Disclaimers block (a paragraph of the tool's own notices, then one of the data-source and firm notices, each
   notice a span). They read as the footer's own paragraphs: same small type and color, the lead-in label bold like
   a Method paragraph's, the calculation links underlined in the footer's navy at the text's own weight (a list of
   links, lighter than the one Methods & Data link). Every tool page's footer is light (the review of 2026-10-06 turned
   the last dark ones, the two PCE trends pages' footer.site, light), so no footer keeps white links. */
html body footer .fm-gen-calcs a{color:var(--fm-navy);font-weight:inherit;text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}
html body footer .fm-gen-calcs a:hover{color:var(--fm-red)}
html body footer .fm-notice-group .fm-notice{display:inline}

/* ---------------------------------------------------------------- formatting in a notice (2026-10-12)
   Compliance may format a notice: bold, italic, underline, a line break, a link, a bulleted or numbered list
   (scripts/fm_rich.py, profile "notice"). scripts/build_footers.py writes a formatted notice inside its .fm-notice
   element marked data-rich="1" (notice_element); assets/fm-site.js draws a formatted site-wide or custom notice the
   same way inside .fm-notices (drawNotices). A notice that holds a list is a <div class="fm-notice"> and its paragraph
   a <div class="fm-notice-group"> (a list cannot sit inside a <p>): that div reads as the footer paragraph it stands
   in for (the pages' own "footer p" rule: 11.5px, the muted text color, 10px below, 980px wide), and the notice stays
   inline, so the paragraph runs on around its list. A list indents and wraps inside the footer; a link is underlined
   in the text's own color; bold is bold (the selectors repeat a class so they outrank fm-shell-d.css's
   "footer p b:not(:first-child)", which reads inline emphasis in Methods & Data as ordinary words). */
html body footer div.fm-notice-group{margin:0 0 10px;max-width:980px;font-size:11.5px;color:var(--fm-mute-text)}
html body .fm-notice.fm-notice[data-rich="1"] b,
html body .fm-notices.fm-notices [data-rich="1"] b{color:inherit;font-weight:700}
html body .fm-notices.fm-notices [data-rich="1"] > b:first-child{color:var(--fm-navy);font-weight:600}   /* its name */
html body .fm-notice[data-rich="1"] i,
html body .fm-notices [data-rich="1"] i{font-style:italic}
html body .fm-notice[data-rich="1"] u,
html body .fm-notices [data-rich="1"] u{text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}
html body .fm-notice.fm-notice[data-rich="1"] a,
html body .fm-notices.fm-notices [data-rich="1"] a{color:inherit;font-weight:inherit;text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px;overflow-wrap:anywhere}
html body .fm-notice.fm-notice[data-rich="1"] a:hover,
html body .fm-notices.fm-notices [data-rich="1"] a:hover{color:var(--fm-navy)}
html body .fm-notice.fm-notice[data-rich="1"] a:focus-visible,
html body .fm-notices.fm-notices [data-rich="1"] a:focus-visible{outline:2px solid var(--fm-navy);outline-offset:2px;border-radius:2px}
html body .fm-notice[data-rich="1"] ul,
html body .fm-notice[data-rich="1"] ol,
html body .fm-notices [data-rich="1"] ul,
html body .fm-notices [data-rich="1"] ol{display:block;margin:4px 0 6px;padding:0 0 0 20px;list-style-position:outside;font:inherit;color:inherit}
html body .fm-notice[data-rich="1"] ul,
html body .fm-notices [data-rich="1"] ul{list-style-type:disc}
html body .fm-notice[data-rich="1"] ol,
html body .fm-notices [data-rich="1"] ol{list-style-type:decimal}
html body .fm-notice[data-rich="1"] li,
html body .fm-notices [data-rich="1"] li{display:list-item;margin:0 0 2px;padding:0;font:inherit;color:inherit}

/* ---------------------------------------------------------------- small shared fixes (2026-09-20)
   The hidden attribute always wins: the identity rules above set display on .btn, .tool-note and
   friends with html-body specificity, which silently defeated [hidden]. A segmented control placed
   inside an actions row (a format choice beside a button) keeps its own look: the actions-row button
   rule now applies to the row's DIRECT children only. One house progress bar. */
html body [hidden]{display:none!important}
html body progress{appearance:none;-webkit-appearance:none;height:6px;width:160px;border:0;border-radius:6px;overflow:hidden;background:var(--fm-line);vertical-align:middle}
html body progress::-webkit-progress-bar{background:var(--fm-line)}
html body progress::-webkit-progress-value{background:var(--fm-navy)}
html body progress::-moz-progress-bar{background:var(--fm-navy)}

/* ---- moving between tools (2026-09-20) --------------------------------------------------------
   Every tool is a page of its own, so a tab change is a navigation. Browsers that support cross-document
   view transitions cross-fade the tool body while the site header holds still; the rest navigate exactly
   as before. Nothing is prerendered (see fm-shell.js prefetch). Reduced motion: no transition at all. */
@view-transition { navigation: auto; }
header.fmnav { view-transition-name: fm-nav; }
::view-transition-group(fm-nav) { animation-duration: 0s; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: .18s; }
@media (prefers-reduced-motion: reduce) {
  @view-transition { navigation: none; }
}

/* ---- THE FIRST-PAINT HOLD (later list, design D 3; Phase 8, 2026-10-04) ------------------------
   fm-site.js loads deferred, so its hold of the tool frame's room above the title (fm-shell-early) starts after the first
   paint: a frame or more (about seven on a slow link, one on a fast one) showed the title at the top, then 150px lower.
   This sheet blocks rendering, so it holds design D's room (179px, 175px on a phone: fm-shell-d.css) from the first paint on
   every page that loads the share module in its head (the tool pages; home.html and creator.html opt out with
   data-fm-site-page), until the frame is in (fm-shell-pending, fm-shell-on), fm-site.js's own hold takes over
   (fm-shell-early, !important), or no frame comes (fm-shell-off: an embed, a site page, a page the catalog does not
   frame, fm-site.js and fm-shell.js) or the design is the legacy one (fm-legacy). */
html:has(> head > script[src$="assets/fm-share.js"]):not([data-fm-site-page]):not(.fm-legacy):not(.fm-shell-off):not(.fm-shell-pending):not(.fm-shell-on) body .wrap:has(> h1.page-title){padding-top:179px}
@media (max-width:700px){
  html:has(> head > script[src$="assets/fm-share.js"]):not([data-fm-site-page]):not(.fm-legacy):not(.fm-shell-off):not(.fm-shell-pending):not(.fm-shell-on) body .wrap:has(> h1.page-title){padding-top:175px}
}

/* ---- badges (2026-09-22): the small marks beside a tool's name; drawn by FmSite.badges from the catalog ---- */
html body .fm-badge{display:inline-flex;align-items:center;flex:none;height:16px;line-height:1;vertical-align:middle;margin-left:6px;
  font-family:var(--fm-font);font-size:9.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}
html body .fm-badge--text{padding:0 6px;border-radius:999px;color:#fff;background:var(--fm-navy)}
html body .fm-badge--text[data-tone="red"]{background:var(--fm-red)}
html body .fm-badge--text[data-tone="green"]{background:var(--fm-green)}
html body .fm-badge--text[data-tone="gold"]{background:var(--fm-gold);color:var(--fm-navy-deep)}
html body .fm-badge--text[data-tone="gray"]{background:var(--fm-mute)}
html body .fm-badge--glyph{font-size:13px;letter-spacing:0;text-transform:none;font-weight:400}
html body img.fm-badge--image{height:14px;width:auto;max-width:72px}
html body .fm-badge + .fm-badge{margin-left:4px}

/* ---- the "older version" note (2026-09-25): a blue-tinted line under a tool's status pointing at the page it replaces on fminvest.com ---- */
html body .fm-legacy-note{margin:0 0 14px;padding:10px 14px;border-radius:var(--fm-radius-sm);background:var(--fm-ice);
  border:1px solid color-mix(in srgb,var(--fm-navy) 14%,var(--fm-panel));color:var(--fm-navy-deep);font-size:13.5px;line-height:1.45}
html body .fm-legacy-note a{color:var(--fm-navy);font-weight:700;text-underline-offset:2px}
html body .fm-legacy-note a:hover{color:var(--fm-navy-deep)}

/* Phase 5: nav */
/* ---------------------------------------------------------------- the site nav, the utility bar and the site footer
   (2026-10-03, plan 1e 2, 3, 4 and 7; drawn by assets/fm-nav.js and assets/fm-footer.js). The live fminvest.com nav's
   submenus (Who We Are, Investments) are buttons in the authored menu's own look, with the live theme's filled red
   caret that turns over while the menu is open; the panels rise in as the live ones do. The utility bar is the thin
   navy band above the header. The site footer mirrors the live footer (deep navy, white links). Tokens only. */
/* THE HEADER BOX (2026-10-23, IT's fminvest.com nav reference, docs/fminvest-nav-reference.html): white with the live
   header's faint shadow and no rule; the fminvest.com logo at 81x47 (web/fm-logo.svg); the nav pushed right, its items
   16px bold navy with no colour change on hover (the caret turns over instead); side padding 12px, 40px from 992px and
   82px from 1200px, the utility bar's too so the two edges line up; the content capped at 1276px from 1400px. These
   override the pages' own older inline .fmnav rules (height 64px, max 1140px, 15px links), so the first paint, before
   fm-nav.js, already has the new look. */
html body header.fmnav{background:#fff;border-bottom:0;box-shadow:0 1px 20px color-mix(in srgb,var(--fm-navy-deep) 4%,transparent);position:sticky;top:0;z-index:30}
html body header.fmnav .in{max-width:none;height:auto;margin:0 auto;padding:8px 12px;display:flex;align-items:center;
  justify-content:space-between;gap:0}
html body header.fmnav .logo{display:block;flex:0 0 auto;line-height:0;font-style:normal;letter-spacing:0}
html body header.fmnav .logo img{display:block;width:81px!important;height:47px!important}
html body header.fmnav .sp{display:none}
html body header.fmnav .menu{margin-left:auto;display:flex;align-items:center;gap:0 1.25rem}
html body header.fmnav .menu > a,html body header.fmnav .menu .fmn-sub-btn{padding:.5rem;color:var(--fm-navy);font-size:16px;font-weight:700;
  line-height:1.625rem}
html body header.fmnav .menu > a:hover,html body header.fmnav .menu .fmn-sub-btn:hover{color:var(--fm-navy)}
html body header.fmnav .fmn-right{margin-left:1.25rem}
@media (max-width:991.98px){html body header.fmnav .menu{display:none}html body header.fmnav .fmn-right{margin-left:auto}}
@media (min-width:992px){
  html body header.fmnav .in{padding:8.5px 40px}
  html body .fmn-util .fmn-util-in{padding-left:40px;padding-right:40px}
}
@media (min-width:1200px){
  html body header.fmnav .in{padding-left:82px;padding-right:82px}
  html body .fmn-util .fmn-util-in{padding-left:82px;padding-right:82px}
  html body header.fmnav .menu{column-gap:2rem}
  html body header.fmnav .fmn-right{margin-left:2rem}
}
@media (min-width:1400px){
  html body header.fmnav .in,html body .fmn-util .fmn-util-in{max-width:1440px}
  html body header.fmnav .menu{column-gap:3.75rem}
  html body header.fmnav .fmn-right{margin-left:3.75rem}
}
header[data-fmnav="1"] .fmn-sub{position:relative;display:inline-flex;align-items:center}
header[data-fmnav="1"] .fmn-sub-btn{appearance:none;-webkit-appearance:none;border:0;background:none;margin:0;padding:0;cursor:pointer;
  display:inline-flex;align-items:center;color:var(--fm-navy);font-family:var(--fm-font);font-size:16px;font-weight:700;line-height:1.625rem;white-space:nowrap}
header[data-fmnav="1"] .fmn-sub-btn:focus-visible{outline:2px solid var(--fm-flame);outline-offset:3px;border-radius:3px}
header[data-fmnav="1"] .fmn-menu .fmn-car svg{transition:transform .3s ease}
header[data-fmnav="1"] .fmn-sub.is-open .fmn-car svg{transform:rotate(180deg)}
header[data-fmnav="1"] .fmn-menu .fmn-sub-panel{min-width:236px}
html body header[data-fmnav="1"] .fmn-menu .fmn-panel{animation:fmn-p5-rise .3s cubic-bezier(.4,0,.2,1)}
@keyframes fmn-p5-rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
/* a tool that needs sign-in for this visitor: the lock sits at the row's end, said aloud by its hidden text */
header[data-fmnav="1"] .fmn-panel a.fmn-item .fmn-lock{margin-left:auto;display:inline-flex;align-items:center;color:var(--fm-mute-text)}
header[data-fmnav="1"] .fmn-panel a.fmn-item--locked .fmn-item-text{color:var(--fm-navy)}
/* the signed-in name from the first paint (fm-nav.js 3.): the pages author no Contact pill now (Contact Us is in the
   utility bar); a host whose header still carries one hides it while the last whoami is remembered */
html[data-fmn-known="in"] header.fmnav .contact,html[data-fmn-known="in"] header.nav .cta,html[data-fmn-known="in"] header .fmauth{display:none!important}
/* the authored menu before fm-nav.js rebuilds it, and without JavaScript: the live nav's filled red caret, drawn here
   in the rebuilt menu's size, so the first paint and the hydrated nav look alike */
html body header.fmnav:not([data-fmnav="1"]) .menu .car{display:inline-block;width:0;height:0;margin-left:0;vertical-align:1px;overflow:hidden;
  font-size:0;line-height:0;color:transparent;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--fm-red)}
html body header.fmnav:not([data-fmnav="1"]) .menu .car svg{display:none}
/* the utility bar: AUTHORED in every page just before the header (fm-nav.js adopts it, or draws it on a host without
   one), so it is in the first paint and nothing moves when the script arrives. Hidden inside an embed (fm-site.js marks
   html[data-fm-embedded]: a deck slide's frame shows the page, not the site's bar), under IT's estate bar, in print. */
html body .fmn-util{background:var(--fm-oxford);color:#fff;font-family:var(--fm-font);font-size:13px;line-height:1.3}   /* Oxford blue (Chris, 2026-10-06) */
html[data-fm-embedded] body .fmn-util,html[data-fm-chrome="estate"] body .fmn-util{display:none}
/* the investor-type control and Contact Us both sit at the right, the control first (Chris, 2026-10-06: "right justify",
   "move so next to Contact Us"); the authored markup keeps the control before the link */
html body .fmn-util-in{max-width:none;margin:0 auto;padding:0 12px;min-height:34px;box-sizing:border-box;display:flex;align-items:center;justify-content:flex-end;gap:28px}
html body .fmn-util-type{display:flex;align-items:center;min-width:0}
html body .fmn-util-in > a{color:#fff;text-decoration:none;font-weight:600;white-space:nowrap;padding:8px 0;margin-left:0}
html body .fmn-util-in > a.fmn-util-cookies + a{margin-left:20px}   /* IT's: a Cookie settings link before Contact Us (fm-nav.js no longer draws it, 6068270) */
html body .fmn-util-in > a:hover,html body .fmn-util-in > a:focus-visible{color:#fff;text-decoration:underline;text-underline-offset:3px}
html body .fmn-util-in > a:focus-visible,html body .fmn-ut-btn:focus-visible{outline:2px solid #fff;outline-offset:2px;border-radius:3px}
/* the type menu's rows, in the header menus' look (fm-nav.css scopes those to the header; the bar sits above it) */
html body .fmn-util .fmn-panel a.fmn-item{display:flex;align-items:center;gap:10px;box-sizing:border-box;padding:9px 12px;border-radius:var(--fm-radius-sm);
  color:var(--fm-navy);font-size:14.5px;font-weight:600;line-height:1.3;text-decoration:none;white-space:nowrap;outline:none;
  transition:background-color .12s ease,color .12s ease}
html body .fmn-util .fmn-panel a.fmn-item:hover,html body .fmn-util .fmn-panel a.fmn-item:focus{background:var(--fm-ice);color:var(--fm-navy)}
html body .fmn-util .fmn-panel a.fmn-item:focus-visible{box-shadow:inset 0 0 0 2px var(--fm-navy)}
html body .fmn-ut{position:relative;display:inline-flex;align-items:center}
html body .fmn-ut-btn{appearance:none;-webkit-appearance:none;border:0;background:none;margin:0;padding:8px 0;cursor:pointer;color:#fff;
  font-family:var(--fm-font);font-size:13px;font-weight:500;line-height:1.3;text-align:left;display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
html body .fmn-ut-btn b{font-weight:700}
html body .fmn-ut-btn .fmn-car{display:inline-flex;color:#fff}
html body .fmn-ut-btn .fmn-car svg{transition:transform .3s ease}
html body .fmn-ut.is-open .fmn-car svg{transform:rotate(180deg)}
html body .fmn-ut-panel{left:auto;right:-8px;top:calc(100% + 4px);min-width:288px;color:var(--fm-navy-deep)}   /* opens from the bar's right edge */
html body .fmn-ut-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:2px 2px 4px 12px;color:var(--fm-mute-text);
  font-size:10.5px;font-weight:700;letter-spacing:.13em;text-transform:uppercase}
html body .fmn-ut-x,html body .fmn-ut-x:hover{color:var(--fm-mute-text)}
html body .fmn-ut-x:hover{background:var(--fm-ice);color:var(--fm-navy)}
html body .fmn-util .fmn-ut-panel a.fmn-item.is-current{background:var(--fm-row);font-weight:700}
html body .fmn-ut-check{margin-left:auto;color:var(--fm-navy)}
html body .fmn-ut-hint{padding:6px 12px 6px;white-space:normal;max-width:300px}
@media (max-width:480px){html body .fmn-ut-btn{white-space:normal}html body .fmn-util-in{gap:12px}}
/* under 992px fm-nav.css draws the full-screen menu; the type menu opens across the bar */
@media (max-width:991.98px){
  html body .fmn-ut-panel{position:fixed;left:12px;right:12px;top:40px;min-width:0}
}
/* the site footer: mirrors the live fminvest.com footer (Chris, 2026-10-06: "the footer should match the main site's
   footer"); always the last thing on the page. Two bands, as the live footer has: the dark band (its footer__main: the
   line-triangles graphic at the right, the brand mark and copyright top left, the Footer menu in two columns top right,
   the Footer Legal menu in one row bottom left, the social icons bottom right) and under it the light band (its
   footer__info) that holds a page's disclosures when the page marks a block for it (fm-footer.js, data-fm-footer-info:
   the landing's "Important disclosures"). The copy sizes are the live footer's (16px links, a 12px copyright). */
html body footer.fm-site-footer{margin:0;padding:0;border:0;border-top:1px solid var(--fm-head-line);background:var(--fm-navy-deep);
  color:#fff;font-family:var(--fm-font);font-size:16px;line-height:1.5}
html body footer.fm-site-footer .fm-site-footer-main{padding:72px 0 64px;background:var(--fm-navy-deep) url("footer-bg-triangles.svg") no-repeat right center/cover}
html body footer.fm-site-footer .fm-site-footer-in{max-width:1140px;margin:0 auto;padding:0 22px;box-sizing:border-box;display:grid;
  grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"brand menu" "legal social";gap:56px 64px;align-items:end}
/* the content's width follows the page container's and the utility bar's: 1140px, 1320px from a 1400px window (Phase 8) */
@media (min-width:1400px){html body footer.fm-site-footer .fm-site-footer-in{max-width:1320px}}
html body footer.fm-site-footer .fm-site-footer-brand{grid-area:brand;align-self:start;display:flex;flex-direction:column;gap:28px;min-width:0}
html body footer.fm-site-footer .fm-site-footer-logo{display:inline-block;width:max-content}
html body footer.fm-site-footer .fm-site-footer-logo img{display:block;height:34px;width:auto}
html body footer.fm-site-footer p.fm-site-footer-copy{margin:0;max-width:none;color:#fff;font-size:12px;line-height:1.35}
html body footer.fm-site-footer .fm-site-footer-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
html body footer.fm-site-footer .fm-site-footer-nav{grid-area:menu;justify-self:end;align-self:start;min-width:0}
html body footer.fm-site-footer .fm-site-footer-nav.is-legal{grid-area:legal;justify-self:start;align-self:end}
html body footer.fm-site-footer ul.fm-site-footer-list{list-style:none;margin:0;padding:0;display:grid;grid-auto-flow:column;grid-template-rows:repeat(3,auto);gap:20px 126px}
html body footer.fm-site-footer .is-legal ul.fm-site-footer-list{display:flex;flex-wrap:wrap;gap:14px 44px}
html body footer.fm-site-footer li{margin:0;padding:0}
html body footer.fm-site-footer a{color:#fff;text-decoration:none;font-weight:600;transition:color .3s ease}
html body footer.fm-site-footer a:hover{color:var(--fm-electric);text-decoration:underline;text-underline-offset:3px}
html body footer.fm-site-footer a:focus-visible{outline:2px solid #fff;outline-offset:3px;border-radius:2px}
/* the social icons (X, LinkedIn, Instagram: the live footer's accounts), drawn as inline SVG in the current color */
html body footer.fm-site-footer ul.fm-site-footer-social{grid-area:social;justify-self:end;align-self:end;list-style:none;margin:0;padding:0;display:flex;gap:46px;align-items:flex-end}
html body footer.fm-site-footer .fm-site-footer-social a{display:inline-flex;color:#fff}
html body footer.fm-site-footer .fm-site-footer-social a:hover{color:var(--fm-electric);text-decoration:none}
html body footer.fm-site-footer .fm-site-footer-social svg{display:block;width:24px;height:24px;fill:currentColor}
/* the light band under it: a page's own disclosures block keeps its own styling (the landing's .site-notes) */
html body footer.fm-site-footer .fm-site-footer-info{background:var(--fm-panel);color:var(--fm-ink-soft);font-size:16px;line-height:1.5}
/* a page's disclosures block for that band (section.site-notes, marked data-fm-footer-info: the landing's "Important
   disclosures" and the Methods & Data reference's "Attributions & disclosures"); it is styled the same where it is
   authored, so a page without JavaScript shows it as the same light band at the foot of the page */
html body .site-notes{background:var(--fm-panel);color:var(--fm-ink-soft);font-size:1rem;line-height:1.5;padding:40px 0 56px;margin-top:0}
html body .site-notes h4{color:var(--fm-navy);font-size:.8rem;margin:0 0 10px;text-transform:uppercase;letter-spacing:.1em}
html body .site-notes p{margin:0 0 12px;max-width:none}
html body .site-notes .legal{border-top:1px solid var(--fm-line);margin-top:18px;padding-top:18px}
html body .site-notes a{color:var(--fm-navy)}
html body .site-notes .tool-note{font-size:inherit;color:inherit;max-width:none;margin:0 0 12px}
@media (max-width:700px){
  html body footer.fm-site-footer .fm-site-footer-main{padding:40px 0 48px;background-size:auto 100%}
  html body footer.fm-site-footer .fm-site-footer-in{grid-template-columns:minmax(0,1fr);grid-template-areas:"brand" "menu" "legal" "social";gap:28px;padding:0 16px;align-items:start}
  html body footer.fm-site-footer .fm-site-footer-nav,html body footer.fm-site-footer .fm-site-footer-nav.is-legal,
  html body footer.fm-site-footer ul.fm-site-footer-social{justify-self:start;align-self:start}
  html body footer.fm-site-footer ul.fm-site-footer-list{grid-auto-flow:row;grid-template-rows:none;gap:14px}
  html body footer.fm-site-footer .is-legal ul.fm-site-footer-list{flex-direction:column;gap:14px}
  html body footer.fm-site-footer ul.fm-site-footer-social{gap:32px}
  html body .site-notes{padding:28px 0 40px;font-size:.95rem}
}
@media (prefers-reduced-motion:reduce){
  html body header[data-fmnav="1"] .fmn-menu .fmn-panel{animation:none}
  header[data-fmnav="1"] .fmn-menu .fmn-car svg,html body .fmn-ut-btn .fmn-car svg,html body footer.fm-site-footer a,
  html body .fmn-util .fmn-panel a.fmn-item{transition:none}
}
/* print leaves out the bar and the footer's dark band, never a page's disclosures: a footer that hosts a page's
   disclosures block (fm-footer.js footer.has-info) prints that light band alone */
@media print{
  html body .fmn-util,html body footer.fm-site-footer:not(.has-info),html body footer.fm-site-footer .fm-site-footer-main{display:none!important}
  html body footer.fm-site-footer.has-info{border:0;background:none}
}

/* Phase 5: landing (2026-10-03; next version 1e 6, 1b-A 12 and Alex's launch-mix decision; the review of 2026-10-06 took
   the rates strip away, and decision 13 of 2026-10-08 the Sign in buttons on locked tiles and rows). The landing page
   (index.html, drawn by assets/fm-landing.js) takes its colors from the --fm-* tokens of this file; these rules dress the
   parts Phase 5 added: the featured cards, the signed-out account call (the landing's one Sign in block), and a locked
   tool's padlock button. The tool pages' "Create an account" (fm-shell.js) is a rail button (.fm-d-act) and keeps its
   words on a phone, where the other rail buttons keep only their icons. */
/* the room the landing holds from the first paint (Phase 8, 2026-10-04; the first load's layout shift was 0.70 to 0.94):
   the account call, and the featured area at least a screen tall, so the directory starts below the fold until the cards
   are in (the ticker's room is fm-landing.css's .fl-tape.is-loading) */
html body .fl-account.is-loading{visibility:hidden;min-height:62px}
/* ... but not for a visitor the nav remembers as signed in (fm-nav.js data-fmn-known): the call is for signed-out visitors */
html[data-fmn-known="in"] body .fl-account.is-loading{display:none}
html body .fl-featured:has(> .fl-loading){min-height:100vh}
/* ... and the directory waits for the featured area (the review of 2026-10-06): it is drawn in the same step, so it
   arrives as new content under whichever layout draws, never as a block that moves. Without the rates strip above them
   the cards end short of a 1000px screen at 1400px, and a directory held under a screen-tall area moved up into view
   (a shift of 0.084; Spotlight fills the screen and did not). A featured area left hidden (no tools to feature) does not
   hold it back. */
html body .fl-featured:not([hidden]):has(> .fl-loading) ~ .fl-dir{display:none}
/* the featured cards: five across for five tools (fm-landing.js layoutCards sets --fl-n), three across under 1180px,
   two on a phone, as the theme rails do */
html body .fl-cards{display:grid;gap:20px;grid-template-columns:repeat(var(--fl-n,5),minmax(0,1fr))}
html body .fl-cards .fl-title{font-size:1.04rem}
html body .fl-cards .fl-desc{font-size:.88rem;-webkit-line-clamp:3;line-clamp:3}
html body .fl-cards .fl-body{padding:15px 16px 17px;gap:9px}
/* a card's category tag fits its card at EVERY width: it may take two lines, never cut. Phase 8 (2026-10-04) wrapped it
   on a phone only ("TREASURY SUPPL..." in a 147px card at 390px); Phase 9 moved the rule out of the phone block: five
   cards in one row at 1400px cut "Treasury supply & money markets" with an ellipsis in a 239px card. Only the cards
   layout (.fl-cards); the frontpage layout's tags (.fl-front, .fl-row) keep the one-line pill */
html body .fl-cards .fl-eyebrow{white-space:normal;align-items:flex-start;border-radius:10px;letter-spacing:.06em}
html body .fl-cards .fl-eyebrow span{overflow:visible;text-overflow:clip;overflow-wrap:anywhere}
html body .fl-cards .fl-eyebrow::before{margin-top:3px}
/* the signed-out account call under the masthead line */
html body .fl-account{display:flex;flex-wrap:wrap;align-items:center;gap:10px 22px;margin:14px 0 0;padding:12px 16px;border-radius:12px;background:var(--fm-ice);
  border:1px solid color-mix(in srgb,var(--fm-navy) 14%,var(--fm-panel))}
html body .fl-account-text{margin:0;flex:1 1 300px;font-size:.95rem;line-height:1.45;color:var(--fm-navy-deep)}
html body .fl-account-text b{color:var(--fm-navy);font-weight:700}
html body .fl-account-acts{display:flex;flex-wrap:wrap;gap:8px}
/* a locked tool's padlock (decision 13, 2026-10-08; fm-landing.js padlock): its only mark, on a card, a slide and a
   directory row. Signed out it is a button ("Sign in to open <tool>") that opens the sign-in overlay: a 24px target
   around the 13px glyph, above a card's stretched link, in the padlock's own color (fm-landing.css .fl-lock: AA on white,
   light on the dark slide), with the house focus ring. Signed in without the tool's group it is an image with a title
   (approved accounts only), nothing to press: it too sits above the stretched link, so a pointer on it shows the title
   and does not open the tile. */
html body .fl-lockbtn{appearance:none;-webkit-appearance:none;position:relative;z-index:3;justify-content:center;box-sizing:border-box;
  width:24px;height:24px;margin:0;padding:0;border:0;border-radius:50%;background:none;font:inherit;cursor:pointer}
html body .fl-lockbtn:hover{background:color-mix(in srgb,currentColor 12%,transparent)}
html body .fl-lockbtn:focus-visible{outline:2px solid var(--fm-electric);outline-offset:1px}
html body .fl-lock.fl-locked:not(button){position:relative;z-index:3;cursor:help}
/* the directory's Access column holds the padlock alone, a free preview's badge, staff's "Hidden" badge, or nothing for
   an open tool (fm-landing.js accessCell). Above the phone list it gets a fixed width that fits the longest of them
   ("Free preview") at every width, and the Tool column takes what is left; a longer badge or a larger font wraps inside
   the cell, never past it (the table's wrapper would scroll sideways and cut the words off) */
@media (min-width:721px){
  html body .fl-table th.c-tool{width:auto}
  html body .fl-table th.c-acc{width:8rem}
  html body .fl-table td.c-acc .fl-badge{max-width:100%;white-space:normal;text-align:left}
}
@media (max-width:1180px){html body .fl-cards,html body .fl-cards[data-n]{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:1000px){html body .fl-cards,html body .fl-cards[data-n]{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:720px){
  html body .fl-cards,html body .fl-cards[data-n]{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  html body .fl-cards .fl-body{padding:12px 12px 14px;gap:7px}
  html body .fl-cards .fl-title{font-size:.98rem}
  html body .fl-cards .fl-desc{font-size:.84rem}
  html body .fl-cards .fl-cta.is-quiet{padding:6px 10px;font-size:.8rem}
  /* (the two-line category tag rule applies at every width since Phase 9: see the .fl-cards block above) */
  html body .fl-account{padding:10px 12px;gap:8px 16px}
  html body .fl-account.is-loading{min-height:108px}
  html body .fl-account-text{font-size:.9rem}
  html.fm-d .fm-d-act[data-d="account"] .fm-d-lb{display:inline}
}
