@the-syllabus/analysis-renderers 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/cells/RelationshipCardCell.d.ts +10 -0
  2. package/dist/cells/RelationshipCardCell.d.ts.map +1 -0
  3. package/dist/cells/RelationshipCardCell.js +91 -0
  4. package/dist/cells/RelationshipCardCell.js.map +1 -0
  5. package/dist/cells/TacticCardCell.d.ts +12 -0
  6. package/dist/cells/TacticCardCell.d.ts.map +1 -0
  7. package/dist/cells/TacticCardCell.js +77 -0
  8. package/dist/cells/TacticCardCell.js.map +1 -0
  9. package/dist/cells/TemplateCardCell.d.ts +29 -0
  10. package/dist/cells/TemplateCardCell.d.ts.map +1 -0
  11. package/dist/cells/TemplateCardCell.js +202 -0
  12. package/dist/cells/TemplateCardCell.js.map +1 -0
  13. package/dist/cells/index.d.ts +15 -0
  14. package/dist/cells/index.d.ts.map +1 -0
  15. package/dist/cells/index.js +85 -0
  16. package/dist/cells/index.js.map +1 -0
  17. package/dist/components/ConditionCards.d.ts +18 -0
  18. package/dist/components/ConditionCards.d.ts.map +1 -0
  19. package/dist/components/ConditionCards.js +28 -0
  20. package/dist/components/ConditionCards.js.map +1 -0
  21. package/dist/components/EvidenceTrail.d.ts +54 -0
  22. package/dist/components/EvidenceTrail.d.ts.map +1 -0
  23. package/dist/components/EvidenceTrail.js +98 -0
  24. package/dist/components/EvidenceTrail.js.map +1 -0
  25. package/dist/dispatch/SubRendererDispatch.d.ts +39 -0
  26. package/dist/dispatch/SubRendererDispatch.d.ts.map +1 -0
  27. package/dist/dispatch/SubRendererDispatch.js +153 -0
  28. package/dist/dispatch/SubRendererDispatch.js.map +1 -0
  29. package/dist/hooks/useProseExtraction.d.ts +38 -0
  30. package/dist/hooks/useProseExtraction.d.ts.map +1 -0
  31. package/dist/hooks/useProseExtraction.js +93 -0
  32. package/dist/hooks/useProseExtraction.js.map +1 -0
  33. package/dist/index.d.ts +32 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +38 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/provenance/ProvenanceSectionIcon.d.ts +15 -0
  38. package/dist/provenance/ProvenanceSectionIcon.d.ts.map +1 -0
  39. package/dist/provenance/ProvenanceSectionIcon.js +11 -0
  40. package/dist/provenance/ProvenanceSectionIcon.js.map +1 -0
  41. package/dist/renderers/AccordionRenderer.d.ts +29 -0
  42. package/dist/renderers/AccordionRenderer.d.ts.map +1 -0
  43. package/dist/renderers/AccordionRenderer.js +315 -0
  44. package/dist/renderers/AccordionRenderer.js.map +1 -0
  45. package/dist/renderers/CardGridRenderer.d.ts +24 -0
  46. package/dist/renderers/CardGridRenderer.d.ts.map +1 -0
  47. package/dist/renderers/CardGridRenderer.js +321 -0
  48. package/dist/renderers/CardGridRenderer.js.map +1 -0
  49. package/dist/renderers/CardRenderer.d.ts +27 -0
  50. package/dist/renderers/CardRenderer.d.ts.map +1 -0
  51. package/dist/renderers/CardRenderer.js +337 -0
  52. package/dist/renderers/CardRenderer.js.map +1 -0
  53. package/dist/renderers/IdeaEvolutionRenderer.d.ts +16 -0
  54. package/dist/renderers/IdeaEvolutionRenderer.d.ts.map +1 -0
  55. package/dist/renderers/IdeaEvolutionRenderer.js +187 -0
  56. package/dist/renderers/IdeaEvolutionRenderer.js.map +1 -0
  57. package/dist/renderers/ProseRenderer.d.ts +10 -0
  58. package/dist/renderers/ProseRenderer.d.ts.map +1 -0
  59. package/dist/renderers/ProseRenderer.js +42 -0
  60. package/dist/renderers/ProseRenderer.js.map +1 -0
  61. package/dist/renderers/RawJsonRenderer.d.ts +8 -0
  62. package/dist/renderers/RawJsonRenderer.d.ts.map +1 -0
  63. package/dist/renderers/RawJsonRenderer.js +17 -0
  64. package/dist/renderers/RawJsonRenderer.js.map +1 -0
  65. package/dist/renderers/StatSummaryRenderer.d.ts +12 -0
  66. package/dist/renderers/StatSummaryRenderer.d.ts.map +1 -0
  67. package/dist/renderers/StatSummaryRenderer.js +93 -0
  68. package/dist/renderers/StatSummaryRenderer.js.map +1 -0
  69. package/dist/renderers/SynthesisRenderer.d.ts +15 -0
  70. package/dist/renderers/SynthesisRenderer.d.ts.map +1 -0
  71. package/dist/renderers/SynthesisRenderer.js +60 -0
  72. package/dist/renderers/SynthesisRenderer.js.map +1 -0
  73. package/dist/renderers/TableRenderer.d.ts +19 -0
  74. package/dist/renderers/TableRenderer.d.ts.map +1 -0
  75. package/dist/renderers/TableRenderer.js +273 -0
  76. package/dist/renderers/TableRenderer.js.map +1 -0
  77. package/dist/styles/accordion.css +376 -0
  78. package/dist/styles/index.css +5 -0
  79. package/dist/styles/renderers.css +1049 -0
  80. package/dist/sub-renderers/SubRenderers.d.ts +73 -0
  81. package/dist/sub-renderers/SubRenderers.d.ts.map +1 -0
  82. package/dist/sub-renderers/SubRenderers.js +2462 -0
  83. package/dist/sub-renderers/SubRenderers.js.map +1 -0
  84. package/dist/tokens/DesignTokenContext.d.ts +40 -0
  85. package/dist/tokens/DesignTokenContext.d.ts.map +1 -0
  86. package/dist/tokens/DesignTokenContext.js +408 -0
  87. package/dist/tokens/DesignTokenContext.js.map +1 -0
  88. package/dist/types/designTokens.d.ts +220 -0
  89. package/dist/types/designTokens.d.ts.map +1 -0
  90. package/dist/types/designTokens.js +8 -0
  91. package/dist/types/designTokens.js.map +1 -0
  92. package/dist/types/index.d.ts +32 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/index.js +5 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/dist/types/styles.d.ts +38 -0
  97. package/dist/types/styles.d.ts.map +1 -0
  98. package/dist/types/styles.js +14 -0
  99. package/dist/types/styles.js.map +1 -0
  100. package/dist/utils/tokenFlattener.d.ts +14 -0
  101. package/dist/utils/tokenFlattener.d.ts.map +1 -0
  102. package/dist/utils/tokenFlattener.js +56 -0
  103. package/dist/utils/tokenFlattener.js.map +1 -0
  104. package/package.json +31 -0
  105. package/src/cells/TemplateCardCell.tsx +439 -0
  106. package/src/cells/index.ts +98 -0
  107. package/src/components/ConditionCards.tsx +109 -0
  108. package/src/components/EvidenceTrail.tsx +203 -0
  109. package/src/dispatch/SubRendererDispatch.tsx +282 -0
  110. package/src/hooks/useProseExtraction.ts +125 -0
  111. package/src/index.ts +82 -0
  112. package/src/provenance/ProvenanceSectionIcon.tsx +19 -0
  113. package/src/renderers/AccordionRenderer.tsx +609 -0
  114. package/src/renderers/CardGridRenderer.tsx +608 -0
  115. package/src/renderers/CardRenderer.tsx +517 -0
  116. package/src/renderers/ProseRenderer.tsx +85 -0
  117. package/src/renderers/RawJsonRenderer.tsx +37 -0
  118. package/src/renderers/StatSummaryRenderer.tsx +182 -0
  119. package/src/renderers/TableRenderer.tsx +470 -0
  120. package/src/styles/accordion.css +376 -0
  121. package/src/styles/index.css +5 -0
  122. package/src/styles/renderers.css +1049 -0
  123. package/src/sub-renderers/SubRenderers.tsx +3487 -0
  124. package/src/tokens/DesignTokenContext.tsx +502 -0
  125. package/src/types/designTokens.ts +236 -0
  126. package/src/types/index.ts +53 -0
  127. package/src/types/styles.ts +44 -0
  128. package/src/utils/tokenFlattener.ts +64 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ConditionCards — Domain-specific sub-renderers for Conditions of Possibility sections.
