@vvedantb/ui 0.17.1 → 0.18.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 (129) hide show
  1. package/README.md +251 -3
  2. package/package.json +13 -5
  3. package/shell/src/SidebarResize.tsx +1 -4
  4. package/src/ai-elements/__snapshots__/queue.test.tsx.snap +11 -0
  5. package/src/ai-elements/activity-question-utils.ts +26 -0
  6. package/src/ai-elements/activity-question.tsx +159 -0
  7. package/src/ai-elements/activity-shared.tsx +459 -0
  8. package/src/ai-elements/activity-step-detail.tsx +115 -0
  9. package/src/ai-elements/activity-step-label.ts +981 -0
  10. package/src/ai-elements/activity-tasks-utils.ts +199 -0
  11. package/src/ai-elements/activity-tasks.tsx +770 -0
  12. package/src/ai-elements/artifact.tsx +162 -52
  13. package/src/ai-elements/attachments.tsx +62 -32
  14. package/src/ai-elements/code-block.tsx +76 -22
  15. package/src/ai-elements/context.tsx +370 -0
  16. package/src/ai-elements/conversation.tsx +186 -62
  17. package/src/ai-elements/file-chip.tsx +53 -0
  18. package/src/ai-elements/message.tsx +161 -50
  19. package/src/ai-elements/model-picker-content.tsx +505 -0
  20. package/src/ai-elements/model-picker-types.ts +56 -0
  21. package/src/ai-elements/model-picker.tsx +301 -0
  22. package/src/ai-elements/model-selector.tsx +102 -21
  23. package/src/ai-elements/plan.tsx +130 -0
  24. package/src/ai-elements/prompt-input-settings.tsx +144 -0
  25. package/src/ai-elements/prompt-input-speech.tsx +189 -0
  26. package/src/ai-elements/prompt-input-traits.tsx +281 -0
  27. package/src/ai-elements/prompt-input.tsx +320 -134
  28. package/src/ai-elements/provider-icon.tsx +133 -0
  29. package/src/ai-elements/queue.tsx +293 -9
  30. package/src/ai-elements/shimmer.tsx +72 -1
  31. package/src/ai-elements/simple-model-ladder.tsx +108 -0
  32. package/src/ai-elements/test-results.tsx +510 -0
  33. package/src/ai-elements/trace.tsx +243 -0
  34. package/src/ai-elements/use-streaming-disclosure.ts +50 -0
  35. package/src/ai-elements/web-preview.tsx +349 -0
  36. package/src/composer/input-area/ComposerSlashMenu.tsx +1 -1
  37. package/src/index.ts +66 -12
  38. package/src/kibo/avatar-stack.tsx +40 -0
  39. package/src/kibo/contribution-graph.tsx +539 -0
  40. package/src/kibo/cursor.tsx +72 -0
  41. package/src/kibo/gantt-features.tsx +439 -0
  42. package/src/kibo/gantt-header.tsx +181 -0
  43. package/src/kibo/gantt-provider.tsx +657 -0
  44. package/src/kibo/gantt-sidebar.tsx +157 -0
  45. package/src/kibo/gantt-timeline.tsx +154 -0
  46. package/src/kibo/index.ts +151 -0
  47. package/src/kibo/kanban.tsx +338 -0
  48. package/src/kibo/kanbanDropTarget.ts +25 -0
  49. package/src/kibo/list.tsx +162 -0
  50. package/src/kibo/theme-switcher.tsx +109 -0
  51. package/src/kibo/video-player.tsx +237 -0
  52. package/src/markdown/Markdown.tsx +112 -0
  53. package/src/markdown/MarkdownBlockquote.tsx +45 -0
  54. package/src/markdown/MarkdownCodeBlock.tsx +197 -0
  55. package/src/markdown/MarkdownInlineCode.tsx +40 -0
  56. package/src/markdown/MarkdownLink.tsx +92 -0
  57. package/src/markdown/codeFence.ts +57 -0
  58. package/src/markdown/codeHighlight.ts +138 -0
  59. package/src/markdown/incrementalBlocks.ts +182 -0
  60. package/src/markdown/index.ts +3 -0
  61. package/src/markdown/markdownClipboard.ts +178 -0
  62. package/src/markdown/mermaid.ts +155 -0
  63. package/src/markdown/rehypeGithubAlerts.ts +80 -0
  64. package/src/motion/presets.ts +24 -0
  65. package/src/ui/__snapshots__/alt-wrappers.test.tsx.snap +19 -0
  66. package/src/ui/__snapshots__/sonner-dom.test.tsx.snap +5 -0
  67. package/src/ui/_menu-parts.tsx +29 -0
  68. package/src/ui/accordion.alt.tsx +46 -53
  69. package/src/ui/accordion.tsx +59 -10
  70. package/src/ui/avatar.tsx +56 -0
  71. package/src/ui/badge.tsx +45 -21
  72. package/src/ui/border-beam.tsx +97 -0
  73. package/src/ui/button-group.tsx +50 -21
  74. package/src/ui/button.tsx +67 -45
  75. package/src/ui/calendar.tsx +48 -5
  76. package/src/ui/card.tsx +77 -8
  77. package/src/ui/carousel.tsx +60 -0
  78. package/src/ui/centered-spinner.tsx +30 -0
  79. package/src/ui/checkbox.tsx +34 -16
  80. package/src/ui/clear-input.alt.tsx +33 -75
  81. package/src/ui/clear-input.tsx +140 -15
  82. package/src/ui/collapsible.tsx +40 -2
  83. package/src/ui/command.tsx +143 -70
  84. package/src/ui/context-menu.tsx +159 -93
  85. package/src/ui/crossfade-icon.tsx +123 -0
  86. package/src/ui/dialog.tsx +154 -70
  87. package/src/ui/dropdown-menu.tsx +177 -117
  88. package/src/ui/hover-card.tsx +59 -17
  89. package/src/ui/input-group.alt.tsx +83 -83
  90. package/src/ui/input-group.tsx +129 -58
  91. package/src/ui/input.tsx +13 -4
  92. package/src/ui/label.tsx +11 -8
  93. package/src/ui/list-row.tsx +232 -0
  94. package/src/ui/loading-state.tsx +215 -0
  95. package/src/ui/popover.tsx +56 -23
  96. package/src/ui/progress.tsx +28 -16
  97. package/src/ui/refresh-spin-icon.tsx +41 -0
  98. package/src/ui/search-input.tsx +66 -15
  99. package/src/ui/select.tsx +171 -100
  100. package/src/ui/separator.tsx +23 -14
  101. package/src/ui/slider.tsx +21 -7
  102. package/src/ui/sonner.tsx +68 -30
  103. package/src/ui/spinner.tsx +229 -11
  104. package/src/ui/status-dot.tsx +84 -0
  105. package/src/ui/surface.tsx +49 -0
  106. package/src/ui/switch.tsx +29 -15
  107. package/src/ui/table.tsx +38 -16
  108. package/src/ui/tabs.tsx +123 -35
  109. package/src/ui/tabsSliding.ts +33 -1
  110. package/src/ui/textarea.tsx +13 -4
  111. package/src/ui/tooltip.tsx +50 -14
  112. package/src/ui/ui-config.tsx +149 -0
  113. package/src/utils/cat-color.ts +123 -0
  114. package/src/utils/dayjs.ts +6 -0
  115. package/src/utils/gesture.ts +59 -0
  116. package/src/utils/runtimeVisibility.ts +167 -0
  117. package/src/utils/sharedClock.ts +96 -0
  118. package/src/utils/surface-radius.ts +16 -0
  119. package/src/utils/useDragSensors.ts +58 -0
  120. package/tokens/examples/tokens-moved/Fixture.tsx +283 -0
  121. package/tokens/examples/tokens-moved/README.md +20 -0
  122. package/tokens/examples/tokens-moved/index.html +12 -0
  123. package/tokens/examples/tokens-moved/main.tsx +6 -0
  124. package/tokens/examples/tokens-moved/package.json +14 -0
  125. package/tokens/examples/tokens-moved/styles.css +12 -0
  126. package/tokens/examples/tokens-moved/tsconfig.json +14 -0
  127. package/tokens/examples/tokens-moved/vite.config.ts +11 -0
  128. package/tokens/src/css/border-beam.css +116 -0
  129. package/tokens/src/css/markdown.css +318 -0
