@robosystems/report-components 0.2.2 → 0.2.4

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/project.ts","../src/pivot.ts","../src/components/ExternalTextBlock.tsx","../src/components/FactInspector.tsx","../src/components/StatementTable.tsx","../src/components/ReportView.tsx"],"names":["qname","fallbackElement","styles","jsxs","jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 const kids: CalcAssociation[] = model.calcAssociations.filter((a) => a.parent === elementId)\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'\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/**\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\n .map((a) => `${a}=${byAxis.get(a)?.member ?? byAxis.get(a)?.typedValue ?? DOMAIN}`)\n .join('|')\n}\n\n/** Facts belonging to one section (its Information Block's factset). */\nfunction sectionFacts(model: NormalizedReport, ib: InformationBlock): Fact[] {\n return model.facts.filter((f) => f.factSet !== null && f.factSet === ib.factSet)\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\ninterface PresentationTree {\n /** Ordered children per parent (by arc order). */\n childrenOf: Map<string, string[]>\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\n/**\n * Index one structure's presentation arcs: ordered children 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, string]>>()\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, assoc.child])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n const childrenOf = new Map<string, string[]>()\n for (const [parent, kids] of children) {\n childrenOf.set(\n parent,\n kids.sort((a, b) => a[0] - b[0]).map(([, child]) => child)\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 child of childrenOf.get(node) ?? []) pre(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// ── 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 end = model.periods[f.period]?.end\n if (end && populated) count.set(end, (count.get(end) ?? 0) + 1)\n }\n const max = Math.max(0, ...count.values())\n if (max < 5) return periods\n const threshold = Math.max(2, max * PERIOD_DENSITY_FRACTION)\n return periods.filter((p) => (count.get(p.end) ?? 0) >= threshold)\n}\n\n/** Period columns keyed by end date, preferring a duration as the representative. */\nfunction derivePeriods(model: NormalizedReport, facts: Fact[]): PeriodInfo[] {\n const byEnd = new Map<string, PeriodInfo>()\n for (const fact of facts) {\n const period = model.periods[fact.period]\n if (!period || !period.end) continue\n const existing = byEnd.get(period.end)\n if (!existing || (existing.type === 'instant' && period.type === 'duration')) {\n byEnd.set(period.end, period)\n }\n }\n return [...byEnd.values()].sort((a, b) => {\n const aStart = a.startDate ?? a.end\n const bStart = b.startDate ?? b.end\n return aStart.localeCompare(bStart) || a.end.localeCompare(b.end)\n })\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(model: NormalizedReport, facts: Fact[], config: PivotConfig): 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 let qual: DimensionQualifier | null = null\n for (const f of facts) {\n const d = (f.dimensions ?? []).find((x) => x.axis === axis)\n if (d) {\n qual = d\n break\n }\n }\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 // Columns: period (outer) × member combos over the column axes (inner).\n const periodOnColumns = config.columns.includes('period')\n let periods = periodOnColumns ? derivePeriods(model, facts) : []\n if (periodOnColumns && config.dropSparsePeriods !== false) {\n periods = pruneSparsePeriods(model, facts, periods)\n }\n const colCombos = memberCombos(facts, 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 facts) {\n const end = model.periods[f.period]?.end ?? ''\n occupiedCols.add(`${end}#${coordinate(memberByAxis(f), colDimAxes)}`)\n }\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 const end = period?.end ?? ''\n if (!occupiedCols.has(`${end}#${combo.sig}`)) continue\n const periodLabel = period ? formatDate(period.end) : ''\n columns.push({\n key: `${end}#${combo.sig}`,\n period,\n members: combo.members,\n label: combo.labels.length ? combo.labels[combo.labels.length - 1] : periodLabel,\n })\n columnSegs.push([...(periodOnColumns ? [periodLabel] : []), ...combo.labels])\n }\n }\n const columnHeaders = headerLevels(columnSegs)\n\n // Index every in-table fact by (element, rowCombo, periodEnd, colCombo) so a\n // cell is an O(1) exact-signature lookup — no last-write-wins collisions.\n const factIndex = new Map<string, Fact>()\n for (const f of facts) {\n const byAxis = memberByAxis(f)\n const end = model.periods[f.period]?.end ?? ''\n const rowSig = coordinate(byAxis, rowDimAxes)\n const colSig = coordinate(byAxis, colDimAxes)\n factIndex.set(`${f.element}␟${rowSig}␟${end}␟${colSig}`, f)\n }\n\n const factfulConcepts = new Set(facts.map((f) => f.element))\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(facts, rowDimAxes, tree.indexOf, true)\n const combosForConcept = (element: string): MemberCombo[] => {\n if (rowDimAxes.length === 0) return rowCombos // single domain combo\n return rowCombos.filter((combo) =>\n columns.some((col) =>\n factIndex.has(\n `${element}␟${combo.sig}␟${col.period?.end ?? ''}␟${coordinate(\n new Map(col.members.map((m) => [m.axis, m])),\n colDimAxes\n )}`\n )\n )\n )\n }\n\n const cellsFor = (element: string, rowSig: string): PivotRow['cells'] =>\n columns.map((col) => {\n const colSig = coordinate(new Map(col.members.map((m) => [m.axis, m])), colDimAxes)\n const fact = factIndex.get(`${element}␟${rowSig}␟${col.period?.end ?? ''}␟${colSig}`)\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 child of tree.childrenOf.get(id) ?? []) {\n if (subtreeHasFact(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): void => {\n const el = elementOf(model, id)\n const combos = combosForConcept(id)\n if (!combos.length) return\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: id,\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 })\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 ? `${id}␟${combo.sig}` : id,\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),\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 const seenInTree = new Set<string>()\n const walk = (id: string, depth: number): void => {\n if (seenInTree.has(id) || !subtreeHasFact(id)) return\n seenInTree.add(id)\n const el = elementOf(model, id)\n if (el.abstract) {\n if (config.showAbstracts) {\n rows.push({\n key: id,\n element: el,\n depth,\n header: true,\n isSubtotal: false,\n members: [],\n cells: [],\n })\n }\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n } else {\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n emitConcept(id, depth)\n }\n }\n for (const root of tree.roots) walk(root, 0)\n // Concepts with facts but absent from the presentation network — append after.\n for (const id of factfulConcepts) {\n if (seenInTree.has(id) || elementOf(model, id).abstract) continue\n emitConcept(id, 0)\n }\n\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 return {\n ib,\n blockType: ib.blockType,\n title,\n structureName: ib.structureId ? null : (structure?.structureName ?? ib.label ?? null),\n slicers: buildSlicers(model, facts, config),\n columnHeaders,\n columns,\n rows,\n scale: resolveScale(facts, model, config.scale),\n config,\n }\n}\n\n/** Section metadata (id + display title) for a report, in canonical order. */\nexport function reportSections(model: NormalizedReport): Array<{ id: string; title: string }> {\n return buildPivots(model).map((p) => ({ id: p.ib.id, title: p.title }))\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 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// 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): 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; }\n </style></head><body>${body}</body></html>`\n}\n\n/**\n * An *inline* text-block fact — the disclosure HTML lives in the holon itself\n * (`rs:stringValue`), not an external CDN URL — rendered in the same sandboxed\n * frame as the externalized case. Used for holon-authored / offline reports.\n */\nexport function InlineTextBlock({ html }: { html: string }) {\n return <SandboxedHtml html={html} />\n}\n\nfunction SandboxedHtml({ html }: { html: 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)}\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.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 html={inline.textValue} />\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.\n const display = isText\n ? (duration ?? cell.textValue)\n : cell.fact === null\n ? ''\n : cell.value === 0\n ? '—'\n : formatValue(cell.value, {\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.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"]}
1
+ {"version":3,"sources":["../src/project.ts","../src/pivot.ts","../src/components/ExternalTextBlock.tsx","../src/components/FactInspector.tsx","../src/components/StatementTable.tsx","../src/components/ReportView.tsx"],"names":["qname","fallbackElement","styles","jsxs","jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 const kids: CalcAssociation[] = model.calcAssociations.filter((a) => a.parent === elementId)\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/**\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\n .map((a) => `${a}=${byAxis.get(a)?.member ?? byAxis.get(a)?.typedValue ?? DOMAIN}`)\n .join('|')\n}\n\n/** Facts belonging to one section (its Information Block's factset). */\nfunction sectionFacts(model: NormalizedReport, ib: InformationBlock): Fact[] {\n return model.facts.filter((f) => f.factSet !== null && f.factSet === ib.factSet)\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\ninterface PresentationTree {\n /** Ordered children per parent (by arc order). */\n childrenOf: Map<string, string[]>\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\n/**\n * Index one structure's presentation arcs: ordered children 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, string]>>()\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, assoc.child])\n children.set(assoc.parent, kids)\n froms.add(assoc.parent)\n tos.add(assoc.child)\n }\n const childrenOf = new Map<string, string[]>()\n for (const [parent, kids] of children) {\n childrenOf.set(\n parent,\n kids.sort((a, b) => a[0] - b[0]).map(([, child]) => child)\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 child of childrenOf.get(node) ?? []) pre(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// ── 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 end = model.periods[f.period]?.end\n if (end && populated) count.set(end, (count.get(end) ?? 0) + 1)\n }\n const max = Math.max(0, ...count.values())\n if (max < 5) return periods\n const threshold = Math.max(2, max * PERIOD_DENSITY_FRACTION)\n return periods.filter((p) => (count.get(p.end) ?? 0) >= threshold)\n}\n\n/** Period columns keyed by end date, preferring a duration as the representative. */\nfunction derivePeriods(model: NormalizedReport, facts: Fact[]): PeriodInfo[] {\n const byEnd = new Map<string, PeriodInfo>()\n for (const fact of facts) {\n const period = model.periods[fact.period]\n if (!period || !period.end) continue\n const existing = byEnd.get(period.end)\n if (!existing || (existing.type === 'instant' && period.type === 'duration')) {\n byEnd.set(period.end, period)\n }\n }\n return [...byEnd.values()].sort((a, b) => {\n const aStart = a.startDate ?? a.end\n const bStart = b.startDate ?? b.end\n return aStart.localeCompare(bStart) || a.end.localeCompare(b.end)\n })\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(model: NormalizedReport, facts: Fact[], config: PivotConfig): 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 let qual: DimensionQualifier | null = null\n for (const f of facts) {\n const d = (f.dimensions ?? []).find((x) => x.axis === axis)\n if (d) {\n qual = d\n break\n }\n }\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 // Columns: period (outer) × member combos over the column axes (inner).\n const periodOnColumns = config.columns.includes('period')\n let periods = periodOnColumns ? derivePeriods(model, facts) : []\n if (periodOnColumns && config.dropSparsePeriods !== false) {\n periods = pruneSparsePeriods(model, facts, periods)\n }\n const colCombos = memberCombos(facts, 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 facts) {\n const end = model.periods[f.period]?.end ?? ''\n occupiedCols.add(`${end}#${coordinate(memberByAxis(f), colDimAxes)}`)\n }\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 const end = period?.end ?? ''\n if (!occupiedCols.has(`${end}#${combo.sig}`)) continue\n const periodLabel = period ? formatDate(period.end) : ''\n columns.push({\n key: `${end}#${combo.sig}`,\n period,\n members: combo.members,\n label: combo.labels.length ? combo.labels[combo.labels.length - 1] : periodLabel,\n })\n columnSegs.push([...(periodOnColumns ? [periodLabel] : []), ...combo.labels])\n }\n }\n const columnHeaders = headerLevels(columnSegs)\n\n // Index every in-table fact by (element, rowCombo, periodEnd, colCombo) so a\n // cell is an O(1) exact-signature lookup — no last-write-wins collisions.\n //\n // A fact whose coordinate carries an axis this pivot does NOT show (e.g. the\n // per-segment revenue facts on the *face* income statement, where the segment\n // axis is out of scope) is a finer breakdown of a coarser cell. Its dropped\n // axis would make it key-identical to the consolidated fact and overwrite it —\n // the classic dimensional collision. Skip it: only facts whose dimensions are\n // all shown on this pivot's axes populate a cell, so the consolidated\n // (undimensioned) fact owns the consolidated cell.\n const shownAxes = new Set([...rowDimAxes, ...colDimAxes])\n const factIndex = new Map<string, Fact>()\n for (const f of facts) {\n const byAxis = memberByAxis(f)\n if ([...byAxis.keys()].some((axis) => !shownAxes.has(axis))) continue\n const end = model.periods[f.period]?.end ?? ''\n const rowSig = coordinate(byAxis, rowDimAxes)\n const colSig = coordinate(byAxis, colDimAxes)\n factIndex.set(`${f.element}␟${rowSig}␟${end}␟${colSig}`, f)\n }\n\n const factfulConcepts = new Set(facts.map((f) => f.element))\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(facts, rowDimAxes, tree.indexOf, true)\n const combosForConcept = (element: string): MemberCombo[] => {\n if (rowDimAxes.length === 0) return rowCombos // single domain combo\n return rowCombos.filter((combo) =>\n columns.some((col) =>\n factIndex.has(\n `${element}␟${combo.sig}␟${col.period?.end ?? ''}␟${coordinate(\n new Map(col.members.map((m) => [m.axis, m])),\n colDimAxes\n )}`\n )\n )\n )\n }\n\n const cellsFor = (element: string, rowSig: string): PivotRow['cells'] =>\n columns.map((col) => {\n const colSig = coordinate(new Map(col.members.map((m) => [m.axis, m])), colDimAxes)\n const fact = factIndex.get(`${element}␟${rowSig}␟${col.period?.end ?? ''}␟${colSig}`)\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 child of tree.childrenOf.get(id) ?? []) {\n if (subtreeHasFact(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): void => {\n const el = elementOf(model, id)\n const combos = combosForConcept(id)\n if (!combos.length) return\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: id,\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 })\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 ? `${id}␟${combo.sig}` : id,\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),\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 const seenInTree = new Set<string>()\n const walk = (id: string, depth: number): void => {\n if (seenInTree.has(id) || !subtreeHasFact(id)) return\n seenInTree.add(id)\n const el = elementOf(model, id)\n if (el.abstract) {\n if (config.showAbstracts) {\n rows.push({\n key: id,\n element: el,\n depth,\n header: true,\n isSubtotal: false,\n members: [],\n cells: [],\n })\n }\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n } else {\n for (const child of tree.childrenOf.get(id) ?? []) walk(child, depth + 1)\n emitConcept(id, depth)\n }\n }\n for (const root of tree.roots) walk(root, 0)\n // Concepts with facts but absent from the presentation network — append after.\n for (const id of factfulConcepts) {\n if (seenInTree.has(id) || elementOf(model, id).abstract) continue\n emitConcept(id, 0)\n }\n\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 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, facts, config),\n columnHeaders,\n columns,\n rows,\n scale: resolveScale(facts, 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 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// 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): 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; }\n </style></head><body>${body}</body></html>`\n}\n\n/**\n * An *inline* text-block fact — the disclosure HTML lives in the holon itself\n * (`rs:stringValue`), not an external CDN URL — rendered in the same sandboxed\n * frame as the externalized case. Used for holon-authored / offline reports.\n */\nexport function InlineTextBlock({ html }: { html: string }) {\n return <SandboxedHtml html={html} />\n}\n\nfunction SandboxedHtml({ html }: { html: 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)}\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.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 html={inline.textValue} />\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.\n const display = isText\n ? (duration ?? cell.textValue)\n : cell.fact === null\n ? ''\n : cell.value === 0\n ? '—'\n : formatValue(cell.value, {\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.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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosystems/report-components",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Source-agnostic React components for rendering XBRL-grade financial statements",
5
5
  "license": "MIT",
6
6
  "author": "RFS LLC",