@heyramzi/ui 0.0.0-stage → 6.0.1

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 (584) hide show
  1. package/COMPONENTS.md +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +125 -2
  4. package/package.json +209 -3
  5. package/scripts/lib/sync-core.mjs +113 -0
  6. package/scripts/relative-imports.mjs +39 -0
  7. package/scripts/sf-symbol.mjs +93 -0
  8. package/scripts/sync-shadcn.mjs +341 -0
  9. package/scripts/sync-transitions.mjs +146 -0
  10. package/scripts/validate-apple-symbol-exports.mjs +45 -0
  11. package/src/ai/composer/Composer.css +108 -0
  12. package/src/ai/composer/Composer.svelte +111 -0
  13. package/src/ai/composer/index.ts +10 -0
  14. package/src/ai/confirmation/Confirmation.svelte +54 -0
  15. package/src/ai/confirmation/ConfirmationAccepted.svelte +23 -0
  16. package/src/ai/confirmation/ConfirmationAction.svelte +53 -0
  17. package/src/ai/confirmation/ConfirmationActions.svelte +24 -0
  18. package/src/ai/confirmation/ConfirmationFailed.svelte +23 -0
  19. package/src/ai/confirmation/ConfirmationRejected.svelte +23 -0
  20. package/src/ai/confirmation/ConfirmationRequest.svelte +25 -0
  21. package/src/ai/confirmation/ConfirmationTitle.svelte +25 -0
  22. package/src/ai/confirmation/confirmation-context.svelte.ts +22 -0
  23. package/src/ai/confirmation/index.ts +50 -0
  24. package/src/ai/conversation/Conversation.svelte +28 -0
  25. package/src/ai/conversation/ConversationContent.svelte +35 -0
  26. package/src/ai/conversation/ConversationEmptyState.svelte +46 -0
  27. package/src/ai/conversation/ConversationScrollButton.svelte +51 -0
  28. package/src/ai/conversation/index.ts +33 -0
  29. package/src/ai/conversation/stick-to-bottom-context.svelte.ts +131 -0
  30. package/src/ai/index.ts +119 -0
  31. package/src/ai/loading-state/PixelLoader.svelte +138 -0
  32. package/src/ai/loading-state/index.ts +5 -0
  33. package/src/ai/prompt-input/PromptInput.svelte +38 -0
  34. package/src/ai/prompt-input/PromptInputBody.svelte +19 -0
  35. package/src/ai/prompt-input/PromptInputSubmit.svelte +73 -0
  36. package/src/ai/prompt-input/PromptInputTextarea.svelte +74 -0
  37. package/src/ai/prompt-input/PromptInputToolbar.svelte +19 -0
  38. package/src/ai/prompt-input/index.ts +34 -0
  39. package/src/ai/reasoning/Reasoning.svelte +47 -0
  40. package/src/ai/reasoning/ReasoningContent.svelte +27 -0
  41. package/src/ai/reasoning/ReasoningTrigger.svelte +48 -0
  42. package/src/ai/reasoning/index.ts +22 -0
  43. package/src/ai/reasoning/reasoning-context.svelte.ts +20 -0
  44. package/src/ai/response/Response.css +32 -0
  45. package/src/ai/response/Response.svelte +130 -0
  46. package/src/ai/response/index.ts +5 -0
  47. package/src/ai/suggestion/Suggestion.svelte +43 -0
  48. package/src/ai/suggestion/Suggestions.svelte +25 -0
  49. package/src/ai/suggestion/index.ts +14 -0
  50. package/src/ai/thinking-dots/ThinkingDots.svelte +42 -0
  51. package/src/ai/thinking-dots/index.ts +5 -0
  52. package/src/ai/typing-dots/TypingDots.css +39 -0
  53. package/src/ai/typing-dots/TypingDots.svelte +27 -0
  54. package/src/ai/typing-dots/index.ts +10 -0
  55. package/src/ai/voice-waveform/VoiceWaveform.css +40 -0
  56. package/src/ai/voice-waveform/VoiceWaveform.svelte +46 -0
  57. package/src/ai/voice-waveform/index.ts +5 -0
  58. package/src/animations/README.md +84 -0
  59. package/src/animations/accordion.css +58 -0
  60. package/src/animations/avatar-group-hover.css +47 -0
  61. package/src/animations/card-tilt.css +74 -0
  62. package/src/animations/digit-pop-in.css +78 -0
  63. package/src/animations/dropdown.css +121 -0
  64. package/src/animations/icon-swap.css +43 -0
  65. package/src/animations/index.css +34 -0
  66. package/src/animations/input-clear-dissolve.css +86 -0
  67. package/src/animations/input-shake.css +114 -0
  68. package/src/animations/learn-more-hover.css +48 -0
  69. package/src/animations/like-button.css +93 -0
  70. package/src/animations/modal.css +75 -0
  71. package/src/animations/notification-badge.css +81 -0
  72. package/src/animations/page-side-by-side.css +63 -0
  73. package/src/animations/panel.css +86 -0
  74. package/src/animations/plus-menu-morph.css +97 -0
  75. package/src/animations/reasoning-stream.css +49 -0
  76. package/src/animations/resize.css +20 -0
  77. package/src/animations/shimmer-text.css +72 -0
  78. package/src/animations/skeleton-reveal.css +97 -0
  79. package/src/animations/spinning-counter.css +52 -0
  80. package/src/animations/streaming-text.css +31 -0
  81. package/src/animations/success-check.css +120 -0
  82. package/src/animations/tabs-sliding.css +83 -0
  83. package/src/animations/text-swap.css +40 -0
  84. package/src/animations/text-swap.ts +40 -0
  85. package/src/animations/texts-reveal.css +70 -0
  86. package/src/animations/thinking-states.css +65 -0
  87. package/src/animations/tooltip.css +72 -0
  88. package/src/animations/upstream-coverage.test.ts +65 -0
  89. package/src/animations/view-transition-reveal.ts +74 -0
  90. package/src/charts/animated-value.css +7 -0
  91. package/src/charts/animated-value.svelte +110 -0
  92. package/src/charts/area-chart.css +29 -0
  93. package/src/charts/area-chart.svelte +195 -0
  94. package/src/charts/bar-chart.css +119 -0
  95. package/src/charts/bar-chart.svelte +269 -0
  96. package/src/charts/charts.css +201 -0
  97. package/src/charts/crosshair.svelte +35 -0
  98. package/src/charts/donut-chart.css +56 -0
  99. package/src/charts/donut-chart.svelte +158 -0
  100. package/src/charts/edge-fade.svelte +43 -0
  101. package/src/charts/edge-fade.ts +16 -0
  102. package/src/charts/figure.css +100 -0
  103. package/src/charts/figure.svelte +122 -0
  104. package/src/charts/gauge-chart.css +94 -0
  105. package/src/charts/gauge-chart.svelte +303 -0
  106. package/src/charts/hover-band.test.ts +30 -0
  107. package/src/charts/hover-band.ts +21 -0
  108. package/src/charts/hover-focus.svelte +85 -0
  109. package/src/charts/index.ts +30 -0
  110. package/src/charts/legend.css +131 -0
  111. package/src/charts/legend.svelte +112 -0
  112. package/src/charts/line-chart.css +26 -0
  113. package/src/charts/line-chart.svelte +256 -0
  114. package/src/charts/motion.ts +19 -0
  115. package/src/charts/number-chart.css +168 -0
  116. package/src/charts/number-chart.svelte +177 -0
  117. package/src/charts/primitives/chart-container.svelte +57 -0
  118. package/src/charts/primitives/chart-style.svelte +36 -0
  119. package/src/charts/primitives/chart-tooltip.svelte +161 -0
  120. package/src/charts/primitives/chart-utils.ts +54 -0
  121. package/src/charts/primitives/index.ts +11 -0
  122. package/src/charts/reveal.svelte +61 -0
  123. package/src/charts/ring-chart.css +96 -0
  124. package/src/charts/ring-chart.svelte +158 -0
  125. package/src/charts/sparkline.css +45 -0
  126. package/src/charts/sparkline.svelte +140 -0
  127. package/src/charts/stat-card.css +103 -0
  128. package/src/charts/stat-card.svelte +267 -0
  129. package/src/charts/time-series-chart.css +28 -0
  130. package/src/charts/time-series-chart.svelte +179 -0
  131. package/src/charts/trend-pill.css +38 -0
  132. package/src/charts/trend-pill.svelte +48 -0
  133. package/src/design/index.css +270 -0
  134. package/src/design/polish.css +159 -0
  135. package/src/effects/animated-beam/AnimatedBeam.svelte +132 -0
  136. package/src/effects/animated-beam/diagrams/BeamSvg.svelte +91 -0
  137. package/src/effects/animated-beam/index.ts +2 -0
  138. package/src/effects/animated-beam/path-calculator.svelte.ts +70 -0
  139. package/src/effects/animated-beam/types.ts +23 -0
  140. package/src/effects/border-beam/BorderBeam.svelte +223 -0
  141. package/src/effects/border-beam/css.test.ts +46 -0
  142. package/src/effects/border-beam/css.ts +574 -0
  143. package/src/effects/border-beam/presets.ts +699 -0
  144. package/src/effects/border-beam/register-properties.test.ts +74 -0
  145. package/src/effects/border-beam/register-properties.ts +73 -0
  146. package/src/effects/border-beam/types.ts +38 -0
  147. package/src/effects/image-comparison/ImageComparison.css +66 -0
  148. package/src/effects/image-comparison/ImageComparison.svelte +92 -0
  149. package/src/effects/image-reveal/ImageReveal.css +10 -0
  150. package/src/effects/image-reveal/ImageReveal.svelte +357 -0
  151. package/src/effects/image-reveal/index.ts +2 -0
  152. package/src/effects/image-reveal/types.ts +35 -0
  153. package/src/effects/magnetic/magnetic.ts +81 -0
  154. package/src/effects/marquee/Marquee.css +52 -0
  155. package/src/effects/marquee/Marquee.svelte +96 -0
  156. package/src/effects/progressive-blur/ProgressiveBlur.css +9 -0
  157. package/src/effects/progressive-blur/ProgressiveBlur.svelte +63 -0
  158. package/src/effects/reveal/AnimatedGroup.svelte +101 -0
  159. package/src/effects/reveal/InView.svelte +77 -0
  160. package/src/effects/reveal/TextEffect.svelte +142 -0
  161. package/src/effects/reveal/index.ts +10 -0
  162. package/src/effects/reveal/observe.ts +33 -0
  163. package/src/effects/reveal/reveal.css +141 -0
  164. package/src/effects/reveal/types.ts +25 -0
  165. package/src/effects/shader-gradient/ShaderGradient.svelte +227 -0
  166. package/src/effects/shader-gradient/color.ts +44 -0
  167. package/src/effects/shader-gradient/index.ts +5 -0
  168. package/src/effects/shader-gradient/renderer.ts +456 -0
  169. package/src/effects/shader-gradient/shaders.ts +324 -0
  170. package/src/effects/shader-gradient/types.ts +68 -0
  171. package/src/effects/spotlight/Spotlight.css +14 -0
  172. package/src/effects/spotlight/Spotlight.svelte +61 -0
  173. package/src/effects/theme-toggle/ThemeToggle.css +21 -0
  174. package/src/effects/theme-toggle/ThemeToggle.svelte +101 -0
  175. package/src/icons/TradeIcon.svelte +16 -0
  176. package/src/icons/apple-symbol-exports.ts +135 -0
  177. package/src/icons/sf-symbols.ts +527 -0
  178. package/src/icons/trades.ts +89 -0
  179. package/src/index.ts +49 -0
  180. package/src/lib/arrive.ts +26 -0
  181. package/src/lib/hooks/is-mobile.svelte.ts +11 -0
  182. package/src/lib/icon-types.ts +17 -0
  183. package/src/lib/layout.ts +8 -0
  184. package/src/lib/panel.ts +15 -0
  185. package/src/lib/theme-transition.ts +51 -0
  186. package/src/lib/utils.ts +45 -0
  187. package/src/shadcn/accordion/accordion-content.svelte +22 -0
  188. package/src/shadcn/accordion/accordion-item.svelte +17 -0
  189. package/src/shadcn/accordion/accordion-trigger.svelte +35 -0
  190. package/src/shadcn/accordion/accordion.svelte +19 -0
  191. package/src/shadcn/accordion/index.ts +16 -0
  192. package/src/shadcn/alert/alert-description.svelte +23 -0
  193. package/src/shadcn/alert/alert-title.svelte +20 -0
  194. package/src/shadcn/alert/alert.svelte +44 -0
  195. package/src/shadcn/alert/index.ts +14 -0
  196. package/src/shadcn/alert-dialog/alert-dialog-action.svelte +18 -0
  197. package/src/shadcn/alert-dialog/alert-dialog-cancel.svelte +18 -0
  198. package/src/shadcn/alert-dialog/alert-dialog-content.svelte +29 -0
  199. package/src/shadcn/alert-dialog/alert-dialog-description.svelte +17 -0
  200. package/src/shadcn/alert-dialog/alert-dialog-footer.svelte +20 -0
  201. package/src/shadcn/alert-dialog/alert-dialog-header.svelte +20 -0
  202. package/src/shadcn/alert-dialog/alert-dialog-overlay.svelte +17 -0
  203. package/src/shadcn/alert-dialog/alert-dialog-portal.svelte +7 -0
  204. package/src/shadcn/alert-dialog/alert-dialog-title.svelte +17 -0
  205. package/src/shadcn/alert-dialog/alert-dialog-trigger.svelte +7 -0
  206. package/src/shadcn/alert-dialog/alert-dialog.svelte +7 -0
  207. package/src/shadcn/alert-dialog/index.ts +37 -0
  208. package/src/shadcn/attachment/attachment-action.svelte +23 -0
  209. package/src/shadcn/attachment/attachment-actions.svelte +23 -0
  210. package/src/shadcn/attachment/attachment-content.svelte +23 -0
  211. package/src/shadcn/attachment/attachment-description.svelte +23 -0
  212. package/src/shadcn/attachment/attachment-group.svelte +23 -0
  213. package/src/shadcn/attachment/attachment-media.svelte +44 -0
  214. package/src/shadcn/attachment/attachment-title.svelte +23 -0
  215. package/src/shadcn/attachment/attachment-trigger.svelte +29 -0
  216. package/src/shadcn/attachment/attachment.svelte +55 -0
  217. package/src/shadcn/attachment/index.ts +40 -0
  218. package/src/shadcn/avatar/avatar-badge.svelte +26 -0
  219. package/src/shadcn/avatar/avatar-fallback.svelte +20 -0
  220. package/src/shadcn/avatar/avatar-group-count.svelte +23 -0
  221. package/src/shadcn/avatar/avatar-group.svelte +23 -0
  222. package/src/shadcn/avatar/avatar-image.svelte +17 -0
  223. package/src/shadcn/avatar/avatar.svelte +26 -0
  224. package/src/shadcn/avatar/index.ts +22 -0
  225. package/src/shadcn/badge/badge.svelte +53 -0
  226. package/src/shadcn/badge/index.ts +2 -0
  227. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
  228. package/src/shadcn/breadcrumb/breadcrumb-item.svelte +20 -0
  229. package/src/shadcn/breadcrumb/breadcrumb-link.svelte +31 -0
  230. package/src/shadcn/breadcrumb/breadcrumb-list.svelte +23 -0
  231. package/src/shadcn/breadcrumb/breadcrumb-page.svelte +23 -0
  232. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +27 -0
  233. package/src/shadcn/breadcrumb/breadcrumb.svelte +21 -0
  234. package/src/shadcn/breadcrumb/index.ts +25 -0
  235. package/src/shadcn/bubble/bubble-content.svelte +31 -0
  236. package/src/shadcn/bubble/bubble-group.svelte +20 -0
  237. package/src/shadcn/bubble/bubble-reactions.svelte +52 -0
  238. package/src/shadcn/bubble/bubble.svelte +58 -0
  239. package/src/shadcn/bubble/index.ts +25 -0
  240. package/src/shadcn/button/button.svelte +121 -0
  241. package/src/shadcn/button/index.ts +17 -0
  242. package/src/shadcn/calendar/calendar-caption.svelte +76 -0
  243. package/src/shadcn/calendar/calendar-cell.svelte +19 -0
  244. package/src/shadcn/calendar/calendar-day.svelte +35 -0
  245. package/src/shadcn/calendar/calendar-grid-body.svelte +12 -0
  246. package/src/shadcn/calendar/calendar-grid-head.svelte +12 -0
  247. package/src/shadcn/calendar/calendar-grid-row.svelte +12 -0
  248. package/src/shadcn/calendar/calendar-grid.svelte +16 -0
  249. package/src/shadcn/calendar/calendar-head-cell.svelte +19 -0
  250. package/src/shadcn/calendar/calendar-header.svelte +19 -0
  251. package/src/shadcn/calendar/calendar-heading.svelte +16 -0
  252. package/src/shadcn/calendar/calendar-month-select.svelte +44 -0
  253. package/src/shadcn/calendar/calendar-month.svelte +15 -0
  254. package/src/shadcn/calendar/calendar-months.svelte +19 -0
  255. package/src/shadcn/calendar/calendar-nav.svelte +19 -0
  256. package/src/shadcn/calendar/calendar-next-button.svelte +31 -0
  257. package/src/shadcn/calendar/calendar-prev-button.svelte +31 -0
  258. package/src/shadcn/calendar/calendar-year-select.svelte +43 -0
  259. package/src/shadcn/calendar/calendar.svelte +118 -0
  260. package/src/shadcn/calendar/index.ts +40 -0
  261. package/src/shadcn/card/card-action.svelte +23 -0
  262. package/src/shadcn/card/card-content.svelte +20 -0
  263. package/src/shadcn/card/card-description.svelte +20 -0
  264. package/src/shadcn/card/card-footer.svelte +23 -0
  265. package/src/shadcn/card/card-header.svelte +23 -0
  266. package/src/shadcn/card/card-title.svelte +29 -0
  267. package/src/shadcn/card/card.svelte +25 -0
  268. package/src/shadcn/card/index.ts +25 -0
  269. package/src/shadcn/checkbox/checkbox.svelte +38 -0
  270. package/src/shadcn/checkbox/index.ts +6 -0
  271. package/src/shadcn/collapsible/collapsible-content.svelte +7 -0
  272. package/src/shadcn/collapsible/collapsible-trigger.svelte +7 -0
  273. package/src/shadcn/collapsible/collapsible.svelte +11 -0
  274. package/src/shadcn/collapsible/index.ts +13 -0
  275. package/src/shadcn/command/command-dialog.svelte +66 -0
  276. package/src/shadcn/command/command-empty.svelte +17 -0
  277. package/src/shadcn/command/command-group.svelte +40 -0
  278. package/src/shadcn/command/command-input.svelte +64 -0
  279. package/src/shadcn/command/command-item.svelte +37 -0
  280. package/src/shadcn/command/command-link-item.svelte +20 -0
  281. package/src/shadcn/command/command-list.svelte +20 -0
  282. package/src/shadcn/command/command-loading.svelte +7 -0
  283. package/src/shadcn/command/command-separator.svelte +17 -0
  284. package/src/shadcn/command/command-shortcut.svelte +23 -0
  285. package/src/shadcn/command/command.svelte +28 -0
  286. package/src/shadcn/command/index.ts +37 -0
  287. package/src/shadcn/context-menu/context-menu-checkbox-item.svelte +41 -0
  288. package/src/shadcn/context-menu/context-menu-content.svelte +28 -0
  289. package/src/shadcn/context-menu/context-menu-group-heading.svelte +21 -0
  290. package/src/shadcn/context-menu/context-menu-group.svelte +7 -0
  291. package/src/shadcn/context-menu/context-menu-item.svelte +27 -0
  292. package/src/shadcn/context-menu/context-menu-label.svelte +27 -0
  293. package/src/shadcn/context-menu/context-menu-portal.svelte +7 -0
  294. package/src/shadcn/context-menu/context-menu-radio-group.svelte +16 -0
  295. package/src/shadcn/context-menu/context-menu-radio-item.svelte +35 -0
  296. package/src/shadcn/context-menu/context-menu-separator.svelte +17 -0
  297. package/src/shadcn/context-menu/context-menu-shortcut.svelte +23 -0
  298. package/src/shadcn/context-menu/context-menu-sub-content.svelte +25 -0
  299. package/src/shadcn/context-menu/context-menu-sub-trigger.svelte +29 -0
  300. package/src/shadcn/context-menu/context-menu-sub.svelte +7 -0
  301. package/src/shadcn/context-menu/context-menu-trigger.svelte +17 -0
  302. package/src/shadcn/context-menu/context-menu.svelte +7 -0
  303. package/src/shadcn/context-menu/index.ts +52 -0
  304. package/src/shadcn/dialog/dialog-close.svelte +11 -0
  305. package/src/shadcn/dialog/dialog-content.svelte +57 -0
  306. package/src/shadcn/dialog/dialog-description.svelte +20 -0
  307. package/src/shadcn/dialog/dialog-footer.svelte +32 -0
  308. package/src/shadcn/dialog/dialog-header.svelte +20 -0
  309. package/src/shadcn/dialog/dialog-overlay.svelte +20 -0
  310. package/src/shadcn/dialog/dialog-portal.svelte +7 -0
  311. package/src/shadcn/dialog/dialog-title.svelte +17 -0
  312. package/src/shadcn/dialog/dialog-trigger.svelte +11 -0
  313. package/src/shadcn/dialog/dialog.svelte +7 -0
  314. package/src/shadcn/dialog/index.ts +34 -0
  315. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  316. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
  317. package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +31 -0
  318. package/src/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  319. package/src/shadcn/dropdown-menu/dropdown-menu-group.svelte +7 -0
  320. package/src/shadcn/dropdown-menu/dropdown-menu-item.svelte +29 -0
  321. package/src/shadcn/dropdown-menu/dropdown-menu-label.svelte +27 -0
  322. package/src/shadcn/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  323. package/src/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  324. package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +34 -0
  325. package/src/shadcn/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  326. package/src/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  327. package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
  328. package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  329. package/src/shadcn/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  330. package/src/shadcn/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  331. package/src/shadcn/dropdown-menu/dropdown-menu.svelte +7 -0
  332. package/src/shadcn/dropdown-menu/index.ts +56 -0
  333. package/src/shadcn/dropdown-menu/menu-item.ts +43 -0
  334. package/src/shadcn/empty/empty-content.svelte +23 -0
  335. package/src/shadcn/empty/empty-description.svelte +23 -0
  336. package/src/shadcn/empty/empty-header.svelte +20 -0
  337. package/src/shadcn/empty/empty-media.svelte +41 -0
  338. package/src/shadcn/empty/empty-title.svelte +20 -0
  339. package/src/shadcn/empty/empty.svelte +23 -0
  340. package/src/shadcn/empty/index.ts +22 -0
  341. package/src/shadcn/field/field-content.svelte +20 -0
  342. package/src/shadcn/field/field-description.svelte +25 -0
  343. package/src/shadcn/field/field-error.svelte +58 -0
  344. package/src/shadcn/field/field-group.svelte +23 -0
  345. package/src/shadcn/field/field-label.svelte +26 -0
  346. package/src/shadcn/field/field-legend.svelte +29 -0
  347. package/src/shadcn/field/field-separator.svelte +35 -0
  348. package/src/shadcn/field/field-set.svelte +24 -0
  349. package/src/shadcn/field/field-title.svelte +23 -0
  350. package/src/shadcn/field/field.svelte +53 -0
  351. package/src/shadcn/field/index.ts +33 -0
  352. package/src/shadcn/hooks/is-mobile.svelte.ts +9 -0
  353. package/src/shadcn/hover-card/hover-card-content.svelte +31 -0
  354. package/src/shadcn/hover-card/hover-card-portal.svelte +7 -0
  355. package/src/shadcn/hover-card/hover-card-trigger.svelte +7 -0
  356. package/src/shadcn/hover-card/hover-card.svelte +7 -0
  357. package/src/shadcn/hover-card/index.ts +15 -0
  358. package/src/shadcn/input/index.ts +9 -0
  359. package/src/shadcn/input/input.svelte +48 -0
  360. package/src/shadcn/input/secret-input.svelte +75 -0
  361. package/src/shadcn/input-otp/index.ts +15 -0
  362. package/src/shadcn/input-otp/input-otp-group.svelte +20 -0
  363. package/src/shadcn/input-otp/input-otp-separator.svelte +25 -0
  364. package/src/shadcn/input-otp/input-otp-slot.svelte +26 -0
  365. package/src/shadcn/input-otp/input-otp.svelte +22 -0
  366. package/src/shadcn/label/index.ts +7 -0
  367. package/src/shadcn/label/label.svelte +20 -0
  368. package/src/shadcn/marker/index.ts +15 -0
  369. package/src/shadcn/marker/marker-content.svelte +23 -0
  370. package/src/shadcn/marker/marker-icon.svelte +21 -0
  371. package/src/shadcn/marker/marker.svelte +52 -0
  372. package/src/shadcn/message/index.ts +22 -0
  373. package/src/shadcn/message/message-avatar.svelte +23 -0
  374. package/src/shadcn/message/message-content.svelte +23 -0
  375. package/src/shadcn/message/message-footer.svelte +23 -0
  376. package/src/shadcn/message/message-group.svelte +20 -0
  377. package/src/shadcn/message/message-header.svelte +23 -0
  378. package/src/shadcn/message/message.svelte +27 -0
  379. package/src/shadcn/popover/index.ts +28 -0
  380. package/src/shadcn/popover/popover-close.svelte +7 -0
  381. package/src/shadcn/popover/popover-content.svelte +38 -0
  382. package/src/shadcn/popover/popover-description.svelte +20 -0
  383. package/src/shadcn/popover/popover-header.svelte +20 -0
  384. package/src/shadcn/popover/popover-portal.svelte +7 -0
  385. package/src/shadcn/popover/popover-title.svelte +15 -0
  386. package/src/shadcn/popover/popover-trigger.svelte +17 -0
  387. package/src/shadcn/popover/popover.svelte +7 -0
  388. package/src/shadcn/progress/index.ts +7 -0
  389. package/src/shadcn/progress/progress.svelte +30 -0
  390. package/src/shadcn/radio-group/index.ts +10 -0
  391. package/src/shadcn/radio-group/radio-group-item.svelte +31 -0
  392. package/src/shadcn/radio-group/radio-group.svelte +19 -0
  393. package/src/shadcn/scroll-area/index.ts +10 -0
  394. package/src/shadcn/scroll-area/scroll-area-scrollbar.svelte +30 -0
  395. package/src/shadcn/scroll-area/scroll-area.svelte +43 -0
  396. package/src/shadcn/select/index.ts +37 -0
  397. package/src/shadcn/select/select-content.svelte +45 -0
  398. package/src/shadcn/select/select-group-heading.svelte +21 -0
  399. package/src/shadcn/select/select-group.svelte +17 -0
  400. package/src/shadcn/select/select-item.svelte +38 -0
  401. package/src/shadcn/select/select-label.svelte +20 -0
  402. package/src/shadcn/select/select-portal.svelte +7 -0
  403. package/src/shadcn/select/select-scroll-down-button.svelte +23 -0
  404. package/src/shadcn/select/select-scroll-up-button.svelte +23 -0
  405. package/src/shadcn/select/select-separator.svelte +18 -0
  406. package/src/shadcn/select/select-trigger.svelte +33 -0
  407. package/src/shadcn/select/select.svelte +11 -0
  408. package/src/shadcn/separator/index.ts +7 -0
  409. package/src/shadcn/separator/separator.svelte +23 -0
  410. package/src/shadcn/sheet/index.ts +34 -0
  411. package/src/shadcn/sheet/sheet-close.svelte +7 -0
  412. package/src/shadcn/sheet/sheet-content.svelte +72 -0
  413. package/src/shadcn/sheet/sheet-description.svelte +17 -0
  414. package/src/shadcn/sheet/sheet-footer.svelte +20 -0
  415. package/src/shadcn/sheet/sheet-header.svelte +20 -0
  416. package/src/shadcn/sheet/sheet-overlay.svelte +20 -0
  417. package/src/shadcn/sheet/sheet-portal.svelte +7 -0
  418. package/src/shadcn/sheet/sheet-title.svelte +17 -0
  419. package/src/shadcn/sheet/sheet-trigger.svelte +7 -0
  420. package/src/shadcn/sheet/sheet.svelte +7 -0
  421. package/src/shadcn/sidebar/constants.ts +6 -0
  422. package/src/shadcn/sidebar/context.svelte.ts +81 -0
  423. package/src/shadcn/sidebar/index.ts +75 -0
  424. package/src/shadcn/sidebar/sidebar-content.svelte +24 -0
  425. package/src/shadcn/sidebar/sidebar-footer.svelte +21 -0
  426. package/src/shadcn/sidebar/sidebar-group-action.svelte +33 -0
  427. package/src/shadcn/sidebar/sidebar-group-content.svelte +21 -0
  428. package/src/shadcn/sidebar/sidebar-group-label.svelte +33 -0
  429. package/src/shadcn/sidebar/sidebar-group.svelte +21 -0
  430. package/src/shadcn/sidebar/sidebar-header.svelte +21 -0
  431. package/src/shadcn/sidebar/sidebar-input.svelte +21 -0
  432. package/src/shadcn/sidebar/sidebar-inset.svelte +23 -0
  433. package/src/shadcn/sidebar/sidebar-menu-action.svelte +37 -0
  434. package/src/shadcn/sidebar/sidebar-menu-badge.svelte +24 -0
  435. package/src/shadcn/sidebar/sidebar-menu-button.svelte +103 -0
  436. package/src/shadcn/sidebar/sidebar-menu-item.svelte +21 -0
  437. package/src/shadcn/sidebar/sidebar-menu-skeleton.svelte +36 -0
  438. package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +39 -0
  439. package/src/shadcn/sidebar/sidebar-menu-sub-item.svelte +21 -0
  440. package/src/shadcn/sidebar/sidebar-menu-sub.svelte +24 -0
  441. package/src/shadcn/sidebar/sidebar-menu.svelte +21 -0
  442. package/src/shadcn/sidebar/sidebar-provider.svelte +62 -0
  443. package/src/shadcn/sidebar/sidebar-rail.svelte +36 -0
  444. package/src/shadcn/sidebar/sidebar-separator.svelte +19 -0
  445. package/src/shadcn/sidebar/sidebar-trigger.svelte +37 -0
  446. package/src/shadcn/sidebar/sidebar.svelte +109 -0
  447. package/src/shadcn/skeleton/index.ts +7 -0
  448. package/src/shadcn/skeleton/skeleton.svelte +17 -0
  449. package/src/shadcn/slider/index.ts +7 -0
  450. package/src/shadcn/slider/slider.svelte +52 -0
  451. package/src/shadcn/sonner/index.ts +1 -0
  452. package/src/shadcn/sonner/sonner.svelte +34 -0
  453. package/src/shadcn/spinner/index.ts +1 -0
  454. package/src/shadcn/spinner/spinner.svelte +26 -0
  455. package/src/shadcn/switch/index.ts +7 -0
  456. package/src/shadcn/switch/switch.svelte +31 -0
  457. package/src/shadcn/table/index.ts +28 -0
  458. package/src/shadcn/table/table-body.svelte +20 -0
  459. package/src/shadcn/table/table-caption.svelte +20 -0
  460. package/src/shadcn/table/table-cell.svelte +20 -0
  461. package/src/shadcn/table/table-footer.svelte +20 -0
  462. package/src/shadcn/table/table-head.svelte +23 -0
  463. package/src/shadcn/table/table-header.svelte +20 -0
  464. package/src/shadcn/table/table-row.svelte +23 -0
  465. package/src/shadcn/table/table.svelte +25 -0
  466. package/src/shadcn/tabs/index.ts +16 -0
  467. package/src/shadcn/tabs/tabs-content.svelte +17 -0
  468. package/src/shadcn/tabs/tabs-list.svelte +25 -0
  469. package/src/shadcn/tabs/tabs-trigger.svelte +20 -0
  470. package/src/shadcn/tabs/tabs.svelte +19 -0
  471. package/src/shadcn/textarea/index.ts +7 -0
  472. package/src/shadcn/textarea/textarea.svelte +23 -0
  473. package/src/shadcn/toggle/index.ts +13 -0
  474. package/src/shadcn/toggle/toggle.svelte +53 -0
  475. package/src/shadcn/toggle-group/index.ts +10 -0
  476. package/src/shadcn/toggle-group/toggle-group-item.svelte +35 -0
  477. package/src/shadcn/toggle-group/toggle-group.svelte +59 -0
  478. package/src/shadcn/tooltip/context.ts +16 -0
  479. package/src/shadcn/tooltip/index.ts +19 -0
  480. package/src/shadcn/tooltip/tooltip-content.svelte +38 -0
  481. package/src/shadcn/tooltip/tooltip-portal.svelte +7 -0
  482. package/src/shadcn/tooltip/tooltip-provider.svelte +16 -0
  483. package/src/shadcn/tooltip/tooltip-trigger.svelte +7 -0
  484. package/src/shadcn/tooltip/tooltip.svelte +19 -0
  485. package/src/shadcn/utilities.css +549 -0
  486. package/src/showcase/AiSection.svelte +157 -0
  487. package/src/showcase/AnimationsSection.svelte +1658 -0
  488. package/src/showcase/ChartsSection.svelte +458 -0
  489. package/src/showcase/EffectsSection.svelte +152 -0
  490. package/src/showcase/ShadcnSection.svelte +27 -0
  491. package/src/showcase/ShowcaseImport.svelte +126 -0
  492. package/src/showcase/ShowcaseList.svelte +132 -0
  493. package/src/showcase/ShowcaseNav.svelte +247 -0
  494. package/src/showcase/ShowcaseSection.svelte +112 -0
  495. package/src/showcase/ShowcaseShell.svelte +55 -0
  496. package/src/showcase/ShowcaseStage.svelte +342 -0
  497. package/src/showcase/ShowcaseVariant.svelte +109 -0
  498. package/src/showcase/assets/image-reveal/art-1.jpg +0 -0
  499. package/src/showcase/assets/image-reveal/art-2.jpg +0 -0
  500. package/src/showcase/assets/image-reveal/art-3.jpg +0 -0
  501. package/src/showcase/check.svg +1 -0
  502. package/src/showcase/chevron-arms.svg +2 -0
  503. package/src/showcase/chevron-down.svg +1 -0
  504. package/src/showcase/copy.svg +2 -0
  505. package/src/showcase/demos/ai/confirmation.svelte +59 -0
  506. package/src/showcase/demos/ai/conversation.svelte +59 -0
  507. package/src/showcase/demos/ai/loading-state.svelte +19 -0
  508. package/src/showcase/demos/ai/prompt-input.svelte +57 -0
  509. package/src/showcase/demos/ai/reasoning.svelte +19 -0
  510. package/src/showcase/demos/ai/thinking-dots.svelte +15 -0
  511. package/src/showcase/demos/ai/voice-waveform.svelte +24 -0
  512. package/src/showcase/demos/effects/animated-beam.svelte +50 -0
  513. package/src/showcase/demos/effects/animated-group.svelte +47 -0
  514. package/src/showcase/demos/effects/border-beam-default.svelte +20 -0
  515. package/src/showcase/demos/effects/border-beam-line.svelte +20 -0
  516. package/src/showcase/demos/effects/border-beam-mono.svelte +20 -0
  517. package/src/showcase/demos/effects/border-beam-sunset.svelte +20 -0
  518. package/src/showcase/demos/effects/image-comparison.svelte +25 -0
  519. package/src/showcase/demos/effects/image-reveal.svelte +49 -0
  520. package/src/showcase/demos/effects/in-view.svelte +41 -0
  521. package/src/showcase/demos/effects/integrations-hub.svelte +82 -0
  522. package/src/showcase/demos/effects/magnetic.svelte +31 -0
  523. package/src/showcase/demos/effects/marquee.svelte +33 -0
  524. package/src/showcase/demos/effects/progressive-blur.svelte +47 -0
  525. package/src/showcase/demos/effects/spotlight.svelte +40 -0
  526. package/src/showcase/demos/effects/text-effect.svelte +55 -0
  527. package/src/showcase/demos/shadcn/accordion.svelte +45 -0
  528. package/src/showcase/demos/shadcn/alert-dialog.svelte +23 -0
  529. package/src/showcase/demos/shadcn/alert.svelte +30 -0
  530. package/src/showcase/demos/shadcn/attachment.svelte +71 -0
  531. package/src/showcase/demos/shadcn/avatar.svelte +30 -0
  532. package/src/showcase/demos/shadcn/badge.svelte +26 -0
  533. package/src/showcase/demos/shadcn/breadcrumb.svelte +34 -0
  534. package/src/showcase/demos/shadcn/bubble.svelte +36 -0
  535. package/src/showcase/demos/shadcn/button.svelte +11 -0
  536. package/src/showcase/demos/shadcn/calendar.svelte +8 -0
  537. package/src/showcase/demos/shadcn/card.svelte +39 -0
  538. package/src/showcase/demos/shadcn/checkbox.svelte +39 -0
  539. package/src/showcase/demos/shadcn/collapsible.svelte +20 -0
  540. package/src/showcase/demos/shadcn/command.svelte +48 -0
  541. package/src/showcase/demos/shadcn/context-menu.svelte +54 -0
  542. package/src/showcase/demos/shadcn/demo-harness.svelte +12 -0
  543. package/src/showcase/demos/shadcn/demos.test.ts +20 -0
  544. package/src/showcase/demos/shadcn/dialog.svelte +38 -0
  545. package/src/showcase/demos/shadcn/dropdown-menu.svelte +59 -0
  546. package/src/showcase/demos/shadcn/empty.svelte +29 -0
  547. package/src/showcase/demos/shadcn/field.svelte +115 -0
  548. package/src/showcase/demos/shadcn/hover-card.svelte +32 -0
  549. package/src/showcase/demos/shadcn/index.ts +358 -0
  550. package/src/showcase/demos/shadcn/input-otp.svelte +19 -0
  551. package/src/showcase/demos/shadcn/input.svelte +5 -0
  552. package/src/showcase/demos/shadcn/label.svelte +11 -0
  553. package/src/showcase/demos/shadcn/marker.svelte +30 -0
  554. package/src/showcase/demos/shadcn/message.svelte +75 -0
  555. package/src/showcase/demos/shadcn/popover.svelte +36 -0
  556. package/src/showcase/demos/shadcn/progress.svelte +13 -0
  557. package/src/showcase/demos/shadcn/radio-group.svelte +19 -0
  558. package/src/showcase/demos/shadcn/scroll-area.svelte +18 -0
  559. package/src/showcase/demos/shadcn/select.svelte +29 -0
  560. package/src/showcase/demos/shadcn/separator.svelte +12 -0
  561. package/src/showcase/demos/shadcn/sheet.svelte +48 -0
  562. package/src/showcase/demos/shadcn/skeleton.svelte +11 -0
  563. package/src/showcase/demos/shadcn/slider.svelte +7 -0
  564. package/src/showcase/demos/shadcn/sonner.svelte +18 -0
  565. package/src/showcase/demos/shadcn/spinner.svelte +11 -0
  566. package/src/showcase/demos/shadcn/switch.svelte +9 -0
  567. package/src/showcase/demos/shadcn/table.svelte +76 -0
  568. package/src/showcase/demos/shadcn/tabs.svelte +62 -0
  569. package/src/showcase/demos/shadcn/textarea.svelte +5 -0
  570. package/src/showcase/demos/shadcn/toggle-group.svelte +18 -0
  571. package/src/showcase/demos/shadcn/toggle.svelte +14 -0
  572. package/src/showcase/demos/shadcn/tooltip.svelte +13 -0
  573. package/src/showcase/heart.svg +1 -0
  574. package/src/showcase/index.ts +38 -0
  575. package/src/showcase/kit.test.ts +72 -0
  576. package/src/showcase/kit.ts +17 -0
  577. package/src/showcase/plus.svg +1 -0
  578. package/src/showcase/showcase-shell.css +91 -0
  579. package/src/showcase/stacked-section.css +15 -0
  580. package/src/showcase/success-check.svg +1 -0
  581. package/src/showcase/types.ts +29 -0
  582. package/src/svg-raw.d.ts +7 -0
  583. package/src/test-setup.ts +34 -0
  584. package/src/tokens.css +993 -0
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ // =========================
3
+ // IMPORTS
4
+ // =========================
5
+
6
+ import "./VoiceWaveform.css";
7
+ import { cn } from "@heyramzi/utils";
8
+ import type { HTMLAttributes } from "svelte/elements";
9
+
10
+ // =========================
11
+ // TYPES
12
+ // =========================
13
+
14
+ export interface VoiceWaveformProps extends HTMLAttributes<HTMLDivElement> {
15
+ active?: boolean;
16
+ class?: string;
17
+ bars?: readonly number[];
18
+ }
19
+
20
+ // =========================
21
+ // CONSTANTS
22
+ // =========================
23
+
24
+ const DEFAULT_BARS = [10, 18, 26, 16, 22, 12] as const;
25
+
26
+ // =========================
27
+ // PROPS
28
+ // =========================
29
+
30
+ let {
31
+ active = false,
32
+ class: className,
33
+ bars = DEFAULT_BARS,
34
+ ...rest
35
+ }: VoiceWaveformProps = $props();
36
+ </script>
37
+
38
+ <!-- =========================== -->
39
+ <!-- MARKUP -->
40
+ <!-- =========================== -->
41
+
42
+ <div class={cn("waveform", className)} class:active aria-hidden="true" {...rest}>
43
+ {#each bars as height, index (index)}
44
+ <span style={`--bar-height: ${height}px; --delay: ${index * 70}ms`}></span>
45
+ {/each}
46
+ </div>
@@ -0,0 +1,5 @@
1
+ import VoiceWaveform from "./VoiceWaveform.svelte";
2
+ import type { VoiceWaveformProps } from "./VoiceWaveform.svelte";
3
+
4
+ export { VoiceWaveform, type VoiceWaveformProps };
5
+ export default VoiceWaveform;
@@ -0,0 +1,84 @@
1
+ # @heyramzi/ui — animations
2
+
3
+ Production-ready CSS transitions adapted from **[transitions.dev](https://transitions.dev)** by [Jakub Antalík](https://github.com/Jakubantalik) ([source](https://github.com/Jakubantalik/transitions.dev)).
4
+
5
+ The whole free catalogue is here. The paid ones are not, and are never vendored — Ramzi, 14 Sep 2026: "the pro effects we don't need them".
6
+
7
+ ## Staying in sync
8
+
9
+ ```bash
10
+ pnpm sync:transitions # fetch upstream, vendor it, report what moved
11
+ pnpm sync:transitions --check # fail if upstream moved (CI / pre-release)
12
+ ```
13
+
14
+ The script writes pristine upstream copies to `.upstream/transitions/` and hashes them in `.upstream/transitions.lock.json`. It never touches these files: `git diff .upstream/` is the upstream changelog, and porting a change is a decision. `PORTED` in `scripts/sync-transitions.mjs` maps each upstream slug to its home here, and the script reports any slug that has none.
15
+
16
+ ## What's here
17
+
18
+ | File | Selector | Used by |
19
+ | --- | --- | --- |
20
+ | `accordion.css` | `.t-acc` | standalone |
21
+ | `avatar-group-hover.css` | `.t-avatar-group`, `.t-avatar` | standalone |
22
+ | `card-tilt.css` | `.t-tilt`, `.t-tilt-card`, `.t-tilt-glare` | standalone |
23
+ | `digit-pop-in.css` | `.t-digit` | standalone |
24
+ | `dropdown.css` | `.t-dropdown` | (not yet wired) |
25
+ | `icon-swap.css` | `.t-icon-swap` | standalone |
26
+ | `input-clear-dissolve.css` | `.t-clear`, `.t-clear-mirror`, `.t-clear-glow` | standalone |
27
+ | `input-shake.css` | `.t-input-wrap`, `.t-input`, `.t-error-msg` | (none, form layer moved to upsys) |
28
+ | `learn-more-hover.css` | `.t-learn`, `.t-learn-chevron` | standalone |
29
+ | `like-button.css` | `.t-like`, `.t-like-particles` | standalone |
30
+ | `modal.css` | `.t-modal`, `.t-modal-backdrop` | `shadcn/dialog`, `shadcn/alert-dialog` |
31
+ | `notification-badge.css` | `.t-badge` | standalone |
32
+ | `page-side-by-side.css` | `.t-page` | standalone |
33
+ | `panel.css` | `.t-panel` | (not yet wired) |
34
+ | `plus-menu-morph.css` | `.t-morph`, `.t-morph-plus`, `.t-morph-menu` | standalone |
35
+ | `reasoning-stream.css` | `.t-reason`, `.t-reason-viewport` | standalone |
36
+ | `resize.css` | `.t-resize` | standalone |
37
+ | `shimmer-text.css` | `.t-shimmer` | `thinking-states.css` |
38
+ | `skeleton-reveal.css` | `.t-skel` | standalone |
39
+ | `spinning-counter.css` | `.t-reel`, `.t-reel-col` | standalone |
40
+ | `streaming-text.css` | `.t-stream-w` | standalone |
41
+ | `success-check.css` | `.t-success-check` | standalone |
42
+ | `tabs-sliding.css` | `.t-tabs`, `.t-tab`, `.t-tabs-pill` | standalone |
43
+ | `text-swap.css` + `text-swap.ts` | `.t-text-swap` | standalone |
44
+ | `texts-reveal.css` | `.t-stagger`, `.t-stagger-line` | standalone |
45
+ | `thinking-states.css` | `.t-think`, `.t-think-text` | standalone |
46
+ | `tooltip.css` | `.t-tt-wrap`, `.t-tt`, `.t-tt-trigger` | standalone |
47
+
48
+ `index.css` is the barrel — imports all of the above.
49
+
50
+ ## Five upstream transitions that are not files here
51
+
52
+ One behaviour, one implementation. Where a component already did the job, the upstream recipe was merged into it or dropped, rather than shipped as a second way to do the same thing.
53
+
54
+ | Upstream | Where it lives instead |
55
+ | --- | --- |
56
+ | `toggle` | `shadcn/switch/switch.css` — the thumb slide, on our switch. |
57
+ | `checkbox-check` | `shadcn/checkbox/checkbox.css` — the mark draw, on our checkbox. |
58
+ | `toast-open-close` | `shadcn/sonner` — svelte-sonner owns toast motion. |
59
+ | `banner-stacking` | `shadcn/sonner` — stacking and hover spread are what it does. |
60
+ | `matrix-dot-loader` | `ai/loading-state` — `PixelLoader` is the dot-grid loader. |
61
+
62
+ Two more pairs look like duplicates and are not: `spinning-counter` rolls a number between values, `digit-pop-in` updates one in place; `streaming-text` resolves a paragraph word by word, `ai/response` only blinks a caret while `.is-streaming`.
63
+
64
+ ## How to consume
65
+
66
+ These styles are **not** auto-loaded with the components. Consumers import them once:
67
+
68
+ ```css
69
+ @import "@heyramzi/ui/animations";
70
+ ```
71
+
72
+ The two merged into components are the exception — `switch.svelte` and `checkbox.svelte` import their own CSS, so they animate with no consumer action.
73
+
74
+ ## Tunable tokens
75
+
76
+ Every transition reads semantic CSS variables (`--modal-open-dur`, `--tilt-follow`, `--think-swap`). Where the shared motion scale in `@heyramzi/ui/design` has a token at that exact value, the variable defaults to it and keeps the literal as the fallback:
77
+
78
+ ```css
79
+ --toast-open: var(--duration-medium, 350ms);
80
+ ```
81
+
82
+ So the scale is single-sourced when the design layer is imported, and the transition still runs at the shipped value when it is not. A value the scale has no token for — a 1000ms tilt return, a 90ms reel stagger — stays a literal rather than being rounded onto the nearest rung. Override any of them at `:root` or per-scope to retune without forking the CSS.
83
+
84
+ See the [transitions.dev SKILL](../../../../ai-doc/skills/design/motion/transitions-dev/SKILL.md) for the full token list and the per-transition variables.
@@ -0,0 +1,58 @@
1
+ /* Accordion expand — transitions.dev 21.
2
+ Height animates on grid-template-rows 0fr -> 1fr, so no JS measures a
3
+ height and a panel of any size collapses cleanly. Padding belongs on
4
+ `-inner`: on the 0fr track it leaves a residual strip and the panel
5
+ never fully closes. The chevron flips rather than morphing its `d`,
6
+ because CSS path interpolation is Chromium-only. */
7
+ :root {
8
+ --acc-expand: var(--duration-fast, 250ms);
9
+ --acc-collapse: var(--duration-fast, 250ms);
10
+ --acc-chevron: var(--duration-fast, 250ms);
11
+ --acc-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
12
+ }
13
+
14
+ .t-acc-panel {
15
+ display: grid;
16
+ grid-template-rows: 0fr;
17
+ transition: grid-template-rows var(--acc-collapse) var(--acc-ease);
18
+ }
19
+ .t-acc[data-open="true"] .t-acc-panel {
20
+ grid-template-rows: 1fr;
21
+ transition: grid-template-rows var(--acc-expand) var(--acc-ease);
22
+ }
23
+ .t-acc-panel-inner {
24
+ overflow: hidden;
25
+ opacity: 0;
26
+ filter: blur(2px);
27
+ transition:
28
+ opacity var(--acc-collapse) var(--acc-ease),
29
+ filter var(--acc-collapse) var(--acc-ease);
30
+ }
31
+ .t-acc[data-open="true"] .t-acc-panel-inner {
32
+ opacity: 1;
33
+ filter: blur(0);
34
+ transition:
35
+ opacity var(--acc-expand) var(--acc-ease),
36
+ filter var(--acc-expand) var(--acc-ease);
37
+ }
38
+
39
+ .t-acc-chevron {
40
+ display: inline-flex;
41
+ transform: scaleY(1);
42
+ transform-origin: center;
43
+ transition: transform var(--acc-chevron) var(--acc-ease);
44
+ }
45
+ .t-acc-chevron path {
46
+ vector-effect: non-scaling-stroke;
47
+ }
48
+ .t-acc[data-open="true"] .t-acc-chevron {
49
+ transform: scaleY(-1);
50
+ }
51
+
52
+ @media (prefers-reduced-motion: reduce) {
53
+ .t-acc-panel,
54
+ .t-acc-panel-inner,
55
+ .t-acc-chevron {
56
+ transition: none !important;
57
+ }
58
+ }
@@ -0,0 +1,47 @@
1
+ /* Transitions.dev — Avatar group hover */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+
4
+ /*
5
+ Usage:
6
+ Apply .t-avatar to each item in your group (avatar, chip,
7
+ badge, button). Bring your own size, shape, and stacking;
8
+ this stylesheet only owns the hover transform + transition.
9
+
10
+ <div class="t-avatar-group">
11
+ <div class="t-avatar">…</div>
12
+ <div class="t-avatar">…</div>
13
+ </div>
14
+
15
+ Wire-up (JS):
16
+ On mouseenter of any .t-avatar, walk every sibling and set
17
+ inline --shift and --scale-active with a distance falloff.
18
+ Set transition-timing-function inline BEFORE the variable
19
+ writes — --avatar-ease-in on hover-in, --avatar-ease-out on
20
+ the root's mouseleave.
21
+ */
22
+
23
+ :root {
24
+ --avatar-lift: -4px;
25
+ --avatar-dur: 320ms;
26
+ --avatar-scale: 1.05;
27
+ --avatar-falloff: 0.45;
28
+ --avatar-ease-in: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
29
+ --avatar-ease-out: var(--ease-smooth-out);
30
+ }
31
+
32
+ /* Hover-spring transition only — bring your own avatar/chip
33
+ styling (size, shape, border, stacking, background). */
34
+ .t-avatar {
35
+ transform-origin: center;
36
+ /* translateY before scale so scale doesn't amplify the lift offset. */
37
+ transform: translateY(var(--shift, 0px)) scale(var(--scale-active, 1));
38
+ transition: transform var(--avatar-dur) var(--avatar-ease-in);
39
+ will-change: transform;
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ .t-avatar {
44
+ transition: none !important;
45
+ transform: none !important;
46
+ }
47
+ }
@@ -0,0 +1,74 @@
1
+ /* Card hover tilt — transitions.dev `3d-tilt`.
2
+ Bind pointermove to the flat outer `.t-tilt`, never the card: the rotating
3
+ edges slip under the cursor and the hover flickers. JS writes --tilt-rx/ry
4
+ and --tilt-gx/gy, adds `.is-tilting` while moving and `.is-hover` for the
5
+ glare. Return and glare clocks have no token at their length, by design:
6
+ the settle is meant to read slower than any surface. */
7
+ :root {
8
+ --tilt-perspective: 1000px;
9
+ --tilt-return: 1000ms;
10
+ --tilt-return-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
11
+ --tilt-follow: var(--duration-slow, 400ms);
12
+ --tilt-follow-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
13
+ --tilt-glare-opacity: 0.32;
14
+ --tilt-glare-fade: 300ms;
15
+ --tilt-glare-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
16
+ }
17
+
18
+ /* touch-action lets a finger drag the tilt instead of scrolling the page. */
19
+ .t-tilt {
20
+ touch-action: none;
21
+ }
22
+
23
+ .t-tilt-card {
24
+ position: relative;
25
+ border-radius: var(--radius-xl, 10px);
26
+ overflow: hidden;
27
+ transform: perspective(var(--tilt-perspective)) rotateX(var(--tilt-rx, 0deg))
28
+ rotateY(var(--tilt-ry, 0deg));
29
+ transform-style: preserve-3d;
30
+ transition: transform var(--tilt-return) var(--tilt-return-ease);
31
+ will-change: transform;
32
+ }
33
+ /* A short follow clock while the pointer moves, so the tilt tracks it 1:1. */
34
+ .t-tilt-card.is-tilting {
35
+ transition: transform var(--tilt-follow) var(--tilt-follow-ease);
36
+ }
37
+
38
+ /* Layered soft circles that add like light at the pointer position. */
39
+ .t-tilt-glare {
40
+ position: absolute;
41
+ inset: 0;
42
+ pointer-events: none;
43
+ opacity: 0;
44
+ mix-blend-mode: screen;
45
+ background:
46
+ radial-gradient(
47
+ circle 95px at var(--tilt-gx, 50%) var(--tilt-gy, 50%),
48
+ rgb(255 255 255 / 0.48),
49
+ rgb(255 255 255 / 0.06) 52%,
50
+ rgb(255 255 255 / 0) 84%
51
+ ),
52
+ radial-gradient(
53
+ circle 200px at var(--tilt-gx, 50%) var(--tilt-gy, 50%),
54
+ rgb(255 255 255 / 0.22),
55
+ rgb(255 255 255 / 0.04) 58%,
56
+ rgb(255 255 255 / 0) 78%
57
+ ),
58
+ radial-gradient(
59
+ circle 360px at var(--tilt-gx, 50%) var(--tilt-gy, 50%),
60
+ rgb(255 255 255 / 0.1),
61
+ rgb(255 255 255 / 0) 88%
62
+ );
63
+ transition: opacity var(--tilt-glare-fade) var(--tilt-glare-ease);
64
+ }
65
+ .t-tilt.is-hover .t-tilt-glare {
66
+ opacity: var(--tilt-glare-opacity);
67
+ }
68
+
69
+ @media (prefers-reduced-motion: reduce) {
70
+ .t-tilt-card {
71
+ transform: none !important;
72
+ transition: none !important;
73
+ }
74
+ }
@@ -0,0 +1,78 @@
1
+ /* Transitions.dev — Number pop-in */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+
4
+ /*
5
+ Usage:
6
+ <span class="t-digit-group is-animating">
7
+ <span class="t-digit">1</span>
8
+ <span class="t-digit">2</span>
9
+ <span class="t-digit" data-stagger="1">.</span>
10
+ <span class="t-digit" data-stagger="2">3</span>
11
+ </span>
12
+
13
+ Replay:
14
+ Remove `.is-animating`, re-render digits (or swap text),
15
+ force a reflow, then re-add `.is-animating`.
16
+
17
+ Direction:
18
+ --digit-dir-x / --digit-dir-y are unit-less multipliers
19
+ (e.g. 1, -1, 0) applied to --digit-distance.
20
+ */
21
+
22
+ :root {
23
+ --digit-dur: var(--duration-very-slow, 500ms);
24
+ --digit-distance: var(--distance-base, 8px);
25
+ --digit-stagger: 70ms;
26
+ --digit-blur: var(--blur-small, 2px);
27
+ --digit-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
28
+ --digit-dir-x: 0;
29
+ --digit-dir-y: 1;
30
+ }
31
+
32
+ @keyframes t-digit-pop-in {
33
+ 0% {
34
+ transform: translate(
35
+ calc(var(--digit-distance) * var(--digit-dir-x)),
36
+ calc(var(--digit-distance) * var(--digit-dir-y))
37
+ );
38
+ opacity: 0;
39
+ filter: blur(var(--digit-blur));
40
+ }
41
+ 100% {
42
+ transform: translate(0, 0);
43
+ opacity: 1;
44
+ filter: blur(0);
45
+ }
46
+ }
47
+
48
+ .t-digit-group {
49
+ display: inline-flex;
50
+ align-items: baseline;
51
+ }
52
+ .t-digit {
53
+ display: inline-block;
54
+ will-change: transform, opacity, filter;
55
+ }
56
+ .t-digit-group.is-animating .t-digit {
57
+ animation: t-digit-pop-in var(--digit-dur) var(--digit-ease) both;
58
+ }
59
+ .t-digit-group.is-animating .t-digit[data-stagger="1"] {
60
+ animation-delay: var(--digit-stagger);
61
+ }
62
+ .t-digit-group.is-animating .t-digit[data-stagger="2"] {
63
+ animation-delay: calc(var(--digit-stagger) * 2);
64
+ }
65
+
66
+ /* === Extension: support more than 2 stagger steps for longer numbers === */
67
+ .t-digit-group.is-animating .t-digit[data-stagger="3"] {
68
+ animation-delay: calc(var(--digit-stagger) * 3);
69
+ }
70
+ .t-digit-group.is-animating .t-digit[data-stagger="4"] {
71
+ animation-delay: calc(var(--digit-stagger) * 4);
72
+ }
73
+
74
+ @media (prefers-reduced-motion: reduce) {
75
+ .t-digit-group .t-digit {
76
+ animation: none !important;
77
+ }
78
+ }
@@ -0,0 +1,121 @@
1
+ /* Transitions.dev — Menu dropdown */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+
4
+ :root {
5
+ --dropdown-open-dur: var(--duration-fast, 250ms);
6
+ --dropdown-close-dur: var(--duration-quick, 150ms);
7
+ --dropdown-pre-scale: var(--scale-medium, 0.97);
8
+ --dropdown-closing-scale: var(--scale-tiny, 0.99);
9
+ --dropdown-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
10
+ }
11
+
12
+ /* === Upstream: class-based toggle === */
13
+ .t-dropdown {
14
+ transform-origin: top left;
15
+ transform: scale(var(--dropdown-pre-scale));
16
+ opacity: 0;
17
+ pointer-events: none;
18
+ transition:
19
+ transform var(--dropdown-open-dur) var(--dropdown-ease),
20
+ opacity var(--dropdown-open-dur) var(--dropdown-ease);
21
+ will-change: transform, opacity;
22
+ }
23
+ .t-dropdown[data-origin="top-right"] {
24
+ transform-origin: top right;
25
+ }
26
+ .t-dropdown[data-origin="top-center"] {
27
+ transform-origin: top center;
28
+ }
29
+ .t-dropdown[data-origin="bottom-left"] {
30
+ transform-origin: bottom left;
31
+ }
32
+ .t-dropdown[data-origin="bottom-center"] {
33
+ transform-origin: bottom center;
34
+ }
35
+ .t-dropdown[data-origin="bottom-right"] {
36
+ transform-origin: bottom right;
37
+ }
38
+
39
+ .t-dropdown.is-open {
40
+ transform: scale(1);
41
+ opacity: 1;
42
+ pointer-events: auto;
43
+ }
44
+ .t-dropdown.is-closing {
45
+ transform: scale(var(--dropdown-closing-scale));
46
+ opacity: 0;
47
+ pointer-events: none;
48
+ transition:
49
+ transform var(--dropdown-close-dur) var(--dropdown-ease),
50
+ opacity var(--dropdown-close-dur) var(--dropdown-ease);
51
+ }
52
+
53
+ /* === Extension: bits-ui data-state integration === */
54
+ /* WHY: bits-ui mounts content with [data-state] and [data-side]/[data-align]
55
+ attributes. These selectors mirror the upstream states so consumers can drop
56
+ .t-dropdown on a Popover/Menu/Tooltip Content.
57
+
58
+ WHY "instant-open" is in the list: a tooltip reports three open states, not
59
+ two. It says "delayed-open" when it waited out the hover delay and
60
+ "instant-open" when it skipped that delay, which is every open while
61
+ delayDuration is 0 and every neighbour opened inside the skip window. That
62
+ third name was missing here, so those tooltips mounted, took no open rule,
63
+ and stayed at opacity 0: present in the DOM, never on screen. Found
64
+ 11 Sep 2026 in upsys, where the kit's provider defaulted delayDuration to 0
65
+ and so produced nothing but "instant-open". */
66
+ .t-dropdown[data-state="open"],
67
+ .t-dropdown[data-state="delayed-open"],
68
+ .t-dropdown[data-state="instant-open"] {
69
+ transform: scale(1);
70
+ opacity: 1;
71
+ pointer-events: auto;
72
+ }
73
+ .t-dropdown[data-state="closed"] {
74
+ transform: scale(var(--dropdown-closing-scale));
75
+ opacity: 0;
76
+ pointer-events: none;
77
+ transition:
78
+ transform var(--dropdown-close-dur) var(--dropdown-ease),
79
+ opacity var(--dropdown-close-dur) var(--dropdown-ease);
80
+ }
81
+ .t-dropdown[data-side="bottom"][data-align="start"] {
82
+ transform-origin: top left;
83
+ }
84
+ .t-dropdown[data-side="bottom"][data-align="center"] {
85
+ transform-origin: top center;
86
+ }
87
+ .t-dropdown[data-side="bottom"][data-align="end"] {
88
+ transform-origin: top right;
89
+ }
90
+ .t-dropdown[data-side="top"][data-align="start"] {
91
+ transform-origin: bottom left;
92
+ }
93
+ .t-dropdown[data-side="top"][data-align="center"] {
94
+ transform-origin: bottom center;
95
+ }
96
+ .t-dropdown[data-side="top"][data-align="end"] {
97
+ transform-origin: bottom right;
98
+ }
99
+ .t-dropdown[data-side="left"],
100
+ .t-dropdown[data-side="inline-end"] {
101
+ transform-origin: right center;
102
+ }
103
+ .t-dropdown[data-side="right"],
104
+ .t-dropdown[data-side="inline-start"] {
105
+ transform-origin: left center;
106
+ }
107
+
108
+ @media (prefers-reduced-motion: reduce) {
109
+ .t-dropdown {
110
+ transition: none !important;
111
+ }
112
+ }
113
+
114
+ /* A tooltip that skipped its delay skips its entrance too. The first one in a
115
+ group waits and animates in; the neighbours the pointer travels to inside the
116
+ skip window are already open by the time the eye arrives, so animating them
117
+ only adds a wait the delay was there to hide. Scoped to the tooltip slot
118
+ because a menu or popover never reports this state. */
119
+ [data-slot="tooltip-content"].t-dropdown[data-state="instant-open"] {
120
+ transition: none;
121
+ }
@@ -0,0 +1,43 @@
1
+ /* Transitions.dev — Icon swap */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+
4
+ :root {
5
+ --icon-swap-dur: 200ms;
6
+ --icon-swap-blur: var(--blur-small, 2px);
7
+ --icon-swap-start-scale: 0.85;
8
+ --icon-swap-ease: var(--ease-in-out, ease-in-out);
9
+ }
10
+
11
+ .t-icon-swap {
12
+ position: relative;
13
+ display: inline-grid;
14
+ }
15
+
16
+ .t-icon-swap .t-icon {
17
+ grid-area: 1 / 1;
18
+ transition:
19
+ opacity var(--icon-swap-dur) var(--icon-swap-ease),
20
+ filter var(--icon-swap-dur) var(--icon-swap-ease),
21
+ transform var(--icon-swap-dur) var(--icon-swap-ease);
22
+ will-change: opacity, filter, transform;
23
+ }
24
+
25
+ .t-icon-swap[data-state="a"] .t-icon[data-icon="a"],
26
+ .t-icon-swap[data-state="b"] .t-icon[data-icon="b"] {
27
+ opacity: 1;
28
+ filter: blur(0);
29
+ transform: scale(1);
30
+ }
31
+
32
+ .t-icon-swap[data-state="a"] .t-icon[data-icon="b"],
33
+ .t-icon-swap[data-state="b"] .t-icon[data-icon="a"] {
34
+ opacity: 0;
35
+ filter: blur(var(--icon-swap-blur));
36
+ transform: scale(var(--icon-swap-start-scale));
37
+ }
38
+
39
+ @media (prefers-reduced-motion: reduce) {
40
+ .t-icon-swap .t-icon {
41
+ transition: none !important;
42
+ }
43
+ }
@@ -0,0 +1,34 @@
1
+ /* Transitions.dev — bundle */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+ /* Refresh the vendored upstream with `pnpm sync:transitions`. Two free
4
+ transitions are not here because a component already owns them: the switch
5
+ thumb lives in shadcn/switch/switch.css and the checkbox draw in
6
+ shadcn/checkbox/checkbox.css. See README.md. */
7
+
8
+ @import "./modal.css";
9
+ @import "./icon-swap.css";
10
+ @import "./panel.css";
11
+ @import "./dropdown.css";
12
+ @import "./text-swap.css";
13
+ @import "./resize.css";
14
+ @import "./digit-pop-in.css";
15
+ @import "./notification-badge.css";
16
+ @import "./page-side-by-side.css";
17
+ @import "./input-shake.css";
18
+ @import "./success-check.css";
19
+ @import "./avatar-group-hover.css";
20
+ @import "./skeleton-reveal.css";
21
+ @import "./shimmer-text.css";
22
+ @import "./tabs-sliding.css";
23
+ @import "./tooltip.css";
24
+ @import "./texts-reveal.css";
25
+ @import "./input-clear-dissolve.css";
26
+ @import "./accordion.css";
27
+ @import "./learn-more-hover.css";
28
+ @import "./card-tilt.css";
29
+ @import "./plus-menu-morph.css";
30
+ @import "./like-button.css";
31
+ @import "./spinning-counter.css";
32
+ @import "./thinking-states.css";
33
+ @import "./reasoning-stream.css";
34
+ @import "./streaming-text.css";
@@ -0,0 +1,86 @@
1
+ /* Transitions.dev — Input clear with dissolve */
2
+ /* Source: https://github.com/Jakubantalik/transitions.dev */
3
+
4
+ /*
5
+ Usage:
6
+ <div class="t-clear has-value">
7
+ <input type="text" value="…" />
8
+ <div class="t-clear-mirror" aria-hidden="true">…</div>
9
+ <div class="t-clear-placeholder" aria-hidden="true">Search</div>
10
+ <div class="t-clear-glow" aria-hidden="true"></div>
11
+ <button class="t-clear-btn" aria-label="Clear">…</button>
12
+ </div>
13
+
14
+ The transitions live in JS (per-frame transform/opacity/filter
15
+ writes): the streak envelope and per-word gradient stack cannot
16
+ be expressed as static @keyframes. This stylesheet only owns the
17
+ resting state + the variables JS reads.
18
+ */
19
+
20
+ :root {
21
+ --clear-dur: 1000ms;
22
+ --clear-out-dur: var(--duration-slow, 400ms);
23
+ --clear-in-dur: var(--duration-slow, 400ms);
24
+ --clear-out-fly: 12px;
25
+ --clear-in-fly: 12px;
26
+ --clear-out-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
27
+ --clear-in-ease: var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
28
+ --clear-blur: var(--blur-small, 2px);
29
+ --glow-delay: 50ms;
30
+ --glow-peak-at: 0.15;
31
+ --glow-opacity: 0.42;
32
+ --glow-spread: 1.5;
33
+ }
34
+
35
+ /* The wrap clips the glow to its rounded box. Bring your own
36
+ width / height / border-radius / surface color. */
37
+ .t-clear {
38
+ position: relative;
39
+ overflow: hidden;
40
+ }
41
+ .t-clear-mirror,
42
+ .t-clear-placeholder {
43
+ position: absolute;
44
+ inset: 0;
45
+ display: flex;
46
+ align-items: center;
47
+ pointer-events: none;
48
+ white-space: nowrap;
49
+ overflow: hidden;
50
+ z-index: 2;
51
+ }
52
+ .t-clear-mirror {
53
+ opacity: 0;
54
+ }
55
+ .t-clear.has-value .t-clear-mirror,
56
+ .t-clear.is-clearing .t-clear-mirror {
57
+ opacity: 1;
58
+ }
59
+ /* Hide the input's own glyphs while the mirror owns them so the
60
+ cleared text doesn't double-render with the fly-up. */
61
+ .t-clear.has-value > input,
62
+ .t-clear.is-clearing > input {
63
+ -webkit-text-fill-color: transparent;
64
+ }
65
+ .t-clear.has-value .t-clear-placeholder {
66
+ opacity: 0;
67
+ }
68
+ /* The streak overlay: empty by default; JS writes a stack of
69
+ radial-gradient(...) layers into background during a clear,
70
+ then animates opacity. mix-blend-mode: multiply darkens the
71
+ underlying input; flip to screen in dark mode so the same
72
+ alpha values lighten instead of vanish. */
73
+ .t-clear-glow {
74
+ position: absolute;
75
+ inset: 0;
76
+ pointer-events: none;
77
+ opacity: 0;
78
+ z-index: 3;
79
+ mix-blend-mode: multiply;
80
+ }
81
+
82
+ @media (prefers-reduced-motion: reduce) {
83
+ .t-clear-glow {
84
+ opacity: 0 !important;
85
+ }
86
+ }