@glyphui/ui 0.4.0 → 0.5.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 (546) hide show
  1. package/README.md +9 -6
  2. package/dist/chart.d.ts +14 -202
  3. package/dist/chart.js +14 -465
  4. package/dist/components/accordion/accordion.d.ts +15 -0
  5. package/dist/components/accordion/accordion.js +69 -0
  6. package/dist/components/accordion/accordion.styles.d.ts +65 -0
  7. package/dist/components/accordion/accordion.styles.js +30 -0
  8. package/dist/components/accordion/index.d.ts +3 -0
  9. package/dist/components/alert/alert-icons.js +62 -0
  10. package/dist/components/alert/alert.d.ts +19 -0
  11. package/dist/components/alert/alert.js +64 -0
  12. package/dist/components/alert/alert.styles.d.ts +107 -0
  13. package/dist/components/alert/alert.styles.js +86 -0
  14. package/dist/components/alert/index.d.ts +3 -0
  15. package/dist/components/alert-dialog/alert-dialog.d.ts +29 -0
  16. package/dist/components/alert-dialog/alert-dialog.js +89 -0
  17. package/dist/components/alert-dialog/alert-dialog.styles.d.ts +63 -0
  18. package/dist/components/alert-dialog/alert-dialog.styles.js +19 -0
  19. package/dist/components/alert-dialog/confirm-dialog.js +22 -0
  20. package/dist/components/alert-dialog/confirm.d.ts +30 -0
  21. package/dist/components/alert-dialog/confirm.js +62 -0
  22. package/dist/components/alert-dialog/index.d.ts +4 -0
  23. package/dist/components/aspect-ratio/aspect-ratio.d.ts +55 -0
  24. package/dist/components/aspect-ratio/aspect-ratio.js +28 -0
  25. package/dist/components/aspect-ratio/index.d.ts +2 -0
  26. package/dist/components/avatar/avatar.d.ts +13 -0
  27. package/dist/components/avatar/avatar.js +50 -0
  28. package/dist/components/avatar/avatar.styles.d.ts +77 -0
  29. package/dist/components/avatar/avatar.styles.js +32 -0
  30. package/dist/components/avatar/index.d.ts +3 -0
  31. package/dist/components/badge/badge.d.ts +10 -0
  32. package/dist/components/badge/badge.js +28 -0
  33. package/dist/components/badge/badge.styles.d.ts +62 -0
  34. package/dist/components/badge/badge.styles.js +72 -0
  35. package/dist/components/badge/index.d.ts +3 -0
  36. package/dist/components/banner/banner.d.ts +17 -0
  37. package/dist/components/banner/banner.js +71 -0
  38. package/dist/components/banner/banner.styles.d.ts +98 -0
  39. package/dist/components/banner/banner.styles.js +27 -0
  40. package/dist/components/banner/index.d.ts +3 -0
  41. package/dist/components/blockquote/blockquote.d.ts +72 -0
  42. package/dist/components/blockquote/blockquote.js +47 -0
  43. package/dist/components/blockquote/index.d.ts +2 -0
  44. package/dist/components/breadcrumb/breadcrumb.d.ts +28 -0
  45. package/dist/components/breadcrumb/breadcrumb.js +85 -0
  46. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +63 -0
  47. package/dist/components/breadcrumb/breadcrumb.styles.js +18 -0
  48. package/dist/components/breadcrumb/index.d.ts +3 -0
  49. package/dist/components/button/button.d.ts +20 -0
  50. package/dist/components/button/button.js +52 -0
  51. package/dist/components/button/button.styles.d.ts +146 -0
  52. package/dist/components/button/button.styles.js +64 -0
  53. package/dist/components/button/index.d.ts +3 -0
  54. package/dist/components/calendar/calendar.d.ts +9 -0
  55. package/dist/components/calendar/calendar.js +75 -0
  56. package/dist/components/calendar/calendar.styles.d.ts +171 -0
  57. package/dist/components/calendar/calendar.styles.js +42 -0
  58. package/dist/components/calendar/index.d.ts +4 -0
  59. package/dist/components/card/card.d.ts +17 -0
  60. package/dist/components/card/card.js +79 -0
  61. package/dist/components/card/card.styles.d.ts +113 -0
  62. package/dist/components/card/card.styles.js +38 -0
  63. package/dist/components/card/index.d.ts +3 -0
  64. package/dist/components/carousel/carousel.d.ts +37 -0
  65. package/dist/components/carousel/carousel.js +190 -0
  66. package/dist/components/carousel/carousel.styles.d.ts +74 -0
  67. package/dist/components/carousel/carousel.styles.js +35 -0
  68. package/dist/components/carousel/index.d.ts +3 -0
  69. package/dist/components/checkbox/checkbox.d.ts +37 -0
  70. package/dist/components/checkbox/checkbox.js +44 -0
  71. package/dist/components/checkbox/index.d.ts +2 -0
  72. package/dist/components/code/code.d.ts +18 -0
  73. package/dist/components/code/code.js +75 -0
  74. package/dist/components/code/code.styles.d.ts +76 -0
  75. package/dist/components/code/code.styles.js +18 -0
  76. package/dist/components/code/index.d.ts +3 -0
  77. package/dist/components/collapsible/collapsible.d.ts +56 -0
  78. package/dist/components/collapsible/collapsible.js +43 -0
  79. package/dist/components/collapsible/index.d.ts +2 -0
  80. package/dist/components/combobox/combobox.d.ts +50 -0
  81. package/dist/components/combobox/combobox.js +141 -0
  82. package/dist/components/combobox/combobox.styles.d.ts +110 -0
  83. package/dist/components/combobox/combobox.styles.js +42 -0
  84. package/dist/components/combobox/index.d.ts +3 -0
  85. package/dist/components/command-menu/command-menu.d.ts +40 -0
  86. package/dist/components/command-menu/command-menu.js +148 -0
  87. package/dist/components/command-menu/command-menu.styles.d.ts +105 -0
  88. package/dist/components/command-menu/command-menu.styles.js +30 -0
  89. package/dist/components/command-menu/index.d.ts +3 -0
  90. package/dist/components/container/container.d.ts +34 -0
  91. package/dist/components/container/container.js +30 -0
  92. package/dist/components/container/index.d.ts +2 -0
  93. package/dist/components/context-menu/context-menu.d.ts +34 -0
  94. package/dist/components/context-menu/context-menu.js +157 -0
  95. package/dist/components/context-menu/context-menu.styles.d.ts +135 -0
  96. package/dist/components/context-menu/context-menu.styles.js +14 -0
  97. package/dist/components/context-menu/index.d.ts +3 -0
  98. package/dist/components/copy-button/copy-button.d.ts +61 -0
  99. package/dist/components/copy-button/copy-button.js +79 -0
  100. package/dist/components/copy-button/index.d.ts +2 -0
  101. package/dist/components/date-picker/date-picker.d.ts +51 -0
  102. package/dist/components/date-picker/date-picker.js +235 -0
  103. package/dist/components/date-picker/date-picker.styles.d.ts +77 -0
  104. package/dist/components/date-picker/date-picker.styles.js +31 -0
  105. package/dist/components/date-picker/index.d.ts +3 -0
  106. package/dist/components/description-list/description-list.d.ts +15 -0
  107. package/dist/components/description-list/description-list.js +51 -0
  108. package/dist/components/description-list/description-list.styles.d.ts +74 -0
  109. package/dist/components/description-list/description-list.styles.js +35 -0
  110. package/dist/components/description-list/index.d.ts +3 -0
  111. package/dist/components/dialog/close-icon.js +22 -0
  112. package/dist/components/dialog/dialog.d.ts +21 -0
  113. package/dist/components/dialog/dialog.js +79 -0
  114. package/dist/components/dialog/dialog.styles.d.ts +83 -0
  115. package/dist/components/dialog/dialog.styles.js +34 -0
  116. package/dist/components/dialog/index.d.ts +3 -0
  117. package/dist/components/dropdown-menu/dropdown-menu.d.ts +34 -0
  118. package/dist/components/dropdown-menu/dropdown-menu.js +160 -0
  119. package/dist/components/dropdown-menu/dropdown-menu.styles.d.ts +83 -0
  120. package/dist/components/dropdown-menu/dropdown-menu.styles.js +38 -0
  121. package/dist/components/dropdown-menu/index.d.ts +3 -0
  122. package/dist/components/eyebrow/eyebrow.d.ts +9 -0
  123. package/dist/components/eyebrow/eyebrow.js +20 -0
  124. package/dist/components/eyebrow/eyebrow.styles.d.ts +38 -0
  125. package/dist/components/eyebrow/eyebrow.styles.js +13 -0
  126. package/dist/components/eyebrow/index.d.ts +3 -0
  127. package/dist/components/field/field-context.d.ts +25 -0
  128. package/dist/components/field/field-context.js +27 -0
  129. package/dist/components/field/field.d.ts +28 -0
  130. package/dist/{field-CVbywksE.js → components/field/field.js} +6 -35
  131. package/dist/components/field/field.styles.d.ts +53 -0
  132. package/dist/components/field/field.styles.js +22 -0
  133. package/dist/components/field/index.d.ts +4 -0
  134. package/dist/components/file-upload/file-upload.d.ts +52 -0
  135. package/dist/components/file-upload/file-upload.js +266 -0
  136. package/dist/components/file-upload/file-upload.styles.d.ts +123 -0
  137. package/dist/components/file-upload/file-upload.styles.js +32 -0
  138. package/dist/components/file-upload/index.d.ts +3 -0
  139. package/dist/components/grid/grid.d.ts +168 -0
  140. package/dist/components/grid/grid.js +126 -0
  141. package/dist/components/grid/index.d.ts +2 -0
  142. package/dist/components/heading/heading.d.ts +12 -0
  143. package/dist/components/heading/heading.js +28 -0
  144. package/dist/components/heading/heading.styles.d.ts +65 -0
  145. package/dist/components/heading/heading.styles.js +15 -0
  146. package/dist/components/heading/index.d.ts +3 -0
  147. package/dist/components/hover-card/hover-card.d.ts +43 -0
  148. package/dist/components/hover-card/hover-card.js +27 -0
  149. package/dist/components/hover-card/index.d.ts +2 -0
  150. package/dist/components/input/index.d.ts +3 -0
  151. package/dist/components/input/input.d.ts +13 -0
  152. package/dist/components/input/input.js +33 -0
  153. package/dist/components/input/input.styles.d.ts +55 -0
  154. package/dist/components/input/input.styles.js +33 -0
  155. package/dist/components/input-otp/index.d.ts +4 -0
  156. package/dist/components/input-otp/index.js +5 -0
  157. package/dist/components/input-otp/input-otp.d.ts +23 -0
  158. package/dist/components/input-otp/input-otp.js +86 -0
  159. package/dist/components/input-otp/input-otp.styles.d.ts +71 -0
  160. package/dist/components/input-otp/input-otp.styles.js +30 -0
  161. package/dist/components/kbd/index.d.ts +2 -0
  162. package/dist/components/kbd/kbd.d.ts +30 -0
  163. package/dist/components/kbd/kbd.js +17 -0
  164. package/dist/components/label/index.d.ts +2 -0
  165. package/dist/components/label/label.d.ts +31 -0
  166. package/dist/components/label/label.js +17 -0
  167. package/dist/components/link/index.d.ts +3 -0
  168. package/dist/components/link/link.d.ts +14 -0
  169. package/dist/components/link/link.js +57 -0
  170. package/dist/components/link/link.styles.d.ts +89 -0
  171. package/dist/components/link/link.styles.js +33 -0
  172. package/dist/components/modal/index.d.ts +3 -0
  173. package/dist/components/modal/modal.d.ts +33 -0
  174. package/dist/components/modal/modal.js +56 -0
  175. package/dist/components/modal/modal.styles.d.ts +61 -0
  176. package/dist/components/modal/modal.styles.js +14 -0
  177. package/dist/components/navigation-menu/index.d.ts +3 -0
  178. package/dist/components/navigation-menu/navigation-menu.d.ts +37 -0
  179. package/dist/components/navigation-menu/navigation-menu.js +138 -0
  180. package/dist/components/navigation-menu/navigation-menu.styles.d.ts +111 -0
  181. package/dist/components/navigation-menu/navigation-menu.styles.js +39 -0
  182. package/dist/components/number-input/index.d.ts +3 -0
  183. package/dist/components/number-input/number-input.d.ts +30 -0
  184. package/dist/components/number-input/number-input.js +151 -0
  185. package/dist/components/number-input/number-input.styles.d.ts +68 -0
  186. package/dist/components/number-input/number-input.styles.js +35 -0
  187. package/dist/components/pagination/index.d.ts +4 -0
  188. package/dist/components/pagination/pagination-range.d.ts +11 -0
  189. package/dist/components/pagination/pagination-range.js +42 -0
  190. package/dist/components/pagination/pagination.d.ts +18 -0
  191. package/dist/components/pagination/pagination.js +94 -0
  192. package/dist/components/pagination/pagination.styles.d.ts +65 -0
  193. package/dist/components/pagination/pagination.styles.js +35 -0
  194. package/dist/components/password-input/index.d.ts +3 -0
  195. package/dist/components/password-input/password-input.d.ts +20 -0
  196. package/dist/components/password-input/password-input.js +106 -0
  197. package/dist/components/password-input/password-input.styles.d.ts +66 -0
  198. package/dist/components/password-input/password-input.styles.js +21 -0
  199. package/dist/components/popover/index.d.ts +2 -0
  200. package/dist/components/popover/popover.d.ts +52 -0
  201. package/dist/components/popover/popover.js +35 -0
  202. package/dist/components/progress/index.d.ts +3 -0
  203. package/dist/components/progress/progress.d.ts +29 -0
  204. package/dist/components/progress/progress.js +108 -0
  205. package/dist/components/progress/progress.styles.d.ts +236 -0
  206. package/dist/components/progress/progress.styles.js +69 -0
  207. package/dist/components/prose/index.d.ts +2 -0
  208. package/dist/components/prose/prose.d.ts +90 -0
  209. package/dist/components/prose/prose.js +67 -0
  210. package/dist/components/radio-group/index.d.ts +3 -0
  211. package/dist/components/radio-group/radio-group.d.ts +26 -0
  212. package/dist/components/radio-group/radio-group.js +102 -0
  213. package/dist/components/radio-group/radio-group.styles.d.ts +80 -0
  214. package/dist/components/radio-group/radio-group.styles.js +56 -0
  215. package/dist/components/resizable/index.d.ts +3 -0
  216. package/dist/components/resizable/resizable.d.ts +17 -0
  217. package/dist/components/resizable/resizable.js +81 -0
  218. package/dist/components/resizable/resizable.styles.d.ts +53 -0
  219. package/dist/components/resizable/resizable.styles.js +19 -0
  220. package/dist/components/scroll-area/index.d.ts +2 -0
  221. package/dist/components/scroll-area/scroll-area.d.ts +70 -0
  222. package/dist/components/scroll-area/scroll-area.js +70 -0
  223. package/dist/components/section/index.d.ts +2 -0
  224. package/dist/components/section/section.d.ts +52 -0
  225. package/dist/components/section/section.js +41 -0
  226. package/dist/components/segmented-control/index.d.ts +2 -0
  227. package/dist/components/segmented-control/segmented-control.d.ts +92 -0
  228. package/dist/components/segmented-control/segmented-control.js +86 -0
  229. package/dist/components/select/index.d.ts +2 -0
  230. package/dist/components/select/select.d.ts +85 -0
  231. package/dist/components/select/select.js +81 -0
  232. package/dist/components/separator/index.d.ts +2 -0
  233. package/dist/components/separator/separator.d.ts +40 -0
  234. package/dist/components/separator/separator.js +27 -0
  235. package/dist/components/sheet/index.d.ts +3 -0
  236. package/dist/components/sheet/sheet.d.ts +20 -0
  237. package/dist/components/sheet/sheet.js +83 -0
  238. package/dist/components/sheet/sheet.styles.d.ts +101 -0
  239. package/dist/components/sheet/sheet.styles.js +62 -0
  240. package/dist/components/skeleton/index.d.ts +2 -0
  241. package/dist/components/skeleton/skeleton.d.ts +30 -0
  242. package/dist/components/skeleton/skeleton.js +18 -0
  243. package/dist/components/slider/index.d.ts +3 -0
  244. package/dist/components/slider/slider.d.ts +38 -0
  245. package/dist/components/slider/slider.js +68 -0
  246. package/dist/components/slider/slider.styles.d.ts +56 -0
  247. package/dist/components/slider/slider.styles.js +23 -0
  248. package/dist/components/spinner/index.d.ts +3 -0
  249. package/dist/components/spinner/spinner.d.ts +9 -0
  250. package/dist/components/spinner/spinner.js +36 -0
  251. package/dist/components/spinner/spinner.styles.d.ts +53 -0
  252. package/dist/components/spinner/spinner.styles.js +18 -0
  253. package/dist/components/stack/index.d.ts +2 -0
  254. package/dist/components/stack/stack.d.ts +109 -0
  255. package/dist/components/stack/stack.js +62 -0
  256. package/dist/components/stat-card/index.d.ts +3 -0
  257. package/dist/components/stat-card/stat-card.d.ts +22 -0
  258. package/dist/components/stat-card/stat-card.js +82 -0
  259. package/dist/components/stat-card/stat-card.styles.d.ts +83 -0
  260. package/dist/components/stat-card/stat-card.styles.js +16 -0
  261. package/dist/components/stepper/index.d.ts +3 -0
  262. package/dist/components/stepper/stepper.d.ts +20 -0
  263. package/dist/components/stepper/stepper.js +100 -0
  264. package/dist/components/stepper/stepper.styles.d.ts +170 -0
  265. package/dist/components/stepper/stepper.styles.js +67 -0
  266. package/dist/components/switch/index.d.ts +2 -0
  267. package/dist/components/switch/switch.d.ts +51 -0
  268. package/dist/components/switch/switch.js +43 -0
  269. package/dist/components/table/index.d.ts +2 -0
  270. package/dist/components/table/table.d.ts +78 -0
  271. package/dist/components/table/table.js +82 -0
  272. package/dist/components/tabs/index.d.ts +2 -0
  273. package/dist/components/tabs/tabs.d.ts +73 -0
  274. package/dist/components/tabs/tabs.js +103 -0
  275. package/dist/components/tag-input/index.d.ts +3 -0
  276. package/dist/components/tag-input/tag-input.d.ts +30 -0
  277. package/dist/components/tag-input/tag-input.js +149 -0
  278. package/dist/components/tag-input/tag-input.styles.d.ts +71 -0
  279. package/dist/components/tag-input/tag-input.styles.js +29 -0
  280. package/dist/components/text/index.d.ts +3 -0
  281. package/dist/components/text/text.d.ts +9 -0
  282. package/dist/components/text/text.js +25 -0
  283. package/dist/components/text/text.styles.d.ts +188 -0
  284. package/dist/components/text/text.styles.js +36 -0
  285. package/dist/components/textarea/index.d.ts +2 -0
  286. package/dist/components/textarea/textarea.d.ts +29 -0
  287. package/dist/components/textarea/textarea.js +23 -0
  288. package/dist/components/timeline/index.d.ts +3 -0
  289. package/dist/components/timeline/timeline.d.ts +28 -0
  290. package/dist/components/timeline/timeline.js +61 -0
  291. package/dist/components/timeline/timeline.styles.d.ts +110 -0
  292. package/dist/components/timeline/timeline.styles.js +30 -0
  293. package/dist/components/toast/index.d.ts +2 -0
  294. package/dist/components/toast/toast.d.ts +119 -0
  295. package/dist/components/toast/toast.js +75 -0
  296. package/dist/components/toggle/index.d.ts +3 -0
  297. package/dist/components/toggle/toggle.d.ts +20 -0
  298. package/dist/components/toggle/toggle.js +58 -0
  299. package/dist/components/toggle/toggle.styles.d.ts +80 -0
  300. package/dist/components/toggle/toggle.styles.js +34 -0
  301. package/dist/components/tooltip/index.d.ts +2 -0
  302. package/dist/components/tooltip/tooltip.d.ts +39 -0
  303. package/dist/components/tooltip/tooltip.js +29 -0
  304. package/dist/components/tree-view/index.d.ts +3 -0
  305. package/dist/components/tree-view/tree-view.d.ts +31 -0
  306. package/dist/components/tree-view/tree-view.js +192 -0
  307. package/dist/components/tree-view/tree-view.styles.d.ts +59 -0
  308. package/dist/components/tree-view/tree-view.styles.js +32 -0
  309. package/dist/components/visually-hidden/index.d.ts +2 -0
  310. package/dist/components/visually-hidden/visually-hidden.d.ts +10 -0
  311. package/dist/components/visually-hidden/visually-hidden.js +16 -0
  312. package/dist/data-table.d.ts +3 -110
  313. package/dist/data-table.js +2 -224
  314. package/dist/form.d.ts +2 -86
  315. package/dist/form.js +1 -108
  316. package/dist/hooks/index.d.ts +5 -0
  317. package/dist/hooks/use-component-config.d.ts +13 -0
  318. package/dist/hooks/use-component-config.js +22 -0
  319. package/dist/hooks/use-controllable-state.d.ts +9 -0
  320. package/dist/hooks/use-controllable-state.js +18 -0
  321. package/dist/hooks/use-media-query.d.ts +4 -0
  322. package/dist/hooks/use-media-query.js +13 -0
  323. package/dist/hooks/use-scrolled.d.ts +4 -0
  324. package/dist/hooks/use-scrolled.js +17 -0
  325. package/dist/index.d.ts +223 -6856
  326. package/dist/index.js +148 -6791
  327. package/dist/internal/dev.js +12 -0
  328. package/dist/internal/icons.js +91 -0
  329. package/dist/motion/active-indicator.d.ts +12 -0
  330. package/dist/motion/active-indicator.js +26 -0
  331. package/dist/motion/animated-number.d.ts +21 -0
  332. package/dist/motion/animated-number.js +88 -0
  333. package/dist/motion/features.js +10 -0
  334. package/dist/motion/index.d.ts +10 -0
  335. package/dist/motion/index.js +10 -0
  336. package/dist/motion/motion-root.js +48 -0
  337. package/dist/motion/page-transition.d.ts +16 -0
  338. package/dist/motion/page-transition.js +23 -0
  339. package/dist/motion/presence-list.js +46 -0
  340. package/dist/motion/presence.d.ts +11 -0
  341. package/dist/motion/presence.js +17 -0
  342. package/dist/motion/reveal.d.ts +18 -0
  343. package/dist/motion/reveal.js +37 -0
  344. package/dist/motion/stagger.d.ts +29 -0
  345. package/dist/motion/stagger.js +52 -0
  346. package/dist/motion/use-motion-settings.d.ts +25 -0
  347. package/dist/motion/use-motion-settings.js +47 -0
  348. package/dist/motion/use-reveal.d.ts +11 -0
  349. package/dist/motion/use-reveal.js +41 -0
  350. package/dist/patterns/app-shell/app-shell-context.d.ts +14 -0
  351. package/dist/patterns/app-shell/app-shell-context.js +16 -0
  352. package/dist/patterns/app-shell/app-shell.d.ts +21 -0
  353. package/dist/patterns/app-shell/app-shell.js +82 -0
  354. package/dist/patterns/app-shell/app-shell.styles.d.ts +302 -0
  355. package/dist/patterns/app-shell/app-shell.styles.js +106 -0
  356. package/dist/patterns/app-shell/index.d.ts +7 -0
  357. package/dist/patterns/app-shell/navbar.d.ts +29 -0
  358. package/dist/patterns/app-shell/navbar.js +116 -0
  359. package/dist/patterns/app-shell/page-header.d.ts +12 -0
  360. package/dist/patterns/app-shell/page-header.js +38 -0
  361. package/dist/patterns/app-shell/sidebar.d.ts +31 -0
  362. package/dist/patterns/app-shell/sidebar.js +141 -0
  363. package/dist/patterns/async/async.d.ts +40 -0
  364. package/dist/patterns/async/async.js +61 -0
  365. package/dist/patterns/async/index.d.ts +3 -0
  366. package/dist/patterns/async/states.d.ts +68 -0
  367. package/dist/patterns/async/states.js +116 -0
  368. package/dist/patterns/chart/cartesian.d.ts +128 -0
  369. package/dist/patterns/chart/cartesian.js +552 -0
  370. package/dist/patterns/chart/chart-card.d.ts +39 -0
  371. package/dist/patterns/chart/chart-card.js +103 -0
  372. package/dist/patterns/chart/chart-parts.d.ts +53 -0
  373. package/dist/patterns/chart/chart-parts.js +282 -0
  374. package/dist/patterns/chart/chart.styles.d.ts +200 -0
  375. package/dist/patterns/chart/chart.styles.js +43 -0
  376. package/dist/patterns/chart/export.d.ts +45 -0
  377. package/dist/patterns/chart/export.js +293 -0
  378. package/dist/patterns/chart/funnel.d.ts +23 -0
  379. package/dist/patterns/chart/funnel.js +129 -0
  380. package/dist/patterns/chart/heatmap.d.ts +37 -0
  381. package/dist/patterns/chart/heatmap.js +258 -0
  382. package/dist/patterns/chart/icons.js +39 -0
  383. package/dist/patterns/chart/pie.d.ts +36 -0
  384. package/dist/patterns/chart/pie.js +120 -0
  385. package/dist/patterns/chart/radial.d.ts +75 -0
  386. package/dist/patterns/chart/radial.js +282 -0
  387. package/dist/patterns/chart/sankey.d.ts +29 -0
  388. package/dist/patterns/chart/sankey.js +136 -0
  389. package/dist/patterns/chart/scatter.d.ts +42 -0
  390. package/dist/patterns/chart/scatter.js +203 -0
  391. package/dist/patterns/chart/sparkline.d.ts +20 -0
  392. package/dist/patterns/chart/sparkline.js +102 -0
  393. package/dist/patterns/chart/treemap.d.ts +25 -0
  394. package/dist/patterns/chart/treemap.js +128 -0
  395. package/dist/patterns/chart/use-element-width.js +23 -0
  396. package/dist/patterns/data-table/data-table.d.ts +109 -0
  397. package/dist/patterns/data-table/data-table.js +233 -0
  398. package/dist/patterns/form/form.d.ts +89 -0
  399. package/dist/patterns/form/form.js +111 -0
  400. package/dist/{color-mode-script-KdwItKN2.d.ts → provider/color-mode-script.d.ts} +4 -5
  401. package/dist/{color-mode-script-Bf7LYkOj.js → provider/color-mode-script.js} +1 -1
  402. package/dist/provider/color-mode.d.ts +24 -0
  403. package/dist/provider/color-mode.js +87 -0
  404. package/dist/{glyph-context-DxGJrdvr.d.ts → provider/glyph-context.d.ts} +13 -12
  405. package/dist/provider/glyph-context.js +28 -0
  406. package/dist/provider/glyph-provider.d.ts +37 -0
  407. package/dist/provider/glyph-provider.js +48 -0
  408. package/dist/provider/index.d.ts +6 -0
  409. package/dist/provider/theme-scope.d.ts +12 -0
  410. package/dist/provider/theme-scope.js +42 -0
  411. package/dist/provider/theme-style.js +15 -0
  412. package/dist/react-router.d.ts +1 -1
  413. package/dist/register.d.ts +57 -0
  414. package/dist/themes.d.ts +22 -0
  415. package/dist/themes.js +49 -0
  416. package/dist/utils/cn.d.ts +6 -0
  417. package/dist/utils/cn.js +12 -0
  418. package/dist/utils/compose-refs.js +11 -0
  419. package/dist/{registry-BGSJoiLq.d.ts → utils/registry.d.ts} +2 -3
  420. package/dist/utils/styles.js +20 -0
  421. package/dist/{tv-DuMh7UH2.d.ts → utils/tv.d.ts} +2 -2
  422. package/dist/utils/tv.js +8 -0
  423. package/dist/utils/tw-merge-config.js +13 -0
  424. package/dist/vite.d.ts +1 -1
  425. package/dist/vite.js +1 -1
  426. package/package.json +3 -2
  427. package/src/components/accordion/accordion.styles.ts +1 -1
  428. package/src/components/alert/alert.styles.ts +1 -1
  429. package/src/components/alert-dialog/alert-dialog.styles.ts +5 -4
  430. package/src/components/alert-dialog/confirm-dialog.tsx +42 -0
  431. package/src/components/alert-dialog/confirm.tsx +12 -31
  432. package/src/components/aspect-ratio/aspect-ratio.tsx +1 -1
  433. package/src/components/avatar/avatar.styles.ts +1 -1
  434. package/src/components/badge/badge.styles.ts +1 -1
  435. package/src/components/banner/banner.styles.ts +1 -1
  436. package/src/components/blockquote/blockquote.tsx +1 -1
  437. package/src/components/breadcrumb/breadcrumb.styles.ts +1 -1
  438. package/src/components/button/button.styles.ts +4 -2
  439. package/src/components/calendar/calendar.styles.ts +1 -1
  440. package/src/components/card/card.styles.ts +1 -1
  441. package/src/components/carousel/carousel.styles.ts +1 -1
  442. package/src/components/checkbox/checkbox.tsx +20 -5
  443. package/src/components/code/code.styles.ts +2 -2
  444. package/src/components/collapsible/collapsible.tsx +1 -1
  445. package/src/components/combobox/combobox.styles.ts +5 -2
  446. package/src/components/command-menu/command-menu.styles.ts +6 -4
  447. package/src/components/container/container.tsx +1 -1
  448. package/src/components/context-menu/context-menu.styles.ts +4 -2
  449. package/src/components/copy-button/copy-button.tsx +1 -1
  450. package/src/components/date-picker/date-picker.styles.ts +2 -2
  451. package/src/components/description-list/description-list.styles.ts +1 -1
  452. package/src/components/dialog/dialog.styles.ts +11 -4
  453. package/src/components/dropdown-menu/dropdown-menu.styles.ts +3 -3
  454. package/src/components/eyebrow/eyebrow.styles.ts +1 -1
  455. package/src/components/field/field.styles.ts +1 -1
  456. package/src/components/file-upload/file-upload.styles.ts +1 -1
  457. package/src/components/file-upload/file-upload.tsx +51 -48
  458. package/src/components/grid/grid.tsx +1 -1
  459. package/src/components/heading/heading.styles.ts +1 -1
  460. package/src/components/hover-card/hover-card.tsx +5 -2
  461. package/src/components/input/input.styles.ts +1 -1
  462. package/src/components/input-otp/input-otp.styles.ts +1 -1
  463. package/src/components/kbd/kbd.tsx +1 -1
  464. package/src/components/label/label.tsx +1 -1
  465. package/src/components/link/link.styles.ts +1 -1
  466. package/src/components/modal/modal.styles.ts +1 -1
  467. package/src/components/navigation-menu/navigation-menu.styles.ts +2 -2
  468. package/src/components/number-input/number-input.styles.ts +1 -1
  469. package/src/components/pagination/pagination.styles.ts +6 -4
  470. package/src/components/pagination/pagination.tsx +14 -1
  471. package/src/components/password-input/password-input.styles.ts +1 -1
  472. package/src/components/popover/popover.tsx +1 -1
  473. package/src/components/progress/progress.styles.ts +2 -2
  474. package/src/components/prose/prose.tsx +1 -1
  475. package/src/components/radio-group/radio-group.styles.ts +1 -1
  476. package/src/components/resizable/resizable.styles.ts +1 -1
  477. package/src/components/scroll-area/scroll-area.tsx +1 -1
  478. package/src/components/section/section.tsx +1 -1
  479. package/src/components/segmented-control/segmented-control.tsx +24 -8
  480. package/src/components/select/select.tsx +2 -2
  481. package/src/components/separator/separator.tsx +1 -1
  482. package/src/components/sheet/sheet.styles.ts +1 -1
  483. package/src/components/skeleton/skeleton.tsx +1 -1
  484. package/src/components/slider/slider.styles.ts +1 -1
  485. package/src/components/spinner/spinner.styles.ts +1 -1
  486. package/src/components/stack/stack.tsx +1 -1
  487. package/src/components/stat-card/stat-card.styles.ts +1 -1
  488. package/src/components/stepper/stepper.styles.ts +1 -1
  489. package/src/components/switch/switch.tsx +2 -2
  490. package/src/components/table/table.tsx +1 -1
  491. package/src/components/tabs/tabs.tsx +46 -15
  492. package/src/components/tag-input/tag-input.styles.ts +1 -1
  493. package/src/components/tag-input/tag-input.tsx +27 -18
  494. package/src/components/text/text.styles.ts +1 -1
  495. package/src/components/textarea/textarea.tsx +1 -1
  496. package/src/components/timeline/timeline.styles.ts +1 -1
  497. package/src/components/toast/toast.tsx +1 -1
  498. package/src/components/toggle/toggle.styles.ts +1 -1
  499. package/src/components/tooltip/tooltip.tsx +6 -3
  500. package/src/components/tree-view/tree-view.styles.ts +1 -1
  501. package/src/index.ts +3 -0
  502. package/src/motion/active-indicator.tsx +26 -0
  503. package/src/motion/animated-number.tsx +113 -0
  504. package/src/motion/features.ts +7 -0
  505. package/src/motion/index.ts +9 -0
  506. package/src/motion/motion-root.tsx +46 -0
  507. package/src/motion/page-transition.tsx +30 -0
  508. package/src/motion/presence-list.tsx +42 -0
  509. package/src/motion/presence.tsx +13 -0
  510. package/src/motion/reveal.tsx +50 -0
  511. package/src/motion/stagger.tsx +81 -0
  512. package/src/motion/use-motion-settings.ts +52 -0
  513. package/src/motion/use-reveal.ts +54 -0
  514. package/src/patterns/app-shell/app-shell.styles.ts +18 -11
  515. package/src/patterns/app-shell/sidebar.tsx +28 -7
  516. package/src/patterns/async/states.tsx +1 -1
  517. package/src/patterns/chart/cartesian.tsx +755 -0
  518. package/src/patterns/chart/chart-card.tsx +148 -0
  519. package/src/patterns/chart/chart-parts.tsx +323 -58
  520. package/src/patterns/chart/chart.styles.ts +29 -3
  521. package/src/patterns/chart/export.ts +334 -0
  522. package/src/patterns/chart/funnel.tsx +171 -0
  523. package/src/patterns/chart/heatmap.tsx +339 -0
  524. package/src/patterns/chart/icons.tsx +44 -0
  525. package/src/patterns/chart/index.ts +52 -7
  526. package/src/patterns/chart/pie.tsx +169 -0
  527. package/src/patterns/chart/radial.tsx +361 -0
  528. package/src/patterns/chart/sankey.tsx +197 -0
  529. package/src/patterns/chart/scatter.tsx +254 -0
  530. package/src/patterns/chart/sparkline.tsx +111 -0
  531. package/src/patterns/chart/test-utils.tsx +35 -0
  532. package/src/patterns/chart/treemap.tsx +198 -0
  533. package/src/patterns/chart/use-element-width.ts +20 -0
  534. package/src/patterns/data-table/data-table.tsx +1 -1
  535. package/src/patterns/form/form.tsx +1 -1
  536. package/src/provider/glyph-context.ts +3 -1
  537. package/src/provider/glyph-provider.tsx +31 -12
  538. package/src/provider/theme-scope.tsx +14 -9
  539. package/src/themes.ts +3 -3
  540. package/src/utils/styles.ts +17 -3
  541. package/styles.css +122 -3
  542. package/dist/field-context-7I-cWvvS.js +0 -267
  543. package/dist/index-Bi7rZ6ba.d.ts +0 -244
  544. package/dist/states-IvhjBgna.js +0 -288
  545. package/dist/tv-DLbT66dC.js +0 -70
  546. package/src/patterns/chart/chart.tsx +0 -386
