@robosystems/report-components 0.1.0 → 0.1.1

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.
Files changed (51) hide show
  1. package/dist/adapters/index.d.ts +1 -5
  2. package/dist/adapters/index.js +2 -2
  3. package/dist/adapters/index.js.map +1 -1
  4. package/dist/chunk-K67BB5QI.js +264 -0
  5. package/dist/chunk-K67BB5QI.js.map +1 -0
  6. package/dist/{model.d.ts → index-2pOwdKOv.d.ts} +60 -17
  7. package/dist/index.d.ts +118 -23
  8. package/dist/index.js +491 -23
  9. package/dist/index.js.map +1 -1
  10. package/package.json +3 -2
  11. package/dist/adapters/cypher.d.ts +0 -21
  12. package/dist/adapters/cypher.d.ts.map +0 -1
  13. package/dist/adapters/cypher.js +0 -9
  14. package/dist/adapters/cypher.js.map +0 -1
  15. package/dist/adapters/index.d.ts.map +0 -1
  16. package/dist/adapters/trig.d.ts +0 -7
  17. package/dist/adapters/trig.d.ts.map +0 -1
  18. package/dist/adapters/trig.js +0 -183
  19. package/dist/adapters/trig.js.map +0 -1
  20. package/dist/adapters/types.d.ts +0 -16
  21. package/dist/adapters/types.d.ts.map +0 -1
  22. package/dist/adapters/types.js +0 -2
  23. package/dist/adapters/types.js.map +0 -1
  24. package/dist/components/FactInspector.d.ts +0 -11
  25. package/dist/components/FactInspector.d.ts.map +0 -1
  26. package/dist/components/FactInspector.js +0 -79
  27. package/dist/components/FactInspector.js.map +0 -1
  28. package/dist/components/ReportView.d.ts +0 -9
  29. package/dist/components/ReportView.d.ts.map +0 -1
  30. package/dist/components/ReportView.js +0 -51
  31. package/dist/components/ReportView.js.map +0 -1
  32. package/dist/components/StatementTable.d.ts +0 -15
  33. package/dist/components/StatementTable.d.ts.map +0 -1
  34. package/dist/components/StatementTable.js +0 -86
  35. package/dist/components/StatementTable.js.map +0 -1
  36. package/dist/constants.d.ts +0 -71
  37. package/dist/constants.d.ts.map +0 -1
  38. package/dist/constants.js +0 -115
  39. package/dist/constants.js.map +0 -1
  40. package/dist/format.d.ts +0 -17
  41. package/dist/format.d.ts.map +0 -1
  42. package/dist/format.js +0 -34
  43. package/dist/format.js.map +0 -1
  44. package/dist/index.d.ts.map +0 -1
  45. package/dist/model.d.ts.map +0 -1
  46. package/dist/model.js +0 -15
  47. package/dist/model.js.map +0 -1
  48. package/dist/project.d.ts +0 -39
  49. package/dist/project.d.ts.map +0 -1
  50. package/dist/project.js +0 -201
  51. package/dist/project.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,24 +1,492 @@
