@heyramzi/ui 6.1.0 → 8.0.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 (332) hide show
  1. package/COMPONENTS.md +32 -40
  2. package/README.md +10 -4
  3. package/package.json +31 -29
  4. package/scripts/sync-shadcn.mjs +29 -16
  5. package/scripts/sync-transitions.mjs +11 -11
  6. package/src/ai/ai-button/AiButton.svelte +86 -0
  7. package/src/ai/ai-button/index.ts +4 -0
  8. package/src/ai/confirmation/Confirmation.svelte +8 -8
  9. package/src/ai/confirmation/confirmation-context.svelte.ts +2 -2
  10. package/src/ai/generation-progress/GenerationProgress.svelte +354 -0
  11. package/src/ai/generation-progress/index.ts +7 -0
  12. package/src/ai/index.ts +16 -24
  13. package/src/ai/prompt-input/PromptInput.svelte +19 -1
  14. package/src/ai/prompt-input/PromptInputSubmit.svelte +9 -3
  15. package/src/ai/reasoning/Reasoning.svelte +11 -8
  16. package/src/ambient.d.ts +4 -0
  17. package/src/animations/README.md +17 -17
  18. package/src/animations/index.css +3 -14
  19. package/src/animations/upstream-coverage.test.ts +1 -1
  20. package/src/components/copy/clipboard.test.ts +206 -0
  21. package/src/components/copy/clipboard.ts +49 -0
  22. package/src/components/copy/copied.svelte.ts +39 -0
  23. package/src/components/copy/copy-button.svelte +175 -0
  24. package/src/components/copy/copy-button.test.ts +110 -0
  25. package/src/components/copy/index.ts +3 -0
  26. package/src/components/data-table/data-table.test.ts +134 -0
  27. package/src/components/data-table/data-table.ts +77 -0
  28. package/src/components/data-table/index.ts +20 -0
  29. package/src/components/data-table/infinite-scroll.svelte +69 -0
  30. package/src/components/data-table/pagination.svelte +62 -0
  31. package/src/components/data-table/row-arrow.svelte +28 -0
  32. package/src/components/data-table/row-context-menu.svelte +106 -0
  33. package/src/components/data-table/row-context-menu.test.ts +18 -0
  34. package/src/components/data-table/sortable-head.svelte +56 -0
  35. package/src/components/data-table/table-skeleton.svelte +83 -0
  36. package/src/components/hold-to-confirm/hold-to-confirm.svelte +232 -0
  37. package/src/components/hold-to-confirm/index.ts +1 -0
  38. package/src/components/icon/icon.svelte +23 -0
  39. package/src/components/icon/index.ts +1 -0
  40. package/src/components/language-flag/index.ts +1 -0
  41. package/src/components/language-flag/language-flag.svelte +60 -0
  42. package/src/components/list-page/detail-empty.svelte +50 -0
  43. package/src/components/list-page/detail-header.svelte +107 -0
  44. package/src/components/list-page/detail-panel.svelte +90 -0
  45. package/src/components/list-page/detail-row.svelte +36 -0
  46. package/src/components/list-page/detail-stack.svelte +33 -0
  47. package/src/components/list-page/empty-state.svelte +91 -0
  48. package/src/components/list-page/filter-item.svelte +49 -0
  49. package/src/components/list-page/filter-popover.svelte +88 -0
  50. package/src/components/list-page/filter-section.ts +12 -0
  51. package/src/components/list-page/grouped-list.svelte +116 -0
  52. package/src/components/list-page/index.ts +28 -0
  53. package/src/components/list-page/list-page-shell.svelte +195 -0
  54. package/src/components/list-page/list-table.ts +19 -0
  55. package/src/components/list-page/master-detail.svelte +206 -0
  56. package/src/components/list-page/master-detail.test.ts +37 -0
  57. package/src/components/list-page/notice-bar.svelte +68 -0
  58. package/src/components/list-page/prev-next.svelte +104 -0
  59. package/src/components/list-page/queue-rail.ts +25 -0
  60. package/src/components/list-page/rail-body.svelte +29 -0
  61. package/src/components/list-page/rail-empty.svelte +51 -0
  62. package/src/components/list-page/rail-head.svelte +49 -0
  63. package/src/components/list-page/rail-row.svelte +163 -0
  64. package/src/components/list-page/section-host.ts +24 -0
  65. package/src/components/list-page/section-label.svelte +39 -0
  66. package/src/components/list-page/step.test.ts +21 -0
  67. package/src/components/list-page/step.ts +10 -0
  68. package/src/components/list-page/toolbar-search.svelte +63 -0
  69. package/src/components/list-page/toolbar-trigger.ts +23 -0
  70. package/src/components/list-page/types.ts +1 -0
  71. package/src/components/locale-switch/index.ts +1 -0
  72. package/src/components/locale-switch/locale-switch.svelte +59 -0
  73. package/src/components/mark/index.ts +1 -0
  74. package/src/components/mark/mark.svelte +70 -0
  75. package/src/components/open-in/index.ts +6 -0
  76. package/src/components/open-in/open-in.svelte +106 -0
  77. package/src/components/picker/index.ts +4 -0
  78. package/src/components/picker/mark-picker.svelte +84 -0
  79. package/src/components/picker/picker.svelte +143 -0
  80. package/src/components/picker/trigger.ts +42 -0
  81. package/src/components/picker/types.ts +26 -0
  82. package/src/components/segmented/animated-tabs.svelte +175 -0
  83. package/src/components/segmented/collapse.test.ts +49 -0
  84. package/src/components/segmented/collapse.ts +39 -0
  85. package/src/components/segmented/index.ts +41 -0
  86. package/src/components/segmented/section-runs.svelte +79 -0
  87. package/src/components/segmented/segment.svelte +106 -0
  88. package/src/components/segmented/segmented-filter.svelte +125 -0
  89. package/src/components/segmented/segmented-nav.svelte +82 -0
  90. package/src/components/segmented/segmented-overflow.svelte +85 -0
  91. package/src/components/segmented/segmented-track.svelte +181 -0
  92. package/src/components/segmented/segmented.test.ts +20 -0
  93. package/src/components/segmented/segmented.ts +80 -0
  94. package/src/components/star-rating-input/index.ts +9 -0
  95. package/src/components/star-rating-input/star-rating-input.svelte +256 -0
  96. package/src/components/svg/index.ts +1 -0
  97. package/src/components/svg/svg.svelte +9 -0
  98. package/src/effects/border-beam/BorderBeam.svelte +1 -1
  99. package/src/effects/image-comparison/ImageComparison.css +42 -8
  100. package/src/effects/image-comparison/ImageComparison.svelte +138 -21
  101. package/src/effects/image-comparison/compare.test.ts +17 -0
  102. package/src/effects/image-comparison/compare.ts +5 -0
  103. package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +338 -0
  104. package/src/effects/magic-card/MagicCard.css +47 -0
  105. package/src/effects/magic-card/MagicCard.svelte +57 -0
  106. package/src/effects/marquee/Marquee.css +27 -1
  107. package/src/effects/marquee/Marquee.svelte +67 -3
  108. package/src/effects/reveal/index.ts +2 -1
  109. package/src/effects/reveal/observe.test.ts +60 -0
  110. package/src/effects/reveal/observe.ts +33 -1
  111. package/src/effects/reveal/types.ts +7 -0
  112. package/src/effects/theme-toggle/ThemeToggle.css +199 -6
  113. package/src/effects/theme-toggle/ThemeToggle.svelte +51 -26
  114. package/src/gallery.test.ts +52 -0
  115. package/src/index.ts +5 -1
  116. package/src/lib/panel.ts +7 -1
  117. package/src/lib/sliding-pill.ts +68 -0
  118. package/src/lib/theme-transition.ts +41 -13
  119. package/src/lib/tone.ts +48 -0
  120. package/src/shadcn/accordion/accordion-trigger.svelte +15 -6
  121. package/src/shadcn/alert/alert.svelte +3 -1
  122. package/src/shadcn/badge/badge.svelte +8 -7
  123. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +2 -2
  124. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +2 -2
  125. package/src/shadcn/calendar/calendar-month-select.svelte +2 -2
  126. package/src/shadcn/calendar/calendar-next-button.svelte +2 -2
  127. package/src/shadcn/calendar/calendar-prev-button.svelte +2 -2
  128. package/src/shadcn/calendar/calendar-year-select.svelte +2 -2
  129. package/src/shadcn/calendar/calendar.svelte +6 -0
  130. package/src/shadcn/code-block/code-block-actions.svelte +23 -0
  131. package/src/shadcn/code-block/code-block-content.svelte +55 -0
  132. package/src/shadcn/code-block/code-block-copy-button.svelte +10 -0
  133. package/src/shadcn/code-block/code-block-footer.svelte +20 -0
  134. package/src/shadcn/code-block/code-block-header.svelte +23 -0
  135. package/src/shadcn/code-block/code-block-line.svelte +71 -0
  136. package/src/shadcn/code-block/code-block-title.svelte +23 -0
  137. package/src/shadcn/code-block/code-block.svelte +47 -0
  138. package/src/shadcn/code-block/index.ts +42 -0
  139. package/src/shadcn/command/index.ts +3 -0
  140. package/src/shadcn/field/index.ts +3 -0
  141. package/src/shadcn/field/simple-field.svelte +71 -0
  142. package/src/shadcn/field/simple-field.test.ts +47 -0
  143. package/src/shadcn/hooks/highlighter.ts +132 -0
  144. package/src/shadcn/hooks/use-highlighted-code.svelte.ts +98 -0
  145. package/src/shadcn/kbd/index.ts +10 -0
  146. package/src/shadcn/kbd/kbd-group.svelte +20 -0
  147. package/src/shadcn/kbd/kbd.svelte +23 -0
  148. package/src/shadcn/message-scroller/index.ts +28 -0
  149. package/src/shadcn/message-scroller/message-scroller-button.svelte +52 -0
  150. package/src/shadcn/message-scroller/message-scroller-content.svelte +17 -0
  151. package/src/shadcn/message-scroller/message-scroller-item.svelte +22 -0
  152. package/src/shadcn/message-scroller/message-scroller-provider.svelte +7 -0
  153. package/src/shadcn/message-scroller/message-scroller-viewport.svelte +20 -0
  154. package/src/shadcn/message-scroller/message-scroller.svelte +20 -0
  155. package/src/shadcn/radio-group/radio-group-item.svelte +3 -2
  156. package/src/shadcn/sheet/sheet-content.svelte +1 -0
  157. package/src/shadcn/sheet/sheet.css +48 -0
  158. package/src/shadcn/sonner/sonner.svelte +7 -10
  159. package/src/shadcn/tabs/tabs-list.svelte +13 -2
  160. package/src/shadcn/tabs/tabs-trigger.svelte +1 -1
  161. package/src/shadcn/toggle-group/toggle-group.svelte +10 -3
  162. package/src/shadcn/trace/index.ts +29 -0
  163. package/src/shadcn/trace/trace-collapsible-content.svelte +29 -0
  164. package/src/shadcn/trace/trace-collapsible-trigger.svelte +29 -0
  165. package/src/shadcn/trace/trace-collapsible.svelte +20 -0
  166. package/src/shadcn/trace/trace-description.svelte +20 -0
  167. package/src/shadcn/trace/trace-icon.svelte +24 -0
  168. package/src/shadcn/trace/trace-line.svelte +31 -0
  169. package/src/shadcn/trace/trace-title.svelte +20 -0
  170. package/src/shadcn/trace/trace.svelte +23 -0
  171. package/src/ai/composer/Composer.css +0 -108
  172. package/src/ai/composer/Composer.svelte +0 -111
  173. package/src/ai/composer/index.ts +0 -10
  174. package/src/ai/conversation/Conversation.svelte +0 -28
  175. package/src/ai/conversation/ConversationContent.svelte +0 -35
  176. package/src/ai/conversation/ConversationEmptyState.svelte +0 -46
  177. package/src/ai/conversation/ConversationScrollButton.svelte +0 -51
  178. package/src/ai/conversation/index.ts +0 -33
  179. package/src/ai/conversation/stick-to-bottom-context.svelte.ts +0 -131
  180. package/src/animations/accordion.css +0 -58
  181. package/src/animations/icon-swap.css +0 -43
  182. package/src/animations/notification-badge.css +0 -81
  183. package/src/animations/panel.css +0 -86
  184. package/src/animations/reasoning-stream.css +0 -49
  185. package/src/animations/skeleton-reveal.css +0 -97
  186. package/src/animations/streaming-text.css +0 -31
  187. package/src/animations/tabs-sliding.css +0 -83
  188. package/src/animations/texts-reveal.css +0 -70
  189. package/src/animations/tooltip.css +0 -72
  190. package/src/animations/view-transition-reveal.ts +0 -74
  191. package/src/charts/animated-value.css +0 -7
  192. package/src/charts/animated-value.svelte +0 -110
  193. package/src/charts/area-chart.css +0 -29
  194. package/src/charts/area-chart.svelte +0 -195
  195. package/src/charts/bar-chart.css +0 -119
  196. package/src/charts/bar-chart.svelte +0 -269
  197. package/src/charts/charts.css +0 -201
  198. package/src/charts/crosshair.svelte +0 -35
  199. package/src/charts/donut-chart.css +0 -56
  200. package/src/charts/donut-chart.svelte +0 -158
  201. package/src/charts/edge-fade.svelte +0 -43
  202. package/src/charts/edge-fade.ts +0 -16
  203. package/src/charts/figure.css +0 -100
  204. package/src/charts/figure.svelte +0 -122
  205. package/src/charts/gauge-chart.css +0 -94
  206. package/src/charts/gauge-chart.svelte +0 -303
  207. package/src/charts/hover-band.test.ts +0 -30
  208. package/src/charts/hover-band.ts +0 -21
  209. package/src/charts/hover-focus.svelte +0 -85
  210. package/src/charts/index.ts +0 -30
  211. package/src/charts/legend.css +0 -131
  212. package/src/charts/legend.svelte +0 -112
  213. package/src/charts/line-chart.css +0 -26
  214. package/src/charts/line-chart.svelte +0 -256
  215. package/src/charts/motion.ts +0 -19
  216. package/src/charts/number-chart.css +0 -168
  217. package/src/charts/number-chart.svelte +0 -177
  218. package/src/charts/primitives/chart-container.svelte +0 -57
  219. package/src/charts/primitives/chart-style.svelte +0 -36
  220. package/src/charts/primitives/chart-tooltip.svelte +0 -161
  221. package/src/charts/primitives/chart-utils.ts +0 -54
  222. package/src/charts/primitives/index.ts +0 -11
  223. package/src/charts/reveal.svelte +0 -61
  224. package/src/charts/ring-chart.css +0 -96
  225. package/src/charts/ring-chart.svelte +0 -158
  226. package/src/charts/sparkline.css +0 -45
  227. package/src/charts/sparkline.svelte +0 -140
  228. package/src/charts/stat-card.css +0 -103
  229. package/src/charts/stat-card.svelte +0 -267
  230. package/src/charts/time-series-chart.css +0 -28
  231. package/src/charts/time-series-chart.svelte +0 -179
  232. package/src/charts/trend-pill.css +0 -38
  233. package/src/charts/trend-pill.svelte +0 -48
  234. package/src/lib/hooks/is-mobile.svelte.ts +0 -11
  235. package/src/lib/utils.ts +0 -45
  236. package/src/showcase/AiSection.svelte +0 -157
  237. package/src/showcase/AnimationsSection.svelte +0 -1658
  238. package/src/showcase/ChartsSection.svelte +0 -458
  239. package/src/showcase/EffectsSection.svelte +0 -152
  240. package/src/showcase/ShadcnSection.svelte +0 -27
  241. package/src/showcase/ShowcaseImport.svelte +0 -126
  242. package/src/showcase/ShowcaseList.svelte +0 -132
  243. package/src/showcase/ShowcaseNav.svelte +0 -247
  244. package/src/showcase/ShowcaseSection.svelte +0 -112
  245. package/src/showcase/ShowcaseShell.svelte +0 -55
  246. package/src/showcase/ShowcaseStage.svelte +0 -342
  247. package/src/showcase/ShowcaseVariant.svelte +0 -109
  248. package/src/showcase/assets/image-reveal/art-1.jpg +0 -0
  249. package/src/showcase/assets/image-reveal/art-2.jpg +0 -0
  250. package/src/showcase/assets/image-reveal/art-3.jpg +0 -0
  251. package/src/showcase/check.svg +0 -1
  252. package/src/showcase/chevron-arms.svg +0 -2
  253. package/src/showcase/chevron-down.svg +0 -1
  254. package/src/showcase/copy.svg +0 -2
  255. package/src/showcase/demos/ai/confirmation.svelte +0 -59
  256. package/src/showcase/demos/ai/conversation.svelte +0 -59
  257. package/src/showcase/demos/ai/loading-state.svelte +0 -19
  258. package/src/showcase/demos/ai/prompt-input.svelte +0 -57
  259. package/src/showcase/demos/ai/reasoning.svelte +0 -19
  260. package/src/showcase/demos/ai/thinking-dots.svelte +0 -15
  261. package/src/showcase/demos/ai/voice-waveform.svelte +0 -24
  262. package/src/showcase/demos/effects/animated-beam.svelte +0 -50
  263. package/src/showcase/demos/effects/animated-group.svelte +0 -47
  264. package/src/showcase/demos/effects/border-beam-default.svelte +0 -20
  265. package/src/showcase/demos/effects/border-beam-line.svelte +0 -20
  266. package/src/showcase/demos/effects/border-beam-mono.svelte +0 -20
  267. package/src/showcase/demos/effects/border-beam-sunset.svelte +0 -20
  268. package/src/showcase/demos/effects/image-comparison.svelte +0 -25
  269. package/src/showcase/demos/effects/image-reveal.svelte +0 -49
  270. package/src/showcase/demos/effects/in-view.svelte +0 -41
  271. package/src/showcase/demos/effects/integrations-hub.svelte +0 -82
  272. package/src/showcase/demos/effects/magnetic.svelte +0 -31
  273. package/src/showcase/demos/effects/marquee.svelte +0 -33
  274. package/src/showcase/demos/effects/progressive-blur.svelte +0 -47
  275. package/src/showcase/demos/effects/spotlight.svelte +0 -40
  276. package/src/showcase/demos/effects/text-effect.svelte +0 -55
  277. package/src/showcase/demos/shadcn/accordion.svelte +0 -45
  278. package/src/showcase/demos/shadcn/alert-dialog.svelte +0 -23
  279. package/src/showcase/demos/shadcn/alert.svelte +0 -30
  280. package/src/showcase/demos/shadcn/attachment.svelte +0 -71
  281. package/src/showcase/demos/shadcn/avatar.svelte +0 -30
  282. package/src/showcase/demos/shadcn/badge.svelte +0 -26
  283. package/src/showcase/demos/shadcn/breadcrumb.svelte +0 -34
  284. package/src/showcase/demos/shadcn/bubble.svelte +0 -36
  285. package/src/showcase/demos/shadcn/button.svelte +0 -11
  286. package/src/showcase/demos/shadcn/calendar.svelte +0 -8
  287. package/src/showcase/demos/shadcn/card.svelte +0 -39
  288. package/src/showcase/demos/shadcn/checkbox.svelte +0 -39
  289. package/src/showcase/demos/shadcn/collapsible.svelte +0 -20
  290. package/src/showcase/demos/shadcn/command.svelte +0 -48
  291. package/src/showcase/demos/shadcn/context-menu.svelte +0 -54
  292. package/src/showcase/demos/shadcn/demo-harness.svelte +0 -12
  293. package/src/showcase/demos/shadcn/demos.test.ts +0 -20
  294. package/src/showcase/demos/shadcn/dialog.svelte +0 -38
  295. package/src/showcase/demos/shadcn/dropdown-menu.svelte +0 -59
  296. package/src/showcase/demos/shadcn/empty.svelte +0 -29
  297. package/src/showcase/demos/shadcn/field.svelte +0 -115
  298. package/src/showcase/demos/shadcn/hover-card.svelte +0 -32
  299. package/src/showcase/demos/shadcn/index.ts +0 -358
  300. package/src/showcase/demos/shadcn/input-otp.svelte +0 -19
  301. package/src/showcase/demos/shadcn/input.svelte +0 -5
  302. package/src/showcase/demos/shadcn/label.svelte +0 -11
  303. package/src/showcase/demos/shadcn/marker.svelte +0 -30
  304. package/src/showcase/demos/shadcn/message.svelte +0 -75
  305. package/src/showcase/demos/shadcn/popover.svelte +0 -36
  306. package/src/showcase/demos/shadcn/progress.svelte +0 -13
  307. package/src/showcase/demos/shadcn/radio-group.svelte +0 -19
  308. package/src/showcase/demos/shadcn/scroll-area.svelte +0 -18
  309. package/src/showcase/demos/shadcn/select.svelte +0 -29
  310. package/src/showcase/demos/shadcn/separator.svelte +0 -12
  311. package/src/showcase/demos/shadcn/sheet.svelte +0 -48
  312. package/src/showcase/demos/shadcn/skeleton.svelte +0 -11
  313. package/src/showcase/demos/shadcn/slider.svelte +0 -7
  314. package/src/showcase/demos/shadcn/sonner.svelte +0 -18
  315. package/src/showcase/demos/shadcn/spinner.svelte +0 -11
  316. package/src/showcase/demos/shadcn/switch.svelte +0 -9
  317. package/src/showcase/demos/shadcn/table.svelte +0 -76
  318. package/src/showcase/demos/shadcn/tabs.svelte +0 -62
  319. package/src/showcase/demos/shadcn/textarea.svelte +0 -5
  320. package/src/showcase/demos/shadcn/toggle-group.svelte +0 -18
  321. package/src/showcase/demos/shadcn/toggle.svelte +0 -14
  322. package/src/showcase/demos/shadcn/tooltip.svelte +0 -13
  323. package/src/showcase/heart.svg +0 -1
  324. package/src/showcase/index.ts +0 -38
  325. package/src/showcase/kit.test.ts +0 -72
  326. package/src/showcase/kit.ts +0 -17
  327. package/src/showcase/plus.svg +0 -1
  328. package/src/showcase/showcase-shell.css +0 -91
  329. package/src/showcase/stacked-section.css +0 -15
  330. package/src/showcase/success-check.svg +0 -1
  331. package/src/showcase/types.ts +0 -29
  332. package/src/svg-raw.d.ts +0 -7
