@robosystems/report-components 0.2.1 → 0.2.3
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/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/{chunk-DGP4KRWF.js → chunk-YGY4JINO.js} +59 -5
- package/dist/chunk-YGY4JINO.js.map +1 -0
- package/dist/{index-WkjE6dZu.d.ts → index-BS6_6h3l.d.ts} +6 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-DGP4KRWF.js.map +0 -1
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { e as CypherAdapterConfig, R as ReportAdapter, o as SecQuery, p as SecReportShell, q as SecSection, v as cypherAdapter, w as fetchSecReportShell, x as fetchSecSection, y as jsonldFileAdapter, z as mergeSecSections, G as parseJsonld, H as parseStore, J as parseStructureDefinition } from '../index-
|
|
1
|
+
export { e as CypherAdapterConfig, R as ReportAdapter, o as SecQuery, p as SecReportShell, q as SecSection, v as cypherAdapter, w as fetchSecReportShell, x as fetchSecSection, y as jsonldFileAdapter, z as mergeSecSections, G as parseJsonld, H as parseStore, J as parseStructureDefinition } from '../index-BS6_6h3l.js';
|
|
2
2
|
import 'n3';
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { cypherAdapter, fetchSecReportShell, fetchSecSection, jsonldFileAdapter, mergeSecSections, parseJsonld, parseStore, parseStructureDefinition } from '../chunk-
|
|
1
|
+
export { cypherAdapter, fetchSecReportShell, fetchSecSection, jsonldFileAdapter, mergeSecSections, parseJsonld, parseStore, parseStructureDefinition } from '../chunk-YGY4JINO.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -31,14 +31,23 @@ var IRI = {
|
|
|
31
31
|
entity: NS.rs + "entity",
|
|
32
32
|
factSet: NS.rs + "factSet",
|
|
33
33
|
numericValue: NS.rs + "numericValue",
|
|
34
|
+
stringValue: NS.rs + "stringValue",
|
|
34
35
|
decimals: NS.rs + "decimals",
|
|
36
|
+
dimension: NS.rs + "dimension",
|
|
37
|
+
axis: NS.rs + "axis",
|
|
38
|
+
member: NS.rs + "member",
|
|
39
|
+
isExplicit: NS.rs + "isExplicit",
|
|
40
|
+
typedValue: NS.rs + "typedValue",
|
|
35
41
|
blockType: NS.rs + "blockType",
|
|
36
42
|
associationType: NS.rs + "associationType",
|
|
37
43
|
hasAssociation: NS.rs + "hasAssociation",
|
|
38
44
|
roleUri: NS.rs + "roleUri",
|
|
45
|
+
structure: NS.rs + "structure",
|
|
39
46
|
structureName: NS.rs + "structureName",
|
|
47
|
+
structureOrder: NS.rs + "structureOrder",
|
|
40
48
|
abstract: NS.rs + "abstract",
|
|
41
49
|
monetary: NS.rs + "monetary",
|
|
50
|
+
itemType: NS.rs + "itemType",
|
|
42
51
|
legalName: NS.rs + "legalName",
|
|
43
52
|
country: NS.rs + "country",
|
|
44
53
|
// skos:
|
|
@@ -556,6 +565,24 @@ function cypherAdapter(config) {
|
|
|
556
565
|
}
|
|
557
566
|
};
|
|
558
567
|
}
|
|
568
|
+
function numericKindFromItemType(itemType) {
|
|
569
|
+
switch (itemType) {
|
|
570
|
+
case "monetary":
|
|
571
|
+
return "monetary";
|
|
572
|
+
case "perShare":
|
|
573
|
+
return "perShare";
|
|
574
|
+
case "shares":
|
|
575
|
+
return "shares";
|
|
576
|
+
case "percent":
|
|
577
|
+
return "percent";
|
|
578
|
+
case "pure":
|
|
579
|
+
return "pure";
|
|
580
|
+
case "integer":
|
|
581
|
+
return "integer";
|
|
582
|
+
default:
|
|
583
|
+
return void 0;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
559
586
|
var { namedNode } = DataFactory;
|
|
560
587
|
function makeReaders(store) {
|
|
561
588
|
const objects = (s, p) => store.getObjects(namedNode(s), namedNode(p), null);
|
|
@@ -577,6 +604,7 @@ function parseStore(store) {
|
|
|
577
604
|
for (const id of subjectsOfType(IRI.Element)) {
|
|
578
605
|
const balance = firstValue(id, IRI.balance);
|
|
579
606
|
const periodType2 = firstValue(id, IRI.periodType);
|
|
607
|
+
const itemType = firstValue(id, IRI.itemType) ?? void 0;
|
|
580
608
|
elements[id] = {
|
|
581
609
|
id,
|
|
582
610
|
qname: qname(id),
|
|
@@ -584,7 +612,9 @@ function parseStore(store) {
|
|
|
584
612
|
balance: balance === "debit" || balance === "credit" ? balance : null,
|
|
585
613
|
periodType: periodType2 === "instant" || periodType2 === "duration" ? periodType2 : null,
|
|
586
614
|
abstract: firstValue(id, IRI.abstract) === "true",
|
|
587
|
-
monetary: firstValue(id, IRI.monetary) === "true"
|
|
615
|
+
monetary: firstValue(id, IRI.monetary) === "true",
|
|
616
|
+
itemType,
|
|
617
|
+
numericKind: numericKindFromItemType(itemType)
|
|
588
618
|
};
|
|
589
619
|
}
|
|
590
620
|
const periods = {};
|
|
@@ -620,6 +650,21 @@ function parseStore(store) {
|
|
|
620
650
|
}
|
|
621
651
|
const facts = [];
|
|
622
652
|
for (const id of subjectsOfType(IRI.Fact)) {
|
|
653
|
+
const dimensions = [];
|
|
654
|
+
for (const d of objects(id, IRI.dimension)) {
|
|
655
|
+
const axis = firstValue(d.value, IRI.axis);
|
|
656
|
+
if (!axis) continue;
|
|
657
|
+
const member = firstValue(d.value, IRI.member);
|
|
658
|
+
const typedValue = firstValue(d.value, IRI.typedValue);
|
|
659
|
+
dimensions.push({
|
|
660
|
+
axis,
|
|
661
|
+
member: member ?? null,
|
|
662
|
+
axisLabel: elements[axis]?.label ?? humanize(axis),
|
|
663
|
+
memberLabel: member ? elements[member]?.label ?? humanize(member) : typedValue ?? "",
|
|
664
|
+
explicit: firstValue(d.value, IRI.isExplicit) === "true",
|
|
665
|
+
typedValue: typedValue ?? null
|
|
666
|
+
});
|
|
667
|
+
}
|
|
623
668
|
facts.push({
|
|
624
669
|
id,
|
|
625
670
|
element: firstValue(id, IRI.element) ?? "",
|
|
@@ -628,7 +673,9 @@ function parseStore(store) {
|
|
|
628
673
|
entity: firstValue(id, IRI.entity),
|
|
629
674
|
factSet: firstValue(id, IRI.factSet),
|
|
630
675
|
value: toNumber(firstValue(id, IRI.numericValue)),
|
|
631
|
-
|
|
676
|
+
textValue: firstValue(id, IRI.stringValue),
|
|
677
|
+
decimals: firstValue(id, IRI.decimals),
|
|
678
|
+
dimensions: dimensions.length ? dimensions : void 0
|
|
632
679
|
});
|
|
633
680
|
}
|
|
634
681
|
const informationBlocks = [];
|
|
@@ -636,6 +683,10 @@ function parseStore(store) {
|
|
|
636
683
|
informationBlocks.push({
|
|
637
684
|
id,
|
|
638
685
|
blockType: firstValue(id, IRI.blockType) ?? "",
|
|
686
|
+
// Match a block to its structure by identity (the rs:structure link),
|
|
687
|
+
// not by a semantic blockType — a full-fidelity holon carries no
|
|
688
|
+
// block-type classification, so structureId is how row order is found.
|
|
689
|
+
structureId: firstValue(id, IRI.structure) ?? void 0,
|
|
639
690
|
factSet: firstValue(id, IRI.factSet),
|
|
640
691
|
label: firstValue(id, IRI.prefLabel)
|
|
641
692
|
});
|
|
@@ -647,7 +698,10 @@ function parseStore(store) {
|
|
|
647
698
|
id,
|
|
648
699
|
blockType: firstValue(id, IRI.blockType) ?? "",
|
|
649
700
|
roleUri: firstValue(id, IRI.roleUri),
|
|
650
|
-
structureName: firstValue(id, IRI.structureName)
|
|
701
|
+
structureName: firstValue(id, IRI.structureName),
|
|
702
|
+
// Filing sequence (SEC role-definition number) so buildPivots orders all
|
|
703
|
+
// sections by the filer's order rather than the fixed four-primary fallback.
|
|
704
|
+
order: toNumber(firstValue(id, IRI.structureOrder)) ?? void 0
|
|
651
705
|
});
|
|
652
706
|
for (const assoc of objects(id, IRI.hasAssociation)) {
|
|
653
707
|
assocStructure.set(assoc.value, id);
|
|
@@ -717,5 +771,5 @@ function jsonldFileAdapter(doc, source = "holon.jsonld") {
|
|
|
717
771
|
}
|
|
718
772
|
|
|
719
773
|
export { BLOCK_ORDER, BLOCK_TITLES, NS, currencySymbolFor, cypherAdapter, fetchSecReportShell, fetchSecSection, formatDate, formatMoney, formatPeriod, formatValue, humanize, humanizeDuration, isExternalFactUrl, jsonldFileAdapter, mergeSecSections, numericKindOf, parseJsonld, parseStore, parseStructureDefinition, qname };
|
|
720
|
-
//# sourceMappingURL=chunk-
|
|
721
|
-
//# sourceMappingURL=chunk-
|
|
774
|
+
//# sourceMappingURL=chunk-YGY4JINO.js.map
|
|
775
|
+
//# sourceMappingURL=chunk-YGY4JINO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/format.ts","../src/adapters/sec.ts","../src/adapters/cypher.ts","../src/adapters/store.ts","../src/adapters/jsonld.ts"],"names":["qname","periodType","Store"],"mappings":"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","file":"chunk-YGY4JINO.js","sourcesContent":["/**\n * RDF vocabulary and display helpers shared across adapters and projection.\n *\n * A report holon mixes several vocabularies: `rs:` for structure, `skos:` for\n * human labels, and the XBRL family (`xlink:` / `xbrli:` / `link:`) for the\n * networks. These constants are the single source of truth for the full IRIs.\n */\n\nexport const NS = {\n rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n rs: 'https://robosystems.ai/vocab/',\n rsgaap: 'https://robosystems.ai/taxonomy/rs-gaap/v1/',\n skos: 'http://www.w3.org/2004/02/skos/core#',\n xlink: 'http://www.w3.org/1999/xlink#',\n xbrli: 'http://www.xbrl.org/2003/instance#',\n link: 'http://www.xbrl.org/2003/linkbase#',\n iso4217: 'http://www.xbrl.org/2003/iso4217#',\n} as const\n\n/** Frequently-referenced full IRIs, pre-concatenated for terseness. */\nexport const IRI = {\n type: NS.rdf + 'type',\n // rs: classes\n Report: NS.rs + 'Report',\n Fact: NS.rs + 'Fact',\n InformationBlock: NS.rs + 'InformationBlock',\n Structure: NS.rs + 'Structure',\n Association: NS.rs + 'Association',\n Element: NS.rs + 'Element',\n Period: NS.rs + 'Period',\n Unit: NS.rs + 'Unit',\n Entity: NS.rs + 'Entity',\n // rs: predicates\n element: NS.rs + 'element',\n period: NS.rs + 'period',\n unit: NS.rs + 'unit',\n entity: NS.rs + 'entity',\n factSet: NS.rs + 'factSet',\n numericValue: NS.rs + 'numericValue',\n stringValue: NS.rs + 'stringValue',\n decimals: NS.rs + 'decimals',\n dimension: NS.rs + 'dimension',\n axis: NS.rs + 'axis',\n member: NS.rs + 'member',\n isExplicit: NS.rs + 'isExplicit',\n typedValue: NS.rs + 'typedValue',\n blockType: NS.rs + 'blockType',\n associationType: NS.rs + 'associationType',\n hasAssociation: NS.rs + 'hasAssociation',\n roleUri: NS.rs + 'roleUri',\n structure: NS.rs + 'structure',\n structureName: NS.rs + 'structureName',\n structureOrder: NS.rs + 'structureOrder',\n abstract: NS.rs + 'abstract',\n monetary: NS.rs + 'monetary',\n itemType: NS.rs + 'itemType',\n legalName: NS.rs + 'legalName',\n country: NS.rs + 'country',\n // skos:\n prefLabel: NS.skos + 'prefLabel',\n // xlink:\n from: NS.xlink + 'from',\n to: NS.xlink + 'to',\n role: NS.xlink + 'role',\n // xbrli:\n instant: NS.xbrli + 'instant',\n startDate: NS.xbrli + 'startDate',\n endDate: NS.xbrli + 'endDate',\n periodType: NS.xbrli + 'periodType',\n balance: NS.xbrli + 'balance',\n measure: NS.xbrli + 'measure',\n // link:\n order: NS.link + 'order',\n weight: NS.link + 'weight',\n} as const\n\n/**\n * Prefixes for compacting concept IRIs to `prefix:Local`. Order matters — the\n * most specific namespace must come first so `rs-gaap:` wins over `rs:`.\n */\nconst PREFIXES: ReadonlyArray<readonly [string, string]> = [\n ['rs-gaap', NS.rsgaap],\n ['disclosures', 'https://robosystems.ai/taxonomy/rs-gaap/disclosures/v1/'],\n ['us-gaap', 'http://fasb.org/us-gaap/'],\n ['dei', 'http://xbrl.sec.gov/dei/'],\n ['rs', NS.rs],\n ['skos', NS.skos],\n ['xbrli', NS.xbrli],\n ['xlink', NS.xlink],\n ['link', NS.link],\n ['iso4217', NS.iso4217],\n]\n\n/** Compact a concept IRI to `prefix:Local` (e.g. `rs-gaap:Assets`). */\nexport function qname(iri: string): string {\n for (const [prefix, ns] of PREFIXES) {\n if (iri.startsWith(ns)) {\n return `${prefix}:${iri.slice(ns.length)}`\n }\n }\n const slash = iri.lastIndexOf('/')\n const hash = iri.lastIndexOf('#')\n return iri.slice(Math.max(slash, hash) + 1)\n}\n\n/**\n * Readable concept name from a local name when no `skos:prefLabel` is present —\n * splits CamelCase into words (`AssetsCurrent` → `Assets Current`). A graceful\n * fallback for bundles that predate label emit.\n */\nexport function humanize(iri: string): string {\n const local = qname(iri).split(':').pop() ?? iri\n return local.replace(/(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g, ' ')\n}\n\n/**\n * A large text-block / policy fact whose HTML (or plain-text) body is too big to\n * store inline, so the platform externalizes it to the public CDN and the fact's\n * value is the URL (`…/fact_<hash>.html` or `.txt`). The renderer fetches and\n * embeds these instead of printing the raw link.\n */\nexport function isExternalFactUrl(value: string | null | undefined): boolean {\n return !!value && /^https?:\\/\\/\\S+\\/fact_[0-9a-f]+\\.(html|txt)$/i.test(value)\n}\n\n/** Stable display order for the canonical statement blocks; others fall after. */\nexport const BLOCK_ORDER: Record<string, number> = {\n balance_sheet: 0,\n income_statement: 1,\n cash_flow_statement: 2,\n equity_statement: 3,\n}\n\n/** Friendly section headings keyed by block type. */\nexport const BLOCK_TITLES: Record<string, string> = {\n balance_sheet: 'Balance Sheet',\n income_statement: 'Income Statement',\n cash_flow_statement: 'Cash Flow Statement',\n equity_statement: 'Statement of Changes in Equity',\n}\n","/**\n * Pure formatting helpers shared by the projection and the components. No React\n * here, so the projection can depend on it without pulling in a renderer.\n */\nimport type { ElementInfo, NumericKind, PeriodInfo } from './model'\n\n/**\n * Accounting-style money: negatives in parentheses, no sign, an em-dash for\n * absent values. Matches the RoboLedger statement renderer.\n */\nexport function formatMoney(\n value: number | null | undefined,\n opts: { currencySymbol?: string } = {}\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return '—'\n const symbol = opts.currencySymbol ?? '$'\n const abs = Math.abs(value).toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n return value < 0 ? `${symbol}(${abs})` : `${symbol}${abs}`\n}\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n/** `2024-03-31` → `Mar 31, 2024`. Falls back to the raw string if unparseable. */\nexport function formatDate(iso: string | null | undefined): string {\n if (!iso) return ''\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso)\n if (!m) return iso\n const [, year, month, day] = m\n const idx = Number(month) - 1\n return `${MONTHS[idx] ?? month} ${Number(day)}, ${year}`\n}\n\n/**\n * Humanize an ISO-8601 duration value (`P10Y` → \"10 years\", `P1Y6M` → \"1 year 6\n * months\", `P30D` → \"30 days\"), or null when the string is not a duration — so a\n * non-numeric fact that happens to start with \"P\" (a company name) is untouched.\n * XBRL `durationItemType` facts (debt maturities, lease terms) arrive as these\n * strings in the text path.\n */\nexport function humanizeDuration(value: string | null | undefined): string | null {\n if (!value) return null\n const m =\n /^(-)?P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(\n value.trim()\n )\n if (!m) return null\n const [, sign, y, mo, w, d, h, min, s] = m\n const parts: string[] = []\n const push = (n: string | undefined, unit: string): void => {\n if (n) parts.push(`${n} ${unit}${Number(n) === 1 ? '' : 's'}`)\n }\n push(y, 'year')\n push(mo, 'month')\n push(w, 'week')\n push(d, 'day')\n push(h, 'hour')\n push(min, 'minute')\n push(s, 'second')\n if (!parts.length) return null\n return `${sign ?? ''}${parts.join(' ')}`\n}\n\n/** A human description of a period — \"As of …\" for instants, a span for durations. */\nexport function formatPeriod(period: PeriodInfo): string {\n if (period.type === 'instant') {\n return `As of ${formatDate(period.instant ?? period.end)}`\n }\n return `${formatDate(period.startDate)} – ${formatDate(period.endDate ?? period.end)}`\n}\n\n/** The effective numeric kind of an element (explicit, else derived from monetary). */\nexport function numericKindOf(el: ElementInfo): NumericKind {\n return el.numericKind ?? (el.monetary ? 'monetary' : 'other')\n}\n\n/** Common currency symbols by ISO-4217 code; null for a non-currency unit. */\nconst CURRENCY_SYMBOLS: Record<string, string> = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n CNY: '¥',\n CHF: 'CHF ',\n CAD: 'CA$',\n AUD: 'A$',\n HKD: 'HK$',\n INR: '₹',\n KRW: '₩',\n}\n\n/**\n * A display prefix for a monetary unit measure (`iso4217:USD` → `$`), else null.\n * Unknown currencies fall back to their code (`CHF `, `SEK `) rather than a wrong\n * dollar sign — this is what fixes non-USD facts rendering as `$`.\n */\nexport function currencySymbolFor(measure: string | null | undefined): string | null {\n if (!measure) return null\n const code = (measure.includes(':') ? measure.split(':').pop()! : measure).toUpperCase()\n if (CURRENCY_SYMBOLS[code]) return CURRENCY_SYMBOLS[code]\n // A currency-shaped code (3 letters) we don't have a glyph for → code prefix.\n return /^[A-Z]{3}$/.test(code) ? `${code} ` : null\n}\n\nexport interface ValueFormat {\n /** Drives symbol, scaling opt-out, and decimal places. Defaults to `monetary`. */\n numericKind?: NumericKind\n /** Currency symbol for monetary/per-share values (from the fact's unit). */\n symbol?: string | null\n /** Divide monetary values by this (e.g. 1e6 to show millions); default 1. */\n scaleFactor?: number\n}\n\n/**\n * Format a fact value for display: accounting style (negatives in parentheses,\n * em-dash for absent), the fact's own currency symbol (never a hard-coded `$`),\n * and the section scale — with per-share amounts and share counts never rescaled\n * (an EPS of 4.93 stays 4.93 under \"in millions\"). A `percent` fact stores a\n * decimal fraction, so it is scaled ×100 and suffixed with `%` (0.10 → 10%); a\n * `pure` fact is a bare ratio, shown as a plain decimal (no `%`).\n */\nexport function formatValue(value: number | null | undefined, fmt: ValueFormat = {}): string {\n if (value === null || value === undefined || Number.isNaN(value)) return '—'\n const kind = fmt.numericKind ?? 'monetary'\n const scale = kind === 'monetary' ? (fmt.scaleFactor ?? 1) : 1\n const scaled = kind === 'percent' ? value * 100 : value / scale\n\n let minFrac = 0\n let maxFrac = 0\n if (kind === 'perShare') {\n minFrac = maxFrac = 2\n } else if (kind === 'monetary') {\n minFrac = maxFrac = scale > 1 ? 0 : 2\n } else if (kind === 'percent') {\n maxFrac = 2\n } else if (kind === 'pure') {\n maxFrac = 4\n }\n\n const abs = Math.abs(scaled).toLocaleString('en-US', {\n minimumFractionDigits: minFrac,\n maximumFractionDigits: maxFrac,\n })\n const symbol = kind === 'monetary' || kind === 'perShare' ? (fmt.symbol ?? '') : ''\n const suffix = kind === 'percent' ? '%' : ''\n return scaled < 0 ? `${symbol}(${abs}${suffix})` : `${symbol}${abs}${suffix}`\n}\n","/**\n * The SEC adapter — reconstructs a report from the live SEC EDGAR graph\n * (`graph_id = \"sec\"`) via read-only Cypher, one section at a time.\n *\n * A single SEC filing is a large graph: a 10-K is ~90 `Structure`s (the 5 core\n * statements plus dozens of disclosure/document networks), thousands of facts.\n * Loading the whole thing up front is slow, so this module splits the work:\n *\n * - `fetchSecReportShell` — one fast pass that returns the entity + the ordered\n * **section list** (each `Structure` with its title, kind, and factset ids).\n * - `fetchSecSection` — on demand, the facts + presentation/calculation network\n * for **one** section, assembled into a single-section `NormalizedReport` the\n * shared projection/components render unchanged.\n *\n * The library stays transport-agnostic: the caller injects a `SecQuery` (a thin\n * wrapper over `POST /v1/graphs/sec/query`); this module owns only the Cypher and\n * the row → model mapping.\n *\n * ── Query rules (load-bearing; verified against the live graph) ────────────────\n * These are not stylistic — violating them turns a ~120 ms query into a ~14 s one:\n * 1. **Anchor on a primary key.** Lead per-section queries with a direct\n * `{identifier: $id}` match on `FactSet`/`Structure` (indexed). Never expand a\n * whole `Report`'s facts, and never use `WHERE x.identifier IN [list]` (a scan,\n * not an index probe) — issue one query per factset instead.\n * 3. **Always carry a `WHERE f.value IS NOT NULL` predicate** on the fact scan and\n * **always `LIMIT`.** Both flip the planner onto the fast path (~120 ms vs ~7 s).\n * `value` (the raw string) is present on every fact, so this keeps numeric and\n * text facts alike.\n * 4. **No `OPTIONAL MATCH`.** An optional unit join alone cost ~12 s; units come\n * from a separate required-join query, merged client-side.\n * 5. Aggregations must `ORDER BY <alias>` (not `s.number`); `end` is reserved, so\n * alias every `p.end_date AS end_date`.\n */\nimport { humanize, qname as toQname } from '../constants'\nimport { currencySymbolFor } from '../format'\nimport type {\n CalcAssociation,\n DimensionQualifier,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n NumericKind,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\n\n/** Injected transport — runs a read-only Cypher query and returns its rows. */\nexport type SecQuery = (\n cypher: string,\n params?: Record<string, unknown>\n) => Promise<Array<Record<string, unknown>>>\n\n/** One navigable section of a filing (a `Structure` + its facts). */\nexport interface SecSection {\n /** `Structure.identifier` — the section id + the anchor for its associations. */\n id: string\n /** Human title, e.g. \"Consolidated Balance Sheets\" (definition prefix stripped). */\n title: string\n /** Coarse grouping for the table of contents. */\n kind: 'Statement' | 'Disclosure' | 'Document' | 'Cover' | 'Other'\n /** `canonical_type` when the section is a recognized core statement, else null. */\n canonicalType: string | null\n /** Filing sequence (position in the ordered section list). */\n order: number\n /** `FactSet.identifier`s whose facts belong to this section. */\n factsetIds: string[]\n}\n\n/** The fast first read: entity + the ordered section list, no fact bodies. */\nexport interface SecReportShell {\n reportId: string\n entity: EntityInfo | null\n sections: SecSection[]\n}\n\n// ── Cypher ────────────────────────────────────────────────────────────────────\n\nconst ENTITY_META_Q = `\nMATCH (ent:Entity)-[:ENTITY_HAS_REPORT]->(r:Report {identifier: $rid})\nRETURN ent.identifier AS entity_id, ent.name AS entity_name,\n ent.legal_name AS legal_name, ent.cik AS cik, ent.ticker AS ticker,\n r.form AS form, r.report_date AS report_date`\n\n// Structures reachable from this report's facts, with their factsets. Dimensional\n// facts belong to the same factsets as their consolidated totals, so no\n// `has_dimensions` filter is needed — dropping it also surfaces sections whose\n// content is entirely dimensional (e.g. Schedule II). ORDER BY the alias (Kùzu\n// requires it once `collect` aggregates).\nconst SECTIONS_Q = `\nMATCH (r:Report {identifier: $rid})-[:REPORT_HAS_FACT]->(f:Fact)<-[:FACT_SET_CONTAINS_FACT]-(fs:FactSet)<-[:STRUCTURE_HAS_FACT_SET]-(s:Structure)\nRETURN s.identifier AS sid, s.canonical_type AS canonical_type,\n s.definition AS definition, s.number AS number,\n collect(DISTINCT fs.identifier) AS factsets\nORDER BY number`\n\n// Facts for one factset. Anchored on the factset PK; dimensional and consolidated\n// facts alike come through — the pivot engine keys cells by the full aspect\n// signature (element + period + dimensional coordinate), so segment/component\n// breakdowns no longer collide with the total. Element type signals\n// (`item_type`, `is_shares`) drive the value's numeric kind (monetary / per-share\n// / shares). `WHERE f.value IS NOT NULL` + `LIMIT` keep it on the fast path and\n// retain text facts (Cover Page etc.).\nconst FACTS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_ELEMENT]->(e:Element),\n (f)-[:FACT_HAS_PERIOD]->(p:Period)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, e.qname AS qname, e.name AS ename, e.balance AS balance,\n e.period_type AS e_period_type, e.is_abstract AS is_abstract, e.is_numeric AS is_numeric,\n e.item_type AS item_type, e.is_shares AS is_shares,\n f.numeric_value AS numeric_value, f.value AS raw_value, f.decimals AS decimals,\n p.identifier AS pid, p.period_type AS period_type,\n p.start_date AS start_date, p.end_date AS end_date\nLIMIT 2000`\n\n// Unit measures for the same factset, as a separate required-join query — an\n// OPTIONAL unit join on the facts query alone cost ~12 s.\nconst UNITS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_UNIT]->(u:Unit)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, u.measure AS unit\nLIMIT 2000`\n\n// Dimensional qualifiers for the same factset — again a separate required-join\n// query (never OPTIONAL) so a fact with no dimensions simply contributes no rows.\n// One row per (fact, axis); a multi-axis fact yields several, merged client-side.\nconst DIMS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_DIMENSION]->(d:Dimension)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, d.axis AS axis, d.member AS member,\n d.axis_uri AS axis_uri, d.member_uri AS member_uri,\n d.is_explicit AS is_explicit, d.is_typed AS is_typed\nLIMIT 4000`\n\n// The presentation + calculation networks for one section, anchored on the\n// Structure PK. `association_type` is `Presentation` / `Calculation`. Element\n// names + `is_abstract` come along so presentation-only nodes (abstract section\n// headers, which carry no facts) can be registered — without them the projection\n// can't tell a header from a concrete line and mis-orders it.\nconst ASSOC_Q = `\nMATCH (s:Structure {identifier: $sid})-[:STRUCTURE_HAS_ASSOCIATION]->(a:Association),\n (a)-[:ASSOCIATION_HAS_FROM_ELEMENT]->(pe:Element),\n (a)-[:ASSOCIATION_HAS_TO_ELEMENT]->(ce:Element)\nRETURN a.association_type AS association_type, a.order_value AS order_value, a.weight AS weight,\n pe.qname AS parent, pe.name AS parent_name, pe.is_abstract AS parent_abstract,\n ce.qname AS child, ce.name AS child_name, ce.is_abstract AS child_abstract`\n\n// ── Row helpers ────────────────────────────────────────────────────────────────\n\nfunction str(row: Record<string, unknown>, key: string): string | null {\n const v = row[key]\n return typeof v === 'string' && v !== '' ? v : v == null ? null : String(v)\n}\n\nfunction num(row: Record<string, unknown>, key: string): number | null {\n const v = row[key]\n if (v === null || v === undefined || v === '') return null\n const n = typeof v === 'number' ? v : Number(v)\n return Number.isNaN(n) ? null : n\n}\n\nfunction bool(row: Record<string, unknown>, key: string): boolean {\n const v = row[key]\n return v === true || v === 'true'\n}\n\nfunction periodType(raw: string | null): PeriodType | null {\n return raw === 'instant' || raw === 'duration' ? raw : null\n}\n\n/**\n * A prefixed qname for a dimension axis/member from its versioned XBRL IRI + local\n * name (`http://fasb.org/us-gaap/2025#…Member` + `…Member` → `us-gaap:…Member`).\n * The graph gives axis/member as bare local names; this keeps them consistent with\n * the `Element.qname`s used in the presentation network (so member ordering lines\n * up), and cell matching is internally consistent regardless (row + column derive\n * from the same mapping).\n */\nfunction xbrlQname(uri: string | null, local: string | null): string {\n if (local) {\n const ns = (uri ?? '').split('#')[0]\n if (/fasb\\.org\\/us-gaap/.test(ns)) return `us-gaap:${local}`\n if (/fasb\\.org\\/srt/.test(ns)) return `srt:${local}`\n if (/xbrl\\.sec\\.gov\\/dei/.test(ns)) return `dei:${local}`\n if (/robosystems\\.ai\\/taxonomy\\/rs-gaap/.test(ns)) return `rs-gaap:${local}`\n return local\n }\n return uri ? toQname(uri) : ''\n}\n\n/** Humanize an axis/member local name, dropping the XBRL `Axis`/`Member`/`Domain` suffix. */\nfunction dimLabel(local: string | null): string {\n if (!local) return ''\n return humanize(local.replace(/(Axis|Member|Domain)$/, '')) || humanize(local)\n}\n\n/**\n * Classify an element's numeric kind from its XBRL `item_type` (+ `is_shares`).\n * Per-share and share counts opt out of monetary rescaling; strings/text are not\n * numeric. Checked before monetary because share/per-share types are also numeric.\n */\nfunction deriveNumericKind(row: Record<string, unknown>): NumericKind | undefined {\n const itemType = str(row, 'item_type') ?? ''\n if (/perShareItemType/i.test(itemType)) return 'perShare'\n if (/sharesItemType/i.test(itemType) || bool(row, 'is_shares')) return 'shares'\n // A percentItemType stores a decimal fraction (0.10 → 10%); a pureItemType is a\n // bare dimensionless ratio (2.5 debt-to-equity), NOT a percentage.\n if (/percentItemType/i.test(itemType)) return 'percent'\n if (/pureItemType/i.test(itemType)) return 'pure'\n if (/monetaryItemType/i.test(itemType)) return 'monetary'\n if (/integerItemType/i.test(itemType)) return 'integer'\n if (!bool(row, 'is_numeric')) return undefined\n // No item_type (older captures): a debit/credit balance marks a monetary item.\n const balance = str(row, 'balance')\n return balance === 'debit' || balance === 'credit' ? 'monetary' : 'other'\n}\n\n/**\n * The primary financial statements. Only these `canonical_type`s belong in the\n * TOC's \"Financial Statements\" group — other canonical types (rollforwards,\n * hierarchies, `(Details)` networks) are disclosures, classified by their\n * definition's type word instead.\n */\nconst CORE_STATEMENT_TYPES = new Set([\n 'balance_sheet',\n 'income_statement',\n 'cash_flow_statement',\n 'equity_statement',\n 'comprehensive_income',\n])\n\n/**\n * Split an XBRL `Structure.definition` into a human title + a coarse kind.\n * Definitions look like `\"9952153 - Statement - Consolidated Balance Sheets\"` or\n * `\"0000001 - Document - Cover Page\"` — a `\"NNNN - <Type> - <Title>\"` shape whose\n * middle word (Statement / Disclosure / Document) drives the kind. A core\n * canonical statement always reads as a Statement so the primaries group cleanly.\n */\nexport function parseStructureDefinition(\n definition: string | null,\n canonicalType: string | null\n): { title: string; kind: SecSection['kind'] } {\n const raw = (definition ?? '').trim()\n const parts = raw.split(' - ')\n let type = ''\n let title = raw\n if (parts.length >= 3) {\n type = parts[1].trim()\n title = parts.slice(2).join(' - ').trim()\n } else if (parts.length === 2) {\n title = parts[1].trim()\n }\n\n let kind: SecSection['kind'] = 'Other'\n if (/cover/i.test(title)) kind = 'Cover'\n else if (type === 'Statement') kind = 'Statement'\n else if (type === 'Disclosure') kind = 'Disclosure'\n else if (type === 'Document') kind = 'Document'\n // A core statement is always a Statement; a non-core canonical type (e.g.\n // GoodwillRollForward) stays whatever its definition type word made it.\n if (canonicalType && CORE_STATEMENT_TYPES.has(canonicalType)) kind = 'Statement'\n\n return { title: title || raw || canonicalType || 'Section', kind }\n}\n\n// ── Shell ───────────────────────────────────────────────────────────────────\n\nfunction mapEntity(row: Record<string, unknown> | undefined): EntityInfo | null {\n if (!row) return null\n const id = str(row, 'entity_id')\n if (!id) return null\n return {\n id,\n name: str(row, 'entity_name') ?? str(row, 'legal_name') ?? 'Entity',\n legalName: str(row, 'legal_name'),\n country: null,\n }\n}\n\n/** Fetch the entity + ordered section list for a report (the fast first read). */\nexport async function fetchSecReportShell(\n query: SecQuery,\n reportId: string\n): Promise<SecReportShell> {\n const [entityRows, sectionRows] = await Promise.all([\n query(ENTITY_META_Q, { rid: reportId }),\n query(SECTIONS_Q, { rid: reportId }),\n ])\n\n const sections: SecSection[] = sectionRows\n .map((row, order): SecSection => {\n const { title, kind } = parseStructureDefinition(\n str(row, 'definition'),\n str(row, 'canonical_type')\n )\n const factsets = Array.isArray(row.factsets)\n ? (row.factsets as unknown[]).filter((v): v is string => typeof v === 'string')\n : []\n return {\n id: str(row, 'sid') ?? '',\n title,\n kind,\n canonicalType: str(row, 'canonical_type'),\n order,\n factsetIds: factsets,\n }\n })\n .filter((s) => s.id && s.factsetIds.length > 0)\n\n return { reportId, entity: mapEntity(entityRows[0]), sections }\n}\n\n// ── Single section ────────────────────────────────────────────────────────────\n\nfunction accumulateElement(elements: Record<string, ElementInfo>, row: Record<string, unknown>) {\n const q = str(row, 'qname')\n if (!q || elements[q]) return\n const balance = str(row, 'balance')\n elements[q] = {\n id: q,\n qname: q,\n label: str(row, 'ename') ? humanize(str(row, 'ename') as string) : humanize(q),\n balance: balance === 'debit' || balance === 'credit' ? balance : null,\n periodType: periodType(str(row, 'e_period_type')),\n abstract: bool(row, 'is_abstract'),\n monetary: bool(row, 'is_numeric'),\n numericKind: deriveNumericKind(row),\n }\n}\n\n/**\n * Register a presentation-network element that has no facts of its own — chiefly\n * an abstract section header. Fact-bearing elements are already registered from\n * the facts query and take precedence (this no-ops on existing keys); this fills\n * in the abstract headers so the projection renders them as headers above their\n * section rather than as empty concrete rows below it. Abstract labels drop the\n * XBRL `Abstract` suffix (`OperatingExpensesAbstract` → `Operating Expenses`).\n */\nfunction registerPresentationElement(\n elements: Record<string, ElementInfo>,\n qname: string | null,\n name: string | null,\n isAbstract: boolean\n): void {\n if (!qname || elements[qname]) return\n elements[qname] = {\n id: qname,\n qname,\n label: name ? humanize(isAbstract ? name.replace(/Abstract$/, '') : name) : humanize(qname),\n balance: null,\n periodType: null,\n abstract: isAbstract,\n monetary: false,\n }\n}\n\nfunction accumulatePeriod(periods: Record<string, PeriodInfo>, row: Record<string, unknown>) {\n const id = str(row, 'pid')\n if (!id || periods[id]) return\n const type = periodType(str(row, 'period_type')) ?? 'duration'\n const startDate = str(row, 'start_date')\n const endDate = str(row, 'end_date')\n periods[id] = {\n id,\n type,\n instant: type === 'instant' ? endDate : null,\n startDate,\n endDate,\n end: endDate ?? '',\n }\n}\n\n/**\n * Load one section into a single-section `NormalizedReport`. All of the\n * section's facts are re-keyed to the structure id as their `factSet`, so the\n * projection groups them as one Information Block regardless of how many raw\n * FactSets the filing split them across.\n */\nexport async function fetchSecSection(\n query: SecQuery,\n shell: SecReportShell,\n section: SecSection\n): Promise<NormalizedReport> {\n const [factRowGroups, unitRowGroups, dimRowGroups, assocRows] = await Promise.all([\n Promise.all(section.factsetIds.map((fsid) => query(FACTS_Q, { fsid }))),\n Promise.all(section.factsetIds.map((fsid) => query(UNITS_Q, { fsid }))),\n Promise.all(section.factsetIds.map((fsid) => query(DIMS_Q, { fsid }))),\n query(ASSOC_Q, { sid: section.id }),\n ])\n\n const unitByFid = new Map<string, string>()\n for (const row of unitRowGroups.flat()) {\n const fid = str(row, 'fid')\n const measure = str(row, 'unit')\n if (fid && measure) unitByFid.set(fid, measure)\n }\n\n // One fact can carry several axes; collect its qualifiers (ordered by axis).\n const dimsByFid = new Map<string, DimensionQualifier[]>()\n for (const row of dimRowGroups.flat()) {\n const fid = str(row, 'fid')\n if (!fid) continue\n const memberLocal = str(row, 'member')\n const qual: DimensionQualifier = {\n axis: xbrlQname(str(row, 'axis_uri'), str(row, 'axis')),\n member: memberLocal ? xbrlQname(str(row, 'member_uri'), memberLocal) : null,\n axisLabel: dimLabel(str(row, 'axis')),\n memberLabel: dimLabel(memberLocal),\n explicit: bool(row, 'is_explicit'),\n typedValue: bool(row, 'is_typed') ? str(row, 'member') : null,\n }\n const list = dimsByFid.get(fid) ?? []\n list.push(qual)\n dimsByFid.set(fid, list)\n }\n for (const list of dimsByFid.values()) list.sort((a, b) => a.axis.localeCompare(b.axis))\n\n const elements: Record<string, ElementInfo> = {}\n const periods: Record<string, PeriodInfo> = {}\n const units: Record<string, UnitInfo> = {}\n const facts: Fact[] = []\n const seenFacts = new Set<string>()\n\n for (const row of factRowGroups.flat()) {\n const fid = str(row, 'fid')\n const element = str(row, 'qname')\n const period = str(row, 'pid')\n if (!fid || !element || !period || seenFacts.has(fid)) continue\n seenFacts.add(fid)\n\n accumulateElement(elements, row)\n accumulatePeriod(periods, row)\n\n const measure = unitByFid.get(fid) ?? null\n if (measure && !units[measure]) {\n const compact = toQname(measure)\n units[measure] = {\n id: measure,\n measure: compact,\n label: compact.includes(':') ? (compact.split(':').pop() as string) : compact,\n symbol: currencySymbolFor(compact),\n }\n }\n\n const value = num(row, 'numeric_value')\n facts.push({\n id: fid,\n element,\n period,\n unit: measure,\n entity: shell.entity?.id ?? null,\n factSet: section.id,\n value,\n decimals: str(row, 'decimals'),\n textValue: value === null ? str(row, 'raw_value') : null,\n dimensions: dimsByFid.get(fid),\n })\n }\n\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n for (const row of assocRows) {\n const parent = str(row, 'parent')\n const child = str(row, 'child')\n if (!parent || !child) continue\n // Register presentation-only elements (abstract section headers carry no\n // facts, so the facts query never saw them). Fact-bearing elements are\n // already registered and unaffected — registration no-ops on existing keys.\n registerPresentationElement(\n elements,\n parent,\n str(row, 'parent_name'),\n bool(row, 'parent_abstract')\n )\n registerPresentationElement(\n elements,\n child,\n str(row, 'child_name'),\n bool(row, 'child_abstract')\n )\n const order = num(row, 'order_value') ?? 0\n const type = str(row, 'association_type')?.toLowerCase()\n if (type === 'calculation') {\n calcAssociations.push({\n parent,\n child,\n weight: num(row, 'weight') ?? 1,\n order,\n role: null,\n structure: section.id,\n })\n } else if (type === 'presentation') {\n presAssociations.push({ parent, child, order, role: null, structure: section.id })\n }\n }\n\n const informationBlock: InformationBlock = {\n id: section.id,\n blockType: section.canonicalType ?? '',\n factSet: section.id,\n label: section.title,\n structureId: section.id,\n }\n const structure: StructureInfo = {\n id: section.id,\n blockType: section.canonicalType ?? '',\n roleUri: null,\n structureName: section.title,\n order: section.order,\n }\n\n return {\n reportId: shell.reportId,\n reportIri: null,\n entity: shell.entity,\n informationBlocks: [informationBlock],\n structures: [structure],\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n\n/** Merge single-section reports into one whole-report model (order preserved). */\nexport function mergeSecSections(\n shell: SecReportShell,\n sections: NormalizedReport[]\n): NormalizedReport {\n const elements: Record<string, ElementInfo> = {}\n const periods: Record<string, PeriodInfo> = {}\n const units: Record<string, UnitInfo> = {}\n const informationBlocks: InformationBlock[] = []\n const structures: StructureInfo[] = []\n const facts: Fact[] = []\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n\n for (const part of sections) {\n Object.assign(elements, part.elements)\n Object.assign(periods, part.periods)\n Object.assign(units, part.units)\n informationBlocks.push(...part.informationBlocks)\n structures.push(...part.structures)\n facts.push(...part.facts)\n calcAssociations.push(...part.calcAssociations)\n presAssociations.push(...part.presAssociations)\n }\n\n return {\n reportId: shell.reportId,\n reportIri: null,\n entity: shell.entity,\n informationBlocks,\n structures,\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n","/**\n * The cypher adapter — a whole-report `ReportAdapter` over the live SEC graph.\n *\n * This is a convenience wrapper: it loads the section list, then every section,\n * and merges them into one `NormalizedReport`. Apps that want responsive,\n * lazy-per-section loading should call `fetchSecReportShell` + `fetchSecSection`\n * directly (see `./sec`) rather than materializing a whole filing up front.\n */\nimport type { SecQuery } from './sec'\nimport { fetchSecReportShell, fetchSecSection, mergeSecSections } from './sec'\nimport type { ReportAdapter } from './types'\n\nexport interface CypherAdapterConfig {\n /** Injected transport over `POST /v1/graphs/{graphId}/query` (auth lives here). */\n query: SecQuery\n /** The report to materialize — a `Report.identifier`. */\n reportId: string\n}\n\nexport function cypherAdapter(config: CypherAdapterConfig): ReportAdapter {\n return {\n source: `sec:${config.reportId}`,\n load: async () => {\n const shell = await fetchSecReportShell(config.query, config.reportId)\n const sections = await Promise.all(\n shell.sections.map((section) => fetchSecSection(config.query, shell, section))\n )\n return mergeSecSections(shell, sections)\n },\n }\n}\n","/**\n * The shared quad-store → `NormalizedReport` traversal.\n *\n * An adapter fills an N3 quad `Store` from its source, then hands it here. The\n * store is read as a **union** across its graphs (`graph = null`) — the\n * scene/boundary/projection partition is a publication concern, not a rendering\n * one, so the join is identical however the quads arrived (a dataset-form\n * JSON-LD holon, a flat graph, …). No SPARQL engine is required; only store\n * traversal. The only per-source code is how the store gets filled.\n */\nimport { DataFactory, Store } from 'n3'\nimport { IRI, humanize, qname } from '../constants'\nimport type {\n CalcAssociation,\n DimensionQualifier,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n NumericKind,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\n\n/**\n * The holon's value-domain `rs:itemType` maps 1:1 onto the numeric kinds that\n * drive formatting/scale. perShare and shares never rescale by the statement\n * factor (else e.g. an EPS of $0.04 in a thousands-scaled statement rounds to\n * 0); percent/pure/integer format distinctly. Text/date/boolean/decimal have no\n * numeric kind — the formatter falls back to monetary-or-other.\n */\nfunction numericKindFromItemType(itemType: string | undefined): NumericKind | undefined {\n switch (itemType) {\n case 'monetary':\n return 'monetary'\n case 'perShare':\n return 'perShare'\n case 'shares':\n return 'shares'\n case 'percent':\n return 'percent'\n case 'pure':\n return 'pure'\n case 'integer':\n return 'integer'\n default:\n return undefined\n }\n}\n\nconst { namedNode } = DataFactory\n\nfunction makeReaders(store: Store) {\n const objects = (s: string, p: string) => store.getObjects(namedNode(s), namedNode(p), null)\n const firstValue = (s: string, p: string): string | null => {\n const os = objects(s, p)\n return os.length ? os[0].value : null\n }\n const subjectsOfType = (type: string): string[] =>\n store.getSubjects(namedNode(IRI.type), namedNode(type), null).map((t) => t.value)\n return { objects, firstValue, subjectsOfType }\n}\n\nfunction toNumber(raw: string | null): number | null {\n if (raw === null || raw === '') return null\n const n = Number(raw)\n return Number.isNaN(n) ? null : n\n}\n\n/** Traverse a populated quad `Store` into the normalized report model. */\nexport function parseStore(store: Store): NormalizedReport {\n const { objects, firstValue, subjectsOfType } = makeReaders(store)\n\n // ── Elements ──\n const elements: Record<string, ElementInfo> = {}\n for (const id of subjectsOfType(IRI.Element)) {\n const balance = firstValue(id, IRI.balance)\n const periodType = firstValue(id, IRI.periodType)\n const itemType = firstValue(id, IRI.itemType) ?? undefined\n elements[id] = {\n id,\n qname: qname(id),\n label: firstValue(id, IRI.prefLabel) ?? humanize(id),\n balance: balance === 'debit' || balance === 'credit' ? balance : null,\n periodType: periodType === 'instant' || periodType === 'duration' ? periodType : null,\n abstract: firstValue(id, IRI.abstract) === 'true',\n monetary: firstValue(id, IRI.monetary) === 'true',\n itemType,\n numericKind: numericKindFromItemType(itemType),\n }\n }\n\n // ── Periods ──\n const periods: Record<string, PeriodInfo> = {}\n for (const id of subjectsOfType(IRI.Period)) {\n const declared = firstValue(id, IRI.periodType)\n const instant = firstValue(id, IRI.instant)\n const startDate = firstValue(id, IRI.startDate)\n const endDate = firstValue(id, IRI.endDate)\n const type: PeriodType =\n declared === 'instant'\n ? 'instant'\n : declared === 'duration'\n ? 'duration'\n : instant\n ? 'instant'\n : 'duration'\n const end = (type === 'instant' ? instant : endDate) ?? instant ?? endDate ?? ''\n periods[id] = { id, type, instant, startDate, endDate, end }\n }\n\n // ── Units ──\n const units: Record<string, UnitInfo> = {}\n for (const id of subjectsOfType(IRI.Unit)) {\n const measureTerm = objects(id, IRI.measure)[0]\n const measure = measureTerm ? qname(measureTerm.value) : 'unknown'\n units[id] = {\n id,\n measure,\n label: measure.includes(':') ? (measure.split(':').pop() as string) : measure,\n }\n }\n\n // ── Entity ──\n let entity: EntityInfo | null = null\n const entityIds = subjectsOfType(IRI.Entity)\n if (entityIds.length) {\n const id = entityIds[0]\n entity = {\n id,\n name: firstValue(id, IRI.prefLabel) ?? firstValue(id, IRI.legalName) ?? 'Entity',\n legalName: firstValue(id, IRI.legalName),\n country: firstValue(id, IRI.country),\n }\n }\n\n // ── Facts ──\n const facts: Fact[] = []\n for (const id of subjectsOfType(IRI.Fact)) {\n // Dimensional coordinate (rs:dimension -> rs:Dimension {axis, member, ...}).\n // Without this every fact reads as consolidated, so a segment breakdown\n // collapses onto the face-statement cell and can overwrite the real total.\n const dimensions: DimensionQualifier[] = []\n for (const d of objects(id, IRI.dimension)) {\n const axis = firstValue(d.value, IRI.axis)\n if (!axis) continue\n const member = firstValue(d.value, IRI.member)\n const typedValue = firstValue(d.value, IRI.typedValue)\n dimensions.push({\n axis,\n member: member ?? null,\n axisLabel: elements[axis]?.label ?? humanize(axis),\n memberLabel: member ? (elements[member]?.label ?? humanize(member)) : (typedValue ?? ''),\n explicit: firstValue(d.value, IRI.isExplicit) === 'true',\n typedValue: typedValue ?? null,\n })\n }\n facts.push({\n id,\n element: firstValue(id, IRI.element) ?? '',\n period: firstValue(id, IRI.period) ?? '',\n unit: firstValue(id, IRI.unit),\n entity: firstValue(id, IRI.entity),\n factSet: firstValue(id, IRI.factSet),\n value: toNumber(firstValue(id, IRI.numericValue)),\n textValue: firstValue(id, IRI.stringValue),\n decimals: firstValue(id, IRI.decimals),\n dimensions: dimensions.length ? dimensions : undefined,\n })\n }\n\n // ── Information Blocks ──\n const informationBlocks: InformationBlock[] = []\n for (const id of subjectsOfType(IRI.InformationBlock)) {\n informationBlocks.push({\n id,\n blockType: firstValue(id, IRI.blockType) ?? '',\n // Match a block to its structure by identity (the rs:structure link),\n // not by a semantic blockType — a full-fidelity holon carries no\n // block-type classification, so structureId is how row order is found.\n structureId: firstValue(id, IRI.structure) ?? undefined,\n factSet: firstValue(id, IRI.factSet),\n label: firstValue(id, IRI.prefLabel),\n })\n }\n\n // ── Structures + association → structure membership ──\n const structures: StructureInfo[] = []\n const assocStructure = new Map<string, string>()\n for (const id of subjectsOfType(IRI.Structure)) {\n structures.push({\n id,\n blockType: firstValue(id, IRI.blockType) ?? '',\n roleUri: firstValue(id, IRI.roleUri),\n structureName: firstValue(id, IRI.structureName),\n // Filing sequence (SEC role-definition number) so buildPivots orders all\n // sections by the filer's order rather than the fixed four-primary fallback.\n order: toNumber(firstValue(id, IRI.structureOrder)) ?? undefined,\n })\n for (const assoc of objects(id, IRI.hasAssociation)) {\n assocStructure.set(assoc.value, id)\n }\n }\n\n // ── Associations ──\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n for (const id of subjectsOfType(IRI.Association)) {\n const parent = firstValue(id, IRI.from)\n const child = firstValue(id, IRI.to)\n if (!parent || !child) continue\n const type = firstValue(id, IRI.associationType)\n const order = toNumber(firstValue(id, IRI.order)) ?? 0\n const role = firstValue(id, IRI.role)\n const structure = assocStructure.get(id) ?? null\n if (type === 'calculation') {\n calcAssociations.push({\n parent,\n child,\n weight: toNumber(firstValue(id, IRI.weight)) ?? 1,\n order,\n role,\n structure,\n })\n } else if (type === 'presentation') {\n presAssociations.push({ parent, child, order, role, structure })\n }\n }\n\n // ── Report IRI / id ──\n // Prefer the named-graph name (`<report>#scene` → `<report>`) — present in a\n // dataset-form holon. Fall back to the `rs:Report` subject so a flat,\n // single-graph document still resolves its identity.\n let reportIri: string | null = null\n for (const graph of store.getGraphs(null, null, null)) {\n const hash = graph.value.indexOf('#')\n if (hash > 0) {\n reportIri = graph.value.slice(0, hash)\n break\n }\n }\n if (!reportIri) {\n const reports = subjectsOfType(IRI.Report)\n reportIri = reports.length ? reports[0] : null\n }\n const reportId = reportIri ? (reportIri.split('/').pop() ?? null) : null\n\n return {\n reportId,\n reportIri,\n entity,\n informationBlocks,\n structures,\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n","/**\n * The `holon.jsonld` adapter — offline, no backend, no auth.\n *\n * The canonical, API-native holon: **dataset-form JSON-LD** carrying the three\n * named graphs (`#scene`, `#boundary`, `#projection`) as `@id` + nested\n * `@graph`. JSON is native to the RoboSystems JSON API, so this is the one\n * holon file format.\n *\n * N3.js doesn't parse JSON-LD, so this adapter uses the `jsonld` processor to\n * expand the document to N-Quads (which preserves the named-graph labels),\n * parses those into an N3 quad `Store`, and delegates to the shared\n * `parseStore` traversal (`store.ts`).\n */\nimport type { JsonLdDocument } from 'jsonld'\nimport jsonld from 'jsonld'\nimport { Parser, Store } from 'n3'\nimport type { NormalizedReport } from '../model'\nimport { parseStore } from './store'\nimport type { ReportAdapter } from './types'\n\n/** Parse a `holon.jsonld` document (string or parsed object) into the model. */\nexport async function parseJsonld(doc: string | object): Promise<NormalizedReport> {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as JsonLdDocument\n // `toRDF` with the n-quads format returns a serialized string; each quad\n // carries its graph label, so the holon's named graphs survive the expansion.\n const nquads = (await jsonld.toRDF(json, { format: 'application/n-quads' })) as string\n const store = new Store(new Parser({ format: 'application/n-quads' }).parse(nquads))\n return parseStore(store)\n}\n\n/** A `ReportAdapter` over an in-memory `holon.jsonld` document. */\nexport function jsonldFileAdapter(doc: string | object, source = 'holon.jsonld'): ReportAdapter {\n return {\n source,\n load: () => parseJsonld(doc),\n }\n}\n"]}
|
|
@@ -41,6 +41,12 @@ interface ElementInfo {
|
|
|
41
41
|
* to `monetary ? 'monetary' : 'other'`.
|
|
42
42
|
*/
|
|
43
43
|
numericKind?: NumericKind;
|
|
44
|
+
/**
|
|
45
|
+
* Value domain (`rs:itemType`): `textBlock` / `monetary` / `shares` / `decimal`
|
|
46
|
+
* / `date` / `boolean` / `string`. `textBlock` marks an element whose facts are
|
|
47
|
+
* rendered HTML disclosures — orthogonal to elementType's structural role.
|
|
48
|
+
*/
|
|
49
|
+
itemType?: string;
|
|
44
50
|
}
|
|
45
51
|
/** A reporting period — an instant (balance sheet) or a duration (flows). */
|
|
46
52
|
interface PeriodInfo {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { N as NumericKind, P as PeriodInfo, E as ElementInfo, a as NormalizedReport, I as InformationBlock, b as PivotConfig, c as PivotTable, d as PivotRow, U as UnitInfo } from './index-
|
|
2
|
-
export { A as AspectKey, B as BalanceType, C as CalcAssociation, e as CypherAdapterConfig, D as DimensionQualifier, f as EntityInfo, F as Fact, g as PeriodType, h as PivotCell, i as PivotColumn, j as PivotColumnHeader, k as PivotSlicer, l as PresAssociation, R as ReportAdapter, m as ResolvedScale, n as RowCell, S as Scale, o as SecQuery, p as SecReportShell, q as SecSection, r as Statement, s as StatementColumn, t as StatementRow, u as StructureInfo, v as cypherAdapter, w as fetchSecReportShell, x as fetchSecSection, y as jsonldFileAdapter, z as mergeSecSections, G as parseJsonld, H as parseStore, J as parseStructureDefinition } from './index-
|
|
1
|
+
import { N as NumericKind, P as PeriodInfo, E as ElementInfo, a as NormalizedReport, I as InformationBlock, b as PivotConfig, c as PivotTable, d as PivotRow, U as UnitInfo } from './index-BS6_6h3l.js';
|
|
2
|
+
export { A as AspectKey, B as BalanceType, C as CalcAssociation, e as CypherAdapterConfig, D as DimensionQualifier, f as EntityInfo, F as Fact, g as PeriodType, h as PivotCell, i as PivotColumn, j as PivotColumnHeader, k as PivotSlicer, l as PresAssociation, R as ReportAdapter, m as ResolvedScale, n as RowCell, S as Scale, o as SecQuery, p as SecReportShell, q as SecSection, r as Statement, s as StatementColumn, t as StatementRow, u as StructureInfo, v as cypherAdapter, w as fetchSecReportShell, x as fetchSecSection, y as jsonldFileAdapter, z as mergeSecSections, G as parseJsonld, H as parseStore, J as parseStructureDefinition } from './index-BS6_6h3l.js';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import 'n3';
|
|
5
5
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { formatDate, BLOCK_TITLES, numericKindOf, humanizeDuration, formatValue, formatPeriod, isExternalFactUrl, BLOCK_ORDER, humanize, qname, currencySymbolFor } from './chunk-
|
|
2
|
-
export { BLOCK_ORDER, BLOCK_TITLES, NS, currencySymbolFor, cypherAdapter, fetchSecReportShell, fetchSecSection, formatDate, formatMoney, formatPeriod, formatValue, humanize, humanizeDuration, isExternalFactUrl, jsonldFileAdapter, mergeSecSections, numericKindOf, parseJsonld, parseStore, parseStructureDefinition, qname } from './chunk-
|
|
1
|
+
import { formatDate, BLOCK_TITLES, numericKindOf, humanizeDuration, formatValue, formatPeriod, isExternalFactUrl, BLOCK_ORDER, humanize, qname, currencySymbolFor } from './chunk-YGY4JINO.js';
|
|
2
|
+
export { BLOCK_ORDER, BLOCK_TITLES, NS, currencySymbolFor, cypherAdapter, fetchSecReportShell, fetchSecSection, formatDate, formatMoney, formatPeriod, formatValue, humanize, humanizeDuration, isExternalFactUrl, jsonldFileAdapter, mergeSecSections, numericKindOf, parseJsonld, parseStore, parseStructureDefinition, qname } from './chunk-YGY4JINO.js';
|
|
3
3
|
import { useState, useEffect, useMemo, useRef } from 'react';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -424,9 +424,11 @@ function buildPivot(model, ib, config = defaultPivotConfig(model, ib)) {
|
|
|
424
424
|
}
|
|
425
425
|
}
|
|
426
426
|
const columnHeaders = headerLevels(columnSegs);
|
|
427
|
+
const shownAxes = /* @__PURE__ */ new Set([...rowDimAxes, ...colDimAxes]);
|
|
427
428
|
const factIndex = /* @__PURE__ */ new Map();
|
|
428
429
|
for (const f of facts) {
|
|
429
430
|
const byAxis = memberByAxis(f);
|
|
431
|
+
if ([...byAxis.keys()].some((axis) => !shownAxes.has(axis))) continue;
|
|
430
432
|
const end = model.periods[f.period]?.end ?? "";
|
|
431
433
|
const rowSig = coordinate(byAxis, rowDimAxes);
|
|
432
434
|
const colSig = coordinate(byAxis, colDimAxes);
|
|
@@ -583,6 +585,9 @@ function wrapHtml(body) {
|
|
|
583
585
|
a { color: #1d4ed8; }
|
|
584
586
|
</style></head><body>${body}</body></html>`;
|
|
585
587
|
}
|
|
588
|
+
function InlineTextBlock({ html }) {
|
|
589
|
+
return /* @__PURE__ */ jsx(SandboxedHtml, { html });
|
|
590
|
+
}
|
|
586
591
|
function SandboxedHtml({ html }) {
|
|
587
592
|
const ref = useRef(null);
|
|
588
593
|
const fit = () => {
|
|
@@ -994,6 +999,17 @@ function StatementTable({
|
|
|
994
999
|
/* @__PURE__ */ jsx(ExternalTextBlock, { url: textBlock.textValue })
|
|
995
1000
|
] }) }, row.key);
|
|
996
1001
|
}
|
|
1002
|
+
if (row.element.itemType === "textBlock") {
|
|
1003
|
+
const inline = row.cells.find(
|
|
1004
|
+
(c) => c.value === null && c.textValue != null && c.textValue !== "" && !isExternalFactUrl(c.textValue)
|
|
1005
|
+
);
|
|
1006
|
+
if (inline?.textValue) {
|
|
1007
|
+
return /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsxs("td", { colSpan: totalCols + 1, style: styles3.textBlockCell, children: [
|
|
1008
|
+
/* @__PURE__ */ jsx("div", { style: styles3.textBlockLabel, title: row.element.qname, children: rowLabel(row) }),
|
|
1009
|
+
/* @__PURE__ */ jsx(InlineTextBlock, { html: inline.textValue })
|
|
1010
|
+
] }) }, row.key);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
997
1013
|
const kind = numericKindOf(row.element);
|
|
998
1014
|
const isGrandTotal = row.isSubtotal && row.depth === 0;
|
|
999
1015
|
const allZeroOrNull = row.cells.every((c) => c.value === null || c.value === 0);
|
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\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 } 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 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'\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 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"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/format.ts","../src/adapters/sec.ts","../src/adapters/cypher.ts","../src/adapters/store.ts","../src/adapters/jsonld.ts"],"names":["qname","periodType","Store"],"mappings":"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","file":"chunk-DGP4KRWF.js","sourcesContent":["/**\n * RDF vocabulary and display helpers shared across adapters and projection.\n *\n * A report holon mixes several vocabularies: `rs:` for structure, `skos:` for\n * human labels, and the XBRL family (`xlink:` / `xbrli:` / `link:`) for the\n * networks. These constants are the single source of truth for the full IRIs.\n */\n\nexport const NS = {\n rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n rs: 'https://robosystems.ai/vocab/',\n rsgaap: 'https://robosystems.ai/taxonomy/rs-gaap/v1/',\n skos: 'http://www.w3.org/2004/02/skos/core#',\n xlink: 'http://www.w3.org/1999/xlink#',\n xbrli: 'http://www.xbrl.org/2003/instance#',\n link: 'http://www.xbrl.org/2003/linkbase#',\n iso4217: 'http://www.xbrl.org/2003/iso4217#',\n} as const\n\n/** Frequently-referenced full IRIs, pre-concatenated for terseness. */\nexport const IRI = {\n type: NS.rdf + 'type',\n // rs: classes\n Report: NS.rs + 'Report',\n Fact: NS.rs + 'Fact',\n InformationBlock: NS.rs + 'InformationBlock',\n Structure: NS.rs + 'Structure',\n Association: NS.rs + 'Association',\n Element: NS.rs + 'Element',\n Period: NS.rs + 'Period',\n Unit: NS.rs + 'Unit',\n Entity: NS.rs + 'Entity',\n // rs: predicates\n element: NS.rs + 'element',\n period: NS.rs + 'period',\n unit: NS.rs + 'unit',\n entity: NS.rs + 'entity',\n factSet: NS.rs + 'factSet',\n numericValue: NS.rs + 'numericValue',\n decimals: NS.rs + 'decimals',\n blockType: NS.rs + 'blockType',\n associationType: NS.rs + 'associationType',\n hasAssociation: NS.rs + 'hasAssociation',\n roleUri: NS.rs + 'roleUri',\n structureName: NS.rs + 'structureName',\n abstract: NS.rs + 'abstract',\n monetary: NS.rs + 'monetary',\n legalName: NS.rs + 'legalName',\n country: NS.rs + 'country',\n // skos:\n prefLabel: NS.skos + 'prefLabel',\n // xlink:\n from: NS.xlink + 'from',\n to: NS.xlink + 'to',\n role: NS.xlink + 'role',\n // xbrli:\n instant: NS.xbrli + 'instant',\n startDate: NS.xbrli + 'startDate',\n endDate: NS.xbrli + 'endDate',\n periodType: NS.xbrli + 'periodType',\n balance: NS.xbrli + 'balance',\n measure: NS.xbrli + 'measure',\n // link:\n order: NS.link + 'order',\n weight: NS.link + 'weight',\n} as const\n\n/**\n * Prefixes for compacting concept IRIs to `prefix:Local`. Order matters — the\n * most specific namespace must come first so `rs-gaap:` wins over `rs:`.\n */\nconst PREFIXES: ReadonlyArray<readonly [string, string]> = [\n ['rs-gaap', NS.rsgaap],\n ['disclosures', 'https://robosystems.ai/taxonomy/rs-gaap/disclosures/v1/'],\n ['us-gaap', 'http://fasb.org/us-gaap/'],\n ['dei', 'http://xbrl.sec.gov/dei/'],\n ['rs', NS.rs],\n ['skos', NS.skos],\n ['xbrli', NS.xbrli],\n ['xlink', NS.xlink],\n ['link', NS.link],\n ['iso4217', NS.iso4217],\n]\n\n/** Compact a concept IRI to `prefix:Local` (e.g. `rs-gaap:Assets`). */\nexport function qname(iri: string): string {\n for (const [prefix, ns] of PREFIXES) {\n if (iri.startsWith(ns)) {\n return `${prefix}:${iri.slice(ns.length)}`\n }\n }\n const slash = iri.lastIndexOf('/')\n const hash = iri.lastIndexOf('#')\n return iri.slice(Math.max(slash, hash) + 1)\n}\n\n/**\n * Readable concept name from a local name when no `skos:prefLabel` is present —\n * splits CamelCase into words (`AssetsCurrent` → `Assets Current`). A graceful\n * fallback for bundles that predate label emit.\n */\nexport function humanize(iri: string): string {\n const local = qname(iri).split(':').pop() ?? iri\n return local.replace(/(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g, ' ')\n}\n\n/**\n * A large text-block / policy fact whose HTML (or plain-text) body is too big to\n * store inline, so the platform externalizes it to the public CDN and the fact's\n * value is the URL (`…/fact_<hash>.html` or `.txt`). The renderer fetches and\n * embeds these instead of printing the raw link.\n */\nexport function isExternalFactUrl(value: string | null | undefined): boolean {\n return !!value && /^https?:\\/\\/\\S+\\/fact_[0-9a-f]+\\.(html|txt)$/i.test(value)\n}\n\n/** Stable display order for the canonical statement blocks; others fall after. */\nexport const BLOCK_ORDER: Record<string, number> = {\n balance_sheet: 0,\n income_statement: 1,\n cash_flow_statement: 2,\n equity_statement: 3,\n}\n\n/** Friendly section headings keyed by block type. */\nexport const BLOCK_TITLES: Record<string, string> = {\n balance_sheet: 'Balance Sheet',\n income_statement: 'Income Statement',\n cash_flow_statement: 'Cash Flow Statement',\n equity_statement: 'Statement of Changes in Equity',\n}\n","/**\n * Pure formatting helpers shared by the projection and the components. No React\n * here, so the projection can depend on it without pulling in a renderer.\n */\nimport type { ElementInfo, NumericKind, PeriodInfo } from './model'\n\n/**\n * Accounting-style money: negatives in parentheses, no sign, an em-dash for\n * absent values. Matches the RoboLedger statement renderer.\n */\nexport function formatMoney(\n value: number | null | undefined,\n opts: { currencySymbol?: string } = {}\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return '—'\n const symbol = opts.currencySymbol ?? '$'\n const abs = Math.abs(value).toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n return value < 0 ? `${symbol}(${abs})` : `${symbol}${abs}`\n}\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n/** `2024-03-31` → `Mar 31, 2024`. Falls back to the raw string if unparseable. */\nexport function formatDate(iso: string | null | undefined): string {\n if (!iso) return ''\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso)\n if (!m) return iso\n const [, year, month, day] = m\n const idx = Number(month) - 1\n return `${MONTHS[idx] ?? month} ${Number(day)}, ${year}`\n}\n\n/**\n * Humanize an ISO-8601 duration value (`P10Y` → \"10 years\", `P1Y6M` → \"1 year 6\n * months\", `P30D` → \"30 days\"), or null when the string is not a duration — so a\n * non-numeric fact that happens to start with \"P\" (a company name) is untouched.\n * XBRL `durationItemType` facts (debt maturities, lease terms) arrive as these\n * strings in the text path.\n */\nexport function humanizeDuration(value: string | null | undefined): string | null {\n if (!value) return null\n const m =\n /^(-)?P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(\n value.trim()\n )\n if (!m) return null\n const [, sign, y, mo, w, d, h, min, s] = m\n const parts: string[] = []\n const push = (n: string | undefined, unit: string): void => {\n if (n) parts.push(`${n} ${unit}${Number(n) === 1 ? '' : 's'}`)\n }\n push(y, 'year')\n push(mo, 'month')\n push(w, 'week')\n push(d, 'day')\n push(h, 'hour')\n push(min, 'minute')\n push(s, 'second')\n if (!parts.length) return null\n return `${sign ?? ''}${parts.join(' ')}`\n}\n\n/** A human description of a period — \"As of …\" for instants, a span for durations. */\nexport function formatPeriod(period: PeriodInfo): string {\n if (period.type === 'instant') {\n return `As of ${formatDate(period.instant ?? period.end)}`\n }\n return `${formatDate(period.startDate)} – ${formatDate(period.endDate ?? period.end)}`\n}\n\n/** The effective numeric kind of an element (explicit, else derived from monetary). */\nexport function numericKindOf(el: ElementInfo): NumericKind {\n return el.numericKind ?? (el.monetary ? 'monetary' : 'other')\n}\n\n/** Common currency symbols by ISO-4217 code; null for a non-currency unit. */\nconst CURRENCY_SYMBOLS: Record<string, string> = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n CNY: '¥',\n CHF: 'CHF ',\n CAD: 'CA$',\n AUD: 'A$',\n HKD: 'HK$',\n INR: '₹',\n KRW: '₩',\n}\n\n/**\n * A display prefix for a monetary unit measure (`iso4217:USD` → `$`), else null.\n * Unknown currencies fall back to their code (`CHF `, `SEK `) rather than a wrong\n * dollar sign — this is what fixes non-USD facts rendering as `$`.\n */\nexport function currencySymbolFor(measure: string | null | undefined): string | null {\n if (!measure) return null\n const code = (measure.includes(':') ? measure.split(':').pop()! : measure).toUpperCase()\n if (CURRENCY_SYMBOLS[code]) return CURRENCY_SYMBOLS[code]\n // A currency-shaped code (3 letters) we don't have a glyph for → code prefix.\n return /^[A-Z]{3}$/.test(code) ? `${code} ` : null\n}\n\nexport interface ValueFormat {\n /** Drives symbol, scaling opt-out, and decimal places. Defaults to `monetary`. */\n numericKind?: NumericKind\n /** Currency symbol for monetary/per-share values (from the fact's unit). */\n symbol?: string | null\n /** Divide monetary values by this (e.g. 1e6 to show millions); default 1. */\n scaleFactor?: number\n}\n\n/**\n * Format a fact value for display: accounting style (negatives in parentheses,\n * em-dash for absent), the fact's own currency symbol (never a hard-coded `$`),\n * and the section scale — with per-share amounts and share counts never rescaled\n * (an EPS of 4.93 stays 4.93 under \"in millions\"). A `percent` fact stores a\n * decimal fraction, so it is scaled ×100 and suffixed with `%` (0.10 → 10%); a\n * `pure` fact is a bare ratio, shown as a plain decimal (no `%`).\n */\nexport function formatValue(value: number | null | undefined, fmt: ValueFormat = {}): string {\n if (value === null || value === undefined || Number.isNaN(value)) return '—'\n const kind = fmt.numericKind ?? 'monetary'\n const scale = kind === 'monetary' ? (fmt.scaleFactor ?? 1) : 1\n const scaled = kind === 'percent' ? value * 100 : value / scale\n\n let minFrac = 0\n let maxFrac = 0\n if (kind === 'perShare') {\n minFrac = maxFrac = 2\n } else if (kind === 'monetary') {\n minFrac = maxFrac = scale > 1 ? 0 : 2\n } else if (kind === 'percent') {\n maxFrac = 2\n } else if (kind === 'pure') {\n maxFrac = 4\n }\n\n const abs = Math.abs(scaled).toLocaleString('en-US', {\n minimumFractionDigits: minFrac,\n maximumFractionDigits: maxFrac,\n })\n const symbol = kind === 'monetary' || kind === 'perShare' ? (fmt.symbol ?? '') : ''\n const suffix = kind === 'percent' ? '%' : ''\n return scaled < 0 ? `${symbol}(${abs}${suffix})` : `${symbol}${abs}${suffix}`\n}\n","/**\n * The SEC adapter — reconstructs a report from the live SEC EDGAR graph\n * (`graph_id = \"sec\"`) via read-only Cypher, one section at a time.\n *\n * A single SEC filing is a large graph: a 10-K is ~90 `Structure`s (the 5 core\n * statements plus dozens of disclosure/document networks), thousands of facts.\n * Loading the whole thing up front is slow, so this module splits the work:\n *\n * - `fetchSecReportShell` — one fast pass that returns the entity + the ordered\n * **section list** (each `Structure` with its title, kind, and factset ids).\n * - `fetchSecSection` — on demand, the facts + presentation/calculation network\n * for **one** section, assembled into a single-section `NormalizedReport` the\n * shared projection/components render unchanged.\n *\n * The library stays transport-agnostic: the caller injects a `SecQuery` (a thin\n * wrapper over `POST /v1/graphs/sec/query`); this module owns only the Cypher and\n * the row → model mapping.\n *\n * ── Query rules (load-bearing; verified against the live graph) ────────────────\n * These are not stylistic — violating them turns a ~120 ms query into a ~14 s one:\n * 1. **Anchor on a primary key.** Lead per-section queries with a direct\n * `{identifier: $id}` match on `FactSet`/`Structure` (indexed). Never expand a\n * whole `Report`'s facts, and never use `WHERE x.identifier IN [list]` (a scan,\n * not an index probe) — issue one query per factset instead.\n * 3. **Always carry a `WHERE f.value IS NOT NULL` predicate** on the fact scan and\n * **always `LIMIT`.** Both flip the planner onto the fast path (~120 ms vs ~7 s).\n * `value` (the raw string) is present on every fact, so this keeps numeric and\n * text facts alike.\n * 4. **No `OPTIONAL MATCH`.** An optional unit join alone cost ~12 s; units come\n * from a separate required-join query, merged client-side.\n * 5. Aggregations must `ORDER BY <alias>` (not `s.number`); `end` is reserved, so\n * alias every `p.end_date AS end_date`.\n */\nimport { humanize, qname as toQname } from '../constants'\nimport { currencySymbolFor } from '../format'\nimport type {\n CalcAssociation,\n DimensionQualifier,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n NumericKind,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\n\n/** Injected transport — runs a read-only Cypher query and returns its rows. */\nexport type SecQuery = (\n cypher: string,\n params?: Record<string, unknown>\n) => Promise<Array<Record<string, unknown>>>\n\n/** One navigable section of a filing (a `Structure` + its facts). */\nexport interface SecSection {\n /** `Structure.identifier` — the section id + the anchor for its associations. */\n id: string\n /** Human title, e.g. \"Consolidated Balance Sheets\" (definition prefix stripped). */\n title: string\n /** Coarse grouping for the table of contents. */\n kind: 'Statement' | 'Disclosure' | 'Document' | 'Cover' | 'Other'\n /** `canonical_type` when the section is a recognized core statement, else null. */\n canonicalType: string | null\n /** Filing sequence (position in the ordered section list). */\n order: number\n /** `FactSet.identifier`s whose facts belong to this section. */\n factsetIds: string[]\n}\n\n/** The fast first read: entity + the ordered section list, no fact bodies. */\nexport interface SecReportShell {\n reportId: string\n entity: EntityInfo | null\n sections: SecSection[]\n}\n\n// ── Cypher ────────────────────────────────────────────────────────────────────\n\nconst ENTITY_META_Q = `\nMATCH (ent:Entity)-[:ENTITY_HAS_REPORT]->(r:Report {identifier: $rid})\nRETURN ent.identifier AS entity_id, ent.name AS entity_name,\n ent.legal_name AS legal_name, ent.cik AS cik, ent.ticker AS ticker,\n r.form AS form, r.report_date AS report_date`\n\n// Structures reachable from this report's facts, with their factsets. Dimensional\n// facts belong to the same factsets as their consolidated totals, so no\n// `has_dimensions` filter is needed — dropping it also surfaces sections whose\n// content is entirely dimensional (e.g. Schedule II). ORDER BY the alias (Kùzu\n// requires it once `collect` aggregates).\nconst SECTIONS_Q = `\nMATCH (r:Report {identifier: $rid})-[:REPORT_HAS_FACT]->(f:Fact)<-[:FACT_SET_CONTAINS_FACT]-(fs:FactSet)<-[:STRUCTURE_HAS_FACT_SET]-(s:Structure)\nRETURN s.identifier AS sid, s.canonical_type AS canonical_type,\n s.definition AS definition, s.number AS number,\n collect(DISTINCT fs.identifier) AS factsets\nORDER BY number`\n\n// Facts for one factset. Anchored on the factset PK; dimensional and consolidated\n// facts alike come through — the pivot engine keys cells by the full aspect\n// signature (element + period + dimensional coordinate), so segment/component\n// breakdowns no longer collide with the total. Element type signals\n// (`item_type`, `is_shares`) drive the value's numeric kind (monetary / per-share\n// / shares). `WHERE f.value IS NOT NULL` + `LIMIT` keep it on the fast path and\n// retain text facts (Cover Page etc.).\nconst FACTS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_ELEMENT]->(e:Element),\n (f)-[:FACT_HAS_PERIOD]->(p:Period)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, e.qname AS qname, e.name AS ename, e.balance AS balance,\n e.period_type AS e_period_type, e.is_abstract AS is_abstract, e.is_numeric AS is_numeric,\n e.item_type AS item_type, e.is_shares AS is_shares,\n f.numeric_value AS numeric_value, f.value AS raw_value, f.decimals AS decimals,\n p.identifier AS pid, p.period_type AS period_type,\n p.start_date AS start_date, p.end_date AS end_date\nLIMIT 2000`\n\n// Unit measures for the same factset, as a separate required-join query — an\n// OPTIONAL unit join on the facts query alone cost ~12 s.\nconst UNITS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_UNIT]->(u:Unit)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, u.measure AS unit\nLIMIT 2000`\n\n// Dimensional qualifiers for the same factset — again a separate required-join\n// query (never OPTIONAL) so a fact with no dimensions simply contributes no rows.\n// One row per (fact, axis); a multi-axis fact yields several, merged client-side.\nconst DIMS_Q = `\nMATCH (fs:FactSet {identifier: $fsid})-[:FACT_SET_CONTAINS_FACT]->(f:Fact)-[:FACT_HAS_DIMENSION]->(d:Dimension)\nWHERE f.value IS NOT NULL\nRETURN f.identifier AS fid, d.axis AS axis, d.member AS member,\n d.axis_uri AS axis_uri, d.member_uri AS member_uri,\n d.is_explicit AS is_explicit, d.is_typed AS is_typed\nLIMIT 4000`\n\n// The presentation + calculation networks for one section, anchored on the\n// Structure PK. `association_type` is `Presentation` / `Calculation`. Element\n// names + `is_abstract` come along so presentation-only nodes (abstract section\n// headers, which carry no facts) can be registered — without them the projection\n// can't tell a header from a concrete line and mis-orders it.\nconst ASSOC_Q = `\nMATCH (s:Structure {identifier: $sid})-[:STRUCTURE_HAS_ASSOCIATION]->(a:Association),\n (a)-[:ASSOCIATION_HAS_FROM_ELEMENT]->(pe:Element),\n (a)-[:ASSOCIATION_HAS_TO_ELEMENT]->(ce:Element)\nRETURN a.association_type AS association_type, a.order_value AS order_value, a.weight AS weight,\n pe.qname AS parent, pe.name AS parent_name, pe.is_abstract AS parent_abstract,\n ce.qname AS child, ce.name AS child_name, ce.is_abstract AS child_abstract`\n\n// ── Row helpers ────────────────────────────────────────────────────────────────\n\nfunction str(row: Record<string, unknown>, key: string): string | null {\n const v = row[key]\n return typeof v === 'string' && v !== '' ? v : v == null ? null : String(v)\n}\n\nfunction num(row: Record<string, unknown>, key: string): number | null {\n const v = row[key]\n if (v === null || v === undefined || v === '') return null\n const n = typeof v === 'number' ? v : Number(v)\n return Number.isNaN(n) ? null : n\n}\n\nfunction bool(row: Record<string, unknown>, key: string): boolean {\n const v = row[key]\n return v === true || v === 'true'\n}\n\nfunction periodType(raw: string | null): PeriodType | null {\n return raw === 'instant' || raw === 'duration' ? raw : null\n}\n\n/**\n * A prefixed qname for a dimension axis/member from its versioned XBRL IRI + local\n * name (`http://fasb.org/us-gaap/2025#…Member` + `…Member` → `us-gaap:…Member`).\n * The graph gives axis/member as bare local names; this keeps them consistent with\n * the `Element.qname`s used in the presentation network (so member ordering lines\n * up), and cell matching is internally consistent regardless (row + column derive\n * from the same mapping).\n */\nfunction xbrlQname(uri: string | null, local: string | null): string {\n if (local) {\n const ns = (uri ?? '').split('#')[0]\n if (/fasb\\.org\\/us-gaap/.test(ns)) return `us-gaap:${local}`\n if (/fasb\\.org\\/srt/.test(ns)) return `srt:${local}`\n if (/xbrl\\.sec\\.gov\\/dei/.test(ns)) return `dei:${local}`\n if (/robosystems\\.ai\\/taxonomy\\/rs-gaap/.test(ns)) return `rs-gaap:${local}`\n return local\n }\n return uri ? toQname(uri) : ''\n}\n\n/** Humanize an axis/member local name, dropping the XBRL `Axis`/`Member`/`Domain` suffix. */\nfunction dimLabel(local: string | null): string {\n if (!local) return ''\n return humanize(local.replace(/(Axis|Member|Domain)$/, '')) || humanize(local)\n}\n\n/**\n * Classify an element's numeric kind from its XBRL `item_type` (+ `is_shares`).\n * Per-share and share counts opt out of monetary rescaling; strings/text are not\n * numeric. Checked before monetary because share/per-share types are also numeric.\n */\nfunction deriveNumericKind(row: Record<string, unknown>): NumericKind | undefined {\n const itemType = str(row, 'item_type') ?? ''\n if (/perShareItemType/i.test(itemType)) return 'perShare'\n if (/sharesItemType/i.test(itemType) || bool(row, 'is_shares')) return 'shares'\n // A percentItemType stores a decimal fraction (0.10 → 10%); a pureItemType is a\n // bare dimensionless ratio (2.5 debt-to-equity), NOT a percentage.\n if (/percentItemType/i.test(itemType)) return 'percent'\n if (/pureItemType/i.test(itemType)) return 'pure'\n if (/monetaryItemType/i.test(itemType)) return 'monetary'\n if (/integerItemType/i.test(itemType)) return 'integer'\n if (!bool(row, 'is_numeric')) return undefined\n // No item_type (older captures): a debit/credit balance marks a monetary item.\n const balance = str(row, 'balance')\n return balance === 'debit' || balance === 'credit' ? 'monetary' : 'other'\n}\n\n/**\n * The primary financial statements. Only these `canonical_type`s belong in the\n * TOC's \"Financial Statements\" group — other canonical types (rollforwards,\n * hierarchies, `(Details)` networks) are disclosures, classified by their\n * definition's type word instead.\n */\nconst CORE_STATEMENT_TYPES = new Set([\n 'balance_sheet',\n 'income_statement',\n 'cash_flow_statement',\n 'equity_statement',\n 'comprehensive_income',\n])\n\n/**\n * Split an XBRL `Structure.definition` into a human title + a coarse kind.\n * Definitions look like `\"9952153 - Statement - Consolidated Balance Sheets\"` or\n * `\"0000001 - Document - Cover Page\"` — a `\"NNNN - <Type> - <Title>\"` shape whose\n * middle word (Statement / Disclosure / Document) drives the kind. A core\n * canonical statement always reads as a Statement so the primaries group cleanly.\n */\nexport function parseStructureDefinition(\n definition: string | null,\n canonicalType: string | null\n): { title: string; kind: SecSection['kind'] } {\n const raw = (definition ?? '').trim()\n const parts = raw.split(' - ')\n let type = ''\n let title = raw\n if (parts.length >= 3) {\n type = parts[1].trim()\n title = parts.slice(2).join(' - ').trim()\n } else if (parts.length === 2) {\n title = parts[1].trim()\n }\n\n let kind: SecSection['kind'] = 'Other'\n if (/cover/i.test(title)) kind = 'Cover'\n else if (type === 'Statement') kind = 'Statement'\n else if (type === 'Disclosure') kind = 'Disclosure'\n else if (type === 'Document') kind = 'Document'\n // A core statement is always a Statement; a non-core canonical type (e.g.\n // GoodwillRollForward) stays whatever its definition type word made it.\n if (canonicalType && CORE_STATEMENT_TYPES.has(canonicalType)) kind = 'Statement'\n\n return { title: title || raw || canonicalType || 'Section', kind }\n}\n\n// ── Shell ───────────────────────────────────────────────────────────────────\n\nfunction mapEntity(row: Record<string, unknown> | undefined): EntityInfo | null {\n if (!row) return null\n const id = str(row, 'entity_id')\n if (!id) return null\n return {\n id,\n name: str(row, 'entity_name') ?? str(row, 'legal_name') ?? 'Entity',\n legalName: str(row, 'legal_name'),\n country: null,\n }\n}\n\n/** Fetch the entity + ordered section list for a report (the fast first read). */\nexport async function fetchSecReportShell(\n query: SecQuery,\n reportId: string\n): Promise<SecReportShell> {\n const [entityRows, sectionRows] = await Promise.all([\n query(ENTITY_META_Q, { rid: reportId }),\n query(SECTIONS_Q, { rid: reportId }),\n ])\n\n const sections: SecSection[] = sectionRows\n .map((row, order): SecSection => {\n const { title, kind } = parseStructureDefinition(\n str(row, 'definition'),\n str(row, 'canonical_type')\n )\n const factsets = Array.isArray(row.factsets)\n ? (row.factsets as unknown[]).filter((v): v is string => typeof v === 'string')\n : []\n return {\n id: str(row, 'sid') ?? '',\n title,\n kind,\n canonicalType: str(row, 'canonical_type'),\n order,\n factsetIds: factsets,\n }\n })\n .filter((s) => s.id && s.factsetIds.length > 0)\n\n return { reportId, entity: mapEntity(entityRows[0]), sections }\n}\n\n// ── Single section ────────────────────────────────────────────────────────────\n\nfunction accumulateElement(elements: Record<string, ElementInfo>, row: Record<string, unknown>) {\n const q = str(row, 'qname')\n if (!q || elements[q]) return\n const balance = str(row, 'balance')\n elements[q] = {\n id: q,\n qname: q,\n label: str(row, 'ename') ? humanize(str(row, 'ename') as string) : humanize(q),\n balance: balance === 'debit' || balance === 'credit' ? balance : null,\n periodType: periodType(str(row, 'e_period_type')),\n abstract: bool(row, 'is_abstract'),\n monetary: bool(row, 'is_numeric'),\n numericKind: deriveNumericKind(row),\n }\n}\n\n/**\n * Register a presentation-network element that has no facts of its own — chiefly\n * an abstract section header. Fact-bearing elements are already registered from\n * the facts query and take precedence (this no-ops on existing keys); this fills\n * in the abstract headers so the projection renders them as headers above their\n * section rather than as empty concrete rows below it. Abstract labels drop the\n * XBRL `Abstract` suffix (`OperatingExpensesAbstract` → `Operating Expenses`).\n */\nfunction registerPresentationElement(\n elements: Record<string, ElementInfo>,\n qname: string | null,\n name: string | null,\n isAbstract: boolean\n): void {\n if (!qname || elements[qname]) return\n elements[qname] = {\n id: qname,\n qname,\n label: name ? humanize(isAbstract ? name.replace(/Abstract$/, '') : name) : humanize(qname),\n balance: null,\n periodType: null,\n abstract: isAbstract,\n monetary: false,\n }\n}\n\nfunction accumulatePeriod(periods: Record<string, PeriodInfo>, row: Record<string, unknown>) {\n const id = str(row, 'pid')\n if (!id || periods[id]) return\n const type = periodType(str(row, 'period_type')) ?? 'duration'\n const startDate = str(row, 'start_date')\n const endDate = str(row, 'end_date')\n periods[id] = {\n id,\n type,\n instant: type === 'instant' ? endDate : null,\n startDate,\n endDate,\n end: endDate ?? '',\n }\n}\n\n/**\n * Load one section into a single-section `NormalizedReport`. All of the\n * section's facts are re-keyed to the structure id as their `factSet`, so the\n * projection groups them as one Information Block regardless of how many raw\n * FactSets the filing split them across.\n */\nexport async function fetchSecSection(\n query: SecQuery,\n shell: SecReportShell,\n section: SecSection\n): Promise<NormalizedReport> {\n const [factRowGroups, unitRowGroups, dimRowGroups, assocRows] = await Promise.all([\n Promise.all(section.factsetIds.map((fsid) => query(FACTS_Q, { fsid }))),\n Promise.all(section.factsetIds.map((fsid) => query(UNITS_Q, { fsid }))),\n Promise.all(section.factsetIds.map((fsid) => query(DIMS_Q, { fsid }))),\n query(ASSOC_Q, { sid: section.id }),\n ])\n\n const unitByFid = new Map<string, string>()\n for (const row of unitRowGroups.flat()) {\n const fid = str(row, 'fid')\n const measure = str(row, 'unit')\n if (fid && measure) unitByFid.set(fid, measure)\n }\n\n // One fact can carry several axes; collect its qualifiers (ordered by axis).\n const dimsByFid = new Map<string, DimensionQualifier[]>()\n for (const row of dimRowGroups.flat()) {\n const fid = str(row, 'fid')\n if (!fid) continue\n const memberLocal = str(row, 'member')\n const qual: DimensionQualifier = {\n axis: xbrlQname(str(row, 'axis_uri'), str(row, 'axis')),\n member: memberLocal ? xbrlQname(str(row, 'member_uri'), memberLocal) : null,\n axisLabel: dimLabel(str(row, 'axis')),\n memberLabel: dimLabel(memberLocal),\n explicit: bool(row, 'is_explicit'),\n typedValue: bool(row, 'is_typed') ? str(row, 'member') : null,\n }\n const list = dimsByFid.get(fid) ?? []\n list.push(qual)\n dimsByFid.set(fid, list)\n }\n for (const list of dimsByFid.values()) list.sort((a, b) => a.axis.localeCompare(b.axis))\n\n const elements: Record<string, ElementInfo> = {}\n const periods: Record<string, PeriodInfo> = {}\n const units: Record<string, UnitInfo> = {}\n const facts: Fact[] = []\n const seenFacts = new Set<string>()\n\n for (const row of factRowGroups.flat()) {\n const fid = str(row, 'fid')\n const element = str(row, 'qname')\n const period = str(row, 'pid')\n if (!fid || !element || !period || seenFacts.has(fid)) continue\n seenFacts.add(fid)\n\n accumulateElement(elements, row)\n accumulatePeriod(periods, row)\n\n const measure = unitByFid.get(fid) ?? null\n if (measure && !units[measure]) {\n const compact = toQname(measure)\n units[measure] = {\n id: measure,\n measure: compact,\n label: compact.includes(':') ? (compact.split(':').pop() as string) : compact,\n symbol: currencySymbolFor(compact),\n }\n }\n\n const value = num(row, 'numeric_value')\n facts.push({\n id: fid,\n element,\n period,\n unit: measure,\n entity: shell.entity?.id ?? null,\n factSet: section.id,\n value,\n decimals: str(row, 'decimals'),\n textValue: value === null ? str(row, 'raw_value') : null,\n dimensions: dimsByFid.get(fid),\n })\n }\n\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n for (const row of assocRows) {\n const parent = str(row, 'parent')\n const child = str(row, 'child')\n if (!parent || !child) continue\n // Register presentation-only elements (abstract section headers carry no\n // facts, so the facts query never saw them). Fact-bearing elements are\n // already registered and unaffected — registration no-ops on existing keys.\n registerPresentationElement(\n elements,\n parent,\n str(row, 'parent_name'),\n bool(row, 'parent_abstract')\n )\n registerPresentationElement(\n elements,\n child,\n str(row, 'child_name'),\n bool(row, 'child_abstract')\n )\n const order = num(row, 'order_value') ?? 0\n const type = str(row, 'association_type')?.toLowerCase()\n if (type === 'calculation') {\n calcAssociations.push({\n parent,\n child,\n weight: num(row, 'weight') ?? 1,\n order,\n role: null,\n structure: section.id,\n })\n } else if (type === 'presentation') {\n presAssociations.push({ parent, child, order, role: null, structure: section.id })\n }\n }\n\n const informationBlock: InformationBlock = {\n id: section.id,\n blockType: section.canonicalType ?? '',\n factSet: section.id,\n label: section.title,\n structureId: section.id,\n }\n const structure: StructureInfo = {\n id: section.id,\n blockType: section.canonicalType ?? '',\n roleUri: null,\n structureName: section.title,\n order: section.order,\n }\n\n return {\n reportId: shell.reportId,\n reportIri: null,\n entity: shell.entity,\n informationBlocks: [informationBlock],\n structures: [structure],\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n\n/** Merge single-section reports into one whole-report model (order preserved). */\nexport function mergeSecSections(\n shell: SecReportShell,\n sections: NormalizedReport[]\n): NormalizedReport {\n const elements: Record<string, ElementInfo> = {}\n const periods: Record<string, PeriodInfo> = {}\n const units: Record<string, UnitInfo> = {}\n const informationBlocks: InformationBlock[] = []\n const structures: StructureInfo[] = []\n const facts: Fact[] = []\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n\n for (const part of sections) {\n Object.assign(elements, part.elements)\n Object.assign(periods, part.periods)\n Object.assign(units, part.units)\n informationBlocks.push(...part.informationBlocks)\n structures.push(...part.structures)\n facts.push(...part.facts)\n calcAssociations.push(...part.calcAssociations)\n presAssociations.push(...part.presAssociations)\n }\n\n return {\n reportId: shell.reportId,\n reportIri: null,\n entity: shell.entity,\n informationBlocks,\n structures,\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n","/**\n * The cypher adapter — a whole-report `ReportAdapter` over the live SEC graph.\n *\n * This is a convenience wrapper: it loads the section list, then every section,\n * and merges them into one `NormalizedReport`. Apps that want responsive,\n * lazy-per-section loading should call `fetchSecReportShell` + `fetchSecSection`\n * directly (see `./sec`) rather than materializing a whole filing up front.\n */\nimport type { SecQuery } from './sec'\nimport { fetchSecReportShell, fetchSecSection, mergeSecSections } from './sec'\nimport type { ReportAdapter } from './types'\n\nexport interface CypherAdapterConfig {\n /** Injected transport over `POST /v1/graphs/{graphId}/query` (auth lives here). */\n query: SecQuery\n /** The report to materialize — a `Report.identifier`. */\n reportId: string\n}\n\nexport function cypherAdapter(config: CypherAdapterConfig): ReportAdapter {\n return {\n source: `sec:${config.reportId}`,\n load: async () => {\n const shell = await fetchSecReportShell(config.query, config.reportId)\n const sections = await Promise.all(\n shell.sections.map((section) => fetchSecSection(config.query, shell, section))\n )\n return mergeSecSections(shell, sections)\n },\n }\n}\n","/**\n * The shared quad-store → `NormalizedReport` traversal.\n *\n * An adapter fills an N3 quad `Store` from its source, then hands it here. The\n * store is read as a **union** across its graphs (`graph = null`) — the\n * scene/boundary/projection partition is a publication concern, not a rendering\n * one, so the join is identical however the quads arrived (a dataset-form\n * JSON-LD holon, a flat graph, …). No SPARQL engine is required; only store\n * traversal. The only per-source code is how the store gets filled.\n */\nimport { DataFactory, Store } from 'n3'\nimport { IRI, humanize, qname } from '../constants'\nimport type {\n CalcAssociation,\n ElementInfo,\n EntityInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n PeriodInfo,\n PeriodType,\n PresAssociation,\n StructureInfo,\n UnitInfo,\n} from '../model'\n\nconst { namedNode } = DataFactory\n\nfunction makeReaders(store: Store) {\n const objects = (s: string, p: string) => store.getObjects(namedNode(s), namedNode(p), null)\n const firstValue = (s: string, p: string): string | null => {\n const os = objects(s, p)\n return os.length ? os[0].value : null\n }\n const subjectsOfType = (type: string): string[] =>\n store.getSubjects(namedNode(IRI.type), namedNode(type), null).map((t) => t.value)\n return { objects, firstValue, subjectsOfType }\n}\n\nfunction toNumber(raw: string | null): number | null {\n if (raw === null || raw === '') return null\n const n = Number(raw)\n return Number.isNaN(n) ? null : n\n}\n\n/** Traverse a populated quad `Store` into the normalized report model. */\nexport function parseStore(store: Store): NormalizedReport {\n const { objects, firstValue, subjectsOfType } = makeReaders(store)\n\n // ── Elements ──\n const elements: Record<string, ElementInfo> = {}\n for (const id of subjectsOfType(IRI.Element)) {\n const balance = firstValue(id, IRI.balance)\n const periodType = firstValue(id, IRI.periodType)\n elements[id] = {\n id,\n qname: qname(id),\n label: firstValue(id, IRI.prefLabel) ?? humanize(id),\n balance: balance === 'debit' || balance === 'credit' ? balance : null,\n periodType: periodType === 'instant' || periodType === 'duration' ? periodType : null,\n abstract: firstValue(id, IRI.abstract) === 'true',\n monetary: firstValue(id, IRI.monetary) === 'true',\n }\n }\n\n // ── Periods ──\n const periods: Record<string, PeriodInfo> = {}\n for (const id of subjectsOfType(IRI.Period)) {\n const declared = firstValue(id, IRI.periodType)\n const instant = firstValue(id, IRI.instant)\n const startDate = firstValue(id, IRI.startDate)\n const endDate = firstValue(id, IRI.endDate)\n const type: PeriodType =\n declared === 'instant'\n ? 'instant'\n : declared === 'duration'\n ? 'duration'\n : instant\n ? 'instant'\n : 'duration'\n const end = (type === 'instant' ? instant : endDate) ?? instant ?? endDate ?? ''\n periods[id] = { id, type, instant, startDate, endDate, end }\n }\n\n // ── Units ──\n const units: Record<string, UnitInfo> = {}\n for (const id of subjectsOfType(IRI.Unit)) {\n const measureTerm = objects(id, IRI.measure)[0]\n const measure = measureTerm ? qname(measureTerm.value) : 'unknown'\n units[id] = {\n id,\n measure,\n label: measure.includes(':') ? (measure.split(':').pop() as string) : measure,\n }\n }\n\n // ── Entity ──\n let entity: EntityInfo | null = null\n const entityIds = subjectsOfType(IRI.Entity)\n if (entityIds.length) {\n const id = entityIds[0]\n entity = {\n id,\n name: firstValue(id, IRI.prefLabel) ?? firstValue(id, IRI.legalName) ?? 'Entity',\n legalName: firstValue(id, IRI.legalName),\n country: firstValue(id, IRI.country),\n }\n }\n\n // ── Facts ──\n const facts: Fact[] = []\n for (const id of subjectsOfType(IRI.Fact)) {\n facts.push({\n id,\n element: firstValue(id, IRI.element) ?? '',\n period: firstValue(id, IRI.period) ?? '',\n unit: firstValue(id, IRI.unit),\n entity: firstValue(id, IRI.entity),\n factSet: firstValue(id, IRI.factSet),\n value: toNumber(firstValue(id, IRI.numericValue)),\n decimals: firstValue(id, IRI.decimals),\n })\n }\n\n // ── Information Blocks ──\n const informationBlocks: InformationBlock[] = []\n for (const id of subjectsOfType(IRI.InformationBlock)) {\n informationBlocks.push({\n id,\n blockType: firstValue(id, IRI.blockType) ?? '',\n factSet: firstValue(id, IRI.factSet),\n label: firstValue(id, IRI.prefLabel),\n })\n }\n\n // ── Structures + association → structure membership ──\n const structures: StructureInfo[] = []\n const assocStructure = new Map<string, string>()\n for (const id of subjectsOfType(IRI.Structure)) {\n structures.push({\n id,\n blockType: firstValue(id, IRI.blockType) ?? '',\n roleUri: firstValue(id, IRI.roleUri),\n structureName: firstValue(id, IRI.structureName),\n })\n for (const assoc of objects(id, IRI.hasAssociation)) {\n assocStructure.set(assoc.value, id)\n }\n }\n\n // ── Associations ──\n const calcAssociations: CalcAssociation[] = []\n const presAssociations: PresAssociation[] = []\n for (const id of subjectsOfType(IRI.Association)) {\n const parent = firstValue(id, IRI.from)\n const child = firstValue(id, IRI.to)\n if (!parent || !child) continue\n const type = firstValue(id, IRI.associationType)\n const order = toNumber(firstValue(id, IRI.order)) ?? 0\n const role = firstValue(id, IRI.role)\n const structure = assocStructure.get(id) ?? null\n if (type === 'calculation') {\n calcAssociations.push({\n parent,\n child,\n weight: toNumber(firstValue(id, IRI.weight)) ?? 1,\n order,\n role,\n structure,\n })\n } else if (type === 'presentation') {\n presAssociations.push({ parent, child, order, role, structure })\n }\n }\n\n // ── Report IRI / id ──\n // Prefer the named-graph name (`<report>#scene` → `<report>`) — present in a\n // dataset-form holon. Fall back to the `rs:Report` subject so a flat,\n // single-graph document still resolves its identity.\n let reportIri: string | null = null\n for (const graph of store.getGraphs(null, null, null)) {\n const hash = graph.value.indexOf('#')\n if (hash > 0) {\n reportIri = graph.value.slice(0, hash)\n break\n }\n }\n if (!reportIri) {\n const reports = subjectsOfType(IRI.Report)\n reportIri = reports.length ? reports[0] : null\n }\n const reportId = reportIri ? (reportIri.split('/').pop() ?? null) : null\n\n return {\n reportId,\n reportIri,\n entity,\n informationBlocks,\n structures,\n facts,\n elements,\n periods,\n units,\n calcAssociations,\n presAssociations,\n }\n}\n","/**\n * The `holon.jsonld` adapter — offline, no backend, no auth.\n *\n * The canonical, API-native holon: **dataset-form JSON-LD** carrying the three\n * named graphs (`#scene`, `#boundary`, `#projection`) as `@id` + nested\n * `@graph`. JSON is native to the RoboSystems JSON API, so this is the one\n * holon file format.\n *\n * N3.js doesn't parse JSON-LD, so this adapter uses the `jsonld` processor to\n * expand the document to N-Quads (which preserves the named-graph labels),\n * parses those into an N3 quad `Store`, and delegates to the shared\n * `parseStore` traversal (`store.ts`).\n */\nimport type { JsonLdDocument } from 'jsonld'\nimport jsonld from 'jsonld'\nimport { Parser, Store } from 'n3'\nimport type { NormalizedReport } from '../model'\nimport { parseStore } from './store'\nimport type { ReportAdapter } from './types'\n\n/** Parse a `holon.jsonld` document (string or parsed object) into the model. */\nexport async function parseJsonld(doc: string | object): Promise<NormalizedReport> {\n const json = (typeof doc === 'string' ? JSON.parse(doc) : doc) as JsonLdDocument\n // `toRDF` with the n-quads format returns a serialized string; each quad\n // carries its graph label, so the holon's named graphs survive the expansion.\n const nquads = (await jsonld.toRDF(json, { format: 'application/n-quads' })) as string\n const store = new Store(new Parser({ format: 'application/n-quads' }).parse(nquads))\n return parseStore(store)\n}\n\n/** A `ReportAdapter` over an in-memory `holon.jsonld` document. */\nexport function jsonldFileAdapter(doc: string | object, source = 'holon.jsonld'): ReportAdapter {\n return {\n source,\n load: () => parseJsonld(doc),\n }\n}\n"]}
|