@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 { tv, type VariantProps } from '../../utils/tv'
2
2
 
3
- export const headingStyles = tv({
3
+ export const headingStyles = /* @__PURE__ */ tv({
4
4
  slots: { base: 'font-display text-balance text-foreground' },
5
5
  variants: {
6
6
  size: {
@@ -5,9 +5,12 @@ import type { StylesEntry } from '../../utils/registry'
5
5
  import { popover } from '../../utils/styles'
6
6
  import { tv } from '../../utils/tv'
7
7
 
8
- export const hoverCardStyles = tv({
8
+ export const hoverCardStyles = /* @__PURE__ */ tv({
9
9
  slots: {
10
- content: [popover, 'w-72 max-w-[calc(100vw-2rem)] p-4 text-small outline-none'],
10
+ content: [
11
+ popover,
12
+ 'origin-(--radix-hover-card-content-transform-origin) w-72 max-w-[calc(100vw-2rem)] p-4 text-small outline-none',
13
+ ],
11
14
  },
12
15
  })
13
16
 
@@ -10,7 +10,7 @@ export const fieldControl = [
10
10
  'data-invalid:border-danger aria-invalid:border-danger',
11
11
  ]
12
12
 
13
- export const inputStyles = tv({
13
+ export const inputStyles = /* @__PURE__ */ tv({
14
14
  slots: {
15
15
  root: [
16
16
  ...fieldControl,
@@ -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 inputOtpStyles = tv({
5
+ export const inputOtpStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'flex items-center gap-2 has-disabled:opacity-50',
8
8
  input: 'disabled:cursor-not-allowed',
@@ -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 kbdStyles = tv({
5
+ export const kbdStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  base: 'inline-flex h-5 min-w-5 items-center justify-center rounded-xs border border-border bg-muted px-1 font-mono text-[0.6875rem] font-medium text-muted-foreground shadow-xs',
8
8
  },
@@ -3,7 +3,7 @@ import type { ComponentProps } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import { tv } from '../../utils/tv'
5
5
 
6
- export const labelStyles = tv({
6
+ export const labelStyles = /* @__PURE__ */ tv({
7
7
  slots: {
8
8
  base: 'inline-flex select-none items-center gap-1 text-small font-medium text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-60',
9
9
  },
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const linkStyles = tv({
5
+ export const linkStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  base: [
8
8
  'inline-flex items-baseline gap-1 rounded-xs font-medium',
@@ -17,7 +17,7 @@ export const linkStyles = tv({
17
17
  tone: {
18
18
  default: { base: 'text-foreground' },
19
19
  muted: { base: 'text-muted-foreground hover:text-foreground' },
20
- primary: { base: 'text-primary' },
20
+ primary: { base: 'text-primary-text' },
21
21
  },
22
22
  underline: {
23
23
  hover: {
@@ -2,12 +2,14 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv } from '../../utils/tv'
3
3
 
4
4
  /** Modal is built from Dialog parts; these slots add Modal-specific classes on top. */
5
- export const modalStyles = tv({
5
+ export const modalStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  content: '',
8
8
  header: '',
9
9
  body: 'grid gap-4',
10
10
  footer: '',
11
+ /** Wraps body and footer when `onSubmit` is set; `contents` keeps the dialog layout. */
12
+ form: 'contents',
11
13
  },
12
14
  })
13
15
 
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react'
1
+ import type { FormEvent, ReactNode } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import {
4
4
  Dialog,
@@ -14,7 +14,7 @@ import {
14
14
  } from '../dialog'
15
15
  import { modalStyles } from './modal.styles'
16
16
 
17
- export interface ModalProps extends Omit<DialogContentProps, 'title' | 'children'> {
17
+ export interface ModalProps extends Omit<DialogContentProps, 'title' | 'children' | 'onSubmit'> {
18
18
  open?: boolean
19
19
  defaultOpen?: boolean
20
20
  onOpenChange?: (open: boolean) => void
@@ -27,6 +27,12 @@ export interface ModalProps extends Omit<DialogContentProps, 'title' | 'children
27
27
  footer?: ReactNode
28
28
  /** Close when the backdrop is clicked. Default true. */
29
29
  closeOnOverlayClick?: boolean
30
+ /**
31
+ * Turns the body and footer into one `<form>`, so a `type="submit"` button in the footer
32
+ * submits the fields in the body. The page does not reload. With `@glyphui/ui/form`, use
33
+ * `<Form>` in the body and `<FormSubmit form={form}>` in the footer instead.
34
+ */
35
+ onSubmit?: (event: FormEvent<HTMLFormElement>) => void
30
36
  children?: ReactNode
31
37
  }
32
38
 
@@ -45,12 +51,21 @@ export function Modal(inProps: ModalProps) {
45
51
  trigger,
46
52
  footer,
47
53
  closeOnOverlayClick = true,
54
+ onSubmit,
48
55
  onPointerDownOutside,
49
56
  className,
50
57
  children,
51
58
  ...rest
52
59
  } = props
53
60
  const s = modalStyles()
61
+ const content = (
62
+ <>
63
+ {children && <DialogBody className={s.body({ class: slots.body })}>{children}</DialogBody>}
64
+ {footer && (
65
+ <DialogFooter className={s.footer({ class: slots.footer })}>{footer}</DialogFooter>
66
+ )}
67
+ </>
68
+ )
54
69
 
55
70
  return (
56
71
  <Dialog
@@ -73,9 +88,19 @@ export function Modal(inProps: ModalProps) {
73
88
  <DialogTitle>{title}</DialogTitle>
74
89
  {description && <DialogDescription>{description}</DialogDescription>}
75
90
  </DialogHeader>
76
- {children && <DialogBody className={s.body({ class: slots.body })}>{children}</DialogBody>}
77
- {footer && (
78
- <DialogFooter className={s.footer({ class: slots.footer })}>{footer}</DialogFooter>
91
+ {onSubmit ? (
92
+ <form
93
+ data-slot="modal-form"
94
+ className={s.form({ class: slots.form })}
95
+ onSubmit={(event) => {
96
+ event.preventDefault()
97
+ onSubmit(event)
98
+ }}
99
+ >
100
+ {content}
101
+ </form>
102
+ ) : (
103
+ content
79
104
  )}
80
105
  </DialogContent>
81
106
  </Dialog>
@@ -10,7 +10,7 @@ const topLevel = [
10
10
  'data-active:text-foreground',
11
11
  ]
12
12
 
13
- export const navigationMenuStyles = tv({
13
+ export const navigationMenuStyles = /* @__PURE__ */ tv({
14
14
  slots: {
15
15
  root: 'relative z-10 flex max-w-max flex-1 items-center justify-center',
16
16
  list: 'group flex flex-1 list-none items-center justify-center gap-1',
@@ -21,7 +21,7 @@ export const navigationMenuStyles = tv({
21
21
  content: 'top-0 left-0 w-full p-2 animate-fade-in md:absolute md:w-auto',
22
22
  viewportWrapper: 'absolute top-full left-0 flex justify-center',
23
23
  viewport: [
24
- 'relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-[calc(100vw-2rem)] origin-top overflow-hidden rounded-lg border-border bg-raised text-foreground shadow-lg animate-pop-in',
24
+ 'relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-[calc(100vw-2rem)] origin-top overflow-hidden rounded-lg border-border bg-raised text-foreground shadow-lg animate-pop-in data-[state=closed]:animate-pop-out',
25
25
  'md:w-(--radix-navigation-menu-viewport-width)',
26
26
  'transition-[width,height] duration-(--glyph-duration-base) ease-standard',
27
27
  themedBorder,
@@ -1,7 +1,7 @@
1
1
  import { NavigationMenu as NavPrimitive } from 'radix-ui'
2
2
  import type { ComponentProps, ReactNode } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
- import { useLinkComponent } from '../../provider/glyph-context'
4
+ import { useIsActive, useLinkComponent } from '../../provider/glyph-context'
5
5
  import { navigationMenuStyles } from './navigation-menu.styles'
6
6
 
7
7
  const s = navigationMenuStyles()
@@ -132,25 +132,35 @@ export interface NavigationMenuLinkProps
132
132
  href?: string
133
133
  }
134
134
 
135
- /** A top-level link (no panel). Set `active` for the current page. */
135
+ /**
136
+ * A top-level link (no panel). Marked active automatically from the provider's `router`;
137
+ * set `active` to override.
138
+ */
136
139
  export function NavigationMenuLink({
137
140
  href,
141
+ active: activeProp,
138
142
  className,
139
143
  children,
140
144
  ...props
141
145
  }: NavigationMenuLinkProps) {
142
146
  const slots = useSlots()
143
147
  const Link = useLinkComponent()
148
+ const active = useIsActive(href, { explicit: activeProp })
144
149
  const cls = s.link({ class: [slots.link, className] })
145
150
  if (href === undefined) {
146
151
  return (
147
- <NavPrimitive.Link data-slot="navigation-menu-link" className={cls} {...props}>
152
+ <NavPrimitive.Link
153
+ data-slot="navigation-menu-link"
154
+ className={cls}
155
+ active={active}
156
+ {...props}
157
+ >
148
158
  {children}
149
159
  </NavPrimitive.Link>
150
160
  )
151
161
  }
152
162
  return (
153
- <NavPrimitive.Link data-slot="navigation-menu-link" asChild {...props}>
163
+ <NavPrimitive.Link data-slot="navigation-menu-link" asChild active={active} {...props}>
154
164
  <Link href={href} className={cls}>
155
165
  {children}
156
166
  </Link>
@@ -3,7 +3,7 @@ import { focusRing } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
  import { fieldControl } from '../input/input.styles'
5
5
 
6
- export const numberInputStyles = tv({
6
+ export const numberInputStyles = /* @__PURE__ */ tv({
7
7
  slots: {
8
8
  root: [
9
9
  ...fieldControl,
@@ -2,20 +2,22 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const paginationStyles = tv({
5
+ export const paginationStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'flex',
8
- list: 'flex flex-wrap items-center gap-1',
8
+ list: 'isolate flex flex-wrap items-center gap-1',
9
9
  item: [
10
- 'inline-flex shrink-0 cursor-pointer select-none items-center justify-center rounded-md font-medium tabular-nums text-muted-foreground',
10
+ 'relative inline-flex shrink-0 cursor-pointer select-none items-center justify-center rounded-md font-medium tabular-nums text-muted-foreground',
11
11
  transition,
12
12
  focusRing,
13
13
  'hover:bg-muted hover:text-foreground',
14
- 'aria-[current=page]:bg-primary aria-[current=page]:text-primary-foreground aria-[current=page]:shadow-xs',
14
+ 'aria-[current=page]:text-primary-foreground aria-[current=page]:hover:bg-transparent',
15
15
  'disabled:pointer-events-none disabled:opacity-40 aria-disabled:pointer-events-none aria-disabled:opacity-40',
16
16
  '[&>svg]:size-4',
17
17
  ],
18
18
  ellipsis: 'inline-flex items-center justify-center text-faint-foreground',
19
+ /** The current page's highlight. Slides to the new page when it changes. */
20
+ indicator: 'pointer-events-none absolute inset-0 -z-10 rounded-[inherit] bg-primary shadow-xs',
19
21
  },
20
22
  variants: {
21
23
  size: {
@@ -1,6 +1,7 @@
1
- import type { ComponentProps, ReactNode } from 'react'
1
+ import { type ComponentProps, type ReactNode, useId } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { ChevronLeftIcon, ChevronRightIcon } from '../../internal/icons'
4
+ import { ActiveIndicator } from '../../motion/active-indicator'
4
5
  import { useLinkComponent } from '../../provider/glyph-context'
5
6
  import { type PaginationVariants, paginationStyles } from './pagination.styles'
6
7
  import { paginationRange } from './pagination-range'
@@ -65,6 +66,7 @@ export function Pagination(inProps: PaginationProps) {
65
66
  const s = paginationStyles({ size })
66
67
  const itemClass = s.item({ class: slots.item })
67
68
  const current = Math.min(Math.max(1, page), Math.max(1, pageCount))
69
+ const indicatorId = `${useId()}-pagination-indicator`
68
70
 
69
71
  const control = (
70
72
  target: number,
@@ -73,6 +75,17 @@ export function Pagination(inProps: PaginationProps) {
73
75
  options: { current?: boolean } = {},
74
76
  ) => {
75
77
  const disabled = target < 1 || target > pageCount || (target === current && !options.current)
78
+ if (options.current) {
79
+ content = (
80
+ <>
81
+ <ActiveIndicator
82
+ layoutId={indicatorId}
83
+ className={s.indicator({ class: slots.indicator })}
84
+ />
85
+ {content}
86
+ </>
87
+ )
88
+ }
76
89
  const shared = {
77
90
  'aria-label': label,
78
91
  'aria-current': options.current ? ('page' as const) : undefined,
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing } from '../../utils/styles'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const passwordInputStyles = tv({
5
+ export const passwordInputStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'grid gap-1.5',
8
8
  toggle: [
@@ -16,9 +16,9 @@ export const passwordInputStyles = tv({
16
16
  },
17
17
  variants: {
18
18
  strength: {
19
- weak: { label: 'text-danger' },
20
- fair: { label: 'text-warning' },
21
- strong: { label: 'text-success' },
19
+ weak: { label: 'text-danger-text' },
20
+ fair: { label: 'text-warning-text' },
21
+ strong: { label: 'text-success-text' },
22
22
  },
23
23
  },
24
24
  })
@@ -5,7 +5,7 @@ import type { StylesEntry } from '../../utils/registry'
5
5
  import { popover } from '../../utils/styles'
6
6
  import { tv } from '../../utils/tv'
7
7
 
8
- export const popoverStyles = tv({
8
+ export const popoverStyles = /* @__PURE__ */ tv({
9
9
  slots: {
10
10
  content: [
11
11
  popover,
@@ -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 progressStyles = tv({
4
+ export const progressStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  root: 'grid w-full gap-1.5',
7
7
  header: 'flex items-baseline justify-between gap-3 text-small',
@@ -32,7 +32,7 @@ export const progressStyles = tv({
32
32
 
33
33
  export type ProgressVariants = VariantProps<typeof progressStyles>
34
34
 
35
- export const progressCircleStyles = tv({
35
+ export const progressCircleStyles = /* @__PURE__ */ tv({
36
36
  slots: {
37
37
  root: 'relative inline-flex shrink-0 items-center justify-center',
38
38
  svg: 'size-full -rotate-90',
@@ -8,7 +8,7 @@ import { tv, type VariantProps } from '../../utils/tv'
8
8
  * Element styles for long-form content. Every value comes from theme tokens, so articles
9
9
  * pick up the theme's display font, type scale, colors and radius.
10
10
  */
11
- export const proseStyles = tv({
11
+ export const proseStyles = /* @__PURE__ */ tv({
12
12
  slots: {
13
13
  base: [
14
14
  'text-foreground [&>:first-child]:mt-0 [&>:last-child]:mb-0',
@@ -20,7 +20,7 @@ export const proseStyles = tv({
20
20
  // Text
21
21
  '[&_p]:my-[1em] [&_p]:text-pretty',
22
22
  '[&_strong]:font-semibold [&_strong]:text-foreground',
23
- '[&_a]:font-medium [&_a]:text-primary [&_a]:underline [&_a]:decoration-primary/40 [&_a]:underline-offset-4 [&_a:hover]:decoration-primary',
23
+ '[&_a]:font-medium [&_a]:text-primary-text [&_a]:underline [&_a]:decoration-primary/40 [&_a]:underline-offset-4 [&_a:hover]:decoration-primary',
24
24
  // Lists
25
25
  '[&_ul]:my-[1em] [&_ul]:list-disc [&_ul]:pl-[1.5em] [&_ol]:my-[1em] [&_ol]:list-decimal [&_ol]:pl-[1.5em]',
26
26
  '[&_li]:my-[0.35em] [&_li]:pl-[0.25em] [&_li::marker]:text-faint-foreground',
@@ -8,7 +8,7 @@ const control = [
8
8
  transition,
9
9
  ]
10
10
 
11
- export const radioGroupStyles = tv({
11
+ export const radioGroupStyles = /* @__PURE__ */ tv({
12
12
  slots: {
13
13
  root: '',
14
14
  option: 'flex items-start gap-2.5',
@@ -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 resizableStyles = tv({
4
+ export const resizableStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  group: 'flex h-full w-full data-[panel-group-direction=vertical]:flex-col',
7
7
  panel: 'min-w-0',
@@ -1,11 +1,11 @@
1
1
  import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui'
2
- import type { ComponentProps } from 'react'
2
+ import { type ComponentProps, useEffect, useRef, useState } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import type { StylesEntry } from '../../utils/registry'
5
5
  import { focusRing } from '../../utils/styles'
6
6
  import { tv } from '../../utils/tv'
7
7
 
8
- export const scrollAreaStyles = tv({
8
+ export const scrollAreaStyles = /* @__PURE__ */ tv({
9
9
  slots: {
10
10
  root: 'relative overflow-hidden',
11
11
  viewport: ['size-full rounded-[inherit]', focusRing],
@@ -31,6 +31,24 @@ export interface ScrollAreaProps extends ComponentProps<typeof ScrollAreaPrimiti
31
31
  viewportClassName?: string
32
32
  }
33
33
 
34
+ /** True while the element's content overflows it, so keyboard users need to reach it. */
35
+ function useOverflowing<E extends HTMLElement>() {
36
+ const ref = useRef<E>(null)
37
+ const [overflowing, setOverflowing] = useState(false)
38
+ useEffect(() => {
39
+ const el = ref.current
40
+ if (!el) return
41
+ const measure = () =>
42
+ setOverflowing(el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)
43
+ measure()
44
+ const observer = new ResizeObserver(measure)
45
+ observer.observe(el)
46
+ if (el.firstElementChild) observer.observe(el.firstElementChild)
47
+ return () => observer.disconnect()
48
+ }, [])
49
+ return [ref, overflowing] as const
50
+ }
51
+
34
52
  /**
35
53
  * A scrollable region with slim, theme-colored scrollbars. Give it a height (or width)
36
54
  * with `className`, e.g. `h-72`.
@@ -39,6 +57,7 @@ export function ScrollArea(inProps: ScrollAreaProps) {
39
57
  const [props, slots] = useComponentConfig('ScrollArea', inProps)
40
58
  const { orientation = 'vertical', viewportClassName, className, children, ...rest } = props
41
59
  const s = scrollAreaStyles()
60
+ const [viewportRef, overflowing] = useOverflowing<HTMLDivElement>()
42
61
  const bar = (o: 'vertical' | 'horizontal') => (
43
62
  <ScrollAreaPrimitive.Scrollbar
44
63
  data-slot="scroll-area-scrollbar"
@@ -55,7 +74,10 @@ export function ScrollArea(inProps: ScrollAreaProps) {
55
74
  {...rest}
56
75
  >
57
76
  <ScrollAreaPrimitive.Viewport
77
+ ref={viewportRef}
58
78
  data-slot="scroll-area-viewport"
79
+ // Scrollable regions must be reachable by keyboard to scroll with arrow keys.
80
+ tabIndex={overflowing ? 0 : undefined}
59
81
  className={s.viewport({ class: [slots.viewport, viewportClassName] })}
60
82
  >
61
83
  {children}
@@ -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 sectionStyles = tv({
5
+ export const sectionStyles = /* @__PURE__ */ tv({
6
6
  base: 'w-full',
7
7
  variants: {
8
8
  spacing: {
@@ -1,22 +1,29 @@
1
1
  import { ToggleGroup } from 'radix-ui'
2
- import type { ReactNode } from 'react'
2
+ import { type ReactNode, useContext, useId } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
+ import { useControllableState } from '../../hooks/use-controllable-state'
5
+ import { warnOnce } from '../../internal/dev'
6
+ import { ActiveIndicator } from '../../motion/active-indicator'
4
7
  import { focusRing, themedBorder, transition } from '../../utils/styles'
5
8
  import { tv, type VariantProps } from '../../utils/tv'
9
+ import { FieldContext } from '../field/field-context'
6
10
 
7
- export const segmentedControlStyles = tv({
11
+ export const segmentedControlStyles = /* @__PURE__ */ tv({
8
12
  slots: {
9
13
  root: [
10
- 'inline-flex items-center gap-0.5 rounded-md border-border bg-muted p-0.5',
14
+ 'isolate inline-flex items-center gap-0.5 rounded-md border-border bg-muted p-0.5',
11
15
  themedBorder,
12
16
  ],
13
17
  item: [
14
- 'inline-flex h-full cursor-pointer select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-md)-2px)] px-3 font-medium text-muted-foreground',
18
+ 'relative inline-flex h-full cursor-pointer select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius-md)-2px)] px-3 font-medium text-muted-foreground',
15
19
  transition,
16
20
  focusRing,
17
- 'hover:text-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-xs',
21
+ 'hover:text-foreground data-[state=on]:text-foreground',
18
22
  'disabled:pointer-events-none disabled:opacity-50 [&>svg]:size-4',
19
23
  ],
24
+ /** The raised thumb that slides to the selected option. */
25
+ indicator:
26
+ 'pointer-events-none absolute inset-0 -z-10 rounded-[calc(var(--radius-md)-2px)] bg-raised shadow-xs',
20
27
  },
21
28
  variants: {
22
29
  size: {
@@ -40,7 +47,9 @@ export interface SegmentedControlProps<T extends string>
40
47
  value?: T
41
48
  defaultValue?: T
42
49
  onValueChange?: (value: T) => void
43
- 'aria-label': string
50
+ /** Required unless the control sits in a `<Field label>`, which labels it. */
51
+ 'aria-label'?: string
52
+ 'aria-labelledby'?: string
44
53
  className?: string
45
54
  id?: string
46
55
  }
@@ -52,16 +61,32 @@ export interface SegmentedControlProps<T extends string>
52
61
  export function SegmentedControl<T extends string>(inProps: SegmentedControlProps<T>) {
53
62
  const [props, slots] = useComponentConfig('SegmentedControl', inProps)
54
63
  const { options, value, defaultValue, onValueChange, size, fullWidth, className, ...rest } = props
64
+ const field = useContext(FieldContext)
55
65
  const s = segmentedControlStyles({ size, fullWidth })
66
+ const [selected, setSelected] = useControllableState<T | undefined>({
67
+ value,
68
+ defaultValue,
69
+ onChange: (next) => next !== undefined && onValueChange?.(next),
70
+ })
71
+ const indicatorId = `${useId()}-segmented-indicator`
72
+ const labelledBy = rest['aria-labelledby'] ?? (rest['aria-label'] ? undefined : field?.labelId)
73
+ if (!rest['aria-label'] && !labelledBy) {
74
+ warnOnce(
75
+ 'segmented-control-label',
76
+ 'SegmentedControl needs a label: pass aria-label, or place it in a <Field label="…">.',
77
+ )
78
+ }
79
+ const describedBy = [field?.descriptionId, field?.errorId].filter(Boolean).join(' ')
56
80
  return (
57
81
  <ToggleGroup.Root
58
82
  type="single"
59
83
  data-slot="segmented-control"
60
- {...(value !== undefined && { value })}
61
- {...(defaultValue !== undefined && { defaultValue })}
84
+ value={selected ?? ''}
62
85
  // Radix emits '' when the active item is clicked again; a segmented control never deselects.
63
- onValueChange={(next: string) => next && onValueChange?.(next as T)}
86
+ onValueChange={(next: string) => next && setSelected(next as T)}
64
87
  className={s.root({ class: [slots.root, className] })}
88
+ aria-labelledby={labelledBy}
89
+ aria-describedby={describedBy || undefined}
65
90
  {...rest}
66
91
  >
67
92
  {options.map((option) => (
@@ -72,6 +97,12 @@ export function SegmentedControl<T extends string>(inProps: SegmentedControlProp
72
97
  className={s.item({ class: slots.item })}
73
98
  >
74
99
  {option.label}
100
+ {option.value === selected && (
101
+ <ActiveIndicator
102
+ layoutId={indicatorId}
103
+ className={s.indicator({ class: slots.indicator })}
104
+ />
105
+ )}
75
106
  </ToggleGroup.Item>
76
107
  ))}
77
108
  </ToggleGroup.Root>
@@ -7,7 +7,7 @@ import { tv, type VariantProps } from '../../utils/tv'
7
7
  import { useFieldControl } from '../field/field-context'
8
8
  import { fieldControl } from '../input/input.styles'
9
9
 
10
- export const selectStyles = tv({
10
+ export const selectStyles = /* @__PURE__ */ tv({
11
11
  slots: {
12
12
  trigger: [
13
13
  ...fieldControl,
@@ -19,7 +19,7 @@ export const selectStyles = tv({
19
19
  icon: 'size-4 shrink-0 text-faint-foreground',
20
20
  content: [
21
21
  popover,
22
- 'max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width)',
22
+ 'origin-(--radix-select-content-transform-origin) max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width)',
23
23
  ],
24
24
  viewport: 'p-1',
25
25
  item: [
@@ -3,7 +3,7 @@ import type { ComponentProps } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import { tv } from '../../utils/tv'
5
5
 
6
- export const separatorStyles = tv({
6
+ export const separatorStyles = /* @__PURE__ */ tv({
7
7
  slots: { base: 'shrink-0 bg-border' },
8
8
  variants: {
9
9
  orientation: {
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, transition } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const sheetStyles = tv({
5
+ export const sheetStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  overlay:
8
8
  'fixed inset-0 z-50 bg-overlay data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out',
@@ -2,7 +2,7 @@ import type { ComponentProps } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const skeletonStyles = tv({
5
+ export const skeletonStyles = /* @__PURE__ */ tv({
6
6
  slots: { base: 'animate-pulse rounded-sm bg-muted' },
7
7
  })
8
8
 
@@ -1,7 +1,7 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const sliderStyles = tv({
4
+ export const sliderStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  wrapper: 'grid w-full gap-1.5',
7
7
  root: 'relative flex h-5 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-50',