tallyd 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1493 -2
- package/dist/accounts/chart.d.ts +96 -0
- package/dist/accounts/chart.js +244 -0
- package/dist/accounts/index.d.ts +3 -0
- package/dist/accounts/index.js +3 -0
- package/dist/accounts/standard.d.ts +12 -0
- package/dist/accounts/standard.js +95 -0
- package/dist/accounts/types.d.ts +20 -0
- package/dist/accounts/types.js +40 -0
- package/dist/cli/args.d.ts +45 -0
- package/dist/cli/args.js +147 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.js +25 -0
- package/dist/cli/run.d.ts +34 -0
- package/dist/cli/run.js +1660 -0
- package/dist/dashboard/charts.d.ts +38 -0
- package/dist/dashboard/charts.js +173 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/dashboard/model.d.ts +137 -0
- package/dist/dashboard/model.js +190 -0
- package/dist/dashboard/render.d.ts +23 -0
- package/dist/dashboard/render.js +231 -0
- package/dist/dashboard/script.d.ts +28 -0
- package/dist/dashboard/script.js +704 -0
- package/dist/dashboard/styles.d.ts +14 -0
- package/dist/dashboard/styles.js +726 -0
- package/dist/demo/disposal.d.ts +80 -0
- package/dist/demo/disposal.js +215 -0
- package/dist/demo/evidence.d.ts +153 -0
- package/dist/demo/evidence.js +348 -0
- package/dist/demo/foreign.d.ts +29 -0
- package/dist/demo/foreign.js +113 -0
- package/dist/demo/foreignReport.d.ts +10 -0
- package/dist/demo/foreignReport.js +89 -0
- package/dist/demo/generator.d.ts +108 -0
- package/dist/demo/generator.js +445 -0
- package/dist/demo/group.d.ts +70 -0
- package/dist/demo/group.js +195 -0
- package/dist/demo/groupPeriods.d.ts +27 -0
- package/dist/demo/groupPeriods.js +125 -0
- package/dist/demo/groupReport.d.ts +13 -0
- package/dist/demo/groupReport.js +87 -0
- package/dist/demo/ingest.d.ts +6 -0
- package/dist/demo/ingest.js +61 -0
- package/dist/demo/main.d.ts +6 -0
- package/dist/demo/main.js +7 -0
- package/dist/demo/mainDisposal.d.ts +1 -0
- package/dist/demo/mainDisposal.js +2 -0
- package/dist/demo/mainEvidence.d.ts +8 -0
- package/dist/demo/mainEvidence.js +9 -0
- package/dist/demo/mainForeign.d.ts +6 -0
- package/dist/demo/mainForeign.js +7 -0
- package/dist/demo/mainGroup.d.ts +6 -0
- package/dist/demo/mainGroup.js +7 -0
- package/dist/demo/mainGroupPeriods.d.ts +6 -0
- package/dist/demo/mainGroupPeriods.js +7 -0
- package/dist/demo/mainIngest.d.ts +6 -0
- package/dist/demo/mainIngest.js +7 -0
- package/dist/demo/mainMidYear.d.ts +6 -0
- package/dist/demo/mainMidYear.js +7 -0
- package/dist/demo/mainReconcile.d.ts +6 -0
- package/dist/demo/mainReconcile.js +7 -0
- package/dist/demo/mainStatements.d.ts +6 -0
- package/dist/demo/mainStatements.js +7 -0
- package/dist/demo/midYear.d.ts +51 -0
- package/dist/demo/midYear.js +162 -0
- package/dist/demo/month.d.ts +13 -0
- package/dist/demo/month.js +142 -0
- package/dist/demo/random.d.ts +48 -0
- package/dist/demo/random.js +94 -0
- package/dist/demo/receivables.d.ts +36 -0
- package/dist/demo/receivables.js +104 -0
- package/dist/demo/reconcile.d.ts +20 -0
- package/dist/demo/reconcile.js +104 -0
- package/dist/demo/report.d.ts +6 -0
- package/dist/demo/report.js +26 -0
- package/dist/demo/statement.d.ts +13 -0
- package/dist/demo/statement.js +51 -0
- package/dist/demo/statements.d.ts +6 -0
- package/dist/demo/statements.js +29 -0
- package/dist/demo/supplierRun.d.ts +46 -0
- package/dist/demo/supplierRun.js +94 -0
- package/dist/demo/unrealisedEvidence.d.ts +51 -0
- package/dist/demo/unrealisedEvidence.js +183 -0
- package/dist/fx/average.d.ts +60 -0
- package/dist/fx/average.js +139 -0
- package/dist/fx/document.d.ts +60 -0
- package/dist/fx/document.js +205 -0
- package/dist/fx/exposure.d.ts +108 -0
- package/dist/fx/exposure.js +262 -0
- package/dist/fx/index.d.ts +8 -0
- package/dist/fx/index.js +8 -0
- package/dist/fx/rate.d.ts +77 -0
- package/dist/fx/rate.js +200 -0
- package/dist/fx/revaluation.d.ts +92 -0
- package/dist/fx/revaluation.js +197 -0
- package/dist/fx/settlement.d.ts +84 -0
- package/dist/fx/settlement.js +162 -0
- package/dist/fx/table.d.ts +120 -0
- package/dist/fx/table.js +271 -0
- package/dist/fx/translate.d.ts +126 -0
- package/dist/fx/translate.js +258 -0
- package/dist/group/accounts.d.ts +74 -0
- package/dist/group/accounts.js +179 -0
- package/dist/group/acquisition.d.ts +324 -0
- package/dist/group/acquisition.js +416 -0
- package/dist/group/aggregate.d.ts +143 -0
- package/dist/group/aggregate.js +288 -0
- package/dist/group/comparative.d.ts +102 -0
- package/dist/group/comparative.js +166 -0
- package/dist/group/consolidate.d.ts +196 -0
- package/dist/group/consolidate.js +635 -0
- package/dist/group/disposal.d.ts +181 -0
- package/dist/group/disposal.js +233 -0
- package/dist/group/document.d.ts +41 -0
- package/dist/group/document.js +326 -0
- package/dist/group/index.d.ts +12 -0
- package/dist/group/index.js +12 -0
- package/dist/group/intercompany.d.ts +136 -0
- package/dist/group/intercompany.js +238 -0
- package/dist/group/interest.d.ts +109 -0
- package/dist/group/interest.js +224 -0
- package/dist/group/movement.d.ts +206 -0
- package/dist/group/movement.js +432 -0
- package/dist/group/structure.d.ts +151 -0
- package/dist/group/structure.js +327 -0
- package/dist/group/timeline.d.ts +109 -0
- package/dist/group/timeline.js +169 -0
- package/dist/group/unrealised.d.ts +165 -0
- package/dist/group/unrealised.js +314 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/ledger/close.d.ts +75 -0
- package/dist/ledger/close.js +142 -0
- package/dist/ledger/date.d.ts +48 -0
- package/dist/ledger/date.js +141 -0
- package/dist/ledger/entry.d.ts +150 -0
- package/dist/ledger/entry.js +264 -0
- package/dist/ledger/index.d.ts +6 -0
- package/dist/ledger/index.js +6 -0
- package/dist/ledger/ledger.d.ts +101 -0
- package/dist/ledger/ledger.js +308 -0
- package/dist/ledger/serialise.d.ts +68 -0
- package/dist/ledger/serialise.js +204 -0
- package/dist/ledger/trialBalance.d.ts +49 -0
- package/dist/ledger/trialBalance.js +103 -0
- package/dist/money/currency.d.ts +37 -0
- package/dist/money/currency.js +67 -0
- package/dist/money/index.d.ts +3 -0
- package/dist/money/index.js +3 -0
- package/dist/money/money.d.ts +106 -0
- package/dist/money/money.js +300 -0
- package/dist/money/rounding.d.ts +41 -0
- package/dist/money/rounding.js +117 -0
- package/dist/reconcile/accuracy.d.ts +65 -0
- package/dist/reconcile/accuracy.js +162 -0
- package/dist/reconcile/assignment.d.ts +83 -0
- package/dist/reconcile/assignment.js +326 -0
- package/dist/reconcile/bankView.d.ts +65 -0
- package/dist/reconcile/bankView.js +86 -0
- package/dist/reconcile/bridge.d.ts +76 -0
- package/dist/reconcile/bridge.js +129 -0
- package/dist/reconcile/candidates.d.ts +84 -0
- package/dist/reconcile/candidates.js +174 -0
- package/dist/reconcile/decisions.d.ts +116 -0
- package/dist/reconcile/decisions.js +168 -0
- package/dist/reconcile/index.d.ts +12 -0
- package/dist/reconcile/index.js +12 -0
- package/dist/reconcile/matcher.d.ts +89 -0
- package/dist/reconcile/matcher.js +306 -0
- package/dist/reconcile/memory.d.ts +120 -0
- package/dist/reconcile/memory.js +281 -0
- package/dist/reconcile/posting.d.ts +185 -0
- package/dist/reconcile/posting.js +481 -0
- package/dist/reconcile/scoring.d.ts +98 -0
- package/dist/reconcile/scoring.js +319 -0
- package/dist/reconcile/similarity.d.ts +88 -0
- package/dist/reconcile/similarity.js +272 -0
- package/dist/reconcile/subsetSum.d.ts +61 -0
- package/dist/reconcile/subsetSum.js +136 -0
- package/dist/reports/ageing.d.ts +75 -0
- package/dist/reports/ageing.js +149 -0
- package/dist/reports/balanceSheet.d.ts +57 -0
- package/dist/reports/balanceSheet.js +107 -0
- package/dist/reports/incomeStatement.d.ts +59 -0
- package/dist/reports/incomeStatement.js +132 -0
- package/dist/reports/index.d.ts +4 -0
- package/dist/reports/index.js +4 -0
- package/dist/reports/period.d.ts +37 -0
- package/dist/reports/period.js +78 -0
- package/dist/statement/amount.d.ts +55 -0
- package/dist/statement/amount.js +211 -0
- package/dist/statement/columns.d.ts +39 -0
- package/dist/statement/columns.js +221 -0
- package/dist/statement/csv.d.ts +50 -0
- package/dist/statement/csv.js +185 -0
- package/dist/statement/dates.d.ts +52 -0
- package/dist/statement/dates.js +204 -0
- package/dist/statement/duplicates.d.ts +51 -0
- package/dist/statement/duplicates.js +101 -0
- package/dist/statement/import.d.ts +52 -0
- package/dist/statement/import.js +172 -0
- package/dist/statement/index.d.ts +20 -0
- package/dist/statement/index.js +32 -0
- package/dist/statement/line.d.ts +60 -0
- package/dist/statement/line.js +73 -0
- package/dist/statement/ofx.d.ts +47 -0
- package/dist/statement/ofx.js +199 -0
- package/package.json +72 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stylesheet, inlined.
|
|
3
|
+
*
|
|
4
|
+
* Design read: this is a tool, not a landing page. Someone opens it with a
|
|
5
|
+
* statement half-reconciled and works down a queue until the bridge reaches
|
|
6
|
+
* zero. So the surface earns its keep by being legible and dense rather than
|
|
7
|
+
* expressive — one typeface, a fixed rem scale, colour reserved for state, and
|
|
8
|
+
* transitions short enough that nobody waits for them.
|
|
9
|
+
*
|
|
10
|
+
* Numerals are tabular everywhere a figure appears. A column of money whose
|
|
11
|
+
* digits do not line up is the fastest way to make an accounting page look
|
|
12
|
+
* wrong to the only people qualified to read it.
|
|
13
|
+
*/
|
|
14
|
+
export declare const STYLES = "\n:root {\n color-scheme: light;\n\n --canvas: #fbfbfa;\n --surface: #ffffff;\n --surface-sunken: #f5f4f1;\n --rule: #e6e4df;\n --rule-strong: #d3d0c9;\n\n --ink: #171613;\n --ink-secondary: #57544c;\n --ink-muted: #85817a;\n\n --accent: #1f5f9f;\n --accent-soft: #e3eefa;\n\n --good: #2f6b3a;\n --good-soft: #e8f1e7;\n --warn: #8a5a00;\n --warn-soft: #faf1dc;\n --bad: #97302e;\n --bad-soft: #fbeae9;\n\n --series-1: #2a78d6;\n --seq-1: #cfe0f4;\n --seq-2: #92bbe8;\n --seq-3: #4f92da;\n --seq-4: #1f5f9f;\n\n --radius: 12px;\n --radius-small: 6px;\n --pad: 20px;\n --ease: cubic-bezier(0.22, 1, 0.36, 1);\n\n --font: \"Inter var\", \"SF Pro Text\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n \"Helvetica Neue\", Arial, sans-serif;\n --mono: \"SF Mono\", \"JetBrains Mono\", \"Cascadia Mono\", ui-monospace, Menlo, monospace;\n}\n\n@media (prefers-color-scheme: dark) {\n :root:where(:not([data-theme=\"light\"])) {\n color-scheme: dark;\n --canvas: #131311;\n --surface: #1b1b19;\n --surface-sunken: #232320;\n --rule: #2f2f2b;\n --rule-strong: #454540;\n --ink: #f4f3ef;\n --ink-secondary: #b8b5ac;\n --ink-muted: #8e8b83;\n --accent: #6aa9e8;\n --accent-soft: #1d2c3c;\n --good: #86c08d;\n --good-soft: #1c2a1e;\n --warn: #d9ab55;\n --warn-soft: #2e2716;\n --bad: #e08b88;\n --bad-soft: #33201f;\n --series-1: #3987e5;\n --seq-1: #22334a;\n --seq-2: #2c4d70;\n --seq-3: #386c9f;\n --seq-4: #4a8dcb;\n }\n}\n\n* { box-sizing: border-box; }\n\nhtml { -webkit-text-size-adjust: 100%; }\n\nbody {\n margin: 0;\n background: var(--canvas);\n color: var(--ink);\n font-family: var(--font);\n font-size: 15px;\n line-height: 1.55;\n font-variant-numeric: tabular-nums;\n -webkit-font-smoothing: antialiased;\n}\n\n::selection { background: var(--accent-soft); color: var(--ink); }\n\n:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n border-radius: var(--radius-small);\n}\n\n.shell {\n max-width: 1180px;\n margin: 0 auto;\n padding: 40px 24px 96px;\n}\n\n/* ---------------------------------------------------------------- masthead */\n\n.masthead {\n display: flex;\n flex-wrap: wrap;\n gap: 20px;\n align-items: baseline;\n justify-content: space-between;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--rule);\n}\n\n.masthead h1 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 620;\n letter-spacing: -0.024em;\n}\n\n.masthead p {\n margin: 4px 0 0;\n color: var(--ink-secondary);\n font-size: 0.875rem;\n}\n\n.masthead-meta {\n display: flex;\n gap: 24px;\n font-size: 0.8125rem;\n color: var(--ink-secondary);\n}\n\n.masthead-meta div span {\n display: block;\n color: var(--ink-muted);\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.07em;\n}\n\n.masthead-meta div strong {\n font-weight: 560;\n color: var(--ink);\n}\n\n/* ------------------------------------------------------------------ layout */\n\nsection { margin-top: 44px; }\n\nh2 {\n margin: 0 0 4px;\n font-size: 1.0625rem;\n font-weight: 600;\n letter-spacing: -0.014em;\n}\n\n.section-note {\n margin: 0 0 18px;\n color: var(--ink-secondary);\n font-size: 0.8125rem;\n max-width: 68ch;\n}\n\n.panel {\n background: var(--surface);\n border: 1px solid var(--rule);\n border-radius: var(--radius);\n padding: var(--pad);\n}\n\n.split {\n display: grid;\n gap: 20px;\n align-items: start;\n grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);\n}\n\n@media (max-width: 900px) {\n .split { grid-template-columns: minmax(0, 1fr); }\n}\n\n/* ------------------------------------------------------------------ bridge */\n\n.bridge dl {\n margin: 0;\n display: grid;\n grid-template-columns: 1fr auto;\n row-gap: 2px;\n column-gap: 16px;\n font-size: 0.875rem;\n}\n\n.bridge dt { color: var(--ink-secondary); }\n.bridge dd { margin: 0; font-family: var(--mono); font-size: 0.8125rem; text-align: right; }\n\n.bridge .rule-row {\n grid-column: 1 / -1;\n height: 1px;\n background: var(--rule);\n margin: 10px 0;\n}\n\n.bridge dt.lead-row,\n.bridge dd.lead-row { font-weight: 600; color: var(--ink); }\n\n.bridge-verdict {\n margin-top: 18px;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-radius: var(--radius-small);\n font-size: 0.875rem;\n font-weight: 550;\n transition: background 180ms var(--ease), color 180ms var(--ease);\n}\n\n.bridge-verdict[data-state=\"balanced\"] { background: var(--good-soft); color: var(--good); }\n.bridge-verdict[data-state=\"off\"] { background: var(--bad-soft); color: var(--bad); }\n\n.bridge-verdict .figure { margin-left: auto; font-family: var(--mono); }\n\n/* ------------------------------------------------------------------ counts */\n\n.counts {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 1px;\n background: var(--rule);\n border: 1px solid var(--rule);\n border-radius: var(--radius);\n overflow: hidden;\n}\n\n.counts > div {\n background: var(--surface);\n padding: 14px 16px;\n}\n\n.counts dt {\n margin: 0;\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.07em;\n color: var(--ink-muted);\n}\n\n.counts dd {\n margin: 2px 0 0;\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: -0.02em;\n font-variant-numeric: tabular-nums;\n}\n\n@media (max-width: 620px) {\n .counts { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n/* ------------------------------------------------------------------- queue */\n\n.queue { display: flex; flex-direction: column; gap: 12px; }\n\n.match {\n background: var(--surface);\n border: 1px solid var(--rule);\n border-radius: var(--radius);\n padding: 16px 18px;\n transition: border-color 160ms var(--ease), opacity 200ms var(--ease),\n transform 200ms var(--ease);\n}\n\n.match:hover { border-color: var(--rule-strong); }\n\n.match[data-leaving=\"true\"] {\n opacity: 0;\n transform: translateY(-6px);\n pointer-events: none;\n}\n\n.match-head {\n display: flex;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.match-amount {\n margin-left: auto;\n font-family: var(--mono);\n font-size: 0.9375rem;\n font-weight: 550;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 0.6875rem;\n font-weight: 560;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n}\n\n.badge[data-confidence=\"exact\"],\n.badge[data-confidence=\"high\"] { background: var(--good-soft); color: var(--good); }\n.badge[data-confidence=\"medium\"] { background: var(--warn-soft); color: var(--warn); }\n.badge[data-confidence=\"low\"] { background: var(--bad-soft); color: var(--bad); }\n\n.badge-kind { background: var(--surface-sunken); color: var(--ink-secondary); }\n\n.score { font-family: var(--mono); font-size: 0.75rem; color: var(--ink-muted); }\n\n.pairing {\n margin: 12px 0 0;\n display: grid;\n gap: 6px;\n}\n\n.pairing-line {\n display: grid;\n grid-template-columns: 44px 92px minmax(0, 1fr) auto;\n gap: 12px;\n align-items: baseline;\n font-size: 0.8125rem;\n}\n\n.pairing-line .who {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--ink-muted);\n}\n\n.pairing-line .when { font-family: var(--mono); font-size: 0.75rem; color: var(--ink-secondary); }\n.pairing-line .what { overflow-wrap: anywhere; }\n.pairing-line .how-much { font-family: var(--mono); text-align: right; }\n\n@media (max-width: 620px) {\n .pairing-line {\n grid-template-columns: auto 1fr;\n row-gap: 2px;\n padding-bottom: 6px;\n border-bottom: 1px solid var(--rule);\n }\n .pairing-line:last-child { border-bottom: 0; padding-bottom: 0; }\n .pairing-line .who { grid-column: 1; }\n .pairing-line .when { grid-column: 2; }\n .pairing-line .what { grid-column: 1 / -1; }\n .pairing-line .how-much { grid-column: 1 / -1; text-align: left; }\n}\n\n.reasons {\n margin: 12px 0 0;\n padding: 10px 12px;\n background: var(--surface-sunken);\n border-radius: var(--radius-small);\n list-style: none;\n display: grid;\n gap: 3px;\n font-size: 0.75rem;\n color: var(--ink-secondary);\n}\n\n.reasons li::before {\n content: \"\";\n display: inline-block;\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background: var(--rule-strong);\n margin-right: 8px;\n vertical-align: 2px;\n}\n\n.actions { margin-top: 14px; display: flex; gap: 8px; }\n\nbutton {\n font: inherit;\n font-size: 0.8125rem;\n font-weight: 540;\n padding: 6px 14px;\n border-radius: var(--radius-small);\n border: 1px solid var(--rule-strong);\n background: var(--surface);\n color: var(--ink);\n cursor: pointer;\n transition: background 140ms var(--ease), border-color 140ms var(--ease),\n color 140ms var(--ease), transform 90ms var(--ease);\n}\n\nbutton:hover:not(:disabled) { background: var(--surface-sunken); border-color: var(--ink-muted); }\nbutton:active:not(:disabled) { transform: scale(0.985); }\nbutton:disabled { opacity: 0.45; cursor: not-allowed; }\n\nbutton.primary { background: var(--ink); color: var(--canvas); border-color: var(--ink); }\nbutton.primary:hover:not(:disabled) { background: var(--ink-secondary); border-color: var(--ink-secondary); }\n\n/* ------------------------------------------------------------------ tables */\n\ntable { width: 100%; border-collapse: collapse; font-size: 0.8125rem; }\n\nth {\n text-align: left;\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.07em;\n color: var(--ink-muted);\n font-weight: 560;\n padding: 0 12px 8px 0;\n border-bottom: 1px solid var(--rule);\n}\n\nth:last-child, td:last-child { padding-right: 0; }\n\ntd {\n padding: 7px 12px 7px 0;\n border-bottom: 1px solid var(--rule);\n vertical-align: baseline;\n}\ntbody tr:last-child td { border-bottom: 0; }\n\ntd.num, th.num { text-align: right; font-family: var(--mono); }\ntd.when { font-family: var(--mono); color: var(--ink-secondary); white-space: nowrap; }\n\ntbody tr[data-clickable=\"true\"] { cursor: pointer; }\ntbody tr[data-clickable=\"true\"]:hover td { background: var(--surface-sunken); }\ntbody tr[aria-selected=\"true\"] td { background: var(--accent-soft); }\n\n.negative { color: var(--bad); }\n\n/* -------------------------------------------------------------- disclosure */\n\ndetails { border-top: 1px solid var(--rule); }\ndetails:last-of-type { border-bottom: 1px solid var(--rule); }\n\nsummary {\n cursor: pointer;\n padding: 12px 0;\n font-size: 0.875rem;\n font-weight: 550;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\nsummary::-webkit-details-marker { display: none; }\n\nsummary .chevron {\n width: 8px;\n height: 8px;\n border-right: 1.5px solid var(--ink-muted);\n border-bottom: 1.5px solid var(--ink-muted);\n transform: rotate(-45deg);\n transition: transform 160ms var(--ease);\n}\n\ndetails[open] summary .chevron { transform: rotate(45deg); }\n\nsummary .tally {\n margin-left: auto;\n font-family: var(--mono);\n font-size: 0.75rem;\n color: var(--ink-muted);\n}\n\ndetails > div { padding-bottom: 16px; }\n\n/* ------------------------------------------------------------------ charts */\n\n.chart { position: relative; }\n.chart svg { display: block; width: 100%; height: auto; overflow: visible; }\n.chart .axis text { font-size: 11px; fill: var(--ink-muted); font-family: var(--mono); }\n.chart .grid line { stroke: var(--rule); stroke-width: 1; }\n.chart .series-line { fill: none; stroke: var(--series-1); stroke-width: 2; stroke-linejoin: round; }\n.chart .series-area { fill: var(--series-1); opacity: 0.08; }\n.chart .marker { fill: var(--series-1); stroke: var(--surface); stroke-width: 2; }\n.chart .crosshair { stroke: var(--rule-strong); stroke-width: 1; stroke-dasharray: 3 3; }\n\n.chart .bar { transition: opacity 140ms var(--ease); }\n.chart:hover .bar { opacity: 0.55; }\n.chart .bar:hover { opacity: 1; }\n.chart .bar-label { font-size: 12px; fill: var(--ink-secondary); font-family: var(--mono); }\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--ink);\n color: var(--canvas);\n padding: 5px 9px;\n border-radius: var(--radius-small);\n font-size: 0.75rem;\n font-family: var(--mono);\n white-space: nowrap;\n opacity: 0;\n transform: translate(-50%, -130%);\n transition: opacity 120ms var(--ease);\n z-index: 5;\n}\n\n.tooltip[data-visible=\"true\"] { opacity: 1; }\n\n/*\n * An SVG with a viewBox scales its text down with everything else, so a chart\n * that is legible at 640px wide has 5px axis labels on a phone. The fix is to\n * draw the text larger in viewBox units at narrow widths, not to shrink the\n * chart.\n */\n@media (max-width: 700px) {\n .chart .axis text { font-size: 20px; }\n .chart .bar-label { font-size: 17px; }\n}\n\n/* --------------------------------------------------------------- decisions */\n\n/*\n * The one authored moment on the page. The bar is out of the way until the\n * first decision exists, then it arrives from below \u2014 the direction it will\n * leave in \u2014 and stays put for the rest of the session. Everything else here\n * moves only in response to a click.\n */\n.decision-bar {\n position: fixed;\n left: 50%;\n bottom: 20px;\n z-index: 20;\n width: min(760px, calc(100vw - 32px));\n translate: -50% 0;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 14px 12px 18px;\n background: var(--surface);\n border: 1px solid var(--rule-strong);\n border-radius: 14px;\n box-shadow: 0 1px 2px rgba(23, 22, 19, 0.06), 0 12px 32px -12px rgba(23, 22, 19, 0.28);\n transition: opacity 260ms var(--ease), transform 260ms var(--ease),\n visibility 0s linear 260ms;\n opacity: 0;\n transform: translateY(14px);\n visibility: hidden;\n}\n\n.decision-bar[data-open=\"true\"] {\n opacity: 1;\n transform: translateY(0);\n visibility: visible;\n transition-delay: 0s;\n}\n\n.decision-bar .tally-text {\n font-size: 0.8125rem;\n color: var(--ink-secondary);\n min-width: 0;\n}\n\n.decision-bar .tally-text strong {\n color: var(--ink);\n font-weight: 560;\n font-variant-numeric: tabular-nums;\n}\n\n.decision-bar .bar-actions {\n margin-left: auto;\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n@media (max-width: 620px) {\n .decision-bar { flex-wrap: wrap; }\n .decision-bar .bar-actions { margin-left: 0; width: 100%; }\n .decision-bar .bar-actions button { flex: 1; }\n}\n\n.decided-list { display: flex; flex-direction: column; }\n\n.decided-row {\n display: grid;\n grid-template-columns: auto auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: 14px;\n padding: 10px 2px;\n border-bottom: 1px solid var(--rule);\n font-size: 0.8125rem;\n}\n\n.decided-row:last-child { border-bottom: 0; }\n\n.decided-row .verdict {\n font-size: 0.6875rem;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n font-weight: 560;\n padding: 2px 8px;\n border-radius: 999px;\n}\n\n.decided-row .verdict[data-verdict=\"accepted\"] { background: var(--good-soft); color: var(--good); }\n.decided-row .verdict[data-verdict=\"rejected\"] { background: var(--bad-soft); color: var(--bad); }\n\n.decided-row .what {\n color: var(--ink-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.decided-row .when { font-family: var(--mono); font-size: 0.75rem; color: var(--ink-muted); }\n.decided-row .how-much { font-family: var(--mono); font-size: 0.75rem; }\n.decided-row .how-much.negative { color: var(--bad); }\n\n.decided-row button { padding: 3px 10px; font-size: 0.75rem; }\n\n/* ----------------------------------------------------------------- implied */\n\n.implied-row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto minmax(0, 22ch);\n align-items: baseline;\n gap: 14px;\n padding: 9px 2px;\n border-bottom: 1px solid var(--rule);\n font-size: 0.8125rem;\n}\n\n.implied-row:last-child { border-bottom: 0; }\n.implied-row .when { font-family: var(--mono); font-size: 0.75rem; color: var(--ink-muted); }\n.implied-row .what { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.implied-row .how-much { font-family: var(--mono); font-size: 0.75rem; }\n.implied-row .how-much.negative { color: var(--bad); }\n\n.implied-row .lands {\n font-size: 0.75rem;\n color: var(--ink-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.implied-row .lands code {\n font-family: var(--mono);\n font-size: 0.6875rem;\n color: var(--ink);\n}\n\n.implied-row[data-outcome=\"unclassified\"] .lands { color: var(--warn); }\n.implied-row[data-outcome=\"skip\"] .lands { color: var(--ink-muted); }\n\n.implied-total {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid var(--rule-strong);\n font-size: 0.8125rem;\n font-weight: 550;\n}\n\n.implied-total .figure { font-family: var(--mono); white-space: nowrap; }\n\n@media (max-width: 700px) {\n .implied-row { grid-template-columns: minmax(0, 1fr) auto; row-gap: 2px; }\n .implied-row .when { grid-column: 1 / -1; }\n .implied-row .lands { grid-column: 1 / -1; }\n}\n\n/* ------------------------------------------------------------------- empty */\n\n.empty {\n padding: 22px 18px;\n border: 1px dashed var(--rule-strong);\n border-radius: var(--radius);\n color: var(--ink-secondary);\n font-size: 0.8125rem;\n text-align: center;\n}\n\n.empty strong { display: block; color: var(--ink); font-weight: 560; margin-bottom: 3px; }\n\n/* ------------------------------------------------------------------ footer */\n\nfooter {\n margin-top: 56px;\n padding-top: 18px;\n border-top: 1px solid var(--rule);\n color: var(--ink-muted);\n font-size: 0.75rem;\n display: flex;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n transition-duration: 1ms !important;\n animation-duration: 1ms !important;\n }\n}\n";
|