@glyphui/ui 0.3.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 (563) hide show
  1. package/README.md +68 -12
  2. package/dist/chart.d.ts +14 -202
  3. package/dist/chart.js +14 -456
  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-CWZ_FdkD.js → components/field/field.js} +20 -34
  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 -79
  315. package/dist/form.js +1 -83
  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 -6849
  326. package/dist/index.js +148 -6718
  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/provider/color-mode-script.d.ts +15 -0
  401. package/dist/provider/color-mode-script.js +13 -0
  402. package/dist/provider/color-mode.d.ts +24 -0
  403. package/dist/provider/color-mode.js +87 -0
  404. package/dist/provider/glyph-context.d.ts +51 -0
  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 +18 -0
  413. package/dist/react-router.js +44 -0
  414. package/dist/register.d.ts +57 -0
  415. package/dist/themes.d.ts +22 -0
  416. package/dist/themes.js +49 -0
  417. package/dist/utils/cn.d.ts +6 -0
  418. package/dist/utils/cn.js +12 -0
  419. package/dist/utils/compose-refs.js +11 -0
  420. package/dist/{registry-BGSJoiLq.d.ts → utils/registry.d.ts} +2 -3
  421. package/dist/utils/styles.js +20 -0
  422. package/dist/{tv-DuMh7UH2.d.ts → utils/tv.d.ts} +2 -2
  423. package/dist/utils/tv.js +8 -0
  424. package/dist/utils/tw-merge-config.js +13 -0
  425. package/dist/vite.d.ts +27 -0
  426. package/dist/vite.js +29 -0
  427. package/fonts.css +10 -0
  428. package/package.json +33 -5
  429. package/src/components/accordion/accordion.styles.ts +1 -1
  430. package/src/components/alert/alert.styles.ts +1 -1
  431. package/src/components/alert-dialog/alert-dialog.styles.ts +5 -4
  432. package/src/components/alert-dialog/confirm-dialog.tsx +42 -0
  433. package/src/components/alert-dialog/confirm.tsx +12 -31
  434. package/src/components/aspect-ratio/aspect-ratio.tsx +1 -1
  435. package/src/components/avatar/avatar.styles.ts +1 -1
  436. package/src/components/badge/badge.styles.ts +12 -17
  437. package/src/components/banner/banner.styles.ts +5 -5
  438. package/src/components/blockquote/blockquote.tsx +1 -1
  439. package/src/components/breadcrumb/breadcrumb.styles.ts +1 -1
  440. package/src/components/button/button.styles.ts +6 -2
  441. package/src/components/calendar/calendar.styles.ts +4 -3
  442. package/src/components/card/card.styles.ts +1 -1
  443. package/src/components/carousel/carousel.styles.ts +1 -1
  444. package/src/components/checkbox/checkbox.tsx +20 -5
  445. package/src/components/code/code.styles.ts +2 -2
  446. package/src/components/collapsible/collapsible.tsx +1 -1
  447. package/src/components/combobox/combobox.styles.ts +5 -2
  448. package/src/components/command-menu/command-menu.styles.ts +6 -4
  449. package/src/components/container/container.tsx +1 -1
  450. package/src/components/context-menu/context-menu.styles.ts +4 -2
  451. package/src/components/copy-button/copy-button.tsx +1 -1
  452. package/src/components/date-picker/date-picker.styles.ts +2 -2
  453. package/src/components/description-list/description-list.styles.ts +1 -1
  454. package/src/components/dialog/dialog.styles.ts +11 -4
  455. package/src/components/dropdown-menu/dropdown-menu.styles.ts +5 -5
  456. package/src/components/eyebrow/eyebrow.styles.ts +2 -2
  457. package/src/components/field/field-context.ts +2 -0
  458. package/src/components/field/field.styles.ts +5 -3
  459. package/src/components/field/field.tsx +25 -4
  460. package/src/components/file-upload/file-upload.styles.ts +4 -4
  461. package/src/components/file-upload/file-upload.tsx +51 -48
  462. package/src/components/grid/grid.tsx +1 -1
  463. package/src/components/heading/heading.styles.ts +1 -1
  464. package/src/components/hover-card/hover-card.tsx +5 -2
  465. package/src/components/input/input.styles.ts +1 -1
  466. package/src/components/input-otp/input-otp.styles.ts +1 -1
  467. package/src/components/kbd/kbd.tsx +1 -1
  468. package/src/components/label/label.tsx +1 -1
  469. package/src/components/link/link.styles.ts +2 -2
  470. package/src/components/modal/modal.styles.ts +3 -1
  471. package/src/components/modal/modal.tsx +30 -5
  472. package/src/components/navigation-menu/navigation-menu.styles.ts +2 -2
  473. package/src/components/navigation-menu/navigation-menu.tsx +14 -4
  474. package/src/components/number-input/number-input.styles.ts +1 -1
  475. package/src/components/pagination/pagination.styles.ts +6 -4
  476. package/src/components/pagination/pagination.tsx +14 -1
  477. package/src/components/password-input/password-input.styles.ts +4 -4
  478. package/src/components/popover/popover.tsx +1 -1
  479. package/src/components/progress/progress.styles.ts +2 -2
  480. package/src/components/prose/prose.tsx +2 -2
  481. package/src/components/radio-group/radio-group.styles.ts +1 -1
  482. package/src/components/resizable/resizable.styles.ts +1 -1
  483. package/src/components/scroll-area/scroll-area.tsx +24 -2
  484. package/src/components/section/section.tsx +1 -1
  485. package/src/components/segmented-control/segmented-control.tsx +40 -9
  486. package/src/components/select/select.tsx +2 -2
  487. package/src/components/separator/separator.tsx +1 -1
  488. package/src/components/sheet/sheet.styles.ts +1 -1
  489. package/src/components/skeleton/skeleton.tsx +1 -1
  490. package/src/components/slider/slider.styles.ts +1 -1
  491. package/src/components/slider/slider.tsx +9 -2
  492. package/src/components/spinner/spinner.styles.ts +1 -1
  493. package/src/components/stack/stack.tsx +1 -1
  494. package/src/components/stat-card/stat-card.styles.ts +1 -1
  495. package/src/components/stepper/stepper.styles.ts +3 -3
  496. package/src/components/switch/switch.tsx +2 -2
  497. package/src/components/table/table.tsx +1 -1
  498. package/src/components/tabs/tabs.tsx +46 -15
  499. package/src/components/tag-input/tag-input.styles.ts +2 -2
  500. package/src/components/tag-input/tag-input.tsx +27 -18
  501. package/src/components/text/text.styles.ts +5 -5
  502. package/src/components/textarea/textarea.tsx +1 -1
  503. package/src/components/timeline/timeline.styles.ts +1 -1
  504. package/src/components/toast/toast.tsx +1 -1
  505. package/src/components/toggle/toggle.styles.ts +1 -1
  506. package/src/components/tooltip/tooltip.tsx +6 -3
  507. package/src/components/tree-view/tree-view.styles.ts +1 -1
  508. package/src/index.ts +3 -0
  509. package/src/integrations/react-router.tsx +39 -0
  510. package/src/integrations/vite.test-d.ts +6 -0
  511. package/src/integrations/vite.test.ts +28 -0
  512. package/src/integrations/vite.ts +33 -0
  513. package/src/internal/dev.ts +12 -0
  514. package/src/motion/active-indicator.tsx +26 -0
  515. package/src/motion/animated-number.tsx +113 -0
  516. package/src/motion/features.ts +7 -0
  517. package/src/motion/index.ts +9 -0
  518. package/src/motion/motion-root.tsx +46 -0
  519. package/src/motion/page-transition.tsx +30 -0
  520. package/src/motion/presence-list.tsx +42 -0
  521. package/src/motion/presence.tsx +13 -0
  522. package/src/motion/reveal.tsx +50 -0
  523. package/src/motion/stagger.tsx +81 -0
  524. package/src/motion/use-motion-settings.ts +52 -0
  525. package/src/motion/use-reveal.ts +54 -0
  526. package/src/patterns/app-shell/app-shell.styles.ts +19 -12
  527. package/src/patterns/app-shell/navbar.tsx +34 -16
  528. package/src/patterns/app-shell/sidebar.tsx +35 -9
  529. package/src/patterns/async/states.tsx +1 -1
  530. package/src/patterns/chart/cartesian.tsx +755 -0
  531. package/src/patterns/chart/chart-card.tsx +148 -0
  532. package/src/patterns/chart/chart-parts.tsx +330 -57
  533. package/src/patterns/chart/chart.styles.ts +29 -3
  534. package/src/patterns/chart/export.ts +334 -0
  535. package/src/patterns/chart/funnel.tsx +171 -0
  536. package/src/patterns/chart/heatmap.tsx +339 -0
  537. package/src/patterns/chart/icons.tsx +44 -0
  538. package/src/patterns/chart/index.ts +52 -7
  539. package/src/patterns/chart/pie.tsx +169 -0
  540. package/src/patterns/chart/radial.tsx +361 -0
  541. package/src/patterns/chart/sankey.tsx +197 -0
  542. package/src/patterns/chart/scatter.tsx +254 -0
  543. package/src/patterns/chart/sparkline.tsx +111 -0
  544. package/src/patterns/chart/test-utils.tsx +35 -0
  545. package/src/patterns/chart/treemap.tsx +198 -0
  546. package/src/patterns/chart/use-element-width.ts +20 -0
  547. package/src/patterns/data-table/data-table.tsx +1 -1
  548. package/src/patterns/form/form.tsx +49 -7
  549. package/src/patterns/form/index.ts +1 -0
  550. package/src/provider/color-mode-script.ts +28 -0
  551. package/src/provider/color-mode.tsx +14 -20
  552. package/src/provider/glyph-context.ts +41 -1
  553. package/src/provider/glyph-provider.tsx +45 -14
  554. package/src/provider/index.ts +4 -0
  555. package/src/provider/theme-scope.tsx +20 -11
  556. package/src/themes.ts +3 -3
  557. package/src/utils/styles.ts +17 -3
  558. package/styles.css +194 -3
  559. package/dist/field-context-anGPYXbW.js +0 -267
  560. package/dist/index-BWK4czIG.d.ts +0 -233
  561. package/dist/states-DR-OoDT-.js +0 -288
  562. package/dist/tv-DBAGlgXJ.js +0 -58
  563. package/src/patterns/chart/chart.tsx +0 -369
