@glyphui/ui 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/README.md +68 -12
  2. package/dist/chart.d.ts +14 -202
  3. package/dist/chart.js +14 -456
  4. package/dist/components/accordion/accordion.d.ts +15 -0
  5. package/dist/components/accordion/accordion.js +69 -0
  6. package/dist/components/accordion/accordion.styles.d.ts +65 -0
  7. package/dist/components/accordion/accordion.styles.js +30 -0
  8. package/dist/components/accordion/index.d.ts +3 -0
  9. package/dist/components/alert/alert-icons.js +62 -0
  10. package/dist/components/alert/alert.d.ts +19 -0
  11. package/dist/components/alert/alert.js +64 -0
  12. package/dist/components/alert/alert.styles.d.ts +107 -0
  13. package/dist/components/alert/alert.styles.js +86 -0
  14. package/dist/components/alert/index.d.ts +3 -0
  15. package/dist/components/alert-dialog/alert-dialog.d.ts +29 -0
  16. package/dist/components/alert-dialog/alert-dialog.js +89 -0
  17. package/dist/components/alert-dialog/alert-dialog.styles.d.ts +63 -0
  18. package/dist/components/alert-dialog/alert-dialog.styles.js +19 -0
  19. package/dist/components/alert-dialog/confirm-dialog.js +22 -0
  20. package/dist/components/alert-dialog/confirm.d.ts +30 -0
  21. package/dist/components/alert-dialog/confirm.js +62 -0
  22. package/dist/components/alert-dialog/index.d.ts +4 -0
  23. package/dist/components/aspect-ratio/aspect-ratio.d.ts +55 -0
  24. package/dist/components/aspect-ratio/aspect-ratio.js +28 -0
  25. package/dist/components/aspect-ratio/index.d.ts +2 -0
  26. package/dist/components/avatar/avatar.d.ts +13 -0
  27. package/dist/components/avatar/avatar.js +50 -0
  28. package/dist/components/avatar/avatar.styles.d.ts +77 -0
  29. package/dist/components/avatar/avatar.styles.js +32 -0
  30. package/dist/components/avatar/index.d.ts +3 -0
  31. package/dist/components/badge/badge.d.ts +10 -0
  32. package/dist/components/badge/badge.js +28 -0
  33. package/dist/components/badge/badge.styles.d.ts +62 -0
  34. package/dist/components/badge/badge.styles.js +72 -0
  35. package/dist/components/badge/index.d.ts +3 -0
  36. package/dist/components/banner/banner.d.ts +17 -0
  37. package/dist/components/banner/banner.js +71 -0
  38. package/dist/components/banner/banner.styles.d.ts +98 -0
  39. package/dist/components/banner/banner.styles.js +27 -0
  40. package/dist/components/banner/index.d.ts +3 -0
  41. package/dist/components/blockquote/blockquote.d.ts +72 -0
  42. package/dist/components/blockquote/blockquote.js +47 -0
  43. package/dist/components/blockquote/index.d.ts +2 -0
  44. package/dist/components/breadcrumb/breadcrumb.d.ts +28 -0
  45. package/dist/components/breadcrumb/breadcrumb.js +85 -0
  46. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +63 -0
  47. package/dist/components/breadcrumb/breadcrumb.styles.js +18 -0
  48. package/dist/components/breadcrumb/index.d.ts +3 -0
  49. package/dist/components/button/button.d.ts +20 -0
  50. package/dist/components/button/button.js +52 -0
  51. package/dist/components/button/button.styles.d.ts +146 -0
  52. package/dist/components/button/button.styles.js +64 -0
  53. package/dist/components/button/index.d.ts +3 -0
  54. package/dist/components/calendar/calendar.d.ts +9 -0
  55. package/dist/components/calendar/calendar.js +75 -0
  56. package/dist/components/calendar/calendar.styles.d.ts +171 -0
  57. package/dist/components/calendar/calendar.styles.js +42 -0
  58. package/dist/components/calendar/index.d.ts +4 -0
  59. package/dist/components/card/card.d.ts +17 -0
  60. package/dist/components/card/card.js +79 -0
  61. package/dist/components/card/card.styles.d.ts +113 -0
  62. package/dist/components/card/card.styles.js +38 -0
  63. package/dist/components/card/index.d.ts +3 -0
  64. package/dist/components/carousel/carousel.d.ts +37 -0
  65. package/dist/components/carousel/carousel.js +190 -0
  66. package/dist/components/carousel/carousel.styles.d.ts +74 -0
  67. package/dist/components/carousel/carousel.styles.js +35 -0
  68. package/dist/components/carousel/index.d.ts +3 -0
  69. package/dist/components/checkbox/checkbox.d.ts +37 -0
  70. package/dist/components/checkbox/checkbox.js +44 -0
  71. package/dist/components/checkbox/index.d.ts +2 -0
  72. package/dist/components/code/code.d.ts +18 -0
  73. package/dist/components/code/code.js +75 -0
  74. package/dist/components/code/code.styles.d.ts +76 -0
  75. package/dist/components/code/code.styles.js +18 -0
  76. package/dist/components/code/index.d.ts +3 -0
  77. package/dist/components/collapsible/collapsible.d.ts +56 -0
  78. package/dist/components/collapsible/collapsible.js +43 -0
  79. package/dist/components/collapsible/index.d.ts +2 -0
  80. package/dist/components/combobox/combobox.d.ts +50 -0
  81. package/dist/components/combobox/combobox.js +141 -0
  82. package/dist/components/combobox/combobox.styles.d.ts +110 -0
  83. package/dist/components/combobox/combobox.styles.js +42 -0
  84. package/dist/components/combobox/index.d.ts +3 -0
  85. package/dist/components/command-menu/command-menu.d.ts +40 -0
  86. package/dist/components/command-menu/command-menu.js +148 -0
  87. package/dist/components/command-menu/command-menu.styles.d.ts +105 -0
  88. package/dist/components/command-menu/command-menu.styles.js +30 -0
  89. package/dist/components/command-menu/index.d.ts +3 -0
  90. package/dist/components/container/container.d.ts +34 -0
  91. package/dist/components/container/container.js +30 -0
  92. package/dist/components/container/index.d.ts +2 -0
  93. package/dist/components/context-menu/context-menu.d.ts +34 -0
  94. package/dist/components/context-menu/context-menu.js +157 -0
  95. package/dist/components/context-menu/context-menu.styles.d.ts +135 -0
  96. package/dist/components/context-menu/context-menu.styles.js +14 -0
  97. package/dist/components/context-menu/index.d.ts +3 -0
  98. package/dist/components/copy-button/copy-button.d.ts +61 -0
  99. package/dist/components/copy-button/copy-button.js +79 -0
  100. package/dist/components/copy-button/index.d.ts +2 -0
  101. package/dist/components/date-picker/date-picker.d.ts +51 -0
  102. package/dist/components/date-picker/date-picker.js +235 -0
  103. package/dist/components/date-picker/date-picker.styles.d.ts +77 -0
  104. package/dist/components/date-picker/date-picker.styles.js +31 -0
  105. package/dist/components/date-picker/index.d.ts +3 -0
  106. package/dist/components/description-list/description-list.d.ts +15 -0
  107. package/dist/components/description-list/description-list.js +51 -0
  108. package/dist/components/description-list/description-list.styles.d.ts +74 -0
  109. package/dist/components/description-list/description-list.styles.js +35 -0
  110. package/dist/components/description-list/index.d.ts +3 -0
  111. package/dist/components/dialog/close-icon.js +22 -0
  112. package/dist/components/dialog/dialog.d.ts +21 -0
  113. package/dist/components/dialog/dialog.js +79 -0
  114. package/dist/components/dialog/dialog.styles.d.ts +83 -0
  115. package/dist/components/dialog/dialog.styles.js +34 -0
  116. package/dist/components/dialog/index.d.ts +3 -0
  117. package/dist/components/dropdown-menu/dropdown-menu.d.ts +34 -0
  118. package/dist/components/dropdown-menu/dropdown-menu.js +160 -0
  119. package/dist/components/dropdown-menu/dropdown-menu.styles.d.ts +83 -0
  120. package/dist/components/dropdown-menu/dropdown-menu.styles.js +38 -0
  121. package/dist/components/dropdown-menu/index.d.ts +3 -0
  122. package/dist/components/eyebrow/eyebrow.d.ts +9 -0
  123. package/dist/components/eyebrow/eyebrow.js +20 -0
  124. package/dist/components/eyebrow/eyebrow.styles.d.ts +38 -0
  125. package/dist/components/eyebrow/eyebrow.styles.js +13 -0
  126. package/dist/components/eyebrow/index.d.ts +3 -0
  127. package/dist/components/field/field-context.d.ts +25 -0
  128. package/dist/components/field/field-context.js +27 -0
  129. package/dist/components/field/field.d.ts +28 -0
  130. package/dist/{field-CWZ_FdkD.js → components/field/field.js} +20 -34
  131. package/dist/components/field/field.styles.d.ts +53 -0
  132. package/dist/components/field/field.styles.js +22 -0
  133. package/dist/components/field/index.d.ts +4 -0
  134. package/dist/components/file-upload/file-upload.d.ts +52 -0
  135. package/dist/components/file-upload/file-upload.js +266 -0
  136. package/dist/components/file-upload/file-upload.styles.d.ts +123 -0
  137. package/dist/components/file-upload/file-upload.styles.js +32 -0
  138. package/dist/components/file-upload/index.d.ts +3 -0
  139. package/dist/components/grid/grid.d.ts +168 -0
  140. package/dist/components/grid/grid.js +126 -0
  141. package/dist/components/grid/index.d.ts +2 -0
  142. package/dist/components/heading/heading.d.ts +12 -0
  143. package/dist/components/heading/heading.js +28 -0
  144. package/dist/components/heading/heading.styles.d.ts +65 -0
  145. package/dist/components/heading/heading.styles.js +15 -0
  146. package/dist/components/heading/index.d.ts +3 -0
  147. package/dist/components/hover-card/hover-card.d.ts +43 -0
  148. package/dist/components/hover-card/hover-card.js +27 -0
  149. package/dist/components/hover-card/index.d.ts +2 -0
  150. package/dist/components/input/index.d.ts +3 -0
  151. package/dist/components/input/input.d.ts +13 -0
  152. package/dist/components/input/input.js +33 -0
  153. package/dist/components/input/input.styles.d.ts +55 -0
  154. package/dist/components/input/input.styles.js +33 -0
  155. package/dist/components/input-otp/index.d.ts +4 -0
  156. package/dist/components/input-otp/index.js +5 -0
  157. package/dist/components/input-otp/input-otp.d.ts +23 -0
  158. package/dist/components/input-otp/input-otp.js +86 -0
  159. package/dist/components/input-otp/input-otp.styles.d.ts +71 -0
  160. package/dist/components/input-otp/input-otp.styles.js +30 -0
  161. package/dist/components/kbd/index.d.ts +2 -0
  162. package/dist/components/kbd/kbd.d.ts +30 -0
  163. package/dist/components/kbd/kbd.js +17 -0
  164. package/dist/components/label/index.d.ts +2 -0
  165. package/dist/components/label/label.d.ts +31 -0
  166. package/dist/components/label/label.js +17 -0
  167. package/dist/components/link/index.d.ts +3 -0
  168. package/dist/components/link/link.d.ts +14 -0
  169. package/dist/components/link/link.js +57 -0
  170. package/dist/components/link/link.styles.d.ts +89 -0
  171. package/dist/components/link/link.styles.js +33 -0
  172. package/dist/components/modal/index.d.ts +3 -0
  173. package/dist/components/modal/modal.d.ts +33 -0
  174. package/dist/components/modal/modal.js +56 -0
  175. package/dist/components/modal/modal.styles.d.ts +61 -0
  176. package/dist/components/modal/modal.styles.js +14 -0
  177. package/dist/components/navigation-menu/index.d.ts +3 -0
  178. package/dist/components/navigation-menu/navigation-menu.d.ts +37 -0
  179. package/dist/components/navigation-menu/navigation-menu.js +138 -0
  180. package/dist/components/navigation-menu/navigation-menu.styles.d.ts +111 -0
  181. package/dist/components/navigation-menu/navigation-menu.styles.js +39 -0
  182. package/dist/components/number-input/index.d.ts +3 -0
  183. package/dist/components/number-input/number-input.d.ts +30 -0
  184. package/dist/components/number-input/number-input.js +151 -0
  185. package/dist/components/number-input/number-input.styles.d.ts +68 -0
  186. package/dist/components/number-input/number-input.styles.js +35 -0
  187. package/dist/components/pagination/index.d.ts +4 -0
  188. package/dist/components/pagination/pagination-range.d.ts +11 -0
  189. package/dist/components/pagination/pagination-range.js +42 -0
  190. package/dist/components/pagination/pagination.d.ts +18 -0
  191. package/dist/components/pagination/pagination.js +94 -0
  192. package/dist/components/pagination/pagination.styles.d.ts +65 -0
  193. package/dist/components/pagination/pagination.styles.js +35 -0
  194. package/dist/components/password-input/index.d.ts +3 -0
  195. package/dist/components/password-input/password-input.d.ts +20 -0
  196. package/dist/components/password-input/password-input.js +106 -0
  197. package/dist/components/password-input/password-input.styles.d.ts +66 -0
  198. package/dist/components/password-input/password-input.styles.js +21 -0
  199. package/dist/components/popover/index.d.ts +2 -0
  200. package/dist/components/popover/popover.d.ts +52 -0
  201. package/dist/components/popover/popover.js +35 -0
  202. package/dist/components/progress/index.d.ts +3 -0
  203. package/dist/components/progress/progress.d.ts +29 -0
  204. package/dist/components/progress/progress.js +108 -0
  205. package/dist/components/progress/progress.styles.d.ts +236 -0
  206. package/dist/components/progress/progress.styles.js +69 -0
  207. package/dist/components/prose/index.d.ts +2 -0
  208. package/dist/components/prose/prose.d.ts +90 -0
  209. package/dist/components/prose/prose.js +67 -0
  210. package/dist/components/radio-group/index.d.ts +3 -0
  211. package/dist/components/radio-group/radio-group.d.ts +26 -0
  212. package/dist/components/radio-group/radio-group.js +102 -0
  213. package/dist/components/radio-group/radio-group.styles.d.ts +80 -0
  214. package/dist/components/radio-group/radio-group.styles.js +56 -0
  215. package/dist/components/resizable/index.d.ts +3 -0
  216. package/dist/components/resizable/resizable.d.ts +17 -0
  217. package/dist/components/resizable/resizable.js +81 -0
  218. package/dist/components/resizable/resizable.styles.d.ts +53 -0
  219. package/dist/components/resizable/resizable.styles.js +19 -0
  220. package/dist/components/scroll-area/index.d.ts +2 -0
  221. package/dist/components/scroll-area/scroll-area.d.ts +70 -0
  222. package/dist/components/scroll-area/scroll-area.js +70 -0
  223. package/dist/components/section/index.d.ts +2 -0
  224. package/dist/components/section/section.d.ts +52 -0
  225. package/dist/components/section/section.js +41 -0
  226. package/dist/components/segmented-control/index.d.ts +2 -0
  227. package/dist/components/segmented-control/segmented-control.d.ts +92 -0
  228. package/dist/components/segmented-control/segmented-control.js +86 -0
  229. package/dist/components/select/index.d.ts +2 -0
  230. package/dist/components/select/select.d.ts +85 -0
  231. package/dist/components/select/select.js +81 -0
  232. package/dist/components/separator/index.d.ts +2 -0
  233. package/dist/components/separator/separator.d.ts +40 -0
  234. package/dist/components/separator/separator.js +27 -0
  235. package/dist/components/sheet/index.d.ts +3 -0
  236. package/dist/components/sheet/sheet.d.ts +20 -0
  237. package/dist/components/sheet/sheet.js +83 -0
  238. package/dist/components/sheet/sheet.styles.d.ts +101 -0
  239. package/dist/components/sheet/sheet.styles.js +62 -0
  240. package/dist/components/skeleton/index.d.ts +2 -0
  241. package/dist/components/skeleton/skeleton.d.ts +30 -0
  242. package/dist/components/skeleton/skeleton.js +18 -0
  243. package/dist/components/slider/index.d.ts +3 -0
  244. package/dist/components/slider/slider.d.ts +38 -0
  245. package/dist/components/slider/slider.js +68 -0
  246. package/dist/components/slider/slider.styles.d.ts +56 -0
  247. package/dist/components/slider/slider.styles.js +23 -0
  248. package/dist/components/spinner/index.d.ts +3 -0
  249. package/dist/components/spinner/spinner.d.ts +9 -0
  250. package/dist/components/spinner/spinner.js +36 -0
  251. package/dist/components/spinner/spinner.styles.d.ts +53 -0
  252. package/dist/components/spinner/spinner.styles.js +18 -0
  253. package/dist/components/stack/index.d.ts +2 -0
  254. package/dist/components/stack/stack.d.ts +109 -0
  255. package/dist/components/stack/stack.js +62 -0
  256. package/dist/components/stat-card/index.d.ts +3 -0
  257. package/dist/components/stat-card/stat-card.d.ts +22 -0
  258. package/dist/components/stat-card/stat-card.js +82 -0
  259. package/dist/components/stat-card/stat-card.styles.d.ts +83 -0
  260. package/dist/components/stat-card/stat-card.styles.js +16 -0
  261. package/dist/components/stepper/index.d.ts +3 -0
  262. package/dist/components/stepper/stepper.d.ts +20 -0
  263. package/dist/components/stepper/stepper.js +100 -0
  264. package/dist/components/stepper/stepper.styles.d.ts +170 -0
  265. package/dist/components/stepper/stepper.styles.js +67 -0
  266. package/dist/components/switch/index.d.ts +2 -0
  267. package/dist/components/switch/switch.d.ts +51 -0
  268. package/dist/components/switch/switch.js +43 -0
  269. package/dist/components/table/index.d.ts +2 -0
  270. package/dist/components/table/table.d.ts +78 -0
  271. package/dist/components/table/table.js +82 -0
  272. package/dist/components/tabs/index.d.ts +2 -0
  273. package/dist/components/tabs/tabs.d.ts +73 -0
  274. package/dist/components/tabs/tabs.js +103 -0
  275. package/dist/components/tag-input/index.d.ts +3 -0
  276. package/dist/components/tag-input/tag-input.d.ts +30 -0
  277. package/dist/components/tag-input/tag-input.js +149 -0
  278. package/dist/components/tag-input/tag-input.styles.d.ts +71 -0
  279. package/dist/components/tag-input/tag-input.styles.js +29 -0
  280. package/dist/components/text/index.d.ts +3 -0
  281. package/dist/components/text/text.d.ts +9 -0
  282. package/dist/components/text/text.js +25 -0
  283. package/dist/components/text/text.styles.d.ts +188 -0
  284. package/dist/components/text/text.styles.js +36 -0
  285. package/dist/components/textarea/index.d.ts +2 -0
  286. package/dist/components/textarea/textarea.d.ts +29 -0
  287. package/dist/components/textarea/textarea.js +23 -0
  288. package/dist/components/timeline/index.d.ts +3 -0
  289. package/dist/components/timeline/timeline.d.ts +28 -0
  290. package/dist/components/timeline/timeline.js +61 -0
  291. package/dist/components/timeline/timeline.styles.d.ts +110 -0
  292. package/dist/components/timeline/timeline.styles.js +30 -0
  293. package/dist/components/toast/index.d.ts +2 -0
  294. package/dist/components/toast/toast.d.ts +119 -0
  295. package/dist/components/toast/toast.js +75 -0
  296. package/dist/components/toggle/index.d.ts +3 -0
  297. package/dist/components/toggle/toggle.d.ts +20 -0
  298. package/dist/components/toggle/toggle.js +58 -0
  299. package/dist/components/toggle/toggle.styles.d.ts +80 -0
  300. package/dist/components/toggle/toggle.styles.js +34 -0
  301. package/dist/components/tooltip/index.d.ts +2 -0
  302. package/dist/components/tooltip/tooltip.d.ts +39 -0
  303. package/dist/components/tooltip/tooltip.js +29 -0
  304. package/dist/components/tree-view/index.d.ts +3 -0
  305. package/dist/components/tree-view/tree-view.d.ts +31 -0
  306. package/dist/components/tree-view/tree-view.js +192 -0
  307. package/dist/components/tree-view/tree-view.styles.d.ts +59 -0
  308. package/dist/components/tree-view/tree-view.styles.js +32 -0
  309. package/dist/components/visually-hidden/index.d.ts +2 -0
  310. package/dist/components/visually-hidden/visually-hidden.d.ts +10 -0
  311. package/dist/components/visually-hidden/visually-hidden.js +16 -0
  312. package/dist/data-table.d.ts +3 -110
  313. package/dist/data-table.js +2 -224
  314. package/dist/form.d.ts +2 -79
  315. package/dist/form.js +1 -83
  316. package/dist/hooks/index.d.ts +5 -0
  317. package/dist/hooks/use-component-config.d.ts +13 -0
  318. package/dist/hooks/use-component-config.js +22 -0
  319. package/dist/hooks/use-controllable-state.d.ts +9 -0
  320. package/dist/hooks/use-controllable-state.js +18 -0
  321. package/dist/hooks/use-media-query.d.ts +4 -0
  322. package/dist/hooks/use-media-query.js +13 -0
  323. package/dist/hooks/use-scrolled.d.ts +4 -0
  324. package/dist/hooks/use-scrolled.js +17 -0
  325. package/dist/index.d.ts +223 -6849
  326. package/dist/index.js +148 -6718
  327. package/dist/internal/dev.js +12 -0
  328. package/dist/internal/icons.js +91 -0
  329. package/dist/motion/active-indicator.d.ts +12 -0
  330. package/dist/motion/active-indicator.js +26 -0
  331. package/dist/motion/animated-number.d.ts +21 -0
  332. package/dist/motion/animated-number.js +88 -0
  333. package/dist/motion/features.js +10 -0
  334. package/dist/motion/index.d.ts +10 -0
  335. package/dist/motion/index.js +10 -0
  336. package/dist/motion/motion-root.js +48 -0
  337. package/dist/motion/page-transition.d.ts +16 -0
  338. package/dist/motion/page-transition.js +23 -0
  339. package/dist/motion/presence-list.js +46 -0
  340. package/dist/motion/presence.d.ts +11 -0
  341. package/dist/motion/presence.js +17 -0
  342. package/dist/motion/reveal.d.ts +18 -0
  343. package/dist/motion/reveal.js +37 -0
  344. package/dist/motion/stagger.d.ts +29 -0
  345. package/dist/motion/stagger.js +52 -0
  346. package/dist/motion/use-motion-settings.d.ts +25 -0
  347. package/dist/motion/use-motion-settings.js +47 -0
  348. package/dist/motion/use-reveal.d.ts +11 -0
  349. package/dist/motion/use-reveal.js +41 -0
  350. package/dist/patterns/app-shell/app-shell-context.d.ts +14 -0
  351. package/dist/patterns/app-shell/app-shell-context.js +16 -0
  352. package/dist/patterns/app-shell/app-shell.d.ts +21 -0
  353. package/dist/patterns/app-shell/app-shell.js +82 -0
  354. package/dist/patterns/app-shell/app-shell.styles.d.ts +302 -0
  355. package/dist/patterns/app-shell/app-shell.styles.js +106 -0
  356. package/dist/patterns/app-shell/index.d.ts +7 -0
  357. package/dist/patterns/app-shell/navbar.d.ts +29 -0
  358. package/dist/patterns/app-shell/navbar.js +116 -0
  359. package/dist/patterns/app-shell/page-header.d.ts +12 -0
  360. package/dist/patterns/app-shell/page-header.js +38 -0
  361. package/dist/patterns/app-shell/sidebar.d.ts +31 -0
  362. package/dist/patterns/app-shell/sidebar.js +141 -0
  363. package/dist/patterns/async/async.d.ts +40 -0
  364. package/dist/patterns/async/async.js +61 -0
  365. package/dist/patterns/async/index.d.ts +3 -0
  366. package/dist/patterns/async/states.d.ts +68 -0
  367. package/dist/patterns/async/states.js +116 -0
  368. package/dist/patterns/chart/cartesian.d.ts +128 -0
  369. package/dist/patterns/chart/cartesian.js +552 -0
  370. package/dist/patterns/chart/chart-card.d.ts +39 -0
  371. package/dist/patterns/chart/chart-card.js +103 -0
  372. package/dist/patterns/chart/chart-parts.d.ts +53 -0
  373. package/dist/patterns/chart/chart-parts.js +282 -0
  374. package/dist/patterns/chart/chart.styles.d.ts +200 -0
  375. package/dist/patterns/chart/chart.styles.js +43 -0
  376. package/dist/patterns/chart/export.d.ts +45 -0
  377. package/dist/patterns/chart/export.js +293 -0
  378. package/dist/patterns/chart/funnel.d.ts +23 -0
  379. package/dist/patterns/chart/funnel.js +129 -0
  380. package/dist/patterns/chart/heatmap.d.ts +37 -0
  381. package/dist/patterns/chart/heatmap.js +258 -0
  382. package/dist/patterns/chart/icons.js +39 -0
  383. package/dist/patterns/chart/pie.d.ts +36 -0
  384. package/dist/patterns/chart/pie.js +120 -0
  385. package/dist/patterns/chart/radial.d.ts +75 -0
  386. package/dist/patterns/chart/radial.js +282 -0
  387. package/dist/patterns/chart/sankey.d.ts +29 -0
  388. package/dist/patterns/chart/sankey.js +136 -0
  389. package/dist/patterns/chart/scatter.d.ts +42 -0
  390. package/dist/patterns/chart/scatter.js +203 -0
  391. package/dist/patterns/chart/sparkline.d.ts +20 -0
  392. package/dist/patterns/chart/sparkline.js +102 -0
  393. package/dist/patterns/chart/treemap.d.ts +25 -0
  394. package/dist/patterns/chart/treemap.js +128 -0
  395. package/dist/patterns/chart/use-element-width.js +23 -0
  396. package/dist/patterns/data-table/data-table.d.ts +109 -0
  397. package/dist/patterns/data-table/data-table.js +233 -0
  398. package/dist/patterns/form/form.d.ts +89 -0
  399. package/dist/patterns/form/form.js +111 -0
  400. package/dist/provider/color-mode-script.d.ts +15 -0
  401. package/dist/provider/color-mode-script.js +13 -0
  402. package/dist/provider/color-mode.d.ts +24 -0
  403. package/dist/provider/color-mode.js +87 -0
  404. package/dist/provider/glyph-context.d.ts +51 -0
  405. package/dist/provider/glyph-context.js +28 -0
  406. package/dist/provider/glyph-provider.d.ts +37 -0
  407. package/dist/provider/glyph-provider.js +48 -0
  408. package/dist/provider/index.d.ts +6 -0
  409. package/dist/provider/theme-scope.d.ts +12 -0
  410. package/dist/provider/theme-scope.js +42 -0
  411. package/dist/provider/theme-style.js +15 -0
  412. package/dist/react-router.d.ts +18 -0
  413. package/dist/react-router.js +44 -0
  414. package/dist/register.d.ts +57 -0
  415. package/dist/themes.d.ts +22 -0
  416. package/dist/themes.js +49 -0
  417. package/dist/utils/cn.d.ts +6 -0
  418. package/dist/utils/cn.js +12 -0
  419. package/dist/utils/compose-refs.js +11 -0
  420. package/dist/{registry-BGSJoiLq.d.ts → utils/registry.d.ts} +2 -3
  421. package/dist/utils/styles.js +20 -0
  422. package/dist/{tv-DuMh7UH2.d.ts → utils/tv.d.ts} +2 -2
  423. package/dist/utils/tv.js +8 -0
  424. package/dist/utils/tw-merge-config.js +13 -0
  425. package/dist/vite.d.ts +27 -0
  426. package/dist/vite.js +29 -0
  427. package/fonts.css +10 -0
  428. package/package.json +33 -5
  429. package/src/components/accordion/accordion.styles.ts +1 -1
  430. package/src/components/alert/alert.styles.ts +1 -1
  431. package/src/components/alert-dialog/alert-dialog.styles.ts +5 -4
  432. package/src/components/alert-dialog/confirm-dialog.tsx +42 -0
  433. package/src/components/alert-dialog/confirm.tsx +12 -31
  434. package/src/components/aspect-ratio/aspect-ratio.tsx +1 -1
  435. package/src/components/avatar/avatar.styles.ts +1 -1
  436. package/src/components/badge/badge.styles.ts +12 -17
  437. package/src/components/banner/banner.styles.ts +5 -5
  438. package/src/components/blockquote/blockquote.tsx +1 -1
  439. package/src/components/breadcrumb/breadcrumb.styles.ts +1 -1
  440. package/src/components/button/button.styles.ts +6 -2
  441. package/src/components/calendar/calendar.styles.ts +4 -3
  442. package/src/components/card/card.styles.ts +1 -1
  443. package/src/components/carousel/carousel.styles.ts +1 -1
  444. package/src/components/checkbox/checkbox.tsx +20 -5
  445. package/src/components/code/code.styles.ts +2 -2
  446. package/src/components/collapsible/collapsible.tsx +1 -1
  447. package/src/components/combobox/combobox.styles.ts +5 -2
  448. package/src/components/command-menu/command-menu.styles.ts +6 -4
  449. package/src/components/container/container.tsx +1 -1
  450. package/src/components/context-menu/context-menu.styles.ts +4 -2
  451. package/src/components/copy-button/copy-button.tsx +1 -1
  452. package/src/components/date-picker/date-picker.styles.ts +2 -2
  453. package/src/components/description-list/description-list.styles.ts +1 -1
  454. package/src/components/dialog/dialog.styles.ts +11 -4
  455. package/src/components/dropdown-menu/dropdown-menu.styles.ts +5 -5
  456. package/src/components/eyebrow/eyebrow.styles.ts +2 -2
  457. package/src/components/field/field-context.ts +2 -0
  458. package/src/components/field/field.styles.ts +5 -3
  459. package/src/components/field/field.tsx +25 -4
  460. package/src/components/file-upload/file-upload.styles.ts +4 -4
  461. package/src/components/file-upload/file-upload.tsx +51 -48
  462. package/src/components/grid/grid.tsx +1 -1
  463. package/src/components/heading/heading.styles.ts +1 -1
  464. package/src/components/hover-card/hover-card.tsx +5 -2
  465. package/src/components/input/input.styles.ts +1 -1
  466. package/src/components/input-otp/input-otp.styles.ts +1 -1
  467. package/src/components/kbd/kbd.tsx +1 -1
  468. package/src/components/label/label.tsx +1 -1
  469. package/src/components/link/link.styles.ts +2 -2
  470. package/src/components/modal/modal.styles.ts +3 -1
  471. package/src/components/modal/modal.tsx +30 -5
  472. package/src/components/navigation-menu/navigation-menu.styles.ts +2 -2
  473. package/src/components/navigation-menu/navigation-menu.tsx +14 -4
  474. package/src/components/number-input/number-input.styles.ts +1 -1
  475. package/src/components/pagination/pagination.styles.ts +6 -4
  476. package/src/components/pagination/pagination.tsx +14 -1
  477. package/src/components/password-input/password-input.styles.ts +4 -4
  478. package/src/components/popover/popover.tsx +1 -1
  479. package/src/components/progress/progress.styles.ts +2 -2
  480. package/src/components/prose/prose.tsx +2 -2
  481. package/src/components/radio-group/radio-group.styles.ts +1 -1
  482. package/src/components/resizable/resizable.styles.ts +1 -1
  483. package/src/components/scroll-area/scroll-area.tsx +24 -2
  484. package/src/components/section/section.tsx +1 -1
  485. package/src/components/segmented-control/segmented-control.tsx +40 -9
  486. package/src/components/select/select.tsx +2 -2
  487. package/src/components/separator/separator.tsx +1 -1
  488. package/src/components/sheet/sheet.styles.ts +1 -1
  489. package/src/components/skeleton/skeleton.tsx +1 -1
  490. package/src/components/slider/slider.styles.ts +1 -1
  491. package/src/components/slider/slider.tsx +9 -2
  492. package/src/components/spinner/spinner.styles.ts +1 -1
  493. package/src/components/stack/stack.tsx +1 -1
  494. package/src/components/stat-card/stat-card.styles.ts +1 -1
  495. package/src/components/stepper/stepper.styles.ts +3 -3
  496. package/src/components/switch/switch.tsx +2 -2
  497. package/src/components/table/table.tsx +1 -1
  498. package/src/components/tabs/tabs.tsx +46 -15
  499. package/src/components/tag-input/tag-input.styles.ts +2 -2
  500. package/src/components/tag-input/tag-input.tsx +27 -18
  501. package/src/components/text/text.styles.ts +5 -5
  502. package/src/components/textarea/textarea.tsx +1 -1
  503. package/src/components/timeline/timeline.styles.ts +1 -1
  504. package/src/components/toast/toast.tsx +1 -1
  505. package/src/components/toggle/toggle.styles.ts +1 -1
  506. package/src/components/tooltip/tooltip.tsx +6 -3
  507. package/src/components/tree-view/tree-view.styles.ts +1 -1
  508. package/src/index.ts +3 -0
  509. package/src/integrations/react-router.tsx +39 -0
  510. package/src/integrations/vite.test-d.ts +6 -0
  511. package/src/integrations/vite.test.ts +28 -0
  512. package/src/integrations/vite.ts +33 -0
  513. package/src/internal/dev.ts +12 -0
  514. package/src/motion/active-indicator.tsx +26 -0
  515. package/src/motion/animated-number.tsx +113 -0
  516. package/src/motion/features.ts +7 -0
  517. package/src/motion/index.ts +9 -0
  518. package/src/motion/motion-root.tsx +46 -0
  519. package/src/motion/page-transition.tsx +30 -0
  520. package/src/motion/presence-list.tsx +42 -0
  521. package/src/motion/presence.tsx +13 -0
  522. package/src/motion/reveal.tsx +50 -0
  523. package/src/motion/stagger.tsx +81 -0
  524. package/src/motion/use-motion-settings.ts +52 -0
  525. package/src/motion/use-reveal.ts +54 -0
  526. package/src/patterns/app-shell/app-shell.styles.ts +19 -12
  527. package/src/patterns/app-shell/navbar.tsx +34 -16
  528. package/src/patterns/app-shell/sidebar.tsx +35 -9
  529. package/src/patterns/async/states.tsx +1 -1
  530. package/src/patterns/chart/cartesian.tsx +755 -0
  531. package/src/patterns/chart/chart-card.tsx +148 -0
  532. package/src/patterns/chart/chart-parts.tsx +330 -57
  533. package/src/patterns/chart/chart.styles.ts +29 -3
  534. package/src/patterns/chart/export.ts +334 -0
  535. package/src/patterns/chart/funnel.tsx +171 -0
  536. package/src/patterns/chart/heatmap.tsx +339 -0
  537. package/src/patterns/chart/icons.tsx +44 -0
  538. package/src/patterns/chart/index.ts +52 -7
  539. package/src/patterns/chart/pie.tsx +169 -0
  540. package/src/patterns/chart/radial.tsx +361 -0
  541. package/src/patterns/chart/sankey.tsx +197 -0
  542. package/src/patterns/chart/scatter.tsx +254 -0
  543. package/src/patterns/chart/sparkline.tsx +111 -0
  544. package/src/patterns/chart/test-utils.tsx +35 -0
  545. package/src/patterns/chart/treemap.tsx +198 -0
  546. package/src/patterns/chart/use-element-width.ts +20 -0
  547. package/src/patterns/data-table/data-table.tsx +1 -1
  548. package/src/patterns/form/form.tsx +49 -7
  549. package/src/patterns/form/index.ts +1 -0
  550. package/src/provider/color-mode-script.ts +28 -0
  551. package/src/provider/color-mode.tsx +14 -20
  552. package/src/provider/glyph-context.ts +41 -1
  553. package/src/provider/glyph-provider.tsx +45 -14
  554. package/src/provider/index.ts +4 -0
  555. package/src/provider/theme-scope.tsx +20 -11
  556. package/src/themes.ts +3 -3
  557. package/src/utils/styles.ts +17 -3
  558. package/styles.css +194 -3
  559. package/dist/field-context-anGPYXbW.js +0 -267
  560. package/dist/index-BWK4czIG.d.ts +0 -233
  561. package/dist/states-DR-OoDT-.js +0 -288
  562. package/dist/tv-DBAGlgXJ.js +0 -58
  563. package/src/patterns/chart/chart.tsx +0 -369