3
+ *
4
+ * Extracted from AccordionRenderer to follow the data-driven sub-renderer pattern.
5
+ * These preserve the rich visual treatment for enabling/constraining conditions:
6
+ * - Condition type colored chips
7
+ * - How-managed semantic badges
8
+ * - Prior works tags
9
+ * - Evidence blockquotes
10
+ *
11
+ * Registered as named sub-renderers in SubRenderers.tsx:
12
+ * enabling_conditions → EnableConditionsSubRenderer
13
+ * constraining_conditions → ConstrainConditionsSubRenderer
14
+ */
15
+ import type { SubRendererProps } from '../types';
16
+ export declare function EnableConditionsSubRenderer({ data, config }: SubRendererProps): import("react/jsx-runtime").JSX.Element | null;
17
+ export declare function ConstrainConditionsSubRenderer({ data, config }: SubRendererProps): import("react/jsx-runtime").JSX.Element | null;
18
+ //# sourceMappingURL=ConditionCards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionCards.d.ts","sourceRoot":"","sources":["../../src/components/ConditionCards.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAMjD,wBAAgB,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,gBAAgB,kDAqD7E;AAID,wBAAgB,8BAA8B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,gBAAgB,kDA6BhF"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
3
+ // ── Enabling Conditions Sub-Renderer ─────────────────────
4
+ export function EnableConditionsSubRenderer({ data, config }) {
5
+ const { getCategoryColor } = useDesignTokens();
6
+ if (!data || !Array.isArray(data) || data.length === 0)
7
+ return null;
8
+ const conditions = data;
9
+ const sectionDesc = config.section_description ||
10
+ 'How the author\'s prior work makes the current argument possible';
11
+ const so = config._style_overrides;
12
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: "gen-section-desc", style: so?.prose || undefined, children: sectionDesc }), _jsx("div", { className: "gen-conditions-grid", children: conditions.map(cond => (_jsxs("div", { className: "gen-condition-card enabling", style: so?.card || undefined, children: [_jsxs("div", { className: "gen-condition-header", children: [_jsx("span", { className: "gen-condition-type", style: {
13
+ borderColor: getCategoryColor('condition', String(cond.condition_type))?.text || 'var(--dt-text-muted, #64748b)',
14
+ color: getCategoryColor('condition', String(cond.condition_type))?.text || 'var(--dt-text-muted, #64748b)',
15
+ ...so?.chip,
16
+ }, children: String(cond.condition_type || '').replace(/_/g, ' ') }), cond.how_managed ? (_jsx("span", { className: `gen-managed-badge managed-${cond.how_managed}`, style: so?.badge || undefined, children: String(cond.how_managed) })) : null] }), _jsx("p", { className: "gen-condition-desc", children: String(cond.description || '') }), cond.how_it_enables ? (_jsxs("p", { className: "gen-condition-enables", children: [_jsx("strong", { children: "How it enables:" }), " ", String(cond.how_it_enables)] })) : null, Array.isArray(cond.prior_works_involved) && cond.prior_works_involved.length > 0 && (_jsx("div", { className: "gen-condition-works", children: cond.prior_works_involved.map((w, i) => (_jsx("span", { className: "gen-work-tag", children: w }, i))) })), cond.evidence ? (_jsx("blockquote", { className: "gen-condition-evidence", children: String(cond.evidence) })) : null] }, String(cond.condition_id)))) })] }));
17
+ }
18
+ // ── Constraining Conditions Sub-Renderer ─────────────────
19
+ export function ConstrainConditionsSubRenderer({ data, config }) {
20
+ if (!data || !Array.isArray(data) || data.length === 0)
21
+ return null;
22
+ const constraints = data;
23
+ const sectionDesc = config.section_description ||
24
+ 'How prior work limits or constrains the current argument';
25
+ const so = config._style_overrides;
26
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: "gen-section-desc", style: so?.prose || undefined, children: sectionDesc }), _jsx("div", { className: "gen-constraints-list", children: constraints.map((constraint, i) => (_jsxs("div", { className: "gen-constraint-card", style: so?.card || undefined, children: [constraint.type ? (_jsx("span", { className: "gen-constraint-type", style: so?.chip || undefined, children: String(constraint.type).replace(/_/g, ' ') })) : null, _jsx("p", { children: String(constraint.description || '') }), constraint.how_navigated ? (_jsxs("p", { className: "gen-constraint-nav", children: [_jsx("strong", { children: "How navigated:" }), " ", String(constraint.how_navigated)] })) : null] }, String(constraint.constraint_id || i)))) })] }));
27
+ }
28
+ //# sourceMappingURL=ConditionCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionCards.js","sourceRoot":"","sources":["../../src/components/ConditionCards.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * EvidenceTrail — Reusable vertical chain of evidence steps.
3
+ *
4
+ * Renders a narrative progression with dot markers, gradient connectors,
5
+ * and quoted content. Each step can contain multiple items (with title,
6
+ * quote, citation) or a single text block.
7
+ *
8
+ * Two usage modes:
9
+ * 1. Direct — import EvidenceTrail and pass pre-built steps array
10
+ * 2. Sub-renderer — use EvidenceTrailSubRenderer with config-driven
11
+ * field mapping (registered in SubRenderers.tsx)
12
+ *
13
+ * CSS classes used (from renderers.css):
14
+ * .gen-evidence-trail, .gen-trail-chain, .gen-trail-step,
15
+ * .gen-trail-marker, .gen-trail-dot, .gen-trail-label,
16
+ * .gen-trail-content, .gen-trail-connector, .gen-trail-quote,
17
+ * .gen-quote-mark, .gen-trail-cite, .ar-card-assessment
18
+ */
19
+ export interface EvidenceTrailItem {
20
+ title?: string;
21
+ quote?: string;
22
+ cite?: string;
23
+ }
24
+ export interface EvidenceTrailStep {
25
+ label: string;
26
+ variant: 'prior' | 'current' | 'assessment';
27
+ items?: EvidenceTrailItem[];
28
+ text?: string;
29
+ }
30
+ export interface EvidenceTrailProps {
31
+ steps: EvidenceTrailStep[];
32
+ accentColor?: string;
33
+ borderColor?: string;
34
+ }
35
+ export declare function EvidenceTrail({ steps, accentColor, borderColor }: EvidenceTrailProps): import("react/jsx-runtime").JSX.Element | null;
36
+ /**
37
+ * Config shape for sub-renderer usage:
38
+ * steps: Array<{
39
+ * label: string; — display label ("Prior work")
40
+ * field: string; — data field to read from
41
+ * variant: string; — "prior" | "current" | "assessment"
42
+ * item_title_field?: string; — field within each item for title
43
+ * item_quote_field?: string; — field within each item for quote
44
+ * item_cite_field?: string; — field within each item for citation
45
+ * is_text?: boolean; — treat field as single text (not array)
46
+ * }>
47
+ * accent_color?: string;
48
+ * border_color?: string;
49
+ */
50
+ export declare function EvidenceTrailSubRenderer({ data, config, }: {
51
+ data: unknown;
52
+ config: Record<string, unknown>;
53
+ }): import("react/jsx-runtime").JSX.Element | null;
54
+ //# sourceMappingURL=EvidenceTrail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceTrail.d.ts","sourceRoot":"","sources":["../../src/components/EvidenceTrail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;IAC5C,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,kBAAkB,kDA+EpF;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,IAAI,EACJ,MAAM,GACP,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,kDAuDA"}
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EvidenceTrail — Reusable vertical chain of evidence steps.
4
+ *
5
+ * Renders a narrative progression with dot markers, gradient connectors,
6
+ * and quoted content. Each step can contain multiple items (with title,
7
+ * quote, citation) or a single text block.
8
+ *
9
+ * Two usage modes:
10
+ * 1. Direct — import EvidenceTrail and pass pre-built steps array
11
+ * 2. Sub-renderer — use EvidenceTrailSubRenderer with config-driven
12
+ * field mapping (registered in SubRenderers.tsx)
13
+ *
14
+ * CSS classes used (from renderers.css):
15
+ * .gen-evidence-trail, .gen-trail-chain, .gen-trail-step,
16
+ * .gen-trail-marker, .gen-trail-dot, .gen-trail-label,
17
+ * .gen-trail-content, .gen-trail-connector, .gen-trail-quote,
18
+ * .gen-quote-mark, .gen-trail-cite, .ar-card-assessment
19
+ */
20
+ import React from 'react';
21
+ // ── Core component ───────────────────────────────────────
22
+ export function EvidenceTrail({ steps, accentColor, borderColor }) {
23
+ if (steps.length === 0)
24
+ return null;
25
+ const accent = accentColor || 'var(--dt-text-muted)';
26
+ const border = borderColor || 'var(--dt-border-light)';
27
+ return (_jsx("div", { className: "gen-trail-chain", children: steps.map((step, idx) => {
28
+ const prevStep = idx > 0 ? steps[idx - 1] : null;
29
+ const showConnector = Boolean(prevStep);
30
+ const isLast = step.variant === 'assessment';
31
+ return (_jsxs(React.Fragment, { children: [showConnector && (_jsx("div", { className: `gen-trail-connector${isLast ? ' gen-trail-connector--final' : ''}`, style: {
32
+ background: isLast
33
+ ? border
34
+ : `linear-gradient(to bottom, ${border}, ${accent})`,
35
+ } })), _jsxs("div", { className: `gen-trail-step gen-trail-step--${step.variant}`, children: [_jsxs("div", { className: "gen-trail-marker", children: [_jsx("span", { className: `gen-trail-dot gen-trail-dot--${step.variant}`, style: step.variant === 'current' ? { background: accent } : undefined }), _jsx("span", { className: "gen-trail-label", children: step.label })] }), _jsxs("div", { className: "gen-trail-content", children: [step.items && step.items.map((item, i) => {
36
+ if (step.variant === 'prior') {
37
+ return (_jsxs("div", { className: "gen-trail-ref", children: [item.title && _jsx("span", { className: "gen-ref-title", children: item.title }), item.quote && (_jsxs("blockquote", { className: "gen-trail-quote", children: [_jsx("span", { className: "gen-quote-mark", children: "\u201C" }), item.quote, _jsx("span", { className: "gen-quote-mark", children: "\u201D" })] }))] }, i));
38
+ }
39
+ // current and other variants with items
40
+ return (_jsxs("blockquote", { className: "gen-trail-quote gen-trail-quote--current", style: { borderLeftColor: border }, children: [_jsx("span", { className: "gen-quote-mark", children: "\u201C" }), item.quote || item.title || '', _jsx("span", { className: "gen-quote-mark", children: "\u201D" }), item.cite && _jsx("cite", { className: "gen-trail-cite", children: item.cite })] }, i));
41
+ }), step.text && (_jsx("p", { className: "ar-card-assessment", children: step.text }))] })] })] }, idx));
42
+ }) }));
43
+ }
44
+ // ── Sub-renderer wrapper (config-driven) ─────────────────
45
+ /**
46
+ * Config shape for sub-renderer usage:
47
+ * steps: Array<{
48
+ * label: string; — display label ("Prior work")
49
+ * field: string; — data field to read from
50
+ * variant: string; — "prior" | "current" | "assessment"
51
+ * item_title_field?: string; — field within each item for title
52
+ * item_quote_field?: string; — field within each item for quote
53
+ * item_cite_field?: string; — field within each item for citation
54
+ * is_text?: boolean; — treat field as single text (not array)
55
+ * }>
56
+ * accent_color?: string;
57
+ * border_color?: string;
58
+ */
59
+ export function EvidenceTrailSubRenderer({ data, config, }) {
60
+ const obj = (data && typeof data === 'object' && !Array.isArray(data))
61
+ ? data
62
+ : {};
63
+ const stepConfigs = config.steps;
64
+ if (!stepConfigs || !Array.isArray(stepConfigs))
65
+ return null;
66
+ const steps = [];
67
+ for (const sc of stepConfigs) {
68
+ const raw = obj[sc.field];
69
+ if (raw === undefined || raw === null || raw === '')
70
+ continue;
71
+ const variant = (sc.variant || 'prior');
72
+ if (sc.is_text || typeof raw === 'string') {
73
+ steps.push({ label: sc.label, variant, text: String(raw) });
74
+ }
75
+ else if (Array.isArray(raw)) {
76
+ const items = raw.map((entry) => {
77
+ if (typeof entry === 'string')
78
+ return { quote: entry };
79
+ if (typeof entry === 'object' && entry !== null) {
80
+ const e = entry;
81
+ return {
82
+ title: sc.item_title_field ? String(e[sc.item_title_field] || '') : undefined,
83
+ quote: sc.item_quote_field ? String(e[sc.item_quote_field] || '') : undefined,
84
+ cite: sc.item_cite_field ? String(e[sc.item_cite_field] || '') : undefined,
85
+ };
86
+ }
87
+ return { quote: String(entry) };
88
+ });
89
+ if (items.length > 0) {
90
+ steps.push({ label: sc.label, variant, items });
91
+ }
92
+ }
93
+ }
94
+ if (steps.length === 0)
95
+ return null;
96
+ return (_jsx(EvidenceTrail, { steps: steps, accentColor: config.accent_color, borderColor: config.border_color }));
97
+ }
98
+ //# sourceMappingURL=EvidenceTrail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceTrail.js","sourceRoot":"","sources":["../../src/components/EvidenceTrail.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAuB1B,4DAA4D;AAE5D,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAsB;IACnF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,WAAW,IAAI,sBAAsB,CAAC;IACrD,MAAM,MAAM,GAAG,WAAW,IAAI,wBAAwB,CAAC;IAEvD,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,YAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACvB,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC;YAE7C,OAAO,CACL,MAAC,KAAK,CAAC,QAAQ,eAEZ,aAAa,IAAI,CAChB,cACE,SAAS,EAAE,sBAAsB,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9E,KAAK,EAAE;4BACL,UAAU,EAAE,MAAM;gCAChB,CAAC,CAAC,MAAM;gCACR,CAAC,CAAC,8BAA8B,MAAM,KAAK,MAAM,GAAG;yBACvD,GACD,CACH,EAGD,eAAK,SAAS,EAAE,kCAAkC,IAAI,CAAC,OAAO,EAAE,aAC9D,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eACE,SAAS,EAAE,gCAAgC,IAAI,CAAC,OAAO,EAAE,EACzD,KAAK,EAAE,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,GACtE,EACF,eAAM,SAAS,EAAC,iBAAiB,YAAE,IAAI,CAAC,KAAK,GAAQ,IACjD,EACN,eAAK,SAAS,EAAC,mBAAmB,aAE/B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;wCACxC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;4CAC7B,OAAO,CACL,eAAa,SAAS,EAAC,eAAe,aACnC,IAAI,CAAC,KAAK,IAAI,eAAM,SAAS,EAAC,eAAe,YAAE,IAAI,CAAC,KAAK,GAAQ,EACjE,IAAI,CAAC,KAAK,IAAI,CACb,sBAAY,SAAS,EAAC,iBAAiB,aACrC,eAAM,SAAS,EAAC,gBAAgB,uBAAe,EAC9C,IAAI,CAAC,KAAK,EACX,eAAM,SAAS,EAAC,gBAAgB,uBAAe,IACpC,CACd,KARO,CAAC,CASL,CACP,CAAC;wCACJ,CAAC;wCACD,wCAAwC;wCACxC,OAAO,CACL,sBAEE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,aAElC,eAAM,SAAS,EAAC,gBAAgB,uBAAe,EAC9C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAC/B,eAAM,SAAS,EAAC,gBAAgB,uBAAe,EAC9C,IAAI,CAAC,IAAI,IAAI,eAAM,SAAS,EAAC,gBAAgB,YAAE,IAAI,CAAC,IAAI,GAAQ,KAP5D,CAAC,CAQK,CACd,CAAC;oCACJ,CAAC,CAAC,EAGD,IAAI,CAAC,IAAI,IAAI,CACZ,YAAG,SAAS,EAAC,oBAAoB,YAAE,IAAI,CAAC,IAAI,GAAK,CAClD,IACG,IACF,KA3Da,GAAG,CA4DP,CAClB,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,IAAI,EACJ,MAAM,GAIP;IACC,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,IAA+B;QACjC,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,MAAM,CAAC,KAQb,CAAC;IAEf,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QAE9D,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,OAAO,CAAiC,CAAC;QAExE,IAAI,EAAE,CAAC,OAAO,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAwB,GAAG,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAChD,MAAM,CAAC,GAAG,KAAgC,CAAC;oBAC3C,OAAO;wBACL,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC7E,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC7E,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;qBAC3E,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,CAAC,YAAkC,EACtD,WAAW,EAAE,MAAM,CAAC,YAAkC,GACtD,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * SubRendererDispatch — Shared dispatch utilities for sub-renderer resolution.
3
+ *
4
+ * Extracted from AccordionRenderer to be shared by both AccordionRenderer
5
+ * and CardRenderer. Provides:
6
+ * - Pre-render compatibility checking (data type vs renderer expectations)
7
+ * - Defense-in-depth fallback wrapper (catches empty output at layout time)
8
+ * - Generic recursive renderer for arbitrary data shapes
9
+ * - Enum color resolution via design tokens
10
+ */
11
+ import React from 'react';
12
+ import type { SubRendererProps } from '../types';
13
+ import type { SemanticTriple } from '../types/designTokens';
14
+ export declare const REQUIRES_ARRAY: Set<string>;
15
+ export declare const REQUIRES_OBJECT: Set<string>;
16
+ export declare function isRendererCompatible(rendererType: string, data: unknown, rendererConfig?: Record<string, unknown>): boolean;
17
+ export declare function SubRendererFallback({ Renderer, data, config, sectionKey }: {
18
+ Renderer: React.FC<SubRendererProps>;
19
+ data: unknown;
20
+ config: Record<string, unknown>;
21
+ sectionKey: string;
22
+ }): import("react/jsx-runtime").JSX.Element;
23
+ export declare function resolveEnumColor(getSemanticColor: (scale: string, level: string) => SemanticTriple | null, value: string): {
24
+ bg: string;
25
+ text: string;
26
+ } | null;
27
+ export declare function GenericSectionRenderer({ data, depth, subRenderers }: {
28
+ data: unknown;
29
+ depth?: number;
30
+ subRenderers?: Record<string, {
31
+ renderer_type: string;
32
+ config?: Record<string, unknown>;
33
+ }>;
34
+ }): import("react/jsx-runtime").JSX.Element | null;
35
+ export declare function GenericMiniCard({ data, depth }: {
36
+ data: unknown;
37
+ depth: number;
38
+ }): import("react/jsx-runtime").JSX.Element | null;
39
+ //# sourceMappingURL=SubRendererDispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubRendererDispatch.d.ts","sourceRoot":"","sources":["../../src/dispatch/SubRendererDispatch.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAA4C,MAAM,OAAO,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,eAAO,MAAM,cAAc,aAIzB,CAAC;AACH,eAAO,MAAM,eAAe,aAAkE,CAAC;AAE/F,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,OAAO,CAMT;AAQD,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAC1E,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB,2CAuBA;AAOD,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,cAAc,GAAG,IAAI,EACzE,KAAK,EAAE,MAAM,GACZ;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMrC;AAUD,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,KAAS,EAAE,YAAY,EAAE,EAAE;IACxE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAC5F,kDAwHA;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,kDAsDhF"}
@@ -0,0 +1,153 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * SubRendererDispatch — Shared dispatch utilities for sub-renderer resolution.
4
+ *
5
+ * Extracted from AccordionRenderer to be shared by both AccordionRenderer
6
+ * and CardRenderer. Provides:
7
+ * - Pre-render compatibility checking (data type vs renderer expectations)
8
+ * - Defense-in-depth fallback wrapper (catches empty output at layout time)
9
+ * - Generic recursive renderer for arbitrary data shapes
10
+ * - Enum color resolution via design tokens
11
+ */
12
+ import { useState, useLayoutEffect, useRef } from 'react';
13
+ import { resolveSubRenderer, autoDetectSubRenderer } from '../sub-renderers/SubRenderers';
14
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
15
+ // ── Pre-render compatibility check ──────────────────────
16
+ // Sub-renderers silently return null when data doesn't match their
17
+ // expectations (e.g. chip_grid given a string). This check prevents
18
+ // blank sections by falling through to auto-detection on mismatch.
19
+ export const REQUIRES_ARRAY = new Set([
20
+ 'chip_grid', 'mini_card_list', 'timeline_strip',
21
+ 'comparison_panel', 'definition_list',
22
+ 'intensity_matrix', 'move_repertoire', 'grouped_card_list', 'rich_description_list',
23
+ ]);
24
+ export const REQUIRES_OBJECT = new Set(['stat_row', 'phase_timeline', 'distribution_summary']);
25
+ export function isRendererCompatible(rendererType, data, rendererConfig) {
26
+ if (REQUIRES_ARRAY.has(rendererType) && !Array.isArray(data))
27
+ return false;
28
+ if (REQUIRES_OBJECT.has(rendererType) && (typeof data !== 'object' || Array.isArray(data) || data === null))
29
+ return false;
30
+ // evidence_trail requires config.steps array — without it, always returns null
31
+ if (rendererType === 'evidence_trail' && (!rendererConfig?.steps || !Array.isArray(rendererConfig.steps)))
32
+ return false;
33
+ return true;
34
+ }
35
+ // ── Defense-in-depth fallback wrapper ────────────────────
36
+ // Even after the pre-render compatibility check, a sub-renderer might
37
+ // return null for reasons we can't predict (e.g. data is an array but
38
+ // items are wrong shape). This wrapper detects empty output via
39
+ // useLayoutEffect (before browser paint) and swaps in auto-detection.
40
+ export function SubRendererFallback({ Renderer, data, config, sectionKey }) {
41
+ const ref = useRef(null);
42
+ const [fallback, setFallback] = useState(false);
43
+ useLayoutEffect(() => {
44
+ if (ref.current && ref.current.innerHTML.trim() === '') {
45
+ console.warn(`[SubRendererDispatch] Renderer produced empty output for section '${sectionKey}' — falling back to auto-detection`);
46
+ setFallback(true);
47
+ }
48
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
49
+ if (fallback) {
50
+ const autoType = autoDetectSubRenderer(data);
51
+ const AutoComp = autoType ? resolveSubRenderer(autoType) : null;
52
+ if (AutoComp) {
53
+ return _jsx(AutoComp, { data: data, config: config });
54
+ }
55
+ return _jsx(GenericSectionRenderer, { data: data });
56
+ }
57
+ return _jsx("div", { ref: ref, children: _jsx(Renderer, { data: data, config: config }) });
58
+ }
59
+ // ── Enum color resolution ───────────────────────────────
60
+ // Resolve enum-like string values to semantic token colors.
61
+ // Tries each semantic scale in order; returns first match or null.
62
+ const SEMANTIC_SCALES = ['severity', 'visibility', 'change', 'modality'];
63
+ export function resolveEnumColor(getSemanticColor, value) {
64
+ for (const scale of SEMANTIC_SCALES) {
65
+ const result = getSemanticColor(scale, value);
66
+ if (result)
67
+ return result;
68
+ }
69
+ return null;
70
+ }
71
+ // ── Generic Section Renderer ────────────────────────────
72
+ // Recursively renders arbitrary structured data shapes:
73
+ // - string → paragraphs (with enum badge detection)
74
+ // - string[] → chip grid
75
+ // - object[] → mini-cards with key-value rendering
76
+ // - object → recursive render with indentation (with sub-renderer dispatch)
77
+ // - primitive → inline display
78
+ export function GenericSectionRenderer({ data, depth = 0, subRenderers }) {
79
+ const { getSemanticColor } = useDesignTokens();
80
+ if (data === null || data === undefined)
81
+ return null;
82
+ // String → paragraphs
83
+ if (typeof data === 'string') {
84
+ // Check if it looks like an enum value via semantic token lookup
85
+ if (data.length < 30) {
86
+ const enumStyle = resolveEnumColor(getSemanticColor, data);
87
+ if (enumStyle) {
88
+ return (_jsx("span", { className: "gen-enum-badge", style: { backgroundColor: enumStyle.bg, color: enumStyle.text }, children: data.replace(/_/g, ' ') }));
89
+ }
90
+ }
91
+ return (_jsx("div", { className: "gen-field-text", style: { marginBottom: 'var(--space-xs, 0.25rem)' }, children: data.split('\n').map((p, i) => (_jsx("p", { children: p }, i))) }));
92
+ }
93
+ // Number/boolean → inline
94
+ if (typeof data === 'number') {
95
+ return _jsx("span", { className: "gen-number-value", children: String(data) });
96
+ }
97
+ if (typeof data === 'boolean') {
98
+ const boolColor = getSemanticColor('severity', data ? 'low' : 'high');
99
+ return (_jsx("span", { className: "gen-enum-badge", style: {
100
+ backgroundColor: boolColor?.bg || 'rgba(34, 197, 94, 0.12)',
101
+ color: boolColor?.text || '#16a34a',
102
+ }, children: String(data) }));
103
+ }
104
+ // Array of strings → chip grid
105
+ if (Array.isArray(data) && data.length > 0 && data.every(d => typeof d === 'string')) {
106
+ return (_jsx("div", { className: "gen-chip-grid", children: data.map((item, i) => (_jsx("span", { className: "gen-chip-inline", children: item }, i))) }));
107
+ }
108
+ // Array of objects → mini-cards
109
+ if (Array.isArray(data) && data.length > 0) {
110
+ return (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--space-sm, 0.5rem)', margin: 'var(--space-xs, 0.25rem) 0' }, children: data.map((item, i) => (_jsx(GenericMiniCard, { data: item, depth: depth }, i))) }));
111
+ }
112
+ // Empty array
113
+ if (Array.isArray(data) && data.length === 0) {
114
+ return _jsx("p", { className: "gen-empty-list", children: "None" });
115
+ }
116
+ // Object → key-value pairs (with optional sub-renderer dispatch)
117
+ if (typeof data === 'object') {
118
+ const obj = data;
119
+ const entries = Object.entries(obj).filter(([, v]) => v !== null && v !== undefined && v !== '');
120
+ if (entries.length === 0)
121
+ return null;
122
+ return (_jsx("div", { className: depth > 0 ? 'gen-nested-content' : undefined, children: entries.map(([key, value]) => {
123
+ // Check if a sub-renderer is configured for this key
124
+ const subHint = subRenderers?.[key];
125
+ if (subHint) {
126
+ const SubComp = resolveSubRenderer(subHint.renderer_type);
127
+ if (SubComp) {
128
+ return (_jsxs("div", { className: "gen-field-row", children: [_jsxs("div", { className: "gen-field-label", children: [key.replace(/_/g, ' '), ":"] }), _jsx(SubComp, { data: value, config: subHint.config || {} })] }, key));
129
+ }
130
+ }
131
+ return (_jsxs("div", { className: "gen-field-row", children: [_jsxs("span", { className: "gen-field-label", children: [key.replace(/_/g, ' '), ":"] }), typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' ? (_jsx("span", { className: "gen-field-value-inline", children: _jsx(GenericSectionRenderer, { data: value, depth: depth + 1 }) })) : (_jsx("div", { className: "gen-field-value-block", children: _jsx(GenericSectionRenderer, { data: value, depth: depth + 1 }) }))] }, key));
132
+ }) }));
133
+ }
134
+ // Fallback
135
+ return _jsx("span", { style: { fontSize: 'var(--type-body, 0.9375rem)' }, children: String(data) });
136
+ }
137
+ export function GenericMiniCard({ data, depth }) {
138
+ const { getSemanticColor } = useDesignTokens();
139
+ if (typeof data !== 'object' || data === null) {
140
+ return _jsx(GenericSectionRenderer, { data: data, depth: depth + 1 });
141
+ }
142
+ const obj = data;
143
+ const entries = Object.entries(obj).filter(([, v]) => v !== null && v !== undefined && v !== '');
144
+ if (entries.length === 0)
145
+ return null;
146
+ // Heuristic: find a "name" or "title" field for the card header
147
+ const nameKey = entries.find(([k]) => ['name', 'term', 'title', 'commitment', 'cluster_name', 'channel', 'evidence_type'].includes(k));
148
+ const typeKey = entries.find(([k]) => ['type', 'centrality', 'drift_type', 'explicitness'].includes(k));
149
+ return (_jsxs("div", { className: "gen-mini-card", children: [nameKey && (_jsxs("div", { className: "gen-mini-card-header", children: [_jsx("span", { className: "gen-mini-card-name", children: String(nameKey[1]) }), typeKey && (_jsx(GenericSectionRenderer, { data: typeKey[1], depth: depth + 1 }))] })), entries
150
+ .filter(([k]) => k !== nameKey?.[0] && k !== typeKey?.[0])
151
+ .map(([key, value]) => (_jsxs("div", { className: "gen-mini-card-field", children: [_jsxs("span", { className: "gen-mini-card-label", children: [key.replace(/_/g, ' '), ":"] }), typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' ? (_jsx("span", { className: "gen-mini-card-value", style: { marginLeft: 'var(--space-xs, 0.25rem)' }, children: typeof value === 'string' && value.length < 30 && resolveEnumColor(getSemanticColor, value) ? (_jsx(GenericSectionRenderer, { data: value, depth: depth + 1 })) : (String(value)) })) : (_jsx("div", { style: { marginTop: 'var(--space-2xs, 0.125rem)' }, children: _jsx(GenericSectionRenderer, { data: value, depth: depth + 1 }) }))] }, key)))] }));
152
+ }
153
+ //# sourceMappingURL=SubRendererDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubRendererDispatch.js","sourceRoot":"","sources":["../../src/dispatch/SubRendererDispatch.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * useProseExtraction — Detects prose-mode output and extracts structured data.
3
+ *
4
+ * Several workflow passes can produce output in "prose mode" (rich analytical
5
+ * narrative) instead of structured JSON. When this happens the data contains
6
+ * a `_prose_output` marker. This hook:
7
+ *
8
+ * 1. Detects the marker
9
+ * 2. Calls the presentation extraction endpoint to get structured data
10
+ * 3. Manages loading / error / extracted state
11
+ *
12
+ * Usage:
13
+ * const { data, loading, error, isProseMode } = useProseExtraction<Pass5Result>(
14
+ * result.pass5_tactics,
15
+ * result._job_id,
16
+ * 'tactics'
17
+ * );
18
+ */
19
+ interface ProseMarker {
20
+ _prose_output: string;
21
+ _output_mode: 'prose';
22
+ }
23
+ export interface ProseExtractionResult<T> {
24
+ /** The structured data — either raw (if not prose) or extracted */
25
+ data: T | null;
26
+ /** Whether extraction is in progress */
27
+ loading: boolean;
28
+ /** Extraction error message, if any */
29
+ error: string | null;
30
+ /** Whether the source data was prose mode */
31
+ isProseMode: boolean;
32
+ }
33
+ export declare function useProseExtraction<T>(rawData: T | ProseMarker | undefined, jobId: string | undefined, presentEndpoint: string, // e.g. 'tactics', 'conditions', 'synthesis', 'functional'
34
+ options?: {
35
+ apiPathPrefix?: string;
36
+ }): ProseExtractionResult<T>;
37
+ export {};
38
+ //# sourceMappingURL=useProseExtraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProseExtraction.d.ts","sourceRoot":"","sources":["../../src/hooks/useProseExtraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,mEAAmE;IACnE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6CAA6C;IAC7C,WAAW,EAAE,OAAO,CAAC;CACtB;AAUD,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,OAAO,EAAE,CAAC,GAAG,WAAW,GAAG,SAAS,EACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,eAAe,EAAE,MAAM,EAAE,0DAA0D;AACnF,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,qBAAqB,CAAC,CAAC,CAAC,CAoE1B"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * useProseExtraction — Detects prose-mode output and extracts structured data.
3
+ *
4
+ * Several workflow passes can produce output in "prose mode" (rich analytical
5
+ * narrative) instead of structured JSON. When this happens the data contains
6
+ * a `_prose_output` marker. This hook:
7
+ *
8
+ * 1. Detects the marker
9
+ * 2. Calls the presentation extraction endpoint to get structured data
10
+ * 3. Manages loading / error / extracted state
11
+ *
12
+ * Usage:
13
+ * const { data, loading, error, isProseMode } = useProseExtraction<Pass5Result>(
14
+ * result.pass5_tactics,
15
+ * result._job_id,
16
+ * 'tactics'
17
+ * );
18
+ */
19
+ import { useState, useEffect } from 'react';
20
+ // Consumer apps set this via env var. Supports CRA and Next.js conventions.
21
+ const API_BASE = (typeof process !== 'undefined' && process.env?.REACT_APP_API_URL) ||
22
+ (typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_API_URL) ||
23
+ 'http://localhost:5555/api';
24
+ function isProseMarker(value) {
25
+ return (value != null &&
26
+ typeof value === 'object' &&
27
+ '_prose_output' in value);
28
+ }
29
+ export function useProseExtraction(rawData, jobId, presentEndpoint, // e.g. 'tactics', 'conditions', 'synthesis', 'functional'
30
+ options) {
31
+ const [extracted, setExtracted] = useState(null);
32
+ const [loading, setLoading] = useState(false);
33
+ const [error, setError] = useState(null);
34
+ const proseMode = isProseMarker(rawData);
35
+ useEffect(() => {
36
+ // Not prose mode — nothing to extract
37
+ if (!proseMode || !jobId)
38
+ return;
39
+ // Already extracted
40
+ if (extracted)
41
+ return;
42
+ let cancelled = false;
43
+ const fetchPresentation = async () => {
44
+ setLoading(true);
45
+ setError(null);
46
+ try {
47
+ const prefix = options?.apiPathPrefix || 'analysis/default';
48
+ const response = await fetch(`${API_BASE}/${prefix}/${jobId}/present/${presentEndpoint}`, { method: 'POST' });
49
+ if (cancelled)
50
+ return;
51
+ if (response.ok) {
52
+ const data = await response.json();
53
+ setExtracted(data.data);
54
+ }
55
+ else {
56
+ const errData = await response.json().catch(() => ({ detail: 'Unknown error' }));
57
+ setError(errData.detail || `Extraction failed (${response.status})`);
58
+ }
59
+ }
60
+ catch (e) {
61
+ if (!cancelled) {
62
+ setError(`Network error: ${e}`);
63
+ }
64
+ }
65
+ finally {
66
+ if (!cancelled) {
67
+ setLoading(false);
68
+ }
69
+ }
70
+ };
71
+ fetchPresentation();
72
+ return () => {
73
+ cancelled = true;
74
+ };
75
+ }, [proseMode, jobId, presentEndpoint, extracted]);
76
+ // Not prose mode — return raw data directly
77
+ if (!proseMode) {
78
+ return {
79
+ data: rawData ?? null,
80
+ loading: false,
81
+ error: null,
82
+ isProseMode: false,
83
+ };
84
+ }
85
+ // Prose mode — return extracted data (or loading/error state)
86
+ return {
87
+ data: extracted,
88
+ loading,
89
+ error,
90
+ isProseMode: true,
91
+ };
92
+ }
93
+ //# sourceMappingURL=useProseExtraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProseExtraction.js","sourceRoot":"","sources":["../../src/hooks/useProseExtraction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @the-syllabus/analysis-renderers — Shared renderer components for analyzer-v2 view definitions.
3
+ *
4
+ * This package provides the complete rendering pipeline:
5
+ * - Container renderers (accordion, card_grid, prose, table, etc.)
6
+ * - Sub-renderers (chip_grid, mini_card_list, distribution_summary, etc.)
7
+ * - Cell renderers (template_card, default auto-classify, etc.)
8
+ * - Design token system (DesignTokenProvider + useDesignTokens hook)
9
+ * - Renderer registry (view_key → component resolution)
10
+ *
11
+ * CSS: import '@the-syllabus/analysis-renderers/styles' for all renderer styles.
12
+ */
13
+ export type { RendererProps, RendererComponent, CellRendererProps, CellRendererComponent, SubRendererProps, SubRendererComponent, StyleOverrides, DesignTokenSet, SemanticTriple, CategoricalItem, PrimitiveTokens, SurfaceTokens, ScaleTokens, SemanticTokens, CategoricalTokens, ComponentTokens, } from './types';
14
+ export { getSO } from './types';
15
+ export { DesignTokenProvider, useDesignTokens, FALLBACK_TOKENS, } from './tokens/DesignTokenContext';
16
+ export { flattenTokens } from './utils/tokenFlattener';
17
+ export { AccordionRenderer } from './renderers/AccordionRenderer';
18
+ export { CardGridRenderer } from './renderers/CardGridRenderer';
19
+ export { CardRenderer } from './renderers/CardRenderer';
20
+ export { ProseRenderer, formatProse } from './renderers/ProseRenderer';
21
+ export { TableRenderer } from './renderers/TableRenderer';
22
+ export { StatSummaryRenderer } from './renderers/StatSummaryRenderer';
23
+ export { RawJsonRenderer } from './renderers/RawJsonRenderer';
24
+ export { resolveSubRenderer, autoDetectSubRenderer, DistributionSummary, } from './sub-renderers/SubRenderers';
25
+ export { isRendererCompatible, SubRendererFallback, GenericSectionRenderer, GenericMiniCard, resolveEnumColor, REQUIRES_ARRAY, REQUIRES_OBJECT, } from './dispatch/SubRendererDispatch';
26
+ export { cellRenderers, DefaultCardCell } from './cells';
27
+ export { TemplateCardCell } from './cells/TemplateCardCell';
28
+ export { EvidenceTrail, EvidenceTrailSubRenderer } from './components/EvidenceTrail';
29
+ export type { EvidenceTrailStep, EvidenceTrailItem } from './components/EvidenceTrail';
30
+ export { EnableConditionsSubRenderer, ConstrainConditionsSubRenderer } from './components/ConditionCards';
31
+ export { useProseExtraction } from './hooks/useProseExtraction';
32
+ //# sourceMappingURL=index.d.ts.map