@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,10 @@
1
+ /**
2
+ * RelationshipCardCell — Domain-specific cell renderer for relationship
3
+ * classification items (prior work -> relationship type analysis).
4
+ *
5
+ * Supports both v2 extraction schema (flat fields from relationship_extraction
6
+ * template) and legacy schema (classification.primary_type, prior_work_info).
7
+ */
8
+ import { CellRendererProps } from '../types';
9
+ export declare function RelationshipCardCell({ item }: CellRendererProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=RelationshipCardCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationshipCardCell.d.ts","sourceRoot":"","sources":["../../src/cells/RelationshipCardCell.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,2CAuO/D"}
@@ -0,0 +1,91 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * RelationshipCardCell — Domain-specific cell renderer for relationship
4
+ * classification items (prior work -> relationship type analysis).
5
+ *
6
+ * Supports both v2 extraction schema (flat fields from relationship_extraction
7
+ * template) and legacy schema (classification.primary_type, prior_work_info).
8
+ */
9
+ import { useState } from 'react';
10
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
11
+ export function RelationshipCardCell({ item }) {
12
+ const { getCategoryColor } = useDesignTokens();
13
+ const [evidenceExpanded, setEvidenceExpanded] = useState(false);
14
+ // --- Resolve fields: v2 flat schema with fallback to legacy ---
15
+ const classification = item.classification;
16
+ const priorWorkInfo = item.prior_work_info;
17
+ // Title: v2 work_title > _display_title > legacy prior_work_info.title > item.title
18
+ const title = String(item.work_title || item._display_title || priorWorkInfo?.title || item.title || item.docKey || '');
19
+ // Year
20
+ const year = item.work_year || priorWorkInfo?.year || item.year;
21
+ // Relationship type: v2 relationship_type > legacy classification.primary_type
22
+ const relationshipType = String(item.relationship_type || classification?.primary_type || '');
23
+ // Relationship strength (v2 only)
24
+ const relationshipStrength = String(item.relationship_strength || '');
25
+ // Summary: v2 summary > legacy classification.reasoning
26
+ const summary = String(item.summary || classification?.reasoning || '');
27
+ // Influence channels (v2)
28
+ const influenceChannels = (item.influence_channels || []);
29
+ // Key evidence (v2)
30
+ const keyEvidence = (item.key_evidence || []);
31
+ // Vocabulary contributed (v2)
32
+ const vocabularyContributed = (item.vocabulary_contributed || []);
33
+ // Centrality assessment (v2)
34
+ const centralityAssessment = String(item.centrality_assessment || '');
35
+ // What would be lost (v2)
36
+ const whatWouldBeLost = String(item.what_would_be_lost || '');
37
+ // Legacy fields
38
+ const analysisFocus = classification?.recommended_analysis_focus;
39
+ const aspectsToProbe = classification?.key_aspects_to_probe;
40
+ // Style lookups
41
+ const typeStyle = getCategoryColor('relationship', relationshipType);
42
+ const strengthStyle = relationshipStrength
43
+ ? getCategoryColor('strength', relationshipStrength)
44
+ : null;
45
+ return (_jsxs("div", { className: "gen-rel-card", style: { borderLeftColor: typeStyle?.border || 'var(--dt-border-light)' }, children: [_jsxs("div", { className: "gen-rel-card-header", children: [_jsx("strong", { children: title }), year ? _jsx("span", { className: "gen-work-year", children: String(year) }) : null] }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem', flexWrap: 'wrap', marginBottom: '0.5rem' }, children: [relationshipType && (_jsx("span", { style: {
46
+ display: 'inline-block',
47
+ padding: '2px 8px',
48
+ borderRadius: '4px',
49
+ fontSize: '0.75rem',
50
+ fontWeight: 600,
51
+ backgroundColor: typeStyle?.bg || 'var(--dt-surface-alt)',
52
+ color: typeStyle?.text || 'var(--dt-text-muted)',
53
+ border: `1px solid ${typeStyle?.border || 'var(--dt-border-light)'}`,
54
+ }, children: typeStyle?.label || relationshipType.replace(/_/g, ' ') })), strengthStyle && (_jsx("span", { style: {
55
+ display: 'inline-block',
56
+ padding: '2px 8px',
57
+ borderRadius: '4px',
58
+ fontSize: '0.75rem',
59
+ fontWeight: 600,
60
+ backgroundColor: strengthStyle.bg,
61
+ color: strengthStyle.text,
62
+ border: `1px solid ${strengthStyle.border}`,
63
+ }, children: strengthStyle.label }))] }), summary && _jsx("p", { className: "gen-rel-reasoning", children: summary }), influenceChannels.length > 0 && (_jsxs("div", { style: { marginTop: '0.5rem' }, children: [_jsx("strong", { style: { fontSize: '0.8rem', color: 'var(--dt-text-muted)' }, children: "Influence channels:" }), _jsx("div", { style: { display: 'flex', gap: '0.375rem', flexWrap: 'wrap', marginTop: '0.25rem' }, children: influenceChannels.map((ch, i) => (_jsx("span", { title: ch.description, style: {
64
+ display: 'inline-block',
65
+ padding: '2px 6px',
66
+ borderRadius: '3px',
67
+ fontSize: '0.72rem',
68
+ backgroundColor: 'var(--dt-surface-alt)',
69
+ color: 'var(--dt-text-default)',
70
+ border: '1px solid var(--dt-border-light)',
71
+ cursor: 'default',
72
+ }, children: ch.channel.replace(/_/g, ' ') }, i))) })] })), vocabularyContributed.length > 0 && (_jsxs("div", { style: { marginTop: '0.5rem' }, children: [_jsx("strong", { style: { fontSize: '0.8rem', color: 'var(--dt-text-muted)' }, children: "Vocabulary contributed:" }), _jsx("div", { style: { display: 'flex', gap: '0.25rem', flexWrap: 'wrap', marginTop: '0.25rem' }, children: vocabularyContributed.map((term, i) => (_jsx("span", { style: {
73
+ display: 'inline-block',
74
+ padding: '1px 5px',
75
+ borderRadius: '3px',
76
+ fontSize: '0.72rem',
77
+ fontStyle: 'italic',
78
+ backgroundColor: 'var(--dt-surface-alt, #eff6ff)',
79
+ color: 'var(--dt-text-accent, #1e40af)',
80
+ border: '1px solid var(--dt-border-light, #bfdbfe)',
81
+ }, children: term }, i))) })] })), keyEvidence.length > 0 && (_jsxs("div", { style: { marginTop: '0.5rem' }, children: [_jsxs("strong", { style: { fontSize: '0.8rem', color: 'var(--dt-text-muted)', cursor: 'pointer', userSelect: 'none' }, onClick: () => setEvidenceExpanded(!evidenceExpanded), children: [evidenceExpanded ? '\u25BC' : '\u25B6', " Key evidence (", keyEvidence.length, ")"] }), evidenceExpanded && (_jsx("div", { style: { marginTop: '0.25rem' }, children: keyEvidence.map((ev, i) => (_jsxs("div", { style: { marginBottom: '0.375rem', paddingLeft: '0.5rem', borderLeft: '2px solid var(--dt-border-light)' }, children: [_jsxs("span", { style: { fontSize: '0.72rem', color: 'var(--dt-text-muted)', fontWeight: 600 }, children: [ev.evidence_type.replace(/_/g, ' '), ":"] }), _jsx("span", { style: { fontSize: '0.8rem', marginLeft: '0.25rem' }, children: ev.description }), ev.quote && (_jsx("blockquote", { style: {
82
+ margin: '0.25rem 0 0 0',
83
+ padding: '0.25rem 0.5rem',
84
+ fontSize: '0.75rem',
85
+ fontStyle: 'italic',
86
+ color: 'var(--dt-text-muted)',
87
+ borderLeft: '3px solid var(--dt-border-light)',
88
+ backgroundColor: 'var(--dt-surface-alt)',
89
+ }, children: ev.quote }))] }, i))) }))] })), centralityAssessment && (_jsxs("p", { style: { fontSize: '0.8rem', color: 'var(--dt-text-muted)', marginTop: '0.5rem' }, children: [_jsx("strong", { children: "Centrality:" }), " ", centralityAssessment] })), whatWouldBeLost && (_jsxs("p", { style: { fontSize: '0.8rem', color: 'var(--dt-text-muted)', fontStyle: 'italic', marginTop: '0.25rem' }, children: [_jsx("strong", { children: "Without this work:" }), " ", whatWouldBeLost] })), analysisFocus && !summary && (_jsxs("p", { className: "gen-rel-focus", children: [_jsx("strong", { children: "Analysis focus:" }), " ", analysisFocus] })), aspectsToProbe && aspectsToProbe.length > 0 && !influenceChannels.length && (_jsxs("div", { className: "gen-rel-aspects", children: [_jsx("strong", { children: "Key aspects to probe:" }), _jsx("ul", { children: aspectsToProbe.map((aspect, i) => (_jsx("li", { children: aspect }, i))) })] }))] }));
90
+ }
91
+ //# sourceMappingURL=RelationshipCardCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationshipCardCell.js","sourceRoot":"","sources":["../../src/cells/RelationshipCardCell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * TacticCardCell — Editorial-quality cell renderer for evolution tactic items.
3
+ *
4
+ * Renders tactic cards with:
5
+ * - Severity-scaled visual weight (major → dominant, minor → subdued)
6
+ * - Evidence trail via reusable EvidenceTrail component
7
+ * - Cross-reference idea chips with color accents
8
+ * - Type-coded header with descriptive context
9
+ */
10
+ import { CellRendererProps } from '../types';
11
+ export declare function TacticCardCell({ item, config }: CellRendererProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=TacticCardCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TacticCardCell.d.ts","sourceRoot":"","sources":["../../src/cells/TacticCardCell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqB7C,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAiIjE"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * TacticCardCell — Editorial-quality cell renderer for evolution tactic items.
4
+ *
5
+ * Renders tactic cards with:
6
+ * - Severity-scaled visual weight (major → dominant, minor → subdued)
7
+ * - Evidence trail via reusable EvidenceTrail component
8
+ * - Cross-reference idea chips with color accents
9
+ * - Type-coded header with descriptive context
10
+ */
11
+ import { useState } from 'react';
12
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
13
+ import { EvidenceTrail } from '../components/EvidenceTrail';
14
+ /** Tactic descriptions — domain metadata, not theming */
15
+ const TACTIC_DESCRIPTIONS = {
16
+ conceptual_recycling: 'Repurposing earlier concepts under new theoretical guises',
17
+ silent_revision: 'Revising positions without acknowledging the change',
18
+ selective_continuity: 'Maintaining some threads while quietly dropping others',
19
+ retroactive_framing: 'Reinterpreting past work through a later lens',
20
+ escalation: 'Progressively intensifying a claim or position over time',
21
+ narrative_bootstrapping: 'Building authority by narrating one\'s own trajectory',
22
+ framework_migration: 'Moving core ideas into a different theoretical home',
23
+ condition_shift: 'Redefining what counts as a precondition for one\'s argument',
24
+ biographical_teleology: 'Treating an intellectual career as if it always aimed at the present',
25
+ strategic_amnesia: 'Selectively forgetting earlier commitments that conflict with current ones',
26
+ vocabulary_migration: 'Shifting key terms to new semantic fields',
27
+ position_reversal: 'Adopting a stance previously argued against',
28
+ strategic_ambiguity: 'Deliberately maintaining interpretive flexibility',
29
+ };
30
+ export function TacticCardCell({ item, config }) {
31
+ const { getCategoryColor, getSemanticColor, getLabel } = useDesignTokens();
32
+ const [evidenceCollapsed, setEvidenceCollapsed] = useState(true);
33
+ const tacticType = String(item.tactic_type || '');
34
+ const colors = getCategoryColor('tactic', tacticType) || { bg: '#f8fafc', text: '#334155', border: '#e2e8f0' };
35
+ const severityKey = String(item.severity || 'minor').toLowerCase();
36
+ const severity = getSemanticColor('severity', severityKey) || { bg: 'rgba(34, 197, 94, 0.15)', text: '#16a34a', border: '#bbf7d0' };
37
+ const isMajor = severityKey === 'major';
38
+ const isMinor = severityKey === 'minor';
39
+ const ideaIds = item.idea_ids_involved;
40
+ const priorRefs = item.prior_work_references;
41
+ const currentEvidence = item.current_work_evidence;
42
+ const tacticName = item.tactic_name ? String(item.tactic_name) : '';
43
+ const tacticLabel = getLabel('tactic', tacticType);
44
+ const showName = Boolean(tacticName && tacticName !== tacticLabel);
45
+ const hasPrior = Boolean(priorRefs && priorRefs.length > 0);
46
+ const hasCurrent = Boolean(currentEvidence && currentEvidence.length > 0);
47
+ const hasAssessment = Boolean(item.assessment);
48
+ // Build evidence trail steps from tactic fields
49
+ const evidenceSteps = [];
50
+ if (hasPrior) {
51
+ evidenceSteps.push({
52
+ label: 'Prior work',
53
+ variant: 'prior',
54
+ items: priorRefs.map(r => ({ title: r.work_title, quote: r.relevant_quote })),
55
+ });
56
+ }
57
+ if (hasCurrent) {
58
+ evidenceSteps.push({
59
+ label: 'Current work',
60
+ variant: 'current',
61
+ items: currentEvidence.map(e => ({ quote: e.quote, cite: e.location })),
62
+ });
63
+ }
64
+ if (hasAssessment) {
65
+ evidenceSteps.push({
66
+ label: 'Assessment',
67
+ variant: 'assessment',
68
+ text: String(item.assessment),
69
+ });
70
+ }
71
+ const pieceCount = evidenceSteps.reduce((n, s) => n + (s.items?.length || (s.text ? 1 : 0)), 0);
72
+ return (_jsxs("div", { className: `gen-tactic-card gen-tactic-card--${severityKey}`, style: {
73
+ borderLeftColor: colors.text,
74
+ borderLeftWidth: isMajor ? '5px' : '3px',
75
+ }, children: [_jsxs("div", { className: "gen-tactic-header", children: [_jsx("span", { className: "gen-tactic-type-badge", style: { background: colors.bg, color: colors.text, borderColor: colors.border }, children: tacticLabel || tacticType.replace(/_/g, ' ') }), _jsx("span", { className: `gen-severity-badge gen-severity-badge--${severityKey}`, style: { background: severity.bg, color: severity.text }, children: severityKey })] }), showName && (_jsx("h4", { className: "gen-tactic-name", children: tacticName })), _jsx("p", { className: `gen-tactic-desc ${isMinor ? 'gen-tactic-desc--subdued' : ''}`, children: String(item.description || '') }), ideaIds && ideaIds.length > 0 ? (_jsxs("div", { className: "gen-tactic-ideas", children: [_jsx("span", { className: "gen-tactic-section-label", children: "Ideas involved" }), _jsx("div", { className: "gen-idea-tags", children: ideaIds.map(id => (_jsx("span", { className: "gen-idea-tag gen-idea-tag--linked", title: `See idea ${id} in Idea Evolution Map`, children: id }, id))) })] })) : null, evidenceSteps.length > 0 ? (_jsxs("div", { className: "gen-evidence-trail", children: [_jsxs("button", { type: "button", className: `gen-evidence-toggle${evidenceCollapsed ? ' gen-evidence-toggle--collapsed' : ''}`, onClick: (e) => { e.stopPropagation(); setEvidenceCollapsed(!evidenceCollapsed); }, children: [_jsx("span", { className: "gen-evidence-toggle-icon", children: '\u25B6' }), _jsx("span", { className: "gen-evidence-toggle-label", children: "Evidence Trail" }), _jsx("span", { className: "gen-evidence-count", children: pieceCount })] }), !evidenceCollapsed && (_jsx(EvidenceTrail, { steps: evidenceSteps, accentColor: colors.text, borderColor: colors.border }))] })) : null] }));
76
+ }
77
+ //# sourceMappingURL=TacticCardCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TacticCardCell.js","sourceRoot":"","sources":["../../src/cells/TacticCardCell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * TemplateCardCell -- Schema-driven card renderer.
3
+ *
4
+ * Instead of hardcoding field→UI mapping in React, this cell renderer
5
+ * interprets a `card_template` JSON structure from the view definition.
6
+ * Each "slot" in the template maps to an atomic rendering block:
7
+ *
8
+ * badge_row -- Row of colored badges (category or semantic colors)
9
+ * heading -- Title text, optionally hidden when it matches a label
10
+ * prose -- Paragraph text with optional subdued state
11
+ * chip_list -- Array of string chips with optional link hints
12
+ * evidence_trail -- Multi-step evidence chain (prior -> current -> assessment)
13
+ * key_value -- Key-value pairs rendered as a compact table
14
+ * separator -- Visual divider
15
+ *
16
+ * Template schema (in renderer_config.card_template):
17
+ * {
18
+ * wrapper_class?: string, -- CSS class for outer div
19
+ * border_accent?: ColorRef, -- Border-left color from design tokens
20
+ * border_weight_field?: string, -- Field to read for border thickness
21
+ * border_weight_map?: Record<string, string>, -- value -> CSS width
22
+ * slots: SlotConfig[] -- Ordered list of content blocks
23
+ * }
24
+ *
25
+ * New renderers = new JSON. No React code needed.
26
+ */
27
+ import { CellRendererProps } from '../types';
28
+ export declare function TemplateCardCell({ item, config }: CellRendererProps): import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=TemplateCardCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateCardCell.d.ts","sourceRoot":"","sources":["../../src/cells/TemplateCardCell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AA8W7C,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA4CnE"}
@@ -0,0 +1,202 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * TemplateCardCell -- Schema-driven card renderer.
4
+ *
5
+ * Instead of hardcoding field→UI mapping in React, this cell renderer
6
+ * interprets a `card_template` JSON structure from the view definition.
7
+ * Each "slot" in the template maps to an atomic rendering block:
8
+ *
9
+ * badge_row -- Row of colored badges (category or semantic colors)
10
+ * heading -- Title text, optionally hidden when it matches a label
11
+ * prose -- Paragraph text with optional subdued state
12
+ * chip_list -- Array of string chips with optional link hints
13
+ * evidence_trail -- Multi-step evidence chain (prior -> current -> assessment)
14
+ * key_value -- Key-value pairs rendered as a compact table
15
+ * separator -- Visual divider
16
+ *
17
+ * Template schema (in renderer_config.card_template):
18
+ * {
19
+ * wrapper_class?: string, -- CSS class for outer div
20
+ * border_accent?: ColorRef, -- Border-left color from design tokens
21
+ * border_weight_field?: string, -- Field to read for border thickness
22
+ * border_weight_map?: Record<string, string>, -- value -> CSS width
23
+ * slots: SlotConfig[] -- Ordered list of content blocks
24
+ * }
25
+ *
26
+ * New renderers = new JSON. No React code needed.
27
+ */
28
+ import { useState } from 'react';
29
+ import { useDesignTokens } from '../tokens/DesignTokenContext';
30
+ import { EvidenceTrail } from '../components/EvidenceTrail';
31
+ // ── Block: badge_row ───────────────────────────────────
32
+ function BadgeRowBlock({ badges, item, getCategoryColor, getSemanticColor, getLabel }) {
33
+ return (_jsx("div", { className: "ar-card-badge-row", children: badges.map((badge, idx) => {
34
+ const rawValue = String(item[badge.field] || badge.default_value || '');
35
+ if (!rawValue)
36
+ return null;
37
+ let displayValue = rawValue;
38
+ let colors = null;
39
+ if (badge.color_mode === 'category' && badge.color_category) {
40
+ colors = getCategoryColor(badge.color_category, rawValue);
41
+ displayValue = getLabel(badge.color_category, rawValue) || rawValue.replace(/_/g, ' ');
42
+ }
43
+ else if (badge.color_mode === 'semantic' && badge.color_scale) {
44
+ const key = rawValue.toLowerCase();
45
+ const tokenKey = badge.value_map?.[key] || key;
46
+ colors = getSemanticColor(badge.color_scale, tokenKey);
47
+ displayValue = key;
48
+ }
49
+ if (badge.transform === 'lowercase')
50
+ displayValue = displayValue.toLowerCase();
51
+ else if (badge.transform === 'uppercase')
52
+ displayValue = displayValue.toUpperCase();
53
+ else if (badge.transform === 'titlecase')
54
+ displayValue = displayValue.replace(/\b\w/g, c => c.toUpperCase());
55
+ const fallback = { bg: '#f8fafc', text: '#334155', border: '#e2e8f0' };
56
+ const c = colors || fallback;
57
+ const isSemantic = badge.color_mode === 'semantic';
58
+ const className = isSemantic
59
+ ? `ar-severity-badge ar-severity-badge--${rawValue.toLowerCase()}`
60
+ : 'ar-card-type-badge';
61
+ return (_jsx("span", { className: className, style: { background: c.bg, color: c.text, borderColor: c.border }, children: displayValue }, idx));
62
+ }) }));
63
+ }
64
+ // ── Block: heading ─────────────────────────────────────
65
+ function HeadingBlock({ field, item, hideWhenMatchesLabel, getLabel }) {
66
+ const text = String(item[field] || '');
67
+ if (!text)
68
+ return null;
69
+ if (hideWhenMatchesLabel) {
70
+ const keyValue = String(item[hideWhenMatchesLabel.key_field] || '');
71
+ const label = getLabel(hideWhenMatchesLabel.category, keyValue);
72
+ if (text === label)
73
+ return null;
74
+ }
75
+ return _jsx("h4", { className: "ar-card-heading", children: text });
76
+ }
77
+ // ── Block: prose ───────────────────────────────────────
78
+ function ProseBlock({ field, item, subduedWhen }) {
79
+ const text = String(item[field] || '');
80
+ if (!text)
81
+ return null;
82
+ const isSubdued = subduedWhen
83
+ && String(item[subduedWhen.field] || '').toLowerCase() === subduedWhen.equals;
84
+ return (_jsx("p", { className: `ar-card-prose${isSubdued ? ' ar-card-prose--subdued' : ''}`, children: text }));
85
+ }
86
+ // ── Block: chip_list ───────────────────────────────────
87
+ function ChipListBlock({ field, item, label, linkTitlePattern }) {
88
+ const values = item[field];
89
+ if (!values || !Array.isArray(values) || values.length === 0)
90
+ return null;
91
+ return (_jsxs("div", { className: "ar-card-chip-list", children: [label && _jsx("span", { className: "ar-card-section-label", children: label }), _jsx("div", { className: "gen-idea-tags", children: values.map(val => (_jsx("span", { className: "gen-idea-tag gen-idea-tag--linked", title: linkTitlePattern ? linkTitlePattern.replace('{value}', val) : undefined, children: val }, val))) })] }));
92
+ }
93
+ // ── Block: evidence_trail ──────────────────────────────
94
+ function EvidenceTrailBlock({ steps, item, label, accentFrom, collapsedByDefault, getCategoryColor }) {
95
+ const [collapsed, setCollapsed] = useState(collapsedByDefault ?? false);
96
+ const trailSteps = [];
97
+ for (const sc of steps) {
98
+ const raw = item[sc.field];
99
+ if (raw === undefined || raw === null || raw === '')
100
+ continue;
101
+ const variant = sc.variant;
102
+ if (sc.is_text || typeof raw === 'string') {
103
+ trailSteps.push({ label: sc.label, variant, text: String(raw) });
104
+ }
105
+ else if (Array.isArray(raw)) {
106
+ const items = raw.map((entry) => {
107
+ if (typeof entry === 'string')
108
+ return { quote: entry };
109
+ if (typeof entry === 'object' && entry !== null) {
110
+ const e = entry;
111
+ return {
112
+ title: sc.item_title_field ? String(e[sc.item_title_field] || '') : undefined,
113
+ quote: sc.item_quote_field ? String(e[sc.item_quote_field] || '') : undefined,
114
+ cite: sc.item_cite_field ? String(e[sc.item_cite_field] || '') : undefined,
115
+ };
116
+ }
117
+ return { quote: String(entry) };
118
+ });
119
+ if (items.length > 0) {
120
+ trailSteps.push({ label: sc.label, variant, items });
121
+ }
122
+ }
123
+ }
124
+ if (trailSteps.length === 0)
125
+ return null;
126
+ let accentColor;
127
+ let borderColor;
128
+ if (accentFrom) {
129
+ const keyValue = String(item[accentFrom.key_field] || '');
130
+ const colors = getCategoryColor(accentFrom.category, keyValue);
131
+ if (colors) {
132
+ accentColor = colors.text;
133
+ borderColor = colors.border;
134
+ }
135
+ }
136
+ // Count total evidence pieces for the summary
137
+ const pieceCount = trailSteps.reduce((n, s) => n + (s.items?.length || (s.text ? 1 : 0)), 0);
138
+ return (_jsxs("div", { className: "gen-evidence-trail", children: [_jsxs("button", { type: "button", className: `gen-evidence-toggle${collapsed ? ' gen-evidence-toggle--collapsed' : ''}`, onClick: (e) => { e.stopPropagation(); setCollapsed(!collapsed); }, children: [_jsx("span", { className: "gen-evidence-toggle-icon", children: '\u25B6' }), _jsx("span", { className: "gen-evidence-toggle-label", children: label || 'Evidence Trail' }), _jsx("span", { className: "gen-evidence-count", children: pieceCount })] }), !collapsed && (_jsx(EvidenceTrail, { steps: trailSteps, accentColor: accentColor, borderColor: borderColor }))] }));
139
+ }
140
+ // ── Block: key_value ───────────────────────────────────
141
+ function KeyValueBlock({ entries, item }) {
142
+ const pairs = entries
143
+ .map(e => ({ label: e.label, value: item[e.field] }))
144
+ .filter(p => p.value != null && p.value !== '');
145
+ if (pairs.length === 0)
146
+ return null;
147
+ return (_jsx("div", { className: "gen-template-kv", children: pairs.map((p, idx) => (_jsxs("div", { className: "gen-template-kv-row", children: [_jsx("span", { className: "gen-template-kv-label", children: p.label }), _jsx("span", { className: "gen-template-kv-value", children: String(p.value) })] }, idx))) }));
148
+ }
149
+ // ── Block: separator ───────────────────────────────────
150
+ function SeparatorBlock() {
151
+ return _jsx("hr", { className: "gen-template-separator" });
152
+ }
153
+ // ── Slot dispatcher ────────────────────────────────────
154
+ function TemplateSlot({ slot, item, getCategoryColor, getSemanticColor, getLabel }) {
155
+ switch (slot.type) {
156
+ case 'badge_row':
157
+ return slot.badges ? (_jsx(BadgeRowBlock, { badges: slot.badges, item: item, getCategoryColor: getCategoryColor, getSemanticColor: getSemanticColor, getLabel: getLabel })) : null;
158
+ case 'heading':
159
+ return slot.field ? (_jsx(HeadingBlock, { field: slot.field, item: item, hideWhenMatchesLabel: slot.hide_when_matches_label, getLabel: getLabel })) : null;
160
+ case 'prose':
161
+ return slot.field ? (_jsx(ProseBlock, { field: slot.field, item: item, subduedWhen: slot.subdued_when })) : null;
162
+ case 'chip_list':
163
+ return slot.field ? (_jsx(ChipListBlock, { field: slot.field, item: item, label: slot.label, linkTitlePattern: slot.link_title_pattern })) : null;
164
+ case 'evidence_trail':
165
+ return slot.steps ? (_jsx(EvidenceTrailBlock, { steps: slot.steps, item: item, label: slot.label, accentFrom: slot.accent_from, collapsedByDefault: slot.collapsed_by_default, getCategoryColor: getCategoryColor })) : null;
166
+ case 'key_value':
167
+ return slot.entries ? (_jsx(KeyValueBlock, { entries: slot.entries, item: item })) : null;
168
+ case 'separator':
169
+ return _jsx(SeparatorBlock, {});
170
+ default:
171
+ return null;
172
+ }
173
+ }
174
+ // ── Main component ─────────────────────────────────────
175
+ export function TemplateCardCell({ item, config }) {
176
+ const { getCategoryColor, getSemanticColor, getLabel } = useDesignTokens();
177
+ const template = config.card_template;
178
+ if (!template || !template.slots) {
179
+ return _jsx("p", { className: "gen-empty", children: "No card template configured." });
180
+ }
181
+ // Compute wrapper styles from template config
182
+ const wrapperClass = template.wrapper_class || '';
183
+ const severityField = template.border_weight_field;
184
+ const severityValue = severityField ? String(item[severityField] || '').toLowerCase() : '';
185
+ const severityModifier = severityValue ? ` ${wrapperClass}--${severityValue}` : '';
186
+ let borderStyle;
187
+ if (template.border_accent) {
188
+ const keyValue = String(item[template.border_accent.key_field] || '');
189
+ const colors = getCategoryColor(template.border_accent.category, keyValue);
190
+ if (colors) {
191
+ const width = template.border_weight_map?.[severityValue] || '4px';
192
+ borderStyle = {
193
+ borderTopColor: colors.text,
194
+ borderTopWidth: width,
195
+ borderTopStyle: 'solid',
196
+ };
197
+ }
198
+ }
199
+ const className = `${wrapperClass}${severityModifier}`.trim() || undefined;
200
+ return (_jsx("div", { className: className, style: borderStyle, children: template.slots.map((slot, idx) => (_jsx(TemplateSlot, { slot: slot, item: item, getCategoryColor: getCategoryColor, getSemanticColor: getSemanticColor, getLabel: getLabel }, idx))) }));
201
+ }
202
+ //# sourceMappingURL=TemplateCardCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateCardCell.js","sourceRoot":"","sources":["../../src/cells/TemplateCardCell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cell Renderer Registry — Domain-specific card content components.
3
+ */
4
+ import React from 'react';
5
+ import type { CellRendererProps, CellRendererComponent } from '../types';
6
+ export type { CellRendererProps, CellRendererComponent };
7
+ /** Registry of cell renderers keyed by config.cell_renderer string */
8
+ export declare const cellRenderers: Record<string, CellRendererComponent>;
9
+ /**
10
+ * Default cell renderer — auto-classifies item fields into visual tiers.
11
+ */
12
+ export declare function DefaultCardCell({ item, config }: CellRendererProps): React.DetailedReactHTMLElement<{
13
+ className: string;
14
+ }, HTMLElement>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cells/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEzE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;AAEzD,sEAAsE;AACtE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAE/D,CAAC;AAoBF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,iBAAiB;;gBA6DlE"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Cell Renderer Registry — Domain-specific card content components.
3
+ */
4
+ import React from 'react';
5
+ import { TemplateCardCell } from './TemplateCardCell';
6
+ /** Registry of cell renderers keyed by config.cell_renderer string */
7
+ export const cellRenderers = {
8
+ template_card: TemplateCardCell,
9
+ };
10
+ // Field classification for intelligent rendering
11
+ const TITLE_FIELDS = ['name', 'title', 'finding', 'concept', 'idea', 'theme'];
12
+ const BODY_FIELDS = ['condition', 'description', 'analysis', 'significance', 'explanation', 'mechanism', 'details', 'summary', 'how_it_enables', 'how_it_constrains', 'effect'];
13
+ const EVIDENCE_FIELDS = ['evidence', 'reasoning', 'supporting_evidence', 'rationale', 'justification'];
14
+ const META_FIELDS = new Set(['_category', 'docKey', 'condition_id', 'id', 'index', 'order']);
15
+ function classifyField(key) {
16
+ if (META_FIELDS.has(key))
17
+ return 'skip';
18
+ if (TITLE_FIELDS.includes(key))
19
+ return 'title';
20
+ if (BODY_FIELDS.includes(key))
21
+ return 'body';
22
+ if (EVIDENCE_FIELDS.includes(key))
23
+ return 'evidence';
24
+ return 'tag';
25
+ }
26
+ function formatLabel(key) {
27
+ return key.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
28
+ }
29
+ /**
30
+ * Default cell renderer — auto-classifies item fields into visual tiers.
31
+ */
32
+ export function DefaultCardCell({ item, config }) {
33
+ const titleFieldOverride = config.card_title_field;
34
+ const bodyFieldOverride = config.card_body_field;
35
+ let titleText = '';
36
+ let bodyText = '';
37
+ let evidenceText = '';
38
+ const tags = [];
39
+ for (const [key, value] of Object.entries(item)) {
40
+ if (value == null || value === '')
41
+ continue;
42
+ if (typeof value === 'object')
43
+ continue;
44
+ const strVal = String(value);
45
+ if (titleFieldOverride && key === titleFieldOverride) {
46
+ titleText = strVal;
47
+ continue;
48
+ }
49
+ if (bodyFieldOverride && key === bodyFieldOverride) {
50
+ bodyText = strVal;
51
+ continue;
52
+ }
53
+ const cls = classifyField(key);
54
+ if (cls === 'skip')
55
+ continue;
56
+ if (cls === 'title' && !titleText) {
57
+ titleText = strVal;
58
+ continue;
59
+ }
60
+ if (cls === 'body' && !bodyText) {
61
+ bodyText = strVal;
62
+ continue;
63
+ }
64
+ if (cls === 'evidence' && !evidenceText) {
65
+ evidenceText = strVal;
66
+ continue;
67
+ }
68
+ if (cls === 'tag')
69
+ tags.push([key, strVal]);
70
+ }
71
+ if (!titleText && bodyText && bodyText.length < 120) {
72
+ titleText = bodyText;
73
+ bodyText = '';
74
+ }
75
+ return React.createElement('div', { className: 'card-cell-default' }, titleText
76
+ ? React.createElement('div', { className: 'card-cell-title' }, titleText.length > 200 ? titleText.slice(0, 200) + '\u2026' : titleText)
77
+ : null, bodyText
78
+ ? React.createElement('p', { className: 'card-cell-body' }, bodyText)
79
+ : null, evidenceText
80
+ ? React.createElement('blockquote', { className: 'card-cell-evidence' }, evidenceText)
81
+ : null, tags.length > 0
82
+ ? React.createElement('div', { className: 'card-cell-tags' }, ...tags.slice(0, 4).map(([k, v]) => React.createElement('span', { key: k, className: 'card-cell-tag' }, React.createElement('span', { className: 'card-cell-tag-label' }, formatLabel(k)), ' ', v.replace(/_/g, ' '))))
83
+ : null);
84
+ }
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cells/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAA0C;IAClE,aAAa,EAAE,gBAAgB;CAChC,CAAC;AAEF,iDAAiD;AACjD,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAChL,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AACvG,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7F,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAqB;IACjE,MAAM,kBAAkB,GAAG,MAAM,CAAC,gBAAsC,CAAC;IACzE,MAAM,iBAAiB,GAAG,MAAM,CAAC,eAAqC,CAAC;IAEvE,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,MAAM,IAAI,GAA4B,EAAE,CAAC;IAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAExC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YACrD,SAAS,GAAG,MAAM,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,iBAAiB,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YACnD,QAAQ,GAAG,MAAM,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS;QAC7B,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,SAAS,GAAG,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACpE,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,QAAQ,GAAG,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;YAAC,YAAY,GAAG,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7E,IAAI,GAAG,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACpD,SAAS,GAAG,QAAQ,CAAC;QACrB,QAAQ,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAClE,SAAS;QACP,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,EACzD,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CACxE;QACH,CAAC,CAAC,IAAI,EACR,QAAQ;QACN,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC;QACrE,CAAC,CAAC,IAAI,EACR,YAAY;QACV,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,YAAY,CAAC;QACtF,CAAC,CAAC,IAAI,EACR,IAAI,CAAC,MAAM,GAAG,CAAC;QACb,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,EACxD,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,EAChE,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EACjF,GAAG,EACH,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CACrB,CACF,CACF;QACH,CAAC,CAAC,IAAI,CACT,CAAC;AACJ,CAAC"}