@heyramzi/ui 0.0.0-stage → 6.1.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 (599) hide show
  1. package/COMPONENTS.md +141 -0
  2. package/README.md +130 -2
  3. package/package.json +215 -3
  4. package/scripts/lib/sync-core.mjs +113 -0
  5. package/scripts/relative-imports.mjs +39 -0
  6. package/scripts/sf-symbol.mjs +93 -0
  7. package/scripts/sync-shadcn.mjs +341 -0
  8. package/scripts/sync-transitions.mjs +146 -0
  9. package/scripts/validate-apple-symbol-exports.mjs +45 -0
  10. package/src/agents/agent-avatar.svelte +639 -0
  11. package/src/agents/agent-cast.svelte +173 -0
  12. package/src/agents/demo.svelte +78 -0
  13. package/src/agents/index.ts +11 -0
  14. package/src/agents/types.ts +72 -0
  15. package/src/agents/vendor/LICENSE +21 -0
  16. package/src/agents/vendor/color.ts +155 -0
  17. package/src/agents/vendor/draw.ts +840 -0
  18. package/src/agents/vendor/engine.ts +845 -0
  19. package/src/agents/vendor/mesh.ts +838 -0
  20. package/src/agents/vendor/plastic.ts +4958 -0
  21. package/src/agents/vendor/presets.ts +103 -0
  22. package/src/agents/vendor/shapes.ts +41 -0
  23. package/src/agents/vendor/ticker.ts +67 -0
  24. package/src/agents/vendor/types.ts +261 -0
  25. package/src/agents/vendor/wear.ts +1699 -0
  26. package/src/ai/composer/Composer.css +108 -0
  27. package/src/ai/composer/Composer.svelte +111 -0
  28. package/src/ai/composer/index.ts +10 -0
  29. package/src/ai/confirmation/Confirmation.svelte +54 -0
  30. package/src/ai/confirmation/ConfirmationAccepted.svelte +23 -0
  31. package/src/ai/confirmation/ConfirmationAction.svelte +53 -0
  32. package/src/ai/confirmation/ConfirmationActions.svelte +24 -0
  33. package/src/ai/confirmation/ConfirmationFailed.svelte +23 -0
  34. package/src/ai/confirmation/ConfirmationRejected.svelte +23 -0
  35. package/src/ai/confirmation/ConfirmationRequest.svelte +25 -0
  36. package/src/ai/confirmation/ConfirmationTitle.svelte +25 -0
  37. package/src/ai/confirmation/confirmation-context.svelte.ts +22 -0
  38. package/src/ai/confirmation/index.ts +50 -0
  39. package/src/ai/conversation/Conversation.svelte +28 -0
  40. package/src/ai/conversation/ConversationContent.svelte +35 -0
  41. package/src/ai/conversation/ConversationEmptyState.svelte +46 -0
  42. package/src/ai/conversation/ConversationScrollButton.svelte +51 -0
  43. package/src/ai/conversation/index.ts +33 -0
  44. package/src/ai/conversation/stick-to-bottom-context.svelte.ts +131 -0
  45. package/src/ai/index.ts +119 -0
  46. package/src/ai/loading-state/PixelLoader.svelte +138 -0
  47. package/src/ai/loading-state/index.ts +5 -0
  48. package/src/ai/prompt-input/PromptInput.svelte +38 -0
  49. package/src/ai/prompt-input/PromptInputBody.svelte +19 -0
  50. package/src/ai/prompt-input/PromptInputSubmit.svelte +73 -0
  51. package/src/ai/prompt-input/PromptInputTextarea.svelte +74 -0
  52. package/src/ai/prompt-input/PromptInputToolbar.svelte +19 -0
  53. package/src/ai/prompt-input/index.ts +34 -0
  54. package/src/ai/reasoning/Reasoning.svelte +47 -0
  55. package/src/ai/reasoning/ReasoningContent.svelte +27 -0
  56. package/src/ai/reasoning/ReasoningTrigger.svelte +48 -0
  57. package/src/ai/reasoning/index.ts +22 -0
  58. package/src/ai/reasoning/reasoning-context.svelte.ts +20 -0
  59. package/src/ai/response/Response.css +32 -0
  60. package/src/ai/response/Response.svelte +130 -0
  61. package/src/ai/response/index.ts +5 -0
  62. package/src/ai/suggestion/Suggestion.svelte +43 -0
  63. package/src/ai/suggestion/Suggestions.svelte +25 -0
  64. package/src/ai/suggestion/index.ts +14 -0
  65. package/src/ai/thinking-dots/ThinkingDots.svelte +42 -0
  66. package/src/ai/thinking-dots/index.ts +5 -0
  67. package/src/ai/typing-dots/TypingDots.css +39 -0
  68. package/src/ai/typing-dots/TypingDots.svelte +27 -0
  69. package/src/ai/typing-dots/index.ts +10 -0
  70. package/src/ai/voice-waveform/VoiceWaveform.css +40 -0
  71. package/src/ai/voice-waveform/VoiceWaveform.svelte +46 -0
  72. package/src/ai/voice-waveform/index.ts +5 -0
  73. package/src/animations/README.md +84 -0
  74. package/src/animations/accordion.css +58 -0
  75. package/src/animations/avatar-group-hover.css +47 -0
  76. package/src/animations/card-tilt.css +74 -0
  77. package/src/animations/digit-pop-in.css +78 -0
  78. package/src/animations/dropdown.css +121 -0
  79. package/src/animations/icon-swap.css +43 -0
  80. package/src/animations/index.css +34 -0
  81. package/src/animations/input-clear-dissolve.css +86 -0
  82. package/src/animations/input-shake.css +114 -0
  83. package/src/animations/learn-more-hover.css +48 -0
  84. package/src/animations/like-button.css +93 -0
  85. package/src/animations/modal.css +75 -0
  86. package/src/animations/notification-badge.css +81 -0
  87. package/src/animations/page-side-by-side.css +63 -0
  88. package/src/animations/panel.css +86 -0
  89. package/src/animations/plus-menu-morph.css +97 -0
  90. package/src/animations/reasoning-stream.css +49 -0
  91. package/src/animations/resize.css +20 -0
  92. package/src/animations/shimmer-text.css +72 -0
  93. package/src/animations/skeleton-reveal.css +97 -0
  94. package/src/animations/spinning-counter.css +52 -0
  95. package/src/animations/streaming-text.css +31 -0
  96. package/src/animations/success-check.css +120 -0
  97. package/src/animations/tabs-sliding.css +83 -0
  98. package/src/animations/text-swap.css +40 -0
  99. package/src/animations/text-swap.ts +40 -0
  100. package/src/animations/texts-reveal.css +70 -0
  101. package/src/animations/thinking-states.css +65 -0
  102. package/src/animations/tooltip.css +72 -0
  103. package/src/animations/upstream-coverage.test.ts +65 -0
  104. package/src/animations/view-transition-reveal.ts +74 -0
  105. package/src/charts/animated-value.css +7 -0
  106. package/src/charts/animated-value.svelte +110 -0
  107. package/src/charts/area-chart.css +29 -0
  108. package/src/charts/area-chart.svelte +195 -0
  109. package/src/charts/bar-chart.css +119 -0
  110. package/src/charts/bar-chart.svelte +269 -0
  111. package/src/charts/charts.css +201 -0
  112. package/src/charts/crosshair.svelte +35 -0
  113. package/src/charts/donut-chart.css +56 -0
  114. package/src/charts/donut-chart.svelte +158 -0
  115. package/src/charts/edge-fade.svelte +43 -0
  116. package/src/charts/edge-fade.ts +16 -0
  117. package/src/charts/figure.css +100 -0
  118. package/src/charts/figure.svelte +122 -0
  119. package/src/charts/gauge-chart.css +94 -0
  120. package/src/charts/gauge-chart.svelte +303 -0
  121. package/src/charts/hover-band.test.ts +30 -0
  122. package/src/charts/hover-band.ts +21 -0
  123. package/src/charts/hover-focus.svelte +85 -0
  124. package/src/charts/index.ts +30 -0
  125. package/src/charts/legend.css +131 -0
  126. package/src/charts/legend.svelte +112 -0
  127. package/src/charts/line-chart.css +26 -0
  128. package/src/charts/line-chart.svelte +256 -0
  129. package/src/charts/motion.ts +19 -0
  130. package/src/charts/number-chart.css +168 -0
  131. package/src/charts/number-chart.svelte +177 -0
  132. package/src/charts/primitives/chart-container.svelte +57 -0
  133. package/src/charts/primitives/chart-style.svelte +36 -0
  134. package/src/charts/primitives/chart-tooltip.svelte +161 -0
  135. package/src/charts/primitives/chart-utils.ts +54 -0
  136. package/src/charts/primitives/index.ts +11 -0
  137. package/src/charts/reveal.svelte +61 -0
  138. package/src/charts/ring-chart.css +96 -0
  139. package/src/charts/ring-chart.svelte +158 -0
  140. package/src/charts/sparkline.css +45 -0
  141. package/src/charts/sparkline.svelte +140 -0
  142. package/src/charts/stat-card.css +103 -0
  143. package/src/charts/stat-card.svelte +267 -0
  144. package/src/charts/time-series-chart.css +28 -0
  145. package/src/charts/time-series-chart.svelte +179 -0
  146. package/src/charts/trend-pill.css +38 -0
  147. package/src/charts/trend-pill.svelte +48 -0
  148. package/src/design/index.css +270 -0
  149. package/src/design/polish.css +159 -0
  150. package/src/effects/animated-beam/AnimatedBeam.svelte +132 -0
  151. package/src/effects/animated-beam/diagrams/BeamSvg.svelte +91 -0
  152. package/src/effects/animated-beam/index.ts +2 -0
  153. package/src/effects/animated-beam/path-calculator.svelte.ts +70 -0
  154. package/src/effects/animated-beam/types.ts +23 -0
  155. package/src/effects/border-beam/BorderBeam.svelte +223 -0
  156. package/src/effects/border-beam/css.test.ts +46 -0
  157. package/src/effects/border-beam/css.ts +574 -0
  158. package/src/effects/border-beam/presets.ts +699 -0
  159. package/src/effects/border-beam/register-properties.test.ts +74 -0
  160. package/src/effects/border-beam/register-properties.ts +73 -0
  161. package/src/effects/border-beam/types.ts +38 -0
  162. package/src/effects/image-comparison/ImageComparison.css +66 -0
  163. package/src/effects/image-comparison/ImageComparison.svelte +92 -0
  164. package/src/effects/image-reveal/ImageReveal.css +10 -0
  165. package/src/effects/image-reveal/ImageReveal.svelte +357 -0
  166. package/src/effects/image-reveal/index.ts +2 -0
  167. package/src/effects/image-reveal/types.ts +35 -0
  168. package/src/effects/magnetic/magnetic.ts +81 -0
  169. package/src/effects/marquee/Marquee.css +52 -0
  170. package/src/effects/marquee/Marquee.svelte +96 -0
  171. package/src/effects/progressive-blur/ProgressiveBlur.css +9 -0
  172. package/src/effects/progressive-blur/ProgressiveBlur.svelte +63 -0
  173. package/src/effects/reveal/AnimatedGroup.svelte +101 -0
  174. package/src/effects/reveal/InView.svelte +77 -0
  175. package/src/effects/reveal/TextEffect.svelte +142 -0
  176. package/src/effects/reveal/index.ts +10 -0
  177. package/src/effects/reveal/observe.ts +33 -0
  178. package/src/effects/reveal/reveal.css +141 -0
  179. package/src/effects/reveal/types.ts +25 -0
  180. package/src/effects/shader-gradient/ShaderGradient.svelte +227 -0
  181. package/src/effects/shader-gradient/color.ts +44 -0
  182. package/src/effects/shader-gradient/index.ts +5 -0
  183. package/src/effects/shader-gradient/renderer.ts +456 -0
  184. package/src/effects/shader-gradient/shaders.ts +324 -0
  185. package/src/effects/shader-gradient/types.ts +68 -0
  186. package/src/effects/spotlight/Spotlight.css +14 -0
  187. package/src/effects/spotlight/Spotlight.svelte +61 -0
  188. package/src/effects/theme-toggle/ThemeToggle.css +21 -0
  189. package/src/effects/theme-toggle/ThemeToggle.svelte +101 -0
  190. package/src/icons/TradeIcon.svelte +16 -0
  191. package/src/icons/apple-symbol-exports.ts +135 -0
  192. package/src/icons/sf-symbols.ts +527 -0
  193. package/src/icons/trades.ts +89 -0
  194. package/src/index.ts +49 -0
  195. package/src/lib/arrive.ts +26 -0
  196. package/src/lib/hooks/is-mobile.svelte.ts +11 -0
  197. package/src/lib/icon-types.ts +17 -0
  198. package/src/lib/layout.ts +8 -0
  199. package/src/lib/panel.ts +15 -0
  200. package/src/lib/theme-transition.ts +51 -0
  201. package/src/lib/utils.ts +45 -0
  202. package/src/shadcn/accordion/accordion-content.svelte +22 -0
  203. package/src/shadcn/accordion/accordion-item.svelte +17 -0
  204. package/src/shadcn/accordion/accordion-trigger.svelte +35 -0
  205. package/src/shadcn/accordion/accordion.svelte +19 -0
  206. package/src/shadcn/accordion/index.ts +16 -0
  207. package/src/shadcn/alert/alert-description.svelte +23 -0
  208. package/src/shadcn/alert/alert-title.svelte +20 -0
  209. package/src/shadcn/alert/alert.svelte +44 -0
  210. package/src/shadcn/alert/index.ts +14 -0
  211. package/src/shadcn/alert-dialog/alert-dialog-action.svelte +18 -0
  212. package/src/shadcn/alert-dialog/alert-dialog-cancel.svelte +18 -0
  213. package/src/shadcn/alert-dialog/alert-dialog-content.svelte +29 -0
  214. package/src/shadcn/alert-dialog/alert-dialog-description.svelte +17 -0
  215. package/src/shadcn/alert-dialog/alert-dialog-footer.svelte +20 -0
  216. package/src/shadcn/alert-dialog/alert-dialog-header.svelte +20 -0
  217. package/src/shadcn/alert-dialog/alert-dialog-overlay.svelte +17 -0
  218. package/src/shadcn/alert-dialog/alert-dialog-portal.svelte +7 -0
  219. package/src/shadcn/alert-dialog/alert-dialog-title.svelte +17 -0
  220. package/src/shadcn/alert-dialog/alert-dialog-trigger.svelte +7 -0
  221. package/src/shadcn/alert-dialog/alert-dialog.svelte +7 -0
  222. package/src/shadcn/alert-dialog/index.ts +37 -0
  223. package/src/shadcn/attachment/attachment-action.svelte +23 -0
  224. package/src/shadcn/attachment/attachment-actions.svelte +23 -0
  225. package/src/shadcn/attachment/attachment-content.svelte +23 -0
  226. package/src/shadcn/attachment/attachment-description.svelte +23 -0
  227. package/src/shadcn/attachment/attachment-group.svelte +23 -0
  228. package/src/shadcn/attachment/attachment-media.svelte +44 -0
  229. package/src/shadcn/attachment/attachment-title.svelte +23 -0
  230. package/src/shadcn/attachment/attachment-trigger.svelte +29 -0
  231. package/src/shadcn/attachment/attachment.svelte +55 -0
  232. package/src/shadcn/attachment/index.ts +40 -0
  233. package/src/shadcn/avatar/avatar-badge.svelte +26 -0
  234. package/src/shadcn/avatar/avatar-fallback.svelte +20 -0
  235. package/src/shadcn/avatar/avatar-group-count.svelte +23 -0
  236. package/src/shadcn/avatar/avatar-group.svelte +23 -0
  237. package/src/shadcn/avatar/avatar-image.svelte +17 -0
  238. package/src/shadcn/avatar/avatar.svelte +26 -0
  239. package/src/shadcn/avatar/index.ts +22 -0
  240. package/src/shadcn/badge/badge.svelte +53 -0
  241. package/src/shadcn/badge/index.ts +2 -0
  242. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
  243. package/src/shadcn/breadcrumb/breadcrumb-item.svelte +20 -0
  244. package/src/shadcn/breadcrumb/breadcrumb-link.svelte +31 -0
  245. package/src/shadcn/breadcrumb/breadcrumb-list.svelte +23 -0
  246. package/src/shadcn/breadcrumb/breadcrumb-page.svelte +23 -0
  247. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +27 -0
  248. package/src/shadcn/breadcrumb/breadcrumb.svelte +21 -0
  249. package/src/shadcn/breadcrumb/index.ts +25 -0
  250. package/src/shadcn/bubble/bubble-content.svelte +31 -0
  251. package/src/shadcn/bubble/bubble-group.svelte +20 -0
  252. package/src/shadcn/bubble/bubble-reactions.svelte +52 -0
  253. package/src/shadcn/bubble/bubble.svelte +58 -0
  254. package/src/shadcn/bubble/index.ts +25 -0
  255. package/src/shadcn/button/button.svelte +121 -0
  256. package/src/shadcn/button/index.ts +17 -0
  257. package/src/shadcn/calendar/calendar-caption.svelte +76 -0
  258. package/src/shadcn/calendar/calendar-cell.svelte +19 -0
  259. package/src/shadcn/calendar/calendar-day.svelte +35 -0
  260. package/src/shadcn/calendar/calendar-grid-body.svelte +12 -0
  261. package/src/shadcn/calendar/calendar-grid-head.svelte +12 -0
  262. package/src/shadcn/calendar/calendar-grid-row.svelte +12 -0
  263. package/src/shadcn/calendar/calendar-grid.svelte +16 -0
  264. package/src/shadcn/calendar/calendar-head-cell.svelte +19 -0
  265. package/src/shadcn/calendar/calendar-header.svelte +19 -0
  266. package/src/shadcn/calendar/calendar-heading.svelte +16 -0
  267. package/src/shadcn/calendar/calendar-month-select.svelte +44 -0
  268. package/src/shadcn/calendar/calendar-month.svelte +15 -0
  269. package/src/shadcn/calendar/calendar-months.svelte +19 -0
  270. package/src/shadcn/calendar/calendar-nav.svelte +19 -0
  271. package/src/shadcn/calendar/calendar-next-button.svelte +31 -0
  272. package/src/shadcn/calendar/calendar-prev-button.svelte +31 -0
  273. package/src/shadcn/calendar/calendar-year-select.svelte +43 -0
  274. package/src/shadcn/calendar/calendar.svelte +118 -0
  275. package/src/shadcn/calendar/index.ts +40 -0
  276. package/src/shadcn/card/card-action.svelte +23 -0
  277. package/src/shadcn/card/card-content.svelte +20 -0
  278. package/src/shadcn/card/card-description.svelte +20 -0
  279. package/src/shadcn/card/card-footer.svelte +23 -0
  280. package/src/shadcn/card/card-header.svelte +23 -0
  281. package/src/shadcn/card/card-title.svelte +29 -0
  282. package/src/shadcn/card/card.svelte +25 -0
  283. package/src/shadcn/card/index.ts +25 -0
  284. package/src/shadcn/checkbox/checkbox.svelte +38 -0
  285. package/src/shadcn/checkbox/index.ts +6 -0
  286. package/src/shadcn/collapsible/collapsible-content.svelte +7 -0
  287. package/src/shadcn/collapsible/collapsible-trigger.svelte +7 -0
  288. package/src/shadcn/collapsible/collapsible.svelte +11 -0
  289. package/src/shadcn/collapsible/index.ts +13 -0
  290. package/src/shadcn/command/command-dialog.svelte +66 -0
  291. package/src/shadcn/command/command-empty.svelte +17 -0
  292. package/src/shadcn/command/command-group.svelte +40 -0
  293. package/src/shadcn/command/command-input.svelte +64 -0
  294. package/src/shadcn/command/command-item.svelte +37 -0
  295. package/src/shadcn/command/command-link-item.svelte +20 -0
  296. package/src/shadcn/command/command-list.svelte +20 -0
  297. package/src/shadcn/command/command-loading.svelte +7 -0
  298. package/src/shadcn/command/command-separator.svelte +17 -0
  299. package/src/shadcn/command/command-shortcut.svelte +23 -0
  300. package/src/shadcn/command/command.svelte +28 -0
  301. package/src/shadcn/command/index.ts +37 -0
  302. package/src/shadcn/context-menu/context-menu-checkbox-item.svelte +41 -0
  303. package/src/shadcn/context-menu/context-menu-content.svelte +28 -0
  304. package/src/shadcn/context-menu/context-menu-group-heading.svelte +21 -0
  305. package/src/shadcn/context-menu/context-menu-group.svelte +7 -0
  306. package/src/shadcn/context-menu/context-menu-item.svelte +27 -0
  307. package/src/shadcn/context-menu/context-menu-label.svelte +27 -0
  308. package/src/shadcn/context-menu/context-menu-portal.svelte +7 -0
  309. package/src/shadcn/context-menu/context-menu-radio-group.svelte +16 -0
  310. package/src/shadcn/context-menu/context-menu-radio-item.svelte +35 -0
  311. package/src/shadcn/context-menu/context-menu-separator.svelte +17 -0
  312. package/src/shadcn/context-menu/context-menu-shortcut.svelte +23 -0
  313. package/src/shadcn/context-menu/context-menu-sub-content.svelte +25 -0
  314. package/src/shadcn/context-menu/context-menu-sub-trigger.svelte +29 -0
  315. package/src/shadcn/context-menu/context-menu-sub.svelte +7 -0
  316. package/src/shadcn/context-menu/context-menu-trigger.svelte +17 -0
  317. package/src/shadcn/context-menu/context-menu.svelte +7 -0
  318. package/src/shadcn/context-menu/index.ts +52 -0
  319. package/src/shadcn/dialog/dialog-close.svelte +11 -0
  320. package/src/shadcn/dialog/dialog-content.svelte +57 -0
  321. package/src/shadcn/dialog/dialog-description.svelte +20 -0
  322. package/src/shadcn/dialog/dialog-footer.svelte +32 -0
  323. package/src/shadcn/dialog/dialog-header.svelte +20 -0
  324. package/src/shadcn/dialog/dialog-overlay.svelte +20 -0
  325. package/src/shadcn/dialog/dialog-portal.svelte +7 -0
  326. package/src/shadcn/dialog/dialog-title.svelte +17 -0
  327. package/src/shadcn/dialog/dialog-trigger.svelte +11 -0
  328. package/src/shadcn/dialog/dialog.svelte +7 -0
  329. package/src/shadcn/dialog/index.ts +34 -0
  330. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  331. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
  332. package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +31 -0
  333. package/src/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  334. package/src/shadcn/dropdown-menu/dropdown-menu-group.svelte +7 -0
  335. package/src/shadcn/dropdown-menu/dropdown-menu-item.svelte +29 -0
  336. package/src/shadcn/dropdown-menu/dropdown-menu-label.svelte +27 -0
  337. package/src/shadcn/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  338. package/src/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  339. package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +34 -0
  340. package/src/shadcn/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  341. package/src/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  342. package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
  343. package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  344. package/src/shadcn/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  345. package/src/shadcn/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  346. package/src/shadcn/dropdown-menu/dropdown-menu.svelte +7 -0
  347. package/src/shadcn/dropdown-menu/index.ts +56 -0
  348. package/src/shadcn/dropdown-menu/menu-item.ts +43 -0
  349. package/src/shadcn/empty/empty-content.svelte +23 -0
  350. package/src/shadcn/empty/empty-description.svelte +23 -0
  351. package/src/shadcn/empty/empty-header.svelte +20 -0
  352. package/src/shadcn/empty/empty-media.svelte +41 -0
  353. package/src/shadcn/empty/empty-title.svelte +20 -0
  354. package/src/shadcn/empty/empty.svelte +23 -0
  355. package/src/shadcn/empty/index.ts +22 -0
  356. package/src/shadcn/field/field-content.svelte +20 -0
  357. package/src/shadcn/field/field-description.svelte +25 -0
  358. package/src/shadcn/field/field-error.svelte +58 -0
  359. package/src/shadcn/field/field-group.svelte +23 -0
  360. package/src/shadcn/field/field-label.svelte +26 -0
  361. package/src/shadcn/field/field-legend.svelte +29 -0
  362. package/src/shadcn/field/field-separator.svelte +35 -0
  363. package/src/shadcn/field/field-set.svelte +24 -0
  364. package/src/shadcn/field/field-title.svelte +23 -0
  365. package/src/shadcn/field/field.svelte +53 -0
  366. package/src/shadcn/field/index.ts +33 -0
  367. package/src/shadcn/hooks/is-mobile.svelte.ts +9 -0
  368. package/src/shadcn/hover-card/hover-card-content.svelte +31 -0
  369. package/src/shadcn/hover-card/hover-card-portal.svelte +7 -0
  370. package/src/shadcn/hover-card/hover-card-trigger.svelte +7 -0
  371. package/src/shadcn/hover-card/hover-card.svelte +7 -0
  372. package/src/shadcn/hover-card/index.ts +15 -0
  373. package/src/shadcn/input/index.ts +9 -0
  374. package/src/shadcn/input/input.svelte +48 -0
  375. package/src/shadcn/input/secret-input.svelte +75 -0
  376. package/src/shadcn/input-otp/index.ts +15 -0
  377. package/src/shadcn/input-otp/input-otp-group.svelte +20 -0
  378. package/src/shadcn/input-otp/input-otp-separator.svelte +25 -0
  379. package/src/shadcn/input-otp/input-otp-slot.svelte +26 -0
  380. package/src/shadcn/input-otp/input-otp.svelte +22 -0
  381. package/src/shadcn/label/index.ts +7 -0
  382. package/src/shadcn/label/label.svelte +20 -0
  383. package/src/shadcn/marker/index.ts +15 -0
  384. package/src/shadcn/marker/marker-content.svelte +23 -0
  385. package/src/shadcn/marker/marker-icon.svelte +21 -0
  386. package/src/shadcn/marker/marker.svelte +52 -0
  387. package/src/shadcn/message/index.ts +22 -0
  388. package/src/shadcn/message/message-avatar.svelte +23 -0
  389. package/src/shadcn/message/message-content.svelte +23 -0
  390. package/src/shadcn/message/message-footer.svelte +23 -0
  391. package/src/shadcn/message/message-group.svelte +20 -0
  392. package/src/shadcn/message/message-header.svelte +23 -0
  393. package/src/shadcn/message/message.svelte +27 -0
  394. package/src/shadcn/popover/index.ts +28 -0
  395. package/src/shadcn/popover/popover-close.svelte +7 -0
  396. package/src/shadcn/popover/popover-content.svelte +38 -0
  397. package/src/shadcn/popover/popover-description.svelte +20 -0
  398. package/src/shadcn/popover/popover-header.svelte +20 -0
  399. package/src/shadcn/popover/popover-portal.svelte +7 -0
  400. package/src/shadcn/popover/popover-title.svelte +15 -0
  401. package/src/shadcn/popover/popover-trigger.svelte +17 -0
  402. package/src/shadcn/popover/popover.svelte +7 -0
  403. package/src/shadcn/progress/index.ts +7 -0
  404. package/src/shadcn/progress/progress.svelte +30 -0
  405. package/src/shadcn/radio-group/index.ts +10 -0
  406. package/src/shadcn/radio-group/radio-group-item.svelte +31 -0
  407. package/src/shadcn/radio-group/radio-group.svelte +19 -0
  408. package/src/shadcn/scroll-area/index.ts +10 -0
  409. package/src/shadcn/scroll-area/scroll-area-scrollbar.svelte +30 -0
  410. package/src/shadcn/scroll-area/scroll-area.svelte +43 -0
  411. package/src/shadcn/select/index.ts +37 -0
  412. package/src/shadcn/select/select-content.svelte +45 -0
  413. package/src/shadcn/select/select-group-heading.svelte +21 -0
  414. package/src/shadcn/select/select-group.svelte +17 -0
  415. package/src/shadcn/select/select-item.svelte +38 -0
  416. package/src/shadcn/select/select-label.svelte +20 -0
  417. package/src/shadcn/select/select-portal.svelte +7 -0
  418. package/src/shadcn/select/select-scroll-down-button.svelte +23 -0
  419. package/src/shadcn/select/select-scroll-up-button.svelte +23 -0
  420. package/src/shadcn/select/select-separator.svelte +18 -0
  421. package/src/shadcn/select/select-trigger.svelte +33 -0
  422. package/src/shadcn/select/select.svelte +11 -0
  423. package/src/shadcn/separator/index.ts +7 -0
  424. package/src/shadcn/separator/separator.svelte +23 -0
  425. package/src/shadcn/sheet/index.ts +34 -0
  426. package/src/shadcn/sheet/sheet-close.svelte +7 -0
  427. package/src/shadcn/sheet/sheet-content.svelte +72 -0
  428. package/src/shadcn/sheet/sheet-description.svelte +17 -0
  429. package/src/shadcn/sheet/sheet-footer.svelte +20 -0
  430. package/src/shadcn/sheet/sheet-header.svelte +20 -0
  431. package/src/shadcn/sheet/sheet-overlay.svelte +20 -0
  432. package/src/shadcn/sheet/sheet-portal.svelte +7 -0
  433. package/src/shadcn/sheet/sheet-title.svelte +17 -0
  434. package/src/shadcn/sheet/sheet-trigger.svelte +7 -0
  435. package/src/shadcn/sheet/sheet.svelte +7 -0
  436. package/src/shadcn/sidebar/constants.ts +6 -0
  437. package/src/shadcn/sidebar/context.svelte.ts +81 -0
  438. package/src/shadcn/sidebar/index.ts +75 -0
  439. package/src/shadcn/sidebar/sidebar-content.svelte +24 -0
  440. package/src/shadcn/sidebar/sidebar-footer.svelte +21 -0
  441. package/src/shadcn/sidebar/sidebar-group-action.svelte +33 -0
  442. package/src/shadcn/sidebar/sidebar-group-content.svelte +21 -0
  443. package/src/shadcn/sidebar/sidebar-group-label.svelte +33 -0
  444. package/src/shadcn/sidebar/sidebar-group.svelte +21 -0
  445. package/src/shadcn/sidebar/sidebar-header.svelte +21 -0
  446. package/src/shadcn/sidebar/sidebar-input.svelte +21 -0
  447. package/src/shadcn/sidebar/sidebar-inset.svelte +23 -0
  448. package/src/shadcn/sidebar/sidebar-menu-action.svelte +37 -0
  449. package/src/shadcn/sidebar/sidebar-menu-badge.svelte +24 -0
  450. package/src/shadcn/sidebar/sidebar-menu-button.svelte +103 -0
  451. package/src/shadcn/sidebar/sidebar-menu-item.svelte +21 -0
  452. package/src/shadcn/sidebar/sidebar-menu-skeleton.svelte +36 -0
  453. package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +39 -0
  454. package/src/shadcn/sidebar/sidebar-menu-sub-item.svelte +21 -0
  455. package/src/shadcn/sidebar/sidebar-menu-sub.svelte +24 -0
  456. package/src/shadcn/sidebar/sidebar-menu.svelte +21 -0
  457. package/src/shadcn/sidebar/sidebar-provider.svelte +62 -0
  458. package/src/shadcn/sidebar/sidebar-rail.svelte +36 -0
  459. package/src/shadcn/sidebar/sidebar-separator.svelte +19 -0
  460. package/src/shadcn/sidebar/sidebar-trigger.svelte +37 -0
  461. package/src/shadcn/sidebar/sidebar.svelte +109 -0
  462. package/src/shadcn/skeleton/index.ts +7 -0
  463. package/src/shadcn/skeleton/skeleton.svelte +17 -0
  464. package/src/shadcn/slider/index.ts +7 -0
  465. package/src/shadcn/slider/slider.svelte +52 -0
  466. package/src/shadcn/sonner/index.ts +1 -0
  467. package/src/shadcn/sonner/sonner.svelte +34 -0
  468. package/src/shadcn/spinner/index.ts +1 -0
  469. package/src/shadcn/spinner/spinner.svelte +26 -0
  470. package/src/shadcn/switch/index.ts +7 -0
  471. package/src/shadcn/switch/switch.svelte +31 -0
  472. package/src/shadcn/table/index.ts +28 -0
  473. package/src/shadcn/table/table-body.svelte +20 -0
  474. package/src/shadcn/table/table-caption.svelte +20 -0
  475. package/src/shadcn/table/table-cell.svelte +20 -0
  476. package/src/shadcn/table/table-footer.svelte +20 -0
  477. package/src/shadcn/table/table-head.svelte +23 -0
  478. package/src/shadcn/table/table-header.svelte +20 -0
  479. package/src/shadcn/table/table-row.svelte +23 -0
  480. package/src/shadcn/table/table.svelte +25 -0
  481. package/src/shadcn/tabs/index.ts +16 -0
  482. package/src/shadcn/tabs/tabs-content.svelte +17 -0
  483. package/src/shadcn/tabs/tabs-list.svelte +25 -0
  484. package/src/shadcn/tabs/tabs-trigger.svelte +20 -0
  485. package/src/shadcn/tabs/tabs.svelte +19 -0
  486. package/src/shadcn/textarea/index.ts +7 -0
  487. package/src/shadcn/textarea/textarea.svelte +23 -0
  488. package/src/shadcn/toggle/index.ts +13 -0
  489. package/src/shadcn/toggle/toggle.svelte +53 -0
  490. package/src/shadcn/toggle-group/index.ts +10 -0
  491. package/src/shadcn/toggle-group/toggle-group-item.svelte +35 -0
  492. package/src/shadcn/toggle-group/toggle-group.svelte +59 -0
  493. package/src/shadcn/tooltip/context.ts +16 -0
  494. package/src/shadcn/tooltip/index.ts +19 -0
  495. package/src/shadcn/tooltip/tooltip-content.svelte +38 -0
  496. package/src/shadcn/tooltip/tooltip-portal.svelte +7 -0
  497. package/src/shadcn/tooltip/tooltip-provider.svelte +16 -0
  498. package/src/shadcn/tooltip/tooltip-trigger.svelte +7 -0
  499. package/src/shadcn/tooltip/tooltip.svelte +19 -0
  500. package/src/shadcn/utilities.css +549 -0
  501. package/src/showcase/AiSection.svelte +157 -0
  502. package/src/showcase/AnimationsSection.svelte +1658 -0
  503. package/src/showcase/ChartsSection.svelte +458 -0
  504. package/src/showcase/EffectsSection.svelte +152 -0
  505. package/src/showcase/ShadcnSection.svelte +27 -0
  506. package/src/showcase/ShowcaseImport.svelte +126 -0
  507. package/src/showcase/ShowcaseList.svelte +132 -0
  508. package/src/showcase/ShowcaseNav.svelte +247 -0
  509. package/src/showcase/ShowcaseSection.svelte +112 -0
  510. package/src/showcase/ShowcaseShell.svelte +55 -0
  511. package/src/showcase/ShowcaseStage.svelte +342 -0
  512. package/src/showcase/ShowcaseVariant.svelte +109 -0
  513. package/src/showcase/assets/image-reveal/art-1.jpg +0 -0
  514. package/src/showcase/assets/image-reveal/art-2.jpg +0 -0
  515. package/src/showcase/assets/image-reveal/art-3.jpg +0 -0
  516. package/src/showcase/check.svg +1 -0
  517. package/src/showcase/chevron-arms.svg +2 -0
  518. package/src/showcase/chevron-down.svg +1 -0
  519. package/src/showcase/copy.svg +2 -0
  520. package/src/showcase/demos/ai/confirmation.svelte +59 -0
  521. package/src/showcase/demos/ai/conversation.svelte +59 -0
  522. package/src/showcase/demos/ai/loading-state.svelte +19 -0
  523. package/src/showcase/demos/ai/prompt-input.svelte +57 -0
  524. package/src/showcase/demos/ai/reasoning.svelte +19 -0
  525. package/src/showcase/demos/ai/thinking-dots.svelte +15 -0
  526. package/src/showcase/demos/ai/voice-waveform.svelte +24 -0
  527. package/src/showcase/demos/effects/animated-beam.svelte +50 -0
  528. package/src/showcase/demos/effects/animated-group.svelte +47 -0
  529. package/src/showcase/demos/effects/border-beam-default.svelte +20 -0
  530. package/src/showcase/demos/effects/border-beam-line.svelte +20 -0
  531. package/src/showcase/demos/effects/border-beam-mono.svelte +20 -0
  532. package/src/showcase/demos/effects/border-beam-sunset.svelte +20 -0
  533. package/src/showcase/demos/effects/image-comparison.svelte +25 -0
  534. package/src/showcase/demos/effects/image-reveal.svelte +49 -0
  535. package/src/showcase/demos/effects/in-view.svelte +41 -0
  536. package/src/showcase/demos/effects/integrations-hub.svelte +82 -0
  537. package/src/showcase/demos/effects/magnetic.svelte +31 -0
  538. package/src/showcase/demos/effects/marquee.svelte +33 -0
  539. package/src/showcase/demos/effects/progressive-blur.svelte +47 -0
  540. package/src/showcase/demos/effects/spotlight.svelte +40 -0
  541. package/src/showcase/demos/effects/text-effect.svelte +55 -0
  542. package/src/showcase/demos/shadcn/accordion.svelte +45 -0
  543. package/src/showcase/demos/shadcn/alert-dialog.svelte +23 -0
  544. package/src/showcase/demos/shadcn/alert.svelte +30 -0
  545. package/src/showcase/demos/shadcn/attachment.svelte +71 -0
  546. package/src/showcase/demos/shadcn/avatar.svelte +30 -0
  547. package/src/showcase/demos/shadcn/badge.svelte +26 -0
  548. package/src/showcase/demos/shadcn/breadcrumb.svelte +34 -0
  549. package/src/showcase/demos/shadcn/bubble.svelte +36 -0
  550. package/src/showcase/demos/shadcn/button.svelte +11 -0
  551. package/src/showcase/demos/shadcn/calendar.svelte +8 -0
  552. package/src/showcase/demos/shadcn/card.svelte +39 -0
  553. package/src/showcase/demos/shadcn/checkbox.svelte +39 -0
  554. package/src/showcase/demos/shadcn/collapsible.svelte +20 -0
  555. package/src/showcase/demos/shadcn/command.svelte +48 -0
  556. package/src/showcase/demos/shadcn/context-menu.svelte +54 -0
  557. package/src/showcase/demos/shadcn/demo-harness.svelte +12 -0
  558. package/src/showcase/demos/shadcn/demos.test.ts +20 -0
  559. package/src/showcase/demos/shadcn/dialog.svelte +38 -0
  560. package/src/showcase/demos/shadcn/dropdown-menu.svelte +59 -0
  561. package/src/showcase/demos/shadcn/empty.svelte +29 -0
  562. package/src/showcase/demos/shadcn/field.svelte +115 -0
  563. package/src/showcase/demos/shadcn/hover-card.svelte +32 -0
  564. package/src/showcase/demos/shadcn/index.ts +358 -0
  565. package/src/showcase/demos/shadcn/input-otp.svelte +19 -0
  566. package/src/showcase/demos/shadcn/input.svelte +5 -0
  567. package/src/showcase/demos/shadcn/label.svelte +11 -0
  568. package/src/showcase/demos/shadcn/marker.svelte +30 -0
  569. package/src/showcase/demos/shadcn/message.svelte +75 -0
  570. package/src/showcase/demos/shadcn/popover.svelte +36 -0
  571. package/src/showcase/demos/shadcn/progress.svelte +13 -0
  572. package/src/showcase/demos/shadcn/radio-group.svelte +19 -0
  573. package/src/showcase/demos/shadcn/scroll-area.svelte +18 -0
  574. package/src/showcase/demos/shadcn/select.svelte +29 -0
  575. package/src/showcase/demos/shadcn/separator.svelte +12 -0
  576. package/src/showcase/demos/shadcn/sheet.svelte +48 -0
  577. package/src/showcase/demos/shadcn/skeleton.svelte +11 -0
  578. package/src/showcase/demos/shadcn/slider.svelte +7 -0
  579. package/src/showcase/demos/shadcn/sonner.svelte +18 -0
  580. package/src/showcase/demos/shadcn/spinner.svelte +11 -0
  581. package/src/showcase/demos/shadcn/switch.svelte +9 -0
  582. package/src/showcase/demos/shadcn/table.svelte +76 -0
  583. package/src/showcase/demos/shadcn/tabs.svelte +62 -0
  584. package/src/showcase/demos/shadcn/textarea.svelte +5 -0
  585. package/src/showcase/demos/shadcn/toggle-group.svelte +18 -0
  586. package/src/showcase/demos/shadcn/toggle.svelte +14 -0
  587. package/src/showcase/demos/shadcn/tooltip.svelte +13 -0
  588. package/src/showcase/heart.svg +1 -0
  589. package/src/showcase/index.ts +38 -0
  590. package/src/showcase/kit.test.ts +72 -0
  591. package/src/showcase/kit.ts +17 -0
  592. package/src/showcase/plus.svg +1 -0
  593. package/src/showcase/showcase-shell.css +91 -0
  594. package/src/showcase/stacked-section.css +15 -0
  595. package/src/showcase/success-check.svg +1 -0
  596. package/src/showcase/types.ts +29 -0
  597. package/src/svg-raw.d.ts +7 -0
  598. package/src/test-setup.ts +34 -0
  599. package/src/tokens.css +993 -0
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+
4
+ let { ...restProps }: SelectPrimitive.PortalProps = $props();
5
+ </script>
6
+
7
+ <SelectPrimitive.Portal {...restProps} />
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+ import { cn, type WithoutChildrenOrChild } from "@heyramzi/utils";
4
+ import { CaretDown } from "phosphor-svelte";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ ...restProps
10
+ }: WithoutChildrenOrChild<SelectPrimitive.ScrollDownButtonProps> = $props();
11
+ </script>
12
+
13
+ <SelectPrimitive.ScrollDownButton
14
+ bind:ref
15
+ data-slot="select-scroll-down-button"
16
+ class={cn(
17
+ "bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4 bottom-0 w-full",
18
+ className,
19
+ )}
20
+ {...restProps}
21
+ >
22
+ <CaretDown size={16} />
23
+ </SelectPrimitive.ScrollDownButton>
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+ import { cn, type WithoutChildrenOrChild } from "@heyramzi/utils";
4
+ import { CaretUp } from "phosphor-svelte";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ ...restProps
10
+ }: WithoutChildrenOrChild<SelectPrimitive.ScrollUpButtonProps> = $props();
11
+ </script>
12
+
13
+ <SelectPrimitive.ScrollUpButton
14
+ bind:ref
15
+ data-slot="select-scroll-up-button"
16
+ class={cn(
17
+ "bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4 top-0 w-full",
18
+ className,
19
+ )}
20
+ {...restProps}
21
+ >
22
+ <CaretUp size={16} />
23
+ </SelectPrimitive.ScrollUpButton>
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ import type { Separator as SeparatorPrimitive } from "bits-ui";
3
+ import { Separator } from "../separator/index.js";
4
+ import { cn } from "@heyramzi/utils";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ ...restProps
10
+ }: SeparatorPrimitive.RootProps = $props();
11
+ </script>
12
+
13
+ <Separator
14
+ bind:ref
15
+ data-slot="select-separator"
16
+ class={cn("bg-border -mx-1 my-1 h-px pointer-events-none", className)}
17
+ {...restProps}
18
+ />
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+ import { cn, type WithoutChild } from "@heyramzi/utils";
4
+ import { CaretDown } from "phosphor-svelte";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ children,
10
+ size = "default",
11
+ ...restProps
12
+ }: WithoutChild<SelectPrimitive.TriggerProps> & {
13
+ size?: "sm" | "default";
14
+ } = $props();
15
+ </script>
16
+
17
+ <SelectPrimitive.Trigger
18
+ bind:ref
19
+ data-slot="select-trigger"
20
+ data-size={size}
21
+ class={cn(
22
+ "border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-md border bg-transparent py-1 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:text-[0.8rem] relative data-[size=sm]:after:absolute data-[size=sm]:after:top-1/2 data-[size=sm]:after:left-0 data-[size=sm]:after:h-[max(100%,2rem)] data-[size=sm]:after:w-full data-[size=sm]:after:-translate-y-1/2 *:data-[slot=select-value]:flex *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
23
+ className,
24
+ )}
25
+ {...restProps}
26
+ >
27
+ {@render children?.()}
28
+ <!-- Turns over while the list is open, so the trigger says which way it goes. -->
29
+ <CaretDown
30
+ size={16}
31
+ class="text-muted-foreground pointer-events-none transition-transform duration-[var(--duration-fast)] ease-[var(--ease-smooth-out)] in-data-[state=open]:rotate-180 motion-reduce:transition-none"
32
+ />
33
+ </SelectPrimitive.Trigger>
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+
4
+ let {
5
+ open = $bindable(false),
6
+ value = $bindable(),
7
+ ...restProps
8
+ }: SelectPrimitive.RootProps = $props();
9
+ </script>
10
+
11
+ <SelectPrimitive.Root bind:open bind:value={value as never} {...restProps} />
@@ -0,0 +1,7 @@
1
+ import Root from "./separator.svelte";
2
+
3
+ export {
4
+ Root,
5
+ //
6
+ Root as Separator,
7
+ };
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { Separator as SeparatorPrimitive } from "bits-ui";
3
+ import { cn } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ "data-slot": dataSlot = "separator",
9
+ ...restProps
10
+ }: SeparatorPrimitive.RootProps = $props();
11
+ </script>
12
+
13
+ <SeparatorPrimitive.Root
14
+ bind:ref
15
+ data-slot={dataSlot}
16
+ class={cn(
17
+ "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px",
18
+ // this is different in shadcn/ui but self-stretch breaks things for us
19
+ "data-[orientation=vertical]:h-full",
20
+ className,
21
+ )}
22
+ {...restProps}
23
+ />
@@ -0,0 +1,34 @@
1
+ import Root from "./sheet.svelte";
2
+ import Portal from "./sheet-portal.svelte";
3
+ import Trigger from "./sheet-trigger.svelte";
4
+ import Close from "./sheet-close.svelte";
5
+ import Overlay from "./sheet-overlay.svelte";
6
+ import Content from "./sheet-content.svelte";
7
+ import Header from "./sheet-header.svelte";
8
+ import Footer from "./sheet-footer.svelte";
9
+ import Title from "./sheet-title.svelte";
10
+ import Description from "./sheet-description.svelte";
11
+
12
+ export {
13
+ Root,
14
+ Close,
15
+ Trigger,
16
+ Portal,
17
+ Overlay,
18
+ Content,
19
+ Header,
20
+ Footer,
21
+ Title,
22
+ Description,
23
+ //
24
+ Root as Sheet,
25
+ Close as SheetClose,
26
+ Trigger as SheetTrigger,
27
+ Portal as SheetPortal,
28
+ Overlay as SheetOverlay,
29
+ Content as SheetContent,
30
+ Header as SheetHeader,
31
+ Footer as SheetFooter,
32
+ Title as SheetTitle,
33
+ Description as SheetDescription,
34
+ };
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: SheetPrimitive.CloseProps = $props();
5
+ </script>
6
+
7
+ <SheetPrimitive.Close bind:ref data-slot="sheet-close" {...restProps} />
@@ -0,0 +1,72 @@
1
+ <script lang="ts" module>
2
+ // Sheets slide in from the left, right or bottom. `top` never had a caller.
3
+ export type Side = "left" | "right" | "bottom";
4
+ </script>
5
+
6
+ <script lang="ts">
7
+ import { Dialog as SheetPrimitive } from "bits-ui";
8
+ import type { Snippet } from "svelte";
9
+ import SheetPortal from "./sheet-portal.svelte";
10
+ import SheetOverlay from "./sheet-overlay.svelte";
11
+ import { Button } from "../button/index.js";
12
+ import { X } from "phosphor-svelte";
13
+ import { cn, type WithoutChildrenOrChild } from "@heyramzi/utils";
14
+ import type { ComponentProps } from "svelte";
15
+
16
+ let {
17
+ ref = $bindable(null),
18
+ class: className,
19
+ side = "right",
20
+ showCloseButton = true,
21
+ portalProps,
22
+ children,
23
+ ...restProps
24
+ }: WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {
25
+ portalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>;
26
+ side?: Side;
27
+ showCloseButton?: boolean;
28
+ children: Snippet;
29
+ } = $props();
30
+
31
+ // Side classes are plain utilities, not `data-[side=x]:` variants. An attribute
32
+ // variant outranks a plain class and tailwind-merge won't dedupe across
33
+ // modifier sets, so a caller's `sm:max-w-xl` lost to the default 384px.
34
+ // Plain utilities let `cn` drop the default when a caller passes its own.
35
+ const SIDE_CLASS: Record<Side, string> = {
36
+ // h-dvh, not h-full: on iOS Safari a fixed panel sizes against the layout
37
+ // viewport, which is taller than the visible area, so h-full hides the footer.
38
+ right: "inset-y-0 right-0 h-dvh w-3/4 border-l sm:max-w-sm",
39
+ left: "inset-y-0 left-0 h-dvh w-3/4 border-r sm:max-w-sm",
40
+ // Full width, capped at 80vh so the overlay stays visible. The safe-area
41
+ // padding keeps the last row clear of the home indicator.
42
+ bottom:
43
+ "inset-x-0 bottom-0 h-auto max-h-[80vh] w-full rounded-t-lg border-t pb-[env(safe-area-inset-bottom)]",
44
+ };
45
+ </script>
46
+
47
+ <SheetPortal {...portalProps}>
48
+ <SheetOverlay />
49
+ <SheetPrimitive.Content
50
+ bind:ref
51
+ data-slot="sheet-content"
52
+ data-side={side}
53
+ class={cn(
54
+ "t-sheet bg-background fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-overlay",
55
+ SIDE_CLASS[side],
56
+ className,
57
+ )}
58
+ {...restProps}
59
+ >
60
+ {@render children?.()}
61
+ {#if showCloseButton}
62
+ <SheetPrimitive.Close data-slot="sheet-close">
63
+ {#snippet child({ props })}
64
+ <Button variant="ghost" class="absolute top-3 right-3" size="sm" icon {...props}>
65
+ <X size={16} />
66
+ <span class="sr-only">Close</span>
67
+ </Button>
68
+ {/snippet}
69
+ </SheetPrimitive.Close>
70
+ {/if}
71
+ </SheetPrimitive.Content>
72
+ </SheetPortal>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+ import { cn } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.DescriptionProps = $props();
10
+ </script>
11
+
12
+ <SheetPrimitive.Description
13
+ bind:ref
14
+ data-slot="sheet-description"
15
+ class={cn("text-muted-foreground text-sm", className)}
16
+ {...restProps}
17
+ />
@@ -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<HTMLDivElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="sheet-footer"
16
+ class={cn("gap-2 p-4 mt-auto flex flex-col", className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ import { cn, type WithElementRef } from "@heyramzi/utils";
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="sheet-header"
16
+ class={cn("gap-0.5 p-4 flex flex-col", className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+ import { cn } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.OverlayProps = $props();
10
+ </script>
11
+
12
+ <SheetPrimitive.Overlay
13
+ bind:ref
14
+ data-slot="sheet-overlay"
15
+ class={cn(
16
+ "t-modal-backdrop bg-black/10 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50",
17
+ className,
18
+ )}
19
+ {...restProps}
20
+ />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+
4
+ let { ...restProps }: SheetPrimitive.PortalProps = $props();
5
+ </script>
6
+
7
+ <SheetPrimitive.Portal {...restProps} />
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+ import { cn } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.TitleProps = $props();
10
+ </script>
11
+
12
+ <SheetPrimitive.Title
13
+ bind:ref
14
+ data-slot="sheet-title"
15
+ class={cn("text-foreground text-base font-medium", className)}
16
+ {...restProps}
17
+ />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: SheetPrimitive.TriggerProps = $props();
5
+ </script>
6
+
7
+ <SheetPrimitive.Trigger bind:ref data-slot="sheet-trigger" {...restProps} />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from "bits-ui";
3
+
4
+ let { open = $bindable(false), ...restProps }: SheetPrimitive.RootProps = $props();
5
+ </script>
6
+
7
+ <SheetPrimitive.Root bind:open {...restProps} />
@@ -0,0 +1,6 @@
1
+ export const SIDEBAR_COOKIE_NAME = "sidebar:state";
2
+ export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
3
+ export const SIDEBAR_WIDTH = "16rem";
4
+ export const SIDEBAR_WIDTH_MOBILE = "18rem";
5
+ export const SIDEBAR_WIDTH_ICON = "3rem";
6
+ export const SIDEBAR_KEYBOARD_SHORTCUT = "s";
@@ -0,0 +1,81 @@
1
+ import { IsMobile } from "../hooks/is-mobile.svelte.js";
2
+ import { getContext, setContext } from "svelte";
3
+ import { SIDEBAR_KEYBOARD_SHORTCUT } from "./constants.js";
4
+
5
+ type Getter<T> = () => T;
6
+
7
+ type SidebarStateProps = {
8
+ /**
9
+ * A getter function that returns the current open state of the sidebar.
10
+ * We use a getter function here to support `bind:open` on the `Sidebar.Provider`
11
+ * component.
12
+ */
13
+ open: Getter<boolean>;
14
+
15
+ /**
16
+ * A function that sets the open state of the sidebar.
17
+ */
18
+
19
+ /*
20
+ * To support `bind:open`, we need a source of truth for changing the open state to ensure it will be synced throughout the sub-components and any `bind:` references.
21
+ */
22
+ setOpen: (open: boolean) => void;
23
+ };
24
+
25
+ class SidebarState {
26
+ readonly props: SidebarStateProps;
27
+ open = $derived.by(() => this.props.open());
28
+ openMobile = $state(false);
29
+ setOpen: SidebarStateProps["setOpen"];
30
+ #isMobile: IsMobile;
31
+ state = $derived.by(() => (this.open ? "expanded" : "collapsed"));
32
+
33
+ constructor(props: SidebarStateProps) {
34
+ this.setOpen = props.setOpen;
35
+ this.#isMobile = new IsMobile();
36
+ this.props = props;
37
+ }
38
+
39
+ // Convenience getter for checking if the sidebar is mobile
40
+ // without this, we would need to use `sidebar.isMobile.current` everywhere
41
+ get isMobile() {
42
+ return this.#isMobile.current;
43
+ }
44
+
45
+ // Event handler to apply to the `<svelte:window>`
46
+ handleShortcutKeydown = (e: KeyboardEvent) => {
47
+ if (e.key === SIDEBAR_KEYBOARD_SHORTCUT && (e.metaKey || e.ctrlKey)) {
48
+ e.preventDefault();
49
+ this.toggle();
50
+ }
51
+ };
52
+
53
+ setOpenMobile = (value: boolean) => {
54
+ this.openMobile = value;
55
+ };
56
+
57
+ toggle = () => {
58
+ return this.#isMobile.current ? (this.openMobile = !this.openMobile) : this.setOpen(!this.open);
59
+ };
60
+ }
61
+
62
+ const SYMBOL_KEY = "scn-sidebar";
63
+
64
+ /**
65
+ * Instantiates a new `SidebarState` instance and sets it in the context.
66
+ *
67
+ * @param props The constructor props for the `SidebarState` class.
68
+ * @returns The `SidebarState` instance.
69
+ */
70
+ export function setSidebar(props: SidebarStateProps): SidebarState {
71
+ return setContext(Symbol.for(SYMBOL_KEY), new SidebarState(props));
72
+ }
73
+
74
+ /**
75
+ * Retrieves the `SidebarState` instance from the context. This is a class instance,
76
+ * so you cannot destructure it.
77
+ * @returns The `SidebarState` instance.
78
+ */
79
+ export function useSidebar(): SidebarState {
80
+ return getContext(Symbol.for(SYMBOL_KEY));
81
+ }
@@ -0,0 +1,75 @@
1
+ import { useSidebar } from "./context.svelte.js";
2
+ import Content from "./sidebar-content.svelte";
3
+ import Footer from "./sidebar-footer.svelte";
4
+ import GroupAction from "./sidebar-group-action.svelte";
5
+ import GroupContent from "./sidebar-group-content.svelte";
6
+ import GroupLabel from "./sidebar-group-label.svelte";
7
+ import Group from "./sidebar-group.svelte";
8
+ import Header from "./sidebar-header.svelte";
9
+ import Input from "./sidebar-input.svelte";
10
+ import Inset from "./sidebar-inset.svelte";
11
+ import MenuAction from "./sidebar-menu-action.svelte";
12
+ import MenuBadge from "./sidebar-menu-badge.svelte";
13
+ import MenuButton from "./sidebar-menu-button.svelte";
14
+ import MenuItem from "./sidebar-menu-item.svelte";
15
+ import MenuSkeleton from "./sidebar-menu-skeleton.svelte";
16
+ import MenuSubButton from "./sidebar-menu-sub-button.svelte";
17
+ import MenuSubItem from "./sidebar-menu-sub-item.svelte";
18
+ import MenuSub from "./sidebar-menu-sub.svelte";
19
+ import Menu from "./sidebar-menu.svelte";
20
+ import Provider from "./sidebar-provider.svelte";
21
+ import Rail from "./sidebar-rail.svelte";
22
+ import Separator from "./sidebar-separator.svelte";
23
+ import Trigger from "./sidebar-trigger.svelte";
24
+ import Root from "./sidebar.svelte";
25
+
26
+ export {
27
+ Content,
28
+ Footer,
29
+ Group,
30
+ GroupAction,
31
+ GroupContent,
32
+ GroupLabel,
33
+ Header,
34
+ Input,
35
+ Inset,
36
+ Menu,
37
+ MenuAction,
38
+ MenuBadge,
39
+ MenuButton,
40
+ MenuItem,
41
+ MenuSkeleton,
42
+ MenuSub,
43
+ MenuSubButton,
44
+ MenuSubItem,
45
+ Provider,
46
+ Rail,
47
+ Root,
48
+ Separator,
49
+ //
50
+ Root as Sidebar,
51
+ Content as SidebarContent,
52
+ Footer as SidebarFooter,
53
+ Group as SidebarGroup,
54
+ GroupAction as SidebarGroupAction,
55
+ GroupContent as SidebarGroupContent,
56
+ GroupLabel as SidebarGroupLabel,
57
+ Header as SidebarHeader,
58
+ Input as SidebarInput,
59
+ Inset as SidebarInset,
60
+ Menu as SidebarMenu,
61
+ MenuAction as SidebarMenuAction,
62
+ MenuBadge as SidebarMenuBadge,
63
+ MenuButton as SidebarMenuButton,
64
+ MenuItem as SidebarMenuItem,
65
+ MenuSkeleton as SidebarMenuSkeleton,
66
+ MenuSub as SidebarMenuSub,
67
+ MenuSubButton as SidebarMenuSubButton,
68
+ MenuSubItem as SidebarMenuSubItem,
69
+ Provider as SidebarProvider,
70
+ Rail as SidebarRail,
71
+ Separator as SidebarSeparator,
72
+ Trigger as SidebarTrigger,
73
+ Trigger,
74
+ useSidebar,
75
+ };
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ import { cn, type WithElementRef } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="sidebar-content"
16
+ data-sidebar="content"
17
+ class={cn(
18
+ "no-scrollbar gap-0 flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden",
19
+ className,
20
+ )}
21
+ {...restProps}
22
+ >
23
+ {@render children?.()}
24
+ </div>
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ import { cn, type WithElementRef } from "@heyramzi/utils";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="sidebar-footer"
16
+ data-sidebar="footer"
17
+ class={cn("gap-2 p-2 flex flex-col", className)}
18
+ {...restProps}
19
+ >
20
+ {@render children?.()}
21
+ </div>
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from "@heyramzi/utils";
3
+ import type { Snippet } from "svelte";
4
+ import type { HTMLButtonAttributes } from "svelte/elements";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ children,
10
+ child,
11
+ ...restProps
12
+ }: WithElementRef<HTMLButtonAttributes> & {
13
+ child?: Snippet<[{ props: Record<string, unknown> }]>;
14
+ } = $props();
15
+
16
+ const mergedProps = $derived({
17
+ class: cn(
18
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 w-5 rounded-md p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 lg:after:hidden [&>svg]:shrink-0",
19
+ className,
20
+ ),
21
+ "data-slot": "sidebar-group-action",
22
+ "data-sidebar": "group-action",
23
+ ...restProps,
24
+ });
25
+ </script>
26
+
27
+ {#if child}
28
+ {@render child({ props: mergedProps })}
29
+ {:else}
30
+ <button bind:this={ref} {...mergedProps}>
31
+ {@render children?.()}
32
+ </button>
33
+ {/if}
@@ -0,0 +1,21 @@
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="sidebar-group-content"
16
+ data-sidebar="group-content"
17
+ class={cn("text-sm w-full", className)}
18
+ {...restProps}
19
+ >
20
+ {@render children?.()}
21
+ </div>