@@ -0,0 +1,318 @@
1
+ /*
2
+ * @vvedantb/ui/tokens/css/markdown.css: typography, code blocks, callouts,
3
+ * links and tables for <Markdown/>. Opt-in: neither tokens.css nor index.css
4
+ * imports it.
5
+ *
6
+ * @import "@vvedantb/ui/tokens/css/markdown.css";
7
+ *
8
+ * Reads the shadcn channel variables as `rgb(var(--name))`: --foreground,
9
+ * --muted-foreground, --border, --primary, --success, --warning,
10
+ * --destructive, and --radius, --font-mono and --motion-fast (150ms when
11
+ * unset). The app (or compat-shadcn-rgb.css) must define them as space
12
+ * separated RGB channels. Code block and table panels fill with
13
+ * `var(--color-surface-secondary)`, which tokens.css and compat-shadcn-rgb.css
14
+ * both define (the compat file maps it to the app's `--muted`).
15
+ *
16
+ * Set on :root, `.markdown` or any ancestor to change (default shown):
17
+ * --markdown-alert-important: var(--primary) (RGB channels)
18
+ *
19
+ * Typography is owned here rather than by `prose`: headings stay compact so a
20
+ * chat reply reads as a reply, not a document. Sizes are in `em` so the scale
21
+ * follows whatever text size the surface sets (`text-sm` in chat, `text-xs`
22
+ * in compact rows). Everything sits in `components`, so a surface's own
23
+ * utilities (`[&_h3]:text-xs`) still win.
24
+ *
25
+ * Code blocks, inline code and callouts are tone surfaces, never hairlines.
26
+ */
27
+
28
+ @layer components {
29
+ .markdown {
30
+ line-height: 1.625;
31
+ overflow-wrap: anywhere;
32
+ }
33
+ .markdown > :first-child {
34
+ margin-top: 0;
35
+ }
36
+ .markdown > :last-child {
37
+ margin-bottom: 0;
38
+ }
39
+
40
+ .markdown :is(p, ul, ol, blockquote, table, .markdown-code, .markdown-alert, .katex-display) {
41
+ margin-block: 0.65rem;
42
+ }
43
+ .markdown [data-streamdown="table-wrapper"],
44
+ .markdown [data-streamdown="mermaid-block"] {
45
+ margin-block: 0.75rem;
46
+ }
47
+
48
+ /* Headings — compact scale, 1em = the surface's body size. */
49
+ .markdown :is(h1, h2, h3, h4, h5, h6) {
50
+ margin: 1.25rem 0 0.5rem;
51
+ font-weight: 600;
52
+ line-height: 1.3;
53
+ color: rgb(var(--foreground));
54
+ letter-spacing: -0.01em;
55
+ }
56
+ .markdown h1 {
57
+ font-size: 1.43em;
58
+ }
59
+ .markdown h2 {
60
+ font-size: 1.29em;
61
+ }
62
+ .markdown h3 {
63
+ font-size: 1.14em;
64
+ }
65
+ .markdown :is(h4, h5, h6) {
66
+ font-size: 1em;
67
+ }
68
+ .markdown h6 {
69
+ color: rgb(var(--muted-foreground));
70
+ }
71
+ .markdown :is(h1, h2, h3, h4, h5, h6) + * {
72
+ margin-top: 0;
73
+ }
74
+
75
+ .markdown strong {
76
+ font-weight: 600;
77
+ }
78
+
79
+ .markdown hr {
80
+ margin-block: 1.25rem;
81
+ border: 0;
82
+ border-top: 1px solid rgb(var(--border));
83
+ }
84
+
85
+ /* Lists */
86
+ .markdown :is(ul, ol) {
87
+ padding-left: 1.25rem;
88
+ }
89
+ .markdown ul {
90
+ list-style: disc;
91
+ }
92
+ .markdown ul ul {
93
+ list-style: circle;
94
+ }
95
+ .markdown ul ul ul {
96
+ list-style: square;
97
+ }
98
+ .markdown ol {
99
+ list-style: decimal;
100
+ }
101
+ .markdown ol ol {
102
+ list-style: lower-alpha;
103
+ }
104
+ .markdown ol ol ol {
105
+ list-style: lower-roman;
106
+ }
107
+ .markdown li::marker {
108
+ color: rgb(var(--muted-foreground));
109
+ font-variant-numeric: tabular-nums;
110
+ }
111
+ .markdown li + li {
112
+ margin-top: 0.25rem;
113
+ }
114
+ .markdown li > :is(ul, ol) {
115
+ margin-block: 0.25rem;
116
+ }
117
+ .markdown li > p {
118
+ margin-block: 0.25rem;
119
+ }
120
+ /* GFM marks the whole list `contains-task-list` if any item is a task, so
121
+ * only task items drop their marker; the checkbox hangs in the gutter. */
122
+ .markdown li.task-list-item {
123
+ list-style: none;
124
+ }
125
+ .markdown .task-list-item > input[type="checkbox"] {
126
+ margin: 0 0.45em 0.15em -1.25rem;
127
+ vertical-align: middle;
128
+ accent-color: rgb(var(--primary));
129
+ }
130
+
131
+ /* Quotes and GitHub alerts */
132
+ .markdown blockquote {
133
+ padding-left: 0.8rem;
134
+ border-left: 2px solid rgb(var(--border));
135
+ color: rgb(var(--muted-foreground));
136
+ }
137
+ .markdown-alert {
138
+ --alert: var(--foreground);
139
+ padding: 0.6rem 0.8rem;
140
+ border-radius: clamp(0.75rem, var(--radius), 1rem);
141
+ background: rgb(var(--alert) / 0.06);
142
+ }
143
+ .markdown-alert[data-alert="tip"] {
144
+ --alert: var(--success);
145
+ }
146
+ .markdown-alert[data-alert="important"] {
147
+ --alert: var(--markdown-alert-important, var(--primary));
148
+ }
149
+ .markdown-alert[data-alert="warning"] {
150
+ --alert: var(--warning);
151
+ }
152
+ .markdown-alert[data-alert="caution"] {
153
+ --alert: var(--destructive);
154
+ }
155
+ .markdown-alert > :nth-child(2) {
156
+ margin-top: 0.25rem;
157
+ }
158
+ .markdown-alert > :last-child {
159
+ margin-bottom: 0;
160
+ }
161
+ .markdown .markdown-alert-title {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 0.4rem;
165
+ margin: 0;
166
+ font-weight: 600;
167
+ color: rgb(var(--alert));
168
+ }
169
+ .markdown-alert-title svg {
170
+ width: 1.1em;
171
+ height: 1.1em;
172
+ flex-shrink: 0;
173
+ }
174
+
175
+ /* Links */
176
+ .markdown-link {
177
+ color: rgb(var(--primary));
178
+ font-weight: 500;
179
+ text-decoration: underline;
180
+ text-decoration-color: rgb(var(--primary) / 0.3);
181
+ text-underline-offset: 0.2em;
182
+ transition: text-decoration-color var(--motion-fast, 150ms) ease-out;
183
+ }
184
+ .markdown-link:hover {
185
+ text-decoration-color: currentColor;
186
+ }
187
+ .markdown-link-icon {
188
+ display: inline-block;
189
+ width: 0.95em;
190
+ height: 0.95em;
191
+ margin-right: 0.3em;
192
+ vertical-align: -0.12em;
193
+ border-radius: 0.2em;
194
+ color: rgb(var(--muted-foreground));
195
+ }
196
+ .markdown-link-icon[data-failed] {
197
+ display: none;
198
+ }
199
+
200
+ /* Inline code */
201
+ .markdown-inline-code {
202
+ padding: 0.1em 0.35em;
203
+ border-radius: 0.375rem;
204
+ /* Foreground-relative, so it still reads inside muted tables and callouts. */
205
+ background: rgb(var(--foreground) / 0.06);
206
+ font-family: var(--font-mono), ui-monospace, monospace;
207
+ font-size: 0.86em;
208
+ overflow-wrap: anywhere;
209
+ }
210
+ .markdown-inline-code[data-file] svg {
211
+ display: inline-block;
212
+ width: 1em;
213
+ height: 1em;
214
+ margin-right: 0.25em;
215
+ vertical-align: -0.15em;
216
+ color: rgb(var(--muted-foreground));
217
+ }
218
+
219
+ /* Code blocks */
220
+ .markdown-code {
221
+ overflow: hidden;
222
+ border-radius: clamp(0.75rem, var(--radius), 1rem);
223
+ background: var(--color-surface-secondary);
224
+ content-visibility: auto;
225
+ contain-intrinsic-size: auto 120px;
226
+ }
227
+ .markdown-code-header {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: space-between;
231
+ gap: 0.5rem;
232
+ padding: 0.25rem 0.3rem 0 0.9rem;
233
+ font-family: var(--font-mono), ui-monospace, monospace;
234
+ font-size: 0.75rem;
235
+ line-height: 1.75rem;
236
+ color: rgb(var(--muted-foreground));
237
+ }
238
+ .markdown-code-label {
239
+ display: flex;
240
+ min-width: 0;
241
+ align-items: center;
242
+ gap: 0.35rem;
243
+ }
244
+ .markdown-code-label svg {
245
+ width: 0.9rem;
246
+ height: 0.9rem;
247
+ flex-shrink: 0;
248
+ }
249
+ .markdown-code-actions {
250
+ display: flex;
251
+ flex-shrink: 0;
252
+ align-items: center;
253
+ gap: 0.125rem;
254
+ }
255
+ .markdown-code pre {
256
+ margin: 0;
257
+ padding: 0.25rem 0.9rem 0.8rem;
258
+ overflow-x: auto;
259
+ background: transparent;
260
+ font-family: var(--font-mono), ui-monospace, monospace;
261
+ font-size: 0.8125rem;
262
+ line-height: 1.55;
263
+ white-space: pre;
264
+ overflow-wrap: normal;
265
+ tab-size: 2;
266
+ scrollbar-width: thin;
267
+ }
268
+ .markdown-code[data-wrap] pre {
269
+ white-space: pre-wrap;
270
+ overflow-wrap: anywhere;
271
+ }
272
+ .markdown-code-line span[style] {
273
+ color: var(--md-c, inherit);
274
+ }
275
+ .dark .markdown-code-line span[style] {
276
+ color: var(--shiki-dark, var(--md-c, inherit));
277
+ }
278
+
279
+ /* Tables — cells size to their words, never split them mid-word. */
280
+ .markdown table {
281
+ font-size: 0.93em;
282
+ overflow-wrap: normal;
283
+ line-height: 1.5;
284
+ }
285
+ .markdown :is(th, td) {
286
+ padding: 0.45rem 0.75rem;
287
+ text-align: left;
288
+ vertical-align: top;
289
+ }
290
+ .markdown th {
291
+ font-weight: 600;
292
+ white-space: nowrap;
293
+ }
294
+ .markdown tbody tr + tr {
295
+ border-top: 1px solid rgb(var(--border) / 0.7);
296
+ }
297
+
298
+ .markdown .katex-display {
299
+ overflow-x: auto;
300
+ overflow-y: hidden;
301
+ }
302
+ }
303
+
304
+ /* Unlayered: Streamdown's table wrapper carries border / background / radius
305
+ * utilities, which outrank anything in `components`. Restyled to match code
306
+ * blocks — one surface-secondary tone, controls in its header row, no hairlines. */
307
+ .markdown [data-streamdown="table-wrapper"] {
308
+ gap: 0;
309
+ padding: 0.25rem 0.3rem 0.4rem;
310
+ border: 0;
311
+ border-radius: clamp(0.75rem, var(--radius), 1rem);
312
+ background: var(--color-surface-secondary);
313
+ }
314
+ .markdown [data-streamdown="table-wrapper"] > div:has([data-streamdown="table"]) {
315
+ border: 0;
316
+ border-radius: 0;
317
+ background: transparent;
318
+ }