@@ -1,7 +1,7 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const bannerStyles = tv({
4
+ export const bannerStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  root: ['w-full border-b-(length:--glyph-border-width) text-small'],
7
7
  inner: 'mx-auto flex w-full max-w-7xl items-center gap-3 px-4 py-2.5 sm:px-6',
@@ -15,16 +15,16 @@ export const bannerStyles = tv({
15
15
  neutral: { root: 'border-border bg-subtle text-foreground', icon: 'text-muted-foreground' },
16
16
  primary: { root: 'border-primary bg-primary text-primary-foreground' },
17
17
  info: {
18
- root: 'border-info/25 bg-info/10 text-[color-mix(in_oklab,var(--color-info)_55%,var(--color-foreground))]',
18
+ root: 'border-info/25 bg-info/10 text-info-text',
19
19
  },
20
20
  success: {
21
- root: 'border-success/25 bg-success/10 text-[color-mix(in_oklab,var(--color-success)_55%,var(--color-foreground))]',
21
+ root: 'border-success/25 bg-success/10 text-success-text',
22
22
  },
23
23
  warning: {
24
- root: 'border-warning/30 bg-warning/14 text-[color-mix(in_oklab,var(--color-warning)_50%,var(--color-foreground))]',
24
+ root: 'border-warning/30 bg-warning/14 text-warning-text',
25
25
  },
26
26
  danger: {
27
- root: 'border-danger/25 bg-danger/10 text-[color-mix(in_oklab,var(--color-danger)_55%,var(--color-foreground))]',
27
+ root: 'border-danger/25 bg-danger/10 text-danger-text',
28
28
  },
29
29
  },
30
30
  },
@@ -3,7 +3,7 @@ import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import type { StylesEntry } from '../../utils/registry'
4
4
  import { tv, type VariantProps } from '../../utils/tv'
5
5
 
6
- export const blockquoteStyles = tv({
6
+ export const blockquoteStyles = /* @__PURE__ */ tv({
7
7
  slots: {
8
8
  root: 'grid gap-3 border-l-2 border-primary pl-5',
9
9
  quote: 'font-display text-pretty text-foreground',
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, transition } from '../../utils/styles'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const breadcrumbStyles = tv({
5
+ export const breadcrumbStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'min-w-0',
8
8
  list: 'flex flex-wrap items-center gap-1.5 text-small text-muted-foreground',
@@ -1,7 +1,7 @@
1
1
  import { focusRing, themedBorder, transition } from '../../utils/styles'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const buttonStyles = tv({
4
+ export const buttonStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  base: [
7
7
  'relative inline-flex shrink-0 cursor-pointer select-none items-center justify-center gap-2 whitespace-nowrap',
@@ -10,6 +10,8 @@ export const buttonStyles = tv({
10
10
  transition,
11
11
  focusRing,
12
12
  'disabled:pointer-events-none disabled:opacity-50 aria-busy:cursor-progress',
13
+ // Press feedback. CSS only, so Button stays free of animation libraries.
14
+ 'active:scale-[0.98] motion-expressive:active:scale-[0.95]',
13
15
  ],
14
16
  icon: 'inline-flex size-4 shrink-0 items-center justify-center [&>svg]:size-full',
15
17
  },
@@ -22,7 +24,9 @@ export const buttonStyles = tv({
22
24
  },
23
25
  ghost: { base: 'text-muted-foreground hover:bg-muted hover:text-foreground' },
24
26
  danger: { base: 'bg-danger text-danger-foreground shadow-sm hover:bg-danger/88' },
25
- link: { base: 'h-auto px-0 text-primary underline-offset-4 shadow-none hover:underline' },
27
+ link: {
28
+ base: 'h-auto px-0 text-primary-text underline-offset-4 shadow-none hover:underline active:scale-100 motion-expressive:active:scale-100',
29
+ },
26
30
  },
27
31
  size: {
28
32
  sm: { base: 'h-(--glyph-control-sm) px-3 text-small', icon: 'size-3.5' },
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, transition } from '../../utils/styles'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const calendarStyles = tv({
5
+ export const calendarStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'relative w-fit p-3 text-small text-foreground',
8
8
  months: 'relative flex flex-col gap-6 sm:flex-row',
@@ -29,10 +29,11 @@ export const calendarStyles = tv({
29
29
  transition,
30
30
  focusRing,
31
31
  ],
32
- today: '[&>button]:font-semibold [&>button]:text-primary',
32
+ // Selected days keep primary-foreground on primary, whatever else applies to them.
33
+ today: '[&>button]:font-semibold [&:not([data-selected])>button]:text-primary-text',
33
34
  selected:
34
35
  '[&>button]:bg-primary [&>button]:text-primary-foreground [&>button]:hover:bg-primary/90',
35
- outside: '[&>button]:text-faint-foreground [&>button]:opacity-60',
36
+ outside: '[&:not([data-selected])>button]:text-faint-foreground',
36
37
  disabled: '[&>button]:pointer-events-none [&>button]:opacity-35 [&>button]:line-through',
37
38
  rangeStart: 'rounded-l-md bg-primary/14',
38
39
  rangeMiddle:
@@ -1,7 +1,7 @@
1
1
  import { themedBorder, transition } from '../../utils/styles'
2
2
  import { tv, type VariantProps } from '../../utils/tv'
3
3
 
4
- export const cardStyles = tv({
4
+ export const cardStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  root: ['flex flex-col rounded-lg text-foreground', themedBorder, transition],
7
7
  header: 'flex flex-col gap-1',
@@ -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 carouselStyles = tv({
5
+ export const carouselStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'relative',
8
8
  viewport: 'overflow-hidden rounded-lg',
@@ -1,12 +1,12 @@
1
1
  import { Checkbox as CheckboxPrimitive } from 'radix-ui'
2
- import type { ComponentProps } from 'react'
2
+ import { type ComponentProps, useState } from 'react'
3
3
  import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import { CheckIcon, MinusIcon } from '../../internal/icons'
5
5
  import { focusRing, themedBorder, transition } from '../../utils/styles'
6
6
  import { tv } from '../../utils/tv'
7
7
  import { useFieldControl } from '../field/field-context'
8
8
 
9
- export const checkboxStyles = tv({
9
+ export const checkboxStyles = /* @__PURE__ */ tv({
10
10
  slots: {
11
11
  root: [
12
12
  'peer mt-0.5 inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-xs border-input bg-surface text-primary-foreground shadow-xs',
@@ -18,20 +18,35 @@ export const checkboxStyles = tv({
18
18
  'data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary',
19
19
  'disabled:cursor-not-allowed disabled:opacity-50',
20
20
  ],
21
- indicator: 'flex items-center justify-center [&>svg]:size-3.5 [&>svg]:stroke-[3]',
21
+ indicator: [
22
+ 'flex items-center justify-center [&>svg]:size-3.5 [&>svg]:stroke-[3]',
23
+ // Draws the tick when the user checks it (not for boxes already checked on load).
24
+ '[--glyph-draw-length:24] data-[animate]:[&_path]:animate-draw',
25
+ ],
22
26
  },
23
27
  })
24
28
 
25
29
  export function Checkbox(inProps: ComponentProps<typeof CheckboxPrimitive.Root>) {
26
- const [{ className, ...rest }, slots] = useComponentConfig('Checkbox', useFieldControl(inProps))
30
+ const [{ className, onCheckedChange, ...rest }, slots] = useComponentConfig(
31
+ 'Checkbox',
32
+ useFieldControl(inProps),
33
+ )
27
34
  const s = checkboxStyles()
35
+ const [changed, setChanged] = useState(false)
28
36
  return (
29
37
  <CheckboxPrimitive.Root
30
38
  data-slot="checkbox"
31
39
  className={s.root({ class: [slots.root, className] })}
40
+ onCheckedChange={(checked) => {
41
+ setChanged(true)
42
+ onCheckedChange?.(checked)
43
+ }}
32
44
  {...rest}
33
45
  >
34
- <CheckboxPrimitive.Indicator className={s.indicator({ class: slots.indicator })}>
46
+ <CheckboxPrimitive.Indicator
47
+ data-animate={changed || undefined}
48
+ className={s.indicator({ class: slots.indicator })}
49
+ >
35
50
  {rest.checked === 'indeterminate' ? <MinusIcon /> : <CheckIcon />}
36
51
  </CheckboxPrimitive.Indicator>
37
52
  </CheckboxPrimitive.Root>
@@ -2,13 +2,13 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { themedBorder } from '../../utils/styles'
3
3
  import { tv, type VariantProps } from '../../utils/tv'
4
4
 
5
- export const codeStyles = tv({
5
+ export const codeStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  base: 'rounded-xs bg-muted px-[0.3em] py-[0.15em] font-mono text-[0.875em] text-foreground',
8
8
  },
9
9
  })
10
10
 
11
- export const codeBlockStyles = tv({
11
+ export const codeBlockStyles = /* @__PURE__ */ tv({
12
12
  slots: {
13
13
  root: ['relative min-w-0 overflow-hidden rounded-lg border-border bg-subtle', themedBorder],
14
14
  header:
@@ -4,7 +4,7 @@ import { useComponentConfig } from '../../hooks/use-component-config'
4
4
  import type { StylesEntry } from '../../utils/registry'
5
5
  import { tv } from '../../utils/tv'
6
6
 
7
- export const collapsibleStyles = tv({
7
+ export const collapsibleStyles = /* @__PURE__ */ tv({
8
8
  slots: {
9
9
  root: '',
10
10
  trigger: '',
@@ -3,7 +3,7 @@ import { popover } 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 comboboxStyles = tv({
6
+ export const comboboxStyles = /* @__PURE__ */ tv({
7
7
  slots: {
8
8
  trigger: [
9
9
  ...fieldControl,
@@ -15,7 +15,10 @@ export const comboboxStyles = tv({
15
15
  placeholder: 'truncate text-faint-foreground',
16
16
  chip: 'inline-flex h-5.5 max-w-40 shrink-0 items-center truncate rounded-pill bg-muted px-2 text-caption text-foreground',
17
17
  icon: 'size-4 shrink-0 text-faint-foreground',
18
- content: [popover, 'w-(--radix-popover-trigger-width) min-w-56 p-0'],
18
+ content: [
19
+ popover,
20
+ 'origin-(--radix-popover-content-transform-origin) w-(--radix-popover-trigger-width) min-w-56 p-0',
21
+ ],
19
22
  search:
20
23
  'flex items-center gap-2 border-b border-border px-3 text-faint-foreground [&>svg]:size-4 [&>svg]:shrink-0',
21
24
  input:
@@ -1,12 +1,14 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
- import { themedBorder } from '../../utils/styles'
2
+ import { overlayMotion, themedBorder } from '../../utils/styles'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const commandMenuStyles = tv({
5
+ export const commandMenuStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
- overlay: 'fixed inset-0 z-50 animate-fade-in bg-overlay',
7
+ overlay: ['fixed inset-0 z-50 bg-overlay', overlayMotion],
8
8
  content: [
9
- 'fixed top-[12vh] left-1/2 z-50 w-[calc(100%-2rem)] max-w-xl -translate-x-1/2 overflow-hidden rounded-xl border-border bg-raised text-foreground shadow-lg outline-none animate-pop-in',
9
+ 'fixed top-[12vh] left-1/2 z-50 w-[calc(100%-2rem)] max-w-xl -translate-x-1/2 overflow-hidden rounded-xl border-border bg-raised text-foreground shadow-lg outline-none',
10
+ // Anchored near the top, so it grows down from its top edge.
11
+ 'origin-top animate-pop-in data-[state=closed]:animate-pop-out',
10
12
  themedBorder,
11
13
  ],
12
14
  root: 'flex w-full flex-col overflow-hidden bg-raised text-foreground',
@@ -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 containerStyles = tv({
5
+ export const containerStyles = /* @__PURE__ */ tv({
6
6
  base: 'mx-auto w-full px-4 sm:px-6',
7
7
  variants: {
8
8
  size: {
@@ -3,10 +3,12 @@ import { tv, type VariantProps } from '../../utils/tv'
3
3
  import { dropdownMenuStyles } from '../dropdown-menu/dropdown-menu.styles'
4
4
 
5
5
  /** Same look as DropdownMenu; only the available-height variable differs. */
6
- export const contextMenuStyles = tv({
6
+ export const contextMenuStyles = /* @__PURE__ */ tv({
7
7
  extend: dropdownMenuStyles,
8
8
  slots: {
9
- content: 'max-h-(--radix-context-menu-content-available-height)',
9
+ content:
10
+ 'origin-(--radix-context-menu-content-transform-origin) max-h-(--radix-context-menu-content-available-height)',
11
+ subContent: 'origin-(--radix-context-menu-content-transform-origin)',
10
12
  },
11
13
  })
12
14
 
@@ -4,7 +4,7 @@ import type { StylesEntry } from '../../utils/registry'
4
4
  import { tv } from '../../utils/tv'
5
5
  import { Button, type ButtonProps } from '../button'
6
6
 
7
- export const copyButtonStyles = tv({
7
+ export const copyButtonStyles = /* @__PURE__ */ tv({
8
8
  slots: {
9
9
  base: '',
10
10
  icon: 'size-4',
@@ -3,7 +3,7 @@ import { popover } 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 datePickerStyles = tv({
6
+ export const datePickerStyles = /* @__PURE__ */ tv({
7
7
  slots: {
8
8
  trigger: [
9
9
  ...fieldControl,
@@ -16,7 +16,7 @@ export const datePickerStyles = tv({
16
16
  placeholder: 'min-w-0 flex-1 truncate text-faint-foreground',
17
17
  clear:
18
18
  'inline-flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-xs text-faint-foreground hover:bg-muted hover:text-foreground [&>svg]:size-3.5',
19
- content: [popover, 'w-auto p-0'],
19
+ content: [popover, 'origin-(--radix-popover-content-transform-origin) w-auto p-0'],
20
20
  layout: 'flex flex-col sm:flex-row',
21
21
  presets:
22
22
  'flex gap-1 overflow-x-auto border-b border-border p-2 sm:w-40 sm:flex-col sm:overflow-visible sm:border-r sm:border-b-0',
@@ -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 descriptionListStyles = tv({
4
+ export const descriptionListStyles = /* @__PURE__ */ tv({
5
5
  slots: {
6
6
  root: 'grid w-full',
7
7
  item: 'grid min-w-0 gap-1',
@@ -1,13 +1,20 @@
1
1
  import type { StylesEntry } from '../../utils/registry'
2
- import { focusRing, themedBorder, transition } from '../../utils/styles'
2
+ import {
3
+ dialogMotion,
4
+ focusRing,
5
+ overlayMotion,
6
+ themedBorder,
7
+ transition,
8
+ } from '../../utils/styles'
3
9
  import { tv, type VariantProps } from '../../utils/tv'
4
10
 
5
- export const dialogStyles = tv({
11
+ export const dialogStyles = /* @__PURE__ */ tv({
6
12
  slots: {
7
- overlay: 'fixed inset-0 z-50 animate-fade-in bg-overlay',
13
+ overlay: ['fixed inset-0 z-50 bg-overlay', overlayMotion],
8
14
  content: [
9
15
  'fixed top-1/2 left-1/2 z-50 grid max-h-[calc(100dvh-2rem)] w-[calc(100vw-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 overflow-y-auto',
10
- 'rounded-xl border-border bg-surface p-6 text-foreground shadow-lg outline-none animate-pop-in',
16
+ 'rounded-xl border-border bg-surface p-6 text-foreground shadow-lg outline-none',
17
+ dialogMotion,
11
18
  themedBorder,
12
19
  ],
13
20
  close: [
@@ -8,11 +8,11 @@ const item = [
8
8
  '[&_svg]:size-4 [&_svg]:shrink-0',
9
9
  ]
10
10
 
11
- export const dropdownMenuStyles = tv({
11
+ export const dropdownMenuStyles = /* @__PURE__ */ tv({
12
12
  slots: {
13
13
  content: [
14
14
  popover,
15
- 'min-w-48 max-h-(--radix-dropdown-menu-content-available-height) overflow-y-auto p-1',
15
+ 'origin-(--radix-dropdown-menu-content-transform-origin) min-w-48 max-h-(--radix-dropdown-menu-content-available-height) overflow-y-auto p-1',
16
16
  ],
17
17
  item,
18
18
  icon: 'flex size-4 shrink-0 items-center justify-center text-muted-foreground',
@@ -21,14 +21,14 @@ export const dropdownMenuStyles = tv({
21
21
  separator: '-mx-1 my-1 h-px bg-border',
22
22
  shortcut: 'ml-auto pl-4 font-mono text-caption tracking-wider text-faint-foreground',
23
23
  subTrigger: [...item, 'data-[state=open]:bg-muted'],
24
- subContent: [popover, 'min-w-40 p-1'],
24
+ subContent: [popover, 'origin-(--radix-dropdown-menu-content-transform-origin) min-w-40 p-1'],
25
25
  },
26
26
  variants: {
27
27
  tone: {
28
28
  default: {},
29
29
  danger: {
30
- item: 'text-danger data-highlighted:bg-danger/10',
31
- icon: 'text-danger',
30
+ item: 'text-danger-text data-highlighted:bg-danger/10',
31
+ icon: 'text-danger-text',
32
32
  },
33
33
  },
34
34
  inset: { true: { item: 'pl-8', label: 'pl-8' } },
@@ -1,11 +1,11 @@
1
1
  import { tv, type VariantProps } from '../../utils/tv'
2
2
 
3
- export const eyebrowStyles = tv({
3
+ export const eyebrowStyles = /* @__PURE__ */ tv({
4
4
  slots: { base: 'font-mono text-caption uppercase tracking-[0.12em]' },
5
5
  variants: {
6
6
  tone: {
7
7
  muted: { base: 'text-muted-foreground' },
8
- primary: { base: 'text-primary' },
8
+ primary: { base: 'text-primary-text' },
9
9
  },
10
10
  },
11
11
  defaultVariants: { tone: 'muted' },
@@ -2,6 +2,8 @@ import { createContext, useContext } from 'react'
2
2
 
3
3
  export interface FieldContextValue {
4
4
  id: string
5
+ /** Id of the visible label, for controls labelled by reference (aria-labelledby). */
6
+ labelId: string | undefined
5
7
  descriptionId: string | undefined
6
8
  errorId: string | undefined
7
9
  invalid: boolean
@@ -1,13 +1,15 @@
1
1
  import { tv, type VariantProps } from '../../utils/tv'
2
2
 
3
- export const fieldStyles = tv({
3
+ export const fieldStyles = /* @__PURE__ */ tv({
4
4
  slots: {
5
5
  root: 'grid gap-1.5',
6
6
  label: '',
7
- required: 'text-danger',
7
+ labelRow: 'flex items-center justify-between gap-2',
8
+ labelAction: 'text-small',
9
+ required: 'text-danger-text',
8
10
  text: 'grid gap-0.5',
9
11
  description: 'text-small text-faint-foreground',
10
- error: 'text-small font-medium text-danger',
12
+ error: 'text-small font-medium text-danger-text',
11
13
  },
12
14
  variants: {
13
15
  orientation: {
@@ -6,6 +6,11 @@ import { FieldContext } from './field-context'
6
6
 
7
7
  export interface FieldProps extends Omit<ComponentProps<'div'>, 'children'>, FieldVariants {
8
8
  label?: ReactNode
9
+ /**
10
+ * Shown at the end of the label row, outside the label, so it is not part of the
11
+ * control's accessible name. For example a "Forgot password?" link.
12
+ */
13
+ labelAction?: ReactNode
9
14
  description?: ReactNode
10
15
  /** Error message. Marks the control invalid and is announced to screen readers. */
11
16
  error?: ReactNode
@@ -27,6 +32,7 @@ export function Field(inProps: FieldProps) {
27
32
  const [props, slots] = useComponentConfig('Field', inProps)
28
33
  const {
29
34
  label,
35
+ labelAction,
30
36
  description,
31
37
  error,
32
38
  required = false,
@@ -40,17 +46,18 @@ export function Field(inProps: FieldProps) {
40
46
  const generated = useId()
41
47
  const id = controlId ?? generated
42
48
  const invalid = Boolean(error)
49
+ const labelId = label ? `${id}-label` : undefined
43
50
  const descriptionId = description ? `${id}-description` : undefined
44
51
  const errorId = invalid ? `${id}-error` : undefined
45
52
  const s = fieldStyles({ orientation })
46
53
 
47
54
  const context = useMemo(
48
- () => ({ id, descriptionId, errorId, invalid, required, disabled }),
49
- [id, descriptionId, errorId, invalid, required, disabled],
55
+ () => ({ id, labelId, descriptionId, errorId, invalid, required, disabled }),
56
+ [id, labelId, descriptionId, errorId, invalid, required, disabled],
50
57
  )
51
58
 
52
- const labelNode = label ? (
53
- <Label htmlFor={id} className={s.label({ class: slots.label })}>
59
+ const labelElement = label ? (
60
+ <Label id={labelId} htmlFor={id} className={s.label({ class: slots.label })}>
54
61
  {label}
55
62
  {required && (
56
63
  <span className={s.required({ class: slots.required })} aria-hidden="true">
@@ -59,6 +66,20 @@ export function Field(inProps: FieldProps) {
59
66
  )}
60
67
  </Label>
61
68
  ) : null
69
+ const labelNode =
70
+ labelElement && labelAction ? (
71
+ <div data-slot="field-label-row" className={s.labelRow({ class: slots.labelRow })}>
72
+ {labelElement}
73
+ <span
74
+ data-slot="field-label-action"
75
+ className={s.labelAction({ class: slots.labelAction })}
76
+ >
77
+ {labelAction}
78
+ </span>
79
+ </div>
80
+ ) : (
81
+ labelElement
82
+ )
62
83
 
63
84
  const messages = (
64
85
  <>
@@ -2,7 +2,7 @@ import type { StylesEntry } from '../../utils/registry'
2
2
  import { focusRing, themedBorder, transition } from '../../utils/styles'
3
3
  import { tv } from '../../utils/tv'
4
4
 
5
- export const fileUploadStyles = tv({
5
+ export const fileUploadStyles = /* @__PURE__ */ tv({
6
6
  slots: {
7
7
  root: 'grid gap-3',
8
8
  dropzone: [
@@ -16,9 +16,9 @@ export const fileUploadStyles = tv({
16
16
  ],
17
17
  icon: 'flex size-10 items-center justify-center rounded-md border border-border bg-surface text-muted-foreground shadow-xs [&>svg]:size-5',
18
18
  title: 'text-small font-medium text-foreground',
19
- highlight: 'text-primary',
19
+ highlight: 'text-primary-text',
20
20
  hint: 'text-caption text-faint-foreground',
21
- rejections: 'grid gap-1 text-small font-medium text-danger',
21
+ rejections: 'grid gap-1 text-small font-medium text-danger-text',
22
22
  list: 'grid gap-2',
23
23
  item: [
24
24
  'grid grid-cols-[auto_1fr_auto] items-center gap-3 rounded-md border-border bg-surface px-3 py-2.5',
@@ -29,7 +29,7 @@ export const fileUploadStyles = tv({
29
29
  fileText: 'grid min-w-0 gap-1',
30
30
  fileName: 'truncate text-small font-medium text-foreground',
31
31
  fileMeta: 'text-caption tabular-nums text-faint-foreground',
32
- fileError: 'text-caption font-medium text-danger',
32
+ fileError: 'text-caption font-medium text-danger-text',
33
33
  progress: 'h-1 overflow-hidden rounded-pill bg-muted',
34
34
  progressBar:
35
35
  'h-full rounded-pill bg-primary transition-[width] duration-(--glyph-duration-base)',
@@ -1,6 +1,7 @@
1
1
  import { type DragEvent, type ReactNode, useId, useRef, useState } from 'react'
2
2
  import { useComponentConfig } from '../../hooks/use-component-config'
3
3
  import { useControllableState } from '../../hooks/use-controllable-state'
4
+ import { PresenceItem, PresenceList } from '../../motion/presence-list'
4
5
  import { IconButton } from '../button'
5
6
  import { useFieldControl } from '../field/field-context'
6
7
  import { fileUploadStyles } from './file-upload.styles'
@@ -287,55 +288,57 @@ export function FileUpload(inProps: FileUploadProps) {
287
288
 
288
289
  {files.length > 0 && (
289
290
  <ul className={s.list({ class: slots.list })} aria-label="Selected files">
290
- {files.map((item) => (
291
- <li
292
- key={item.id}
293
- data-slot="file-upload-item"
294
- className={s.item({ class: slots.item })}
295
- >
296
- <span className={s.fileIcon({ class: slots.fileIcon })}>
297
- <FileIcon />
298
- </span>
299
- <span className={s.fileText({ class: slots.fileText })}>
300
- <span className={s.fileName({ class: slots.fileName })}>{item.file.name}</span>
301
- {item.error ? (
302
- <span className={s.fileError({ class: slots.fileError })}>{item.error}</span>
303
- ) : (
304
- <span className={s.fileMeta({ class: slots.fileMeta })}>
305
- {formatBytes(item.file.size)}
306
- {item.progress !== undefined &&
307
- item.progress < 100 &&
308
- ` · ${Math.round(item.progress)}%`}
309
- </span>
310
- )}
311
- {item.progress !== undefined && item.progress < 100 && !item.error && (
312
- <span
313
- role="progressbar"
314
- aria-label={`Uploading ${item.file.name}`}
315
- aria-valuemin={0}
316
- aria-valuemax={100}
317
- aria-valuenow={Math.round(item.progress)}
318
- className={s.progress({ class: slots.progress })}
319
- >
291
+ <PresenceList>
292
+ {files.map((item) => (
293
+ <PresenceItem
294
+ key={item.id}
295
+ data-slot="file-upload-item"
296
+ className={s.item({ class: slots.item })}
297
+ >
298
+ <span className={s.fileIcon({ class: slots.fileIcon })}>
299
+ <FileIcon />
300
+ </span>
301
+ <span className={s.fileText({ class: slots.fileText })}>
302
+ <span className={s.fileName({ class: slots.fileName })}>{item.file.name}</span>
303
+ {item.error ? (
304
+ <span className={s.fileError({ class: slots.fileError })}>{item.error}</span>
305
+ ) : (
306
+ <span className={s.fileMeta({ class: slots.fileMeta })}>
307
+ {formatBytes(item.file.size)}
308
+ {item.progress !== undefined &&
309
+ item.progress < 100 &&
310
+ ` · ${Math.round(item.progress)}%`}
311
+ </span>
312
+ )}
313
+ {item.progress !== undefined && item.progress < 100 && !item.error && (
320
314
  <span
321
- className={s.progressBar({ class: slots.progressBar })}
322
- style={{ width: `${Math.max(0, Math.min(100, item.progress))}%` }}
323
- />
324
- </span>
325
- )}
326
- </span>
327
- <IconButton
328
- size="sm"
329
- icon={<XIcon />}
330
- aria-label={`Remove ${item.file.name}`}
331
- disabled={disabled}
332
- onClick={() => {
333
- setFiles(files.filter((f) => f.id !== item.id))
334
- setRejections([])
335
- }}
336
- />
337
- </li>
338
- ))}
315
+ role="progressbar"
316
+ aria-label={`Uploading ${item.file.name}`}
317
+ aria-valuemin={0}
318
+ aria-valuemax={100}
319
+ aria-valuenow={Math.round(item.progress)}
320
+ className={s.progress({ class: slots.progress })}
321
+ >
322
+ <span
323
+ className={s.progressBar({ class: slots.progressBar })}
324
+ style={{ width: `${Math.max(0, Math.min(100, item.progress))}%` }}
325
+ />
326
+ </span>
327
+ )}
328
+ </span>
329
+ <IconButton
330
+ size="sm"
331
+ icon={<XIcon />}
332
+ aria-label={`Remove ${item.file.name}`}
333
+ disabled={disabled}
334
+ onClick={() => {
335
+ setFiles(files.filter((f) => f.id !== item.id))
336
+ setRejections([])
337
+ }}
338
+ />
339
+ </PresenceItem>
340
+ ))}
341
+ </PresenceList>
339
342
  </ul>
340
343
  )}
341
344
  </div>
@@ -90,7 +90,7 @@ function colsToClasses(cols: GridCols): string {
90
90
  .join(' ')
91
91
  }
92
92
 
93
- export const gridStyles = tv({
93
+ export const gridStyles = /* @__PURE__ */ tv({
94
94
  slots: { base: 'grid' },
95
95
  variants: {
96
96
  gap: {