@codesweep-ai/ui 0.2.1-dev.20260830023458.856ea8f

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 (215) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +124 -0
  4. package/dist/BUILD.json +1 -0
  5. package/dist/chart.d.ts +3 -0
  6. package/dist/chart.d.ts.map +1 -0
  7. package/dist/chart.js +3 -0
  8. package/dist/code.d.ts +2 -0
  9. package/dist/code.d.ts.map +1 -0
  10. package/dist/code.js +2 -0
  11. package/dist/components/AgentStatus.d.ts +15 -0
  12. package/dist/components/AgentStatus.d.ts.map +1 -0
  13. package/dist/components/AgentStatus.js +38 -0
  14. package/dist/components/AgentTrace.d.ts +42 -0
  15. package/dist/components/AgentTrace.d.ts.map +1 -0
  16. package/dist/components/AgentTrace.js +140 -0
  17. package/dist/components/AppShell.d.ts +29 -0
  18. package/dist/components/AppShell.d.ts.map +1 -0
  19. package/dist/components/AppShell.js +71 -0
  20. package/dist/components/Button.d.ts +10 -0
  21. package/dist/components/Button.d.ts.map +1 -0
  22. package/dist/components/Button.js +41 -0
  23. package/dist/components/Card.d.ts +19 -0
  24. package/dist/components/Card.d.ts.map +1 -0
  25. package/dist/components/Card.js +96 -0
  26. package/dist/components/CardGroup.d.ts +16 -0
  27. package/dist/components/CardGroup.d.ts.map +1 -0
  28. package/dist/components/CardGroup.js +33 -0
  29. package/dist/components/CardGroupContext.d.ts +14 -0
  30. package/dist/components/CardGroupContext.d.ts.map +1 -0
  31. package/dist/components/CardGroupContext.js +8 -0
  32. package/dist/components/ChartFrame.d.ts +30 -0
  33. package/dist/components/ChartFrame.d.ts.map +1 -0
  34. package/dist/components/ChartFrame.js +96 -0
  35. package/dist/components/ChartTooltip.d.ts +22 -0
  36. package/dist/components/ChartTooltip.d.ts.map +1 -0
  37. package/dist/components/ChartTooltip.js +26 -0
  38. package/dist/components/CheckboxGroup.d.ts +37 -0
  39. package/dist/components/CheckboxGroup.d.ts.map +1 -0
  40. package/dist/components/CheckboxGroup.js +198 -0
  41. package/dist/components/Chip.d.ts +9 -0
  42. package/dist/components/Chip.d.ts.map +1 -0
  43. package/dist/components/Chip.js +31 -0
  44. package/dist/components/CodeBlock.d.ts +30 -0
  45. package/dist/components/CodeBlock.d.ts.map +1 -0
  46. package/dist/components/CodeBlock.js +112 -0
  47. package/dist/components/Dropdown.d.ts +28 -0
  48. package/dist/components/Dropdown.d.ts.map +1 -0
  49. package/dist/components/Dropdown.js +50 -0
  50. package/dist/components/EventLanes.d.ts +93 -0
  51. package/dist/components/EventLanes.d.ts.map +1 -0
  52. package/dist/components/EventLanes.js +445 -0
  53. package/dist/components/FormGroup.d.ts +29 -0
  54. package/dist/components/FormGroup.d.ts.map +1 -0
  55. package/dist/components/FormGroup.js +48 -0
  56. package/dist/components/HighlightText.d.ts +15 -0
  57. package/dist/components/HighlightText.d.ts.map +1 -0
  58. package/dist/components/HighlightText.js +28 -0
  59. package/dist/components/Input.d.ts +35 -0
  60. package/dist/components/Input.d.ts.map +1 -0
  61. package/dist/components/Input.js +61 -0
  62. package/dist/components/Legend.d.ts +21 -0
  63. package/dist/components/Legend.d.ts.map +1 -0
  64. package/dist/components/Legend.js +61 -0
  65. package/dist/components/LightweightMarkdown.d.ts +3 -0
  66. package/dist/components/LightweightMarkdown.d.ts.map +1 -0
  67. package/dist/components/LightweightMarkdown.js +249 -0
  68. package/dist/components/MarkdownMinimap.d.ts +7 -0
  69. package/dist/components/MarkdownMinimap.d.ts.map +1 -0
  70. package/dist/components/MarkdownMinimap.js +84 -0
  71. package/dist/components/MarkdownViewer.d.ts +51 -0
  72. package/dist/components/MarkdownViewer.d.ts.map +1 -0
  73. package/dist/components/MarkdownViewer.js +455 -0
  74. package/dist/components/MermaidDiagram.d.ts +11 -0
  75. package/dist/components/MermaidDiagram.d.ts.map +1 -0
  76. package/dist/components/MermaidDiagram.js +119 -0
  77. package/dist/components/Modal.d.ts +13 -0
  78. package/dist/components/Modal.d.ts.map +1 -0
  79. package/dist/components/Modal.js +91 -0
  80. package/dist/components/Panel.d.ts +13 -0
  81. package/dist/components/Panel.d.ts.map +1 -0
  82. package/dist/components/Panel.js +44 -0
  83. package/dist/components/PulseBadge.d.ts +15 -0
  84. package/dist/components/PulseBadge.d.ts.map +1 -0
  85. package/dist/components/PulseBadge.js +22 -0
  86. package/dist/components/RadioGroup.d.ts +20 -0
  87. package/dist/components/RadioGroup.d.ts.map +1 -0
  88. package/dist/components/RadioGroup.js +63 -0
  89. package/dist/components/RichMarkdownRenderer.d.ts +10 -0
  90. package/dist/components/RichMarkdownRenderer.d.ts.map +1 -0
  91. package/dist/components/RichMarkdownRenderer.js +18 -0
  92. package/dist/components/SearchInput.d.ts +25 -0
  93. package/dist/components/SearchInput.d.ts.map +1 -0
  94. package/dist/components/SearchInput.js +92 -0
  95. package/dist/components/SectionedTree.d.ts +36 -0
  96. package/dist/components/SectionedTree.d.ts.map +1 -0
  97. package/dist/components/SectionedTree.js +173 -0
  98. package/dist/components/SegmentedControl.d.ts +16 -0
  99. package/dist/components/SegmentedControl.d.ts.map +1 -0
  100. package/dist/components/SegmentedControl.js +48 -0
  101. package/dist/components/Skeleton.d.ts +8 -0
  102. package/dist/components/Skeleton.d.ts.map +1 -0
  103. package/dist/components/Skeleton.js +25 -0
  104. package/dist/components/SplitPane.d.ts +16 -0
  105. package/dist/components/SplitPane.d.ts.map +1 -0
  106. package/dist/components/SplitPane.js +118 -0
  107. package/dist/components/StatusBadge.d.ts +15 -0
  108. package/dist/components/StatusBadge.d.ts.map +1 -0
  109. package/dist/components/StatusBadge.js +40 -0
  110. package/dist/components/StreamingText.d.ts +20 -0
  111. package/dist/components/StreamingText.d.ts.map +1 -0
  112. package/dist/components/StreamingText.js +50 -0
  113. package/dist/components/Table.d.ts +62 -0
  114. package/dist/components/Table.d.ts.map +1 -0
  115. package/dist/components/Table.js +256 -0
  116. package/dist/components/ThemeToggle.d.ts +11 -0
  117. package/dist/components/ThemeToggle.d.ts.map +1 -0
  118. package/dist/components/ThemeToggle.js +55 -0
  119. package/dist/components/Toast.d.ts +8 -0
  120. package/dist/components/Toast.d.ts.map +1 -0
  121. package/dist/components/Toast.js +51 -0
  122. package/dist/components/ToastContainer.d.ts +5 -0
  123. package/dist/components/ToastContainer.d.ts.map +1 -0
  124. package/dist/components/ToastContainer.js +29 -0
  125. package/dist/components/Tree.d.ts +50 -0
  126. package/dist/components/Tree.d.ts.map +1 -0
  127. package/dist/components/Tree.js +528 -0
  128. package/dist/components/TreeDnd.d.ts +18 -0
  129. package/dist/components/TreeDnd.d.ts.map +1 -0
  130. package/dist/components/TreeDnd.js +39 -0
  131. package/dist/index.d.ts +50 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +35 -0
  134. package/dist/lib/accentToken.d.ts +3 -0
  135. package/dist/lib/accentToken.d.ts.map +1 -0
  136. package/dist/lib/accentToken.js +12 -0
  137. package/dist/lib/chartTheme.d.ts +45 -0
  138. package/dist/lib/chartTheme.d.ts.map +1 -0
  139. package/dist/lib/chartTheme.js +64 -0
  140. package/dist/lib/cn.d.ts +6 -0
  141. package/dist/lib/cn.d.ts.map +1 -0
  142. package/dist/lib/cn.js +11 -0
  143. package/dist/lib/forwardRefToRoot.d.ts +8 -0
  144. package/dist/lib/forwardRefToRoot.d.ts.map +1 -0
  145. package/dist/lib/forwardRefToRoot.js +18 -0
  146. package/dist/lib/markdownUrl.d.ts +5 -0
  147. package/dist/lib/markdownUrl.d.ts.map +1 -0
  148. package/dist/lib/markdownUrl.js +24 -0
  149. package/dist/lib/toast.d.ts +30 -0
  150. package/dist/lib/toast.d.ts.map +1 -0
  151. package/dist/lib/toast.js +34 -0
  152. package/dist/lib/useTheme.d.ts +22 -0
  153. package/dist/lib/useTheme.d.ts.map +1 -0
  154. package/dist/lib/useTheme.js +62 -0
  155. package/dist/markdown/rich.d.ts +10 -0
  156. package/dist/markdown/rich.d.ts.map +1 -0
  157. package/dist/markdown/rich.js +8 -0
  158. package/dist/markdown.d.ts +3 -0
  159. package/dist/markdown.d.ts.map +1 -0
  160. package/dist/markdown.js +2 -0
  161. package/dist/mermaid.d.ts +2 -0
  162. package/dist/mermaid.d.ts.map +1 -0
  163. package/dist/mermaid.js +2 -0
  164. package/dist/minimap.d.ts +2 -0
  165. package/dist/minimap.d.ts.map +1 -0
  166. package/dist/minimap.js +2 -0
  167. package/dist/styles/base.css +98 -0
  168. package/dist/styles/components/agent-status.css +52 -0
  169. package/dist/styles/components/agent-trace.css +206 -0
  170. package/dist/styles/components/app-shell.css +195 -0
  171. package/dist/styles/components/button.css +172 -0
  172. package/dist/styles/components/card-group.css +20 -0
  173. package/dist/styles/components/card.css +200 -0
  174. package/dist/styles/components/chart-frame.css +144 -0
  175. package/dist/styles/components/chart-tooltip.css +54 -0
  176. package/dist/styles/components/checkbox-group.css +281 -0
  177. package/dist/styles/components/chip.css +61 -0
  178. package/dist/styles/components/code-block.css +215 -0
  179. package/dist/styles/components/dropdown.css +131 -0
  180. package/dist/styles/components/event-lanes.css +159 -0
  181. package/dist/styles/components/form-group.css +34 -0
  182. package/dist/styles/components/highlight-text.css +17 -0
  183. package/dist/styles/components/input.css +168 -0
  184. package/dist/styles/components/legend.css +80 -0
  185. package/dist/styles/components/markdown-minimap.css +13 -0
  186. package/dist/styles/components/markdown-viewer.css +354 -0
  187. package/dist/styles/components/mermaid-diagram.css +8 -0
  188. package/dist/styles/components/modal.css +167 -0
  189. package/dist/styles/components/panel.css +126 -0
  190. package/dist/styles/components/pulse-badge.css +56 -0
  191. package/dist/styles/components/radio-group.css +89 -0
  192. package/dist/styles/components/search-input.css +153 -0
  193. package/dist/styles/components/sectioned-tree.css +183 -0
  194. package/dist/styles/components/segmented-control.css +54 -0
  195. package/dist/styles/components/skeleton.css +21 -0
  196. package/dist/styles/components/split-pane.css +78 -0
  197. package/dist/styles/components/status-badge.css +94 -0
  198. package/dist/styles/components/streaming-text.css +38 -0
  199. package/dist/styles/components/table.css +235 -0
  200. package/dist/styles/components/theme-toggle.css +123 -0
  201. package/dist/styles/components/toast-container.css +34 -0
  202. package/dist/styles/components/toast.css +169 -0
  203. package/dist/styles/components/tree.css +375 -0
  204. package/dist/styles/components.css +37 -0
  205. package/dist/styles/core.css +3 -0
  206. package/dist/styles/markdown-content.css +368 -0
  207. package/dist/styles/print.css +55 -0
  208. package/dist/styles/reset.css +202 -0
  209. package/dist/styles/syntax.css +62 -0
  210. package/dist/styles/tokens.css +344 -0
  211. package/dist/styles/utilities.css +7 -0
  212. package/dist/testing/index.d.ts +39 -0
  213. package/dist/testing/index.d.ts.map +1 -0
  214. package/dist/testing/index.js +119 -0
  215. package/package.json +138 -0