@@ -1,24 +1,29 @@
1
1
  import { ToggleGroup } from 'radix-ui'
2
- import { type ReactNode, useContext } from 'react'
2
+ import { type ReactNode, useContext, useId } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
+ import { useControllableState } from '../../hooks/use-controllable-state'
4
5
  import { warnOnce } from '../../internal/dev'
6
+ import { ActiveIndicator } from '../../motion/active-indicator'
5
7
  import { focusRing, themedBorder, transition } from '../../utils/styles'
6
8
  import { tv, type VariantProps } from '../../utils/tv'
7
9
  import { FieldContext } from '../field/field-context'
8
10
 
9
- export const segmentedControlStyles = tv({
11
+ export const segmentedControlStyles = /* @__PURE__ */ tv({
10
12
  slots: {
11
13
  root: [
12
- 'inline-flex items-center gap-0.5 rounded-md border-border bg-muted p-0.5',
14
+ 'isolate inline-flex items-center gap-0.5 rounded-md border-border bg-muted p-0.5',
13
15
  themedBorder,
14
16
  ],
15
17
  item: [
16
- 'inline-flex h-full cursor-pointer select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-md)-2px)] px-3 font-medium text-muted-foreground',
18
+ 'relative inline-flex h-full cursor-pointer select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-md)-2px)] px-3 font-medium text-muted-foreground',
17
19
  transition,
18
20
  focusRing,
19
- 'hover:text-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-xs',
21
+ 'hover:text-foreground data-[state=on]:text-foreground',
20
22
  'disabled:pointer-events-none disabled:opacity-50 [&>svg]:size-4',
21
23
  ],
24
+ /** The raised thumb that slides to the selected option. */
25
+ indicator:
26
+ 'pointer-events-none absolute inset-0 -z-10 rounded-[calc(var(--radius-md)-2px)] bg-raised shadow-xs',
22
27
  },
23
28
  variants: {
24
29
  size: {
@@ -58,6 +63,12 @@ export function SegmentedControl<T extends string>(inProps: SegmentedControlProp
58
63
  const { options, value, defaultValue, onValueChange, size, fullWidth, className, ...rest } = props
59
64
  const field = useContext(FieldContext)
60
65
  const s = segmentedControlStyles({ size, fullWidth })
66
+ const [selected, setSelected] = useControllableState<T | undefined>({
67
+ value,
68
+ defaultValue,
69
+ onChange: (next) => next !== undefined && onValueChange?.(next),
70
+ })
71
+ const indicatorId = `${useId()}-segmented-indicator`
61
72
  const labelledBy = rest['aria-labelledby'] ?? (rest['aria-label'] ? undefined : field?.labelId)
62
73
  if (!rest['aria-label'] && !labelledBy) {
63
74
  warnOnce(
@@ -70,10 +81,9 @@ export function SegmentedControl<T extends string>(inProps: SegmentedControlProp
70
81
  <ToggleGroup.Root
71
82
  type="single"
72
83
  data-slot="segmented-control"
73
- {...(value !== undefined && { value })}
74
- {...(defaultValue !== undefined && { defaultValue })}
84
+ value={selected ?? ''}
75
85
  // Radix emits '' when the active item is clicked again; a segmented control never deselects.
76
- onValueChange={(next: string) => next && onValueChange?.(next as T)}
86
+ onValueChange={(next: string) => next && setSelected(next as T)}
77
87
  className={s.root({ class: [slots.root, className] })}
78
88
  aria-labelledby={labelledBy}
79
89
  aria-describedby={describedBy || undefined}
@@ -87,6 +97,12 @@ export function SegmentedControl<T extends string>(inProps: SegmentedControlProp
87
97
  className={s.item({ class: slots.item })}
88
98
  >
89
99
  {option.label}
100
+ {option.value === selected && (
101
+ <ActiveIndicator
102
+ layoutId={indicatorId}
103
+ className={s.indicator({ class: slots.indicator })}
104
+ />
105
+ )}
90
106
  </ToggleGroup.Item>
91
107
  ))}
92
108
  </ToggleGroup.Root>
@@ -7,7 +7,7 @@ import { tv, type VariantProps } from '../../utils/tv'
7
7
  import { useFieldControl } from '../field/field-context'
8
8
  import { fieldControl } from '../input/input.styles'
9
9
 
10
- export const selectStyles = tv({
10
+ export const selectStyles = /* @__PURE__ */ tv({
11
11
  slots: {
12
12
  trigger: [
13
13
  ...fieldControl,
@@ -19,7 +19,7 @@ export const selectStyles = tv({
19
19
  icon: 'size-4 shrink-0 text-faint-foreground',
20
20
  content: [
21
21
  popover,
22
- 'max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width)',
22
+ 'origin-(--radix-select-content-transform-origin) max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width)',
23
23
  ],
24
24
  viewport: 'p-1',
25
25
  item: [
@@ -3,7 +3,7 @@ import type { ComponentProps } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import { tv } from '../../utils/tv'
5
5
 
6
- export const separatorStyles = tv({
6
+ export const separatorStyles = /* @__PURE__ */ tv({
7
7
  slots: { base: 'shrink-0 bg-border' },
8
8
  variants: {
9
9
  orientation: {
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const sheetStyles = tv({
5
+ export const sheetStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  overlay:
8
8
  'fixed inset-0 z-50 bg-overlay data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out',
@@ -2,7 +2,7 @@ import type { ComponentProps } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const skeletonStyles = tv({
5
+ export const skeletonStyles = /* @__PURE__ */ tv({
6
6
  slots: { base: 'animate-pulse rounded-sm bg-muted' },
7
7
  })
8
8
 
@@ -1,7 +1,7 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const sliderStyles = tv({
4
+ export const sliderStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  wrapper: 'grid w-full gap-1.5',
7
7
  root: 'relative flex h-5 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-50',
@@ -1,6 +1,6 @@
1
1
  import { tv, type VariantProps } from '../../utils/tv'
2
2
 
3
- export const spinnerStyles = tv({
3
+ export const spinnerStyles = /* @__PURE__ */ tv({
4
4
  slots: {
5
5
  base: 'inline-block shrink-0 animate-spin',
6
6
  track: 'opacity-20',
@@ -2,7 +2,7 @@ import { Slot } from 'radix-ui'
2
2
  import type { ComponentProps } from 'react'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const stackStyles = tv({
5
+ export const stackStyles = /* @__PURE__ */ tv({
6
6
  base: 'flex',
7
7
  variants: {
8
8
  direction: { column: 'flex-col', row: 'flex-row' },
@@ -1,7 +1,7 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const statCardStyles = tv({
4
+ export const statCardStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  root: 'gap-2',
7
7
  header: 'flex items-center justify-between gap-2',
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, themedBorder, transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const stepperStyles = tv({
5
+ export const stepperStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'flex w-full list-none p-0',
8
8
  step: 'relative flex min-w-0',
@@ -5,7 +5,7 @@ import { focusRing, themedBorder, transition } from '../../utils/styles'
5
5
  import { tv, type VariantProps } from '../../utils/tv'
6
6
  import { useFieldControl } from '../field/field-context'
7
7
 
8
- export const switchStyles = tv({
8
+ export const switchStyles = /* @__PURE__ */ tv({
9
9
  slots: {
10
10
  root: [
11
11
  'peer inline-flex shrink-0 cursor-pointer items-center rounded-pill border-transparent bg-input p-px',
@@ -15,7 +15,7 @@ export const switchStyles = tv({
15
15
  'data-[state=checked]:bg-primary disabled:cursor-not-allowed disabled:opacity-50',
16
16
  ],
17
17
  thumb:
18
- 'pointer-events-none block rounded-pill bg-white shadow-sm transition-transform duration-(--glyph-duration-base) ease-emphasized data-[state=unchecked]:translate-x-0',
18
+ 'pointer-events-none block rounded-pill bg-white shadow-sm transition-[translate] duration-(--glyph-duration-spring) ease-spring data-[state=unchecked]:translate-x-0',
19
19
  },
20
20
  variants: {
21
21
  size: {
@@ -2,7 +2,7 @@ import type { ComponentProps } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const tableStyles = tv({
5
+ export const tableStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  wrapper: 'relative w-full overflow-x-auto',
8
8
  table: 'w-full caption-bottom border-collapse text-small tabular-nums',
@@ -1,13 +1,16 @@
1
1
  import { Tabs as TabsPrimitive } from 'radix-ui'
2
- import { type ComponentProps, createContext, useContext } from 'react'
2
+ import { type ComponentProps, createContext, useContext, useId } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
+ import { useControllableState } from '../../hooks/use-controllable-state'
5
+ import { ActiveIndicator } from '../../motion/active-indicator'
4
6
  import { focusRing, themedBorder, transition } from '../../utils/styles'
5
7
  import { tv, type VariantProps } from '../../utils/tv'
6
8
 
7
- export const tabsStyles = tv({
9
+ export const tabsStyles = /* @__PURE__ */ tv({
8
10
  slots: {
9
11
  root: 'flex flex-col gap-4',
10
- list: 'flex items-center',
12
+ // Isolated so the sliding indicator stays under every tab's label while it moves.
13
+ list: 'isolate flex items-center',
11
14
  trigger: [
12
15
  'relative inline-flex cursor-pointer select-none items-center justify-center gap-2 whitespace-nowrap text-small font-medium text-muted-foreground',
13
16
  transition,
@@ -15,19 +18,21 @@ export const tabsStyles = tv({
15
18
  'hover:text-foreground data-[state=active]:text-foreground disabled:pointer-events-none disabled:opacity-50',
16
19
  '[&>svg]:size-4',
17
20
  ],
21
+ /** Slides to the active tab. Underline bar or pill background, by variant. */
22
+ indicator: 'pointer-events-none absolute',
18
23
  content: 'outline-none',
19
24
  },
20
25
  variants: {
21
26
  variant: {
22
27
  underline: {
23
28
  list: 'gap-5 border-b border-border',
24
- trigger:
25
- 'h-9 after:absolute after:inset-x-0 after:-bottom-px after:h-0.5 after:rounded-pill after:bg-transparent data-[state=active]:after:bg-foreground',
29
+ trigger: 'h-9',
30
+ indicator: 'inset-x-0 -bottom-px h-0.5 rounded-pill bg-foreground',
26
31
  },
27
32
  pill: {
28
33
  list: ['inline-flex w-fit gap-0.5 rounded-md border-border bg-muted p-0.5', themedBorder],
29
- trigger:
30
- 'h-7 rounded-[calc(var(--radius-md)-2px)] px-3 data-[state=active]:bg-raised data-[state=active]:shadow-xs',
34
+ trigger: 'h-7 rounded-[calc(var(--radius-md)-2px)] px-3',
35
+ indicator: 'inset-0 -z-10 rounded-[calc(var(--radius-md)-2px)] bg-raised shadow-xs',
31
36
  },
32
37
  },
33
38
  },
@@ -35,17 +40,31 @@ export const tabsStyles = tv({
35
40
  })
36
41
 
37
42
  type TabsVariants = VariantProps<typeof tabsStyles>
38
- const TabsContext = createContext<TabsVariants>({})
43
+ interface TabsContextValue extends TabsVariants {
44
+ value?: string
45
+ indicatorId?: string
46
+ }
47
+ const TabsContext = createContext<TabsContextValue>({})
39
48
 
40
49
  export interface TabsProps extends ComponentProps<typeof TabsPrimitive.Root>, TabsVariants {}
41
50
 
42
51
  export function Tabs(inProps: TabsProps) {
43
- const [{ variant, className, ...rest }, slots] = useComponentConfig('Tabs', inProps)
52
+ const [props, slots] = useComponentConfig('Tabs', inProps)
53
+ const { variant, className, value: valueProp, defaultValue, onValueChange, ...rest } = props
54
+ // Tracked here so the active trigger can host the sliding indicator.
55
+ const [value, setValue] = useControllableState({
56
+ value: valueProp,
57
+ defaultValue: defaultValue ?? '',
58
+ onChange: onValueChange,
59
+ })
60
+ const indicatorId = `${useId()}-tabs-indicator`
44
61
  return (
45
- <TabsContext.Provider value={{ variant }}>
62
+ <TabsContext.Provider value={{ variant, value, indicatorId }}>
46
63
  <TabsPrimitive.Root
47
64
  data-slot="tabs"
48
65
  className={tabsStyles({ variant }).root({ class: [slots.root, className] })}
66
+ value={value}
67
+ onValueChange={setValue}
49
68
  {...rest}
50
69
  />
51
70
  </TabsContext.Provider>
@@ -53,9 +72,9 @@ export function Tabs(inProps: TabsProps) {
53
72
  }
54
73
 
55
74
  function useTabsParts() {
56
- const { variant } = useContext(TabsContext)
75
+ const context = useContext(TabsContext)
57
76
  const [, slots] = useComponentConfig('Tabs', {})
58
- return { s: tabsStyles({ variant }), slots }
77
+ return { s: tabsStyles({ variant: context.variant }), slots, context }
59
78
  }
60
79
 
61
80
  export function TabsList({ className, ...props }: ComponentProps<typeof TabsPrimitive.List>) {
@@ -69,14 +88,26 @@ export function TabsList({ className, ...props }: ComponentProps<typeof TabsPrim
69
88
  )
70
89
  }
71
90
 
72
- export function TabsTrigger({ className, ...props }: ComponentProps<typeof TabsPrimitive.Trigger>) {
73
- const { s, slots } = useTabsParts()
91
+ export function TabsTrigger({
92
+ className,
93
+ children,
94
+ ...props
95
+ }: ComponentProps<typeof TabsPrimitive.Trigger>) {
96
+ const { s, slots, context } = useTabsParts()
74
97
  return (
75
98
  <TabsPrimitive.Trigger
76
99
  data-slot="tabs-trigger"
77
100
  className={s.trigger({ class: [slots.trigger, className] })}
78
101
  {...props}
79
- />
102
+ >
103
+ {children}
104
+ {context.indicatorId && context.value === props.value && (
105
+ <ActiveIndicator
106
+ layoutId={context.indicatorId}
107
+ className={s.indicator({ class: slots.indicator })}
108
+ />
109
+ )}
110
+ </TabsPrimitive.Trigger>
80
111
  )
81
112
  }
82
113
 
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
  import { fieldControl } from '../input/input.styles'
4
4
 
5
- export const tagInputStyles = tv({
5
+ export const tagInputStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'grid gap-1.5',
8
8
  frame: [
@@ -1,6 +1,7 @@
1
1
  import { type ClipboardEvent, type KeyboardEvent, useId, useRef, useState } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { useControllableState } from '../../hooks/use-controllable-state'
4
+ import { PresenceItem, PresenceList } from '../../motion/presence-list'
4
5
  import { useFieldControl } from '../field/field-context'
5
6
  import { type TagInputVariants, tagInputStyles } from './tag-input.styles'
6
7
 
@@ -147,24 +148,32 @@ export function TagInput(inProps: TagInputProps) {
147
148
  className={s.frame({ class: slots.frame })}
148
149
  onClick={() => inputRef.current?.focus()}
149
150
  >
150
- {tags.map((tag, index) => (
151
- <span key={`${tag}-${index}`} data-slot="tag" className={s.tag({ class: slots.tag })}>
152
- <span className={s.tagLabel({ class: slots.tagLabel })}>{tag}</span>
153
- {!disabled && (
154
- <button
155
- type="button"
156
- aria-label={`Remove ${tag}`}
157
- className={s.remove({ class: slots.remove })}
158
- onClick={(event) => {
159
- event.stopPropagation()
160
- remove(index)
161
- }}
162
- >
163
- <XIcon />
164
- </button>
165
- )}
166
- </span>
167
- ))}
151
+ <PresenceList>
152
+ {tags.map((tag, index) => (
153
+ <PresenceItem
154
+ as="span"
155
+ // Keyed by value and occurrence, so removing one tag doesn't re-key the rest.
156
+ key={`${tag}-${tags.slice(0, index).filter((t) => t === tag).length}`}
157
+ data-slot="tag"
158
+ className={s.tag({ class: slots.tag })}
159
+ >
160
+ <span className={s.tagLabel({ class: slots.tagLabel })}>{tag}</span>
161
+ {!disabled && (
162
+ <button
163
+ type="button"
164
+ aria-label={`Remove ${tag}`}
165
+ className={s.remove({ class: slots.remove })}
166
+ onClick={(event) => {
167
+ event.stopPropagation()
168
+ remove(index)
169
+ }}
170
+ >
171
+ <XIcon />
172
+ </button>
173
+ )}
174
+ </PresenceItem>
175
+ ))}
176
+ </PresenceList>
168
177
  <input
169
178
  ref={inputRef}
170
179
  id={id}
@@ -1,6 +1,6 @@
1
1
  import { tv, type VariantProps } from '../../utils/tv'
2
2
 
3
- export const textStyles = tv({
3
+ export const textStyles = /* @__PURE__ */ tv({
4
4
  slots: { base: '' },
5
5
  variants: {
6
6
  size: {
@@ -4,7 +4,7 @@ import { tv } from '../../utils/tv'
4
4
  import { useFieldControl } from '../field/field-context'
5
5
  import { fieldControl } from '../input/input.styles'
6
6
 
7
- export const textareaStyles = tv({
7
+ export const textareaStyles = /* @__PURE__ */ tv({
8
8
  slots: {
9
9
  base: [
10
10
  ...fieldControl,
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { themedBorder } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const timelineStyles = tv({
5
+ export const timelineStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'grid',
8
8
  item: 'group/item relative grid grid-cols-[auto_1fr] gap-x-3',
@@ -5,7 +5,7 @@ import type { StylesEntry } from '../../utils/registry'
5
5
  import { focusRing, themedBorder, transition } from '../../utils/styles'
6
6
  import { tv } from '../../utils/tv'
7
7
 
8
- export const toastStyles = tv({
8
+ export const toastStyles = /* @__PURE__ */ tv({
9
9
  slots: {
10
10
  toast: [
11
11
  'group flex w-(--width) items-start gap-3 rounded-lg border-border bg-raised p-4 text-small text-foreground shadow-lg',
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, themedBorder, transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const toggleStyles = tv({
5
+ export const toggleStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  base: [
8
8
  'inline-flex shrink-0 cursor-pointer select-none items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-muted-foreground',
@@ -1,12 +1,15 @@
1
1
  import { Tooltip as TooltipPrimitive } from 'radix-ui'
2
2
  import type { ComponentProps, ReactNode } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
+ import { popoverMotion } from '../../utils/styles'
4
5
  import { tv } from '../../utils/tv'
5
6
 
6
- export const tooltipStyles = tv({
7
+ export const tooltipStyles = /* @__PURE__ */ tv({
7
8
  slots: {
8
- content:
9
- 'z-50 max-w-xs animate-pop-in rounded-sm bg-secondary px-2 py-1 text-caption text-secondary-foreground shadow-md',
9
+ content: [
10
+ 'z-50 max-w-xs origin-(--radix-tooltip-content-transform-origin) rounded-sm bg-secondary px-2 py-1 text-caption text-secondary-foreground shadow-md',
11
+ popoverMotion,
12
+ ],
10
13
  },
11
14
  })
12
15
 
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const treeViewStyles = tv({
5
+ export const treeViewStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'grid gap-px text-small',
8
8
  // Focus and selection are drawn on the item's own row only, never on nested rows.
package/src/index.ts CHANGED
@@ -6,8 +6,10 @@ export {
6
6
  type ColorToken,
7
7
  type ComponentOverrides,
8
8
  defineTheme,
9
+ type MotionLevel,
9
10
  type RadiusToken,
10
11
  type ShadowToken,
12
+ type SpringConfig,
11
13
  type TextToken,
12
14
  type Theme,
13
15
  type ThemeInput,
@@ -87,6 +89,7 @@ export * from './components/tooltip'
87
89
  export * from './components/tree-view'
88
90
  export * from './components/visually-hidden'
89
91
  export * from './hooks'
92
+ export * from './motion'
90
93
  // Patterns
91
94
  export * from './patterns/app-shell'
92
95
  export * from './patterns/async'
@@ -0,0 +1,26 @@
1
+ import { m } from 'motion/react'
2
+ import { useMotionSettings } from './use-motion-settings'
3
+
4
+ interface ActiveIndicatorProps {
5
+ /** Shared by every indicator in one group, so the active one slides between items. */
6
+ layoutId: string
7
+ className?: string | undefined
8
+ }
9
+
10
+ /**
11
+ * The highlight behind (or under) the active item of Tabs, SegmentedControl, Sidebar and
12
+ * similar. Rendered only inside the active item; `motion` animates it from the previous one.
13
+ */
14
+ export function ActiveIndicator({ layoutId, className }: ActiveIndicatorProps) {
15
+ const { animate } = useMotionSettings()
16
+ if (!animate) return <span aria-hidden="true" data-slot="indicator" className={className} />
17
+ return (
18
+ <m.span
19
+ aria-hidden="true"
20
+ data-slot="indicator"
21
+ layoutId={layoutId}
22
+ initial={false}
23
+ className={className}
24
+ />
25
+ )
26
+ }
@@ -0,0 +1,113 @@
1
+ import { springEasing, springPosition } from '@glyphui/tokens'
2
+ import { type ComponentProps, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
3
+ import { cn } from '../utils/cn'
4
+ import { useMotionSettings } from './use-motion-settings'
5
+
6
+ const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect
7
+
8
+ export interface AnimatedNumberProps extends Omit<ComponentProps<'span'>, 'children'> {
9
+ value: number
10
+ /** Intl number formatting, e.g. `{ style: 'currency', currency: 'USD' }`. */
11
+ format?: Intl.NumberFormatOptions
12
+ locale?: string
13
+ /** Full control over the text, e.g. your own price formatter. Overrides `format`. */
14
+ formatValue?: (value: number) => string
15
+ /**
16
+ * Where the first count starts. Defaults to 0, counting up once the number scrolls into
17
+ * view. Set it to `value` to skip the first count.
18
+ */
19
+ from?: number
20
+ }
21
+
22
+ /**
23
+ * A number that springs to each new value: stats, prices, counters. Screen readers get the
24
+ * final value once, not every frame. Shows the final value immediately when motion is off.
25
+ */
26
+ export function AnimatedNumber({
27
+ value,
28
+ format,
29
+ locale,
30
+ formatValue,
31
+ from = 0,
32
+ className,
33
+ ref,
34
+ ...props
35
+ }: AnimatedNumberProps) {
36
+ const { animate, spring } = useMotionSettings()
37
+ const formatter = useMemo(() => new Intl.NumberFormat(locale, format), [locale, format])
38
+ const text = (n: number) => (formatValue ? formatValue(n) : formatter.format(n))
39
+ // Render the real value first: server HTML, tests and no-JS visitors see the right number.
40
+ const [shown, setShown] = useState(value)
41
+ const current = useRef(value)
42
+ const el = useRef<HTMLSpanElement>(null)
43
+ const [armed, setArmed] = useState(false)
44
+ const [inView, setInView] = useState(false)
45
+
46
+ // Before the first paint, rewind to `from` and wait until the number is on screen.
47
+ useIsomorphicLayoutEffect(() => {
48
+ const node = el.current
49
+ if (!node || !animate || typeof IntersectionObserver === 'undefined') return
50
+ current.current = from
51
+ setShown(from)
52
+ setArmed(true)
53
+ const observer = new IntersectionObserver(([entry]) => {
54
+ if (entry?.isIntersecting) {
55
+ setInView(true)
56
+ observer.disconnect()
57
+ }
58
+ })
59
+ observer.observe(node)
60
+ return () => observer.disconnect()
61
+ // Only on mount and when motion turns on: later changes to `from` don't restart it.
62
+ }, [animate])
63
+
64
+ useEffect(() => {
65
+ if (!animate || !armed) {
66
+ current.current = value
67
+ setShown(value)
68
+ return
69
+ }
70
+ if (!inView) return
71
+ const start = current.current
72
+ if (start === value) return
73
+ const { duration } = springEasing(spring)
74
+ const begin = performance.now()
75
+ let frame = 0
76
+ const tick = (now: number) => {
77
+ const elapsed = Math.min(now - begin, duration)
78
+ const next = start + (value - start) * springPosition(spring, elapsed / 1000)
79
+ current.current = next
80
+ setShown(next)
81
+ if (elapsed < duration) frame = requestAnimationFrame(tick)
82
+ else {
83
+ current.current = value
84
+ setShown(value)
85
+ }
86
+ }
87
+ frame = requestAnimationFrame(tick)
88
+ return () => cancelAnimationFrame(frame)
89
+ }, [value, animate, armed, inView, spring])
90
+
91
+ return (
92
+ <span
93
+ data-slot="animated-number"
94
+ ref={(node) => {
95
+ el.current = node
96
+ if (typeof ref === 'function') ref(node)
97
+ else if (ref) ref.current = node
98
+ }}
99
+ className={cn('tabular-nums', className)}
100
+ {...props}
101
+ >
102
+ {shown === value ? (
103
+ text(value)
104
+ ) : (
105
+ // While counting, screen readers get the final value once, not every frame.
106
+ <>
107
+ <span aria-hidden="true">{text(shown)}</span>
108
+ <span className="sr-only">{text(value)}</span>
109
+ </>
110
+ )}
111
+ </span>
112
+ )
113
+ }
@@ -0,0 +1,7 @@
1
+ import { domMax } from 'motion/react'
2
+
3
+ /**
4
+ * Animation features, loaded on demand by `LazyMotion` so they stay out of the initial
5
+ * bundle. `domMax` because shared `layoutId` indicators need layout animations.
6
+ */
7
+ export default domMax
@@ -0,0 +1,9 @@
1
+ export { m } from 'motion/react'
2
+ export { ActiveIndicator } from './active-indicator'
3
+ export { AnimatedNumber, type AnimatedNumberProps } from './animated-number'
4
+ export { PageTransition, type PageTransitionProps } from './page-transition'
5
+ export { Presence, type PresenceProps } from './presence'
6
+ export { Reveal, type RevealProps } from './reveal'
7
+ export { Stagger, StaggerItem, type StaggerItemProps, type StaggerProps } from './stagger'
8
+ export { type MotionSettings, useMotionSettings } from './use-motion-settings'
9
+ export type { RevealOptions } from './use-reveal'