@@ -32,10 +32,17 @@
32
32
  ...restProps
33
33
  }: ToggleGroupPrimitive.RootProps & ToggleVariants & { spacing?: number } = $props();
34
34
 
35
+ // WHY: getters, so an item reads the group's current props, not the ones it mounted with.
35
36
  setToggleGroupCtx({
36
- variant,
37
- size,
38
- spacing,
37
+ get variant() {
38
+ return variant;
39
+ },
40
+ get size() {
41
+ return size;
42
+ },
43
+ get spacing() {
44
+ return spacing;
45
+ },
39
46
  });
40
47
  </script>
41
48
 
@@ -0,0 +1,29 @@
1
+ import CollapsibleContent from "./trace-collapsible-content.svelte";
2
+ import CollapsibleTrigger from "./trace-collapsible-trigger.svelte";
3
+ import Collapsible from "./trace-collapsible.svelte";
4
+ import Description from "./trace-description.svelte";
5
+ import Icon from "./trace-icon.svelte";
6
+ import Title from "./trace-title.svelte";
7
+ import Root from "./trace.svelte";
8
+ import Line, { type TraceLineStatus } from "./trace-line.svelte";
9
+
10
+ export {
11
+ Root,
12
+ Line,
13
+ Icon,
14
+ Title,
15
+ Description,
16
+ Collapsible,
17
+ CollapsibleTrigger,
18
+ CollapsibleContent,
19
+ type TraceLineStatus,
20
+ //
21
+ Root as Trace,
22
+ Line as TraceLine,
23
+ Icon as TraceIcon,
24
+ Title as TraceTitle,
25
+ Description as TraceDescription,
26
+ Collapsible as TraceCollapsible,
27
+ CollapsibleTrigger as TraceCollapsibleTrigger,
28
+ CollapsibleContent as TraceCollapsibleContent,
29
+ };
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import * as Collapsible from "../collapsible/index.js";
3
+ import { cn, type WithoutChild } from "@heyramzi/utils";
4
+ import type { Collapsible as CollapsiblePrimitive } from "bits-ui";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ children,
10
+ ...restProps
11
+ }: WithoutChild<CollapsiblePrimitive.ContentProps> = $props();
12
+ </script>
13
+
14
+ <Collapsible.Content
15
+ bind:ref
16
+ data-slot="trace-collapsible-content"
17
+ class="duration-200 min-w-0 overflow-hidden [--bits-accordion-content-height:var(--bits-collapsible-content-height)] data-open:animate-accordion-down data-closed:animate-accordion-up"
18
+ {...restProps}
19
+ >
20
+ <div
21
+ data-slot="trace-collapsible-content-inner"
22
+ class={cn(
23
+ "mt-2 mb-1 ml-[calc(--spacing(2)_-_1px)] border-l pr-1 pl-4 leading-relaxed min-w-0 wrap-break-word text-muted-foreground",
24
+ className
25
+ )}
26
+ >
27
+ {@render children?.()}
28
+ </div>
29
+ </Collapsible.Content>
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import * as Collapsible from "../collapsible/index.js";
3
+ import { CaretRight } from "phosphor-svelte";
4
+ import { cn, type WithoutChild } from "@heyramzi/utils";
5
+ import TraceIcon from "./trace-icon.svelte";
6
+ import type { Collapsible as CollapsiblePrimitive } from "bits-ui";
7
+
8
+ let {
9
+ ref = $bindable(null),
10
+ class: className,
11
+ children,
12
+ ...restProps
13
+ }: WithoutChild<CollapsiblePrimitive.TriggerProps> = $props();
14
+ </script>
15
+
16
+ <Collapsible.Trigger
17
+ bind:ref
18
+ data-slot="trace-collapsible-trigger"
19
+ class={cn(
20
+ "gap-1 rounded-md focus-visible:ring-3 focus-visible:ring-ring/50 group/trace-collapsible-trigger flex w-fit max-w-full min-w-0 cursor-pointer items-center text-left text-muted-foreground transition-colors outline-none hover:text-foreground has-[[data-status=error]]:text-destructive",
21
+ className
22
+ )}
23
+ {...restProps}
24
+ >
25
+ {@render children?.()}
26
+ <TraceIcon class="transition-transform group-aria-expanded/trace-collapsible-trigger:rotate-90">
27
+ <CaretRight />
28
+ </TraceIcon>
29
+ </Collapsible.Trigger>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import * as Collapsible from "../collapsible/index.js";
3
+ import { cn } from "@heyramzi/utils";
4
+ import type { Collapsible as CollapsiblePrimitive } from "bits-ui";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ open = $bindable(false),
9
+ class: className,
10
+ ...restProps
11
+ }: CollapsiblePrimitive.RootProps = $props();
12
+ </script>
13
+
14
+ <Collapsible.Root
15
+ bind:ref
16
+ bind:open
17
+ data-slot="trace-collapsible"
18
+ class={cn("flex w-full min-w-0 flex-col", className)}
19
+ {...restProps}
20
+ />
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from "@heyramzi/utils";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();
11
+ </script>
12
+
13
+ <span
14
+ bind:this={ref}
15
+ data-slot="trace-description"
16
+ class={cn("shrink-0 text-muted-foreground/70 tabular-nums", className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </span>
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from "@heyramzi/utils";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();
11
+ </script>
12
+
13
+ <span
14
+ bind:this={ref}
15
+ data-slot="trace-icon"
16
+ aria-hidden="true"
17
+ class={cn(
18
+ "size-4 [&_svg:not([class*='size-'])]:size-4 [[data-slot=trace-title]~&]:-ml-1 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none",
19
+ className
20
+ )}
21
+ {...restProps}
22
+ >
23
+ {@render children?.()}
24
+ </span>
@@ -0,0 +1,31 @@
1
+ <script lang="ts" module>
2
+ export type TraceLineStatus = "running" | "error" | "pending";
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import { cn, type WithElementRef } from "@heyramzi/utils";
7
+ import type { HTMLAttributes } from "svelte/elements";
8
+
9
+ let {
10
+ ref = $bindable(null),
11
+ class: className,
12
+ status,
13
+ children,
14
+ ...restProps
15
+ }: WithElementRef<HTMLAttributes<HTMLSpanElement>> & {
16
+ status?: TraceLineStatus;
17
+ } = $props();
18
+ </script>
19
+
20
+ <span
21
+ bind:this={ref}
22
+ data-slot="trace-line"
23
+ data-status={status}
24
+ class={cn(
25
+ "gap-2 text-sm flex w-fit max-w-full min-w-0 items-center text-muted-foreground transition-colors in-[a,button]:cursor-pointer in-[a:hover,button:hover]:text-foreground data-[status=error]:text-destructive data-[status=error]:in-[a:hover,button:hover]:text-destructive data-[status=pending]:opacity-60 data-[status=running]:*:data-[slot=trace-title]:shimmer",
26
+ className
27
+ )}
28
+ {...restProps}
29
+ >
30
+ {@render children?.()}
31
+ </span>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from "@heyramzi/utils";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();
11
+ </script>
12
+
13
+ <span
14
+ bind:this={ref}
15
+ data-slot="trace-title"
16
+ class={cn("min-w-0 truncate motion-reduce:shimmer-none", className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </span>
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from "@heyramzi/utils";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="trace"
16
+ class={cn(
17
+ "gap-2 *:has-[>[data-slot=trace-line]]:rounded-md *:has-[>[data-slot=trace-line]]:focus-visible:ring-3 *:has-[>[data-slot=trace-line]]:focus-visible:ring-ring/50 flex w-full min-w-0 flex-col *:has-[>[data-slot=trace-line]]:flex *:has-[>[data-slot=trace-line]]:w-fit *:has-[>[data-slot=trace-line]]:max-w-full *:has-[>[data-slot=trace-line]]:min-w-0 *:has-[>[data-slot=trace-line]]:text-left *:has-[>[data-slot=trace-line]]:outline-none",
18
+ className
19
+ )}
20
+ {...restProps}
21
+ >
22
+ {@render children?.()}
23
+ </div>
@@ -1,108 +0,0 @@
1
- .chat-composer {
2
- border-top: 1px solid color-mix(in srgb, var(--border, rgba(0, 0, 0, 0.1)) 40%, transparent);
3
- padding: 0.625rem 0.75rem;
4
- }
5
-
6
- .chat-composer-row {
7
- display: flex;
8
- align-items: flex-end;
9
- gap: 0.375rem;
10
- }
11
-
12
- .chat-composer-input {
13
- /* WHY: grows with content; min/max bounds can be widened via `inputClass`. */
14
- field-sizing: content;
15
- max-height: 6rem;
16
- flex: 1;
17
- resize: none;
18
- border: 0;
19
- border-radius: 1rem;
20
- background: color-mix(in srgb, var(--muted, rgba(0, 0, 0, 0.06)) 40%, transparent);
21
- padding: 0.5rem 0.875rem;
22
- font-size: 0.875rem;
23
- color: inherit;
24
- transition: background-color 120ms ease;
25
- }
26
-
27
- .chat-composer-input::placeholder {
28
- color: var(--muted-foreground, rgba(0, 0, 0, 0.45));
29
- }
30
-
31
- .chat-composer-input:focus {
32
- outline: none;
33
- background: color-mix(in srgb, var(--muted, rgba(0, 0, 0, 0.06)) 60%, transparent);
34
- /* WHY: a soft ring in the conversation's accent, which is per-surface. */
35
- box-shadow: 0 0 0 2px
36
- color-mix(in srgb, var(--chat-accent, var(--primary, #6647f0)) 28%, transparent);
37
- }
38
-
39
- .chat-composer-input:disabled {
40
- opacity: 0.4;
41
- }
42
-
43
- .chat-composer-send {
44
- display: flex;
45
- height: 2.25rem;
46
- width: 2.25rem;
47
- flex-shrink: 0;
48
- align-items: center;
49
- justify-content: center;
50
- border: 0;
51
- border-radius: 9999px;
52
- background: var(--chat-accent, var(--primary, #6647f0));
53
- color: var(--chat-accent-foreground, #fff);
54
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
55
- cursor: pointer;
56
- transition:
57
- transform 150ms ease,
58
- box-shadow 150ms ease;
59
- }
60
-
61
- .chat-composer-send:hover:not(:disabled) {
62
- transform: translateY(-1px);
63
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.12);
64
- }
65
-
66
- .chat-composer-send:active:not(:disabled) {
67
- transform: translateY(0) scale(0.95);
68
- }
69
-
70
- .chat-composer-send:disabled {
71
- cursor: not-allowed;
72
- opacity: 0.2;
73
- box-shadow: none;
74
- }
75
-
76
- .chat-composer-icon {
77
- height: 0.875rem;
78
- width: 0.875rem;
79
- }
80
-
81
- .chat-composer-spin {
82
- animation: chat-composer-spin 800ms linear infinite;
83
- }
84
-
85
- @keyframes chat-composer-spin {
86
- to {
87
- transform: rotate(360deg);
88
- }
89
- }
90
-
91
- .chat-composer-error {
92
- margin-top: 0.25rem;
93
- padding: 0 0.25rem;
94
- font-size: 0.75rem;
95
- color: var(--destructive, #dc2626);
96
- }
97
-
98
- @media (prefers-reduced-motion: reduce) {
99
- .chat-composer-send {
100
- transition: background-color 150ms ease;
101
- }
102
- .chat-composer-send:hover:not(:disabled) {
103
- transform: none;
104
- }
105
- .chat-composer-spin {
106
- animation: none;
107
- }
108
- }
@@ -1,111 +0,0 @@
1
- <script lang="ts" module>
2
- import type { Snippet } from "svelte";
3
-
4
- export interface ComposerProps {
5
- value: string;
6
- class?: string;
7
- /** Extra classes for the textarea (e.g. a taller min/max height). */
8
- inputClass?: string;
9
- placeholder?: string;
10
- /** Accent color for the send button and focus ring. Falls back to `--primary`. */
11
- accent?: string;
12
- sending?: boolean;
13
- disabled?: boolean;
14
- error?: string | null;
15
- sendLabel?: string;
16
- /**
17
- * Whether the message can be sent. When omitted, falls back to
18
- * "has non-empty text".
19
- */
20
- canSend?: boolean;
21
- onSubmit: () => void;
22
- inputRef?: HTMLTextAreaElement | null;
23
- /** Rendered left of the textarea (e.g. an attach button). */
24
- leading?: Snippet;
25
- /** Rendered above the input row (e.g. a reply-to banner). */
26
- header?: Snippet;
27
- /** Replaces the default spinner shown while sending. */
28
- busy?: Snippet;
29
- }
30
- </script>
31
-
32
- <script lang="ts">
33
- import "./Composer.css";
34
- import { cn } from "@heyramzi/utils";
35
- import { fade } from "svelte/transition";
36
- import PaperPlaneRight from "phosphor-svelte/lib/PaperPlaneRight";
37
- import Spinner from "phosphor-svelte/lib/Spinner";
38
-
39
- let {
40
- value = $bindable(),
41
- class: className,
42
- inputClass,
43
- placeholder = "Write a message...",
44
- accent,
45
- sending = false,
46
- disabled = false,
47
- error = null,
48
- sendLabel = "Send message",
49
- canSend,
50
- onSubmit,
51
- inputRef = $bindable(null),
52
- leading,
53
- header,
54
- busy,
55
- }: ComposerProps = $props();
56
-
57
- // When canSend is not supplied, fall back to "has non-empty text".
58
- const submittable = $derived(canSend ?? value.trim().length > 0);
59
-
60
- function handleKeydown(e: KeyboardEvent) {
61
- if (e.key === "Enter" && !e.shiftKey) {
62
- e.preventDefault();
63
- onSubmit();
64
- }
65
- }
66
- </script>
67
-
68
- <!-- WHY: visuals are scoped CSS so the composer renders without the consumer's
69
- Tailwind generating arbitrary classes; theme hooks come from CSS vars. -->
70
- <div class={cn("chat-composer", className)} style:--chat-accent={accent}>
71
- {@render header?.()}
72
-
73
- <form
74
- onsubmit={(e) => {
75
- e.preventDefault();
76
- onSubmit();
77
- }}
78
- class="chat-composer-row"
79
- >
80
- {@render leading?.()}
81
-
82
- <textarea
83
- bind:this={inputRef}
84
- bind:value
85
- onkeydown={handleKeydown}
86
- {placeholder}
87
- disabled={disabled || sending}
88
- rows={1}
89
- class={cn("chat-composer-input", inputClass)}
90
- ></textarea>
91
-
92
- <button
93
- type="submit"
94
- disabled={disabled || sending || !submittable}
95
- class="chat-composer-send"
96
- aria-label={sendLabel}
97
- >
98
- {#if sending && busy}
99
- {@render busy()}
100
- {:else if sending}
101
- <Spinner class="chat-composer-icon chat-composer-spin" />
102
- {:else}
103
- <PaperPlaneRight class="chat-composer-icon" />
104
- {/if}
105
- </button>
106
- </form>
107
-
108
- {#if error}
109
- <p class="chat-composer-error" in:fade={{ duration: 150 }}>{error}</p>
110
- {/if}
111
- </div>
@@ -1,10 +0,0 @@
1
- import Composer from "./Composer.svelte";
2
-
3
- import type { ComposerProps } from "./Composer.svelte";
4
-
5
- export {
6
- Composer,
7
- type ComposerProps,
8
- //
9
- Composer as Root,
10
- };
@@ -1,28 +0,0 @@
1
- <script lang="ts" module>
2
- import type { Snippet } from "svelte";
3
- import type { HTMLAttributes } from "svelte/elements";
4
-
5
- export interface ConversationProps extends HTMLAttributes<HTMLDivElement> {
6
- children?: Snippet;
7
- class?: string;
8
- }
9
- </script>
10
-
11
- <script lang="ts">
12
- import { cn } from "@heyramzi/utils";
13
- import { setStickToBottomContext } from "./stick-to-bottom-context.svelte.js";
14
-
15
- let { class: className, children, ...rest }: ConversationProps = $props();
16
-
17
- setStickToBottomContext();
18
- </script>
19
-
20
- <div
21
- class={cn("relative flex h-full flex-col overflow-hidden", className)}
22
- role="log"
23
- aria-live="polite"
24
- aria-atomic="false"
25
- {...rest}
26
- >
27
- {@render children?.()}
28
- </div>
@@ -1,35 +0,0 @@
1
- <script lang="ts" module>
2
- import type { Snippet } from "svelte";
3
- import type { HTMLAttributes } from "svelte/elements";
4
-
5
- export interface ConversationContentProps extends HTMLAttributes<HTMLDivElement> {
6
- children?: Snippet;
7
- class?: string;
8
- }
9
- </script>
10
-
11
- <script lang="ts">
12
- import { cn } from "@heyramzi/utils";
13
- import { onDestroy } from "svelte";
14
- import { getStickToBottomContext } from "./stick-to-bottom-context.svelte.js";
15
-
16
- let { class: className, children, ...rest }: ConversationContentProps = $props();
17
-
18
- const context = getStickToBottomContext();
19
- let element = $state<HTMLDivElement | null>(null);
20
-
21
- $effect(() => {
22
- if (element) {
23
- context.setElement(element);
24
- context.scrollToBottom("smooth");
25
- }
26
- });
27
-
28
- onDestroy(() => {
29
- context.destroy();
30
- });
31
- </script>
32
-
33
- <div bind:this={element} class={cn("flex-1 overflow-y-auto", className)} {...rest}>
34
- {@render children?.()}
35
- </div>
@@ -1,46 +0,0 @@
1
- <script lang="ts" module>
2
- import type { Snippet } from "svelte";
3
- import type { HTMLAttributes } from "svelte/elements";
4
-
5
- export interface ConversationEmptyStateProps extends HTMLAttributes<HTMLDivElement> {
6
- title?: string;
7
- description?: string;
8
- icon?: Snippet;
9
- children?: Snippet;
10
- class?: string;
11
- }
12
- </script>
13
-
14
- <script lang="ts">
15
- import { cn } from "@heyramzi/utils";
16
-
17
- let {
18
- class: className,
19
- title,
20
- description,
21
- icon,
22
- children,
23
- ...rest
24
- }: ConversationEmptyStateProps = $props();
25
- </script>
26
-
27
- <div
28
- class={cn("flex size-full flex-col items-center justify-center gap-3 p-6 text-center", className)}
29
- {...rest}
30
- >
31
- {#if children}
32
- {@render children()}
33
- {:else}
34
- {#if icon}
35
- <div class="text-[color:var(--muted-foreground,inherit)]">
36
- {@render icon()}
37
- </div>
38
- {/if}
39
- <div class="space-y-1">
40
- {#if title}<h3 class="text-sm font-medium">{title}</h3>{/if}
41
- {#if description}
42
- <p class="text-[color:var(--muted-foreground,inherit)] text-sm">{description}</p>
43
- {/if}
44
- </div>
45
- {/if}
46
- </div>
@@ -1,51 +0,0 @@
1
- <script lang="ts" module>
2
- import type { ButtonProps } from "../../shadcn/button/index.js";
3
-
4
- export interface ConversationScrollButtonProps extends Omit<ButtonProps, "onclick"> {
5
- class?: string;
6
- onclick?: (event: MouseEvent) => void;
7
- }
8
- </script>
9
-
10
- <script lang="ts">
11
- import { cn } from "@heyramzi/utils";
12
- import { Button } from "../../shadcn/button/index.js";
13
- import ArrowDown from "phosphor-svelte/lib/ArrowDown";
14
- import { fly } from "svelte/transition";
15
- import { backOut } from "svelte/easing";
16
- import { getStickToBottomContext } from "./stick-to-bottom-context.svelte.js";
17
-
18
- let { class: className, onclick, ...rest }: ConversationScrollButtonProps = $props();
19
-
20
- const context = getStickToBottomContext();
21
-
22
- function handleClick(event: MouseEvent) {
23
- context.scrollToBottom();
24
- onclick?.(event);
25
- }
26
- </script>
27
-
28
- {#if !context.isAtBottom}
29
- <div
30
- in:fly={{ duration: 300, y: 10, easing: backOut }}
31
- out:fly={{ duration: 200, y: 10, easing: backOut }}
32
- class="pointer-events-auto absolute bottom-3 left-1/2 -translate-x-1/2"
33
- >
34
- <Button
35
- class={cn(
36
- "rounded-full shadow-lg backdrop-blur-sm",
37
- "bg-[color:var(--background,white)]/80 hover:bg-[color:var(--background,white)]/95",
38
- "border-[color:var(--border,rgba(0,0,0,0.1))]",
39
- className,
40
- )}
41
- onclick={handleClick}
42
- icon
43
- type="button"
44
- variant="outline"
45
- aria-label="Scroll to latest"
46
- {...rest}
47
- >
48
- <ArrowDown class="size-4" />
49
- </Button>
50
- </div>
51
- {/if}
@@ -1,33 +0,0 @@
1
- import Conversation from "./Conversation.svelte";
2
- import ConversationContent from "./ConversationContent.svelte";
3
- import ConversationEmptyState from "./ConversationEmptyState.svelte";
4
- import ConversationScrollButton from "./ConversationScrollButton.svelte";
5
- import {
6
- StickToBottomContext,
7
- getStickToBottomContext,
8
- setStickToBottomContext,
9
- } from "./stick-to-bottom-context.svelte.js";
10
-
11
- import type { ConversationProps } from "./Conversation.svelte";
12
- import type { ConversationContentProps } from "./ConversationContent.svelte";
13
- import type { ConversationEmptyStateProps } from "./ConversationEmptyState.svelte";
14
- import type { ConversationScrollButtonProps } from "./ConversationScrollButton.svelte";
15
-
16
- export {
17
- Conversation,
18
- ConversationContent,
19
- ConversationEmptyState,
20
- ConversationScrollButton,
21
- StickToBottomContext,
22
- getStickToBottomContext,
23
- setStickToBottomContext,
24
- type ConversationProps,
25
- type ConversationContentProps,
26
- type ConversationEmptyStateProps,
27
- type ConversationScrollButtonProps,
28
- //
29
- Conversation as Root,
30
- ConversationContent as Content,
31
- ConversationEmptyState as EmptyState,
32
- ConversationScrollButton as ScrollButton,
33
- };