@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,337 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * CardRenderer — Expandable detail cards with subsections.
4
+ *
5
+ * Unlike CardGridRenderer (many small cards in a grid), this renders a smaller
6
+ * number of detailed cards with rich subsection content. Each card can be
7
+ * expanded/collapsed.
8
+ *
9
+ * Supports the same sub-renderer dispatch chain as AccordionRenderer:
10
+ * 1. Check section_renderers[key] for a configured sub-renderer
11
+ * 2. Pre-render compatibility check: skip if data type mismatches renderer
12
+ * 3. SubRendererFallback wrapper: catch null output via useLayoutEffect
13
+ * 4. nested_sections → GenericSectionRenderer with sub_renderers
14
+ * 5. Auto-detect sub-renderer from data shape
15
+ * 6. GenericSectionRenderer as final fallback (handles any data)
16
+ *
17
+ * renderer_config keys:
18
+ * card_title_field: string — field for card header (default: "title")
19
+ * subsections: (string | {key, title})[] — named sections within each card
20
+ * section_renderers: Record<string, {renderer_type, config?, sub_renderers?}>
21
+ * show_relationship_badge: boolean — show relationship_type badge
22
+ * expandable: boolean — collapse/expand on click (default: true)
23
+ * items_path: string — dotted path to extract items
24
+ * prose_endpoint: string — for useProseExtraction
25
+ */
26
+ import { useState, useMemo } from 'react';
27
+ import { useProseExtraction } from '../hooks/useProseExtraction';
28
+ import { resolveSubRenderer, autoDetectSubRenderer } from '../sub-renderers/SubRenderers';
29
+ import { isRendererCompatible, SubRendererFallback, GenericSectionRenderer } from '../dispatch/SubRendererDispatch';
30
+ function normalizeToArray(data) {
31
+ if (Array.isArray(data))
32
+ return data;
33
+ if (data && typeof data === 'object' && !Array.isArray(data)) {
34
+ return Object.entries(data).map(([key, value]) => {
35
+ if (value && typeof value === 'object') {
36
+ return { _itemKey: key, ...value };
37
+ }
38
+ return { _itemKey: key, value };
39
+ });
40
+ }
41
+ return [];
42
+ }
43
+ function getPath(obj, path) {
44
+ if (!path)
45
+ return obj;
46
+ const parts = path.split('.');
47
+ let current = obj;
48
+ for (const part of parts) {
49
+ if (current == null || typeof current !== 'object')
50
+ return undefined;
51
+ current = current[part];
52
+ }
53
+ return current;
54
+ }
55
+ /**
56
+ * Render inline markdown: **bold**, *italic*, `code`.
57
+ * Returns React nodes for use inside JSX.
58
+ */
59
+ function renderInlineMarkdown(text) {
60
+ // Split on bold (**...**), italic (*...*), and code (`...`) patterns
61
+ const parts = [];
62
+ let remaining = text;
63
+ let key = 0;
64
+ while (remaining.length > 0) {
65
+ // Find the earliest inline pattern
66
+ const boldMatch = remaining.match(/\*\*(.+?)\*\*/);
67
+ const italicMatch = remaining.match(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/);
68
+ const codeMatch = remaining.match(/`([^`]+)`/);
69
+ // Find which match comes first
70
+ const matches = [
71
+ boldMatch ? { type: 'bold', match: boldMatch, index: boldMatch.index } : null,
72
+ italicMatch ? { type: 'italic', match: italicMatch, index: italicMatch.index } : null,
73
+ codeMatch ? { type: 'code', match: codeMatch, index: codeMatch.index } : null,
74
+ ].filter(Boolean).sort((a, b) => a.index - b.index);
75
+ if (matches.length === 0) {
76
+ parts.push(remaining);
77
+ break;
78
+ }
79
+ const first = matches[0];
80
+ // Push text before the match
81
+ if (first.index > 0) {
82
+ parts.push(remaining.substring(0, first.index));
83
+ }
84
+ if (first.type === 'bold') {
85
+ parts.push(_jsx("strong", { style: { fontWeight: 700, color: 'var(--dt-text-default)' }, children: first.match[1] }, key++));
86
+ }
87
+ else if (first.type === 'italic') {
88
+ parts.push(_jsx("em", { style: { fontStyle: 'italic' }, children: first.match[1] }, key++));
89
+ }
90
+ else if (first.type === 'code') {
91
+ parts.push(_jsx("code", { style: {
92
+ fontFamily: 'var(--font-mono, monospace)',
93
+ fontSize: '0.9em',
94
+ padding: '1px 4px',
95
+ borderRadius: '3px',
96
+ background: 'var(--dt-surface-alt, rgba(0,0,0,0.05))',
97
+ }, children: first.match[1] }, key++));
98
+ }
99
+ remaining = remaining.substring(first.index + first.match[0].length);
100
+ }
101
+ return parts.length === 1 && typeof parts[0] === 'string' ? parts[0] : _jsx(_Fragment, { children: parts });
102
+ }
103
+ function resolveTitle(item, titleField) {
104
+ if (item[titleField])
105
+ return String(item[titleField]);
106
+ if (item._display_title)
107
+ return String(item._display_title);
108
+ const pwi = item.prior_work_info;
109
+ if (pwi?.title)
110
+ return String(pwi.title);
111
+ return String(item._itemKey || item.name || item.title || 'Untitled');
112
+ }
113
+ export function CardRenderer({ data, config }) {
114
+ const cardTitleField = config.card_title_field || 'title';
115
+ const rawSubsections = config.subsections;
116
+ const showRelBadge = config.show_relationship_badge ?? false;
117
+ const expandable = config.expandable ?? true;
118
+ const itemsPath = config.items_path;
119
+ const proseEndpoint = config.prose_endpoint;
120
+ const sectionRenderers = config.section_renderers;
121
+ // Capture mode
122
+ const captureMode = config._captureMode;
123
+ const onCapture = config._onCapture;
124
+ const captureJobId = config._captureJobId;
125
+ const captureViewKey = config._captureViewKey;
126
+ const captureSourceType = config._captureSourceType;
127
+ const captureEntityId = config._captureEntityId;
128
+ const subsections = useMemo(() => {
129
+ if (!rawSubsections)
130
+ return [];
131
+ return rawSubsections.map(s => typeof s === 'string' ? { key: s, title: s.replace(/_/g, ' ') } : s);
132
+ }, [rawSubsections]);
133
+ const { data: extractedData, loading, error, isProseMode } = useProseExtraction(data, config._jobId, proseEndpoint || 'data', { apiPathPrefix: config._apiPathPrefix });
134
+ const workingData = isProseMode ? extractedData : data;
135
+ const items = useMemo(() => {
136
+ if (!workingData)
137
+ return [];
138
+ const extracted = itemsPath ? getPath(workingData, itemsPath) : workingData;
139
+ return normalizeToArray(extracted);
140
+ }, [workingData, itemsPath]);
141
+ const [expandedCards, setExpandedCards] = useState(new Set());
142
+ const toggleCard = (idx) => {
143
+ setExpandedCards(prev => {
144
+ const next = new Set(prev);
145
+ if (next.has(idx)) {
146
+ next.delete(idx);
147
+ }
148
+ else {
149
+ next.add(idx);
150
+ }
151
+ return next;
152
+ });
153
+ };
154
+ if (loading) {
155
+ return (_jsxs("div", { style: { padding: '2rem', textAlign: 'center' }, children: [_jsx("div", { className: "gen-extracting-spinner" }), _jsx("p", { children: "Preparing card data..." })] }));
156
+ }
157
+ if (error) {
158
+ return (_jsx("div", { className: "gen-extraction-error", style: { padding: '1rem' }, children: _jsxs("p", { children: ["Could not load card data: ", error] }) }));
159
+ }
160
+ if (!workingData || items.length === 0) {
161
+ return _jsx("p", { className: "gen-empty", children: "No items to display." });
162
+ }
163
+ return (_jsxs("div", { className: "ar-card-renderer", children: [isProseMode ? (_jsx("div", { className: "gen-prose-badge", children: _jsx("span", { className: "gen-prose-indicator", children: "Extracted from analytical prose" }) })) : null, _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: items.map((item, idx) => {
164
+ const isExpanded = !expandable || expandedCards.has(idx);
165
+ const title = resolveTitle(item, cardTitleField);
166
+ const relType = item.prior_work_info?.relationship_type
167
+ || item.relationship_type
168
+ || item.meta?.relationship_type;
169
+ return (_jsxs("div", { style: {
170
+ background: 'var(--color-surface-elev, #f5f3f0)',
171
+ border: `1px solid ${isExpanded ? 'var(--dt-page-accent-border, rgba(181, 52, 58, 0.3))' : 'var(--color-border, #e2e5e9)'}`,
172
+ borderRadius: '8px',
173
+ overflow: 'hidden',
174
+ transition: 'border-color 0.2s',
175
+ }, children: [_jsxs("div", { onClick: expandable ? () => toggleCard(idx) : undefined, style: {
176
+ padding: 'var(--space-sm, 0.75rem) var(--space-md, 1rem)',
177
+ cursor: expandable ? 'pointer' : 'default',
178
+ display: 'flex',
179
+ alignItems: 'center',
180
+ gap: 'var(--space-sm, 0.5rem)',
181
+ }, children: [expandable ? (_jsx("span", { style: { color: 'var(--dt-text-faint)', fontSize: '0.625rem', flexShrink: 0, transition: 'transform 150ms ease' }, children: isExpanded ? '\u25BC' : '\u25B6' })) : null, _jsx("strong", { style: {
182
+ flex: 1,
183
+ fontSize: 'var(--type-body, 0.9375rem)',
184
+ fontFamily: "'Source Serif 4', 'Source Serif Pro', Georgia, serif",
185
+ fontWeight: 'var(--weight-semibold, 600)',
186
+ color: 'var(--dt-text-default)',
187
+ lineHeight: 'var(--leading-snug, 1.35)',
188
+ }, children: title }), showRelBadge && relType ? (_jsx("span", { className: "gen-keyword-tag", children: String(relType).replace(/_/g, ' ') })) : null, captureMode && onCapture && (_jsx("button", { title: "Capture this card", onClick: e => {
189
+ e.stopPropagation();
190
+ const parentSectionKey = config._parentSectionKey;
191
+ const parentSectionTitle = config._parentSectionTitle;
192
+ onCapture({
193
+ source_view_key: captureViewKey || '',
194
+ source_item_index: idx,
195
+ source_renderer_type: 'card',
196
+ content_type: 'card',
197
+ selected_text: typeof item === 'object'
198
+ ? (item.summary || item.analysis || JSON.stringify(item)).toString().slice(0, 500)
199
+ : String(item).slice(0, 500),
200
+ structured_data: item,
201
+ context_title: parentSectionKey
202
+ ? `${captureViewKey || 'Analysis'} > ${parentSectionTitle || ''} > ${title}`
203
+ : `${captureViewKey || 'Analysis'} > ${title}`,
204
+ source_type: (captureSourceType || 'analysis'),
205
+ entity_id: captureEntityId || captureJobId || '',
206
+ depth_level: parentSectionKey ? 'L2_element' : 'L1_section',
207
+ parent_context: parentSectionKey ? {
208
+ section_key: parentSectionKey,
209
+ section_title: parentSectionTitle || '',
210
+ } : undefined,
211
+ });
212
+ }, style: {
213
+ background: 'none',
214
+ border: '1px solid var(--color-border, #ccc)',
215
+ borderRadius: '4px',
216
+ color: 'var(--dt-text-faint)',
217
+ cursor: 'pointer',
218
+ padding: '2px 6px',
219
+ fontSize: '0.7rem',
220
+ lineHeight: 1,
221
+ flexShrink: 0,
222
+ }, children: "\uD83D\uDCCC" }))] }), isExpanded ? (_jsx("div", { style: { padding: '0 16px 16px', borderTop: '1px solid var(--color-border, #e2e5e9)' }, children: (() => {
223
+ // Check if item is prose-only (from per_item views without structured data).
224
+ // When _prose_output or _raw_prose exists, always prefer prose rendering
225
+ // over subsection rendering — subsection keys won't exist in prose items.
226
+ const hasProse = Boolean(item._raw_prose || item._prose_output);
227
+ const isProseOnlyItem = hasProse && item._output_mode === 'prose';
228
+ // Even if subsections are configured, check whether ANY actually exist in the item.
229
+ // If none match, fall through to prose/fallback rendering.
230
+ const matchingSubsections = subsections.filter(sub => item[sub.key] != null);
231
+ const useSubsections = !isProseOnlyItem && matchingSubsections.length > 0;
232
+ return useSubsections ? (matchingSubsections.map(sub => {
233
+ const sectionData = item[sub.key];
234
+ return (_jsxs("div", { style: { marginTop: '12px' }, children: [_jsx("h5", { className: "gen-subsection-heading", children: sub.title }), (() => {
235
+ const hint = sectionRenderers?.[sub.key];
236
+ if (hint) {
237
+ const SectionRenderer = resolveSubRenderer(hint.renderer_type);
238
+ const subConfig = { ...(hint.config || {}) };
239
+ if (SectionRenderer) {
240
+ if (!isRendererCompatible(hint.renderer_type, sectionData, hint.config)) {
241
+ console.warn(`[CardRenderer] Configured '${hint.renderer_type}' incompatible with ${Array.isArray(sectionData) ? 'array' : typeof sectionData} data for section '${sub.key}' — falling through to auto-detection`);
242
+ }
243
+ else {
244
+ return (_jsx(SubRendererFallback, { Renderer: SectionRenderer, data: sectionData, config: subConfig, sectionKey: sub.key }));
245
+ }
246
+ }
247
+ // nested_sections: pass sub_renderers to GenericSectionRenderer
248
+ if (hint.sub_renderers) {
249
+ return _jsx(GenericSectionRenderer, { data: sectionData, subRenderers: hint.sub_renderers });
250
+ }
251
+ }
252
+ // Auto-detect the best sub-renderer from data shape
253
+ const autoRenderer = autoDetectSubRenderer(sectionData);
254
+ if (autoRenderer) {
255
+ const AutoComp = resolveSubRenderer(autoRenderer);
256
+ if (AutoComp) {
257
+ return _jsx(AutoComp, { data: sectionData, config: {} });
258
+ }
259
+ }
260
+ // Final fallback: GenericSectionRenderer handles any data shape
261
+ return _jsx(GenericSectionRenderer, { data: sectionData });
262
+ })()] }, sub.key));
263
+ })) : (
264
+ /* No subsections: render prose content or all non-meta fields */
265
+ _jsx("div", { style: { marginTop: '12px' }, children: (item._raw_prose || item._prose_output) ? (_jsx("div", { style: {
266
+ fontSize: '13px',
267
+ color: 'var(--dt-text-muted)',
268
+ lineHeight: '1.6',
269
+ }, children: String(item._raw_prose || item._prose_output).split('\n').map((line, i) => {
270
+ const trimmed = line.trim();
271
+ if (!trimmed)
272
+ return _jsx("br", {}, i);
273
+ // Order matters: check longer prefixes first
274
+ if (trimmed.startsWith('#### ')) {
275
+ return (_jsx("h6", { style: {
276
+ fontSize: '0.75rem',
277
+ fontWeight: 600,
278
+ color: 'var(--dt-text-muted)',
279
+ margin: '12px 0 4px 0',
280
+ letterSpacing: '0.02em',
281
+ }, children: renderInlineMarkdown(trimmed.replace(/^####\s*/, '')) }, i));
282
+ }
283
+ if (trimmed.startsWith('### ')) {
284
+ return (_jsx("h5", { style: {
285
+ fontSize: '0.8125rem',
286
+ fontWeight: 600,
287
+ color: 'var(--dt-text-default)',
288
+ margin: '14px 0 6px 0',
289
+ borderBottom: '1px solid var(--dt-border-light, #eef0f2)',
290
+ paddingBottom: '4px',
291
+ }, children: renderInlineMarkdown(trimmed.replace(/^###\s*/, '')) }, i));
292
+ }
293
+ if (trimmed.startsWith('## ')) {
294
+ const heading = trimmed.replace(/^##\s*/, '');
295
+ if (/^\[[\w_]+\]$/.test(heading)) {
296
+ return (_jsx("div", { className: "gen-inline-label", style: {
297
+ margin: '16px 0 4px 0',
298
+ }, children: heading.replace(/^\[|\]$/g, '').replace(/_/g, ' ') }, i));
299
+ }
300
+ return (_jsx("h4", { style: {
301
+ fontSize: '0.875rem',
302
+ fontWeight: 600,
303
+ color: 'var(--dt-text-default)',
304
+ margin: '16px 0 6px 0',
305
+ borderBottom: '1px solid var(--dt-border-light, #eef0f2)',
306
+ paddingBottom: '4px',
307
+ }, children: renderInlineMarkdown(heading) }, i));
308
+ }
309
+ if (trimmed.startsWith('# ')) {
310
+ return (_jsx("h3", { style: {
311
+ fontSize: '0.9375rem',
312
+ fontWeight: 600,
313
+ fontFamily: "'Source Serif 4', 'Source Serif Pro', Georgia, serif",
314
+ color: 'var(--dt-text-default)',
315
+ margin: '20px 0 8px 0',
316
+ }, children: renderInlineMarkdown(trimmed.replace(/^#\s*/, '')) }, i));
317
+ }
318
+ if (trimmed.startsWith('---')) {
319
+ return _jsx("hr", { style: { border: 'none', borderTop: '1px solid var(--color-border, #e2e5e9)', margin: '12px 0' } }, i);
320
+ }
321
+ if (/^\[[\w_]+\]$/.test(trimmed)) {
322
+ return (_jsx("div", { className: "gen-inline-label", style: {
323
+ margin: '8px 0 4px 0',
324
+ }, children: trimmed.replace(/^\[|\]$/g, '').replace(/_/g, ' ') }, i));
325
+ }
326
+ return (_jsx("p", { style: { margin: '0 0 6px 0' }, children: renderInlineMarkdown(trimmed) }, i));
327
+ }) })) : (
328
+ /* Fallback: render all non-meta fields via GenericSectionRenderer */
329
+ Object.entries(item).map(([key, val]) => {
330
+ if (key === cardTitleField || key.startsWith('_') || key === 'prior_work_info' || val == null)
331
+ return null;
332
+ return (_jsxs("div", { style: { marginBottom: '10px' }, children: [_jsx("h5", { className: "gen-subsection-heading", children: key.replace(/_/g, ' ') }), _jsx(GenericSectionRenderer, { data: val })] }, key));
333
+ })) }));
334
+ })() })) : null] }, String(item._itemKey || idx)));
335
+ }) }), _jsxs("div", { style: { marginTop: 'var(--space-sm, 0.5rem)', fontSize: 'var(--type-label, 0.6875rem)', color: 'var(--dt-text-faint)' }, children: [items.length, " item", items.length !== 1 ? 's' : ''] })] }));
336
+ }
337
+ //# sourceMappingURL=CardRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardRenderer.js","sourceRoot":"","sources":["../../src/renderers/CardRenderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * IdeaEvolutionRenderer — Multi-source timeline renderer for idea genealogies.
3
+ *
4
+ * Joins data from 4 passes:
5
+ * - Pass 1 (pass1_ideas): Extracted ideas with narrative structure
6
+ * - Pass 2 (pass2_scans): Per-work trace scans
7
+ * - Pass 3 (pass3_syntheses): Cross-work evolution synthesis per idea
8
+ * - Pass 4 (pass4_functional): Functional analysis per idea
9
+ *
10
+ * Registered by view_key 'genealogy_idea_evolution' because its multi-source
11
+ * join logic is too complex for a generic renderer. Receives the full
12
+ * GenealogyResult as data.
13
+ */
14
+ import { RendererProps } from '../types';
15
+ export declare function IdeaEvolutionRenderer({ data, config }: RendererProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=IdeaEvolutionRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdeaEvolutionRenderer.d.ts","sourceRoot":"","sources":["../../src/renderers/IdeaEvolutionRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkMzC,wBAAgB,qBAAqB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,2CA2jBpE"}
@@ -0,0 +1,187 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * IdeaEvolutionRenderer — Multi-source timeline renderer for idea genealogies.
4
+ *
5
+ * Joins data from 4 passes:
6
+ * - Pass 1 (pass1_ideas): Extracted ideas with narrative structure
7
+ * - Pass 2 (pass2_scans): Per-work trace scans
8
+ * - Pass 3 (pass3_syntheses): Cross-work evolution synthesis per idea
9
+ * - Pass 4 (pass4_functional): Functional analysis per idea
10
+ *
11
+ * Registered by view_key 'genealogy_idea_evolution' because its multi-source
12
+ * join logic is too complex for a generic renderer. Receives the full
13
+ * GenealogyResult as data.
14
+ */
15
+ import { useState, useEffect } from 'react';
16
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
17
+ const API_BASE = process.env.REACT_APP_API_URL || 'http://localhost:5555/api';
18
+ /** Detect if data is V2 extraction format (has top-level ideas array) */
19
+ function isV2Format(data) {
20
+ if (!data || typeof data !== 'object')
21
+ return false;
22
+ const d = data;
23
+ return Array.isArray(d.ideas) && d.ideas.length > 0 && typeof d.ideas[0]?.idea_id === 'string';
24
+ }
25
+ /** Adapt V2 extraction to GenealogyResult so the renderer can use shared rendering logic */
26
+ function adaptV2ToGenealogyResult(v2) {
27
+ return {
28
+ pass1_ideas: {
29
+ ideas: v2.ideas.map(i => ({
30
+ idea_id: i.idea_id,
31
+ idea_name: i.idea_name,
32
+ description: i.description,
33
+ type: i.form_in_current_work || 'central_thesis',
34
+ centrality: 'core',
35
+ })),
36
+ narrative_structure: {
37
+ main_thesis: v2.narrative_summary,
38
+ key_bifurcations: v2.key_bifurcations?.map(b => `${b.description} (${b.year}) — ${b.significance}`),
39
+ },
40
+ },
41
+ pass3_syntheses: v2.ideas.reduce((acc, i) => {
42
+ acc[i.idea_id] = {
43
+ idea_id: i.idea_id,
44
+ idea_name: i.idea_name,
45
+ evolution_timeline: i.evolution_timeline?.map(e => ({
46
+ work_title: e.work_title,
47
+ year: String(e.year),
48
+ form: e.phase_label || e.form,
49
+ key_quote: e.key_change,
50
+ _vocabulary_used: e.vocabulary_used,
51
+ })),
52
+ evolution_pattern: i.evolution_pattern,
53
+ evolution_narrative: i.evolution_narrative,
54
+ what_was_gained: i.what_was_gained,
55
+ what_was_lost: i.what_was_lost,
56
+ };
57
+ return acc;
58
+ }, {}),
59
+ pass2_scans: {},
60
+ };
61
+ }
62
+ // ── Component ────────────────────────────────────────────
63
+ export function IdeaEvolutionRenderer({ data, config }) {
64
+ const { getCategoryColor, getLabel } = useDesignTokens();
65
+ // Detect V2 extraction format and adapt
66
+ const isV2 = isV2Format(data);
67
+ const v2Data = isV2 ? data : null;
68
+ const result = isV2 ? adaptV2ToGenealogyResult(data) : data;
69
+ // Capture mode
70
+ const captureMode = config._captureMode;
71
+ const onCapture = config._onCapture;
72
+ const captureJobId = config._captureJobId;
73
+ const captureViewKey = config._captureViewKey;
74
+ const [expandedIdea, setExpandedIdea] = useState(null);
75
+ const [extractedFunctional, setExtractedFunctional] = useState(null);
76
+ const ideas = result?.pass1_ideas?.ideas || [];
77
+ const scans = result?.pass2_scans || {};
78
+ const syntheses = result?.pass3_syntheses || {};
79
+ const rawFunctional = result?.pass4_functional;
80
+ // Handle prose mode for functional analysis (V1 only)
81
+ const functionalIsProse = !isV2 && rawFunctional && '_prose_output' in rawFunctional;
82
+ const jobId = result?._job_id || config._jobId;
83
+ useEffect(() => {
84
+ if (!functionalIsProse || !jobId || extractedFunctional)
85
+ return;
86
+ const fetchPresentation = async () => {
87
+ try {
88
+ const wk = config._workflowKey || 'intellectual_genealogy';
89
+ const response = await fetch(`${API_BASE}/analysis/${encodeURIComponent(wk)}/${jobId}/present/functional`, { method: 'POST' });
90
+ if (response.ok) {
91
+ const data = await response.json();
92
+ setExtractedFunctional(data.data);
93
+ }
94
+ }
95
+ catch (e) {
96
+ console.warn('Failed to extract functional analysis:', e);
97
+ }
98
+ };
99
+ fetchPresentation();
100
+ }, [functionalIsProse, jobId, extractedFunctional]);
101
+ const functional = functionalIsProse ? extractedFunctional : rawFunctional;
102
+ if (ideas.length === 0) {
103
+ // Check for prose fallback
104
+ if (data && typeof data === 'object' && '_prose_output' in data) {
105
+ const prose = data._prose_output;
106
+ return (_jsx("div", { className: "gen-genealogies-tab", children: _jsxs("div", { className: "gen-prose-fallback", children: [_jsx("p", { className: "gen-prose-badge", children: "Showing raw analysis output (structured extraction pending)" }), _jsx("div", { className: "gen-narrative-text", children: prose.split('\n').filter(Boolean).map((p, i) => (_jsx("p", { children: p }, i))) })] }) }));
107
+ }
108
+ return _jsx("p", { className: "gen-empty", children: "No ideas extracted yet." });
109
+ }
110
+ return (_jsxs("div", { className: "gen-genealogies-tab", children: [result?.pass1_ideas?.narrative_structure && (_jsxs("div", { className: "gen-evo-hero", children: [_jsx("div", { className: "gen-evo-hero-label", children: "Narrative Structure" }), result.pass1_ideas.narrative_structure.main_thesis && (_jsx("blockquote", { className: "gen-evo-thesis", children: result.pass1_ideas.narrative_structure.main_thesis })), isV2 && v2Data?.key_bifurcations?.length ? (_jsxs("div", { className: "gen-evo-bifurcations", children: [_jsx("div", { className: "gen-evo-bifurcations-label", children: "Key Bifurcations" }), _jsx("div", { className: "gen-evo-bif-timeline", children: v2Data.key_bifurcations.map((b, i) => (_jsxs("div", { className: "gen-evo-bif-node", children: [_jsx("div", { className: "gen-evo-bif-year", children: b.year }), _jsx("p", { className: "gen-evo-bif-desc", children: b.description }), _jsx("p", { className: "gen-evo-bif-sig", children: b.significance })] }, i))) })] })) : (
111
+ /* V1 fallback: flat string bifurcations */
112
+ result.pass1_ideas.narrative_structure.key_bifurcations?.length ? (_jsxs("div", { className: "gen-evo-bifurcations", children: [_jsx("div", { className: "gen-evo-bifurcations-label", children: "Key Bifurcations" }), _jsx("div", { className: "gen-evo-bif-timeline", children: result.pass1_ideas.narrative_structure.key_bifurcations.map((b, i) => (_jsx("div", { className: "gen-evo-bif-node", children: _jsx("p", { className: "gen-evo-bif-desc", children: b }) }, i))) })] })) : null)] })), _jsx("div", { className: "gen-evo-cards", children: ideas.map(idea => {
113
+ const isExpanded = expandedIdea === idea.idea_id;
114
+ const synthesis = syntheses[idea.idea_id];
115
+ const funcAnalysis = functional?.functional_analyses?.find(fa => fa.idea_id === idea.idea_id);
116
+ const formColors = getCategoryColor('idea', idea.type) || { bg: 'var(--dt-surface-alt, #f8fafc)', text: 'var(--dt-text-default, #334155)', border: 'var(--dt-border-default, #94a3b8)', label: idea.type?.replace(/_/g, ' ') };
117
+ // Collect traces for this idea across all scans
118
+ const tracesAcrossWorks = [];
119
+ Object.entries(scans).forEach(([workKey, scan]) => {
120
+ const matching = scan.traces_found?.filter(t => t.target_idea_id === idea.idea_id) || [];
121
+ if (matching.length > 0) {
122
+ tracesAcrossWorks.push({ workKey, scan, traces: matching });
123
+ }
124
+ });
125
+ // Collect indirect enablers
126
+ const indirectEnablers = [];
127
+ Object.entries(scans).forEach(([workKey, scan]) => {
128
+ const relType = scan.prior_work_info?.relationship_type || scan.meta?.relationship_type;
129
+ if (relType === 'indirect_contextualizer' || relType === 'different_field_relevant') {
130
+ const hasPatterns = (scan.foundational_patterns?.length || 0) > 0;
131
+ const hasTransfers = (scan.cross_domain_transfers?.length || 0) > 0;
132
+ if (hasPatterns || hasTransfers) {
133
+ indirectEnablers.push({ workKey, scan });
134
+ }
135
+ }
136
+ });
137
+ return (_jsxs("div", { className: `gen-evo-card ${isExpanded ? 'gen-evo-card--expanded' : ''}`, style: { borderLeftColor: formColors.border }, children: [_jsxs("button", { className: "gen-evo-card-header", onClick: () => setExpandedIdea(isExpanded ? null : idea.idea_id), children: [_jsxs("div", { className: "gen-evo-card-top", children: [_jsx("span", { className: "gen-evo-card-id", children: idea.idea_id }), _jsx("span", { className: "gen-evo-card-form-badge", style: { background: formColors.bg, color: formColors.text }, children: formColors.label || idea.type?.replace(/_/g, ' ') }), _jsx("span", { className: `gen-evo-centrality gen-evo-centrality--${idea.centrality}`, children: idea.centrality }), _jsx("span", { className: "gen-evo-expand-icon", children: isExpanded ? '\u25BC' : '\u25B6' })] }), _jsx("h4", { className: "gen-evo-card-name", children: idea.idea_name }), _jsx("p", { className: "gen-evo-card-desc", children: idea.description }), _jsxs("div", { className: "gen-evo-card-footer", children: [tracesAcrossWorks.length > 0 && (_jsxs("span", { className: "gen-evo-trace-count", children: [tracesAcrossWorks.length, " prior work", tracesAcrossWorks.length !== 1 ? 's' : ''] })), indirectEnablers.length > 0 && (_jsxs("span", { className: "gen-evo-trace-count gen-evo-indirect-count", children: [indirectEnablers.length, " indirect enabler", indirectEnablers.length !== 1 ? 's' : ''] })), synthesis?.evolution_pattern && (_jsx("span", { className: "gen-pattern-badge", children: synthesis.evolution_pattern.replace(/_/g, ' ') })), captureMode && onCapture && (_jsx("span", { title: "Capture this idea", onClick: e => {
138
+ e.stopPropagation();
139
+ onCapture({
140
+ source_view_key: captureViewKey || '',
141
+ source_section_key: idea.idea_id,
142
+ source_renderer_type: 'idea_evolution',
143
+ content_type: 'item',
144
+ selected_text: `${idea.idea_name}: ${idea.description || ''}`.slice(0, 500),
145
+ structured_data: { idea, synthesis, traces: tracesAcrossWorks.length },
146
+ context_title: `${captureViewKey || 'Ideas'} > ${idea.idea_name}`,
147
+ source_type: 'genealogy',
148
+ genealogy_job_id: captureJobId || '',
149
+ depth_level: 'L2_element',
150
+ });
151
+ }, style: {
152
+ marginLeft: 'auto',
153
+ cursor: 'pointer',
154
+ fontSize: '0.72rem',
155
+ padding: '1px 5px',
156
+ border: '1px solid var(--color-border, #ccc)',
157
+ borderRadius: '3px',
158
+ color: 'var(--dt-text-faint)',
159
+ }, children: "\uD83D\uDCCC" }))] })] }), isExpanded && (_jsxs("div", { className: "gen-evo-detail", children: [synthesis?.evolution_timeline && synthesis.evolution_timeline.length > 0 && (_jsxs("div", { className: "gen-timeline-section", children: [_jsx("h5", { children: "Evolution Timeline" }), _jsxs("div", { className: "gen-timeline", children: [synthesis.evolution_timeline.map((entry, i) => (_jsxs("div", { className: "gen-timeline-node", children: [_jsx("div", { className: "gen-timeline-marker" }), _jsxs("div", { className: "gen-timeline-content", children: [_jsxs("div", { className: "gen-timeline-header", children: [_jsx("strong", { children: entry.work_title }), entry.year && _jsx("span", { className: "gen-timeline-year", children: entry.year })] }), _jsx("p", { className: "gen-timeline-form", children: entry.form }), entry.key_quote && (_jsxs("blockquote", { className: "gen-timeline-quote", children: ["\"", entry.key_quote, "\""] })), entry.transition_to_next && (_jsx("p", { className: "gen-timeline-transition", children: entry.transition_to_next })), entry._vocabulary_used?.length ? (_jsx("div", { className: "gen-evo-vocab-chips", children: entry._vocabulary_used.map((v, vi) => (_jsx("span", { className: "gen-evo-vocab-chip", children: v }, vi))) })) : null] })] }, i))), synthesis.current_form && (_jsxs("div", { className: "gen-timeline-node current", children: [_jsx("div", { className: "gen-timeline-marker current" }), _jsxs("div", { className: "gen-timeline-content", children: [_jsx("strong", { children: "Current Work" }), _jsx("p", { className: "gen-timeline-form", children: synthesis.current_form.description }), synthesis.current_form.key_quote && (_jsxs("blockquote", { className: "gen-timeline-quote", children: ["\"", synthesis.current_form.key_quote, "\""] }))] })] }))] }), synthesis.evolution_pattern && (_jsxs("div", { className: "gen-evolution-pattern", children: [_jsx("strong", { children: "Pattern:" }), ' ', _jsx("span", { className: "gen-pattern-badge", children: synthesis.evolution_pattern.replace(/_/g, ' ') })] }))] })), synthesis?.evolution_narrative && (_jsxs("div", { className: "gen-narrative-section", children: [_jsx("h5", { children: "Evolution Narrative" }), _jsx("div", { className: "gen-narrative-text", children: synthesis.evolution_narrative.split('\n').map((p, i) => (_jsx("p", { children: p }, i))) }), synthesis.what_was_gained && (_jsxs("div", { className: "gen-gained-lost", children: [_jsxs("div", { className: "gen-gained", children: [_jsx("strong", { children: "What was gained:" }), " ", synthesis.what_was_gained] }), synthesis.what_was_lost && (_jsxs("div", { className: "gen-lost", children: [_jsx("strong", { children: "What was lost:" }), " ", synthesis.what_was_lost] }))] }))] })), tracesAcrossWorks.length > 0 && (_jsxs("div", { className: "gen-traces-section", children: [_jsx("h5", { children: "Traces in Prior Works" }), tracesAcrossWorks.map(({ scan, traces }) => {
160
+ const relType = scan.prior_work_info?.relationship_type || scan.meta?.relationship_type || 'direct_precursor';
161
+ const relStyle = getCategoryColor('relationship', relType) || getCategoryColor('relationship', 'direct_precursor') || { bg: '#eff6ff', text: '#1e40af', border: '#93c5fd', label: 'Direct Precursor' };
162
+ return (_jsxs("div", { className: "gen-trace-work", children: [_jsxs("div", { className: "gen-trace-work-header", children: [_jsx("strong", { children: scan.prior_work_info.title }), scan.prior_work_info.year && (_jsx("span", { className: "gen-work-year", children: scan.prior_work_info.year })), _jsx("span", { className: "gen-relationship-badge", style: { background: relStyle.bg, color: relStyle.text, borderColor: relStyle.border }, children: relStyle.label })] }), traces.map(trace => (_jsxs("div", { className: "gen-trace-item", children: [_jsxs("div", { className: "gen-trace-form-row", children: [_jsx("span", { className: "gen-form-badge", style: {
163
+ color: getCategoryColor('form', trace.form_in_prior_work)?.text || '#94a3b8',
164
+ }, children: getLabel('form', trace.form_in_prior_work) ||
165
+ trace.form_in_prior_work.replace(/_/g, ' ') }), _jsx("span", { className: `gen-confidence confidence-${trace.confidence}`, children: trace.confidence })] }), _jsx("p", { children: trace.description }), trace.notable_differences && (_jsxs("p", { className: "gen-trace-diff", children: [_jsx("strong", { children: "Differences:" }), " ", trace.notable_differences] })), trace.textual_evidence?.map((ev, i) => (_jsxs("blockquote", { className: "gen-trace-quote", children: ["\"", ev.quote, "\"", ev.location && _jsx("cite", { children: ev.location })] }, i)))] }, trace.trace_id)))] }, scan.prior_work_info.title));
166
+ })] })), indirectEnablers.length > 0 && (_jsxs("div", { className: "gen-indirect-section", children: [_jsx("h5", { children: "Indirect Enablers" }), _jsx("p", { className: "gen-indirect-intro", children: "These works don't directly discuss this idea but provide foundational thinking that enables it." }), indirectEnablers.map(({ workKey, scan }) => {
167
+ const relType = scan.prior_work_info?.relationship_type || scan.meta?.relationship_type || 'indirect_contextualizer';
168
+ const relStyle = getCategoryColor('relationship', relType) || getCategoryColor('relationship', 'indirect_contextualizer') || { bg: '#fdf4ff', text: '#86198f', border: '#e879f9', label: 'Indirect Contextualizer' };
169
+ return (_jsxs("div", { className: "gen-indirect-work", children: [_jsxs("div", { className: "gen-trace-work-header", children: [_jsx("strong", { children: scan.prior_work_info.title }), scan.prior_work_info.year && (_jsx("span", { className: "gen-work-year", children: scan.prior_work_info.year })), _jsx("span", { className: "gen-relationship-badge", style: { background: relStyle.bg, color: relStyle.text, borderColor: relStyle.border }, children: relStyle.label })] }), scan.foundational_patterns?.map(pattern => (_jsxs("div", { className: "gen-pattern-item", children: [_jsxs("div", { className: "gen-pattern-header", children: [_jsx("strong", { className: "gen-pattern-name", children: pattern.pattern_name }), pattern.pattern_type && (_jsx("span", { className: "gen-pattern-type-badge", children: getLabel('pattern', pattern.pattern_type) || pattern.pattern_type.replace(/_/g, ' ') })), pattern.author_awareness && (_jsx("span", { className: "gen-awareness-badge", style: { color: getCategoryColor('awareness', pattern.author_awareness)?.text || '#94a3b8' }, children: getLabel('awareness', pattern.author_awareness) || pattern.author_awareness }))] }), _jsx("p", { className: "gen-pattern-desc", children: pattern.pattern_description }), _jsxs("p", { className: "gen-pattern-enables", children: [_jsx("strong", { children: "How it enables current work:" }), " ", pattern.how_it_enables_current_work] }), pattern.manifestation_in_current_work && (_jsxs("p", { className: "gen-pattern-manifestation", children: [_jsx("strong", { children: "Manifests as:" }), " ", pattern.manifestation_in_current_work] })), pattern.textual_evidence_prior?.map((ev, i) => (_jsxs("blockquote", { className: "gen-trace-quote", children: ["\"", ev.quote, "\"", ev.location && _jsx("cite", { children: ev.location })] }, i)))] }, pattern.pattern_id))), scan.cross_domain_transfers?.map(transfer => (_jsxs("div", { className: "gen-transfer-item", children: [_jsx("div", { className: "gen-transfer-header", children: _jsxs("span", { className: "gen-transfer-domains", children: [transfer.source_domain, " \u2192 ", transfer.target_domain] }) }), _jsxs("p", { children: [_jsx("strong", { children: "What transferred:" }), " ", transfer.what_transferred] }), transfer.how_transformed && (_jsxs("p", { children: [_jsx("strong", { children: "How transformed:" }), " ", transfer.how_transformed] })), transfer.validity_of_transfer && (_jsxs("p", { children: [_jsx("strong", { children: "Validity:" }), " ", transfer.validity_of_transfer] })), transfer.blind_spots_created && (_jsxs("p", { className: "gen-transfer-blindspot", children: [_jsx("strong", { children: "Blind spots:" }), " ", transfer.blind_spots_created] })), transfer.unique_insights_enabled && (_jsxs("p", { className: "gen-transfer-insight", children: [_jsx("strong", { children: "Unique insights:" }), " ", transfer.unique_insights_enabled] }))] }, transfer.transfer_id)))] }, workKey));
170
+ })] })), isV2 && (() => {
171
+ const v2Idea = v2Data?.ideas.find(i => i.idea_id === idea.idea_id);
172
+ const v2Traces = v2Idea?.traces_in_prior_works;
173
+ if (!v2Traces?.length)
174
+ return null;
175
+ return (_jsxs("div", { className: "gen-traces-section", children: [_jsx("h5", { children: "Traces in Prior Works" }), v2Traces.map((trace, ti) => {
176
+ const relStyle = getCategoryColor('relationship', trace.relationship) || getCategoryColor('relationship', 'direct_precursor') || { bg: '#eff6ff', text: '#1e40af', border: '#93c5fd', label: 'Direct Precursor' };
177
+ return (_jsxs("div", { className: "gen-trace-work", children: [_jsxs("div", { className: "gen-trace-work-header", children: [_jsx("strong", { children: trace.work_title }), _jsx("span", { className: "gen-relationship-badge", style: { background: relStyle.bg, color: relStyle.text, borderColor: relStyle.border }, children: relStyle.label || trace.relationship.replace(/_/g, ' ') })] }), _jsx("p", { children: trace.evidence })] }, ti));
178
+ })] }));
179
+ })(), isV2 && (() => {
180
+ const v2Idea = v2Data?.ideas.find(i => i.idea_id === idea.idea_id);
181
+ if (!v2Idea?.transition_drivers?.length)
182
+ return null;
183
+ return (_jsxs("div", { className: "gen-evo-drivers", children: [_jsx("h5", { children: "Transition Drivers" }), _jsx("div", { className: "gen-evo-driver-chips", children: v2Idea.transition_drivers.map((d, i) => (_jsx("span", { className: "gen-evo-driver-chip", children: d }, i))) })] }));
184
+ })(), funcAnalysis && (_jsxs("div", { className: "gen-functional-section", children: [_jsx("h5", { children: "Functional Analysis" }), funcAnalysis.functions_served?.map((fn, i) => (_jsxs("div", { className: "gen-function-item", children: [_jsx("span", { className: "gen-function-type", children: fn.function_type.replace(/_/g, ' ') }), _jsx("p", { children: fn.description })] }, i))), funcAnalysis.conditions_of_possibility && (_jsxs("div", { className: "gen-func-conditions", children: [_jsx("strong", { children: "Conditions of Possibility:" }), _jsx("p", { children: funcAnalysis.conditions_of_possibility })] })), funcAnalysis.what_would_be_impossible_without && (_jsxs("div", { className: "gen-func-impossible", children: [_jsx("strong", { children: "What would be impossible without prior work:" }), _jsx("p", { children: funcAnalysis.what_would_be_impossible_without })] }))] }))] }))] }, idea.idea_id));
185
+ }) }), isV2 && v2Data?.cross_cutting_patterns && (_jsxs("div", { className: "gen-evo-synthesis-panel", children: [_jsx("div", { className: "gen-evo-synthesis-label", children: "Cross-Cutting Patterns" }), v2Data.cross_cutting_patterns.overall_trajectory && (_jsxs("div", { className: "gen-evo-trajectory", children: [_jsx("div", { className: "gen-evo-trajectory-icon", children: '\u2192' }), _jsx("div", { className: "gen-evo-trajectory-text", children: v2Data.cross_cutting_patterns.overall_trajectory })] })), _jsxs("div", { className: "gen-evo-patterns-grid", children: [v2Data.cross_cutting_patterns.dominant_evolution_pattern && (_jsxs("div", { className: "gen-evo-pattern-cell", children: [_jsx("div", { className: "gen-evo-pattern-cell-label", children: "Dominant Pattern" }), _jsx("span", { className: "gen-pattern-badge", children: v2Data.cross_cutting_patterns.dominant_evolution_pattern.replace(/_/g, ' ') })] })), v2Data.cross_cutting_patterns.audience_calibration && (_jsxs("div", { className: "gen-evo-pattern-cell", children: [_jsx("div", { className: "gen-evo-pattern-cell-label", children: "Audience Calibration" }), _jsx("p", { children: v2Data.cross_cutting_patterns.audience_calibration })] })), v2Data.cross_cutting_patterns.prescription_diagnosis_gap && (_jsxs("div", { className: "gen-evo-pattern-cell", children: [_jsx("div", { className: "gen-evo-pattern-cell-label", children: "Prescription-Diagnosis Gap" }), _jsx("p", { children: v2Data.cross_cutting_patterns.prescription_diagnosis_gap })] }))] })] }))] }));
186
+ }
187
+ //# sourceMappingURL=IdeaEvolutionRenderer.js.map