1
- /**
2
- * `@robosystems/report-components` public API.
3
- *
4
- * Render XBRL-grade financial statements from any source behind a thin adapter:
5
- *
6
- * import { ReportView } from '@robosystems/report-components'
7
- * import { trigFileAdapter } from '@robosystems/report-components/adapters'
8
- *
9
- * const report = await trigFileAdapter(trigText).load()
10
- * <ReportView report={report} />
11
- */
12
- // Model + reconstruction + formatting
13
- export { BLOCK_ORDER, BLOCK_TITLES, NS, humanize, qname } from './constants';
14
- export * from './format';
15
- export * from './model';
16
- export * from './project';
17
- // Components
18
- export { FactInspector } from './components/FactInspector';
19
- export { ReportView } from './components/ReportView';
20
- export { StatementTable } from './components/StatementTable';
21
- // Adapters (also available at the `/adapters` subpath)
22
- export { cypherAdapter } from './adapters/cypher';
23
- export { parseTrig, trigFileAdapter } from './adapters/trig';
1
+ import { BLOCK_ORDER, BLOCK_TITLES, humanize, qname } from './chunk-K67BB5QI.js';
2
+ export { BLOCK_ORDER, BLOCK_TITLES, NS, cypherAdapter, humanize, parseTrig, qname, trigFileAdapter } from './chunk-K67BB5QI.js';
3
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
+ import { useMemo, useState } from 'react';
5
+
6
+ // src/format.ts
7
+ function formatMoney(value, opts = {}) {
8
+ if (value === null || value === void 0 || Number.isNaN(value)) return "\u2014";
9
+ const symbol = opts.currencySymbol ?? "$";
10
+ const abs = Math.abs(value).toLocaleString("en-US", {
11
+ minimumFractionDigits: 2,
12
+ maximumFractionDigits: 2
13
+ });
14
+ return value < 0 ? `${symbol}(${abs})` : `${symbol}${abs}`;
15
+ }
16
+ var MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
17
+ function formatDate(iso) {
18
+ if (!iso) return "";
19
+ const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(iso);
20
+ if (!m) return iso;
21
+ const [, year, month, day] = m;
22
+ const idx = Number(month) - 1;
23
+ return `${MONTHS[idx] ?? month} ${Number(day)}, ${year}`;
24
+ }
25
+ function formatPeriod(period) {
26
+ if (period.type === "instant") {
27
+ return `As of ${formatDate(period.instant ?? period.end)}`;
28
+ }
29
+ return `${formatDate(period.startDate)} \u2013 ${formatDate(period.endDate ?? period.end)}`;
30
+ }
31
+
32
+ // src/project.ts
33
+ function fallbackElement(id) {
34
+ return {
35
+ id,
36
+ qname: qname(id),
37
+ label: humanize(id),
38
+ balance: null,
39
+ periodType: null,
40
+ abstract: false,
41
+ monetary: false
42
+ };
43
+ }
44
+ function presentationOrder(model, structureId) {
45
+ const children = /* @__PURE__ */ new Map();
46
+ const froms = /* @__PURE__ */ new Set();
47
+ const tos = /* @__PURE__ */ new Set();
48
+ for (const assoc of model.presAssociations) {
49
+ if (assoc.structure !== structureId) continue;
50
+ const kids = children.get(assoc.parent) ?? [];
51
+ kids.push([assoc.order, assoc.child]);
52
+ children.set(assoc.parent, kids);
53
+ froms.add(assoc.parent);
54
+ tos.add(assoc.child);
55
+ }
56
+ for (const kids of children.values()) {
57
+ kids.sort((a, b) => a[0] - b[0]);
58
+ }
59
+ const out = /* @__PURE__ */ new Map();
60
+ const seen = /* @__PURE__ */ new Set();
61
+ let counter = 0;
62
+ const walk = (node, depth) => {
63
+ if (seen.has(node)) return;
64
+ seen.add(node);
65
+ for (const [, child] of children.get(node) ?? []) {
66
+ walk(child, depth + 1);
67
+ }
68
+ out.set(node, { order: counter, depth });
69
+ counter += 1;
70
+ };
71
+ const rootKey = (root) => {
72
+ const kids = children.get(root);
73
+ return kids && kids.length ? kids[0][0] : 0;
74
+ };
75
+ const roots = [...froms].filter((f) => !tos.has(f)).sort((a, b) => rootKey(a) - rootKey(b));
76
+ for (const root of roots) walk(root, 0);
77
+ return out;
78
+ }
79
+ function calcSubtotals(model) {
80
+ const out = /* @__PURE__ */ new Set();
81
+ for (const assoc of model.calcAssociations) out.add(assoc.parent);
82
+ return out;
83
+ }
84
+ function structureForBlock(model, blockType) {
85
+ return model.structures.find((s) => s.blockType === blockType) ?? null;
86
+ }
87
+ function columnLabel(period) {
88
+ return formatDate(period.end);
89
+ }
90
+ function deriveColumns(model, facts) {
91
+ const byEnd = /* @__PURE__ */ new Map();
92
+ for (const fact of facts) {
93
+ const period = model.periods[fact.period];
94
+ if (!period || !period.end) continue;
95
+ const existing = byEnd.get(period.end);
96
+ if (!existing || existing.type === "instant" && period.type === "duration") {
97
+ byEnd.set(period.end, period);
98
+ }
99
+ }
100
+ return [...byEnd.values()].sort((a, b) => {
101
+ const aStart = a.startDate ?? a.end;
102
+ const bStart = b.startDate ?? b.end;
103
+ return aStart.localeCompare(bStart) || a.end.localeCompare(b.end);
104
+ }).map((period) => ({ key: period.end, label: columnLabel(period), period }));
105
+ }
106
+ function buildStatement(model, ib, subtotals) {
107
+ const structure = structureForBlock(model, ib.blockType);
108
+ const order = structure ? presentationOrder(model, structure.id) : /* @__PURE__ */ new Map();
109
+ const facts = model.facts.filter((f) => f.factSet !== null && f.factSet === ib.factSet);
110
+ const columns = deriveColumns(model, facts);
111
+ const colIndex = new Map(columns.map((c, i) => [c.key, i]));
112
+ const cellsByElement = /* @__PURE__ */ new Map();
113
+ for (const fact of facts) {
114
+ const period = model.periods[fact.period];
115
+ if (!period) continue;
116
+ const idx = colIndex.get(period.end);
117
+ if (idx === void 0) continue;
118
+ let cells = cellsByElement.get(fact.element);
119
+ if (!cells) {
120
+ cells = columns.map(() => ({ value: null, fact: null }));
121
+ cellsByElement.set(fact.element, cells);
122
+ }
123
+ cells[idx] = { value: fact.value, fact };
124
+ }
125
+ const rows = [...cellsByElement.keys()].map((id) => {
126
+ const entry = order.get(id);
127
+ return {
128
+ id,
129
+ order: entry ? entry.order : Number.MAX_SAFE_INTEGER,
130
+ depth: entry ? entry.depth : 0
131
+ };
132
+ }).sort((a, b) => a.order - b.order || a.id.localeCompare(b.id)).map(({ id, depth }) => ({
133
+ element: model.elements[id] ?? fallbackElement(id),
134
+ depth,
135
+ isSubtotal: subtotals.has(id),
136
+ cells: cellsByElement.get(id)
137
+ }));
138
+ return {
139
+ ib,
140
+ blockType: ib.blockType,
141
+ title: BLOCK_TITLES[ib.blockType] ?? ib.label ?? ib.blockType,
142
+ structureName: structure?.structureName ?? ib.label ?? null,
143
+ columns,
144
+ rows
145
+ };
146
+ }
147
+ function buildStatements(model) {
148
+ const subtotals = calcSubtotals(model);
149
+ return [...model.informationBlocks].sort(
150
+ (a, b) => (BLOCK_ORDER[a.blockType] ?? 99) - (BLOCK_ORDER[b.blockType] ?? 99) || a.blockType.localeCompare(b.blockType)
151
+ ).map((ib) => buildStatement(model, ib, subtotals));
152
+ }
153
+ function footCheck(model, statement, elementId, columnIndex) {
154
+ const kids = model.calcAssociations.filter((a) => a.parent === elementId);
155
+ if (!kids.length) return null;
156
+ const valueOf = (id) => {
157
+ const row = statement.rows.find((r) => r.element.id === id);
158
+ return row ? row.cells[columnIndex]?.value ?? null : null;
159
+ };
160
+ const terms = kids.slice().sort((a, b) => a.order - b.order).map((a) => ({
161
+ element: model.elements[a.child] ?? fallbackElement(a.child),
162
+ weight: a.weight,
163
+ value: valueOf(a.child)
164
+ }));
165
+ const present = terms.filter((t) => t.value !== null);
166
+ const expected = present.length ? present.reduce((sum, t) => sum + t.value * t.weight, 0) : null;
167
+ const actual = valueOf(elementId);
168
+ const ok = expected !== null && actual !== null && Math.abs(expected - actual) < 5e-3;
169
+ return {
170
+ element: model.elements[elementId] ?? fallbackElement(elementId),
171
+ columnIndex,
172
+ terms,
173
+ expected,
174
+ actual,
175
+ ok
176
+ };
177
+ }
178
+ var styles = {
179
+ panel: {
180
+ fontFamily: "var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)",
181
+ color: "var(--rs-text, #111827)",
182
+ border: "1px solid var(--rs-border, #e5e7eb)",
183
+ borderRadius: "12px",
184
+ padding: "1rem 1.25rem",
185
+ background: "var(--rs-panel-bg, #ffffff)",
186
+ boxShadow: "0 1px 3px rgba(0,0,0,0.08)"
187
+ },
188
+ header: {
189
+ display: "flex",
190
+ justifyContent: "space-between",
191
+ alignItems: "flex-start",
192
+ gap: "1rem",
193
+ marginBottom: "0.75rem"
194
+ },
195
+ label: { fontSize: "1rem", fontWeight: 700, margin: 0 },
196
+ qname: {
197
+ fontFamily: "var(--rs-font-mono, ui-monospace, monospace)",
198
+ fontSize: "0.8rem",
199
+ color: "var(--rs-primary-700, #1d4ed8)"
200
+ },
201
+ close: {
202
+ border: "none",
203
+ background: "transparent",
204
+ fontSize: "1.25rem",
205
+ lineHeight: 1,
206
+ cursor: "pointer",
207
+ color: "var(--rs-muted, #6b7280)"
208
+ },
209
+ grid: {
210
+ display: "grid",
211
+ gridTemplateColumns: "auto 1fr",
212
+ gap: "0.35rem 1rem",
213
+ fontSize: "0.85rem",
214
+ margin: "0.5rem 0"
215
+ },
216
+ key: { color: "var(--rs-muted, #6b7280)" },
217
+ mono: { fontFamily: "var(--rs-font-mono, ui-monospace, monospace)" },
218
+ footing: {
219
+ marginTop: "0.85rem",
220
+ paddingTop: "0.75rem",
221
+ borderTop: "1px solid var(--rs-border, #e5e7eb)"
222
+ },
223
+ footTitle: {
224
+ fontSize: "0.75rem",
225
+ textTransform: "uppercase",
226
+ letterSpacing: "0.05em",
227
+ color: "var(--rs-muted, #6b7280)",
228
+ marginBottom: "0.4rem"
229
+ },
230
+ equation: {
231
+ fontFamily: "var(--rs-font-mono, ui-monospace, monospace)",
232
+ fontSize: "0.85rem",
233
+ lineHeight: 1.6
234
+ }
235
+ };
236
+ function Field({ k, children }) {
237
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
238
+ /* @__PURE__ */ jsx("span", { style: styles.key, children: k }),
239
+ /* @__PURE__ */ jsx("span", { children })
240
+ ] });
241
+ }
242
+ function FactInspector({
243
+ report,
244
+ statement,
245
+ row,
246
+ columnIndex,
247
+ onClose,
248
+ currencySymbol = "$"
249
+ }) {
250
+ const { element } = row;
251
+ const cell = row.cells[columnIndex];
252
+ const column = statement.columns[columnIndex];
253
+ const unit = cell.fact?.unit ? report.units[cell.fact.unit] : null;
254
+ const foot = footCheck(report, statement, element.id, columnIndex);
255
+ const sym = currencySymbol;
256
+ return /* @__PURE__ */ jsxs("div", { style: styles.panel, children: [
257
+ /* @__PURE__ */ jsxs("div", { style: styles.header, children: [
258
+ /* @__PURE__ */ jsxs("div", { children: [
259
+ /* @__PURE__ */ jsx("p", { style: styles.label, children: element.label }),
260
+ /* @__PURE__ */ jsx("span", { style: styles.qname, children: element.qname })
261
+ ] }),
262
+ onClose ? /* @__PURE__ */ jsx("button", { style: styles.close, onClick: onClose, "aria-label": "Close", children: "\xD7" }) : null
263
+ ] }),
264
+ /* @__PURE__ */ jsxs("div", { style: styles.grid, children: [
265
+ /* @__PURE__ */ jsx(Field, { k: "Value", children: /* @__PURE__ */ jsx("span", { style: styles.mono, children: formatMoney(cell.value, { currencySymbol: sym }) }) }),
266
+ /* @__PURE__ */ jsxs(Field, { k: "Period", children: [
267
+ formatPeriod(column.period),
268
+ " ",
269
+ /* @__PURE__ */ jsxs("span", { style: styles.key, children: [
270
+ "(",
271
+ column.period.type,
272
+ ")"
273
+ ] })
274
+ ] }),
275
+ /* @__PURE__ */ jsx(Field, { k: "Unit", children: unit ? unit.label : "\u2014" }),
276
+ element.balance ? /* @__PURE__ */ jsx(Field, { k: "Balance", children: element.balance }) : null,
277
+ cell.fact?.decimals ? /* @__PURE__ */ jsx(Field, { k: "Decimals", children: cell.fact.decimals }) : null
278
+ ] }),
279
+ foot ? /* @__PURE__ */ jsxs("div", { style: styles.footing, children: [
280
+ /* @__PURE__ */ jsxs("div", { style: styles.footTitle, children: [
281
+ "Calculation ",
282
+ foot.ok ? "\u2713 foots" : "\u26A0 does not foot"
283
+ ] }),
284
+ /* @__PURE__ */ jsxs("div", { style: styles.equation, children: [
285
+ foot.terms.map((term, i) => {
286
+ const op = i === 0 ? term.weight < 0 ? "\u2212" : "" : term.weight < 0 ? " \u2212 " : " + ";
287
+ return /* @__PURE__ */ jsxs("span", { title: term.element.qname, children: [
288
+ op,
289
+ formatMoney(term.value === null ? 0 : Math.abs(term.value), {
290
+ currencySymbol: sym
291
+ })
292
+ ] }, term.element.id);
293
+ }),
294
+ " = ",
295
+ /* @__PURE__ */ jsx("strong", { children: formatMoney(foot.expected, { currencySymbol: sym }) }),
296
+ " ",
297
+ foot.ok ? /* @__PURE__ */ jsx("span", { style: { color: "var(--rs-success, #00875a)" }, children: "\u2713" }) : /* @__PURE__ */ jsxs("span", { style: { color: "var(--rs-error, #dc2626)" }, children: [
298
+ "\u2717 (reported ",
299
+ formatMoney(foot.actual, { currencySymbol: sym }),
300
+ ")"
301
+ ] })
302
+ ] })
303
+ ] }) : null
304
+ ] });
305
+ }
306
+ var styles2 = {
307
+ wrap: {
308
+ fontFamily: "var(--rs-font-sans, ui-sans-serif, system-ui, sans-serif)",
309
+ color: "var(--rs-text, #111827)",
310
+ marginBottom: "2.5rem"
311
+ },
312
+ heading: {
313
+ textAlign: "center",
314
+ marginBottom: "1rem"
315
+ },
316
+ title: {
317
+ fontFamily: "var(--rs-font-heading, var(--rs-font-sans, sans-serif))",
318
+ fontSize: "1.15rem",
319
+ fontWeight: 700,
320
+ letterSpacing: "0.02em",
321
+ margin: 0
322
+ },
323
+ subtitle: {
324
+ fontSize: "0.85rem",
325
+ color: "var(--rs-muted, #6b7280)",
326
+ marginTop: "0.25rem"
327
+ },
328
+ table: {
329
+ width: "100%",
330
+ borderCollapse: "collapse",
331
+ fontSize: "0.875rem"
332
+ },
333
+ th: {
334
+ borderBottom: "2px solid var(--rs-border-strong, #9ca3af)",
335
+ padding: "0.5rem 0.75rem",
336
+ fontWeight: 600,
337
+ color: "var(--rs-muted, #6b7280)",
338
+ fontSize: "0.8rem"
339
+ },
340
+ thConcept: { textAlign: "left" },
341
+ thNum: { textAlign: "right", whiteSpace: "nowrap" },
342
+ labelCell: {
343
+ padding: "0.3rem 0.75rem",
344
+ whiteSpace: "normal"
345
+ },
346
+ numCell: {
347
+ padding: "0.3rem 0.75rem",
348
+ textAlign: "right",
349
+ whiteSpace: "nowrap",
350
+ fontFamily: "var(--rs-font-mono, ui-monospace, SFMono-Regular, monospace)",
351
+ fontVariantNumeric: "tabular-nums"
352
+ }
353
+ };
354
+ function StatementTable({
355
+ statement,
356
+ onCellClick,
357
+ currencySymbol = "$",
358
+ selected = null
359
+ }) {
360
+ const { columns, rows } = statement;
361
+ const periodCaption = columns.length === 1 ? formatPeriod(columns[0].period) : null;
362
+ return /* @__PURE__ */ jsxs("section", { style: styles2.wrap, children: [
363
+ /* @__PURE__ */ jsxs("header", { style: styles2.heading, children: [
364
+ /* @__PURE__ */ jsx("h3", { style: styles2.title, children: statement.title }),
365
+ statement.structureName ? /* @__PURE__ */ jsx("div", { style: styles2.subtitle, children: statement.structureName }) : null,
366
+ periodCaption ? /* @__PURE__ */ jsx("div", { style: styles2.subtitle, children: periodCaption }) : null
367
+ ] }),
368
+ /* @__PURE__ */ jsxs("table", { style: styles2.table, children: [
369
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
370
+ /* @__PURE__ */ jsx("th", { style: { ...styles2.th, ...styles2.thConcept }, children: "Concept" }),
371
+ columns.map((col) => /* @__PURE__ */ jsx("th", { style: { ...styles2.th, ...styles2.thNum }, children: col.label }, col.key))
372
+ ] }) }),
373
+ /* @__PURE__ */ jsx("tbody", { children: rows.map((row) => {
374
+ const isGrandTotal = row.isSubtotal && row.depth === 0;
375
+ const allZeroOrNull = row.cells.every((c) => c.value === null || c.value === 0);
376
+ const rowStyle = {
377
+ backgroundColor: row.isSubtotal ? "var(--rs-subtotal-bg, #f9fafb)" : void 0
378
+ };
379
+ const labelStyle = {
380
+ ...styles2.labelCell,
381
+ paddingLeft: `${row.depth * 20 + 12}px`,
382
+ fontWeight: row.isSubtotal ? 600 : 400,
383
+ color: !row.isSubtotal && allZeroOrNull ? "var(--rs-muted, #9ca3af)" : void 0,
384
+ borderBottom: isGrandTotal ? "3px double var(--rs-text, #111827)" : void 0
385
+ };
386
+ return /* @__PURE__ */ jsxs("tr", { style: rowStyle, children: [
387
+ /* @__PURE__ */ jsx("td", { style: labelStyle, title: row.element.qname, children: row.element.label }),
388
+ row.cells.map((cell, i) => {
389
+ const isSelected = selected !== null && selected.elementId === row.element.id && selected.columnIndex === i;
390
+ const clickable = onCellClick && cell.fact !== null;
391
+ const numStyle = {
392
+ ...styles2.numCell,
393
+ fontWeight: row.isSubtotal ? 600 : 400,
394
+ borderBottom: isGrandTotal ? "3px double var(--rs-text, #111827)" : void 0,
395
+ cursor: clickable ? "pointer" : "default",
396
+ backgroundColor: isSelected ? "var(--rs-selected-bg, #dbeafe)" : void 0,
397
+ color: !row.isSubtotal && (cell.value === null || cell.value === 0) ? "var(--rs-muted, #9ca3af)" : void 0
398
+ };
399
+ return /* @__PURE__ */ jsx(
400
+ "td",
401
+ {
402
+ style: numStyle,
403
+ onClick: clickable ? () => onCellClick?.(row, i) : void 0,
404
+ children: formatMoney(cell.value, { currencySymbol })
405
+ },
406
+ columns[i].key
407
+ );
408
+ })
409
+ ] }, row.element.id);
410
+ }) })
411
+ ] })
412
+ ] });
413
+ }
414
+ var styles3 = {
415
+ layout: {
416
+ display: "grid",
417
+ gridTemplateColumns: "minmax(0, 1fr)",
418
+ gap: "1.5rem",
419
+ alignItems: "start"
420
+ },
421
+ layoutWithPanel: {
422
+ gridTemplateColumns: "minmax(0, 1fr) 340px"
423
+ },
424
+ entity: {
425
+ fontFamily: "var(--rs-font-heading, var(--rs-font-sans, sans-serif))",
426
+ textAlign: "center",
427
+ marginBottom: "1.5rem"
428
+ },
429
+ entityName: {
430
+ fontSize: "1.5rem",
431
+ fontWeight: 700,
432
+ margin: 0,
433
+ color: "var(--rs-text, #111827)"
434
+ },
435
+ entitySub: { fontSize: "0.85rem", color: "var(--rs-muted, #6b7280)" },
436
+ panel: { position: "sticky", top: "1rem" }
437
+ };
438
+ function ReportView({ report, currencySymbol = "$", inspect = true }) {
439
+ const statements = useMemo(() => buildStatements(report), [report]);
440
+ const [selection, setSelection] = useState(null);
441
+ const selected = selection !== null ? statements[selection.statementIndex] : null;
442
+ const selectedRow = selected?.rows.find((r) => r.element.id === selection?.elementId) ?? null;
443
+ return /* @__PURE__ */ jsxs("div", { children: [
444
+ report.entity ? /* @__PURE__ */ jsxs("header", { style: styles3.entity, children: [
445
+ /* @__PURE__ */ jsx("h2", { style: styles3.entityName, children: report.entity.name }),
446
+ report.entity.country ? /* @__PURE__ */ jsx("div", { style: styles3.entitySub, children: report.entity.country }) : null
447
+ ] }) : null,
448
+ /* @__PURE__ */ jsxs(
449
+ "div",
450
+ {
451
+ style: {
452
+ ...styles3.layout,
453
+ ...inspect && selectedRow ? styles3.layoutWithPanel : {}
454
+ },
455
+ children: [
456
+ /* @__PURE__ */ jsx("div", { children: statements.map((statement, statementIndex) => /* @__PURE__ */ jsx(
457
+ StatementTable,
458
+ {
459
+ statement,
460
+ currencySymbol,
461
+ selected: selection && selection.statementIndex === statementIndex ? {
462
+ elementId: selection.elementId,
463
+ columnIndex: selection.columnIndex
464
+ } : null,
465
+ onCellClick: inspect ? (row, columnIndex) => setSelection({
466
+ statementIndex,
467
+ elementId: row.element.id,
468
+ columnIndex
469
+ }) : void 0
470
+ },
471
+ statement.ib.id
472
+ )) }),
473
+ inspect && selected && selectedRow && selection ? /* @__PURE__ */ jsx("div", { style: styles3.panel, children: /* @__PURE__ */ jsx(
474
+ FactInspector,
475
+ {
476
+ report,
477
+ statement: selected,
478
+ row: selectedRow,
479
+ columnIndex: selection.columnIndex,
480
+ currencySymbol,
481
+ onClose: () => setSelection(null)
482
+ }
483
+ ) }) : null
484
+ ]
485
+ }
486
+ )
487
+ ] });
488
+ }
489
+
490
+ export { FactInspector, ReportView, StatementTable, buildStatements, calcSubtotals, footCheck, formatDate, formatMoney, formatPeriod, presentationOrder };
491
+ //# sourceMappingURL=index.js.map
24
492
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC5E,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AAEzB,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAG5D,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"sources":["../src/format.ts","../src/project.ts","../src/components/FactInspector.tsx","../src/components/StatementTable.tsx","../src/components/ReportView.tsx"],"names":["styles","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 { 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/** 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 * Reconstruction: a `NormalizedReport` → renderable `Statement`s.\n *\n * This is the source-agnostic half of the library — the part that is identical\n * for every adapter. It is a TypeScript port of the RoboSystems platform's\n * DataBook converter:\n *\n * - **presentation walk** — a post-order DFS of the presentation network, so a\n * total renders *after* its components (cash + receivables … then *Assets,\n * Current*; the section subtotals last). `order` is the flattened post-order\n * position; `depth` is the tree depth (drives indentation).\n * - **subtotal detection** — a concept is a subtotal iff it is a *calculation\n * parent*. A presentation leaf can still be a subtotal (Gross Profit is a\n * presentation sibling but a calculation parent), so bolding off the calc\n * tree marks exactly the right rows.\n * - **table projection** — collect a block's facts by `factSet`, key by\n * element, derive period columns from the facts themselves, lay rows out in\n * presentation order.\n */\nimport { BLOCK_ORDER, BLOCK_TITLES, humanize, qname } from './constants'\nimport { formatDate } from './format'\nimport type {\n CalcAssociation,\n ElementInfo,\n Fact,\n InformationBlock,\n NormalizedReport,\n PeriodInfo,\n RowCell,\n Statement,\n StatementColumn,\n StatementRow,\n StructureInfo,\n} 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, so a balance sheet's roots (Assets, then Liabilities and Equity)\n * come out in the right sequence.\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\nfunction structureForBlock(model: NormalizedReport, blockType: string): StructureInfo | null {\n return model.structures.find((s) => s.blockType === blockType) ?? null\n}\n\nfunction columnLabel(period: PeriodInfo): string {\n return formatDate(period.end)\n}\n\n/** Period columns derived from the facts in one block, keyed and sorted by end. */\nfunction deriveColumns(model: NormalizedReport, facts: Fact[]): StatementColumn[] {\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 // Prefer a duration as the column representative — it carries the span.\n if (!existing || (existing.type === 'instant' && period.type === 'duration')) {\n byEnd.set(period.end, period)\n }\n }\n return [...byEnd.values()]\n .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 .map((period) => ({ key: period.end, label: columnLabel(period), period }))\n}\n\nfunction buildStatement(\n model: NormalizedReport,\n ib: InformationBlock,\n subtotals: Set<string>\n): Statement {\n const structure = structureForBlock(model, ib.blockType)\n const order = structure ? presentationOrder(model, structure.id) : new Map<string, OrderEntry>()\n\n const facts = model.facts.filter((f) => f.factSet !== null && f.factSet === ib.factSet)\n const columns = deriveColumns(model, facts)\n const colIndex = new Map(columns.map((c, i) => [c.key, i]))\n\n const cellsByElement = new Map<string, RowCell[]>()\n for (const fact of facts) {\n const period = model.periods[fact.period]\n if (!period) continue\n const idx = colIndex.get(period.end)\n if (idx === undefined) continue\n let cells = cellsByElement.get(fact.element)\n if (!cells) {\n cells = columns.map(() => ({ value: null, fact: null }))\n cellsByElement.set(fact.element, cells)\n }\n cells[idx] = { value: fact.value, fact }\n }\n\n const rows: StatementRow[] = [...cellsByElement.keys()]\n .map((id) => {\n const entry = order.get(id)\n return {\n id,\n order: entry ? entry.order : Number.MAX_SAFE_INTEGER,\n depth: entry ? entry.depth : 0,\n }\n })\n .sort((a, b) => a.order - b.order || a.id.localeCompare(b.id))\n .map(({ id, depth }) => ({\n element: model.elements[id] ?? fallbackElement(id),\n depth,\n isSubtotal: subtotals.has(id),\n cells: cellsByElement.get(id) as RowCell[],\n }))\n\n return {\n ib,\n blockType: ib.blockType,\n title: BLOCK_TITLES[ib.blockType] ?? ib.label ?? ib.blockType,\n structureName: structure?.structureName ?? ib.label ?? null,\n columns,\n rows,\n }\n}\n\n/** Reconstruct every statement in the report, in canonical block order. */\nexport function buildStatements(model: NormalizedReport): Statement[] {\n const subtotals = calcSubtotals(model)\n return [...model.informationBlocks]\n .sort(\n (a, b) =>\n (BLOCK_ORDER[a.blockType] ?? 99) - (BLOCK_ORDER[b.blockType] ?? 99) ||\n a.blockType.localeCompare(b.blockType)\n )\n .map((ib) => buildStatement(model, ib, subtotals))\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).\n */\nexport function footCheck(\n model: NormalizedReport,\n statement: Statement,\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 = statement.rows.find((r) => r.element.id === id)\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 * Click-a-fact inspection: the selected cell's element / period / unit, plus —\n * when the element is a calculation subtotal — the calculation rule it foots,\n * computed live in the browser (`13,550 + 900 = 14,450 ✓`).\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport { formatMoney, formatPeriod } from '../format'\nimport type { NormalizedReport, Statement, StatementRow } from '../model'\nimport { footCheck } from '../project'\n\nexport interface FactInspectorProps {\n report: NormalizedReport\n statement: Statement\n row: StatementRow\n columnIndex: number\n onClose?: () => void\n currencySymbol?: string\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 label: { fontSize: '1rem', fontWeight: 700, margin: 0 },\n qname: {\n fontFamily: 'var(--rs-font-mono, ui-monospace, monospace)',\n fontSize: '0.8rem',\n color: 'var(--rs-primary-700, #1d4ed8)',\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 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\nexport function FactInspector({\n report,\n statement,\n row,\n columnIndex,\n onClose,\n currencySymbol = '$',\n}: FactInspectorProps) {\n const { element } = row\n const cell = row.cells[columnIndex]\n const column = statement.columns[columnIndex]\n const unit = cell.fact?.unit ? report.units[cell.fact.unit] : null\n const foot = footCheck(report, statement, element.id, columnIndex)\n const sym = currencySymbol\n\n return (\n <div style={styles.panel}>\n <div style={styles.header}>\n <div>\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 <span style={styles.mono}>{formatMoney(cell.value, { currencySymbol: sym })}</span>\n </Field>\n <Field k=\"Period\">\n {formatPeriod(column.period)} <span style={styles.key}>({column.period.type})</span>\n </Field>\n <Field k=\"Unit\">{unit ? unit.label : '—'}</Field>\n {element.balance ? <Field k=\"Balance\">{element.balance}</Field> : null}\n {cell.fact?.decimals ? <Field k=\"Decimals\">{cell.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 {formatMoney(term.value === null ? 0 : Math.abs(term.value), {\n currencySymbol: sym,\n })}\n </span>\n )\n })}\n {' = '}\n <strong>{formatMoney(foot.expected, { currencySymbol: sym })}</strong>{' '}\n {foot.ok ? (\n <span style={{ color: 'var(--rs-success, #00875a)' }}>✓</span>\n ) : (\n <span style={{ color: 'var(--rs-error, #dc2626)' }}>\n ✗ (reported {formatMoney(foot.actual, { currencySymbol: sym })})\n </span>\n )}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * Renders one reconstructed `Statement` as a financial-statement table.\n *\n * Framework-agnostic plain React — no `next/*`, no CSS framework required. Styled\n * with inline styles that read CSS custom properties (`--rs-*`) so a host app can\n * theme it, with sensible RoboSystems defaults baked in as fallbacks.\n */\nimport type { CSSProperties } from 'react'\nimport { formatMoney, formatPeriod } from '../format'\nimport type { Statement, StatementRow } from '../model'\n\nexport interface StatementTableProps {\n statement: Statement\n /** Called when a value cell is clicked — drives fact inspection. */\n onCellClick?: (row: StatementRow, columnIndex: number) => void\n /** Currency symbol for values (default `$`). */\n currencySymbol?: string\n /** The currently-selected cell, highlighted. */\n selected?: { elementId: string; columnIndex: number } | null\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: {\n textAlign: 'center',\n marginBottom: '1rem',\n },\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: {\n fontSize: '0.85rem',\n color: 'var(--rs-muted, #6b7280)',\n marginTop: '0.25rem',\n },\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: '0.875rem',\n },\n th: {\n borderBottom: '2px solid var(--rs-border-strong, #9ca3af)',\n padding: '0.5rem 0.75rem',\n fontWeight: 600,\n color: 'var(--rs-muted, #6b7280)',\n fontSize: '0.8rem',\n },\n thConcept: { textAlign: 'left' },\n thNum: { textAlign: 'right', whiteSpace: 'nowrap' },\n labelCell: {\n padding: '0.3rem 0.75rem',\n whiteSpace: 'normal',\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}\n\nexport function StatementTable({\n statement,\n onCellClick,\n currencySymbol = '$',\n selected = null,\n}: StatementTableProps) {\n const { columns, rows } = statement\n const periodCaption = columns.length === 1 ? formatPeriod(columns[0].period) : null\n\n return (\n <section style={styles.wrap}>\n <header style={styles.heading}>\n <h3 style={styles.title}>{statement.title}</h3>\n {statement.structureName ? (\n <div style={styles.subtitle}>{statement.structureName}</div>\n ) : null}\n {periodCaption ? <div style={styles.subtitle}>{periodCaption}</div> : null}\n </header>\n\n <table style={styles.table}>\n <thead>\n <tr>\n <th style={{ ...styles.th, ...styles.thConcept }}>Concept</th>\n {columns.map((col) => (\n <th key={col.key} style={{ ...styles.th, ...styles.thNum }}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => {\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.element.id} style={rowStyle}>\n <td style={labelStyle} title={row.element.qname}>\n {row.element.label}\n </td>\n {row.cells.map((cell, i) => {\n const isSelected =\n selected !== null &&\n selected.elementId === row.element.id &&\n selected.columnIndex === i\n const clickable = onCellClick && cell.fact !== null\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 !row.isSubtotal && (cell.value === null || cell.value === 0)\n ? 'var(--rs-muted, #9ca3af)'\n : undefined,\n }\n return (\n <td\n key={columns[i].key}\n style={numStyle}\n onClick={clickable ? () => onCellClick?.(row, i) : undefined}\n >\n {formatMoney(cell.value, { currencySymbol })}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </section>\n )\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, StatementRow } from '../model'\nimport { buildStatements } from '../project'\nimport { FactInspector } from './FactInspector'\nimport { StatementTable } from './StatementTable'\n\nexport interface ReportViewProps {\n report: NormalizedReport\n currencySymbol?: string\n /** Disable the click-to-inspect fact panel (render-only). */\n inspect?: boolean\n}\n\ninterface Selection {\n statementIndex: number\n elementId: 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 entitySub: { fontSize: '0.85rem', color: 'var(--rs-muted, #6b7280)' },\n panel: { position: 'sticky', top: '1rem' },\n}\n\nexport function ReportView({ report, currencySymbol = '$', inspect = true }: ReportViewProps) {\n const statements = useMemo(() => buildStatements(report), [report])\n const [selection, setSelection] = useState<Selection | null>(null)\n\n const selected = selection !== null ? statements[selection.statementIndex] : null\n const selectedRow = selected?.rows.find((r) => r.element.id === selection?.elementId) ?? null\n\n return (\n <div>\n {report.entity ? (\n <header style={styles.entity}>\n <h2 style={styles.entityName}>{report.entity.name}</h2>\n {report.entity.country ? (\n <div style={styles.entitySub}>{report.entity.country}</div>\n ) : null}\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 statement={statement}\n currencySymbol={currencySymbol}\n selected={\n selection && selection.statementIndex === statementIndex\n ? {\n elementId: selection.elementId,\n columnIndex: selection.columnIndex,\n }\n : null\n }\n onCellClick={\n inspect\n ? (row: StatementRow, columnIndex: number) =>\n setSelection({\n statementIndex,\n elementId: row.element.id,\n columnIndex,\n })\n : undefined\n }\n />\n ))}\n </div>\n\n {inspect && selected && selectedRow && selection ? (\n <div style={styles.panel}>\n <FactInspector\n report={report}\n statement={selected}\n row={selectedRow}\n columnIndex={selection.columnIndex}\n currencySymbol={currencySymbol}\n onClose={() => setSelection(null)}\n />\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosystems/report-components",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Source-agnostic React components for rendering XBRL-grade financial statements",
5
5
  "license": "MIT",
6
6
  "author": "RFS LLC",
@@ -24,7 +24,7 @@
24
24
  ],
25
25
  "sideEffects": false,
26
26
  "scripts": {
27
- "build": "tsc -p tsconfig.build.json",
27
+ "build": "tsup",
28
28
  "format": "prettier . --write",
29
29
  "format:check": "prettier . --check",
30
30
  "lint": "eslint .",
@@ -68,6 +68,7 @@
68
68
  "prettier-plugin-organize-imports": "^4.0.0",
69
69
  "react": "^19.2.0",
70
70
  "react-dom": "^19.2.0",
71
+ "tsup": "^8.5.1",
71
72
  "typescript": "^5.7.2",
72
73
  "typescript-eslint": "^8.54.0",
73
74
  "vitest": "^4.1.4"