@@ -0,0 +1,344 @@
1
+ /* ============================================================
2
+ @codesweep-ai/ui — Design Tokens
3
+ ============================================================ */
4
+
5
+ :root {
6
+ /* --- Spacing --- */
7
+ --space-0: 0;
8
+ --space-px: 1px;
9
+ --space-0-5: 0.125rem;
10
+ --space-1: 0.25rem;
11
+ --space-2: 0.5rem;
12
+ --space-3: 0.75rem;
13
+ --space-4: 1rem;
14
+ --space-5: 1.5rem;
15
+ --space-6: 2rem;
16
+
17
+ /* --- Radii --- */
18
+ --radius-xs: 2px;
19
+ --radius-sm: 4px;
20
+ --radius-md: 6px;
21
+ --radius-lg: 8px;
22
+ --radius-xl: 12px;
23
+
24
+ /* --- Typography --- */
25
+ --font-family-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI",
26
+ Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji",
27
+ "Segoe UI Emoji";
28
+ --font-family-mono: ui-monospace, "SF Mono", "SFMono-Regular", Menlo,
29
+ Consolas, "Liberation Mono", "Cascadia Code", monospace;
30
+
31
+ --font-size-xs: 0.75rem;
32
+ --font-size-sm: 0.875rem;
33
+ --font-size-md: 1rem;
34
+ --font-size-lg: 1.25rem;
35
+ --font-size-xl: 1.5rem;
36
+
37
+ --font-weight-regular: 400;
38
+ --font-weight-medium: 500;
39
+ --font-weight-semibold: 600;
40
+ --font-weight-bold: 700;
41
+
42
+ --line-height-tight: 1.2;
43
+ --line-height-normal: 1.5;
44
+ --line-height-relaxed: 1.7;
45
+
46
+ /* --- Prose / long-form ramp (generated content; larger than app chrome) ---
47
+ Drives the `.prose` utility (base.css) and MarkdownViewer's markdown CSS. */
48
+ --font-size-prose-h1: 2rem; /* 32px */
49
+ --font-size-prose-h2: 1.5rem; /* 24px */
50
+ --font-size-prose-h3: 1.25rem; /* 20px */
51
+ --font-size-prose-h4: 1rem; /* 16px */
52
+ --font-size-prose-body: 1rem; /* 16px — larger than chrome body */
53
+ --font-size-prose-small: 0.875rem; /* 14px */
54
+ --line-height-prose: 1.65;
55
+ --max-width-prose: 65ch;
56
+
57
+ /* --- Shadows (dark-mode defaults — need higher opacity on dark bg) --- */
58
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4);
59
+ --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.5);
60
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.6);
61
+ --shadow-up: 0 -3px 6px rgba(0, 0, 0, 0.5);
62
+
63
+ /* --- Transitions --- */
64
+ --transition-fast: 0.15s ease;
65
+ --transition-normal: 0.2s ease;
66
+
67
+ /* --- Neutral header chrome (fixed, theme-independent) ---
68
+ The header + footer bar is always dark in BOTH themes, so every color
69
+ used on it must read on a dark surface regardless of the active theme. */
70
+ --color-accent: #1ee0ca;
71
+ --color-header-bg: #171717;
72
+ --color-header-text: #fafafa;
73
+ --color-header-text-muted: #b8b8b8;
74
+ --color-nav-hover: #404040;
75
+ --color-text-inverse: #ffffff;
76
+
77
+ /* --- Dark Theme (default) --- */
78
+ --bg: #0b0f14;
79
+ --fg: #d1d9e0;
80
+ --muted: #9aa4af;
81
+ /* A second structural step, one clear move further from the foreground than
82
+ --muted. For plumbing that recurs at volume and must stay separable from it
83
+ without competing with the categorical hues. Reviewed 2026-08-27 against a
84
+ real 1,366-event strip in both themes; 3:1+ against --bg. */
85
+ --color-structural: #6b7580;
86
+ --card: #0f1620;
87
+ --border: rgba(255, 255, 255, 0.08);
88
+
89
+ /* --- Syntax highlighting (dark) --- */
90
+ --syntax-keyword: #f97583;
91
+ --syntax-string: #85e89d;
92
+ --syntax-number: #79b8ff;
93
+ --syntax-title: #b392f0;
94
+ --syntax-attr: #79b8ff;
95
+ --syntax-builtin: #ffab70;
96
+ --syntax-comment: #6a737d;
97
+
98
+ --color-accent-bg: rgba(30, 224, 202, 0.05);
99
+ --color-accent-bg-hover: rgba(30, 224, 202, 0.1);
100
+ --color-accent-bg-strong: rgba(30, 224, 202, 0.15);
101
+
102
+ --color-link: #3b82f6;
103
+ --color-link-hover: #2563eb;
104
+
105
+ --color-error: #f87171;
106
+ --color-error-text: #f87171;
107
+ --color-error-bg: rgba(248, 113, 113, 0.1);
108
+ --color-info: #60a5fa;
109
+ --color-success: #34d399;
110
+ --color-success-bg: rgba(52, 211, 153, 0.2);
111
+ --color-warning: #f59e0b;
112
+ --color-warning-bg: rgba(245, 158, 11, 0.1);
113
+ --color-neutral: #9ca3af;
114
+ --color-neutral-bg: rgba(156, 163, 175, 0.2);
115
+ /* severe: the step between warning and error, for 4-level ordered severity
116
+ scales (low/med/high/critical). Status colors ship with a label or shape —
117
+ never color alone; adjacent hot hues (warning/severe/error) are not
118
+ separable by hue for CVD readers. Added v1.12.0 (unreleased). */
119
+ --color-severe: #f97316;
120
+ --color-severe-bg: rgba(249, 115, 22, 0.1);
121
+
122
+ --color-btn-primary: #17c9b5;
123
+ --color-btn-primary-text: #000000;
124
+ --color-btn-success-text: #000000;
125
+ --color-btn-warning-text: #000000;
126
+ --color-btn-disabled-bg: rgba(59, 130, 246, 0.5);
127
+ --color-btn-disabled-text: rgba(255, 255, 255, 0.7);
128
+
129
+ --color-highlight: rgba(250, 204, 21, 0.35);
130
+
131
+ --color-bg-subtle: rgba(255, 255, 255, 0.05);
132
+ --color-bg-muted: rgba(128, 128, 128, 0.05);
133
+ --color-bg-muted-hover: rgba(128, 128, 128, 0.1);
134
+ --color-row-hover: rgba(255, 255, 255, 0.06);
135
+
136
+ /* --- Z-index --- */
137
+ --z-sticky: 10;
138
+ --z-header: 100;
139
+ --z-modal: 200;
140
+ --z-tooltip: 300; /* above modal — chart/UI tooltips. Added v1.5.0. */
141
+ --z-toast: 400; /* above tooltips — transient feedback. Added v1.11.0. */
142
+
143
+ /* --- Overlay --- */
144
+ --color-overlay: rgba(0, 0, 0, 0.5);
145
+
146
+ /* --- Header shadow (always dark, not theme-dependent) --- */
147
+ --shadow-header: 0 2px 10px rgba(0, 0, 0, 0.3);
148
+
149
+ /* --- Letter spacing --- */
150
+ --letter-spacing-wide: 0.5px;
151
+
152
+ /* --- Tree indentation --- */
153
+ --tree-indent-size: 1rem;
154
+ --tree-indent-base: 0.5rem;
155
+
156
+ /* --- Icon sizes --- */
157
+ --icon-size-xs: 12px;
158
+ --icon-size-sm: 14px;
159
+ --icon-size-md: 16px;
160
+ --icon-size-lg: 18px;
161
+
162
+ /* --- Pulse / indicator dot sizes (PulseBadge) --- */
163
+ --pulse-size-sm: 6px;
164
+ --pulse-size-md: 8px;
165
+ --pulse-size-lg: 10px;
166
+
167
+ /* --- Categorical palette (charts, legends, grouping) — muted set (color review) --- */
168
+ --color-cat-1: #6f93c9; /* blue */
169
+ --color-cat-2: #4fb3a6; /* teal */
170
+ --color-cat-3: #d2a44e; /* amber */
171
+ --color-cat-4: #d77f8b; /* rose */
172
+ --color-cat-5: #9e90cc; /* violet */
173
+ --color-cat-6: #d89259; /* orange */
174
+ --color-cat-7: #5fae8a; /* emerald */
175
+ --color-cat-8: #c489c9; /* fuchsia */
176
+ --color-cat-9: #6ab0d4; /* sky */
177
+ --color-cat-10: #9cb866; /* lime */
178
+
179
+ /* --- Categorical sub-shades (light / mid / dark per hue) --- */
180
+ --color-cat-1-light: #93c5fd;
181
+ --color-cat-1-mid: #3b82f6;
182
+ --color-cat-1-dark: #2563eb;
183
+ --color-cat-2-light: #5eead4;
184
+ --color-cat-2-mid: #14b8a6;
185
+ --color-cat-2-dark: #0d9488;
186
+ --color-cat-3-light: #fcd34d;
187
+ --color-cat-3-mid: #f59e0b;
188
+ --color-cat-3-dark: #d97706;
189
+ --color-cat-4-light: #fda4af;
190
+ --color-cat-4-mid: #f43f5e;
191
+ --color-cat-4-dark: #e11d48;
192
+ --color-cat-5-light: #c4b5fd;
193
+ --color-cat-5-mid: #8b5cf6;
194
+ --color-cat-5-dark: #7c3aed;
195
+ --color-cat-6-light: #fdba74;
196
+ --color-cat-6-mid: #f97316;
197
+ --color-cat-6-dark: #ea580c;
198
+ --color-cat-7-light: #6ee7b7;
199
+ --color-cat-7-mid: #10b981;
200
+ --color-cat-7-dark: #059669;
201
+ --color-cat-8-light: #f0abfc;
202
+ --color-cat-8-mid: #d946ef;
203
+ --color-cat-8-dark: #c026d3;
204
+ --color-cat-9-light: #7dd3fc;
205
+ --color-cat-9-mid: #0ea5e9;
206
+ --color-cat-9-dark: #0284c7;
207
+ --color-cat-10-light: #bef264;
208
+ --color-cat-10-mid: #84cc16;
209
+ --color-cat-10-dark: #65a30d;
210
+
211
+ /* --- Semantic typography --- */
212
+ --font-size-page-title: var(--font-size-xl);
213
+ --font-size-section-title: var(--font-size-lg);
214
+ --font-size-card-header: var(--font-size-sm);
215
+ --font-size-label: var(--font-size-xs);
216
+ --font-size-body: var(--font-size-sm);
217
+ --font-size-caption: var(--font-size-xs);
218
+ --font-size-stat: var(--font-size-xl);
219
+
220
+ /* --- Code typography --- */
221
+ --font-size-code: 13px;
222
+ --line-height-code: 1.6;
223
+
224
+ /* --- Chart typography --- */
225
+ --font-size-chart-axis: 11px;
226
+
227
+ /* --- Card content --- */
228
+ --card-content-height: 28rem;
229
+
230
+ /* --- Input / Layout Widths --- */
231
+ --input-min-width: 150px;
232
+ --content-width-sm: 200px;
233
+ --chart-tooltip-max-width: 240px;
234
+ --toast-max-width: 360px;
235
+
236
+ /* --- Modal --- */
237
+ --modal-max-width: 700px;
238
+ --modal-margin-top: 5vh;
239
+ --modal-max-height: 80vh;
240
+
241
+ }
242
+
243
+ :root[data-theme="light"] {
244
+ /* --- Shadows (lighter for white backgrounds) --- */
245
+ --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.08);
246
+ --shadow-md: 0 2px 8px rgba(15, 23, 42, 0.12);
247
+ --shadow-lg: 0 8px 24px rgba(15, 23, 42, 0.18);
248
+ --shadow-up: 0 -3px 6px rgba(15, 23, 42, 0.1);
249
+
250
+ --bg: #f3f4f6; /* soft cool gray — page recedes (color review) */
251
+ --fg: #1f2937;
252
+ --muted: #4b5563;
253
+ --color-structural: #7b8694;
254
+ --card: #ffffff; /* white cards lift off the page (color review) */
255
+ --border: rgba(0, 0, 0, 0.1);
256
+
257
+ /* --- Syntax highlighting (light) --- */
258
+ --syntax-keyword: #d73a49;
259
+ --syntax-string: #22863a;
260
+ --syntax-number: #005cc5;
261
+ --syntax-title: #6f42c1;
262
+ --syntax-attr: #005cc5;
263
+ --syntax-builtin: #e36209;
264
+ --syntax-comment: #6a737d;
265
+
266
+ --color-accent: #0f766e;
267
+ --color-accent-bg: rgba(13, 148, 136, 0.08);
268
+ --color-accent-bg-hover: rgba(13, 148, 136, 0.12);
269
+ --color-accent-bg-strong: rgba(13, 148, 136, 0.18);
270
+
271
+ --color-link: #2563eb;
272
+ --color-link-hover: #1d4ed8;
273
+
274
+ --color-error: #dc2626;
275
+ --color-error-text: #b91c1c;
276
+ --color-error-bg: rgba(220, 38, 38, 0.1);
277
+ --color-info: #0369a1;
278
+ --color-success: #047857;
279
+ --color-success-bg: rgba(16, 185, 129, 0.2);
280
+ --color-warning: #b45309;
281
+ --color-warning-bg: rgba(210, 153, 34, 0.15);
282
+ --color-neutral: #6b7280;
283
+ --color-neutral-bg: rgba(107, 114, 128, 0.2);
284
+ --color-severe: #c2410c;
285
+ --color-severe-bg: rgba(194, 65, 12, 0.1);
286
+
287
+ --color-btn-primary: #0f766e;
288
+ --color-btn-primary-text: #ffffff;
289
+ --color-btn-success-text: #ffffff;
290
+ --color-btn-warning-text: #ffffff;
291
+ --color-btn-disabled-bg: rgba(37, 99, 235, 0.5);
292
+ --color-btn-disabled-text: rgba(255, 255, 255, 0.7);
293
+
294
+ --color-highlight: rgba(250, 204, 21, 0.4);
295
+
296
+ --color-bg-subtle: rgba(0, 0, 0, 0.03);
297
+ --color-bg-muted: rgba(128, 128, 128, 0.08);
298
+ --color-bg-muted-hover: rgba(128, 128, 128, 0.12);
299
+ --color-row-hover: rgba(0, 0, 0, 0.04);
300
+
301
+ /* --- Categorical palette (light — muted set, darkened for contrast on white) --- */
302
+ --color-cat-1: #3f6491; /* blue */
303
+ --color-cat-2: #2f8a80; /* teal */
304
+ --color-cat-3: #a9772f; /* amber */
305
+ --color-cat-4: #b15562; /* rose */
306
+ --color-cat-5: #6c5da0; /* violet */
307
+ --color-cat-6: #b06a3c; /* orange */
308
+ --color-cat-7: #3f7d5e; /* emerald */
309
+ --color-cat-8: #95548c; /* fuchsia */
310
+ --color-cat-9: #2f78a0; /* sky */
311
+ --color-cat-10: #6f8a40; /* lime */
312
+
313
+ /* --- Categorical sub-shades (light — adjusted for white backgrounds) --- */
314
+ --color-cat-1-light: #60a5fa;
315
+ --color-cat-1-mid: #2563eb;
316
+ --color-cat-1-dark: #1d4ed8;
317
+ --color-cat-2-light: #2dd4bf;
318
+ --color-cat-2-mid: #0d9488;
319
+ --color-cat-2-dark: #0f766e;
320
+ --color-cat-3-light: #f59e0b;
321
+ --color-cat-3-mid: #b45309;
322
+ --color-cat-3-dark: #92400e;
323
+ --color-cat-4-light: #f43f5e;
324
+ --color-cat-4-mid: #be123c;
325
+ --color-cat-4-dark: #9f1239;
326
+ --color-cat-5-light: #8b5cf6;
327
+ --color-cat-5-mid: #6d28d9;
328
+ --color-cat-5-dark: #5b21b6;
329
+ --color-cat-6-light: #f97316;
330
+ --color-cat-6-mid: #c2410c;
331
+ --color-cat-6-dark: #9a3412;
332
+ --color-cat-7-light: #10b981;
333
+ --color-cat-7-mid: #047857;
334
+ --color-cat-7-dark: #065f46;
335
+ --color-cat-8-light: #d946ef;
336
+ --color-cat-8-mid: #a21caf;
337
+ --color-cat-8-dark: #86198f;
338
+ --color-cat-9-light: #0ea5e9;
339
+ --color-cat-9-mid: #0369a1;
340
+ --color-cat-9-dark: #075985;
341
+ --color-cat-10-light: #84cc16;
342
+ --color-cat-10-mid: #4d7c0f;
343
+ --color-cat-10-dark: #3f6212;
344
+ }
@@ -0,0 +1,7 @@
1
+ .text-label-upper {
2
+ color: var(--muted);
3
+ font-size: var(--font-size-label);
4
+ font-weight: var(--font-weight-semibold);
5
+ letter-spacing: var(--letter-spacing-wide);
6
+ text-transform: uppercase;
7
+ }
@@ -0,0 +1,39 @@
1
+ import { type Browser, type Page } from "puppeteer";
2
+ export interface PageSnapshot {
3
+ url: string;
4
+ text: string[];
5
+ semantics: string[];
6
+ screenshot: Uint8Array;
7
+ }
8
+ export interface RenderOptions {
9
+ browser?: Browser;
10
+ executablePath?: string;
11
+ selector?: string;
12
+ settleMs?: number;
13
+ viewport?: {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ prepare?: (page: Page) => Promise<void>;
18
+ }
19
+ export interface SetDifference {
20
+ onlyLeft: string[];
21
+ onlyRight: string[];
22
+ }
23
+ export interface SnapshotComparison {
24
+ text: SetDifference;
25
+ semantics: SetDifference;
26
+ screenshot: {
27
+ changedPixels: number;
28
+ ratio: number;
29
+ threshold: number;
30
+ dimensionsMatch: boolean;
31
+ };
32
+ equal: boolean;
33
+ diff?: Uint8Array;
34
+ }
35
+ export declare function renderAndSnapshot(url: string, options?: RenderOptions): Promise<PageSnapshot>;
36
+ export declare function compareSnapshots(left: PageSnapshot, right: PageSnapshot, threshold?: number): SnapshotComparison;
37
+ export declare function saveSnapshot(directory: string, snapshot: PageSnapshot): Promise<void>;
38
+ export declare function loadSnapshot(directory: string): Promise<PageSnapshot>;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAIA,OAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAID,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuDvG;AAWD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,YAAY,EACnB,SAAS,SAAQ,GAChB,kBAAkB,CA0BpB;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ3F;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAI3E"}
@@ -0,0 +1,119 @@
1
+ import { mkdir as e, readFile as t, writeFile as n } from "node:fs/promises";
2
+ import r from "node:path";
3
+ import i from "pixelmatch";
4
+ import { PNG as a } from "pngjs";
5
+ import o from "puppeteer";
6
+ //#region src/testing/index.ts
7
+ var s = (e) => [...new Set(e)].sort();
8
+ async function c(e, t = {}) {
9
+ let n = t.browser == null, r = t.browser ?? await o.launch({
10
+ executablePath: t.executablePath ?? process.env.CHROME_BIN,
11
+ headless: !0
12
+ });
13
+ try {
14
+ let n = await r.newPage();
15
+ await n.setViewport(t.viewport ?? {
16
+ width: 1280,
17
+ height: 900,
18
+ deviceScaleFactor: 1
19
+ }), await n.goto(e, { waitUntil: "networkidle0" }), t.selector && await n.waitForSelector(t.selector), t.prepare && await t.prepare(n), await n.evaluate(async () => {
20
+ await document.fonts?.ready, await new Promise((e) => requestAnimationFrame(() => requestAnimationFrame(() => e())));
21
+ }), t.settleMs && await new Promise((e) => setTimeout(e, t.settleMs));
22
+ let i = await n.evaluate(() => {
23
+ let e = (document.body.innerText ?? "").split("\n").map((e) => e.trim().replace(/\s+/g, " ")).filter(Boolean), t = [
24
+ "header",
25
+ "nav",
26
+ "main",
27
+ "aside",
28
+ "section",
29
+ "article",
30
+ "footer",
31
+ "h1",
32
+ "h2",
33
+ "h3",
34
+ "h4",
35
+ "h5",
36
+ "h6",
37
+ "a",
38
+ "button",
39
+ "input",
40
+ "select",
41
+ "textarea",
42
+ "[role]",
43
+ "[aria-label]",
44
+ "[data-component]",
45
+ "[data-testid]"
46
+ ].join(",");
47
+ return {
48
+ text: e,
49
+ semantics: [...document.querySelectorAll(t)].map((e) => {
50
+ let t = e.getAttribute("aria-label") ?? e.getAttribute("alt") ?? e.innerText?.trim().replace(/\s+/g, " ").slice(0, 120) ?? "";
51
+ return [
52
+ e.tagName.toLowerCase(),
53
+ e.getAttribute("role") ? `role=${e.getAttribute("role")}` : "",
54
+ t ? `name=${t}` : "",
55
+ e.dataset.component ? `component=${e.dataset.component}` : "",
56
+ e.dataset.testid ? `testid=${e.dataset.testid}` : ""
57
+ ].filter(Boolean).join("|");
58
+ })
59
+ };
60
+ }), a = await n.screenshot({
61
+ type: "png",
62
+ fullPage: !0
63
+ });
64
+ return await n.close(), {
65
+ url: e,
66
+ text: s(i.text),
67
+ semantics: s(i.semantics),
68
+ screenshot: Buffer.from(a)
69
+ };
70
+ } finally {
71
+ n && await r.close();
72
+ }
73
+ }
74
+ function l(e, t) {
75
+ let n = new Set(e), r = new Set(t);
76
+ return {
77
+ onlyLeft: [...n].filter((e) => !r.has(e)).sort(),
78
+ onlyRight: [...r].filter((e) => !n.has(e)).sort()
79
+ };
80
+ }
81
+ function u(e, t, n = .001) {
82
+ let r = l(e.text, t.text), o = l(e.semantics, t.semantics), s = a.sync.read(Buffer.from(e.screenshot)), c = a.sync.read(Buffer.from(t.screenshot)), u = s.width === c.width && s.height === c.height, d = Math.max(s.width * s.height, c.width * c.height), f;
83
+ if (u) {
84
+ let e = new a({
85
+ width: s.width,
86
+ height: s.height
87
+ });
88
+ d = i(s.data, c.data, e.data, s.width, s.height, { threshold: .1 }), f = a.sync.write(e);
89
+ }
90
+ let p = Math.max(s.width * s.height, c.width * c.height), m = p === 0 ? 0 : d / p, h = u && m <= n && r.onlyLeft.length === 0 && r.onlyRight.length === 0 && o.onlyLeft.length === 0 && o.onlyRight.length === 0;
91
+ return {
92
+ text: r,
93
+ semantics: o,
94
+ screenshot: {
95
+ changedPixels: d,
96
+ ratio: m,
97
+ threshold: n,
98
+ dimensionsMatch: u
99
+ },
100
+ equal: h,
101
+ diff: f
102
+ };
103
+ }
104
+ async function d(t, i) {
105
+ await e(t, { recursive: !0 }), await n(r.join(t, "screenshot.png"), i.screenshot), await n(r.join(t, "snapshot.json"), `${JSON.stringify({
106
+ url: i.url,
107
+ text: i.text,
108
+ semantics: i.semantics
109
+ }, null, 2)}\n`);
110
+ }
111
+ async function f(e) {
112
+ let n = JSON.parse(await t(r.join(e, "snapshot.json"), "utf8")), i = await t(r.join(e, "screenshot.png"));
113
+ return {
114
+ ...n,
115
+ screenshot: i
116
+ };
117
+ }
118
+ //#endregion
119
+ export { u as compareSnapshots, f as loadSnapshot, c as renderAndSnapshot, d as saveSnapshot };
package/package.json ADDED
@@ -0,0 +1,138 @@
1
+ {
2
+ "name": "@codesweep-ai/ui",
3
+ "version": "0.2.1-dev.20260830023458.856ea8f",
4
+ "description": "Open React components and design tokens for agent and LLM interfaces.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": "^22.13.0 || >=24"
9
+ },
10
+ "private": false,
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/codesweep-ai/ui.git"
14
+ },
15
+ "homepage": "https://github.com/codesweep-ai/ui#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/codesweep-ai/ui/issues"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./styles/*.css": "./dist/styles/*.css",
27
+ "./tokens": "./dist/styles/tokens.css",
28
+ "./mermaid": {
29
+ "types": "./dist/mermaid.d.ts",
30
+ "import": "./dist/mermaid.js"
31
+ },
32
+ "./markdown": {
33
+ "types": "./dist/markdown.d.ts",
34
+ "import": "./dist/markdown.js"
35
+ },
36
+ "./markdown/rich": {
37
+ "types": "./dist/markdown/rich.d.ts",
38
+ "import": "./dist/markdown/rich.js"
39
+ },
40
+ "./code": {
41
+ "types": "./dist/code.d.ts",
42
+ "import": "./dist/code.js"
43
+ },
44
+ "./minimap": {
45
+ "types": "./dist/minimap.d.ts",
46
+ "import": "./dist/minimap.js"
47
+ },
48
+ "./chart": {
49
+ "types": "./dist/chart.d.ts",
50
+ "import": "./dist/chart.js"
51
+ },
52
+ "./testing": {
53
+ "types": "./dist/testing/index.d.ts",
54
+ "import": "./dist/testing/index.js"
55
+ },
56
+ "./package.json": "./package.json"
57
+ },
58
+ "typesVersions": {
59
+ "*": {
60
+ "mermaid": [
61
+ "dist/mermaid.d.ts"
62
+ ],
63
+ "markdown": [
64
+ "dist/markdown.d.ts"
65
+ ],
66
+ "markdown/rich": [
67
+ "dist/markdown/rich.d.ts"
68
+ ],
69
+ "code": [
70
+ "dist/code.d.ts"
71
+ ],
72
+ "minimap": [
73
+ "dist/minimap.d.ts"
74
+ ],
75
+ "chart": [
76
+ "dist/chart.d.ts"
77
+ ],
78
+ "testing": [
79
+ "dist/testing/index.d.ts"
80
+ ]
81
+ }
82
+ },
83
+ "sideEffects": [
84
+ "**/*.css"
85
+ ],
86
+ "publishConfig": {
87
+ "access": "public"
88
+ },
89
+ "files": [
90
+ "dist",
91
+ "LICENSE",
92
+ "NOTICE",
93
+ "README.md"
94
+ ],
95
+ "browserslist": [
96
+ "> 0.5%",
97
+ "last 2 versions",
98
+ "not dead"
99
+ ],
100
+ "peerDependencies": {
101
+ "mermaid": "^11.12.2",
102
+ "pixelmatch": "^7.1.0",
103
+ "pngjs": "^7.0.0",
104
+ "puppeteer": "^25.1.0",
105
+ "react": "^18.3.0 || ^19.0.0",
106
+ "react-dom": "^18.3.0 || ^19.0.0"
107
+ },
108
+ "peerDependenciesMeta": {
109
+ "mermaid": {
110
+ "optional": true
111
+ },
112
+ "pixelmatch": {
113
+ "optional": true
114
+ },
115
+ "pngjs": {
116
+ "optional": true
117
+ },
118
+ "puppeteer": {
119
+ "optional": true
120
+ }
121
+ },
122
+ "dependencies": {
123
+ "@dnd-kit/core": "^6.3.1",
124
+ "@dnd-kit/sortable": "^10.0.0",
125
+ "@dnd-kit/utilities": "^3.2.2",
126
+ "highlight.js": "^11.11.1",
127
+ "katex": "^0.16.28",
128
+ "lucide-react": "^0.563.0",
129
+ "react-markdown": "^10.1.0",
130
+ "rehype-highlight": "^7.0.2",
131
+ "rehype-katex": "^7.0.1",
132
+ "rehype-slug": "^6.0.0",
133
+ "remark-gfm": "^4.0.1",
134
+ "remark-math": "^6.0.0",
135
+ "roughjs": "^4.6.6",
136
+ "unified": "^11.0.0"
137
+ }
138
+ }