@@ -1,7 +1,7 @@
1
1
  import { Slider as SliderPrimitive } from 'radix-ui'
2
- import type { ReactNode } from 'react'
2
+ import { type ReactNode, useContext } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
- import { useFieldControl } from '../field/field-context'
4
+ import { FieldContext, useFieldControl } from '../field/field-context'
5
5
  import { sliderStyles } from './slider.styles'
6
6
 
7
7
  export type SliderValue = number | readonly [number, number]
@@ -31,7 +31,9 @@ export interface SliderProps<V extends SliderValue> {
31
31
  name?: string
32
32
  id?: string
33
33
  className?: string
34
+ /** Accessible name. Inside a `Field`, the field's label is used when this is not set. */
34
35
  'aria-label'?: string
36
+ 'aria-labelledby'?: string
35
37
  'aria-describedby'?: string
36
38
  'aria-invalid'?: boolean
37
39
  /** Accessible names for range thumbs. Default: "Minimum", "Maximum". */
@@ -61,9 +63,13 @@ export function Slider<V extends SliderValue = number>(inProps: SliderProps<V>)
61
63
  className,
62
64
  thumbLabels = ['Minimum', 'Maximum'],
63
65
  'aria-label': ariaLabel,
66
+ 'aria-labelledby': ariaLabelledBy,
64
67
  'aria-describedby': ariaDescribedBy,
65
68
  'aria-invalid': ariaInvalid,
66
69
  } = props
