@robosystems/report-components 0.6.1 → 0.7.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/README.md CHANGED
@@ -42,7 +42,7 @@ export function Report() {
42
42
 
43
43
  - [RoboSystems Platform](https://robosystems.ai)
44
44
  - [GitHub Repository](https://github.com/RoboFinSystems/robosystems-report-components)
45
- - [API Documentation](https://api.robosystems.ai/docs)
45
+ - [API Reference](https://robosystems.ai/docs/api)
46
46
 
47
47
  ## Support
48
48
 
package/dist/index.js CHANGED
@@ -797,6 +797,11 @@ var styles = {
797
797
  padding: "0.75rem 0"
798
798
  },
799
799
  link: { color: "var(--rs-primary-700, #1d4ed8)" },
800
+ document: {
801
+ background: "var(--rs-document-bg, transparent)",
802
+ padding: "var(--rs-document-padding, 0)",
803
+ borderRadius: "var(--rs-document-radius, 0)"
804
+ },
800
805
  frame: { width: "100%", border: "none", display: "block" },
801
806
  pre: {
802
807
  whiteSpace: "pre-wrap",
@@ -856,7 +861,7 @@ function SandboxedHtml({ html, extraCss = "" }) {
856
861
  } catch {
857
862
  }
858
863
  };
859
- return /* @__PURE__ */ jsx(
864
+ return /* @__PURE__ */ jsx("div", { style: styles.document, children: /* @__PURE__ */ jsx(
860
865
  "iframe",
861
866
  {
862
867
  ref,
@@ -869,7 +874,7 @@ function SandboxedHtml({ html, extraCss = "" }) {
869
874
  setTimeout(fit, 250);
870
875
  }
871
876
  }
872
- );
877
+ ) });
873
878
  }
874
879
  function ExternalTextBlock({ url }) {
875
880
  const [state, setState] = useState("loading");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chart/format.ts","../src/chart/join.ts","../src/chart/palette.ts","../src/project.ts","../src/pivot.ts","../src/components/ExternalTextBlock.tsx","../src/components/FactInspector.tsx","../src/components/StatementTable.tsx","../src/components/ReportView.tsx","../src/components/TimeSeriesChart.tsx"],"names":["qname","fallbackElement","occupied","rowLabel","styles","jsxs","jsx","useState","useRef","useMemo","min","max"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Value formatting by metric format family — the client half of the M-2\n * `item_type` unit/format system. `monetary` reuses the accounting money\n * style; `percent` values are stored raw (0.0512) and shown ×100; `multiple`\n * carries an `×`; `ratio` is a plain 2-dp decimal; `days` is an integer.\n */\nimport { formatMoney } from '../format'\nimport type { MetricItemType } from './types'\n\nconst DASH = '—'\n\n/** Full-precision display for tooltips and direct labels. */\nexport function formatMetricValue(\n itemType: MetricItemType | string | null | undefined,\n value: number | null | undefined\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return DASH\n switch (itemType) {\n case 'monetary':\n return formatMoney(value)\n case 'percent':\n return `${(value * 100).toLocaleString('en-US', { maximumFractionDigits: 2 })}%`\n case 'multiple':\n return `${value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}×`\n case 'days':\n return value.toLocaleString('en-US', { maximumFractionDigits: 0 })\n case 'ratio':\n return value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n default:\n return value.toLocaleString('en-US', { maximumFractionDigits: 4 })\n }\n}\n\n/** Compact form for axis ticks — abbreviated money, tighter decimals. */\nexport function formatMetricCompact(\n itemType: MetricItemType | string | null | undefined,\n value: number | null | undefined\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return ''\n if (itemType === 'monetary') {\n const abs = Math.abs(value)\n const sign = value < 0 ? '-' : ''\n if (abs >= 1e9) return `${sign}$${(abs / 1e9).toFixed(abs >= 1e10 ? 0 : 1)}B`\n if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(abs >= 1e7 ? 0 : 1)}M`\n if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(abs >= 1e4 ? 0 : 1)}K`\n return `${sign}$${abs.toFixed(0)}`\n }\n if (itemType === 'percent') {\n return `${(value * 100).toLocaleString('en-US', { maximumFractionDigits: 1 })}%`\n }\n if (itemType === 'multiple') {\n return `${value.toLocaleString('en-US', { maximumFractionDigits: 1 })}×`\n }\n if (itemType === 'days') {\n return value.toLocaleString('en-US', { maximumFractionDigits: 0 })\n }\n return value.toLocaleString('en-US', { maximumFractionDigits: 2 })\n}\n","/**\n * Join a chart panel's series to their plottable points.\n *\n * The server ships chart config (series identity) and rendering (values +\n * periods) separately so the value matrix is never duplicated. This resolves\n * each series' `elementId` to its rendering row and zips it against the\n * periods' `end` dates into `{ x, y }` points — the shape the renderer draws.\n * Series whose element has no rendering row (or an unexpected value-length\n * mismatch) are dropped, so a stale chart arm never crashes the plot.\n */\nimport type { ChartPanel, ChartRendering, ChartSeriesData } from './types'\n\nexport function joinChartSeries(panel: ChartPanel, rendering: ChartRendering): ChartSeriesData[] {\n const rowByElement = new Map(rendering.rows.map((r) => [r.elementId, r]))\n const periods = rendering.periods\n const out: ChartSeriesData[] = []\n for (const series of panel.series) {\n const row = rowByElement.get(series.elementId)\n if (!row) continue\n const points = periods.map((p, i) => ({\n x: p.end,\n y: i < row.values.length ? row.values[i] : null,\n }))\n out.push({\n key: series.key,\n label: series.label,\n itemType: panel.itemType,\n points,\n })\n }\n return out\n}\n","/**\n * Categorical series palette — the validated eight-hue order (dataviz\n * reference instance). Light-mode hexes are the fallbacks; a host app themes\n * dark mode (and its own brand) by setting the `--rs-chart-series-N` tokens,\n * the same `--rs-*` override pattern the statement components use.\n *\n * The order is the CVD-safety mechanism, not cosmetic: this sequence clears\n * every adjacent gate in both light and dark (worst adjacent CVD ΔE 9.1 light\n * / 8.4 dark; normal-vision ΔE 19.6 / 19.3). Series are assigned by fixed\n * index within a panel, never cycled — metric panels carry at most a handful\n * of series, well inside eight.\n */\n\n/** Light-mode fallbacks (the validated default; host tokens override). */\nexport const SERIES_COLORS_LIGHT = [\n '#2a78d6', // 1 blue\n '#eb6834', // 2 orange\n '#1baf7a', // 3 aqua\n '#eda100', // 4 yellow\n '#e87ba4', // 5 magenta\n '#008300', // 6 green\n '#4a3aa7', // 7 violet\n '#e34948', // 8 red\n] as const\n\n/** Dark-mode steps (same eight hues re-stepped for the dark surface). */\nexport const SERIES_COLORS_DARK = [\n '#3987e5',\n '#d95926',\n '#199e70',\n '#c98500',\n '#d55181',\n '#008300',\n '#9085e9',\n '#e66767',\n] as const\n\n/**\n * The CSS color reference for series slot `index` (0-based): a `--rs-chart-\n * series-N` token with the validated light hex as its fallback. Slots past\n * eight reuse the last — metric panels never reach that, and a host with more\n * series should fold to \"Other\" per the categorical rule.\n */\nexport function seriesColor(index: number): string {\n const slot = Math.min(index, SERIES_COLORS_LIGHT.length - 1)\n return `var(--rs-chart-series-${slot + 1}, ${SERIES_COLORS_LIGHT[slot]})`\n}\n","/**\n * Presentation/calculation helpers over a `NormalizedReport`, plus the live\n * footing check used by the fact inspector.\n *\n * The heavy lifting — turning a report into renderable tables — now lives in the\n * fact pivot engine (`pivot.ts`). This file holds the small, reusable graph\n * utilities that the engine and the components share: the presentation-order\n * walk, the calculation-subtotal set, single-section slicing, and `footCheck`.\n */\nimport { humanize, qname } from './constants'\nimport type { CalcAssociation, ElementInfo, NormalizedReport, PivotTable } from './model'\n\ninterface OrderEntry {\n order: number\n depth: number\n}\n\nfunction fallbackElement(id: string): ElementInfo {\n return {\n id,\n qname: qname(id),\n label: humanize(id),\n balance: null,\n periodType: null,\n abstract: false,\n monetary: false,\n }\n}\n\n/**\n * Post-order the presentation arcs of one structure → `{element: {order, depth}}`.\n * Roots (a `from` that is never a `to`) are visited by their subtree's leading\n * arc order. Retained as a reusable utility; the pivot engine builds its own\n * pre-order tree (it needs abstract headers), but external callers may still want\n * a flat order map.\n */\nexport function presentationOrder(\n model: NormalizedReport,\n structureId: string\n): Map<string, OrderEntry> {\n const children = new Map<string, Array<[number, string]>>()\n const froms = new Set<string>()\n const tos = new Set<string>()\n\n for (const assoc of model.presAssociations) {\n if (assoc.structure !== structureId) continue\n const kids = children.get(assoc.parent) ?? []\n kids.push([assoc.order, assoc.child])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n for (const kids of children.values()) {\n kids.sort((a, b) => a[0] - b[0])\n }\n\n const out = new Map<string, OrderEntry>()\n const seen = new Set<string>()\n let counter = 0\n\n const walk = (node: string, depth: number): void => {\n if (seen.has(node)) return\n seen.add(node)\n for (const [, child] of children.get(node) ?? []) {\n walk(child, depth + 1)\n }\n out.set(node, { order: counter, depth })\n counter += 1\n }\n\n const rootKey = (root: string): number => {\n const kids = children.get(root)\n return kids && kids.length ? kids[0][0] : 0\n }\n\n const roots = [...froms].filter((f) => !tos.has(f)).sort((a, b) => rootKey(a) - rootKey(b))\n for (const root of roots) walk(root, 0)\n return out\n}\n\n/** Concepts that are calculation parents — the authoritative subtotal set. */\nexport function calcSubtotals(model: NormalizedReport): Set<string> {\n const out = new Set<string>()\n for (const assoc of model.calcAssociations) out.add(assoc.parent)\n return out\n}\n\n/**\n * Narrow a whole report to a single section (one Information Block) so it can be\n * rendered on its own. `buildPivots` only iterates `informationBlocks`, so\n * restricting to one yields exactly that section — facts, structures, and\n * networks stay intact because the pivot filters them by the block.\n */\nexport function sliceReportSection(\n model: NormalizedReport,\n informationBlockId: string\n): NormalizedReport {\n const ib = model.informationBlocks.find((b) => b.id === informationBlockId)\n return { ...model, informationBlocks: ib ? [ib] : [] }\n}\n\n// ── Footing check ────────────────────────────────────────────────────────────\n\nexport interface FootTerm {\n element: ElementInfo\n weight: number\n value: number | null\n}\n\nexport interface FootCheck {\n element: ElementInfo\n columnIndex: number\n terms: FootTerm[]\n /** Σ child·weight over the present terms, or null if none are present. */\n expected: number | null\n /** The subtotal's own reported value in this column. */\n actual: number | null\n ok: boolean\n}\n\n/**\n * Foot a subtotal live: sum its calculation children (× weight) and compare to\n * its reported value, e.g. `13,550 + 900 = 14,450 ✓`. Returns `null` when the\n * element is not a calculation parent (nothing to foot). Values are read from the\n * consolidated (undimensioned) row for each concept.\n */\nexport function footCheck(\n model: NormalizedReport,\n table: PivotTable,\n elementId: string,\n columnIndex: number\n): FootCheck | null {\n // One arc per (structure, child). A summation cannot legitimately name the\n // same child twice on one ELR, and a producer that emits the arc twice would\n // otherwise count the child twice and report the subtotal as off by exactly\n // that child (robosystems #1395: a disclosure's arcs reached the bundle from\n // two paths, so its note footed to 2x its reported total). Deduplication is\n // per structure, so the SEC adapter's per-section arcs — the same\n // parent -> child presented on several sections — are untouched.\n const kids: CalcAssociation[] = []\n const seen = new Set<string>()\n for (const a of model.calcAssociations) {\n if (a.parent !== elementId) continue\n const key = `${a.structure ?? ''}\\u0000${a.child}`\n if (seen.has(key)) continue\n seen.add(key)\n kids.push(a)\n }\n if (!kids.length) return null\n\n const valueOf = (id: string): number | null => {\n const row = table.rows.find((r) => r.element.id === id && r.members.length === 0)\n return row ? (row.cells[columnIndex]?.value ?? null) : null\n }\n\n const terms: FootTerm[] = kids\n .slice()\n .sort((a, b) => a.order - b.order)\n .map((a) => ({\n element: model.elements[a.child] ?? fallbackElement(a.child),\n weight: a.weight,\n value: valueOf(a.child),\n }))\n\n const present = terms.filter((t) => t.value !== null)\n const expected = present.length\n ? present.reduce((sum, t) => sum + (t.value as number) * t.weight, 0)\n : null\n const actual = valueOf(elementId)\n const ok = expected !== null && actual !== null && Math.abs(expected - actual) < 0.005\n\n return {\n element: model.elements[elementId] ?? fallbackElement(elementId),\n columnIndex,\n terms,\n expected,\n actual,\n ok,\n }\n}\n","/**\n * The fact pivot engine — a `NormalizedReport` section → a `PivotTable`.\n *\n * A section is an XBRL hypercube; rendering it is pivoting its fact table. Every\n * fact is a point in aspect space (concept · period · entity · unit · dimensions);\n * a `PivotConfig` assigns each aspect a role — row, column, or slicer — and the\n * cells fall out. The default arrangement (concept hierarchy + multi-member\n * dimensions on rows, period on columns, entity and single-member dimensions as\n * slicers) is derived per section, but nothing is hardcoded: a caller can move\n * any aspect to any role (the Pesseract \"override the default view\" model) —\n * `pivotDimensionsOn` flips dimensions between rows and columns for the toggle.\n *\n * This supersedes the collision-prone `(element, period.end)` cell keying of the\n * legacy `buildStatement`. A cell is the one fact whose *full* aspect signature —\n * element, period, and dimensional coordinate — matches its row and column, so\n * segment/component breakdowns and consolidated totals occupy distinct cells\n * instead of silently overwriting one another. Because every cell owns its fact,\n * the fact's own period/unit metadata is exact (no borrowing from a merged\n * column), which is what fixes the wrong-metadata symptom too.\n */\nimport { BLOCK_ORDER, BLOCK_TITLES, humanize, qname } from './constants'\nimport { formatDate, numericKindOf } from './format'\nimport type {\n AspectKey,\n DimensionQualifier,\n ElementInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n PeriodInfo,\n PivotColumn,\n PivotColumnHeader,\n PivotConfig,\n PivotRow,\n PivotSlicer,\n PivotTable,\n ResolvedScale,\n Scale,\n StructureInfo,\n} from './model'\nimport { calcSubtotals } from './project'\nimport type { SectionKind } from './sections'\n\n// ── Aspect / signature helpers ──────────────────────────────────────────────\n\n/** The domain-total coordinate for an axis (a fact with no member on it). */\nconst DOMAIN = '∅' // ∅\n\n/** The `dim:<axis>` aspect key for an axis IRI/qname. */\nfunction dimKey(axis: string): AspectKey {\n return `dim:${axis}`\n}\n\n/** The axis IRI behind a `dim:<axis>` key, or null for a builtin aspect. */\nfunction axisOf(key: AspectKey): string | null {\n return key.startsWith('dim:') ? key.slice(4) : null\n}\n\n/** The dimension axes named by a role's aspect list, in order. */\nfunction dimAxes(keys: AspectKey[]): string[] {\n return keys.map(axisOf).filter((a): a is string => a !== null)\n}\n\n/** A fact's members keyed by axis (empty when consolidated). */\nfunction memberByAxis(fact: Fact): Map<string, DimensionQualifier> {\n const m = new Map<string, DimensionQualifier>()\n for (const d of fact.dimensions ?? []) m.set(d.axis, d)\n return m\n}\n\n/** The signature key one qualifier contributes: member, typed value, or domain. */\nfunction memberKey(d: DimensionQualifier | null | undefined): string {\n return d?.member ?? d?.typedValue ?? DOMAIN\n}\n\n/**\n * The ISO date one day before `date`. XBRL dates a beginning-of-period instant\n * as the prior period's end (FY2026 runs 2025-01-27 → 2026-01-25; its opening\n * balance is the instant 2025-01-26), so a `periodStart*` row binds the instant\n * at the duration's start date minus one day (with the exact start date as a\n * fallback for non-SEC conventions).\n */\nfunction isoDayBefore(date: string): string {\n const t = new Date(`${date}T00:00:00Z`)\n if (Number.isNaN(t.getTime())) return date\n t.setUTCDate(t.getUTCDate() - 1)\n return t.toISOString().slice(0, 10)\n}\n\n/**\n * A fact's coordinate along a chosen set of axes, as a stable signature. A fact\n * with no member on an axis contributes the domain-total marker, so the\n * consolidated total gets its own coordinate distinct from every member.\n */\nfunction coordinate(byAxis: Map<string, DimensionQualifier>, axes: string[]): string {\n return axes.map((a) => `${a}=${memberKey(byAxis.get(a))}`).join('|')\n}\n\n/** Facts belonging to one section (its Information Block's factset). */\nfunction sectionFacts(model: NormalizedReport, ib: InformationBlock): Fact[] {\n const target = ib.factSet\n if (target === null) return []\n // Membership, not equality: a fact may belong to several factSets (a summary\n // concept presented in multiple structures), so include it when THIS section is\n // among them. Fall back to the single `factSet` for adapters that set only one.\n return model.facts.filter((f) =>\n (f.factSets ?? (f.factSet !== null ? [f.factSet] : [])).includes(target)\n )\n}\n\n/** The local part of a qname (`us-gaap:Assets` → `Assets`). */\nfunction localName(qname: string): string {\n return qname.includes(':') ? (qname.split(':').pop() as string) : qname\n}\n\n/**\n * Local names of every element in a structure's presentation network. A section\n * only *owns* the dimension axes declared here (its hypercube's axes appear as\n * presentation nodes); facts carrying any other axis are a different table's\n * breakdown — e.g. segment revenue tagged to the income-statement role — and must\n * not be pivoted into this statement. Matched by local name so a company-specific\n * axis (`nvda:FooAxis`) lines up regardless of prefix.\n */\nfunction presentationNodeLocals(model: NormalizedReport, structureId: string): Set<string> {\n const out = new Set<string>()\n for (const a of model.presAssociations) {\n if (a.structure !== structureId) continue\n out.add(localName(a.parent))\n out.add(localName(a.child))\n }\n return out\n}\n\ninterface PresentationScope {\n /** Local names of every presentation node (axes, members, line items). */\n declared: Set<string>\n /** Whether the presentation lists explicit members (a closed member set). */\n listsMembers: boolean\n}\n\n/**\n * The section's dimensional scope. Many \"Details\" disclosures share one hypercube\n * factset (every debt instrument, every segment), and are distinguished only by\n * which *members* each network's presentation declares — so \"DEBT, DuQuoin State\n * Bank\" and \"DEBT, CREM Loan\" pull from the same facts but must show different\n * rows. When the presentation lists members, a fact whose member on any axis is\n * not declared belongs to a sibling disclosure and is out of scope.\n */\nfunction presentationScope(model: NormalizedReport, structureId: string): PresentationScope {\n const declared = presentationNodeLocals(model, structureId)\n let listsMembers = false\n for (const l of declared) {\n if (l.endsWith('Member')) {\n listsMembers = true\n break\n }\n }\n return { declared, listsMembers }\n}\n\n/** Whether a dimension is in a section's declared scope (axis + member). */\nfunction dimensionInScope(scope: PresentationScope, d: DimensionQualifier): boolean {\n if (!scope.declared.has(localName(d.axis))) return false\n return !scope.listsMembers || d.member === null || scope.declared.has(localName(d.member))\n}\n\n// ── Presentation tree ───────────────────────────────────────────────────────\n\n/**\n * One presentation arc as the row walk consumes it: the child plus the arc's\n * preferred-label choice. `binding` is the roll-forward semantic — a\n * `periodStart*` / `periodEnd*` role means this arc's row binds the instant\n * fact at the START (respectively end) of each duration column, so the same\n * concept legitimately appears twice (beginning and ending balance).\n */\ninterface PresArcRef {\n child: string\n label: string | null\n binding: 'start' | 'end' | null\n negated: boolean\n}\n\ninterface PresentationTree {\n /** Ordered child arcs per parent (by arc order). */\n childrenOf: Map<string, PresArcRef[]>\n /** Presentation roots (a `from` that is never a `to`), in filing sequence. */\n roots: string[]\n /** Pre-order position of each element — the member/row ordering key. */\n indexOf: Map<string, number>\n}\n\nfunction arcRef(a: {\n child: string\n preferredLabel?: string | null\n preferredLabelRole?: string | null\n}): PresArcRef {\n const role = a.preferredLabelRole ?? ''\n return {\n child: a.child,\n label: a.preferredLabel ?? null,\n binding: /periodStart/i.test(role) ? 'start' : /periodEnd/i.test(role) ? 'end' : null,\n negated: /negated/i.test(role),\n }\n}\n\n/**\n * Index one structure's presentation arcs: ordered child arcs per parent, the\n * roots, and each element's pre-order position (used to order dimension members).\n * The row walk itself (in `buildPivot`) is a hybrid — abstract headers emit\n * before their children, concrete concepts after — so a subtotal renders after\n * its components whether the taxonomy models it as an abstract's last child\n * (us-gaap) or as the presentation parent of its components (rs-gaap).\n */\nfunction presentationTree(model: NormalizedReport, structureId: string): PresentationTree {\n const children = new Map<string, Array<[number, PresArcRef]>>()\n const froms = new Set<string>()\n const tos = new Set<string>()\n for (const assoc of model.presAssociations) {\n if (assoc.structure !== structureId) continue\n const kids = children.get(assoc.parent) ?? []\n kids.push([assoc.order, arcRef(assoc)])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n const childrenOf = new Map<string, PresArcRef[]>()\n for (const [parent, kids] of children) {\n childrenOf.set(\n parent,\n kids.sort((a, b) => a[0] - b[0]).map(([, arc]) => arc)\n )\n }\n const rootKey = (root: string): number => {\n const kids = children.get(root)\n return kids && kids.length ? kids[0][0] : 0\n }\n const roots = [...froms].filter((f) => !tos.has(f)).sort((a, b) => rootKey(a) - rootKey(b))\n\n // Keyed by *local name* so member ordering matches a dimension qualifier's\n // member regardless of prefix (a company member `mrmd:RetailMember` reaches the\n // renderer as the bare local `RetailMember`).\n const indexOf = new Map<string, number>()\n const seen = new Set<string>()\n const pre = (node: string): void => {\n if (seen.has(node)) return\n seen.add(node)\n const ln = localName(node)\n if (!indexOf.has(ln)) indexOf.set(ln, indexOf.size)\n for (const arc of childrenOf.get(node) ?? []) pre(arc.child)\n }\n for (const root of roots) pre(root)\n return { childrenOf, roots, indexOf }\n}\n\n/** The structure supplying a block's networks (by id, else by block type). */\nfunction structureForBlock(model: NormalizedReport, ib: InformationBlock): StructureInfo | null {\n if (ib.structureId) {\n const byId = model.structures.find((s) => s.id === ib.structureId)\n if (byId) return byId\n }\n return model.structures.find((s) => s.blockType === ib.blockType) ?? null\n}\n\nfunction fallbackElement(id: string): ElementInfo {\n return {\n id,\n qname: qname(id),\n label: humanize(id),\n balance: null,\n periodType: null,\n abstract: false,\n monetary: false,\n }\n}\n\nconst elementOf = (model: NormalizedReport, id: string): ElementInfo =>\n model.elements[id] ?? fallbackElement(id)\n\n/**\n * Pure XBRL hypercube plumbing: a `[Table]` (the hypercube itself) and its\n * `[Line Items]` container. These abstracts exist only to hang dimensional facts\n * off of — they carry no data, and once their role tag is stripped for display\n * they collapse to a bare, duplicated \"Statement\" heading. So they are never a\n * meaningful row: skip the header and promote their children in their place.\n * Keyed off the concept's local name (identical across the store and SEC routes,\n * which key elements by IRI vs qname respectively) so both render the same.\n */\nconst SCAFFOLD_LOCAL_RE = /(?:Table|LineItems)$/\nfunction isStructuralScaffold(el: ElementInfo): boolean {\n return el.abstract && SCAFFOLD_LOCAL_RE.test(localName(el.qname))\n}\n\n/**\n * A heading row that says exactly what the section header above it already\n * says. Compared loosely — case and surrounding punctuation/whitespace differ\n * between a role definition's title and a concept's standard label — but only\n * on the whole string, so a genuine sub-heading is never swallowed.\n */\nfunction restatesTitle(label: string, title: string): boolean {\n const normalize = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n const normalized = normalize(label)\n return normalized.length > 0 && normalized === normalize(title)\n}\n\n// ── Default configuration ───────────────────────────────────────────────────\n\n/**\n * Derive the default pivot for a section from the aspects its facts actually\n * carry: concept on rows, period on columns, entity a slicer, and each dimension\n * axis on columns when it has more than one member (a real breakdown) or a slicer\n * when it has just one (diced to a single member, e.g. `Consolidated [Domain]`).\n */\nexport function defaultPivotConfig(model: NormalizedReport, ib: InformationBlock): PivotConfig {\n const facts = sectionFacts(model, ib)\n const structure = structureForBlock(model, ib)\n // Only the axes *and members* this section's presentation/hypercube declares\n // belong in its view — so an axis that's a single declared member becomes a\n // slicer, not a spurious multi-member breakdown from a sibling disclosure.\n const scope = structure\n ? presentationScope(model, structure.id)\n : { declared: new Set<string>(), listsMembers: false }\n const membersByAxis = new Map<string, Set<string>>()\n let hasEntity = false\n for (const f of facts) {\n if (f.entity) hasEntity = true\n for (const d of f.dimensions ?? []) {\n if (!dimensionInScope(scope, d)) continue\n const set = membersByAxis.get(d.axis) ?? new Set<string>()\n set.add(d.member ?? d.typedValue ?? DOMAIN)\n membersByAxis.set(d.axis, set)\n }\n }\n const axes = [...membersByAxis.keys()].sort()\n const memberAxes = axes.filter((a) => (membersByAxis.get(a)?.size ?? 0) > 1)\n const slicerAxes = axes.filter((a) => (membersByAxis.get(a)?.size ?? 0) <= 1)\n\n // Dimensions default to *rows* (nested under the concept): financial statements\n // are tall, not wide, so member breakdowns stack more legibly than they spread\n // across columns. `pivotDimensionsOn` flips them to columns for the matrix view.\n return {\n rows: ['concept', ...memberAxes.map(dimKey)],\n columns: ['period'],\n slicers: [...(hasEntity ? (['entity'] as AspectKey[]) : []), ...slicerAxes.map(dimKey)],\n scale: 'auto',\n showAbstracts: true,\n dropSparsePeriods: true,\n }\n}\n\n/**\n * Move every dimension axis to one side of the pivot — the toggle behind a\n * \"dimensions as rows / columns\" control. Concept stays on rows and period on\n * columns; only `dim:*` aspects move. Rows (nested breakdowns) is the default;\n * columns gives the side-by-side matrix (equity components across the top).\n */\nexport function pivotDimensionsOn(config: PivotConfig, placement: 'rows' | 'columns'): PivotConfig {\n const isDim = (k: AspectKey): boolean => k.startsWith('dim:')\n const dims = [...config.rows, ...config.columns].filter(isDim)\n const rows = config.rows.filter((k) => !isDim(k))\n const columns = config.columns.filter((k) => !isDim(k))\n if (placement === 'rows') rows.push(...dims)\n else columns.push(...dims)\n return { ...config, rows, columns }\n}\n\n// ── Columns ─────────────────────────────────────────────────────────────────\n\n/** Fraction of the densest period a column must reach to count as a real one. */\nconst PERIOD_DENSITY_FRACTION = 0.2\n\n/**\n * Drop \"incomplete\" period columns — incidental context dates that aren't real\n * reporting periods: a transaction date (a single fact), a prior-year opening\n * balance, a stub period. The SEC/Arelle renderer selects reporting periods by\n * type + recency (most-recent instants aligned to the fiscal year-end for a\n * balance sheet, day-count-classified durations for income); we approximate that\n * with density, which separates the same set here — a real comparative repeats\n * most line items and clears the bar, while an incidental date is sparse. Keep a\n * period whose populated-fact count is at least `PERIOD_DENSITY_FRACTION` of the\n * densest (min 2), when the densest is non-trivial. Metadata-safe: cells still\n * own their own facts, so a dropped column can never mislabel a kept one.\n */\nfunction pruneSparsePeriods(\n model: NormalizedReport,\n facts: Fact[],\n periods: PeriodInfo[]\n): PeriodInfo[] {\n const count = new Map<string, number>()\n for (const f of facts) {\n const populated = f.value !== null || (f.textValue != null && f.textValue !== '')\n const period = model.periods[f.period]\n if (!period?.end || !populated) continue\n const key = periodKey(period)\n count.set(key, (count.get(key) ?? 0) + 1)\n }\n // A column's density is its own period's facts. The closing instants at a\n // duration's end render inside it but do not make it a reporting period: a\n // fourth-quarter stub a filer tags in an annual roll-forward has two facts of\n // its own and shares the year's closing balances — those must not keep it.\n const density = (p: PeriodInfo): number => count.get(periodKey(p)) ?? 0\n const max = Math.max(0, ...periods.map(density))\n if (max < 5) return periods\n const threshold = Math.max(2, max * PERIOD_DENSITY_FRACTION)\n return periods.filter((p) => density(p) >= threshold)\n}\n\n/**\n * The key a period column is built on. A duration is its whole span, so the\n * three- and six-month columns a 10-Q reports to the same date stay distinct\n * instead of collapsing into one column that shows whichever fact was indexed\n * last; an instant is its date.\n */\nfunction periodKey(period: PeriodInfo): string {\n return period.type === 'duration' && period.startDate\n ? `${period.startDate}/${period.end}`\n : period.end\n}\n\n/**\n * The fact keys a column reads: its own period and, for a duration, the instant\n * at its end — a closing balance sits inside the flow column that ends on it.\n */\nfunction columnPeriodKeys(period: PeriodInfo | null): string[] {\n if (!period) return ['']\n const key = periodKey(period)\n return key === period.end ? [key] : [key, period.end]\n}\n\n/** Days a duration covers; 0 for an instant or a duration without a start. */\nfunction spanDays(period: PeriodInfo): number {\n if (period.type !== 'duration' || !period.startDate) return 0\n const start = Date.parse(period.startDate)\n const end = Date.parse(period.endDate ?? period.end)\n if (Number.isNaN(start) || Number.isNaN(end)) return 0\n return Math.round((end - start) / 86_400_000)\n}\n\n/** Whole months a duration covers, so a 52- and a 53-week year read as the same span. */\nfunction spanMonths(period: PeriodInfo): number {\n const days = spanDays(period)\n return days === 0 ? 0 : Math.max(1, Math.round(days / 30.44))\n}\n\nconst MONTH_WORDS = [\n 'One',\n 'Two',\n 'Three',\n 'Four',\n 'Five',\n 'Six',\n 'Seven',\n 'Eight',\n 'Nine',\n 'Ten',\n 'Eleven',\n 'Twelve',\n]\n\n/**\n * The header a duration column carries above its date when a table reports\n * more than a plain year: \"Three months ended\" over the quarter columns, \"Six\n * months ended\" over the year-to-date ones. An instant has no span.\n */\nfunction spanLabel(period: PeriodInfo): string {\n const months = spanMonths(period)\n if (months === 0) return ''\n if (months === 12) return 'Year ended'\n const word = MONTH_WORDS[months - 1] ?? String(months)\n return `${word} month${months === 1 ? '' : 's'} ended`\n}\n\n/** Shorter spans first (the quarters before the year-to-date), then by date. */\nfunction comparePeriods(a: PeriodInfo, b: PeriodInfo): number {\n return (\n spanMonths(a) - spanMonths(b) ||\n (a.startDate ?? a.end).localeCompare(b.startDate ?? b.end) ||\n a.end.localeCompare(b.end)\n )\n}\n\n/**\n * Period columns: every duration, keyed by its whole span, plus the instants no\n * duration ends on. An instant that shares a duration's end is that column's\n * closing balance, not a column of its own.\n */\nfunction derivePeriods(model: NormalizedReport, facts: Fact[]): PeriodInfo[] {\n const durations = new Map<string, PeriodInfo>()\n const instants = new Map<string, PeriodInfo>()\n for (const fact of facts) {\n const period = model.periods[fact.period]\n if (!period || !period.end) continue\n if (period.type === 'duration') durations.set(periodKey(period), period)\n else instants.set(period.end, period)\n }\n const durationEnds = new Set([...durations.values()].map((p) => p.end))\n return [\n ...durations.values(),\n ...[...instants.values()].filter((p) => !durationEnds.has(p.end)),\n ].sort(comparePeriods)\n}\n\ninterface MemberCombo {\n /** Signature over the chosen axes (domain-total for a missing member). */\n sig: string\n /** One qualifier per axis — null where this combo is the axis's domain total. */\n members: DimensionQualifier[]\n /** Header segment labels, one per axis. */\n labels: string[]\n}\n\n/**\n * The distinct member combinations present across `facts` for the chosen axes,\n * ordered by each member's presentation position. The union across periods, so\n * the grid is regular (a member absent in one period shows an empty cell rather\n * than a ragged set). `domainLast` places the domain total (the consolidated,\n * memberless combo) after its members — a trailing \"Total\" column, or on rows the\n * concept's summing total below its member breakdown.\n */\nfunction memberCombos(\n facts: Fact[],\n axes: string[],\n order: Map<string, number>,\n domainLast: boolean\n): MemberCombo[] {\n if (axes.length === 0) return [{ sig: '', members: [], labels: [] }]\n\n // Distinct members seen per axis (+ whether a domain total exists), plus a\n // representative qualifier so we can render a member's label without re-joining.\n const perAxis = axes.map((axis) => {\n const byMember = new Map<string, DimensionQualifier | null>()\n let hasDomain = false\n for (const f of facts) {\n const d = (f.dimensions ?? []).find((x) => x.axis === axis)\n if (d) byMember.set(d.member ?? d.typedValue ?? DOMAIN, d)\n else hasDomain = true\n }\n const members = [...byMember.entries()]\n .map(([key, qual]) => ({ key, qual }))\n .sort((a, b) => {\n const ao = a.qual?.member ? (order.get(localName(a.qual.member)) ?? Infinity) : Infinity\n const bo = b.qual?.member ? (order.get(localName(b.qual.member)) ?? Infinity) : Infinity\n return ao - bo || (a.qual?.memberLabel ?? a.key).localeCompare(b.qual?.memberLabel ?? b.key)\n })\n if (hasDomain) {\n const domain = { key: DOMAIN, qual: null }\n if (domainLast) members.push(domain)\n else members.unshift(domain)\n }\n return { axis, members }\n })\n\n // Cartesian product across axes → ordered combos.\n let combos: MemberCombo[] = [{ sig: '', members: [], labels: [] }]\n for (const { axis, members } of perAxis) {\n const next: MemberCombo[] = []\n for (const combo of combos) {\n for (const { key, qual } of members) {\n next.push({\n sig: combo.sig ? `${combo.sig}|${axis}=${key}` : `${axis}=${key}`,\n members: [...combo.members, ...(qual ? [qual] : [])],\n labels: [...combo.labels, qual ? qual.memberLabel : 'Total'],\n })\n }\n }\n combos = next\n }\n return combos\n}\n\n/** Run-length-encode leaf-column segment tuples into spanning header levels. */\nfunction headerLevels(segsPerColumn: string[][]): PivotColumnHeader[][] {\n const levels = segsPerColumn[0]?.length ?? 0\n const out: PivotColumnHeader[][] = []\n for (let level = 0; level < levels; level++) {\n const row: PivotColumnHeader[] = []\n let i = 0\n while (i < segsPerColumn.length) {\n // Merge consecutive columns equal at this level *and* all ancestor levels.\n let span = 1\n while (\n i + span < segsPerColumn.length &&\n segsPerColumn[i + span][level] === segsPerColumn[i][level] &&\n Array.from({ length: level + 1 }, (_, l) => l).every(\n (l) => segsPerColumn[i + span][l] === segsPerColumn[i][l]\n )\n ) {\n span++\n }\n row.push({ label: segsPerColumn[i][level], span })\n i += span\n }\n out.push(row)\n }\n return out\n}\n\n// ── Scale ───────────────────────────────────────────────────────────────────\n\nconst SCALE_FACTOR: Record<Exclude<Scale, 'auto'>, { factor: number; label: string }> = {\n ones: { factor: 1, label: '' },\n thousands: { factor: 1e3, label: 'thousands' },\n millions: { factor: 1e6, label: 'millions' },\n billions: { factor: 1e9, label: 'billions' },\n}\n\n/**\n * Resolve the section's display scale. `auto` picks the most common rounding\n * (`decimals`) among monetary facts — `-6` → millions, `-3..-5` → thousands — and\n * captions it, noting the per-share exception when the section also has EPS or\n * share-count facts (which are never rescaled).\n */\nfunction resolveScale(facts: Fact[], model: NormalizedReport, requested: Scale): ResolvedScale {\n const kindOf = (id: string): string => numericKindOf(elementOf(model, id))\n\n let factor = 1\n let label = ''\n if (requested !== 'auto') {\n ;({ factor, label } = SCALE_FACTOR[requested])\n } else {\n const decimalsCount = new Map<number, number>()\n for (const f of facts) {\n if (f.value === null || kindOf(f.element) !== 'monetary') continue\n const d = f.decimals === null || f.decimals === 'INF' ? NaN : Number(f.decimals)\n if (Number.isNaN(d) || d >= 0) continue\n decimalsCount.set(d, (decimalsCount.get(d) ?? 0) + 1)\n }\n let dominant = 0\n let best = 0\n for (const [d, count] of decimalsCount) {\n if (count > best) {\n best = count\n dominant = d\n }\n }\n if (dominant <= -9) ({ factor, label } = SCALE_FACTOR.billions)\n else if (dominant <= -6) ({ factor, label } = SCALE_FACTOR.millions)\n else if (dominant <= -3) ({ factor, label } = SCALE_FACTOR.thousands)\n }\n\n let caption: string | null = null\n if (factor > 1) {\n const hasPerShare = facts.some((f) => {\n const k = kindOf(f.element)\n return f.value !== null && (k === 'perShare' || k === 'shares')\n })\n caption = hasPerShare ? `In ${label}, except per-share amounts` : `In ${label}`\n }\n return { factor, label, caption }\n}\n\n// ── Slicers ─────────────────────────────────────────────────────────────────\n\nfunction buildSlicers(\n model: NormalizedReport,\n config: PivotConfig,\n diced: Map<string, DimensionQualifier | null>\n): PivotSlicer[] {\n const slicers: PivotSlicer[] = []\n for (const key of config.slicers) {\n if (key === 'entity') {\n if (model.entity) {\n slicers.push({\n aspect: 'entity',\n label: 'Reporting Entity',\n valueLabel: model.entity.name,\n })\n }\n continue\n }\n const axis = axisOf(key)\n if (!axis) continue\n // A slicer dimension is diced to a single member (or its domain total) —\n // the same coordinate the fact index binds cells against, so the chip\n // states exactly what the cells show.\n const qual = diced.get(axis) ?? null\n const axisLabel = qual?.axisLabel ?? humanize(axis)\n slicers.push({\n aspect: key,\n label: `${axisLabel} [Axis]`,\n valueLabel: qual ? qual.memberLabel : 'Consolidated',\n })\n }\n return slicers\n}\n\n// ── Build ───────────────────────────────────────────────────────────────────\n\n/**\n * Pivot one section into a `PivotTable`. Pass `config` to override the default\n * arrangement (e.g. move a high-arity axis from columns to rows).\n */\nexport function buildPivot(\n model: NormalizedReport,\n ib: InformationBlock,\n config: PivotConfig = defaultPivotConfig(model, ib)\n): PivotTable {\n const structure = structureForBlock(model, ib)\n const tree: PresentationTree = structure\n ? presentationTree(model, structure.id)\n : { childrenOf: new Map(), roots: [], indexOf: new Map() }\n\n const rowDimAxes = dimAxes(config.rows)\n const colDimAxes = dimAxes(config.columns)\n const allowedAxes = new Set([...rowDimAxes, ...colDimAxes, ...dimAxes(config.slicers)])\n const scope: PresentationScope = structure\n ? presentationScope(model, structure.id)\n : { declared: new Set(), listsMembers: false }\n\n // In-table facts: drop any carrying an axis this configuration doesn't place,\n // or (when the section lists members) a member its presentation doesn't declare\n // — a sibling disclosure's row that shares this hypercube's factset.\n const facts = sectionFacts(model, ib).filter((f) =>\n (f.dimensions ?? []).every((d) => allowedAxes.has(d.axis) && dimensionInScope(scope, d))\n )\n\n // Each slicer axis is diced to one coordinate: the (single) member its facts\n // carry, or the domain total when no fact carries the axis. Cell binding and\n // the slicer chips both read this map, so the chip states exactly which\n // coordinate the cells show.\n const dicedSlicers = new Map<string, DimensionQualifier | null>()\n for (const axis of dimAxes(config.slicers)) {\n const qual = facts.flatMap((f) => f.dimensions ?? []).find((d) => d.axis === axis) ?? null\n dicedSlicers.set(axis, qual)\n }\n\n // A fact belongs in the table when every dimension it carries is either shown\n // on rows/columns (where it contributes to the cell signature) or sits on a\n // slicer axis at the diced coordinate. A fact on an axis this pivot doesn't\n // place at all is a finer breakdown of a coarser cell; a fact at a different\n // slicer coordinate is a sibling slice. Both are dropped — indexing either\n // would collide with the cell's rightful fact.\n const shownAxes = new Set([...rowDimAxes, ...colDimAxes])\n const tableFacts = facts.filter((f) =>\n (f.dimensions ?? []).every(\n (d) =>\n shownAxes.has(d.axis) ||\n (dicedSlicers.has(d.axis) && memberKey(d) === memberKey(dicedSlicers.get(d.axis)))\n )\n )\n\n // Columns: period (outer) × member combos over the column axes (inner).\n const periodOnColumns = config.columns.includes('period')\n let periods = periodOnColumns ? derivePeriods(model, tableFacts) : []\n if (periodOnColumns && config.dropSparsePeriods !== false) {\n periods = pruneSparsePeriods(model, tableFacts, periods)\n }\n // A roll-forward's opening instants render as beginning-balance rows *inside*\n // the duration columns (periodStart binding below); a standalone column for\n // the same instant would duplicate that data, so drop it.\n const hasRollForward = [...tree.childrenOf.values()].some((arcs) =>\n arcs.some((a) => a.binding !== null)\n )\n if (periodOnColumns && hasRollForward) {\n const startKeys = new Set(\n periods\n .filter((p) => p.type === 'duration' && p.startDate)\n .flatMap((p) => [isoDayBefore(p.startDate as string), p.startDate as string])\n )\n periods = periods.filter((p) => !(p.type === 'instant' && startKeys.has(p.end)))\n }\n const colCombos = memberCombos(tableFacts, colDimAxes, tree.indexOf, true)\n\n // Column coordinates that actually carry a fact. The member-combo union (and\n // cross-product across axes) yields many (period × member) columns that never\n // occur; drop the empty ones — the column analog of only emitting member rows\n // that have facts.\n const occupiedCols = new Set<string>()\n for (const f of tableFacts) {\n const period = model.periods[f.period]\n const key = period ? periodKey(period) : ''\n occupiedCols.add(`${key}#${coordinate(memberByAxis(f), colDimAxes)}`)\n }\n const occupied = (period: PeriodInfo | null, sig: string): boolean =>\n columnPeriodKeys(period).some((key) => occupiedCols.has(`${key}#${sig}`))\n\n // A table that reports anything other than plain years — a 10-Q's three- and\n // six-month columns end on the same date — carries the span as a header level\n // above the dates. A 10-K's year columns stay as they were.\n const showSpans =\n periodOnColumns && periods.some((p) => p.type === 'duration' && spanLabel(p) !== 'Year ended')\n\n const columns: PivotColumn[] = []\n const columnSegs: string[][] = []\n const periodList = periodOnColumns ? periods : [null]\n for (const period of periodList) {\n for (const combo of colCombos) {\n if (!occupied(period, combo.sig)) continue\n const key = period ? periodKey(period) : ''\n const periodLabel = period ? formatDate(period.end) : ''\n columns.push({\n key: `${key}#${combo.sig}`,\n period,\n members: combo.members,\n label: combo.labels.length ? combo.labels[combo.labels.length - 1] : periodLabel,\n })\n const periodSegs = periodOnColumns\n ? [...(showSpans ? [period ? spanLabel(period) : ''] : []), periodLabel]\n : []\n columnSegs.push([...periodSegs, ...combo.labels])\n }\n }\n const columnHeaders = headerLevels(columnSegs)\n\n // Index every in-table fact by (element, rowCombo, periodKey, colCombo) so a\n // cell is an O(1) exact-signature lookup — no last-write-wins collisions.\n //\n // A fact that doesn't carry a slicer axis is that axis's domain total and may\n // still bind, but a fact AT the diced coordinate is more specific and wins the\n // cell: with Consolidation Items diced to `Operating Segments`, the\n // operating-segments total owns the aggregate cell, not the consolidated\n // face-statement fact that shares its factset. Ascending-specificity insertion\n // makes the map's last write the most specific fact.\n const slicerSpecificity = (f: Fact): number =>\n (f.dimensions ?? []).filter((d) => !shownAxes.has(d.axis)).length\n const factIndex = new Map<string, Fact>()\n for (const f of [...tableFacts].sort((a, b) => slicerSpecificity(a) - slicerSpecificity(b))) {\n const byAxis = memberByAxis(f)\n const period = model.periods[f.period]\n const key = period ? periodKey(period) : ''\n const rowSig = coordinate(byAxis, rowDimAxes)\n const colSig = coordinate(byAxis, colDimAxes)\n factIndex.set(`${f.element}␟${rowSig}␟${key}␟${colSig}`, f)\n }\n\n const factfulConcepts = new Set(tableFacts.map((f) => f.element))\n\n // The period keys a row binds against in a column. Default (and `periodEnd`)\n // rows read the column's own span, then the instant at its end; a `periodStart`\n // row reads the instant at the column duration's start — dated the day before\n // the start (the XBRL/SEC convention), with the exact start date as fallback.\n const periodKeysFor = (col: PivotColumn, binding: 'start' | 'end' | null): string[] => {\n if (binding !== 'start') return columnPeriodKeys(col.period)\n const start = col.period?.startDate\n return start ? [isoDayBefore(start), start] : []\n }\n\n const lookupFact = (\n element: string,\n rowSig: string,\n col: PivotColumn,\n binding: 'start' | 'end' | null\n ): Fact | undefined => {\n const colSig = coordinate(new Map(col.members.map((m) => [m.axis, m])), colDimAxes)\n for (const end of periodKeysFor(col, binding)) {\n const fact = factIndex.get(`${element}␟${rowSig}␟${end}␟${colSig}`)\n if (fact) return fact\n }\n return undefined\n }\n\n // Domain total last on rows too: member rows list first, then the concept's\n // own (memberless) total below and outdented — the accounting \"components then\n // total\" layout, so the total reads as the sum of the members above it.\n const rowCombos = memberCombos(tableFacts, rowDimAxes, tree.indexOf, true)\n const combosForConcept = (element: string, binding: 'start' | 'end' | null): MemberCombo[] => {\n const occupied = (combo: MemberCombo): boolean =>\n columns.some((col) => lookupFact(element, combo.sig, col, binding) !== undefined)\n if (rowDimAxes.length === 0) {\n // A start/end row with no bindable fact anywhere must not render at all.\n return binding === null || occupied(rowCombos[0]) ? rowCombos : []\n }\n return rowCombos.filter(occupied)\n }\n\n const cellsFor = (\n element: string,\n rowSig: string,\n binding: 'start' | 'end' | null\n ): PivotRow['cells'] =>\n columns.map((col) => {\n const fact = lookupFact(element, rowSig, col, binding)\n return {\n value: fact?.value ?? null,\n fact: fact ?? null,\n textValue: fact && fact.value === null ? (fact.textValue ?? null) : null,\n }\n })\n\n const subtotals = calcSubtotals(model)\n\n // Prune empty subtrees: only walk into a node that itself has facts or has a\n // fact-bearing descendant, so empty sections (and their headers) don't show.\n const hasFactMemo = new Map<string, boolean>()\n const subtreeHasFact = (id: string): boolean => {\n const cached = hasFactMemo.get(id)\n if (cached !== undefined) return cached\n hasFactMemo.set(id, false) // guard against cycles\n let has = factfulConcepts.has(id)\n for (const arc of tree.childrenOf.get(id) ?? []) {\n if (subtreeHasFact(arc.child)) has = true\n }\n hasFactMemo.set(id, has)\n return has\n }\n\n const rows: PivotRow[] = []\n const emitConcept = (id: string, depth: number, arc: PresArcRef | null): void => {\n const el = elementOf(model, id)\n const binding = arc?.binding ?? null\n const combos = combosForConcept(id, binding)\n if (!combos.length) return\n const rowLabel = arc?.label ?? undefined\n const negated = arc?.negated || undefined\n // A roll-forward concept renders once per arc (beginning / ending balance);\n // the binding suffix keeps those rows' keys distinct.\n const variant = binding ? `${id}␟rf:${binding}` : id\n // With dimensions on rows, a concept's own total row heads its indented member\n // breakdown and supplies the concept name. When the concept has *no*\n // consolidated total (only per-member facts — common in detail disclosures),\n // emit a valueless heading row so the members aren't orphaned member-only\n // labels (`CREM Loan · Mortgages` with no idea what is being measured).\n if (combos.every((c) => c.members.length > 0)) {\n rows.push({\n key: variant,\n element: el,\n depth,\n header: false,\n isSubtotal: subtotals.has(id),\n members: [],\n cells: columns.map(() => ({ value: null, fact: null, textValue: null })),\n label: rowLabel,\n negated,\n })\n }\n for (const combo of combos) {\n // The domain-total combo (no members) keys by the element alone — it's the\n // concept's own total row, identical to the undimensioned case. Only member\n // sub-rows carry the dimensional signature in their key.\n rows.push({\n key: combo.members.length ? `${variant}␟${combo.sig}` : variant,\n element: el,\n depth: depth + (combo.members.length ? 1 : 0),\n header: false,\n isSubtotal: subtotals.has(id),\n members: combo.members,\n cells: cellsFor(id, combo.sig, binding),\n label: rowLabel,\n negated,\n })\n }\n }\n\n // Hybrid walk: an abstract emits its header *before* its children (so the\n // `[Roll Up]` header sits above its section); a concrete concept emits *after*\n // its children (so a subtotal lands below its components) — correct whether the\n // subtotal is an abstract's last child (us-gaap) or the parent itself (rs-gaap).\n //\n // Dedup is per (element, binding): a roll-forward concept appears under TWO\n // arcs — beginning balance at the top of the network, ending balance at the\n // bottom — and each emits its own row; every other repeat of an element is a\n // genuine duplicate and drops.\n const title = ib.structureId\n ? (structure?.structureName ?? ib.label ?? BLOCK_TITLES[ib.blockType] ?? ib.blockType)\n : (BLOCK_TITLES[ib.blockType] ?? ib.label ?? ib.blockType)\n\n const seenInTree = new Set<string>()\n const walkedConcepts = new Set<string>()\n const walk = (arc: PresArcRef, depth: number): void => {\n const id = arc.child\n if (!subtreeHasFact(id)) return\n const el = elementOf(model, id)\n const dedupKey = el.abstract ? id : `${id}␟${arc.binding ?? ''}`\n if (seenInTree.has(dedupKey)) return\n seenInTree.add(dedupKey)\n walkedConcepts.add(id)\n if (el.abstract) {\n // Hypercube scaffolding ([Table]/[Line Items]) is not a heading — hide its\n // row and keep its children at the current depth so the tree stays flat.\n // A root abstract that only restates the section's own title is the same\n // kind of non-heading: it would print \"Income Statement\" immediately\n // under the heading \"Income Statement\". rs-gaap gives the income\n // statement such a root and the other three primaries none, so hiding it\n // is also what makes the four read alike.\n const scaffold =\n isStructuralScaffold(el) || (depth === 0 && restatesTitle(arc.label ?? el.label, title))\n if (config.showAbstracts && !scaffold) {\n rows.push({\n key: id,\n element: el,\n depth,\n header: true,\n isSubtotal: false,\n members: [],\n cells: [],\n label: arc.label ?? undefined,\n })\n }\n const childDepth = scaffold ? depth : depth + 1\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, childDepth)\n } else {\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n emitConcept(id, depth, arc)\n }\n }\n for (const root of tree.roots) {\n walk({ child: root, label: null, binding: null, negated: false }, 0)\n }\n // Concepts with facts but absent from the presentation network — append after.\n for (const id of factfulConcepts) {\n if (walkedConcepts.has(id) || elementOf(model, id).abstract) continue\n emitConcept(id, 0, null)\n }\n\n return {\n ib,\n blockType: ib.blockType,\n title,\n structureName: ib.structureId ? null : (structure?.structureName ?? ib.label ?? null),\n definition: structure?.definition ?? null,\n kind: structure?.kind ?? null,\n slicers: buildSlicers(model, config, dicedSlicers),\n columnHeaders,\n columns,\n rows,\n scale: resolveScale(tableFacts, model, config.scale),\n config,\n }\n}\n\n/** Section metadata (id + display title, full definition, kind) in canonical order. */\nexport function reportSections(\n model: NormalizedReport\n): Array<{ id: string; title: string; definition: string | null; kind: SectionKind | null }> {\n return buildPivots(model).map((p) => ({\n id: p.ib.id,\n title: p.title,\n definition: p.definition,\n kind: p.kind,\n }))\n}\n\n/**\n * Pivot every section of a report, in canonical block order. `configFor` may\n * transform each section's default config before it is built — e.g. to apply a\n * \"dimensions as rows / columns\" toggle across the whole report.\n */\nexport function buildPivots(\n model: NormalizedReport,\n configFor?: (ib: InformationBlock, defaultConfig: PivotConfig) => PivotConfig\n): PivotTable[] {\n const order = (ib: InformationBlock): number => {\n if (ib.structureId) {\n const s = model.structures.find((x) => x.id === ib.structureId)\n if (s?.order !== undefined) return s.order\n }\n return BLOCK_ORDER[ib.blockType] ?? 99\n }\n return [...model.informationBlocks]\n .sort((a, b) => order(a) - order(b) || a.blockType.localeCompare(b.blockType))\n .map((ib) =>\n configFor\n ? buildPivot(model, ib, configFor(ib, defaultPivotConfig(model, ib)))\n : buildPivot(model, ib)\n )\n}\n","/**\n * Renders an *externalized* text-block fact — a large XBRL narrative/table\n * disclosure whose HTML body the platform offloaded to the public CDN, leaving\n * the fact's value as a `…/fact_<hash>.html` (or `.txt`) URL.\n *\n * The CDN serves these with `Access-Control-Allow-Origin: *`, so the browser can\n * fetch the body directly (no proxy). HTML bodies are self-contained fragments\n * (inline styles, no scripts) rendered inside a **sandboxed** iframe: `srcdoc`\n * plus `sandbox=\"allow-same-origin\"` (note: no `allow-scripts`) means any script\n * in the payload is inert — XSS-safe — while the same-origin document stays\n * measurable so the frame auto-sizes to its content. Plain-text bodies render in\n * a `<pre>`.\n */\nimport { marked } from 'marked'\nimport type { CSSProperties } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nexport interface ExternalTextBlockProps {\n url: string\n}\n\ntype LoadState = 'loading' | 'ready' | 'error'\n\nconst styles: Record<string, CSSProperties> = {\n status: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n fontSize: '0.85rem',\n color: 'var(--rs-muted, #6b7280)',\n padding: '0.75rem 0',\n },\n link: { color: 'var(--rs-primary-700, #1d4ed8)' },\n frame: { width: '100%', border: 'none', display: 'block' },\n pre: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.85rem',\n color: 'var(--rs-text, #111827)',\n margin: 0,\n },\n}\n\n// Markdown-derived HTML carries bare tags (no inline styles the way SEC\n// payloads do), so the host document supplies the typography: heading\n// scale/spacing, bordered tables, list indentation, code/blockquote\n// treatment. Applied only to converted-markdown payloads — SEC HTML keeps\n// the minimal host so its own inline styles stay authoritative.\nconst MARKDOWN_CSS = `\n h1, h2, h3, h4 { line-height: 1.25; margin: 1.1em 0 0.45em; font-weight: 600; }\n h1 { font-size: 1.35em; margin-top: 0.2em; }\n h2 { font-size: 1.15em; }\n h3 { font-size: 1.05em; }\n p { margin: 0.55em 0; }\n ul, ol { margin: 0.55em 0; padding-left: 1.6em; }\n li { margin: 0.25em 0; }\n table { border-collapse: collapse; margin: 0.7em 0; }\n th, td { border: 1px solid #d1d5db; padding: 0.35em 0.6em; text-align: left; }\n th { background: #f3f4f6; font-weight: 600; }\n code { font-family: ui-monospace, monospace; font-size: 0.92em;\n background: #f3f4f6; padding: 0.1em 0.3em; border-radius: 3px; }\n blockquote { margin: 0.7em 0; padding: 0.1em 1em; border-left: 3px solid #d1d5db;\n color: #4b5563; }\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 1em 0; }`\n\n// A minimal host document: neutral typography, responsive media/tables, links\n// open in a new tab. The payload's own inline styles ride on top.\nfunction wrapHtml(body: string, extraCss = ''): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"><base target=\"_blank\"><style>\n :root { color-scheme: light; }\n body { margin: 0; color: #111827;\n font-family: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px; line-height: 1.45; }\n img, svg { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n a { color: #1d4ed8; }${extraCss}\n </style></head><body>${body}</body></html>`\n}\n\n/**\n * An *inline* text-block fact — the disclosure payload lives in the holon\n * itself (`rs:stringValue`), not an external CDN URL — rendered in the same\n * sandboxed frame as the externalized case. Used for holon-authored / offline\n * reports.\n *\n * `contentType` (rs:contentType) selects the payload interpretation:\n * `text/markdown` (RoboLedger-authored narratives) is converted to HTML with\n * marked before framing; anything else — including the SEC pipeline's\n * undeclared HTML text blocks — passes through as HTML.\n */\nexport function InlineTextBlock({\n html,\n contentType,\n}: {\n html: string\n contentType?: string | null\n}) {\n const md = isMarkdown(contentType)\n const body = md ? (marked.parse(html, { async: false }) as string) : html\n return <SandboxedHtml html={body} extraCss={md ? MARKDOWN_CSS : ''} />\n}\n\nfunction isMarkdown(contentType?: string | null): boolean {\n return (contentType ?? '').split(';')[0].trim().toLowerCase() === 'text/markdown'\n}\n\nfunction SandboxedHtml({ html, extraCss = '' }: { html: string; extraCss?: string }) {\n const ref = useRef<HTMLIFrameElement>(null)\n\n // Size the frame to its content. Content is script-free and static, so a\n // measure on load (plus one after fonts/images settle) is enough.\n const fit = () => {\n const frame = ref.current\n const doc = frame?.contentWindow?.document\n if (!frame || !doc) return\n try {\n frame.style.height = `${doc.documentElement.scrollHeight}px`\n } catch {\n // Same-origin read blocked (shouldn't happen with allow-same-origin) — leave default.\n }\n }\n\n return (\n <iframe\n ref={ref}\n title=\"Disclosure\"\n sandbox=\"allow-same-origin\"\n srcDoc={wrapHtml(html, extraCss)}\n style={styles.frame}\n onLoad={() => {\n fit()\n // Re-measure shortly after in case late layout (images/fonts) grew it.\n setTimeout(fit, 250)\n }}\n />\n )\n}\n\nexport function ExternalTextBlock({ url }: ExternalTextBlockProps) {\n const [state, setState] = useState<LoadState>('loading')\n const [body, setBody] = useState('')\n const isHtml = /\\.html$/i.test(url)\n\n useEffect(() => {\n let cancelled = false\n setState('loading')\n fetch(url)\n .then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.text()\n })\n .then((text) => {\n if (cancelled) return\n setBody(text)\n setState('ready')\n })\n .catch(() => {\n if (!cancelled) setState('error')\n })\n return () => {\n cancelled = true\n }\n }, [url])\n\n if (state === 'loading') return <div style={styles.status}>Loading disclosure…</div>\n if (state === 'error') {\n return (\n <div style={styles.status}>\n Could not load this disclosure.{' '}\n <a style={styles.link} href={url} target=\"_blank\" rel=\"noreferrer\">\n Open it directly ↗\n </a>\n </div>\n )\n }\n if (!isHtml) return <pre style={styles.pre}>{body}</pre>\n return <SandboxedHtml html={body} />\n}\n","/**\n * Click-a-fact inspection: the selected cell's aspects — concept, value, period,\n * entity, dimensions, unit, balance, rounding — plus, when the element is a\n * calculation subtotal, the rule it foots (computed live in the browser).\n *\n * Crucially the period, unit and dimensions are read from the *cell's own fact*,\n * not from the column — so a value never borrows a neighbouring period's metadata\n * (the bug the pivot rewrite set out to kill).\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport {\n currencySymbolFor,\n formatPeriod,\n formatValue,\n humanizeDuration,\n numericKindOf,\n} from '../format'\nimport type { NormalizedReport, PivotRow, PivotTable, UnitInfo } from '../model'\nimport { footCheck } from '../project'\n\nexport interface FactInspectorProps {\n report: NormalizedReport\n table: PivotTable\n row: PivotRow\n columnIndex: number\n onClose?: () => void\n}\n\nconst styles: Record<string, CSSProperties> = {\n panel: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '12px',\n padding: '1rem 1.25rem',\n background: 'var(--rs-panel-bg, #ffffff)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.08)',\n },\n header: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: '1rem',\n marginBottom: '0.75rem',\n },\n headerText: { minWidth: 0 },\n label: { fontSize: '1rem', fontWeight: 700, margin: 0, overflowWrap: 'anywhere' },\n qname: {\n display: 'block',\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.8rem',\n color: 'var(--rs-primary-700, #1d4ed8)',\n overflowWrap: 'anywhere',\n },\n close: {\n border: 'none',\n background: 'transparent',\n fontSize: '1.25rem',\n lineHeight: 1,\n cursor: 'pointer',\n color: 'var(--rs-muted, #6b7280)',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: '0.35rem 1rem',\n fontSize: '0.85rem',\n margin: '0.5rem 0',\n },\n key: { color: 'var(--rs-muted, #6b7280)' },\n mono: { fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)' },\n dims: { display: 'grid', gap: '0.15rem' },\n footing: {\n marginTop: '0.85rem',\n paddingTop: '0.75rem',\n borderTop: '1px solid var(--rs-border, #e5e7eb)',\n },\n footTitle: {\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--rs-muted, #6b7280)',\n marginBottom: '0.4rem',\n },\n equation: {\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.85rem',\n lineHeight: 1.6,\n },\n}\n\nfunction Field({ k, children }: { k: string; children: ReactNode }) {\n return (\n <>\n <span style={styles.key}>{k}</span>\n <span>{children}</span>\n </>\n )\n}\n\nfunction symbolFor(unit: UnitInfo | undefined): string {\n return unit?.symbol ?? currencySymbolFor(unit?.measure) ?? '$'\n}\n\nexport function FactInspector({ report, table, row, columnIndex, onClose }: FactInspectorProps) {\n const { element } = row\n const cell = row.cells[columnIndex]\n const fact = cell?.fact ?? null\n const period = fact ? report.periods[fact.period] : null\n const unit = fact?.unit ? report.units[fact.unit] : undefined\n const kind = numericKindOf(element)\n const dims = fact?.dimensions ?? row.members\n const foot = footCheck(report, table, element.id, columnIndex)\n const sym = symbolFor(unit)\n\n return (\n <div style={styles.panel}>\n <div style={styles.header}>\n <div style={styles.headerText}>\n <p style={styles.label}>{element.label}</p>\n <span style={styles.qname}>{element.qname}</span>\n </div>\n {onClose ? (\n <button style={styles.close} onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n ) : null}\n </div>\n\n <div style={styles.grid}>\n <Field k=\"Value\">\n {cell?.value === null && cell?.textValue ? (\n <span>{humanizeDuration(cell.textValue) ?? cell.textValue}</span>\n ) : (\n <span style={styles.mono}>\n {formatValue(cell?.value ?? null, { numericKind: kind, symbol: sym })}\n </span>\n )}\n </Field>\n {period ? (\n <Field k=\"Period\">\n {formatPeriod(period)} <span style={styles.key}>({period.type})</span>\n </Field>\n ) : null}\n {report.entity ? <Field k=\"Entity\">{report.entity.name}</Field> : null}\n {dims.length ? (\n <Field k=\"Dimensions\">\n <span style={styles.dims}>\n {dims.map((d) => (\n <span key={d.axis}>\n <span style={styles.key}>{d.axisLabel}:</span>{' '}\n {d.explicit ? d.memberLabel : (d.typedValue ?? d.memberLabel)}\n </span>\n ))}\n </span>\n </Field>\n ) : null}\n <Field k=\"Unit\">{unit ? unit.label : '—'}</Field>\n {element.balance ? <Field k=\"Balance\">{element.balance}</Field> : null}\n {fact?.decimals ? <Field k=\"Decimals\">{fact.decimals}</Field> : null}\n </div>\n\n {foot ? (\n <div style={styles.footing}>\n <div style={styles.footTitle}>Calculation {foot.ok ? '✓ foots' : '⚠ does not foot'}</div>\n <div style={styles.equation}>\n {foot.terms.map((term, i) => {\n const op = i === 0 ? (term.weight < 0 ? '−' : '') : term.weight < 0 ? ' − ' : ' + '\n return (\n <span key={term.element.id} title={term.element.qname}>\n {op}\n {formatValue(term.value === null ? 0 : Math.abs(term.value), {\n numericKind: 'monetary',\n symbol: sym,\n })}\n </span>\n )\n })}\n {' = '}\n <strong>\n {formatValue(foot.expected, { numericKind: 'monetary', symbol: sym })}\n </strong>{' '}\n {foot.ok ? (\n <span style={{ color: 'var(--rs-success, #00875a)' }}>✓</span>\n ) : (\n <span style={{ color: 'var(--rs-error, #dc2626)' }}>\n ✗ (reported {formatValue(foot.actual, { numericKind: 'monetary', symbol: sym })})\n </span>\n )}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * Renders one `PivotTable` — a pivoted section of a report.\n *\n * The default view is the familiar statement layout (concept hierarchy on rows,\n * periods on columns), but because the engine is a general pivot, this component\n * also handles dimensions on columns (member sub-headers nested under each\n * period, à la Pesseract), single-member dimensions as slicer bars, abstract\n * `[Roll Up]` header rows, and unit- + scale-aware value formatting.\n *\n * Framework-agnostic plain React — no `next/*`, no CSS framework. Styled with\n * inline styles reading CSS custom properties (`--rs-*`) so a host app can theme\n * it, with sensible RoboSystems defaults baked in as fallbacks.\n */\nimport type { CSSProperties } from 'react'\nimport { isExternalFactUrl } from '../constants'\nimport { currencySymbolFor, formatValue, humanizeDuration, numericKindOf } from '../format'\nimport type { PivotRow, PivotTable, UnitInfo } from '../model'\nimport { ExternalTextBlock, InlineTextBlock } from './ExternalTextBlock'\n\nexport interface StatementTableProps {\n table: PivotTable\n /** The report's units, to resolve each cell's currency symbol. */\n units?: Record<string, UnitInfo>\n /** Called when a value cell is clicked — drives fact inspection. */\n onCellClick?: (row: PivotRow, columnIndex: number) => void\n /** The currently-selected cell, highlighted. */\n selected?: { rowKey: string; columnIndex: number } | null\n /** Current dimension placement — set with `onDimensionPlacementChange` to show the toggle. */\n dimensionPlacement?: 'rows' | 'columns'\n /** Setter for the dimension placement; when provided (and the section is dimensional), a rows/columns toggle renders below the slicers. */\n onDimensionPlacementChange?: (placement: 'rows' | 'columns') => void\n}\n\nconst styles: Record<string, CSSProperties> = {\n wrap: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n marginBottom: '2.5rem',\n },\n heading: { textAlign: 'center', marginBottom: '0.75rem' },\n title: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n fontSize: '1.15rem',\n fontWeight: 700,\n letterSpacing: '0.02em',\n margin: 0,\n },\n subtitle: { fontSize: '0.85rem', color: 'var(--rs-muted, #6b7280)', marginTop: '0.25rem' },\n scaleCaption: {\n fontSize: '0.8rem',\n fontStyle: 'italic',\n color: 'var(--rs-muted, #6b7280)',\n marginTop: '0.25rem',\n },\n slicers: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.5rem',\n margin: '0 0 0.75rem',\n },\n slicer: {\n display: 'inline-flex',\n gap: '0.4rem',\n alignItems: 'baseline',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '6px',\n padding: '0.2rem 0.55rem',\n fontSize: '0.78rem',\n background: 'var(--rs-slicer-bg, #f9fafb)',\n },\n slicerLabel: {\n color: 'var(--rs-muted, #6b7280)',\n textTransform: 'uppercase',\n letterSpacing: '0.03em',\n fontSize: '0.68rem',\n },\n slicerValue: { fontWeight: 600 },\n controls: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n margin: '0 0 0.9rem',\n fontSize: '0.8rem',\n },\n controlLabel: { color: 'var(--rs-muted, #6b7280)' },\n segmented: {\n display: 'inline-flex',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '7px',\n overflow: 'hidden',\n },\n segment: {\n border: 'none',\n padding: '0.25rem 0.7rem',\n fontSize: '0.78rem',\n cursor: 'pointer',\n background: 'transparent',\n color: 'var(--rs-text, #111827)',\n },\n segmentActive: {\n background: 'var(--rs-primary-600, #2563eb)',\n color: '#ffffff',\n fontWeight: 600,\n },\n scroll: { overflowX: 'auto' },\n table: { width: '100%', borderCollapse: 'collapse', fontSize: '0.875rem' },\n th: {\n borderBottom: '2px solid var(--rs-border-strong, #9ca3af)',\n padding: '0.4rem 0.75rem',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.8rem',\n },\n thGroup: {\n borderBottom: '1px solid var(--rs-border, #e5e7eb)',\n padding: '0.3rem 0.75rem',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.8rem',\n textAlign: 'center',\n },\n // A floor on the concept column so a wide table (many member/period columns)\n // scrolls horizontally rather than squeezing labels down to vertical text.\n thConcept: { textAlign: 'left', verticalAlign: 'bottom', minWidth: '18rem' },\n thNum: { textAlign: 'right', whiteSpace: 'nowrap' },\n labelCell: { padding: '0.3rem 0.75rem', whiteSpace: 'normal', minWidth: '18rem' },\n headerRowLabel: {\n padding: '0.4rem 0.75rem',\n fontWeight: 700,\n fontSize: '0.8rem',\n textTransform: 'uppercase',\n letterSpacing: '0.02em',\n color: 'var(--rs-muted, #6b7280)',\n },\n numCell: {\n padding: '0.3rem 0.75rem',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n fontFamily: 'var(--rs-font-mono, ui-monospace, SFMono-Regular, monospace)',\n fontVariantNumeric: 'tabular-nums',\n },\n textBlockCell: { padding: '0.75rem', borderTop: '1px solid var(--rs-border, #e5e7eb)' },\n textBlockLabel: {\n fontSize: '0.7rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n marginBottom: '0.5rem',\n },\n}\n\n/** The currency symbol for a cell's fact unit — never a hard-coded `$` for non-USD. */\nfunction cellSymbol(unit: UnitInfo | undefined): string {\n return unit?.symbol ?? currencySymbolFor(unit?.measure) ?? '$'\n}\n\nexport function StatementTable({\n table,\n units,\n onCellClick,\n selected = null,\n dimensionPlacement,\n onDimensionPlacementChange,\n}: StatementTableProps) {\n const { columns, rows, columnHeaders, scale } = table\n const totalCols = columns.length\n const dimensional =\n table.config.rows.some((k) => k.startsWith('dim:')) ||\n table.config.columns.some((k) => k.startsWith('dim:'))\n const showToggle = onDimensionPlacementChange != null && dimensional\n\n return (\n <section style={styles.wrap}>\n <header style={styles.heading}>\n <h3 style={styles.title}>{table.title}</h3>\n {table.structureName ? <div style={styles.subtitle}>{table.structureName}</div> : null}\n {scale.caption ? <div style={styles.scaleCaption}>{scale.caption}</div> : null}\n </header>\n\n {table.slicers.length ? (\n <div style={styles.slicers}>\n {table.slicers.map((s) => (\n <div key={s.aspect} style={styles.slicer}>\n <span style={styles.slicerLabel}>{s.label}</span>\n <span style={styles.slicerValue}>{s.valueLabel}</span>\n </div>\n ))}\n </div>\n ) : null}\n\n {showToggle ? (\n <div style={styles.controls}>\n <span style={styles.controlLabel}>Dimensions</span>\n <div style={styles.segmented} role=\"group\" aria-label=\"Dimension placement\">\n {(['rows', 'columns'] as const).map((placement) => (\n <button\n key={placement}\n type=\"button\"\n onClick={() => onDimensionPlacementChange?.(placement)}\n aria-pressed={dimensionPlacement === placement}\n style={{\n ...styles.segment,\n ...(dimensionPlacement === placement ? styles.segmentActive : {}),\n }}\n >\n {placement === 'rows' ? 'As rows' : 'As columns'}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n\n <div style={styles.scroll}>\n <table style={styles.table}>\n <thead>\n {columnHeaders.map((level, levelIndex) => {\n const isLast = levelIndex === columnHeaders.length - 1\n let leaf = 0\n return (\n <tr key={levelIndex}>\n {levelIndex === 0 ? (\n <th\n rowSpan={columnHeaders.length}\n style={{ ...styles.th, ...styles.thConcept }}\n aria-label=\"Concept\"\n />\n ) : null}\n {level.map((h, i) => {\n const key = `${levelIndex}-${i}-${leaf}`\n leaf += h.span\n return (\n <th\n key={key}\n colSpan={h.span}\n style={isLast ? { ...styles.th, ...styles.thNum } : styles.thGroup}\n >\n {h.label}\n </th>\n )\n })}\n </tr>\n )\n })}\n </thead>\n <tbody>\n {rows.map((row) => {\n // An abstract concept — a section header with no values.\n if (row.header) {\n return (\n <tr key={row.key}>\n <td\n colSpan={totalCols + 1}\n style={{\n ...styles.headerRowLabel,\n paddingLeft: `${row.depth * 20 + 12}px`,\n }}\n title={row.element.qname}\n >\n {row.label ?? row.element.label}\n </td>\n </tr>\n )\n }\n\n // An externalized text-block / policy disclosure: render its fetched\n // HTML full-width instead of a URL squeezed into a value cell.\n const textBlock = row.cells.find(\n (c) => c.value === null && isExternalFactUrl(c.textValue)\n )\n if (textBlock?.textValue) {\n return (\n <tr key={row.key}>\n <td colSpan={totalCols + 1} style={styles.textBlockCell}>\n <div style={styles.textBlockLabel} title={row.element.qname}>\n {rowLabel(row)}\n </div>\n <ExternalTextBlock url={textBlock.textValue} />\n </td>\n </tr>\n )\n }\n\n // An *inline* text-block disclosure: the holon carries the HTML in\n // the fact (rs:stringValue), not a CDN URL. The element's value\n // domain (rs:itemType = textBlock) marks it; render full-width in\n // the same sandboxed frame.\n if (row.element.itemType === 'textBlock') {\n const inline = row.cells.find(\n (c) =>\n c.value === null &&\n c.textValue != null &&\n c.textValue !== '' &&\n !isExternalFactUrl(c.textValue)\n )\n if (inline?.textValue) {\n return (\n <tr key={row.key}>\n <td colSpan={totalCols + 1} style={styles.textBlockCell}>\n <div style={styles.textBlockLabel} title={row.element.qname}>\n {rowLabel(row)}\n </div>\n <InlineTextBlock\n html={inline.textValue}\n contentType={inline.fact?.contentType}\n />\n </td>\n </tr>\n )\n }\n }\n\n const kind = numericKindOf(row.element)\n const isGrandTotal = row.isSubtotal && row.depth === 0\n const allZeroOrNull = row.cells.every((c) => c.value === null || c.value === 0)\n const rowStyle: CSSProperties = {\n backgroundColor: row.isSubtotal ? 'var(--rs-subtotal-bg, #f9fafb)' : undefined,\n }\n const labelStyle: CSSProperties = {\n ...styles.labelCell,\n paddingLeft: `${row.depth * 20 + 12}px`,\n fontWeight: row.isSubtotal ? 600 : 400,\n color: !row.isSubtotal && allZeroOrNull ? 'var(--rs-muted, #9ca3af)' : undefined,\n borderBottom: isGrandTotal ? '3px double var(--rs-text, #111827)' : undefined,\n }\n return (\n <tr key={row.key} style={rowStyle}>\n <td style={labelStyle} title={row.element.qname}>\n {rowLabel(row)}\n </td>\n {row.cells.map((cell, i) => {\n const isSelected =\n selected !== null && selected.rowKey === row.key && selected.columnIndex === i\n const clickable = onCellClick && cell.fact !== null\n const isText =\n cell.value === null && cell.textValue != null && cell.textValue !== ''\n // An ISO-8601 duration term (P10Y) reads as a value, not prose:\n // humanize it and keep it right-aligned with the numbers.\n const duration = isText ? humanizeDuration(cell.textValue) : null\n const isProse = isText && !duration\n const unit = cell.fact?.unit && units ? units[cell.fact.unit] : undefined\n const numStyle: CSSProperties = {\n ...styles.numCell,\n fontWeight: row.isSubtotal ? 600 : 400,\n borderBottom: isGrandTotal ? '3px double var(--rs-text, #111827)' : undefined,\n cursor: clickable ? 'pointer' : 'default',\n backgroundColor: isSelected ? 'var(--rs-selected-bg, #dbeafe)' : undefined,\n color:\n !isText && !row.isSubtotal && (cell.value === null || cell.value === 0)\n ? 'var(--rs-muted, #9ca3af)'\n : undefined,\n ...(isProse\n ? {\n textAlign: 'left',\n whiteSpace: 'normal',\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n }\n : {}),\n }\n // No fact for this coordinate → blank; a fact that is null or\n // a genuine $0 (Commitments & Contingencies, zero balance) →\n // an em-dash; anything else → the formatted value. A negated\n // preferred label flips the *displayed* sign only — the\n // as-filed table shows `Less short-term portion (999)` for a\n // fact tagged +999; the fact itself stays untouched.\n const shown = row.negated && cell.value !== null ? -cell.value : cell.value\n const display = isText\n ? (duration ?? cell.textValue)\n : cell.fact === null\n ? ''\n : shown === 0\n ? '—'\n : formatValue(shown, {\n numericKind: kind,\n symbol: cellSymbol(unit),\n scaleFactor: scale.factor,\n })\n return (\n <td\n key={columns[i].key}\n style={numStyle}\n onClick={clickable ? () => onCellClick?.(row, i) : undefined}\n >\n {display}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\n/**\n * A row's label. A dimensional breakdown row (members on rows) shows just its\n * member(s) — it sits indented under its concept's total row, which supplies the\n * concept name — so the reader gets `Stockholders' Equity` / `· Common Stock`\n * rather than the concept repeated on every line.\n */\nfunction rowLabel(row: PivotRow): string {\n if (!row.members.length) return row.label ?? row.element.label\n return row.members.map((m) => m.memberLabel).join(' · ')\n}\n","/**\n * Top-level renderer: a `NormalizedReport` → the entity header, every statement,\n * and an inline fact inspector wired to cell selection. This is the one\n * component a consuming app typically renders.\n */\nimport type { CSSProperties } from 'react'\nimport { useMemo, useState } from 'react'\nimport type { NormalizedReport, PivotRow } from '../model'\nimport { buildPivots, pivotDimensionsOn } from '../pivot'\nimport { FactInspector } from './FactInspector'\nimport { StatementTable } from './StatementTable'\n\nexport interface ReportViewProps {\n report: NormalizedReport\n /** Disable the click-to-inspect fact panel (render-only). */\n inspect?: boolean\n /** Initial placement for dimension breakdowns (default `rows`). */\n dimensionAxis?: 'rows' | 'columns'\n}\n\ninterface Selection {\n statementIndex: number\n rowKey: string\n columnIndex: number\n}\n\nconst styles: Record<string, CSSProperties> = {\n layout: {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: '1.5rem',\n alignItems: 'start',\n },\n layoutWithPanel: {\n gridTemplateColumns: 'minmax(0, 1fr) 340px',\n },\n entity: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n textAlign: 'center',\n marginBottom: '1.5rem',\n },\n entityName: {\n fontSize: '1.5rem',\n fontWeight: 700,\n margin: 0,\n color: 'var(--rs-text, #111827)',\n },\n panel: { position: 'sticky', top: '1rem' },\n}\n\nexport function ReportView({ report, inspect = true, dimensionAxis = 'rows' }: ReportViewProps) {\n const [dimAxis, setDimAxis] = useState<'rows' | 'columns'>(dimensionAxis)\n const [selection, setSelection] = useState<Selection | null>(null)\n\n const statements = useMemo(\n () => buildPivots(report, (_ib, cfg) => pivotDimensionsOn(cfg, dimAxis)),\n [report, dimAxis]\n )\n\n const selected = selection !== null ? statements[selection.statementIndex] : null\n const selectedRow = selected?.rows.find((r) => r.key === selection?.rowKey) ?? null\n\n const setPlacement = (placement: 'rows' | 'columns'): void => {\n setSelection(null) // row/column keys differ between placements\n setDimAxis(placement)\n }\n\n return (\n <div>\n {report.entity ? (\n <header style={styles.entity}>\n <h2 style={styles.entityName}>{report.entity.name}</h2>\n </header>\n ) : null}\n\n <div\n style={{\n ...styles.layout,\n ...(inspect && selectedRow ? styles.layoutWithPanel : {}),\n }}\n >\n <div>\n {statements.map((statement, statementIndex) => (\n <StatementTable\n key={statement.ib.id}\n table={statement}\n units={report.units}\n dimensionPlacement={dimAxis}\n onDimensionPlacementChange={setPlacement}\n selected={\n selection && selection.statementIndex === statementIndex\n ? { rowKey: selection.rowKey, columnIndex: selection.columnIndex }\n : null\n }\n onCellClick={\n inspect\n ? (row: PivotRow, columnIndex: number) =>\n setSelection({ statementIndex, rowKey: row.key, columnIndex })\n : undefined\n }\n />\n ))}\n </div>\n\n {inspect && selected && selectedRow && selection ? (\n <div style={styles.panel}>\n <FactInspector\n report={report}\n table={selected}\n row={selectedRow}\n columnIndex={selection.columnIndex}\n onClose={() => setSelection(null)}\n />\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","/**\n * A dependency-free SVG line chart for a metric time series — one chart per\n * chart-projection panel (a format family). Renders the series in\n * `joinChartSeries` output over the shared period x-axis.\n *\n * Framework-agnostic plain React + SVG — no chart library, no `next/*`, no CSS\n * framework. Marks follow the dataviz spec: 2px round-join lines, ≥8px end\n * markers ringed in the surface color, hairline recessive gridlines, a legend\n * whenever two or more series share the plot (identity never by color alone),\n * selective non-colliding end labels, and a hover/focus crosshair + tooltip.\n * Series colors read `--rs-chart-series-N` tokens (validated eight-hue order)\n * with light fallbacks; a host themes dark mode and its brand by setting those\n * tokens, exactly like the statement components' `--rs-*` pattern.\n *\n * The y-axis is data-driven (padded to the series range, not forced to zero) —\n * correct for a single-family line panel where the story is the shape of\n * change; the value scale is shared across the panel's series because they\n * share a format family.\n */\nimport type { CSSProperties, KeyboardEvent, PointerEvent } from 'react'\nimport { useId, useMemo, useRef, useState } from 'react'\nimport { formatMetricCompact, formatMetricValue } from '../chart/format'\nimport { seriesColor } from '../chart/palette'\nimport type { ChartSeriesData, MetricItemType } from '../chart/types'\n\nexport interface TimeSeriesChartProps {\n /** Series to plot — the `joinChartSeries` output for one panel. */\n series: ChartSeriesData[]\n /** Format family for axis + value formatting; defaults to the first series'. */\n itemType?: MetricItemType | string | null\n /** Optional panel heading (the format-family label). */\n title?: string\n /** Internal SVG coordinate width — the plot scales to its container. */\n width?: number\n /** Internal SVG coordinate height. */\n height?: number\n}\n\nconst MARGIN = { top: 16, right: 104, bottom: 30, left: 60 }\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n/** `2026-06-30` → `Jun '26` for x-axis ticks; raw string if unparseable. */\nfunction shortMonth(iso: string): string {\n const m = /^(\\d{4})-(\\d{2})/.exec(iso)\n if (!m) return iso\n return `${MONTHS[Number(m[2]) - 1] ?? m[2]} '${m[1].slice(2)}`\n}\n\n/** A small set of \"nice\" tick values spanning [min, max]. */\nfunction niceTicks(min: number, max: number, count = 4): number[] {\n if (!(max > min)) return [min]\n const span = max - min\n const step0 = span / count\n const mag = Math.pow(10, Math.floor(Math.log10(step0)))\n const norm = step0 / mag\n const step = (norm >= 5 ? 10 : norm >= 2 ? 5 : norm >= 1 ? 2 : 1) * mag\n const start = Math.ceil(min / step) * step\n const ticks: number[] = []\n for (let v = start; v <= max + step * 1e-6; v += step) ticks.push(Number(v.toFixed(10)))\n return ticks\n}\n\nconst styles: Record<string, CSSProperties> = {\n wrap: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n },\n title: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n fontSize: '0.9rem',\n fontWeight: 600,\n margin: '0 0 0.5rem',\n },\n legend: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.25rem 1rem',\n marginBottom: '0.5rem',\n fontSize: '0.78rem',\n color: 'var(--rs-muted, #6b7280)',\n },\n legendItem: { display: 'inline-flex', alignItems: 'center', gap: '0.4rem' },\n legendKey: { display: 'inline-block', width: 16, height: 2, borderRadius: 1 },\n empty: {\n padding: '2rem',\n textAlign: 'center',\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.85rem',\n },\n}\n\nexport function TimeSeriesChart({\n series,\n itemType,\n title,\n width = 720,\n height = 280,\n}: TimeSeriesChartProps): React.JSX.Element {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const [active, setActive] = useState<number | null>(null)\n const clipId = useId()\n\n const family = itemType ?? series[0]?.itemType ?? null\n const periodCount = series[0]?.points.length ?? 0\n\n const model = useMemo(() => {\n const values: number[] = []\n for (const s of series)\n for (const p of s.points) if (p.y !== null && !Number.isNaN(p.y)) values.push(p.y)\n if (!values.length) return null\n let min = Math.min(...values)\n let max = Math.max(...values)\n if (min === max) {\n const pad = Math.abs(min) * 0.1 || 1\n min -= pad\n max += pad\n } else {\n const pad = (max - min) * 0.08\n min -= pad\n max += pad\n }\n return { min, max }\n }, [series])\n\n if (!model || periodCount === 0) {\n return (\n <div style={styles.wrap}>\n {title && <p style={styles.title}>{title}</p>}\n <p style={styles.empty}>No data to plot for this period range.</p>\n </div>\n )\n }\n\n const innerW = width - MARGIN.left - MARGIN.right\n const innerH = height - MARGIN.top - MARGIN.bottom\n const { min, max } = model\n\n const xAt = (i: number): number =>\n periodCount === 1 ? MARGIN.left + innerW / 2 : MARGIN.left + (i / (periodCount - 1)) * innerW\n const yAt = (v: number): number => MARGIN.top + innerH - ((v - min) / (max - min)) * innerH\n\n const yTicks = niceTicks(min, max, 4)\n // Thin the x labels to ~6 so months don't collide.\n const xEvery = Math.max(1, Math.ceil(periodCount / 6))\n const periods = series[0].points\n\n // Direct end labels only when few enough series and they don't collide.\n const showEndLabels = series.length <= 4\n const placedLabelY: number[] = []\n\n const showLegend = series.length >= 2\n const ariaLabel =\n `${title ? `${title} — ` : ''}line chart of ${series.length} ` +\n `metric${series.length === 1 ? '' : 's'} over ${periodCount} periods`\n\n function handleMove(e: PointerEvent<SVGSVGElement>): void {\n const svg = svgRef.current\n const ctm = svg?.getScreenCTM?.()\n if (!svg || !ctm) return\n const pt = new DOMPoint(e.clientX, e.clientY).matrixTransform(ctm.inverse())\n if (periodCount === 1) {\n setActive(0)\n return\n }\n const frac = (pt.x - MARGIN.left) / innerW\n const idx = Math.round(frac * (periodCount - 1))\n setActive(Math.max(0, Math.min(periodCount - 1, idx)))\n }\n\n function handleKey(e: KeyboardEvent<SVGSVGElement>): void {\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n setActive((a) => Math.min(periodCount - 1, (a ?? -1) + 1))\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n setActive((a) => Math.max(0, (a ?? periodCount) - 1))\n } else if (e.key === 'Escape') {\n setActive(null)\n }\n }\n\n return (\n <div style={styles.wrap}>\n {title && <p style={styles.title}>{title}</p>}\n {showLegend && (\n <div style={styles.legend}>\n {series.map((s, i) => (\n <span key={s.key} style={styles.legendItem}>\n <span style={{ ...styles.legendKey, background: seriesColor(i) }} />\n {s.label}\n </span>\n ))}\n </div>\n )}\n <svg\n ref={svgRef}\n viewBox={`0 0 ${width} ${height}`}\n width=\"100%\"\n role=\"img\"\n aria-label={ariaLabel}\n tabIndex={0}\n style={{ display: 'block', outline: 'none', touchAction: 'none' }}\n onPointerMove={handleMove}\n onPointerLeave={() => setActive(null)}\n onKeyDown={handleKey}\n >\n <defs>\n <clipPath id={clipId}>\n <rect x={MARGIN.left} y={MARGIN.top} width={innerW} height={innerH} />\n </clipPath>\n </defs>\n\n {/* Y gridlines + ticks */}\n {yTicks.map((t) => (\n <g key={`y${t}`}>\n <line\n x1={MARGIN.left}\n x2={MARGIN.left + innerW}\n y1={yAt(t)}\n y2={yAt(t)}\n stroke=\"var(--rs-border, #e5e7eb)\"\n strokeWidth={1}\n />\n <text\n x={MARGIN.left - 8}\n y={yAt(t)}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {formatMetricCompact(family, t)}\n </text>\n </g>\n ))}\n\n {/* X ticks */}\n {periods.map((p, i) =>\n i % xEvery === 0 || i === periodCount - 1 ? (\n <text\n key={`x${p.x}`}\n x={xAt(i)}\n y={height - MARGIN.bottom + 18}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n >\n {shortMonth(p.x)}\n </text>\n ) : null\n )}\n\n {/* Baseline */}\n <line\n x1={MARGIN.left}\n x2={MARGIN.left + innerW}\n y1={MARGIN.top + innerH}\n y2={MARGIN.top + innerH}\n stroke=\"var(--rs-border-strong, #9ca3af)\"\n strokeWidth={1}\n />\n\n {/* Crosshair */}\n {active !== null && (\n <line\n x1={xAt(active)}\n x2={xAt(active)}\n y1={MARGIN.top}\n y2={MARGIN.top + innerH}\n stroke=\"var(--rs-border-strong, #9ca3af)\"\n strokeWidth={1}\n />\n )}\n\n {/* Series lines + markers */}\n <g clipPath={`url(#${clipId})`}>\n {series.map((s, si) => {\n const color = seriesColor(si)\n const segs: string[] = []\n let pen = false\n s.points.forEach((pt, i) => {\n if (pt.y === null || Number.isNaN(pt.y)) {\n pen = false\n return\n }\n segs.push(`${pen ? 'L' : 'M'}${xAt(i)},${yAt(pt.y)}`)\n pen = true\n })\n return (\n <path\n key={s.key}\n d={segs.join(' ')}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n )\n })}\n </g>\n\n {/* End markers + selective end labels */}\n {series.map((s, si) => {\n const color = seriesColor(si)\n // Last non-null point is the series' visual end.\n let endIdx = -1\n for (let i = s.points.length - 1; i >= 0; i--) {\n const y = s.points[i].y\n if (y !== null && !Number.isNaN(y)) {\n endIdx = i\n break\n }\n }\n if (endIdx < 0) return null\n const ey = yAt(s.points[endIdx].y as number)\n const ex = xAt(endIdx)\n let label: string | null = null\n if (showEndLabels && endIdx === periodCount - 1) {\n const collides = placedLabelY.some((py) => Math.abs(py - ey) < 13)\n if (!collides) {\n placedLabelY.push(ey)\n label = formatMetricValue(family, s.points[endIdx].y)\n }\n }\n return (\n <g key={`end${s.key}`}>\n <circle\n cx={ex}\n cy={ey}\n r={4}\n fill={color}\n stroke=\"var(--rs-surface, #ffffff)\"\n strokeWidth={2}\n />\n {label && (\n <text\n x={ex + 8}\n y={ey}\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-text, #111827)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {label}\n </text>\n )}\n </g>\n )\n })}\n\n {/* Active-point markers + tooltip */}\n {active !== null && (\n <ActiveReadout\n active={active}\n series={series}\n family={family}\n xAt={xAt}\n yAt={yAt}\n width={width}\n periodLabel={periods[active] ? shortMonth(periods[active].x) : ''}\n plotTop={MARGIN.top}\n />\n )}\n </svg>\n </div>\n )\n}\n\ninterface ActiveReadoutProps {\n active: number\n series: ChartSeriesData[]\n family: MetricItemType | string | null\n xAt: (i: number) => number\n yAt: (v: number) => number\n width: number\n periodLabel: string\n plotTop: number\n}\n\n/** SVG-native tooltip — value-leads-label rows, keyed by a short line stroke. */\nfunction ActiveReadout({\n active,\n series,\n family,\n xAt,\n yAt,\n width,\n periodLabel,\n plotTop,\n}: ActiveReadoutProps): React.JSX.Element {\n const rows = series.map((s, i) => ({\n label: s.label,\n color: seriesColor(i),\n value: s.points[active]?.y ?? null,\n y: s.points[active]?.y,\n }))\n const rowH = 16\n const boxW = 176\n const boxH = 22 + rows.length * rowH\n const cx = xAt(active)\n const bx = cx + 12 + boxW > width ? cx - 12 - boxW : cx + 12\n const by = plotTop + 4\n\n return (\n <g pointerEvents=\"none\">\n {rows.map((r) =>\n r.y !== null && r.y !== undefined && !Number.isNaN(r.y) ? (\n <circle\n key={`ap${r.label}`}\n cx={cx}\n cy={yAt(r.y)}\n r={4}\n fill={r.color}\n stroke=\"var(--rs-surface, #ffffff)\"\n strokeWidth={2}\n />\n ) : null\n )}\n <rect\n x={bx}\n y={by}\n width={boxW}\n height={boxH}\n rx={6}\n fill=\"var(--rs-surface, #ffffff)\"\n stroke=\"var(--rs-border, #e5e7eb)\"\n strokeWidth={1}\n />\n <text x={bx + 10} y={by + 15} fontSize={11} fontWeight={600} fill=\"var(--rs-muted, #6b7280)\">\n {periodLabel}\n </text>\n {rows.map((r, i) => {\n const ry = by + 22 + i * rowH + 11\n return (\n <g key={`tr${r.label}`}>\n <line\n x1={bx + 10}\n x2={bx + 24}\n y1={ry}\n y2={ry}\n stroke={r.color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n />\n <text\n x={bx + 30}\n y={ry}\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n >\n {r.label}\n </text>\n <text\n x={bx + boxW - 10}\n y={ry}\n dominantBaseline=\"middle\"\n textAnchor=\"end\"\n fontSize={11}\n fontWeight={600}\n fill=\"var(--rs-text, #111827)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {formatMetricValue(family, r.value)}\n </text>\n </g>\n )\n })}\n </g>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/chart/format.ts","../src/chart/join.ts","../src/chart/palette.ts","../src/project.ts","../src/pivot.ts","../src/components/ExternalTextBlock.tsx","../src/components/FactInspector.tsx","../src/components/StatementTable.tsx","../src/components/ReportView.tsx","../src/components/TimeSeriesChart.tsx"],"names":["qname","fallbackElement","occupied","rowLabel","styles","jsxs","jsx","useState","useRef","useMemo","min","max"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Value formatting by metric format family — the client half of the M-2\n * `item_type` unit/format system. `monetary` reuses the accounting money\n * style; `percent` values are stored raw (0.0512) and shown ×100; `multiple`\n * carries an `×`; `ratio` is a plain 2-dp decimal; `days` is an integer.\n */\nimport { formatMoney } from '../format'\nimport type { MetricItemType } from './types'\n\nconst DASH = '—'\n\n/** Full-precision display for tooltips and direct labels. */\nexport function formatMetricValue(\n itemType: MetricItemType | string | null | undefined,\n value: number | null | undefined\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return DASH\n switch (itemType) {\n case 'monetary':\n return formatMoney(value)\n case 'percent':\n return `${(value * 100).toLocaleString('en-US', { maximumFractionDigits: 2 })}%`\n case 'multiple':\n return `${value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}×`\n case 'days':\n return value.toLocaleString('en-US', { maximumFractionDigits: 0 })\n case 'ratio':\n return value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n default:\n return value.toLocaleString('en-US', { maximumFractionDigits: 4 })\n }\n}\n\n/** Compact form for axis ticks — abbreviated money, tighter decimals. */\nexport function formatMetricCompact(\n itemType: MetricItemType | string | null | undefined,\n value: number | null | undefined\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return ''\n if (itemType === 'monetary') {\n const abs = Math.abs(value)\n const sign = value < 0 ? '-' : ''\n if (abs >= 1e9) return `${sign}$${(abs / 1e9).toFixed(abs >= 1e10 ? 0 : 1)}B`\n if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(abs >= 1e7 ? 0 : 1)}M`\n if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(abs >= 1e4 ? 0 : 1)}K`\n return `${sign}$${abs.toFixed(0)}`\n }\n if (itemType === 'percent') {\n return `${(value * 100).toLocaleString('en-US', { maximumFractionDigits: 1 })}%`\n }\n if (itemType === 'multiple') {\n return `${value.toLocaleString('en-US', { maximumFractionDigits: 1 })}×`\n }\n if (itemType === 'days') {\n return value.toLocaleString('en-US', { maximumFractionDigits: 0 })\n }\n return value.toLocaleString('en-US', { maximumFractionDigits: 2 })\n}\n","/**\n * Join a chart panel's series to their plottable points.\n *\n * The server ships chart config (series identity) and rendering (values +\n * periods) separately so the value matrix is never duplicated. This resolves\n * each series' `elementId` to its rendering row and zips it against the\n * periods' `end` dates into `{ x, y }` points — the shape the renderer draws.\n * Series whose element has no rendering row (or an unexpected value-length\n * mismatch) are dropped, so a stale chart arm never crashes the plot.\n */\nimport type { ChartPanel, ChartRendering, ChartSeriesData } from './types'\n\nexport function joinChartSeries(panel: ChartPanel, rendering: ChartRendering): ChartSeriesData[] {\n const rowByElement = new Map(rendering.rows.map((r) => [r.elementId, r]))\n const periods = rendering.periods\n const out: ChartSeriesData[] = []\n for (const series of panel.series) {\n const row = rowByElement.get(series.elementId)\n if (!row) continue\n const points = periods.map((p, i) => ({\n x: p.end,\n y: i < row.values.length ? row.values[i] : null,\n }))\n out.push({\n key: series.key,\n label: series.label,\n itemType: panel.itemType,\n points,\n })\n }\n return out\n}\n","/**\n * Categorical series palette — the validated eight-hue order (dataviz\n * reference instance). Light-mode hexes are the fallbacks; a host app themes\n * dark mode (and its own brand) by setting the `--rs-chart-series-N` tokens,\n * the same `--rs-*` override pattern the statement components use.\n *\n * The order is the CVD-safety mechanism, not cosmetic: this sequence clears\n * every adjacent gate in both light and dark (worst adjacent CVD ΔE 9.1 light\n * / 8.4 dark; normal-vision ΔE 19.6 / 19.3). Series are assigned by fixed\n * index within a panel, never cycled — metric panels carry at most a handful\n * of series, well inside eight.\n */\n\n/** Light-mode fallbacks (the validated default; host tokens override). */\nexport const SERIES_COLORS_LIGHT = [\n '#2a78d6', // 1 blue\n '#eb6834', // 2 orange\n '#1baf7a', // 3 aqua\n '#eda100', // 4 yellow\n '#e87ba4', // 5 magenta\n '#008300', // 6 green\n '#4a3aa7', // 7 violet\n '#e34948', // 8 red\n] as const\n\n/** Dark-mode steps (same eight hues re-stepped for the dark surface). */\nexport const SERIES_COLORS_DARK = [\n '#3987e5',\n '#d95926',\n '#199e70',\n '#c98500',\n '#d55181',\n '#008300',\n '#9085e9',\n '#e66767',\n] as const\n\n/**\n * The CSS color reference for series slot `index` (0-based): a `--rs-chart-\n * series-N` token with the validated light hex as its fallback. Slots past\n * eight reuse the last — metric panels never reach that, and a host with more\n * series should fold to \"Other\" per the categorical rule.\n */\nexport function seriesColor(index: number): string {\n const slot = Math.min(index, SERIES_COLORS_LIGHT.length - 1)\n return `var(--rs-chart-series-${slot + 1}, ${SERIES_COLORS_LIGHT[slot]})`\n}\n","/**\n * Presentation/calculation helpers over a `NormalizedReport`, plus the live\n * footing check used by the fact inspector.\n *\n * The heavy lifting — turning a report into renderable tables — now lives in the\n * fact pivot engine (`pivot.ts`). This file holds the small, reusable graph\n * utilities that the engine and the components share: the presentation-order\n * walk, the calculation-subtotal set, single-section slicing, and `footCheck`.\n */\nimport { humanize, qname } from './constants'\nimport type { CalcAssociation, ElementInfo, NormalizedReport, PivotTable } from './model'\n\ninterface OrderEntry {\n order: number\n depth: number\n}\n\nfunction fallbackElement(id: string): ElementInfo {\n return {\n id,\n qname: qname(id),\n label: humanize(id),\n balance: null,\n periodType: null,\n abstract: false,\n monetary: false,\n }\n}\n\n/**\n * Post-order the presentation arcs of one structure → `{element: {order, depth}}`.\n * Roots (a `from` that is never a `to`) are visited by their subtree's leading\n * arc order. Retained as a reusable utility; the pivot engine builds its own\n * pre-order tree (it needs abstract headers), but external callers may still want\n * a flat order map.\n */\nexport function presentationOrder(\n model: NormalizedReport,\n structureId: string\n): Map<string, OrderEntry> {\n const children = new Map<string, Array<[number, string]>>()\n const froms = new Set<string>()\n const tos = new Set<string>()\n\n for (const assoc of model.presAssociations) {\n if (assoc.structure !== structureId) continue\n const kids = children.get(assoc.parent) ?? []\n kids.push([assoc.order, assoc.child])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n for (const kids of children.values()) {\n kids.sort((a, b) => a[0] - b[0])\n }\n\n const out = new Map<string, OrderEntry>()\n const seen = new Set<string>()\n let counter = 0\n\n const walk = (node: string, depth: number): void => {\n if (seen.has(node)) return\n seen.add(node)\n for (const [, child] of children.get(node) ?? []) {\n walk(child, depth + 1)\n }\n out.set(node, { order: counter, depth })\n counter += 1\n }\n\n const rootKey = (root: string): number => {\n const kids = children.get(root)\n return kids && kids.length ? kids[0][0] : 0\n }\n\n const roots = [...froms].filter((f) => !tos.has(f)).sort((a, b) => rootKey(a) - rootKey(b))\n for (const root of roots) walk(root, 0)\n return out\n}\n\n/** Concepts that are calculation parents — the authoritative subtotal set. */\nexport function calcSubtotals(model: NormalizedReport): Set<string> {\n const out = new Set<string>()\n for (const assoc of model.calcAssociations) out.add(assoc.parent)\n return out\n}\n\n/**\n * Narrow a whole report to a single section (one Information Block) so it can be\n * rendered on its own. `buildPivots` only iterates `informationBlocks`, so\n * restricting to one yields exactly that section — facts, structures, and\n * networks stay intact because the pivot filters them by the block.\n */\nexport function sliceReportSection(\n model: NormalizedReport,\n informationBlockId: string\n): NormalizedReport {\n const ib = model.informationBlocks.find((b) => b.id === informationBlockId)\n return { ...model, informationBlocks: ib ? [ib] : [] }\n}\n\n// ── Footing check ────────────────────────────────────────────────────────────\n\nexport interface FootTerm {\n element: ElementInfo\n weight: number\n value: number | null\n}\n\nexport interface FootCheck {\n element: ElementInfo\n columnIndex: number\n terms: FootTerm[]\n /** Σ child·weight over the present terms, or null if none are present. */\n expected: number | null\n /** The subtotal's own reported value in this column. */\n actual: number | null\n ok: boolean\n}\n\n/**\n * Foot a subtotal live: sum its calculation children (× weight) and compare to\n * its reported value, e.g. `13,550 + 900 = 14,450 ✓`. Returns `null` when the\n * element is not a calculation parent (nothing to foot). Values are read from the\n * consolidated (undimensioned) row for each concept.\n */\nexport function footCheck(\n model: NormalizedReport,\n table: PivotTable,\n elementId: string,\n columnIndex: number\n): FootCheck | null {\n // One arc per (structure, child). A summation cannot legitimately name the\n // same child twice on one ELR, and a producer that emits the arc twice would\n // otherwise count the child twice and report the subtotal as off by exactly\n // that child (robosystems #1395: a disclosure's arcs reached the bundle from\n // two paths, so its note footed to 2x its reported total). Deduplication is\n // per structure, so the SEC adapter's per-section arcs — the same\n // parent -> child presented on several sections — are untouched.\n const kids: CalcAssociation[] = []\n const seen = new Set<string>()\n for (const a of model.calcAssociations) {\n if (a.parent !== elementId) continue\n const key = `${a.structure ?? ''}\\u0000${a.child}`\n if (seen.has(key)) continue\n seen.add(key)\n kids.push(a)\n }\n if (!kids.length) return null\n\n const valueOf = (id: string): number | null => {\n const row = table.rows.find((r) => r.element.id === id && r.members.length === 0)\n return row ? (row.cells[columnIndex]?.value ?? null) : null\n }\n\n const terms: FootTerm[] = kids\n .slice()\n .sort((a, b) => a.order - b.order)\n .map((a) => ({\n element: model.elements[a.child] ?? fallbackElement(a.child),\n weight: a.weight,\n value: valueOf(a.child),\n }))\n\n const present = terms.filter((t) => t.value !== null)\n const expected = present.length\n ? present.reduce((sum, t) => sum + (t.value as number) * t.weight, 0)\n : null\n const actual = valueOf(elementId)\n const ok = expected !== null && actual !== null && Math.abs(expected - actual) < 0.005\n\n return {\n element: model.elements[elementId] ?? fallbackElement(elementId),\n columnIndex,\n terms,\n expected,\n actual,\n ok,\n }\n}\n","/**\n * The fact pivot engine — a `NormalizedReport` section → a `PivotTable`.\n *\n * A section is an XBRL hypercube; rendering it is pivoting its fact table. Every\n * fact is a point in aspect space (concept · period · entity · unit · dimensions);\n * a `PivotConfig` assigns each aspect a role — row, column, or slicer — and the\n * cells fall out. The default arrangement (concept hierarchy + multi-member\n * dimensions on rows, period on columns, entity and single-member dimensions as\n * slicers) is derived per section, but nothing is hardcoded: a caller can move\n * any aspect to any role (the Pesseract \"override the default view\" model) —\n * `pivotDimensionsOn` flips dimensions between rows and columns for the toggle.\n *\n * This supersedes the collision-prone `(element, period.end)` cell keying of the\n * legacy `buildStatement`. A cell is the one fact whose *full* aspect signature —\n * element, period, and dimensional coordinate — matches its row and column, so\n * segment/component breakdowns and consolidated totals occupy distinct cells\n * instead of silently overwriting one another. Because every cell owns its fact,\n * the fact's own period/unit metadata is exact (no borrowing from a merged\n * column), which is what fixes the wrong-metadata symptom too.\n */\nimport { BLOCK_ORDER, BLOCK_TITLES, humanize, qname } from './constants'\nimport { formatDate, numericKindOf } from './format'\nimport type {\n AspectKey,\n DimensionQualifier,\n ElementInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n PeriodInfo,\n PivotColumn,\n PivotColumnHeader,\n PivotConfig,\n PivotRow,\n PivotSlicer,\n PivotTable,\n ResolvedScale,\n Scale,\n StructureInfo,\n} from './model'\nimport { calcSubtotals } from './project'\nimport type { SectionKind } from './sections'\n\n// ── Aspect / signature helpers ──────────────────────────────────────────────\n\n/** The domain-total coordinate for an axis (a fact with no member on it). */\nconst DOMAIN = '∅' // ∅\n\n/** The `dim:<axis>` aspect key for an axis IRI/qname. */\nfunction dimKey(axis: string): AspectKey {\n return `dim:${axis}`\n}\n\n/** The axis IRI behind a `dim:<axis>` key, or null for a builtin aspect. */\nfunction axisOf(key: AspectKey): string | null {\n return key.startsWith('dim:') ? key.slice(4) : null\n}\n\n/** The dimension axes named by a role's aspect list, in order. */\nfunction dimAxes(keys: AspectKey[]): string[] {\n return keys.map(axisOf).filter((a): a is string => a !== null)\n}\n\n/** A fact's members keyed by axis (empty when consolidated). */\nfunction memberByAxis(fact: Fact): Map<string, DimensionQualifier> {\n const m = new Map<string, DimensionQualifier>()\n for (const d of fact.dimensions ?? []) m.set(d.axis, d)\n return m\n}\n\n/** The signature key one qualifier contributes: member, typed value, or domain. */\nfunction memberKey(d: DimensionQualifier | null | undefined): string {\n return d?.member ?? d?.typedValue ?? DOMAIN\n}\n\n/**\n * The ISO date one day before `date`. XBRL dates a beginning-of-period instant\n * as the prior period's end (FY2026 runs 2025-01-27 → 2026-01-25; its opening\n * balance is the instant 2025-01-26), so a `periodStart*` row binds the instant\n * at the duration's start date minus one day (with the exact start date as a\n * fallback for non-SEC conventions).\n */\nfunction isoDayBefore(date: string): string {\n const t = new Date(`${date}T00:00:00Z`)\n if (Number.isNaN(t.getTime())) return date\n t.setUTCDate(t.getUTCDate() - 1)\n return t.toISOString().slice(0, 10)\n}\n\n/**\n * A fact's coordinate along a chosen set of axes, as a stable signature. A fact\n * with no member on an axis contributes the domain-total marker, so the\n * consolidated total gets its own coordinate distinct from every member.\n */\nfunction coordinate(byAxis: Map<string, DimensionQualifier>, axes: string[]): string {\n return axes.map((a) => `${a}=${memberKey(byAxis.get(a))}`).join('|')\n}\n\n/** Facts belonging to one section (its Information Block's factset). */\nfunction sectionFacts(model: NormalizedReport, ib: InformationBlock): Fact[] {\n const target = ib.factSet\n if (target === null) return []\n // Membership, not equality: a fact may belong to several factSets (a summary\n // concept presented in multiple structures), so include it when THIS section is\n // among them. Fall back to the single `factSet` for adapters that set only one.\n return model.facts.filter((f) =>\n (f.factSets ?? (f.factSet !== null ? [f.factSet] : [])).includes(target)\n )\n}\n\n/** The local part of a qname (`us-gaap:Assets` → `Assets`). */\nfunction localName(qname: string): string {\n return qname.includes(':') ? (qname.split(':').pop() as string) : qname\n}\n\n/**\n * Local names of every element in a structure's presentation network. A section\n * only *owns* the dimension axes declared here (its hypercube's axes appear as\n * presentation nodes); facts carrying any other axis are a different table's\n * breakdown — e.g. segment revenue tagged to the income-statement role — and must\n * not be pivoted into this statement. Matched by local name so a company-specific\n * axis (`nvda:FooAxis`) lines up regardless of prefix.\n */\nfunction presentationNodeLocals(model: NormalizedReport, structureId: string): Set<string> {\n const out = new Set<string>()\n for (const a of model.presAssociations) {\n if (a.structure !== structureId) continue\n out.add(localName(a.parent))\n out.add(localName(a.child))\n }\n return out\n}\n\ninterface PresentationScope {\n /** Local names of every presentation node (axes, members, line items). */\n declared: Set<string>\n /** Whether the presentation lists explicit members (a closed member set). */\n listsMembers: boolean\n}\n\n/**\n * The section's dimensional scope. Many \"Details\" disclosures share one hypercube\n * factset (every debt instrument, every segment), and are distinguished only by\n * which *members* each network's presentation declares — so \"DEBT, DuQuoin State\n * Bank\" and \"DEBT, CREM Loan\" pull from the same facts but must show different\n * rows. When the presentation lists members, a fact whose member on any axis is\n * not declared belongs to a sibling disclosure and is out of scope.\n */\nfunction presentationScope(model: NormalizedReport, structureId: string): PresentationScope {\n const declared = presentationNodeLocals(model, structureId)\n let listsMembers = false\n for (const l of declared) {\n if (l.endsWith('Member')) {\n listsMembers = true\n break\n }\n }\n return { declared, listsMembers }\n}\n\n/** Whether a dimension is in a section's declared scope (axis + member). */\nfunction dimensionInScope(scope: PresentationScope, d: DimensionQualifier): boolean {\n if (!scope.declared.has(localName(d.axis))) return false\n return !scope.listsMembers || d.member === null || scope.declared.has(localName(d.member))\n}\n\n// ── Presentation tree ───────────────────────────────────────────────────────\n\n/**\n * One presentation arc as the row walk consumes it: the child plus the arc's\n * preferred-label choice. `binding` is the roll-forward semantic — a\n * `periodStart*` / `periodEnd*` role means this arc's row binds the instant\n * fact at the START (respectively end) of each duration column, so the same\n * concept legitimately appears twice (beginning and ending balance).\n */\ninterface PresArcRef {\n child: string\n label: string | null\n binding: 'start' | 'end' | null\n negated: boolean\n}\n\ninterface PresentationTree {\n /** Ordered child arcs per parent (by arc order). */\n childrenOf: Map<string, PresArcRef[]>\n /** Presentation roots (a `from` that is never a `to`), in filing sequence. */\n roots: string[]\n /** Pre-order position of each element — the member/row ordering key. */\n indexOf: Map<string, number>\n}\n\nfunction arcRef(a: {\n child: string\n preferredLabel?: string | null\n preferredLabelRole?: string | null\n}): PresArcRef {\n const role = a.preferredLabelRole ?? ''\n return {\n child: a.child,\n label: a.preferredLabel ?? null,\n binding: /periodStart/i.test(role) ? 'start' : /periodEnd/i.test(role) ? 'end' : null,\n negated: /negated/i.test(role),\n }\n}\n\n/**\n * Index one structure's presentation arcs: ordered child arcs per parent, the\n * roots, and each element's pre-order position (used to order dimension members).\n * The row walk itself (in `buildPivot`) is a hybrid — abstract headers emit\n * before their children, concrete concepts after — so a subtotal renders after\n * its components whether the taxonomy models it as an abstract's last child\n * (us-gaap) or as the presentation parent of its components (rs-gaap).\n */\nfunction presentationTree(model: NormalizedReport, structureId: string): PresentationTree {\n const children = new Map<string, Array<[number, PresArcRef]>>()\n const froms = new Set<string>()\n const tos = new Set<string>()\n for (const assoc of model.presAssociations) {\n if (assoc.structure !== structureId) continue\n const kids = children.get(assoc.parent) ?? []\n kids.push([assoc.order, arcRef(assoc)])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n const childrenOf = new Map<string, PresArcRef[]>()\n for (const [parent, kids] of children) {\n childrenOf.set(\n parent,\n kids.sort((a, b) => a[0] - b[0]).map(([, arc]) => arc)\n )\n }\n const rootKey = (root: string): number => {\n const kids = children.get(root)\n return kids && kids.length ? kids[0][0] : 0\n }\n const roots = [...froms].filter((f) => !tos.has(f)).sort((a, b) => rootKey(a) - rootKey(b))\n\n // Keyed by *local name* so member ordering matches a dimension qualifier's\n // member regardless of prefix (a company member `mrmd:RetailMember` reaches the\n // renderer as the bare local `RetailMember`).\n const indexOf = new Map<string, number>()\n const seen = new Set<string>()\n const pre = (node: string): void => {\n if (seen.has(node)) return\n seen.add(node)\n const ln = localName(node)\n if (!indexOf.has(ln)) indexOf.set(ln, indexOf.size)\n for (const arc of childrenOf.get(node) ?? []) pre(arc.child)\n }\n for (const root of roots) pre(root)\n return { childrenOf, roots, indexOf }\n}\n\n/** The structure supplying a block's networks (by id, else by block type). */\nfunction structureForBlock(model: NormalizedReport, ib: InformationBlock): StructureInfo | null {\n if (ib.structureId) {\n const byId = model.structures.find((s) => s.id === ib.structureId)\n if (byId) return byId\n }\n return model.structures.find((s) => s.blockType === ib.blockType) ?? null\n}\n\nfunction fallbackElement(id: string): ElementInfo {\n return {\n id,\n qname: qname(id),\n label: humanize(id),\n balance: null,\n periodType: null,\n abstract: false,\n monetary: false,\n }\n}\n\nconst elementOf = (model: NormalizedReport, id: string): ElementInfo =>\n model.elements[id] ?? fallbackElement(id)\n\n/**\n * Pure XBRL hypercube plumbing: a `[Table]` (the hypercube itself) and its\n * `[Line Items]` container. These abstracts exist only to hang dimensional facts\n * off of — they carry no data, and once their role tag is stripped for display\n * they collapse to a bare, duplicated \"Statement\" heading. So they are never a\n * meaningful row: skip the header and promote their children in their place.\n * Keyed off the concept's local name (identical across the store and SEC routes,\n * which key elements by IRI vs qname respectively) so both render the same.\n */\nconst SCAFFOLD_LOCAL_RE = /(?:Table|LineItems)$/\nfunction isStructuralScaffold(el: ElementInfo): boolean {\n return el.abstract && SCAFFOLD_LOCAL_RE.test(localName(el.qname))\n}\n\n/**\n * A heading row that says exactly what the section header above it already\n * says. Compared loosely — case and surrounding punctuation/whitespace differ\n * between a role definition's title and a concept's standard label — but only\n * on the whole string, so a genuine sub-heading is never swallowed.\n */\nfunction restatesTitle(label: string, title: string): boolean {\n const normalize = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n const normalized = normalize(label)\n return normalized.length > 0 && normalized === normalize(title)\n}\n\n// ── Default configuration ───────────────────────────────────────────────────\n\n/**\n * Derive the default pivot for a section from the aspects its facts actually\n * carry: concept on rows, period on columns, entity a slicer, and each dimension\n * axis on columns when it has more than one member (a real breakdown) or a slicer\n * when it has just one (diced to a single member, e.g. `Consolidated [Domain]`).\n */\nexport function defaultPivotConfig(model: NormalizedReport, ib: InformationBlock): PivotConfig {\n const facts = sectionFacts(model, ib)\n const structure = structureForBlock(model, ib)\n // Only the axes *and members* this section's presentation/hypercube declares\n // belong in its view — so an axis that's a single declared member becomes a\n // slicer, not a spurious multi-member breakdown from a sibling disclosure.\n const scope = structure\n ? presentationScope(model, structure.id)\n : { declared: new Set<string>(), listsMembers: false }\n const membersByAxis = new Map<string, Set<string>>()\n let hasEntity = false\n for (const f of facts) {\n if (f.entity) hasEntity = true\n for (const d of f.dimensions ?? []) {\n if (!dimensionInScope(scope, d)) continue\n const set = membersByAxis.get(d.axis) ?? new Set<string>()\n set.add(d.member ?? d.typedValue ?? DOMAIN)\n membersByAxis.set(d.axis, set)\n }\n }\n const axes = [...membersByAxis.keys()].sort()\n const memberAxes = axes.filter((a) => (membersByAxis.get(a)?.size ?? 0) > 1)\n const slicerAxes = axes.filter((a) => (membersByAxis.get(a)?.size ?? 0) <= 1)\n\n // Dimensions default to *rows* (nested under the concept): financial statements\n // are tall, not wide, so member breakdowns stack more legibly than they spread\n // across columns. `pivotDimensionsOn` flips them to columns for the matrix view.\n return {\n rows: ['concept', ...memberAxes.map(dimKey)],\n columns: ['period'],\n slicers: [...(hasEntity ? (['entity'] as AspectKey[]) : []), ...slicerAxes.map(dimKey)],\n scale: 'auto',\n showAbstracts: true,\n dropSparsePeriods: true,\n }\n}\n\n/**\n * Move every dimension axis to one side of the pivot — the toggle behind a\n * \"dimensions as rows / columns\" control. Concept stays on rows and period on\n * columns; only `dim:*` aspects move. Rows (nested breakdowns) is the default;\n * columns gives the side-by-side matrix (equity components across the top).\n */\nexport function pivotDimensionsOn(config: PivotConfig, placement: 'rows' | 'columns'): PivotConfig {\n const isDim = (k: AspectKey): boolean => k.startsWith('dim:')\n const dims = [...config.rows, ...config.columns].filter(isDim)\n const rows = config.rows.filter((k) => !isDim(k))\n const columns = config.columns.filter((k) => !isDim(k))\n if (placement === 'rows') rows.push(...dims)\n else columns.push(...dims)\n return { ...config, rows, columns }\n}\n\n// ── Columns ─────────────────────────────────────────────────────────────────\n\n/** Fraction of the densest period a column must reach to count as a real one. */\nconst PERIOD_DENSITY_FRACTION = 0.2\n\n/**\n * Drop \"incomplete\" period columns — incidental context dates that aren't real\n * reporting periods: a transaction date (a single fact), a prior-year opening\n * balance, a stub period. The SEC/Arelle renderer selects reporting periods by\n * type + recency (most-recent instants aligned to the fiscal year-end for a\n * balance sheet, day-count-classified durations for income); we approximate that\n * with density, which separates the same set here — a real comparative repeats\n * most line items and clears the bar, while an incidental date is sparse. Keep a\n * period whose populated-fact count is at least `PERIOD_DENSITY_FRACTION` of the\n * densest (min 2), when the densest is non-trivial. Metadata-safe: cells still\n * own their own facts, so a dropped column can never mislabel a kept one.\n */\nfunction pruneSparsePeriods(\n model: NormalizedReport,\n facts: Fact[],\n periods: PeriodInfo[]\n): PeriodInfo[] {\n const count = new Map<string, number>()\n for (const f of facts) {\n const populated = f.value !== null || (f.textValue != null && f.textValue !== '')\n const period = model.periods[f.period]\n if (!period?.end || !populated) continue\n const key = periodKey(period)\n count.set(key, (count.get(key) ?? 0) + 1)\n }\n // A column's density is its own period's facts. The closing instants at a\n // duration's end render inside it but do not make it a reporting period: a\n // fourth-quarter stub a filer tags in an annual roll-forward has two facts of\n // its own and shares the year's closing balances — those must not keep it.\n const density = (p: PeriodInfo): number => count.get(periodKey(p)) ?? 0\n const max = Math.max(0, ...periods.map(density))\n if (max < 5) return periods\n const threshold = Math.max(2, max * PERIOD_DENSITY_FRACTION)\n return periods.filter((p) => density(p) >= threshold)\n}\n\n/**\n * The key a period column is built on. A duration is its whole span, so the\n * three- and six-month columns a 10-Q reports to the same date stay distinct\n * instead of collapsing into one column that shows whichever fact was indexed\n * last; an instant is its date.\n */\nfunction periodKey(period: PeriodInfo): string {\n return period.type === 'duration' && period.startDate\n ? `${period.startDate}/${period.end}`\n : period.end\n}\n\n/**\n * The fact keys a column reads: its own period and, for a duration, the instant\n * at its end — a closing balance sits inside the flow column that ends on it.\n */\nfunction columnPeriodKeys(period: PeriodInfo | null): string[] {\n if (!period) return ['']\n const key = periodKey(period)\n return key === period.end ? [key] : [key, period.end]\n}\n\n/** Days a duration covers; 0 for an instant or a duration without a start. */\nfunction spanDays(period: PeriodInfo): number {\n if (period.type !== 'duration' || !period.startDate) return 0\n const start = Date.parse(period.startDate)\n const end = Date.parse(period.endDate ?? period.end)\n if (Number.isNaN(start) || Number.isNaN(end)) return 0\n return Math.round((end - start) / 86_400_000)\n}\n\n/** Whole months a duration covers, so a 52- and a 53-week year read as the same span. */\nfunction spanMonths(period: PeriodInfo): number {\n const days = spanDays(period)\n return days === 0 ? 0 : Math.max(1, Math.round(days / 30.44))\n}\n\nconst MONTH_WORDS = [\n 'One',\n 'Two',\n 'Three',\n 'Four',\n 'Five',\n 'Six',\n 'Seven',\n 'Eight',\n 'Nine',\n 'Ten',\n 'Eleven',\n 'Twelve',\n]\n\n/**\n * The header a duration column carries above its date when a table reports\n * more than a plain year: \"Three months ended\" over the quarter columns, \"Six\n * months ended\" over the year-to-date ones. An instant has no span.\n */\nfunction spanLabel(period: PeriodInfo): string {\n const months = spanMonths(period)\n if (months === 0) return ''\n if (months === 12) return 'Year ended'\n const word = MONTH_WORDS[months - 1] ?? String(months)\n return `${word} month${months === 1 ? '' : 's'} ended`\n}\n\n/** Shorter spans first (the quarters before the year-to-date), then by date. */\nfunction comparePeriods(a: PeriodInfo, b: PeriodInfo): number {\n return (\n spanMonths(a) - spanMonths(b) ||\n (a.startDate ?? a.end).localeCompare(b.startDate ?? b.end) ||\n a.end.localeCompare(b.end)\n )\n}\n\n/**\n * Period columns: every duration, keyed by its whole span, plus the instants no\n * duration ends on. An instant that shares a duration's end is that column's\n * closing balance, not a column of its own.\n */\nfunction derivePeriods(model: NormalizedReport, facts: Fact[]): PeriodInfo[] {\n const durations = new Map<string, PeriodInfo>()\n const instants = new Map<string, PeriodInfo>()\n for (const fact of facts) {\n const period = model.periods[fact.period]\n if (!period || !period.end) continue\n if (period.type === 'duration') durations.set(periodKey(period), period)\n else instants.set(period.end, period)\n }\n const durationEnds = new Set([...durations.values()].map((p) => p.end))\n return [\n ...durations.values(),\n ...[...instants.values()].filter((p) => !durationEnds.has(p.end)),\n ].sort(comparePeriods)\n}\n\ninterface MemberCombo {\n /** Signature over the chosen axes (domain-total for a missing member). */\n sig: string\n /** One qualifier per axis — null where this combo is the axis's domain total. */\n members: DimensionQualifier[]\n /** Header segment labels, one per axis. */\n labels: string[]\n}\n\n/**\n * The distinct member combinations present across `facts` for the chosen axes,\n * ordered by each member's presentation position. The union across periods, so\n * the grid is regular (a member absent in one period shows an empty cell rather\n * than a ragged set). `domainLast` places the domain total (the consolidated,\n * memberless combo) after its members — a trailing \"Total\" column, or on rows the\n * concept's summing total below its member breakdown.\n */\nfunction memberCombos(\n facts: Fact[],\n axes: string[],\n order: Map<string, number>,\n domainLast: boolean\n): MemberCombo[] {\n if (axes.length === 0) return [{ sig: '', members: [], labels: [] }]\n\n // Distinct members seen per axis (+ whether a domain total exists), plus a\n // representative qualifier so we can render a member's label without re-joining.\n const perAxis = axes.map((axis) => {\n const byMember = new Map<string, DimensionQualifier | null>()\n let hasDomain = false\n for (const f of facts) {\n const d = (f.dimensions ?? []).find((x) => x.axis === axis)\n if (d) byMember.set(d.member ?? d.typedValue ?? DOMAIN, d)\n else hasDomain = true\n }\n const members = [...byMember.entries()]\n .map(([key, qual]) => ({ key, qual }))\n .sort((a, b) => {\n const ao = a.qual?.member ? (order.get(localName(a.qual.member)) ?? Infinity) : Infinity\n const bo = b.qual?.member ? (order.get(localName(b.qual.member)) ?? Infinity) : Infinity\n return ao - bo || (a.qual?.memberLabel ?? a.key).localeCompare(b.qual?.memberLabel ?? b.key)\n })\n if (hasDomain) {\n const domain = { key: DOMAIN, qual: null }\n if (domainLast) members.push(domain)\n else members.unshift(domain)\n }\n return { axis, members }\n })\n\n // Cartesian product across axes → ordered combos.\n let combos: MemberCombo[] = [{ sig: '', members: [], labels: [] }]\n for (const { axis, members } of perAxis) {\n const next: MemberCombo[] = []\n for (const combo of combos) {\n for (const { key, qual } of members) {\n next.push({\n sig: combo.sig ? `${combo.sig}|${axis}=${key}` : `${axis}=${key}`,\n members: [...combo.members, ...(qual ? [qual] : [])],\n labels: [...combo.labels, qual ? qual.memberLabel : 'Total'],\n })\n }\n }\n combos = next\n }\n return combos\n}\n\n/** Run-length-encode leaf-column segment tuples into spanning header levels. */\nfunction headerLevels(segsPerColumn: string[][]): PivotColumnHeader[][] {\n const levels = segsPerColumn[0]?.length ?? 0\n const out: PivotColumnHeader[][] = []\n for (let level = 0; level < levels; level++) {\n const row: PivotColumnHeader[] = []\n let i = 0\n while (i < segsPerColumn.length) {\n // Merge consecutive columns equal at this level *and* all ancestor levels.\n let span = 1\n while (\n i + span < segsPerColumn.length &&\n segsPerColumn[i + span][level] === segsPerColumn[i][level] &&\n Array.from({ length: level + 1 }, (_, l) => l).every(\n (l) => segsPerColumn[i + span][l] === segsPerColumn[i][l]\n )\n ) {\n span++\n }\n row.push({ label: segsPerColumn[i][level], span })\n i += span\n }\n out.push(row)\n }\n return out\n}\n\n// ── Scale ───────────────────────────────────────────────────────────────────\n\nconst SCALE_FACTOR: Record<Exclude<Scale, 'auto'>, { factor: number; label: string }> = {\n ones: { factor: 1, label: '' },\n thousands: { factor: 1e3, label: 'thousands' },\n millions: { factor: 1e6, label: 'millions' },\n billions: { factor: 1e9, label: 'billions' },\n}\n\n/**\n * Resolve the section's display scale. `auto` picks the most common rounding\n * (`decimals`) among monetary facts — `-6` → millions, `-3..-5` → thousands — and\n * captions it, noting the per-share exception when the section also has EPS or\n * share-count facts (which are never rescaled).\n */\nfunction resolveScale(facts: Fact[], model: NormalizedReport, requested: Scale): ResolvedScale {\n const kindOf = (id: string): string => numericKindOf(elementOf(model, id))\n\n let factor = 1\n let label = ''\n if (requested !== 'auto') {\n ;({ factor, label } = SCALE_FACTOR[requested])\n } else {\n const decimalsCount = new Map<number, number>()\n for (const f of facts) {\n if (f.value === null || kindOf(f.element) !== 'monetary') continue\n const d = f.decimals === null || f.decimals === 'INF' ? NaN : Number(f.decimals)\n if (Number.isNaN(d) || d >= 0) continue\n decimalsCount.set(d, (decimalsCount.get(d) ?? 0) + 1)\n }\n let dominant = 0\n let best = 0\n for (const [d, count] of decimalsCount) {\n if (count > best) {\n best = count\n dominant = d\n }\n }\n if (dominant <= -9) ({ factor, label } = SCALE_FACTOR.billions)\n else if (dominant <= -6) ({ factor, label } = SCALE_FACTOR.millions)\n else if (dominant <= -3) ({ factor, label } = SCALE_FACTOR.thousands)\n }\n\n let caption: string | null = null\n if (factor > 1) {\n const hasPerShare = facts.some((f) => {\n const k = kindOf(f.element)\n return f.value !== null && (k === 'perShare' || k === 'shares')\n })\n caption = hasPerShare ? `In ${label}, except per-share amounts` : `In ${label}`\n }\n return { factor, label, caption }\n}\n\n// ── Slicers ─────────────────────────────────────────────────────────────────\n\nfunction buildSlicers(\n model: NormalizedReport,\n config: PivotConfig,\n diced: Map<string, DimensionQualifier | null>\n): PivotSlicer[] {\n const slicers: PivotSlicer[] = []\n for (const key of config.slicers) {\n if (key === 'entity') {\n if (model.entity) {\n slicers.push({\n aspect: 'entity',\n label: 'Reporting Entity',\n valueLabel: model.entity.name,\n })\n }\n continue\n }\n const axis = axisOf(key)\n if (!axis) continue\n // A slicer dimension is diced to a single member (or its domain total) —\n // the same coordinate the fact index binds cells against, so the chip\n // states exactly what the cells show.\n const qual = diced.get(axis) ?? null\n const axisLabel = qual?.axisLabel ?? humanize(axis)\n slicers.push({\n aspect: key,\n label: `${axisLabel} [Axis]`,\n valueLabel: qual ? qual.memberLabel : 'Consolidated',\n })\n }\n return slicers\n}\n\n// ── Build ───────────────────────────────────────────────────────────────────\n\n/**\n * Pivot one section into a `PivotTable`. Pass `config` to override the default\n * arrangement (e.g. move a high-arity axis from columns to rows).\n */\nexport function buildPivot(\n model: NormalizedReport,\n ib: InformationBlock,\n config: PivotConfig = defaultPivotConfig(model, ib)\n): PivotTable {\n const structure = structureForBlock(model, ib)\n const tree: PresentationTree = structure\n ? presentationTree(model, structure.id)\n : { childrenOf: new Map(), roots: [], indexOf: new Map() }\n\n const rowDimAxes = dimAxes(config.rows)\n const colDimAxes = dimAxes(config.columns)\n const allowedAxes = new Set([...rowDimAxes, ...colDimAxes, ...dimAxes(config.slicers)])\n const scope: PresentationScope = structure\n ? presentationScope(model, structure.id)\n : { declared: new Set(), listsMembers: false }\n\n // In-table facts: drop any carrying an axis this configuration doesn't place,\n // or (when the section lists members) a member its presentation doesn't declare\n // — a sibling disclosure's row that shares this hypercube's factset.\n const facts = sectionFacts(model, ib).filter((f) =>\n (f.dimensions ?? []).every((d) => allowedAxes.has(d.axis) && dimensionInScope(scope, d))\n )\n\n // Each slicer axis is diced to one coordinate: the (single) member its facts\n // carry, or the domain total when no fact carries the axis. Cell binding and\n // the slicer chips both read this map, so the chip states exactly which\n // coordinate the cells show.\n const dicedSlicers = new Map<string, DimensionQualifier | null>()\n for (const axis of dimAxes(config.slicers)) {\n const qual = facts.flatMap((f) => f.dimensions ?? []).find((d) => d.axis === axis) ?? null\n dicedSlicers.set(axis, qual)\n }\n\n // A fact belongs in the table when every dimension it carries is either shown\n // on rows/columns (where it contributes to the cell signature) or sits on a\n // slicer axis at the diced coordinate. A fact on an axis this pivot doesn't\n // place at all is a finer breakdown of a coarser cell; a fact at a different\n // slicer coordinate is a sibling slice. Both are dropped — indexing either\n // would collide with the cell's rightful fact.\n const shownAxes = new Set([...rowDimAxes, ...colDimAxes])\n const tableFacts = facts.filter((f) =>\n (f.dimensions ?? []).every(\n (d) =>\n shownAxes.has(d.axis) ||\n (dicedSlicers.has(d.axis) && memberKey(d) === memberKey(dicedSlicers.get(d.axis)))\n )\n )\n\n // Columns: period (outer) × member combos over the column axes (inner).\n const periodOnColumns = config.columns.includes('period')\n let periods = periodOnColumns ? derivePeriods(model, tableFacts) : []\n if (periodOnColumns && config.dropSparsePeriods !== false) {\n periods = pruneSparsePeriods(model, tableFacts, periods)\n }\n // A roll-forward's opening instants render as beginning-balance rows *inside*\n // the duration columns (periodStart binding below); a standalone column for\n // the same instant would duplicate that data, so drop it.\n const hasRollForward = [...tree.childrenOf.values()].some((arcs) =>\n arcs.some((a) => a.binding !== null)\n )\n if (periodOnColumns && hasRollForward) {\n const startKeys = new Set(\n periods\n .filter((p) => p.type === 'duration' && p.startDate)\n .flatMap((p) => [isoDayBefore(p.startDate as string), p.startDate as string])\n )\n periods = periods.filter((p) => !(p.type === 'instant' && startKeys.has(p.end)))\n }\n const colCombos = memberCombos(tableFacts, colDimAxes, tree.indexOf, true)\n\n // Column coordinates that actually carry a fact. The member-combo union (and\n // cross-product across axes) yields many (period × member) columns that never\n // occur; drop the empty ones — the column analog of only emitting member rows\n // that have facts.\n const occupiedCols = new Set<string>()\n for (const f of tableFacts) {\n const period = model.periods[f.period]\n const key = period ? periodKey(period) : ''\n occupiedCols.add(`${key}#${coordinate(memberByAxis(f), colDimAxes)}`)\n }\n const occupied = (period: PeriodInfo | null, sig: string): boolean =>\n columnPeriodKeys(period).some((key) => occupiedCols.has(`${key}#${sig}`))\n\n // A table that reports anything other than plain years — a 10-Q's three- and\n // six-month columns end on the same date — carries the span as a header level\n // above the dates. A 10-K's year columns stay as they were.\n const showSpans =\n periodOnColumns && periods.some((p) => p.type === 'duration' && spanLabel(p) !== 'Year ended')\n\n const columns: PivotColumn[] = []\n const columnSegs: string[][] = []\n const periodList = periodOnColumns ? periods : [null]\n for (const period of periodList) {\n for (const combo of colCombos) {\n if (!occupied(period, combo.sig)) continue\n const key = period ? periodKey(period) : ''\n const periodLabel = period ? formatDate(period.end) : ''\n columns.push({\n key: `${key}#${combo.sig}`,\n period,\n members: combo.members,\n label: combo.labels.length ? combo.labels[combo.labels.length - 1] : periodLabel,\n })\n const periodSegs = periodOnColumns\n ? [...(showSpans ? [period ? spanLabel(period) : ''] : []), periodLabel]\n : []\n columnSegs.push([...periodSegs, ...combo.labels])\n }\n }\n const columnHeaders = headerLevels(columnSegs)\n\n // Index every in-table fact by (element, rowCombo, periodKey, colCombo) so a\n // cell is an O(1) exact-signature lookup — no last-write-wins collisions.\n //\n // A fact that doesn't carry a slicer axis is that axis's domain total and may\n // still bind, but a fact AT the diced coordinate is more specific and wins the\n // cell: with Consolidation Items diced to `Operating Segments`, the\n // operating-segments total owns the aggregate cell, not the consolidated\n // face-statement fact that shares its factset. Ascending-specificity insertion\n // makes the map's last write the most specific fact.\n const slicerSpecificity = (f: Fact): number =>\n (f.dimensions ?? []).filter((d) => !shownAxes.has(d.axis)).length\n const factIndex = new Map<string, Fact>()\n for (const f of [...tableFacts].sort((a, b) => slicerSpecificity(a) - slicerSpecificity(b))) {\n const byAxis = memberByAxis(f)\n const period = model.periods[f.period]\n const key = period ? periodKey(period) : ''\n const rowSig = coordinate(byAxis, rowDimAxes)\n const colSig = coordinate(byAxis, colDimAxes)\n factIndex.set(`${f.element}␟${rowSig}␟${key}␟${colSig}`, f)\n }\n\n const factfulConcepts = new Set(tableFacts.map((f) => f.element))\n\n // The period keys a row binds against in a column. Default (and `periodEnd`)\n // rows read the column's own span, then the instant at its end; a `periodStart`\n // row reads the instant at the column duration's start — dated the day before\n // the start (the XBRL/SEC convention), with the exact start date as fallback.\n const periodKeysFor = (col: PivotColumn, binding: 'start' | 'end' | null): string[] => {\n if (binding !== 'start') return columnPeriodKeys(col.period)\n const start = col.period?.startDate\n return start ? [isoDayBefore(start), start] : []\n }\n\n const lookupFact = (\n element: string,\n rowSig: string,\n col: PivotColumn,\n binding: 'start' | 'end' | null\n ): Fact | undefined => {\n const colSig = coordinate(new Map(col.members.map((m) => [m.axis, m])), colDimAxes)\n for (const end of periodKeysFor(col, binding)) {\n const fact = factIndex.get(`${element}␟${rowSig}␟${end}␟${colSig}`)\n if (fact) return fact\n }\n return undefined\n }\n\n // Domain total last on rows too: member rows list first, then the concept's\n // own (memberless) total below and outdented — the accounting \"components then\n // total\" layout, so the total reads as the sum of the members above it.\n const rowCombos = memberCombos(tableFacts, rowDimAxes, tree.indexOf, true)\n const combosForConcept = (element: string, binding: 'start' | 'end' | null): MemberCombo[] => {\n const occupied = (combo: MemberCombo): boolean =>\n columns.some((col) => lookupFact(element, combo.sig, col, binding) !== undefined)\n if (rowDimAxes.length === 0) {\n // A start/end row with no bindable fact anywhere must not render at all.\n return binding === null || occupied(rowCombos[0]) ? rowCombos : []\n }\n return rowCombos.filter(occupied)\n }\n\n const cellsFor = (\n element: string,\n rowSig: string,\n binding: 'start' | 'end' | null\n ): PivotRow['cells'] =>\n columns.map((col) => {\n const fact = lookupFact(element, rowSig, col, binding)\n return {\n value: fact?.value ?? null,\n fact: fact ?? null,\n textValue: fact && fact.value === null ? (fact.textValue ?? null) : null,\n }\n })\n\n const subtotals = calcSubtotals(model)\n\n // Prune empty subtrees: only walk into a node that itself has facts or has a\n // fact-bearing descendant, so empty sections (and their headers) don't show.\n const hasFactMemo = new Map<string, boolean>()\n const subtreeHasFact = (id: string): boolean => {\n const cached = hasFactMemo.get(id)\n if (cached !== undefined) return cached\n hasFactMemo.set(id, false) // guard against cycles\n let has = factfulConcepts.has(id)\n for (const arc of tree.childrenOf.get(id) ?? []) {\n if (subtreeHasFact(arc.child)) has = true\n }\n hasFactMemo.set(id, has)\n return has\n }\n\n const rows: PivotRow[] = []\n const emitConcept = (id: string, depth: number, arc: PresArcRef | null): void => {\n const el = elementOf(model, id)\n const binding = arc?.binding ?? null\n const combos = combosForConcept(id, binding)\n if (!combos.length) return\n const rowLabel = arc?.label ?? undefined\n const negated = arc?.negated || undefined\n // A roll-forward concept renders once per arc (beginning / ending balance);\n // the binding suffix keeps those rows' keys distinct.\n const variant = binding ? `${id}␟rf:${binding}` : id\n // With dimensions on rows, a concept's own total row heads its indented member\n // breakdown and supplies the concept name. When the concept has *no*\n // consolidated total (only per-member facts — common in detail disclosures),\n // emit a valueless heading row so the members aren't orphaned member-only\n // labels (`CREM Loan · Mortgages` with no idea what is being measured).\n if (combos.every((c) => c.members.length > 0)) {\n rows.push({\n key: variant,\n element: el,\n depth,\n header: false,\n isSubtotal: subtotals.has(id),\n members: [],\n cells: columns.map(() => ({ value: null, fact: null, textValue: null })),\n label: rowLabel,\n negated,\n })\n }\n for (const combo of combos) {\n // The domain-total combo (no members) keys by the element alone — it's the\n // concept's own total row, identical to the undimensioned case. Only member\n // sub-rows carry the dimensional signature in their key.\n rows.push({\n key: combo.members.length ? `${variant}␟${combo.sig}` : variant,\n element: el,\n depth: depth + (combo.members.length ? 1 : 0),\n header: false,\n isSubtotal: subtotals.has(id),\n members: combo.members,\n cells: cellsFor(id, combo.sig, binding),\n label: rowLabel,\n negated,\n })\n }\n }\n\n // Hybrid walk: an abstract emits its header *before* its children (so the\n // `[Roll Up]` header sits above its section); a concrete concept emits *after*\n // its children (so a subtotal lands below its components) — correct whether the\n // subtotal is an abstract's last child (us-gaap) or the parent itself (rs-gaap).\n //\n // Dedup is per (element, binding): a roll-forward concept appears under TWO\n // arcs — beginning balance at the top of the network, ending balance at the\n // bottom — and each emits its own row; every other repeat of an element is a\n // genuine duplicate and drops.\n const title = ib.structureId\n ? (structure?.structureName ?? ib.label ?? BLOCK_TITLES[ib.blockType] ?? ib.blockType)\n : (BLOCK_TITLES[ib.blockType] ?? ib.label ?? ib.blockType)\n\n const seenInTree = new Set<string>()\n const walkedConcepts = new Set<string>()\n const walk = (arc: PresArcRef, depth: number): void => {\n const id = arc.child\n if (!subtreeHasFact(id)) return\n const el = elementOf(model, id)\n const dedupKey = el.abstract ? id : `${id}␟${arc.binding ?? ''}`\n if (seenInTree.has(dedupKey)) return\n seenInTree.add(dedupKey)\n walkedConcepts.add(id)\n if (el.abstract) {\n // Hypercube scaffolding ([Table]/[Line Items]) is not a heading — hide its\n // row and keep its children at the current depth so the tree stays flat.\n // A root abstract that only restates the section's own title is the same\n // kind of non-heading: it would print \"Income Statement\" immediately\n // under the heading \"Income Statement\". rs-gaap gives the income\n // statement such a root and the other three primaries none, so hiding it\n // is also what makes the four read alike.\n const scaffold =\n isStructuralScaffold(el) || (depth === 0 && restatesTitle(arc.label ?? el.label, title))\n if (config.showAbstracts && !scaffold) {\n rows.push({\n key: id,\n element: el,\n depth,\n header: true,\n isSubtotal: false,\n members: [],\n cells: [],\n label: arc.label ?? undefined,\n })\n }\n const childDepth = scaffold ? depth : depth + 1\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, childDepth)\n } else {\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n emitConcept(id, depth, arc)\n }\n }\n for (const root of tree.roots) {\n walk({ child: root, label: null, binding: null, negated: false }, 0)\n }\n // Concepts with facts but absent from the presentation network — append after.\n for (const id of factfulConcepts) {\n if (walkedConcepts.has(id) || elementOf(model, id).abstract) continue\n emitConcept(id, 0, null)\n }\n\n return {\n ib,\n blockType: ib.blockType,\n title,\n structureName: ib.structureId ? null : (structure?.structureName ?? ib.label ?? null),\n definition: structure?.definition ?? null,\n kind: structure?.kind ?? null,\n slicers: buildSlicers(model, config, dicedSlicers),\n columnHeaders,\n columns,\n rows,\n scale: resolveScale(tableFacts, model, config.scale),\n config,\n }\n}\n\n/** Section metadata (id + display title, full definition, kind) in canonical order. */\nexport function reportSections(\n model: NormalizedReport\n): Array<{ id: string; title: string; definition: string | null; kind: SectionKind | null }> {\n return buildPivots(model).map((p) => ({\n id: p.ib.id,\n title: p.title,\n definition: p.definition,\n kind: p.kind,\n }))\n}\n\n/**\n * Pivot every section of a report, in canonical block order. `configFor` may\n * transform each section's default config before it is built — e.g. to apply a\n * \"dimensions as rows / columns\" toggle across the whole report.\n */\nexport function buildPivots(\n model: NormalizedReport,\n configFor?: (ib: InformationBlock, defaultConfig: PivotConfig) => PivotConfig\n): PivotTable[] {\n const order = (ib: InformationBlock): number => {\n if (ib.structureId) {\n const s = model.structures.find((x) => x.id === ib.structureId)\n if (s?.order !== undefined) return s.order\n }\n return BLOCK_ORDER[ib.blockType] ?? 99\n }\n return [...model.informationBlocks]\n .sort((a, b) => order(a) - order(b) || a.blockType.localeCompare(b.blockType))\n .map((ib) =>\n configFor\n ? buildPivot(model, ib, configFor(ib, defaultPivotConfig(model, ib)))\n : buildPivot(model, ib)\n )\n}\n","/**\n * Renders an *externalized* text-block fact — a large XBRL narrative/table\n * disclosure whose HTML body the platform offloaded to the public CDN, leaving\n * the fact's value as a `…/fact_<hash>.html` (or `.txt`) URL.\n *\n * The CDN serves these with `Access-Control-Allow-Origin: *`, so the browser can\n * fetch the body directly (no proxy). HTML bodies are self-contained fragments\n * (inline styles, no scripts) rendered inside a **sandboxed** iframe: `srcdoc`\n * plus `sandbox=\"allow-same-origin\"` (note: no `allow-scripts`) means any script\n * in the payload is inert — XSS-safe — while the same-origin document stays\n * measurable so the frame auto-sizes to its content. Plain-text bodies render in\n * a `<pre>`.\n *\n * The frame sits on a *document surface*: the payload is authored black-on-white\n * and the host's `--rs-*` tokens cannot reach inside an iframe, so a dark host\n * shows it as a sheet of paper rather than recoloring it. `--rs-document-bg`,\n * `--rs-document-padding` and `--rs-document-radius` style that surface; all\n * three default to nothing, so a light host renders the frame flush as before.\n */\nimport { marked } from 'marked'\nimport type { CSSProperties } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nexport interface ExternalTextBlockProps {\n url: string\n}\n\ntype LoadState = 'loading' | 'ready' | 'error'\n\nconst styles: Record<string, CSSProperties> = {\n status: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n fontSize: '0.85rem',\n color: 'var(--rs-muted, #6b7280)',\n padding: '0.75rem 0',\n },\n link: { color: 'var(--rs-primary-700, #1d4ed8)' },\n document: {\n background: 'var(--rs-document-bg, transparent)',\n padding: 'var(--rs-document-padding, 0)',\n borderRadius: 'var(--rs-document-radius, 0)',\n },\n frame: { width: '100%', border: 'none', display: 'block' },\n pre: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.85rem',\n color: 'var(--rs-text, #111827)',\n margin: 0,\n },\n}\n\n// Markdown-derived HTML carries bare tags (no inline styles the way SEC\n// payloads do), so the host document supplies the typography: heading\n// scale/spacing, bordered tables, list indentation, code/blockquote\n// treatment. Applied only to converted-markdown payloads — SEC HTML keeps\n// the minimal host so its own inline styles stay authoritative.\nconst MARKDOWN_CSS = `\n h1, h2, h3, h4 { line-height: 1.25; margin: 1.1em 0 0.45em; font-weight: 600; }\n h1 { font-size: 1.35em; margin-top: 0.2em; }\n h2 { font-size: 1.15em; }\n h3 { font-size: 1.05em; }\n p { margin: 0.55em 0; }\n ul, ol { margin: 0.55em 0; padding-left: 1.6em; }\n li { margin: 0.25em 0; }\n table { border-collapse: collapse; margin: 0.7em 0; }\n th, td { border: 1px solid #d1d5db; padding: 0.35em 0.6em; text-align: left; }\n th { background: #f3f4f6; font-weight: 600; }\n code { font-family: ui-monospace, monospace; font-size: 0.92em;\n background: #f3f4f6; padding: 0.1em 0.3em; border-radius: 3px; }\n blockquote { margin: 0.7em 0; padding: 0.1em 1em; border-left: 3px solid #d1d5db;\n color: #4b5563; }\n hr { border: none; border-top: 1px solid #e5e7eb; margin: 1em 0; }`\n\n// A minimal host document: neutral typography, responsive media/tables, links\n// open in a new tab. The payload's own inline styles ride on top.\nfunction wrapHtml(body: string, extraCss = ''): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"><base target=\"_blank\"><style>\n :root { color-scheme: light; }\n body { margin: 0; color: #111827;\n font-family: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px; line-height: 1.45; }\n img, svg { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n a { color: #1d4ed8; }${extraCss}\n </style></head><body>${body}</body></html>`\n}\n\n/**\n * An *inline* text-block fact — the disclosure payload lives in the holon\n * itself (`rs:stringValue`), not an external CDN URL — rendered in the same\n * sandboxed frame as the externalized case. Used for holon-authored / offline\n * reports.\n *\n * `contentType` (rs:contentType) selects the payload interpretation:\n * `text/markdown` (RoboLedger-authored narratives) is converted to HTML with\n * marked before framing; anything else — including the SEC pipeline's\n * undeclared HTML text blocks — passes through as HTML.\n */\nexport function InlineTextBlock({\n html,\n contentType,\n}: {\n html: string\n contentType?: string | null\n}) {\n const md = isMarkdown(contentType)\n const body = md ? (marked.parse(html, { async: false }) as string) : html\n return <SandboxedHtml html={body} extraCss={md ? MARKDOWN_CSS : ''} />\n}\n\nfunction isMarkdown(contentType?: string | null): boolean {\n return (contentType ?? '').split(';')[0].trim().toLowerCase() === 'text/markdown'\n}\n\nfunction SandboxedHtml({ html, extraCss = '' }: { html: string; extraCss?: string }) {\n const ref = useRef<HTMLIFrameElement>(null)\n\n // Size the frame to its content. Content is script-free and static, so a\n // measure on load (plus one after fonts/images settle) is enough.\n const fit = () => {\n const frame = ref.current\n const doc = frame?.contentWindow?.document\n if (!frame || !doc) return\n try {\n frame.style.height = `${doc.documentElement.scrollHeight}px`\n } catch {\n // Same-origin read blocked (shouldn't happen with allow-same-origin) — leave default.\n }\n }\n\n return (\n <div style={styles.document}>\n <iframe\n ref={ref}\n title=\"Disclosure\"\n sandbox=\"allow-same-origin\"\n srcDoc={wrapHtml(html, extraCss)}\n style={styles.frame}\n onLoad={() => {\n fit()\n // Re-measure shortly after in case late layout (images/fonts) grew it.\n setTimeout(fit, 250)\n }}\n />\n </div>\n )\n}\n\nexport function ExternalTextBlock({ url }: ExternalTextBlockProps) {\n const [state, setState] = useState<LoadState>('loading')\n const [body, setBody] = useState('')\n const isHtml = /\\.html$/i.test(url)\n\n useEffect(() => {\n let cancelled = false\n setState('loading')\n fetch(url)\n .then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.text()\n })\n .then((text) => {\n if (cancelled) return\n setBody(text)\n setState('ready')\n })\n .catch(() => {\n if (!cancelled) setState('error')\n })\n return () => {\n cancelled = true\n }\n }, [url])\n\n if (state === 'loading') return <div style={styles.status}>Loading disclosure…</div>\n if (state === 'error') {\n return (\n <div style={styles.status}>\n Could not load this disclosure.{' '}\n <a style={styles.link} href={url} target=\"_blank\" rel=\"noreferrer\">\n Open it directly ↗\n </a>\n </div>\n )\n }\n if (!isHtml) return <pre style={styles.pre}>{body}</pre>\n return <SandboxedHtml html={body} />\n}\n","/**\n * Click-a-fact inspection: the selected cell's aspects — concept, value, period,\n * entity, dimensions, unit, balance, rounding — plus, when the element is a\n * calculation subtotal, the rule it foots (computed live in the browser).\n *\n * Crucially the period, unit and dimensions are read from the *cell's own fact*,\n * not from the column — so a value never borrows a neighbouring period's metadata\n * (the bug the pivot rewrite set out to kill).\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport {\n currencySymbolFor,\n formatPeriod,\n formatValue,\n humanizeDuration,\n numericKindOf,\n} from '../format'\nimport type { NormalizedReport, PivotRow, PivotTable, UnitInfo } from '../model'\nimport { footCheck } from '../project'\n\nexport interface FactInspectorProps {\n report: NormalizedReport\n table: PivotTable\n row: PivotRow\n columnIndex: number\n onClose?: () => void\n}\n\nconst styles: Record<string, CSSProperties> = {\n panel: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '12px',\n padding: '1rem 1.25rem',\n background: 'var(--rs-panel-bg, #ffffff)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.08)',\n },\n header: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: '1rem',\n marginBottom: '0.75rem',\n },\n headerText: { minWidth: 0 },\n label: { fontSize: '1rem', fontWeight: 700, margin: 0, overflowWrap: 'anywhere' },\n qname: {\n display: 'block',\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.8rem',\n color: 'var(--rs-primary-700, #1d4ed8)',\n overflowWrap: 'anywhere',\n },\n close: {\n border: 'none',\n background: 'transparent',\n fontSize: '1.25rem',\n lineHeight: 1,\n cursor: 'pointer',\n color: 'var(--rs-muted, #6b7280)',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: '0.35rem 1rem',\n fontSize: '0.85rem',\n margin: '0.5rem 0',\n },\n key: { color: 'var(--rs-muted, #6b7280)' },\n mono: { fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)' },\n dims: { display: 'grid', gap: '0.15rem' },\n footing: {\n marginTop: '0.85rem',\n paddingTop: '0.75rem',\n borderTop: '1px solid var(--rs-border, #e5e7eb)',\n },\n footTitle: {\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--rs-muted, #6b7280)',\n marginBottom: '0.4rem',\n },\n equation: {\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.85rem',\n lineHeight: 1.6,\n },\n}\n\nfunction Field({ k, children }: { k: string; children: ReactNode }) {\n return (\n <>\n <span style={styles.key}>{k}</span>\n <span>{children}</span>\n </>\n )\n}\n\nfunction symbolFor(unit: UnitInfo | undefined): string {\n return unit?.symbol ?? currencySymbolFor(unit?.measure) ?? '$'\n}\n\nexport function FactInspector({ report, table, row, columnIndex, onClose }: FactInspectorProps) {\n const { element } = row\n const cell = row.cells[columnIndex]\n const fact = cell?.fact ?? null\n const period = fact ? report.periods[fact.period] : null\n const unit = fact?.unit ? report.units[fact.unit] : undefined\n const kind = numericKindOf(element)\n const dims = fact?.dimensions ?? row.members\n const foot = footCheck(report, table, element.id, columnIndex)\n const sym = symbolFor(unit)\n\n return (\n <div style={styles.panel}>\n <div style={styles.header}>\n <div style={styles.headerText}>\n <p style={styles.label}>{element.label}</p>\n <span style={styles.qname}>{element.qname}</span>\n </div>\n {onClose ? (\n <button style={styles.close} onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n ) : null}\n </div>\n\n <div style={styles.grid}>\n <Field k=\"Value\">\n {cell?.value === null && cell?.textValue ? (\n <span>{humanizeDuration(cell.textValue) ?? cell.textValue}</span>\n ) : (\n <span style={styles.mono}>\n {formatValue(cell?.value ?? null, { numericKind: kind, symbol: sym })}\n </span>\n )}\n </Field>\n {period ? (\n <Field k=\"Period\">\n {formatPeriod(period)} <span style={styles.key}>({period.type})</span>\n </Field>\n ) : null}\n {report.entity ? <Field k=\"Entity\">{report.entity.name}</Field> : null}\n {dims.length ? (\n <Field k=\"Dimensions\">\n <span style={styles.dims}>\n {dims.map((d) => (\n <span key={d.axis}>\n <span style={styles.key}>{d.axisLabel}:</span>{' '}\n {d.explicit ? d.memberLabel : (d.typedValue ?? d.memberLabel)}\n </span>\n ))}\n </span>\n </Field>\n ) : null}\n <Field k=\"Unit\">{unit ? unit.label : '—'}</Field>\n {element.balance ? <Field k=\"Balance\">{element.balance}</Field> : null}\n {fact?.decimals ? <Field k=\"Decimals\">{fact.decimals}</Field> : null}\n </div>\n\n {foot ? (\n <div style={styles.footing}>\n <div style={styles.footTitle}>Calculation {foot.ok ? '✓ foots' : '⚠ does not foot'}</div>\n <div style={styles.equation}>\n {foot.terms.map((term, i) => {\n const op = i === 0 ? (term.weight < 0 ? '−' : '') : term.weight < 0 ? ' − ' : ' + '\n return (\n <span key={term.element.id} title={term.element.qname}>\n {op}\n {formatValue(term.value === null ? 0 : Math.abs(term.value), {\n numericKind: 'monetary',\n symbol: sym,\n })}\n </span>\n )\n })}\n {' = '}\n <strong>\n {formatValue(foot.expected, { numericKind: 'monetary', symbol: sym })}\n </strong>{' '}\n {foot.ok ? (\n <span style={{ color: 'var(--rs-success, #00875a)' }}>✓</span>\n ) : (\n <span style={{ color: 'var(--rs-error, #dc2626)' }}>\n ✗ (reported {formatValue(foot.actual, { numericKind: 'monetary', symbol: sym })})\n </span>\n )}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * Renders one `PivotTable` — a pivoted section of a report.\n *\n * The default view is the familiar statement layout (concept hierarchy on rows,\n * periods on columns), but because the engine is a general pivot, this component\n * also handles dimensions on columns (member sub-headers nested under each\n * period, à la Pesseract), single-member dimensions as slicer bars, abstract\n * `[Roll Up]` header rows, and unit- + scale-aware value formatting.\n *\n * Framework-agnostic plain React — no `next/*`, no CSS framework. Styled with\n * inline styles reading CSS custom properties (`--rs-*`) so a host app can theme\n * it, with sensible RoboSystems defaults baked in as fallbacks.\n */\nimport type { CSSProperties } from 'react'\nimport { isExternalFactUrl } from '../constants'\nimport { currencySymbolFor, formatValue, humanizeDuration, numericKindOf } from '../format'\nimport type { PivotRow, PivotTable, UnitInfo } from '../model'\nimport { ExternalTextBlock, InlineTextBlock } from './ExternalTextBlock'\n\nexport interface StatementTableProps {\n table: PivotTable\n /** The report's units, to resolve each cell's currency symbol. */\n units?: Record<string, UnitInfo>\n /** Called when a value cell is clicked — drives fact inspection. */\n onCellClick?: (row: PivotRow, columnIndex: number) => void\n /** The currently-selected cell, highlighted. */\n selected?: { rowKey: string; columnIndex: number } | null\n /** Current dimension placement — set with `onDimensionPlacementChange` to show the toggle. */\n dimensionPlacement?: 'rows' | 'columns'\n /** Setter for the dimension placement; when provided (and the section is dimensional), a rows/columns toggle renders below the slicers. */\n onDimensionPlacementChange?: (placement: 'rows' | 'columns') => void\n}\n\nconst styles: Record<string, CSSProperties> = {\n wrap: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n marginBottom: '2.5rem',\n },\n heading: { textAlign: 'center', marginBottom: '0.75rem' },\n title: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n fontSize: '1.15rem',\n fontWeight: 700,\n letterSpacing: '0.02em',\n margin: 0,\n },\n subtitle: { fontSize: '0.85rem', color: 'var(--rs-muted, #6b7280)', marginTop: '0.25rem' },\n scaleCaption: {\n fontSize: '0.8rem',\n fontStyle: 'italic',\n color: 'var(--rs-muted, #6b7280)',\n marginTop: '0.25rem',\n },\n slicers: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.5rem',\n margin: '0 0 0.75rem',\n },\n slicer: {\n display: 'inline-flex',\n gap: '0.4rem',\n alignItems: 'baseline',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '6px',\n padding: '0.2rem 0.55rem',\n fontSize: '0.78rem',\n background: 'var(--rs-slicer-bg, #f9fafb)',\n },\n slicerLabel: {\n color: 'var(--rs-muted, #6b7280)',\n textTransform: 'uppercase',\n letterSpacing: '0.03em',\n fontSize: '0.68rem',\n },\n slicerValue: { fontWeight: 600 },\n controls: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n margin: '0 0 0.9rem',\n fontSize: '0.8rem',\n },\n controlLabel: { color: 'var(--rs-muted, #6b7280)' },\n segmented: {\n display: 'inline-flex',\n border: '1px solid var(--rs-border, #e5e7eb)',\n borderRadius: '7px',\n overflow: 'hidden',\n },\n segment: {\n border: 'none',\n padding: '0.25rem 0.7rem',\n fontSize: '0.78rem',\n cursor: 'pointer',\n background: 'transparent',\n color: 'var(--rs-text, #111827)',\n },\n segmentActive: {\n background: 'var(--rs-primary-600, #2563eb)',\n color: '#ffffff',\n fontWeight: 600,\n },\n scroll: { overflowX: 'auto' },\n table: { width: '100%', borderCollapse: 'collapse', fontSize: '0.875rem' },\n th: {\n borderBottom: '2px solid var(--rs-border-strong, #9ca3af)',\n padding: '0.4rem 0.75rem',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.8rem',\n },\n thGroup: {\n borderBottom: '1px solid var(--rs-border, #e5e7eb)',\n padding: '0.3rem 0.75rem',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.8rem',\n textAlign: 'center',\n },\n // A floor on the concept column so a wide table (many member/period columns)\n // scrolls horizontally rather than squeezing labels down to vertical text.\n thConcept: { textAlign: 'left', verticalAlign: 'bottom', minWidth: '18rem' },\n thNum: { textAlign: 'right', whiteSpace: 'nowrap' },\n labelCell: { padding: '0.3rem 0.75rem', whiteSpace: 'normal', minWidth: '18rem' },\n headerRowLabel: {\n padding: '0.4rem 0.75rem',\n fontWeight: 700,\n fontSize: '0.8rem',\n textTransform: 'uppercase',\n letterSpacing: '0.02em',\n color: 'var(--rs-muted, #6b7280)',\n },\n numCell: {\n padding: '0.3rem 0.75rem',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n fontFamily: 'var(--rs-font-mono, ui-monospace, SFMono-Regular, monospace)',\n fontVariantNumeric: 'tabular-nums',\n },\n textBlockCell: { padding: '0.75rem', borderTop: '1px solid var(--rs-border, #e5e7eb)' },\n textBlockLabel: {\n fontSize: '0.7rem',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n marginBottom: '0.5rem',\n },\n}\n\n/** The currency symbol for a cell's fact unit — never a hard-coded `$` for non-USD. */\nfunction cellSymbol(unit: UnitInfo | undefined): string {\n return unit?.symbol ?? currencySymbolFor(unit?.measure) ?? '$'\n}\n\nexport function StatementTable({\n table,\n units,\n onCellClick,\n selected = null,\n dimensionPlacement,\n onDimensionPlacementChange,\n}: StatementTableProps) {\n const { columns, rows, columnHeaders, scale } = table\n const totalCols = columns.length\n const dimensional =\n table.config.rows.some((k) => k.startsWith('dim:')) ||\n table.config.columns.some((k) => k.startsWith('dim:'))\n const showToggle = onDimensionPlacementChange != null && dimensional\n\n return (\n <section style={styles.wrap}>\n <header style={styles.heading}>\n <h3 style={styles.title}>{table.title}</h3>\n {table.structureName ? <div style={styles.subtitle}>{table.structureName}</div> : null}\n {scale.caption ? <div style={styles.scaleCaption}>{scale.caption}</div> : null}\n </header>\n\n {table.slicers.length ? (\n <div style={styles.slicers}>\n {table.slicers.map((s) => (\n <div key={s.aspect} style={styles.slicer}>\n <span style={styles.slicerLabel}>{s.label}</span>\n <span style={styles.slicerValue}>{s.valueLabel}</span>\n </div>\n ))}\n </div>\n ) : null}\n\n {showToggle ? (\n <div style={styles.controls}>\n <span style={styles.controlLabel}>Dimensions</span>\n <div style={styles.segmented} role=\"group\" aria-label=\"Dimension placement\">\n {(['rows', 'columns'] as const).map((placement) => (\n <button\n key={placement}\n type=\"button\"\n onClick={() => onDimensionPlacementChange?.(placement)}\n aria-pressed={dimensionPlacement === placement}\n style={{\n ...styles.segment,\n ...(dimensionPlacement === placement ? styles.segmentActive : {}),\n }}\n >\n {placement === 'rows' ? 'As rows' : 'As columns'}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n\n <div style={styles.scroll}>\n <table style={styles.table}>\n <thead>\n {columnHeaders.map((level, levelIndex) => {\n const isLast = levelIndex === columnHeaders.length - 1\n let leaf = 0\n return (\n <tr key={levelIndex}>\n {levelIndex === 0 ? (\n <th\n rowSpan={columnHeaders.length}\n style={{ ...styles.th, ...styles.thConcept }}\n aria-label=\"Concept\"\n />\n ) : null}\n {level.map((h, i) => {\n const key = `${levelIndex}-${i}-${leaf}`\n leaf += h.span\n return (\n <th\n key={key}\n colSpan={h.span}\n style={isLast ? { ...styles.th, ...styles.thNum } : styles.thGroup}\n >\n {h.label}\n </th>\n )\n })}\n </tr>\n )\n })}\n </thead>\n <tbody>\n {rows.map((row) => {\n // An abstract concept — a section header with no values.\n if (row.header) {\n return (\n <tr key={row.key}>\n <td\n colSpan={totalCols + 1}\n style={{\n ...styles.headerRowLabel,\n paddingLeft: `${row.depth * 20 + 12}px`,\n }}\n title={row.element.qname}\n >\n {row.label ?? row.element.label}\n </td>\n </tr>\n )\n }\n\n // An externalized text-block / policy disclosure: render its fetched\n // HTML full-width instead of a URL squeezed into a value cell.\n const textBlock = row.cells.find(\n (c) => c.value === null && isExternalFactUrl(c.textValue)\n )\n if (textBlock?.textValue) {\n return (\n <tr key={row.key}>\n <td colSpan={totalCols + 1} style={styles.textBlockCell}>\n <div style={styles.textBlockLabel} title={row.element.qname}>\n {rowLabel(row)}\n </div>\n <ExternalTextBlock url={textBlock.textValue} />\n </td>\n </tr>\n )\n }\n\n // An *inline* text-block disclosure: the holon carries the HTML in\n // the fact (rs:stringValue), not a CDN URL. The element's value\n // domain (rs:itemType = textBlock) marks it; render full-width in\n // the same sandboxed frame.\n if (row.element.itemType === 'textBlock') {\n const inline = row.cells.find(\n (c) =>\n c.value === null &&\n c.textValue != null &&\n c.textValue !== '' &&\n !isExternalFactUrl(c.textValue)\n )\n if (inline?.textValue) {\n return (\n <tr key={row.key}>\n <td colSpan={totalCols + 1} style={styles.textBlockCell}>\n <div style={styles.textBlockLabel} title={row.element.qname}>\n {rowLabel(row)}\n </div>\n <InlineTextBlock\n html={inline.textValue}\n contentType={inline.fact?.contentType}\n />\n </td>\n </tr>\n )\n }\n }\n\n const kind = numericKindOf(row.element)\n const isGrandTotal = row.isSubtotal && row.depth === 0\n const allZeroOrNull = row.cells.every((c) => c.value === null || c.value === 0)\n const rowStyle: CSSProperties = {\n backgroundColor: row.isSubtotal ? 'var(--rs-subtotal-bg, #f9fafb)' : undefined,\n }\n const labelStyle: CSSProperties = {\n ...styles.labelCell,\n paddingLeft: `${row.depth * 20 + 12}px`,\n fontWeight: row.isSubtotal ? 600 : 400,\n color: !row.isSubtotal && allZeroOrNull ? 'var(--rs-muted, #9ca3af)' : undefined,\n borderBottom: isGrandTotal ? '3px double var(--rs-text, #111827)' : undefined,\n }\n return (\n <tr key={row.key} style={rowStyle}>\n <td style={labelStyle} title={row.element.qname}>\n {rowLabel(row)}\n </td>\n {row.cells.map((cell, i) => {\n const isSelected =\n selected !== null && selected.rowKey === row.key && selected.columnIndex === i\n const clickable = onCellClick && cell.fact !== null\n const isText =\n cell.value === null && cell.textValue != null && cell.textValue !== ''\n // An ISO-8601 duration term (P10Y) reads as a value, not prose:\n // humanize it and keep it right-aligned with the numbers.\n const duration = isText ? humanizeDuration(cell.textValue) : null\n const isProse = isText && !duration\n const unit = cell.fact?.unit && units ? units[cell.fact.unit] : undefined\n const numStyle: CSSProperties = {\n ...styles.numCell,\n fontWeight: row.isSubtotal ? 600 : 400,\n borderBottom: isGrandTotal ? '3px double var(--rs-text, #111827)' : undefined,\n cursor: clickable ? 'pointer' : 'default',\n backgroundColor: isSelected ? 'var(--rs-selected-bg, #dbeafe)' : undefined,\n color:\n !isText && !row.isSubtotal && (cell.value === null || cell.value === 0)\n ? 'var(--rs-muted, #9ca3af)'\n : undefined,\n ...(isProse\n ? {\n textAlign: 'left',\n whiteSpace: 'normal',\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n }\n : {}),\n }\n // No fact for this coordinate → blank; a fact that is null or\n // a genuine $0 (Commitments & Contingencies, zero balance) →\n // an em-dash; anything else → the formatted value. A negated\n // preferred label flips the *displayed* sign only — the\n // as-filed table shows `Less short-term portion (999)` for a\n // fact tagged +999; the fact itself stays untouched.\n const shown = row.negated && cell.value !== null ? -cell.value : cell.value\n const display = isText\n ? (duration ?? cell.textValue)\n : cell.fact === null\n ? ''\n : shown === 0\n ? '—'\n : formatValue(shown, {\n numericKind: kind,\n symbol: cellSymbol(unit),\n scaleFactor: scale.factor,\n })\n return (\n <td\n key={columns[i].key}\n style={numStyle}\n onClick={clickable ? () => onCellClick?.(row, i) : undefined}\n >\n {display}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\n/**\n * A row's label. A dimensional breakdown row (members on rows) shows just its\n * member(s) — it sits indented under its concept's total row, which supplies the\n * concept name — so the reader gets `Stockholders' Equity` / `· Common Stock`\n * rather than the concept repeated on every line.\n */\nfunction rowLabel(row: PivotRow): string {\n if (!row.members.length) return row.label ?? row.element.label\n return row.members.map((m) => m.memberLabel).join(' · ')\n}\n","/**\n * Top-level renderer: a `NormalizedReport` → the entity header, every statement,\n * and an inline fact inspector wired to cell selection. This is the one\n * component a consuming app typically renders.\n */\nimport type { CSSProperties } from 'react'\nimport { useMemo, useState } from 'react'\nimport type { NormalizedReport, PivotRow } from '../model'\nimport { buildPivots, pivotDimensionsOn } from '../pivot'\nimport { FactInspector } from './FactInspector'\nimport { StatementTable } from './StatementTable'\n\nexport interface ReportViewProps {\n report: NormalizedReport\n /** Disable the click-to-inspect fact panel (render-only). */\n inspect?: boolean\n /** Initial placement for dimension breakdowns (default `rows`). */\n dimensionAxis?: 'rows' | 'columns'\n}\n\ninterface Selection {\n statementIndex: number\n rowKey: string\n columnIndex: number\n}\n\nconst styles: Record<string, CSSProperties> = {\n layout: {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: '1.5rem',\n alignItems: 'start',\n },\n layoutWithPanel: {\n gridTemplateColumns: 'minmax(0, 1fr) 340px',\n },\n entity: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n textAlign: 'center',\n marginBottom: '1.5rem',\n },\n entityName: {\n fontSize: '1.5rem',\n fontWeight: 700,\n margin: 0,\n color: 'var(--rs-text, #111827)',\n },\n panel: { position: 'sticky', top: '1rem' },\n}\n\nexport function ReportView({ report, inspect = true, dimensionAxis = 'rows' }: ReportViewProps) {\n const [dimAxis, setDimAxis] = useState<'rows' | 'columns'>(dimensionAxis)\n const [selection, setSelection] = useState<Selection | null>(null)\n\n const statements = useMemo(\n () => buildPivots(report, (_ib, cfg) => pivotDimensionsOn(cfg, dimAxis)),\n [report, dimAxis]\n )\n\n const selected = selection !== null ? statements[selection.statementIndex] : null\n const selectedRow = selected?.rows.find((r) => r.key === selection?.rowKey) ?? null\n\n const setPlacement = (placement: 'rows' | 'columns'): void => {\n setSelection(null) // row/column keys differ between placements\n setDimAxis(placement)\n }\n\n return (\n <div>\n {report.entity ? (\n <header style={styles.entity}>\n <h2 style={styles.entityName}>{report.entity.name}</h2>\n </header>\n ) : null}\n\n <div\n style={{\n ...styles.layout,\n ...(inspect && selectedRow ? styles.layoutWithPanel : {}),\n }}\n >\n <div>\n {statements.map((statement, statementIndex) => (\n <StatementTable\n key={statement.ib.id}\n table={statement}\n units={report.units}\n dimensionPlacement={dimAxis}\n onDimensionPlacementChange={setPlacement}\n selected={\n selection && selection.statementIndex === statementIndex\n ? { rowKey: selection.rowKey, columnIndex: selection.columnIndex }\n : null\n }\n onCellClick={\n inspect\n ? (row: PivotRow, columnIndex: number) =>\n setSelection({ statementIndex, rowKey: row.key, columnIndex })\n : undefined\n }\n />\n ))}\n </div>\n\n {inspect && selected && selectedRow && selection ? (\n <div style={styles.panel}>\n <FactInspector\n report={report}\n table={selected}\n row={selectedRow}\n columnIndex={selection.columnIndex}\n onClose={() => setSelection(null)}\n />\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","/**\n * A dependency-free SVG line chart for a metric time series — one chart per\n * chart-projection panel (a format family). Renders the series in\n * `joinChartSeries` output over the shared period x-axis.\n *\n * Framework-agnostic plain React + SVG — no chart library, no `next/*`, no CSS\n * framework. Marks follow the dataviz spec: 2px round-join lines, ≥8px end\n * markers ringed in the surface color, hairline recessive gridlines, a legend\n * whenever two or more series share the plot (identity never by color alone),\n * selective non-colliding end labels, and a hover/focus crosshair + tooltip.\n * Series colors read `--rs-chart-series-N` tokens (validated eight-hue order)\n * with light fallbacks; a host themes dark mode and its brand by setting those\n * tokens, exactly like the statement components' `--rs-*` pattern.\n *\n * The y-axis is data-driven (padded to the series range, not forced to zero) —\n * correct for a single-family line panel where the story is the shape of\n * change; the value scale is shared across the panel's series because they\n * share a format family.\n */\nimport type { CSSProperties, KeyboardEvent, PointerEvent } from 'react'\nimport { useId, useMemo, useRef, useState } from 'react'\nimport { formatMetricCompact, formatMetricValue } from '../chart/format'\nimport { seriesColor } from '../chart/palette'\nimport type { ChartSeriesData, MetricItemType } from '../chart/types'\n\nexport interface TimeSeriesChartProps {\n /** Series to plot — the `joinChartSeries` output for one panel. */\n series: ChartSeriesData[]\n /** Format family for axis + value formatting; defaults to the first series'. */\n itemType?: MetricItemType | string | null\n /** Optional panel heading (the format-family label). */\n title?: string\n /** Internal SVG coordinate width — the plot scales to its container. */\n width?: number\n /** Internal SVG coordinate height. */\n height?: number\n}\n\nconst MARGIN = { top: 16, right: 104, bottom: 30, left: 60 }\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n/** `2026-06-30` → `Jun '26` for x-axis ticks; raw string if unparseable. */\nfunction shortMonth(iso: string): string {\n const m = /^(\\d{4})-(\\d{2})/.exec(iso)\n if (!m) return iso\n return `${MONTHS[Number(m[2]) - 1] ?? m[2]} '${m[1].slice(2)}`\n}\n\n/** A small set of \"nice\" tick values spanning [min, max]. */\nfunction niceTicks(min: number, max: number, count = 4): number[] {\n if (!(max > min)) return [min]\n const span = max - min\n const step0 = span / count\n const mag = Math.pow(10, Math.floor(Math.log10(step0)))\n const norm = step0 / mag\n const step = (norm >= 5 ? 10 : norm >= 2 ? 5 : norm >= 1 ? 2 : 1) * mag\n const start = Math.ceil(min / step) * step\n const ticks: number[] = []\n for (let v = start; v <= max + step * 1e-6; v += step) ticks.push(Number(v.toFixed(10)))\n return ticks\n}\n\nconst styles: Record<string, CSSProperties> = {\n wrap: {\n fontFamily: 'var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)',\n color: 'var(--rs-text, #111827)',\n },\n title: {\n fontFamily: 'var(--rs-font-heading, var(--rs-font-sans, sans-serif))',\n fontSize: '0.9rem',\n fontWeight: 600,\n margin: '0 0 0.5rem',\n },\n legend: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.25rem 1rem',\n marginBottom: '0.5rem',\n fontSize: '0.78rem',\n color: 'var(--rs-muted, #6b7280)',\n },\n legendItem: { display: 'inline-flex', alignItems: 'center', gap: '0.4rem' },\n legendKey: { display: 'inline-block', width: 16, height: 2, borderRadius: 1 },\n empty: {\n padding: '2rem',\n textAlign: 'center',\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.85rem',\n },\n}\n\nexport function TimeSeriesChart({\n series,\n itemType,\n title,\n width = 720,\n height = 280,\n}: TimeSeriesChartProps): React.JSX.Element {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const [active, setActive] = useState<number | null>(null)\n const clipId = useId()\n\n const family = itemType ?? series[0]?.itemType ?? null\n const periodCount = series[0]?.points.length ?? 0\n\n const model = useMemo(() => {\n const values: number[] = []\n for (const s of series)\n for (const p of s.points) if (p.y !== null && !Number.isNaN(p.y)) values.push(p.y)\n if (!values.length) return null\n let min = Math.min(...values)\n let max = Math.max(...values)\n if (min === max) {\n const pad = Math.abs(min) * 0.1 || 1\n min -= pad\n max += pad\n } else {\n const pad = (max - min) * 0.08\n min -= pad\n max += pad\n }\n return { min, max }\n }, [series])\n\n if (!model || periodCount === 0) {\n return (\n <div style={styles.wrap}>\n {title && <p style={styles.title}>{title}</p>}\n <p style={styles.empty}>No data to plot for this period range.</p>\n </div>\n )\n }\n\n const innerW = width - MARGIN.left - MARGIN.right\n const innerH = height - MARGIN.top - MARGIN.bottom\n const { min, max } = model\n\n const xAt = (i: number): number =>\n periodCount === 1 ? MARGIN.left + innerW / 2 : MARGIN.left + (i / (periodCount - 1)) * innerW\n const yAt = (v: number): number => MARGIN.top + innerH - ((v - min) / (max - min)) * innerH\n\n const yTicks = niceTicks(min, max, 4)\n // Thin the x labels to ~6 so months don't collide.\n const xEvery = Math.max(1, Math.ceil(periodCount / 6))\n const periods = series[0].points\n\n // Direct end labels only when few enough series and they don't collide.\n const showEndLabels = series.length <= 4\n const placedLabelY: number[] = []\n\n const showLegend = series.length >= 2\n const ariaLabel =\n `${title ? `${title} — ` : ''}line chart of ${series.length} ` +\n `metric${series.length === 1 ? '' : 's'} over ${periodCount} periods`\n\n function handleMove(e: PointerEvent<SVGSVGElement>): void {\n const svg = svgRef.current\n const ctm = svg?.getScreenCTM?.()\n if (!svg || !ctm) return\n const pt = new DOMPoint(e.clientX, e.clientY).matrixTransform(ctm.inverse())\n if (periodCount === 1) {\n setActive(0)\n return\n }\n const frac = (pt.x - MARGIN.left) / innerW\n const idx = Math.round(frac * (periodCount - 1))\n setActive(Math.max(0, Math.min(periodCount - 1, idx)))\n }\n\n function handleKey(e: KeyboardEvent<SVGSVGElement>): void {\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n setActive((a) => Math.min(periodCount - 1, (a ?? -1) + 1))\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n setActive((a) => Math.max(0, (a ?? periodCount) - 1))\n } else if (e.key === 'Escape') {\n setActive(null)\n }\n }\n\n return (\n <div style={styles.wrap}>\n {title && <p style={styles.title}>{title}</p>}\n {showLegend && (\n <div style={styles.legend}>\n {series.map((s, i) => (\n <span key={s.key} style={styles.legendItem}>\n <span style={{ ...styles.legendKey, background: seriesColor(i) }} />\n {s.label}\n </span>\n ))}\n </div>\n )}\n <svg\n ref={svgRef}\n viewBox={`0 0 ${width} ${height}`}\n width=\"100%\"\n role=\"img\"\n aria-label={ariaLabel}\n tabIndex={0}\n style={{ display: 'block', outline: 'none', touchAction: 'none' }}\n onPointerMove={handleMove}\n onPointerLeave={() => setActive(null)}\n onKeyDown={handleKey}\n >\n <defs>\n <clipPath id={clipId}>\n <rect x={MARGIN.left} y={MARGIN.top} width={innerW} height={innerH} />\n </clipPath>\n </defs>\n\n {/* Y gridlines + ticks */}\n {yTicks.map((t) => (\n <g key={`y${t}`}>\n <line\n x1={MARGIN.left}\n x2={MARGIN.left + innerW}\n y1={yAt(t)}\n y2={yAt(t)}\n stroke=\"var(--rs-border, #e5e7eb)\"\n strokeWidth={1}\n />\n <text\n x={MARGIN.left - 8}\n y={yAt(t)}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {formatMetricCompact(family, t)}\n </text>\n </g>\n ))}\n\n {/* X ticks */}\n {periods.map((p, i) =>\n i % xEvery === 0 || i === periodCount - 1 ? (\n <text\n key={`x${p.x}`}\n x={xAt(i)}\n y={height - MARGIN.bottom + 18}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n >\n {shortMonth(p.x)}\n </text>\n ) : null\n )}\n\n {/* Baseline */}\n <line\n x1={MARGIN.left}\n x2={MARGIN.left + innerW}\n y1={MARGIN.top + innerH}\n y2={MARGIN.top + innerH}\n stroke=\"var(--rs-border-strong, #9ca3af)\"\n strokeWidth={1}\n />\n\n {/* Crosshair */}\n {active !== null && (\n <line\n x1={xAt(active)}\n x2={xAt(active)}\n y1={MARGIN.top}\n y2={MARGIN.top + innerH}\n stroke=\"var(--rs-border-strong, #9ca3af)\"\n strokeWidth={1}\n />\n )}\n\n {/* Series lines + markers */}\n <g clipPath={`url(#${clipId})`}>\n {series.map((s, si) => {\n const color = seriesColor(si)\n const segs: string[] = []\n let pen = false\n s.points.forEach((pt, i) => {\n if (pt.y === null || Number.isNaN(pt.y)) {\n pen = false\n return\n }\n segs.push(`${pen ? 'L' : 'M'}${xAt(i)},${yAt(pt.y)}`)\n pen = true\n })\n return (\n <path\n key={s.key}\n d={segs.join(' ')}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n )\n })}\n </g>\n\n {/* End markers + selective end labels */}\n {series.map((s, si) => {\n const color = seriesColor(si)\n // Last non-null point is the series' visual end.\n let endIdx = -1\n for (let i = s.points.length - 1; i >= 0; i--) {\n const y = s.points[i].y\n if (y !== null && !Number.isNaN(y)) {\n endIdx = i\n break\n }\n }\n if (endIdx < 0) return null\n const ey = yAt(s.points[endIdx].y as number)\n const ex = xAt(endIdx)\n let label: string | null = null\n if (showEndLabels && endIdx === periodCount - 1) {\n const collides = placedLabelY.some((py) => Math.abs(py - ey) < 13)\n if (!collides) {\n placedLabelY.push(ey)\n label = formatMetricValue(family, s.points[endIdx].y)\n }\n }\n return (\n <g key={`end${s.key}`}>\n <circle\n cx={ex}\n cy={ey}\n r={4}\n fill={color}\n stroke=\"var(--rs-surface, #ffffff)\"\n strokeWidth={2}\n />\n {label && (\n <text\n x={ex + 8}\n y={ey}\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-text, #111827)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {label}\n </text>\n )}\n </g>\n )\n })}\n\n {/* Active-point markers + tooltip */}\n {active !== null && (\n <ActiveReadout\n active={active}\n series={series}\n family={family}\n xAt={xAt}\n yAt={yAt}\n width={width}\n periodLabel={periods[active] ? shortMonth(periods[active].x) : ''}\n plotTop={MARGIN.top}\n />\n )}\n </svg>\n </div>\n )\n}\n\ninterface ActiveReadoutProps {\n active: number\n series: ChartSeriesData[]\n family: MetricItemType | string | null\n xAt: (i: number) => number\n yAt: (v: number) => number\n width: number\n periodLabel: string\n plotTop: number\n}\n\n/** SVG-native tooltip — value-leads-label rows, keyed by a short line stroke. */\nfunction ActiveReadout({\n active,\n series,\n family,\n xAt,\n yAt,\n width,\n periodLabel,\n plotTop,\n}: ActiveReadoutProps): React.JSX.Element {\n const rows = series.map((s, i) => ({\n label: s.label,\n color: seriesColor(i),\n value: s.points[active]?.y ?? null,\n y: s.points[active]?.y,\n }))\n const rowH = 16\n const boxW = 176\n const boxH = 22 + rows.length * rowH\n const cx = xAt(active)\n const bx = cx + 12 + boxW > width ? cx - 12 - boxW : cx + 12\n const by = plotTop + 4\n\n return (\n <g pointerEvents=\"none\">\n {rows.map((r) =>\n r.y !== null && r.y !== undefined && !Number.isNaN(r.y) ? (\n <circle\n key={`ap${r.label}`}\n cx={cx}\n cy={yAt(r.y)}\n r={4}\n fill={r.color}\n stroke=\"var(--rs-surface, #ffffff)\"\n strokeWidth={2}\n />\n ) : null\n )}\n <rect\n x={bx}\n y={by}\n width={boxW}\n height={boxH}\n rx={6}\n fill=\"var(--rs-surface, #ffffff)\"\n stroke=\"var(--rs-border, #e5e7eb)\"\n strokeWidth={1}\n />\n <text x={bx + 10} y={by + 15} fontSize={11} fontWeight={600} fill=\"var(--rs-muted, #6b7280)\">\n {periodLabel}\n </text>\n {rows.map((r, i) => {\n const ry = by + 22 + i * rowH + 11\n return (\n <g key={`tr${r.label}`}>\n <line\n x1={bx + 10}\n x2={bx + 24}\n y1={ry}\n y2={ry}\n stroke={r.color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n />\n <text\n x={bx + 30}\n y={ry}\n dominantBaseline=\"middle\"\n fontSize={11}\n fill=\"var(--rs-muted, #6b7280)\"\n >\n {r.label}\n </text>\n <text\n x={bx + boxW - 10}\n y={ry}\n dominantBaseline=\"middle\"\n textAnchor=\"end\"\n fontSize={11}\n fontWeight={600}\n fill=\"var(--rs-text, #111827)\"\n style={{ fontVariantNumeric: 'tabular-nums' }}\n >\n {formatMetricValue(family, r.value)}\n </text>\n </g>\n )\n })}\n </g>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosystems/report-components",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Source-agnostic React components for rendering XBRL-grade financial statements",
5
5
  "license": "MIT",
6
6
  "author": "RFS LLC",