@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,6 +1,6 @@
1
1
  import { standardSchemaResolver } from '@hookform/resolvers/standard-schema'
2
2
  import type { StandardSchemaV1 } from '@standard-schema/spec'
3
- import type { ComponentProps, ReactNode } from 'react'
3
+ import { type ComponentProps, type MouseEvent, type ReactNode, useCallback } from 'react'
4
4
  import {
5
5
  type Control,
6
6
  Controller,
@@ -11,6 +11,7 @@ import {
11
11
  type Resolver,
12
12
  type UseFormProps,
13
13
  type UseFormReturn,
14
+ useFormContext,
14
15
  useFormState,
15
16
  useForm as useHookForm,
16
17
  } from 'react-hook-form'
@@ -62,12 +63,29 @@ export interface FormProps<TInput extends FieldValues, TOutput>
62
63
  onSubmit: (values: TOutput) => SubmitResult<TInput> | Promise<SubmitResult<TInput>>
63
64
  }
64
65
 
66
+ // biome-ignore lint/suspicious/noExplicitAny: keyed by any form's control object
67
+ type AnyControl = Control<any, any, any>
68
+
69
+ /** The rendered `<form>` of each form, so a FormSubmit outside it can submit it. */
70
+ const formElements = new WeakMap<AnyControl, HTMLFormElement>()
71
+
65
72
  export function Form<TInput extends FieldValues, TOutput>({
66
73
  form,
67
74
  onSubmit,
68
75
  children,
76
+ ref,
69
77
  ...props
70
78
  }: FormProps<TInput, TOutput>) {
79
+ const control = form.control as AnyControl
80
+ const registerElement = useCallback(
81
+ (element: HTMLFormElement | null) => {
82
+ if (element) formElements.set(control, element)
83
+ else formElements.delete(control)
84
+ if (typeof ref === 'function') ref(element)
85
+ else if (ref) ref.current = element
86
+ },
87
+ [control, ref],
88
+ )
71
89
  const submit = form.handleSubmit(async (values) => {
72
90
  try {
73
91
  const result = await onSubmit(values)
@@ -85,7 +103,7 @@ export function Form<TInput extends FieldValues, TOutput>({
85
103
 
86
104
  return (
87
105
  <FormProvider {...form}>
88
- <form noValidate onSubmit={submit} {...props}>
106
+ <form noValidate onSubmit={submit} ref={registerElement} {...props}>
89
107
  {children}
90
108
  </form>
91
109
  </FormProvider>
@@ -122,15 +140,39 @@ export function FormField<TInput extends FieldValues, TName extends FieldPath<TI
122
140
  )
123
141
  }
124
142
 
143
+ export interface FormSubmitProps extends Omit<ButtonProps, 'type' | 'form'> {
144
+ /**
145
+ * The form to submit, for a button outside `<Form>` such as a Modal footer:
146
+ * `<FormSubmit form={form}>`. Not needed inside `<Form>`.
147
+ */
148
+ // biome-ignore lint/suspicious/noExplicitAny: accepts any form regardless of its value types
149
+ form?: UseFormReturn<any, any, any>
150
+ }
151
+
125
152
  /** Submit button that shows progress while the form submits. */
126
- export function FormSubmit(props: Omit<ButtonProps, 'type'>) {
127
- const { isSubmitting } = useFormState()
128
- return <Button type="submit" loading={isSubmitting} {...props} />
153
+ export function FormSubmit({ form, onClick, ...props }: FormSubmitProps) {
154
+ const context = useFormContext()
155
+ const control = (form ?? context)?.control
156
+ if (!control) {
157
+ throw new Error(
158
+ 'FormSubmit must be inside <Form> or receive form={form}, e.g. <FormSubmit form={form}> in a Modal footer.',
159
+ )
160
+ }
161
+ const { isSubmitting } = useFormState({ control })
162
+
163
+ if (!form) return <Button type="submit" loading={isSubmitting} onClick={onClick} {...props} />
164
+
165
+ // Outside <Form>, submit its element explicitly so validation and onSubmit run as usual.
166
+ const submitOutside = (event: MouseEvent<HTMLButtonElement>) => {
167
+ onClick?.(event)
168
+ if (!event.defaultPrevented) formElements.get(control)?.requestSubmit()
169
+ }
170
+ return <Button type="button" loading={isSubmitting} onClick={submitOutside} {...props} />
129
171
  }
130
172
 
131
- export const formErrorStyles = tv({
173
+ export const formErrorStyles = /* @__PURE__ */ tv({
132
174
  slots: {
133
- base: 'flex items-start gap-2 rounded-md border border-danger/30 bg-danger/8 px-3 py-2.5 text-small text-danger',
175
+ base: 'flex items-start gap-2 rounded-md border border-danger/30 bg-danger/8 px-3 py-2.5 text-small text-danger-text',
134
176
  icon: 'mt-0.5 size-4 shrink-0',
135
177
  },
136
178
  })
@@ -6,6 +6,7 @@ export {
6
6
  type FormFieldProps,
7
7
  type FormProps,
8
8
  FormSubmit,
9
+ type FormSubmitProps,
9
10
  formErrorStyles,
10
11
  type SubmitResult,
11
12
  type UseFormOptions,
@@ -0,0 +1,28 @@
1
+ import type { ColorMode } from '@glyphui/tokens'
2
+
3
+ // React-free on purpose: the Vite plugin imports this module in Node.
4
+
5
+ export type ColorModePreference = ColorMode | 'system'
6
+
7
+ export interface ColorModeOptions {
8
+ /** Used when nothing is stored yet. */
9
+ defaultMode?: ColorModePreference
10
+ /** localStorage key. Set to `null` to disable persistence. */
11
+ storageKey?: string | null
12
+ }
13
+
14
+ export const DARK_QUERY = '(prefers-color-scheme: dark)'
15
+ export const DEFAULT_STORAGE_KEY = 'glyph-mode'
16
+
17
+ /**
18
+ * A tiny inline script that sets `data-mode` on `<html>` before first paint, so dark-mode
19
+ * visitors never see a light flash. Use the same options as `GlyphProvider`.
20
+ */
21
+ export function getColorModeScript({
22
+ defaultMode = 'system',
23
+ storageKey = DEFAULT_STORAGE_KEY,
24
+ }: ColorModeOptions = {}): string {
25
+ return `(function(){try{var d=${JSON.stringify(defaultMode)},m=null;${
26
+ storageKey ? `m=localStorage.getItem(${JSON.stringify(storageKey)});` : ''
27
+ }if(m!=='light'&&m!=='dark'&&m!=='system')m=d;if(m==='system')m=matchMedia('${DARK_QUERY}').matches?'dark':'light';var r=document.documentElement;r.dataset.mode=m;r.style.colorScheme=m}catch(e){}})()`
28
+ }
@@ -8,8 +8,19 @@ import {
8
8
  useMemo,
9
9
  useState,
10
10
  } from 'react'
11
-
12
- export type ColorModePreference = ColorMode | 'system'
11
+ import {
12
+ type ColorModeOptions,
13
+ type ColorModePreference,
14
+ DARK_QUERY,
15
+ DEFAULT_STORAGE_KEY,
16
+ getColorModeScript,
17
+ } from './color-mode-script'
18
+
19
+ export {
20
+ type ColorModeOptions,
21
+ type ColorModePreference,
22
+ getColorModeScript,
23
+ } from './color-mode-script'
13
24
 
14
25
  export interface ColorModeContextValue {
15
26
  /** What the user chose. */
@@ -21,16 +32,8 @@ export interface ColorModeContextValue {
21
32
 
22
33
  const ColorModeContext = createContext<ColorModeContextValue | null>(null)
23
34
 
24
- const DARK_QUERY = '(prefers-color-scheme: dark)'
25
35
  const isBrowser = typeof window !== 'undefined'
26
36
 
27
- export interface ColorModeOptions {
28
- /** Used when nothing is stored yet. */
29
- defaultMode?: ColorModePreference
30
- /** localStorage key. Set to `null` to disable persistence. */
31
- storageKey?: string | null
32
- }
33
-
34
37
  function readStoredMode(storageKey: string | null): ColorModePreference | null {
35
38
  if (!isBrowser || !storageKey) return null
36
39
  try {
@@ -59,7 +62,7 @@ function suppressTransitions(): () => void {
59
62
  export function ColorModeProvider({
60
63
  children,
61
64
  defaultMode = 'system',
62
- storageKey = 'glyph-mode',
65
+ storageKey = DEFAULT_STORAGE_KEY,
63
66
  }: ColorModeOptions & { children: ReactNode }) {
64
67
  const [mode, setModeState] = useState<ColorModePreference>(
65
68
  () => readStoredMode(storageKey) ?? defaultMode,
@@ -112,15 +115,6 @@ export function useColorMode(): ColorModeContextValue {
112
115
  * Inline script that sets `data-mode` on `<html>` before first paint, so a dark-mode
113
116
  * visitor never sees a light flash. Put it in `<head>`.
114
117
  */
115
- export function getColorModeScript({
116
- defaultMode = 'system',
117
- storageKey = 'glyph-mode',
118
- }: ColorModeOptions = {}): string {
119
- return `(function(){try{var d=${JSON.stringify(defaultMode)},m=null;${
120
- storageKey ? `m=localStorage.getItem(${JSON.stringify(storageKey)});` : ''
121
- }if(m!=='light'&&m!=='dark'&&m!=='system')m=d;if(m==='system')m=matchMedia('${DARK_QUERY}').matches?'dark':'light';var r=document.documentElement;r.dataset.mode=m;r.style.colorScheme=m}catch(e){}})()`
122
- }
123
-
124
118
  /** `<script>` element version of `getColorModeScript` for SSR frameworks. */
125
119
  export function ColorModeScript(props: ColorModeOptions) {
126
120
  return (
@@ -1,4 +1,4 @@
1
- import type { Theme } from '@glyphui/tokens'
1
+ import type { MotionLevel, Theme } from '@glyphui/tokens'
2
2
  import {
3
3
  createContext,
4
4
  type ElementType,
@@ -22,9 +22,31 @@ export interface LinkComponentProps {
22
22
  */
23
23
  export type LinkComponent = ElementType<LinkComponentProps>
24
24
 
25
+ export interface IsActiveOptions {
26
+ /** Match only this exact path, not its children. Default false. */
27
+ end?: boolean
28
+ }
29
+
30
+ /**
31
+ * A hook that reports whether `href` is the current location. Glyph calls it once per
32
+ * navigation item on every render, so it must follow the rules of hooks.
33
+ */
34
+ export type UseIsActive = (href: string, options?: IsActiveOptions) => boolean
35
+
36
+ /** Connects Glyph's navigation components to your router. */
37
+ export interface GlyphRouter {
38
+ /** Renders links client-side. */
39
+ Link: LinkComponent
40
+ /** Marks Sidebar, Navbar and NavigationMenu items active automatically. */
41
+ useIsActive?: UseIsActive
42
+ }
43
+
25
44
  export interface GlyphContextValue {
26
45
  theme: Theme
27
46
  linkComponent: LinkComponent
47
+ useIsActive: UseIsActive
48
+ /** Overrides the theme's motion level for the whole app. */
49
+ motion?: MotionLevel | undefined
28
50
  }
29
51
 
30
52
  export const GlyphContext = createContext<GlyphContextValue | null>(null)
@@ -40,3 +62,21 @@ export function useGlyph(): GlyphContextValue {
40
62
  export function useLinkComponent(): LinkComponent {
41
63
  return useContext(GlyphContext)?.linkComponent ?? 'a'
42
64
  }
65
+
66
+ export const neverActive: UseIsActive = () => false
67
+
68
+ /**
69
+ * Whether `href` is the current page, using the router passed to `GlyphProvider`.
70
+ * Returns `explicit` when it is set, so an `active` prop always wins.
71
+ */
72
+ export function useIsActive(
73
+ href: string | undefined,
74
+ options?: IsActiveOptions & { explicit?: boolean | undefined },
75
+ ): boolean {
76
+ const isActive = useContext(GlyphContext)?.useIsActive ?? neverActive
77
+ const { explicit, ...matchOptions } = options ?? {}
78
+ // Always call the router hook so the hook order never changes between renders.
79
+ const matched = isActive(href ?? '', matchOptions)
80
+ if (explicit !== undefined) return explicit
81
+ return href ? matched : false
82
+ }
@@ -1,13 +1,19 @@
1
- import type { Theme } from '@glyphui/tokens'
1
+ import type { MotionLevel, Theme } from '@glyphui/tokens'
2
2
  import { Tooltip } from 'radix-ui'
3
- import { type ReactNode, useMemo } from 'react'
3
+ import { lazy, type ReactNode, Suspense, useMemo } from 'react'
4
4
  import { ConfirmProvider } from '../components/alert-dialog/confirm'
5
- import { Toaster, type ToasterProps } from '../components/toast/toast'
5
+ import type { ToasterProps } from '../components/toast/toast'
6
+ import { MotionRootAttribute, MotionScope } from '../motion/motion-root'
6
7
  import { glyph } from '../themes'
7
8
  import { type ColorModePreference, ColorModeProvider } from './color-mode'
8
- import { GlyphContext, type LinkComponent } from './glyph-context'
9
+ import { GlyphContext, type GlyphRouter, type LinkComponent, neverActive } from './glyph-context'
9
10
  import { ThemeStyle } from './theme-style'
10
11
 
12
+ // Only apps that turn on `toaster` load the toast UI.
13
+ const Toaster = lazy(() =>
14
+ import('../components/toast/toast').then((m) => ({ default: m.Toaster })),
15
+ )
16
+
11
17
  export interface GlyphProviderProps {
12
18
  children: ReactNode
13
19
  /** The theme for the whole app. Defaults to the `glyph` preset. */
@@ -16,13 +22,24 @@ export interface GlyphProviderProps {
16
22
  defaultMode?: ColorModePreference
17
23
  /** localStorage key for the user's color mode. `null` disables persistence. */
18
24
  storageKey?: string | null
19
- /** Your router's link, used by Navbar, Sidebar and other navigation components. */
25
+ /**
26
+ * Your router: its link component, plus an optional `useIsActive` hook that marks the
27
+ * current page in Sidebar, Navbar and NavigationMenu. React Router:
28
+ * `import { reactRouter } from '@glyphui/ui/react-router'`.
29
+ */
30
+ router?: GlyphRouter
31
+ /** Your router's link only. Prefer `router`, which also handles active items. */
20
32
  linkComponent?: LinkComponent
21
33
  /**
22
34
  * Mounts a themed `<Toaster />` so `toast()` works anywhere. `true` for defaults, or pass
23
35
  * Toaster props (e.g. `{ position: 'top-center' }`). Off by default.
24
36
  */
25
37
  toaster?: boolean | ToasterProps
38
+ /**
39
+ * Overrides the theme's motion level everywhere, e.g. `"none"` in tests or for a user
40
+ * setting. Visitors who ask for reduced motion never get animation either way.
41
+ */
42
+ motion?: MotionLevel
26
43
  }
27
44
 
28
45
  /** Provides the theme, color mode, tooltips, `useConfirm()` and (optionally) toasts. Render once at the root. */
@@ -31,10 +48,17 @@ export function GlyphProvider({
31
48
  theme = glyph,
32
49
  defaultMode,
33
50
  storageKey,
34
- linkComponent = 'a',
51
+ router,
52
+ linkComponent,
35
53
  toaster = false,
54
+ motion,
36
55
  }: GlyphProviderProps) {
37
- const value = useMemo(() => ({ theme, linkComponent }), [theme, linkComponent])
56
+ const Link = router?.Link ?? linkComponent ?? 'a'
57
+ const useIsActive = router?.useIsActive ?? neverActive
58
+ const value = useMemo(
59
+ () => ({ theme, linkComponent: Link, useIsActive, motion }),
60
+ [theme, Link, useIsActive, motion],
61
+ )
38
62
  return (
39
63
  <ColorModeProvider
40
64
  {...(defaultMode !== undefined && { defaultMode })}
@@ -42,13 +66,20 @@ export function GlyphProvider({
42
66
  >
43
67
  <GlyphContext.Provider value={value}>
44
68
  <ThemeStyle theme={theme} />
45
- <Tooltip.Provider delayDuration={300}>
46
- {/* useConfirm() works anywhere without setup; the dialog only mounts while open. */}
47
- <ConfirmProvider>
48
- {children}
49
- {toaster && <Toaster {...(toaster === true ? {} : toaster)} />}
50
- </ConfirmProvider>
51
- </Tooltip.Provider>
69
+ <MotionRootAttribute />
70
+ <MotionScope>
71
+ <Tooltip.Provider delayDuration={300}>
72
+ {/* useConfirm() works anywhere without setup; the dialog only mounts while open. */}
73
+ <ConfirmProvider>
74
+ {children}
75
+ {toaster && (
76
+ <Suspense fallback={null}>
77
+ <Toaster {...(toaster === true ? {} : toaster)} />
78
+ </Suspense>
79
+ )}
80
+ </ConfirmProvider>
81
+ </Tooltip.Provider>
82
+ </MotionScope>
52
83
  </GlyphContext.Provider>
53
84
  </ColorModeProvider>
54
85
  )
@@ -9,9 +9,13 @@ export {
9
9
  } from './color-mode'
10
10
  export {
11
11
  type GlyphContextValue,
12
+ type GlyphRouter,
13
+ type IsActiveOptions,
12
14
  type LinkComponent,
13
15
  type LinkComponentProps,
16
+ type UseIsActive,
14
17
  useGlyph,
18
+ useIsActive,
15
19
  useLinkComponent,
16
20
  } from './glyph-context'
17
21
  export { GlyphProvider, type GlyphProviderProps } from './glyph-provider'
@@ -1,8 +1,9 @@
1
1
  import { type ColorMode, scopeSelector, type Theme } from '@glyphui/tokens'
2
2
  import { Slot } from 'radix-ui'
3
3
  import { type ComponentProps, useContext, useMemo } from 'react'
4
+ import { ScopedMotionConfig } from '../motion/motion-root'
4
5
  import { cn } from '../utils/cn'
5
- import { GlyphContext } from './glyph-context'
6
+ import { GlyphContext, neverActive } from './glyph-context'
6
7
  import { ThemeStyle } from './theme-style'
7
8
 
8
9
  export interface ThemeScopeProps extends ComponentProps<'div'> {
@@ -16,21 +17,29 @@ export interface ThemeScopeProps extends ComponentProps<'div'> {
16
17
  export function ThemeScope({ theme, mode, asChild, children, ...props }: ThemeScopeProps) {
17
18
  const parent = useContext(GlyphContext)
18
19
  const value = useMemo(
19
- () => ({ theme, linkComponent: parent?.linkComponent ?? 'a' }),
20
- [theme, parent?.linkComponent],
20
+ () => ({
21
+ theme,
22
+ linkComponent: parent?.linkComponent ?? 'a',
23
+ useIsActive: parent?.useIsActive ?? neverActive,
24
+ motion: parent?.motion,
25
+ }),
26
+ [theme, parent?.linkComponent, parent?.useIsActive, parent?.motion],
21
27
  )
22
28
  const Comp = asChild ? Slot.Root : 'div'
23
29
  return (
24
30
  <GlyphContext.Provider value={value}>
25
31
  <ThemeStyle theme={theme} selector={scopeSelector(theme)} />
26
- <Comp
27
- data-glyph-theme={theme.name}
28
- data-mode={mode}
29
- {...props}
30
- className={cn('bg-background font-sans text-foreground', props.className)}
31
- >
32
- {children}
33
- </Comp>
32
+ <ScopedMotionConfig>
33
+ <Comp
34
+ data-glyph-theme={theme.name}
35
+ data-mode={mode}
36
+ data-motion={parent?.motion ?? theme.motion.level ?? 'subtle'}
37
+ {...props}
38
+ className={cn('bg-background font-sans text-foreground', props.className)}
39
+ >
40
+ {children}
41
+ </Comp>
42
+ </ScopedMotionConfig>
34
43
  </GlyphContext.Provider>
35
44
  )
36
45
  }
package/src/themes.ts CHANGED
@@ -10,7 +10,7 @@ import { defineTheme, presets as tokenPresets } from '@glyphui/tokens'
10
10
  export const glyph = tokenPresets.glyph
11
11
 
12
12
  /** Zero radius, heavy borders, hard offset shadows, loud color. */
13
- export const brutalist = defineTheme({
13
+ export const brutalist = /* @__PURE__ */ defineTheme({
14
14
  name: 'brutalist',
15
15
  extends: tokenPresets.brutalist,
16
16
  components: {
@@ -27,7 +27,7 @@ export const brutalist = defineTheme({
27
27
  })
28
28
 
29
29
  /** Serif display type, warm paper neutrals, deep green ink, hairlines instead of shadows. */
30
- export const editorial = defineTheme({
30
+ export const editorial = /* @__PURE__ */ defineTheme({
31
31
  name: 'editorial',
32
32
  extends: tokenPresets.editorial,
33
33
  components: {
@@ -38,7 +38,7 @@ export const editorial = defineTheme({
38
38
  })
39
39
 
40
40
  /** Pill shapes, lavender and mint, chunky rounded type, springy motion. */
41
- export const playful = defineTheme({
41
+ export const playful = /* @__PURE__ */ defineTheme({
42
42
  name: 'playful',
43
43
  extends: tokenPresets.playful,
44
44
  components: {
@@ -6,8 +6,22 @@ export const focusRing =
6
6
  export const themedBorder = 'border-(length:--glyph-border-width)'
7
7
 
8
8
  export const transition =
9
- 'transition-[color,background-color,border-color,box-shadow,transform,opacity] duration-(--glyph-duration-base) ease-standard'
9
+ 'transition-[color,background-color,border-color,box-shadow,transform,translate,scale,opacity] duration-(--glyph-duration-base) ease-standard'
10
+
11
+ /**
12
+ * Enter and exit for anything Radix positions next to a trigger: springs out of the trigger
13
+ * (pair with the primitive's transform-origin class) and leaves quickly. Distance and scale
14
+ * follow the motion level; the side moves it toward the trigger.
15
+ */
16
+ export const popoverMotion =
17
+ 'animate-pop-in data-[state=closed]:animate-pop-out data-[side=bottom]:[--glyph-motion-y:calc(var(--glyph-motion-distance)*-1)] data-[side=top]:[--glyph-motion-y:var(--glyph-motion-distance)] data-[side=left]:[--glyph-motion-x:var(--glyph-motion-distance)] data-[side=right]:[--glyph-motion-x:calc(var(--glyph-motion-distance)*-1)]'
10
18
 
11
19
  /** Popover surfaces: Select, Tooltip-like menus. */
12
- export const popover =
13
- 'z-50 overflow-hidden rounded-[min(var(--radius-md),var(--radius-lg))] border-(length:--glyph-border-width) border-border bg-raised text-foreground shadow-lg animate-pop-in'
20
+ export const popover = `z-50 overflow-hidden rounded-[min(var(--radius-md),var(--radius-lg))] border-(length:--glyph-border-width) border-border bg-raised text-foreground shadow-lg ${popoverMotion}`
21
+
22
+ /** Dimmed backdrop behind dialogs and sheets. */
23
+ export const overlayMotion =
24
+ 'data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out'
25
+
26
+ /** Centered dialogs: rise and scale in on the theme's spring, settle out quickly. */
27
+ export const dialogMotion = 'animate-dialog-in data-[state=closed]:animate-dialog-out'