70
+ const field = useContext(FieldContext)
71
+ // Thumbs are not labelable elements, so a Field's <label for> can't name them.
72
+ const labelledBy = ariaLabelledBy ?? (ariaLabel ? undefined : field?.labelId)
67
73
  const isRange = Array.isArray(value ?? defaultValue)
68
74
  const fromArray = (next: number[]) => (isRange ? [next[0], next[1]] : next[0]) as V
69
75
  const current = toArray(value) ?? toArray(defaultValue) ?? [min]
@@ -97,6 +103,7 @@ export function Slider<V extends SliderValue = number>(inProps: SliderProps<V>)
97
103
  key={index}
98
104
  id={index === 0 ? id : undefined}
99
105
  aria-label={isRange ? thumbLabels[index] : ariaLabel}
106
+ aria-labelledby={isRange ? undefined : labelledBy}
100
107
  aria-describedby={ariaDescribedBy}
101
108
  aria-invalid={ariaInvalid}
102
109
  className={s.thumb({ class: slots.thumb })}
@@ -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',
@@ -41,7 +41,7 @@ export const stepperStyles = tv({
41
41
  title: 'text-foreground',
42
42
  },
43
43
  current: {
44
- indicator: 'border-primary bg-surface text-primary ring-4 ring-primary/15',
44
+ indicator: 'border-primary bg-surface text-primary-text ring-4 ring-primary/15',
45
45
  connector: 'bg-border',
46
46
  title: 'text-foreground',
47
47
  },
@@ -53,7 +53,7 @@ export const stepperStyles = tv({
53
53
  error: {
54
54
  indicator: 'border-danger bg-danger text-danger-foreground',
55
55
  connector: 'bg-border',
56
- title: 'text-danger',
56
+ title: 'text-danger-text',
57
57
  },
58
58
  },
59
59
  clickable: {
@@ -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: [
@@ -18,7 +18,7 @@ export const tagInputStyles = tv({
18
18
  'inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-pill text-muted-foreground hover:bg-border-strong/40 hover:text-foreground focus-visible:outline-2 focus-visible:outline-ring [&>svg]:size-3',
19
19
  input:
20
20
  'h-7 min-w-24 flex-1 bg-transparent px-1 text-foreground outline-none placeholder:text-faint-foreground disabled:cursor-not-allowed',
21
- message: 'text-small font-medium text-danger',
21
+ message: 'text-small font-medium text-danger-text',
22
22
  },
23
23
  variants: {
24
24
  size: {
@@ -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: {
@@ -13,10 +13,10 @@ export const textStyles = tv({
13
13
  default: { base: 'text-foreground' },
14
14
  muted: { base: 'text-muted-foreground' },
15
15
  faint: { base: 'text-faint-foreground' },
16
- primary: { base: 'text-primary' },
17
- success: { base: 'text-success' },
18
- warning: { base: 'text-warning' },
19
- danger: { base: 'text-danger' },
16
+ primary: { base: 'text-primary-text' },
17
+ success: { base: 'text-success-text' },
18
+ warning: { base: 'text-warning-text' },
19
+ danger: { base: 'text-danger-text' },
20
20
  },
21
21
  weight: {
22
22
  regular: { base: 'font-normal' },
@@ -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,39 @@
1
+ import { Link, useLocation } from 'react-router'
2
+ import type { GlyphRouter, IsActiveOptions, LinkComponentProps } from '../provider/glyph-context'
3
+
4
+ const isOutsideApp = (href: string) =>
5
+ href.startsWith('#') || href.startsWith('//') || /^[a-z][a-z\d+.-]*:/i.test(href)
6
+
7
+ /**
8
+ * React Router's `Link`, taking Glyph's `href` prop. Hash links, external URLs and `mailto:`
9
+ * stay plain anchors, so in-page anchors scroll and external links leave the app.
10
+ */
11
+ export function RouterLink({ href, ...props }: LinkComponentProps) {
12
+ if (isOutsideApp(href)) return <a href={href} {...props} />
13
+ return <Link to={href} {...props} />
14
+ }
15
+
16
+ const trimSlash = (path: string) => (path.length > 1 ? path.replace(/\/+$/, '') : path)
17
+
18
+ /** Whether an in-app `href` matches a pathname, with React Router's `NavLink` semantics. */
19
+ export function matchPath(href: string, pathname: string, { end = false }: IsActiveOptions = {}) {
20
+ // Hash links, external URLs and protocol links never mark an item active.
21
+ if (!href || isOutsideApp(href)) return false
22
+ const target = trimSlash(new URL(href, 'http://glyph.local').pathname)
23
+ const current = trimSlash(pathname)
24
+ if (end || target === '/') return current === target
25
+ return current === target || current.startsWith(`${target}/`)
26
+ }
27
+
28
+ /** Marks a link active when the current location matches it, like React Router's `NavLink`. */
29
+ export function useRouterIsActive(href: string, options?: IsActiveOptions): boolean {
30
+ const { pathname } = useLocation()
31
+ return matchPath(href, pathname, options)
32
+ }
33
+
34
+ /**
35
+ * Connects Glyph's navigation to React Router (v7 or later):
36
+ * `<GlyphProvider router={reactRouter}>`. Links render client-side, and Sidebar, Navbar
37
+ * and NavigationMenu items mark the current page automatically. Must render inside a router.
38
+ */
39
+ export const reactRouter: GlyphRouter = { Link: RouterLink, useIsActive: useRouterIsActive }
@@ -0,0 +1,6 @@
1
+ // Type-level contract: the plugin plugs into Vite without casts. Checked by `tsc`.
2
+ import type { Plugin } from 'vite'
3
+ import { glyphColorMode } from './vite'
4
+
5
+ const plugin: Plugin = glyphColorMode({ defaultMode: 'dark' })
6
+ void plugin
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { getColorModeScript } from '../provider/color-mode-script'
3
+ import { glyphColorMode } from './vite'
4
+
5
+ describe('glyphColorMode', () => {
6
+ it('prepends the color-mode script to the head before other transforms', () => {
7
+ const plugin = glyphColorMode()
8
+ expect(plugin.name).toBe('glyph:color-mode')
9
+ expect(plugin.transformIndexHtml.order).toBe('pre')
10
+ expect(plugin.transformIndexHtml.handler()).toEqual([
11
+ { tag: 'script', children: getColorModeScript(), injectTo: 'head-prepend' },
12
+ ])
13
+ })
14
+
15
+ it('uses the same options as GlyphProvider', () => {
16
+ const [tag] = glyphColorMode({
17
+ defaultMode: 'dark',
18
+ storageKey: 'acme-mode',
19
+ }).transformIndexHtml.handler()
20
+ expect(tag?.children).toContain('"acme-mode"')
21
+ expect(tag?.children).toContain('d="dark"')
22
+ })
23
+
24
+ it('skips localStorage when persistence is off', () => {
25
+ const [tag] = glyphColorMode({ storageKey: null }).transformIndexHtml.handler()
26
+ expect(tag?.children).not.toContain('localStorage')
27
+ })
28
+ })
@@ -0,0 +1,33 @@
1
+ import { type ColorModeOptions, getColorModeScript } from '../provider/color-mode-script'
2
+
3
+ /** The subset of Vite's `Plugin` this plugin uses, so `vite` stays an optional peer. */
4
+ export interface GlyphVitePlugin {
5
+ name: string
6
+ transformIndexHtml: {
7
+ order: 'pre'
8
+ handler: () => { tag: 'script'; children: string; injectTo: 'head-prepend' }[]
9
+ }
10
+ }
11
+
12
+ /**
13
+ * Injects Glyph's color-mode script into `index.html` so dark-mode visitors never see a
14
+ * light flash. Pass the same `defaultMode` and `storageKey` as `GlyphProvider`.
15
+ *
16
+ * ```ts
17
+ * // vite.config.ts
18
+ * import { glyphColorMode } from '@glyphui/ui/vite'
19
+ * export default defineConfig({ plugins: [react(), tailwindcss(), glyphColorMode()] })
20
+ * ```
21
+ */
22
+ export function glyphColorMode(options: ColorModeOptions = {}): GlyphVitePlugin {
23
+ const script = getColorModeScript(options)
24
+ return {
25
+ name: 'glyph:color-mode',
26
+ transformIndexHtml: {
27
+ order: 'pre',
28
+ handler: () => [{ tag: 'script', children: script, injectTo: 'head-prepend' }],
29
+ },
30
+ }
31
+ }
32
+
33
+ export type { ColorModeOptions }
@@ -0,0 +1,12 @@
1
+ // Bundlers replace process.env.NODE_ENV; the typeof guard keeps unbundled browsers safe.
2
+ declare const process: { env: { NODE_ENV?: string } } | undefined
3
+
4
+ const warned = new Set<string>()
5
+
6
+ /** Logs a console warning once per key, in development only. */
7
+ export function warnOnce(key: string, message: string): void {
8
+ if (typeof process === 'undefined' || process.env.NODE_ENV === 'production') return
9
+ if (warned.has(key)) return
10
+ warned.add(key)
11
+ console.warn(`[glyph] ${message}`)
12
+ }
@@ -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
+ }