@glyphui/ui 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/README.md +9 -6
  2. package/dist/chart.d.ts +14 -202
  3. package/dist/chart.js +14 -465
  4. package/dist/components/accordion/accordion.d.ts +15 -0
  5. package/dist/components/accordion/accordion.js +69 -0
  6. package/dist/components/accordion/accordion.styles.d.ts +65 -0
  7. package/dist/components/accordion/accordion.styles.js +30 -0
  8. package/dist/components/accordion/index.d.ts +3 -0
  9. package/dist/components/alert/alert-icons.js +62 -0
  10. package/dist/components/alert/alert.d.ts +19 -0
  11. package/dist/components/alert/alert.js +64 -0
  12. package/dist/components/alert/alert.styles.d.ts +107 -0
  13. package/dist/components/alert/alert.styles.js +86 -0
  14. package/dist/components/alert/index.d.ts +3 -0
  15. package/dist/components/alert-dialog/alert-dialog.d.ts +29 -0
  16. package/dist/components/alert-dialog/alert-dialog.js +89 -0
  17. package/dist/components/alert-dialog/alert-dialog.styles.d.ts +63 -0
  18. package/dist/components/alert-dialog/alert-dialog.styles.js +19 -0
  19. package/dist/components/alert-dialog/confirm-dialog.js +22 -0
  20. package/dist/components/alert-dialog/confirm.d.ts +30 -0
  21. package/dist/components/alert-dialog/confirm.js +62 -0
  22. package/dist/components/alert-dialog/index.d.ts +4 -0
  23. package/dist/components/aspect-ratio/aspect-ratio.d.ts +55 -0
  24. package/dist/components/aspect-ratio/aspect-ratio.js +28 -0
  25. package/dist/components/aspect-ratio/index.d.ts +2 -0
  26. package/dist/components/avatar/avatar.d.ts +13 -0
  27. package/dist/components/avatar/avatar.js +50 -0
  28. package/dist/components/avatar/avatar.styles.d.ts +77 -0
  29. package/dist/components/avatar/avatar.styles.js +32 -0
  30. package/dist/components/avatar/index.d.ts +3 -0
  31. package/dist/components/badge/badge.d.ts +10 -0
  32. package/dist/components/badge/badge.js +28 -0
  33. package/dist/components/badge/badge.styles.d.ts +62 -0
  34. package/dist/components/badge/badge.styles.js +72 -0
  35. package/dist/components/badge/index.d.ts +3 -0
  36. package/dist/components/banner/banner.d.ts +17 -0
  37. package/dist/components/banner/banner.js +71 -0
  38. package/dist/components/banner/banner.styles.d.ts +98 -0
  39. package/dist/components/banner/banner.styles.js +27 -0
  40. package/dist/components/banner/index.d.ts +3 -0
  41. package/dist/components/blockquote/blockquote.d.ts +72 -0
  42. package/dist/components/blockquote/blockquote.js +47 -0
  43. package/dist/components/blockquote/index.d.ts +2 -0
  44. package/dist/components/breadcrumb/breadcrumb.d.ts +28 -0
  45. package/dist/components/breadcrumb/breadcrumb.js +85 -0
  46. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +63 -0
  47. package/dist/components/breadcrumb/breadcrumb.styles.js +18 -0
  48. package/dist/components/breadcrumb/index.d.ts +3 -0
  49. package/dist/components/button/button.d.ts +20 -0
  50. package/dist/components/button/button.js +52 -0
  51. package/dist/components/button/button.styles.d.ts +146 -0
  52. package/dist/components/button/button.styles.js +64 -0
  53. package/dist/components/button/index.d.ts +3 -0
  54. package/dist/components/calendar/calendar.d.ts +9 -0
  55. package/dist/components/calendar/calendar.js +75 -0
  56. package/dist/components/calendar/calendar.styles.d.ts +171 -0
  57. package/dist/components/calendar/calendar.styles.js +42 -0
  58. package/dist/components/calendar/index.d.ts +4 -0
  59. package/dist/components/card/card.d.ts +17 -0
  60. package/dist/components/card/card.js +79 -0
  61. package/dist/components/card/card.styles.d.ts +113 -0
  62. package/dist/components/card/card.styles.js +38 -0
  63. package/dist/components/card/index.d.ts +3 -0
  64. package/dist/components/carousel/carousel.d.ts +37 -0
  65. package/dist/components/carousel/carousel.js +190 -0
  66. package/dist/components/carousel/carousel.styles.d.ts +74 -0
  67. package/dist/components/carousel/carousel.styles.js +35 -0
  68. package/dist/components/carousel/index.d.ts +3 -0
  69. package/dist/components/checkbox/checkbox.d.ts +37 -0
  70. package/dist/components/checkbox/checkbox.js +44 -0
  71. package/dist/components/checkbox/index.d.ts +2 -0
  72. package/dist/components/code/code.d.ts +18 -0
  73. package/dist/components/code/code.js +75 -0
  74. package/dist/components/code/code.styles.d.ts +76 -0
  75. package/dist/components/code/code.styles.js +18 -0
  76. package/dist/components/code/index.d.ts +3 -0
  77. package/dist/components/collapsible/collapsible.d.ts +56 -0
  78. package/dist/components/collapsible/collapsible.js +43 -0
  79. package/dist/components/collapsible/index.d.ts +2 -0
  80. package/dist/components/combobox/combobox.d.ts +50 -0
  81. package/dist/components/combobox/combobox.js +141 -0
  82. package/dist/components/combobox/combobox.styles.d.ts +110 -0
  83. package/dist/components/combobox/combobox.styles.js +42 -0
  84. package/dist/components/combobox/index.d.ts +3 -0
  85. package/dist/components/command-menu/command-menu.d.ts +40 -0
  86. package/dist/components/command-menu/command-menu.js +148 -0
  87. package/dist/components/command-menu/command-menu.styles.d.ts +105 -0
  88. package/dist/components/command-menu/command-menu.styles.js +30 -0
  89. package/dist/components/command-menu/index.d.ts +3 -0
  90. package/dist/components/container/container.d.ts +34 -0
  91. package/dist/components/container/container.js +30 -0
  92. package/dist/components/container/index.d.ts +2 -0
  93. package/dist/components/context-menu/context-menu.d.ts +34 -0
  94. package/dist/components/context-menu/context-menu.js +157 -0
  95. package/dist/components/context-menu/context-menu.styles.d.ts +135 -0
  96. package/dist/components/context-menu/context-menu.styles.js +14 -0
  97. package/dist/components/context-menu/index.d.ts +3 -0
  98. package/dist/components/copy-button/copy-button.d.ts +61 -0
  99. package/dist/components/copy-button/copy-button.js +79 -0
  100. package/dist/components/copy-button/index.d.ts +2 -0
  101. package/dist/components/date-picker/date-picker.d.ts +51 -0
  102. package/dist/components/date-picker/date-picker.js +235 -0
  103. package/dist/components/date-picker/date-picker.styles.d.ts +77 -0
  104. package/dist/components/date-picker/date-picker.styles.js +31 -0
  105. package/dist/components/date-picker/index.d.ts +3 -0
  106. package/dist/components/description-list/description-list.d.ts +15 -0
  107. package/dist/components/description-list/description-list.js +51 -0
  108. package/dist/components/description-list/description-list.styles.d.ts +74 -0
  109. package/dist/components/description-list/description-list.styles.js +35 -0
  110. package/dist/components/description-list/index.d.ts +3 -0
  111. package/dist/components/dialog/close-icon.js +22 -0
  112. package/dist/components/dialog/dialog.d.ts +21 -0
  113. package/dist/components/dialog/dialog.js +79 -0
  114. package/dist/components/dialog/dialog.styles.d.ts +83 -0
  115. package/dist/components/dialog/dialog.styles.js +34 -0
  116. package/dist/components/dialog/index.d.ts +3 -0
  117. package/dist/components/dropdown-menu/dropdown-menu.d.ts +34 -0
  118. package/dist/components/dropdown-menu/dropdown-menu.js +160 -0
  119. package/dist/components/dropdown-menu/dropdown-menu.styles.d.ts +83 -0
  120. package/dist/components/dropdown-menu/dropdown-menu.styles.js +38 -0
  121. package/dist/components/dropdown-menu/index.d.ts +3 -0
  122. package/dist/components/eyebrow/eyebrow.d.ts +9 -0
  123. package/dist/components/eyebrow/eyebrow.js +20 -0
  124. package/dist/components/eyebrow/eyebrow.styles.d.ts +38 -0
  125. package/dist/components/eyebrow/eyebrow.styles.js +13 -0
  126. package/dist/components/eyebrow/index.d.ts +3 -0
  127. package/dist/components/field/field-context.d.ts +25 -0
  128. package/dist/components/field/field-context.js +27 -0
  129. package/dist/components/field/field.d.ts +28 -0
  130. package/dist/{field-CVbywksE.js → components/field/field.js} +6 -35
  131. package/dist/components/field/field.styles.d.ts +53 -0
  132. package/dist/components/field/field.styles.js +22 -0
  133. package/dist/components/field/index.d.ts +4 -0
  134. package/dist/components/file-upload/file-upload.d.ts +52 -0
  135. package/dist/components/file-upload/file-upload.js +266 -0
  136. package/dist/components/file-upload/file-upload.styles.d.ts +123 -0
  137. package/dist/components/file-upload/file-upload.styles.js +32 -0
  138. package/dist/components/file-upload/index.d.ts +3 -0
  139. package/dist/components/grid/grid.d.ts +168 -0
  140. package/dist/components/grid/grid.js +126 -0
  141. package/dist/components/grid/index.d.ts +2 -0
  142. package/dist/components/heading/heading.d.ts +12 -0
  143. package/dist/components/heading/heading.js +28 -0
  144. package/dist/components/heading/heading.styles.d.ts +65 -0
  145. package/dist/components/heading/heading.styles.js +15 -0
  146. package/dist/components/heading/index.d.ts +3 -0
  147. package/dist/components/hover-card/hover-card.d.ts +43 -0
  148. package/dist/components/hover-card/hover-card.js +27 -0
  149. package/dist/components/hover-card/index.d.ts +2 -0
  150. package/dist/components/input/index.d.ts +3 -0
  151. package/dist/components/input/input.d.ts +13 -0
  152. package/dist/components/input/input.js +33 -0
  153. package/dist/components/input/input.styles.d.ts +55 -0
  154. package/dist/components/input/input.styles.js +33 -0
  155. package/dist/components/input-otp/index.d.ts +4 -0
  156. package/dist/components/input-otp/index.js +5 -0
  157. package/dist/components/input-otp/input-otp.d.ts +23 -0
  158. package/dist/components/input-otp/input-otp.js +86 -0
  159. package/dist/components/input-otp/input-otp.styles.d.ts +71 -0
  160. package/dist/components/input-otp/input-otp.styles.js +30 -0
  161. package/dist/components/kbd/index.d.ts +2 -0
  162. package/dist/components/kbd/kbd.d.ts +30 -0
  163. package/dist/components/kbd/kbd.js +17 -0
  164. package/dist/components/label/index.d.ts +2 -0
  165. package/dist/components/label/label.d.ts +31 -0
  166. package/dist/components/label/label.js +17 -0
  167. package/dist/components/link/index.d.ts +3 -0
  168. package/dist/components/link/link.d.ts +14 -0
  169. package/dist/components/link/link.js +57 -0
  170. package/dist/components/link/link.styles.d.ts +89 -0
  171. package/dist/components/link/link.styles.js +33 -0
  172. package/dist/components/modal/index.d.ts +3 -0
  173. package/dist/components/modal/modal.d.ts +33 -0
  174. package/dist/components/modal/modal.js +56 -0
  175. package/dist/components/modal/modal.styles.d.ts +61 -0
  176. package/dist/components/modal/modal.styles.js +14 -0
  177. package/dist/components/navigation-menu/index.d.ts +3 -0
  178. package/dist/components/navigation-menu/navigation-menu.d.ts +37 -0
  179. package/dist/components/navigation-menu/navigation-menu.js +138 -0
  180. package/dist/components/navigation-menu/navigation-menu.styles.d.ts +111 -0
  181. package/dist/components/navigation-menu/navigation-menu.styles.js +39 -0
  182. package/dist/components/number-input/index.d.ts +3 -0
  183. package/dist/components/number-input/number-input.d.ts +30 -0
  184. package/dist/components/number-input/number-input.js +151 -0
  185. package/dist/components/number-input/number-input.styles.d.ts +68 -0
  186. package/dist/components/number-input/number-input.styles.js +35 -0
  187. package/dist/components/pagination/index.d.ts +4 -0
  188. package/dist/components/pagination/pagination-range.d.ts +11 -0
  189. package/dist/components/pagination/pagination-range.js +42 -0
  190. package/dist/components/pagination/pagination.d.ts +18 -0
  191. package/dist/components/pagination/pagination.js +94 -0
  192. package/dist/components/pagination/pagination.styles.d.ts +65 -0
  193. package/dist/components/pagination/pagination.styles.js +35 -0
  194. package/dist/components/password-input/index.d.ts +3 -0
  195. package/dist/components/password-input/password-input.d.ts +20 -0
  196. package/dist/components/password-input/password-input.js +106 -0
  197. package/dist/components/password-input/password-input.styles.d.ts +66 -0
  198. package/dist/components/password-input/password-input.styles.js +21 -0
  199. package/dist/components/popover/index.d.ts +2 -0
  200. package/dist/components/popover/popover.d.ts +52 -0
  201. package/dist/components/popover/popover.js +35 -0
  202. package/dist/components/progress/index.d.ts +3 -0
  203. package/dist/components/progress/progress.d.ts +29 -0
  204. package/dist/components/progress/progress.js +108 -0
  205. package/dist/components/progress/progress.styles.d.ts +236 -0
  206. package/dist/components/progress/progress.styles.js +69 -0
  207. package/dist/components/prose/index.d.ts +2 -0
  208. package/dist/components/prose/prose.d.ts +90 -0
  209. package/dist/components/prose/prose.js +67 -0
  210. package/dist/components/radio-group/index.d.ts +3 -0
  211. package/dist/components/radio-group/radio-group.d.ts +26 -0
  212. package/dist/components/radio-group/radio-group.js +102 -0
  213. package/dist/components/radio-group/radio-group.styles.d.ts +80 -0
  214. package/dist/components/radio-group/radio-group.styles.js +56 -0
  215. package/dist/components/resizable/index.d.ts +3 -0
  216. package/dist/components/resizable/resizable.d.ts +17 -0
  217. package/dist/components/resizable/resizable.js +81 -0
  218. package/dist/components/resizable/resizable.styles.d.ts +53 -0
  219. package/dist/components/resizable/resizable.styles.js +19 -0
  220. package/dist/components/scroll-area/index.d.ts +2 -0
  221. package/dist/components/scroll-area/scroll-area.d.ts +70 -0
  222. package/dist/components/scroll-area/scroll-area.js +70 -0
  223. package/dist/components/section/index.d.ts +2 -0
  224. package/dist/components/section/section.d.ts +52 -0
  225. package/dist/components/section/section.js +41 -0
  226. package/dist/components/segmented-control/index.d.ts +2 -0
  227. package/dist/components/segmented-control/segmented-control.d.ts +92 -0
  228. package/dist/components/segmented-control/segmented-control.js +86 -0
  229. package/dist/components/select/index.d.ts +2 -0
  230. package/dist/components/select/select.d.ts +85 -0
  231. package/dist/components/select/select.js +81 -0
  232. package/dist/components/separator/index.d.ts +2 -0
  233. package/dist/components/separator/separator.d.ts +40 -0
  234. package/dist/components/separator/separator.js +27 -0
  235. package/dist/components/sheet/index.d.ts +3 -0
  236. package/dist/components/sheet/sheet.d.ts +20 -0
  237. package/dist/components/sheet/sheet.js +83 -0
  238. package/dist/components/sheet/sheet.styles.d.ts +101 -0
  239. package/dist/components/sheet/sheet.styles.js +62 -0
  240. package/dist/components/skeleton/index.d.ts +2 -0
  241. package/dist/components/skeleton/skeleton.d.ts +30 -0
  242. package/dist/components/skeleton/skeleton.js +18 -0
  243. package/dist/components/slider/index.d.ts +3 -0
  244. package/dist/components/slider/slider.d.ts +38 -0
  245. package/dist/components/slider/slider.js +68 -0
  246. package/dist/components/slider/slider.styles.d.ts +56 -0
  247. package/dist/components/slider/slider.styles.js +23 -0
  248. package/dist/components/spinner/index.d.ts +3 -0
  249. package/dist/components/spinner/spinner.d.ts +9 -0
  250. package/dist/components/spinner/spinner.js +36 -0
  251. package/dist/components/spinner/spinner.styles.d.ts +53 -0
  252. package/dist/components/spinner/spinner.styles.js +18 -0
  253. package/dist/components/stack/index.d.ts +2 -0
  254. package/dist/components/stack/stack.d.ts +109 -0
  255. package/dist/components/stack/stack.js +62 -0
  256. package/dist/components/stat-card/index.d.ts +3 -0
  257. package/dist/components/stat-card/stat-card.d.ts +22 -0
  258. package/dist/components/stat-card/stat-card.js +82 -0
  259. package/dist/components/stat-card/stat-card.styles.d.ts +83 -0
  260. package/dist/components/stat-card/stat-card.styles.js +16 -0
  261. package/dist/components/stepper/index.d.ts +3 -0
  262. package/dist/components/stepper/stepper.d.ts +20 -0
  263. package/dist/components/stepper/stepper.js +100 -0
  264. package/dist/components/stepper/stepper.styles.d.ts +170 -0
  265. package/dist/components/stepper/stepper.styles.js +67 -0
  266. package/dist/components/switch/index.d.ts +2 -0
  267. package/dist/components/switch/switch.d.ts +51 -0
  268. package/dist/components/switch/switch.js +43 -0
  269. package/dist/components/table/index.d.ts +2 -0
  270. package/dist/components/table/table.d.ts +78 -0
  271. package/dist/components/table/table.js +82 -0
  272. package/dist/components/tabs/index.d.ts +2 -0
  273. package/dist/components/tabs/tabs.d.ts +73 -0
  274. package/dist/components/tabs/tabs.js +103 -0
  275. package/dist/components/tag-input/index.d.ts +3 -0
  276. package/dist/components/tag-input/tag-input.d.ts +30 -0
  277. package/dist/components/tag-input/tag-input.js +149 -0
  278. package/dist/components/tag-input/tag-input.styles.d.ts +71 -0
  279. package/dist/components/tag-input/tag-input.styles.js +29 -0
  280. package/dist/components/text/index.d.ts +3 -0
  281. package/dist/components/text/text.d.ts +9 -0
  282. package/dist/components/text/text.js +25 -0
  283. package/dist/components/text/text.styles.d.ts +188 -0
  284. package/dist/components/text/text.styles.js +36 -0
  285. package/dist/components/textarea/index.d.ts +2 -0
  286. package/dist/components/textarea/textarea.d.ts +29 -0
  287. package/dist/components/textarea/textarea.js +23 -0
  288. package/dist/components/timeline/index.d.ts +3 -0
  289. package/dist/components/timeline/timeline.d.ts +28 -0
  290. package/dist/components/timeline/timeline.js +61 -0
  291. package/dist/components/timeline/timeline.styles.d.ts +110 -0
  292. package/dist/components/timeline/timeline.styles.js +30 -0
  293. package/dist/components/toast/index.d.ts +2 -0
  294. package/dist/components/toast/toast.d.ts +119 -0
  295. package/dist/components/toast/toast.js +75 -0
  296. package/dist/components/toggle/index.d.ts +3 -0
  297. package/dist/components/toggle/toggle.d.ts +20 -0
  298. package/dist/components/toggle/toggle.js +58 -0
  299. package/dist/components/toggle/toggle.styles.d.ts +80 -0
  300. package/dist/components/toggle/toggle.styles.js +34 -0
  301. package/dist/components/tooltip/index.d.ts +2 -0
  302. package/dist/components/tooltip/tooltip.d.ts +39 -0
  303. package/dist/components/tooltip/tooltip.js +29 -0
  304. package/dist/components/tree-view/index.d.ts +3 -0
  305. package/dist/components/tree-view/tree-view.d.ts +31 -0
  306. package/dist/components/tree-view/tree-view.js +192 -0
  307. package/dist/components/tree-view/tree-view.styles.d.ts +59 -0
  308. package/dist/components/tree-view/tree-view.styles.js +32 -0
  309. package/dist/components/visually-hidden/index.d.ts +2 -0
  310. package/dist/components/visually-hidden/visually-hidden.d.ts +10 -0
  311. package/dist/components/visually-hidden/visually-hidden.js +16 -0
  312. package/dist/data-table.d.ts +3 -110
  313. package/dist/data-table.js +2 -224
  314. package/dist/form.d.ts +2 -86
  315. package/dist/form.js +1 -108
  316. package/dist/hooks/index.d.ts +5 -0
  317. package/dist/hooks/use-component-config.d.ts +13 -0
  318. package/dist/hooks/use-component-config.js +22 -0
  319. package/dist/hooks/use-controllable-state.d.ts +9 -0
  320. package/dist/hooks/use-controllable-state.js +18 -0
  321. package/dist/hooks/use-media-query.d.ts +4 -0
  322. package/dist/hooks/use-media-query.js +13 -0
  323. package/dist/hooks/use-scrolled.d.ts +4 -0
  324. package/dist/hooks/use-scrolled.js +17 -0
  325. package/dist/index.d.ts +223 -6856
  326. package/dist/index.js +148 -6791
  327. package/dist/internal/dev.js +12 -0
  328. package/dist/internal/icons.js +91 -0
  329. package/dist/motion/active-indicator.d.ts +12 -0
  330. package/dist/motion/active-indicator.js +26 -0
  331. package/dist/motion/animated-number.d.ts +21 -0
  332. package/dist/motion/animated-number.js +88 -0
  333. package/dist/motion/features.js +10 -0
  334. package/dist/motion/index.d.ts +10 -0
  335. package/dist/motion/index.js +10 -0
  336. package/dist/motion/motion-root.js +48 -0
  337. package/dist/motion/page-transition.d.ts +16 -0
  338. package/dist/motion/page-transition.js +23 -0
  339. package/dist/motion/presence-list.js +46 -0
  340. package/dist/motion/presence.d.ts +11 -0
  341. package/dist/motion/presence.js +17 -0
  342. package/dist/motion/reveal.d.ts +18 -0
  343. package/dist/motion/reveal.js +37 -0
  344. package/dist/motion/stagger.d.ts +29 -0
  345. package/dist/motion/stagger.js +52 -0
  346. package/dist/motion/use-motion-settings.d.ts +25 -0
  347. package/dist/motion/use-motion-settings.js +47 -0
  348. package/dist/motion/use-reveal.d.ts +11 -0
  349. package/dist/motion/use-reveal.js +41 -0
  350. package/dist/patterns/app-shell/app-shell-context.d.ts +14 -0
  351. package/dist/patterns/app-shell/app-shell-context.js +16 -0
  352. package/dist/patterns/app-shell/app-shell.d.ts +21 -0
  353. package/dist/patterns/app-shell/app-shell.js +82 -0
  354. package/dist/patterns/app-shell/app-shell.styles.d.ts +302 -0
  355. package/dist/patterns/app-shell/app-shell.styles.js +106 -0
  356. package/dist/patterns/app-shell/index.d.ts +7 -0
  357. package/dist/patterns/app-shell/navbar.d.ts +29 -0
  358. package/dist/patterns/app-shell/navbar.js +116 -0
  359. package/dist/patterns/app-shell/page-header.d.ts +12 -0
  360. package/dist/patterns/app-shell/page-header.js +38 -0
  361. package/dist/patterns/app-shell/sidebar.d.ts +31 -0
  362. package/dist/patterns/app-shell/sidebar.js +141 -0
  363. package/dist/patterns/async/async.d.ts +40 -0
  364. package/dist/patterns/async/async.js +61 -0
  365. package/dist/patterns/async/index.d.ts +3 -0
  366. package/dist/patterns/async/states.d.ts +68 -0
  367. package/dist/patterns/async/states.js +116 -0
  368. package/dist/patterns/chart/cartesian.d.ts +128 -0
  369. package/dist/patterns/chart/cartesian.js +552 -0
  370. package/dist/patterns/chart/chart-card.d.ts +39 -0
  371. package/dist/patterns/chart/chart-card.js +103 -0
  372. package/dist/patterns/chart/chart-parts.d.ts +53 -0
  373. package/dist/patterns/chart/chart-parts.js +282 -0
  374. package/dist/patterns/chart/chart.styles.d.ts +200 -0
  375. package/dist/patterns/chart/chart.styles.js +43 -0
  376. package/dist/patterns/chart/export.d.ts +45 -0
  377. package/dist/patterns/chart/export.js +293 -0
  378. package/dist/patterns/chart/funnel.d.ts +23 -0
  379. package/dist/patterns/chart/funnel.js +129 -0
  380. package/dist/patterns/chart/heatmap.d.ts +37 -0
  381. package/dist/patterns/chart/heatmap.js +258 -0
  382. package/dist/patterns/chart/icons.js +39 -0
  383. package/dist/patterns/chart/pie.d.ts +36 -0
  384. package/dist/patterns/chart/pie.js +120 -0
  385. package/dist/patterns/chart/radial.d.ts +75 -0
  386. package/dist/patterns/chart/radial.js +282 -0
  387. package/dist/patterns/chart/sankey.d.ts +29 -0
  388. package/dist/patterns/chart/sankey.js +136 -0
  389. package/dist/patterns/chart/scatter.d.ts +42 -0
  390. package/dist/patterns/chart/scatter.js +203 -0
  391. package/dist/patterns/chart/sparkline.d.ts +20 -0
  392. package/dist/patterns/chart/sparkline.js +102 -0
  393. package/dist/patterns/chart/treemap.d.ts +25 -0
  394. package/dist/patterns/chart/treemap.js +128 -0
  395. package/dist/patterns/chart/use-element-width.js +23 -0
  396. package/dist/patterns/data-table/data-table.d.ts +109 -0
  397. package/dist/patterns/data-table/data-table.js +233 -0
  398. package/dist/patterns/form/form.d.ts +89 -0
  399. package/dist/patterns/form/form.js +111 -0
  400. package/dist/{color-mode-script-KdwItKN2.d.ts → provider/color-mode-script.d.ts} +4 -5
  401. package/dist/{color-mode-script-Bf7LYkOj.js → provider/color-mode-script.js} +1 -1
  402. package/dist/provider/color-mode.d.ts +24 -0
  403. package/dist/provider/color-mode.js +87 -0
  404. package/dist/{glyph-context-DxGJrdvr.d.ts → provider/glyph-context.d.ts} +13 -12
  405. package/dist/provider/glyph-context.js +28 -0
  406. package/dist/provider/glyph-provider.d.ts +37 -0
  407. package/dist/provider/glyph-provider.js +48 -0
  408. package/dist/provider/index.d.ts +6 -0
  409. package/dist/provider/theme-scope.d.ts +12 -0
  410. package/dist/provider/theme-scope.js +42 -0
  411. package/dist/provider/theme-style.js +15 -0
  412. package/dist/react-router.d.ts +1 -1
  413. package/dist/register.d.ts +57 -0
  414. package/dist/themes.d.ts +22 -0
  415. package/dist/themes.js +49 -0
  416. package/dist/utils/cn.d.ts +6 -0
  417. package/dist/utils/cn.js +12 -0
  418. package/dist/utils/compose-refs.js +11 -0
  419. package/dist/{registry-BGSJoiLq.d.ts → utils/registry.d.ts} +2 -3
  420. package/dist/utils/styles.js +20 -0
  421. package/dist/{tv-DuMh7UH2.d.ts → utils/tv.d.ts} +2 -2
  422. package/dist/utils/tv.js +8 -0
  423. package/dist/utils/tw-merge-config.js +13 -0
  424. package/dist/vite.d.ts +1 -1
  425. package/dist/vite.js +1 -1
  426. package/package.json +3 -2
  427. package/src/components/accordion/accordion.styles.ts +1 -1
  428. package/src/components/alert/alert.styles.ts +1 -1
  429. package/src/components/alert-dialog/alert-dialog.styles.ts +5 -4
  430. package/src/components/alert-dialog/confirm-dialog.tsx +42 -0
  431. package/src/components/alert-dialog/confirm.tsx +12 -31
  432. package/src/components/aspect-ratio/aspect-ratio.tsx +1 -1
  433. package/src/components/avatar/avatar.styles.ts +1 -1
  434. package/src/components/badge/badge.styles.ts +1 -1
  435. package/src/components/banner/banner.styles.ts +1 -1
  436. package/src/components/blockquote/blockquote.tsx +1 -1
  437. package/src/components/breadcrumb/breadcrumb.styles.ts +1 -1
  438. package/src/components/button/button.styles.ts +4 -2
  439. package/src/components/calendar/calendar.styles.ts +1 -1
  440. package/src/components/card/card.styles.ts +1 -1
  441. package/src/components/carousel/carousel.styles.ts +1 -1
  442. package/src/components/checkbox/checkbox.tsx +20 -5
  443. package/src/components/code/code.styles.ts +2 -2
  444. package/src/components/collapsible/collapsible.tsx +1 -1
  445. package/src/components/combobox/combobox.styles.ts +5 -2
  446. package/src/components/command-menu/command-menu.styles.ts +6 -4
  447. package/src/components/container/container.tsx +1 -1
  448. package/src/components/context-menu/context-menu.styles.ts +4 -2
  449. package/src/components/copy-button/copy-button.tsx +1 -1
  450. package/src/components/date-picker/date-picker.styles.ts +2 -2
  451. package/src/components/description-list/description-list.styles.ts +1 -1
  452. package/src/components/dialog/dialog.styles.ts +11 -4
  453. package/src/components/dropdown-menu/dropdown-menu.styles.ts +3 -3
  454. package/src/components/eyebrow/eyebrow.styles.ts +1 -1
  455. package/src/components/field/field.styles.ts +1 -1
  456. package/src/components/file-upload/file-upload.styles.ts +1 -1
  457. package/src/components/file-upload/file-upload.tsx +51 -48
  458. package/src/components/grid/grid.tsx +1 -1
  459. package/src/components/heading/heading.styles.ts +1 -1
  460. package/src/components/hover-card/hover-card.tsx +5 -2
  461. package/src/components/input/input.styles.ts +1 -1
  462. package/src/components/input-otp/input-otp.styles.ts +1 -1
  463. package/src/components/kbd/kbd.tsx +1 -1
  464. package/src/components/label/label.tsx +1 -1
  465. package/src/components/link/link.styles.ts +1 -1
  466. package/src/components/modal/modal.styles.ts +1 -1
  467. package/src/components/navigation-menu/navigation-menu.styles.ts +2 -2
  468. package/src/components/number-input/number-input.styles.ts +1 -1
  469. package/src/components/pagination/pagination.styles.ts +6 -4
  470. package/src/components/pagination/pagination.tsx +14 -1
  471. package/src/components/password-input/password-input.styles.ts +1 -1
  472. package/src/components/popover/popover.tsx +1 -1
  473. package/src/components/progress/progress.styles.ts +2 -2
  474. package/src/components/prose/prose.tsx +1 -1
  475. package/src/components/radio-group/radio-group.styles.ts +1 -1
  476. package/src/components/resizable/resizable.styles.ts +1 -1
  477. package/src/components/scroll-area/scroll-area.tsx +1 -1
  478. package/src/components/section/section.tsx +1 -1
  479. package/src/components/segmented-control/segmented-control.tsx +24 -8
  480. package/src/components/select/select.tsx +2 -2
  481. package/src/components/separator/separator.tsx +1 -1
  482. package/src/components/sheet/sheet.styles.ts +1 -1
  483. package/src/components/skeleton/skeleton.tsx +1 -1
  484. package/src/components/slider/slider.styles.ts +1 -1
  485. package/src/components/spinner/spinner.styles.ts +1 -1
  486. package/src/components/stack/stack.tsx +1 -1
  487. package/src/components/stat-card/stat-card.styles.ts +1 -1
  488. package/src/components/stepper/stepper.styles.ts +1 -1
  489. package/src/components/switch/switch.tsx +2 -2
  490. package/src/components/table/table.tsx +1 -1
  491. package/src/components/tabs/tabs.tsx +46 -15
  492. package/src/components/tag-input/tag-input.styles.ts +1 -1
  493. package/src/components/tag-input/tag-input.tsx +27 -18
  494. package/src/components/text/text.styles.ts +1 -1
  495. package/src/components/textarea/textarea.tsx +1 -1
  496. package/src/components/timeline/timeline.styles.ts +1 -1
  497. package/src/components/toast/toast.tsx +1 -1
  498. package/src/components/toggle/toggle.styles.ts +1 -1
  499. package/src/components/tooltip/tooltip.tsx +6 -3
  500. package/src/components/tree-view/tree-view.styles.ts +1 -1
  501. package/src/index.ts +3 -0
  502. package/src/motion/active-indicator.tsx +26 -0
  503. package/src/motion/animated-number.tsx +113 -0
  504. package/src/motion/features.ts +7 -0
  505. package/src/motion/index.ts +9 -0
  506. package/src/motion/motion-root.tsx +46 -0
  507. package/src/motion/page-transition.tsx +30 -0
  508. package/src/motion/presence-list.tsx +42 -0
  509. package/src/motion/presence.tsx +13 -0
  510. package/src/motion/reveal.tsx +50 -0
  511. package/src/motion/stagger.tsx +81 -0
  512. package/src/motion/use-motion-settings.ts +52 -0
  513. package/src/motion/use-reveal.ts +54 -0
  514. package/src/patterns/app-shell/app-shell.styles.ts +18 -11
  515. package/src/patterns/app-shell/sidebar.tsx +28 -7
  516. package/src/patterns/async/states.tsx +1 -1
  517. package/src/patterns/chart/cartesian.tsx +755 -0
  518. package/src/patterns/chart/chart-card.tsx +148 -0
  519. package/src/patterns/chart/chart-parts.tsx +323 -58
  520. package/src/patterns/chart/chart.styles.ts +29 -3
  521. package/src/patterns/chart/export.ts +334 -0
  522. package/src/patterns/chart/funnel.tsx +171 -0
  523. package/src/patterns/chart/heatmap.tsx +339 -0
  524. package/src/patterns/chart/icons.tsx +44 -0
  525. package/src/patterns/chart/index.ts +52 -7
  526. package/src/patterns/chart/pie.tsx +169 -0
  527. package/src/patterns/chart/radial.tsx +361 -0
  528. package/src/patterns/chart/sankey.tsx +197 -0
  529. package/src/patterns/chart/scatter.tsx +254 -0
  530. package/src/patterns/chart/sparkline.tsx +111 -0
  531. package/src/patterns/chart/test-utils.tsx +35 -0
  532. package/src/patterns/chart/treemap.tsx +198 -0
  533. package/src/patterns/chart/use-element-width.ts +20 -0
  534. package/src/patterns/data-table/data-table.tsx +1 -1
  535. package/src/patterns/form/form.tsx +1 -1
  536. package/src/provider/glyph-context.ts +3 -1
  537. package/src/provider/glyph-provider.tsx +31 -12
  538. package/src/provider/theme-scope.tsx +14 -9
  539. package/src/themes.ts +3 -3
  540. package/src/utils/styles.ts +17 -3
  541. package/styles.css +122 -3
  542. package/dist/field-context-7I-cWvvS.js +0 -267
  543. package/dist/index-Bi7rZ6ba.d.ts +0 -244
  544. package/dist/states-IvhjBgna.js +0 -288
  545. package/dist/tv-DLbT66dC.js +0 -70
  546. package/src/patterns/chart/chart.tsx +0 -386
@@ -0,0 +1,254 @@
1
+ import { type ReactNode, useMemo } from 'react'
2
+ import * as R from 'recharts'
3
+ import { useControllableState } from '../../hooks/use-controllable-state'
4
+ import {
5
+ axisTick,
6
+ axisWidth,
7
+ type CartesianChartProps,
8
+ type ChartAxisOptions,
9
+ type ChartReferenceArea,
10
+ type ChartReferenceLine,
11
+ overlays,
12
+ } from './cartesian'
13
+ import {
14
+ type ChartColorValue,
15
+ ChartFrame,
16
+ type ChartStateProps,
17
+ categoryColor,
18
+ defaultFormatter,
19
+ type Key,
20
+ toggleIn,
21
+ useChartAnimation,
22
+ useChartParts,
23
+ } from './chart-parts'
24
+
25
+ type Row = Record<string, unknown>
26
+
27
+ export interface ScatterChartProps<T extends object> extends ChartStateProps {
28
+ data: readonly T[]
29
+ /** Field for the horizontal position. */
30
+ x: Key<T>
31
+ /** Field for the vertical position. */
32
+ y: Key<T>
33
+ /** Field for the point size. Turns the scatter into a bubble chart. */
34
+ size?: Key<T>
35
+ /** Field naming each point, shown in the tooltip. */
36
+ name?: Key<T>
37
+ /** Field that splits points into colored groups with a legend. */
38
+ groupBy?: Key<T>
39
+ title: string
40
+ description?: ReactNode
41
+ hideTitle?: boolean
42
+ /** Axis titles and tick formatters. Name the axes: a scatter has no other labels. */
43
+ xAxis?: ChartAxisOptions
44
+ yAxis?: ChartAxisOptions
45
+ /** Smallest and largest bubble area in pixels. Default `[40, 600]`. */
46
+ sizeRange?: readonly [number, number]
47
+ /** One color per group, in order. */
48
+ colors?: readonly ChartColorValue[]
49
+ /** Formats `size` in the tooltip. */
50
+ sizeFormatter?: (value: number) => string
51
+ referenceLines?: readonly ChartReferenceLine[]
52
+ referenceAreas?: readonly ChartReferenceArea[]
53
+ /** Plot height in pixels. Default 280. */
54
+ height?: number
55
+ showGrid?: boolean
56
+ showLegend?: boolean
57
+ hiddenGroups?: readonly string[]
58
+ onHiddenGroupsChange?: (hidden: string[]) => void
59
+ onPointClick?: (row: T) => void
60
+ className?: string
61
+ }
62
+
63
+ interface ScatterTooltipProps {
64
+ active?: boolean
65
+ payload?: readonly { payload?: Row }[]
66
+ }
67
+
68
+ /** How two measures relate, one dot per item. Add `size` for a third measure. */
69
+ export function ScatterChart<T extends object>(props: ScatterChartProps<T>) {
70
+ const { data, x, y, size, name, groupBy, height = 280 } = props
71
+ const { s, slots } = useChartParts()
72
+ const animation = useChartAnimation()
73
+ const [hidden, setHidden] = useControllableState<readonly string[]>({
74
+ value: props.hiddenGroups,
75
+ defaultValue: [],
76
+ onChange: props.onHiddenGroupsChange as ((value: readonly string[]) => void) | undefined,
77
+ })
78
+ const xFormat =
79
+ (props.xAxis?.formatter as ((v: number) => string) | undefined) ?? defaultFormatter
80
+ const yFormat =
81
+ (props.yAxis?.formatter as ((v: number) => string) | undefined) ?? defaultFormatter
82
+ const sizeFormat = props.sizeFormatter ?? defaultFormatter
83
+ const groups = useMemo(() => {
84
+ const order: string[] = []
85
+ const byGroup = new Map<string, Row[]>()
86
+ for (const row of data as readonly Row[]) {
87
+ const key = groupBy ? String(row[groupBy]) : props.title
88
+ if (!byGroup.has(key)) {
89
+ byGroup.set(key, [])
90
+ order.push(key)
91
+ }
92
+ byGroup.get(key)!.push(row)
93
+ }
94
+ return order.map((key, i) => ({
95
+ key,
96
+ rows: byGroup.get(key)!,
97
+ color: categoryColor(props.colors?.[i], i),
98
+ }))
99
+ }, [data, groupBy, props.colors, props.title])
100
+
101
+ const columns = [
102
+ ...(name ? [String(name)] : []),
103
+ ...(groupBy ? [String(groupBy)] : []),
104
+ props.xAxis?.label ?? String(x),
105
+ props.yAxis?.label ?? String(y),
106
+ ...(size ? [String(size)] : []),
107
+ ]
108
+ const table = {
109
+ columns: name || groupBy ? columns : ['#', ...columns],
110
+ rows: (data as readonly Row[]).map((row, i) => [
111
+ ...(name ? [String(row[name])] : []),
112
+ ...(groupBy ? [String(row[groupBy])] : []),
113
+ ...(name || groupBy ? [] : [i + 1]),
114
+ xFormat(Number(row[x])),
115
+ yFormat(Number(row[y])),
116
+ ...(size ? [sizeFormat(Number(row[size]))] : []),
117
+ ]),
118
+ }
119
+ const legend =
120
+ (props.showLegend ?? groups.length > 1)
121
+ ? groups.map((group) => ({
122
+ key: group.key,
123
+ label: group.key,
124
+ color: group.color,
125
+ hidden: hidden.includes(group.key),
126
+ }))
127
+ : undefined
128
+ const cartesian = props as unknown as CartesianChartProps<T>
129
+
130
+ const content = ({ active, payload }: ScatterTooltipProps) => {
131
+ const row = payload?.[0]?.payload
132
+ if (!active || !row) return null
133
+ const lines: [string, string][] = [
134
+ [props.xAxis?.label ?? String(x), xFormat(Number(row[x]))],
135
+ [props.yAxis?.label ?? String(y), yFormat(Number(row[y]))],
136
+ ...(size ? [[String(size), sizeFormat(Number(row[size]))] as [string, string]] : []),
137
+ ]
138
+ return (
139
+ <div data-slot="chart-tooltip" className={s.tooltip({ class: slots.tooltip })}>
140
+ {(name || groupBy) && (
141
+ <p className={s.tooltipLabel({ class: slots.tooltipLabel })}>
142
+ {String(row[name ?? groupBy!])}
143
+ </p>
144
+ )}
145
+ {lines.map(([label, value]) => (
146
+ <div key={label} className={s.tooltipRow({ class: slots.tooltipRow })}>
147
+ <span className={s.tooltipName({ class: slots.tooltipName })}>{label}</span>
148
+ <span className={s.tooltipValue({ class: slots.tooltipValue })}>{value}</span>
149
+ </div>
150
+ ))}
151
+ </div>
152
+ )
153
+ }
154
+
155
+ return (
156
+ <ChartFrame
157
+ title={props.title}
158
+ description={props.description}
159
+ hideTitle={props.hideTitle}
160
+ className={props.className}
161
+ legend={legend}
162
+ onLegendToggle={
163
+ groups.length > 1 ? (key) => setHidden(toggleIn(hidden, key, groups.length)) : undefined
164
+ }
165
+ table={table}
166
+ height={height}
167
+ isEmpty={data.length === 0}
168
+ loading={props.loading}
169
+ error={props.error}
170
+ onRetry={props.onRetry}
171
+ empty={props.empty}
172
+ >
173
+ <R.ResponsiveContainer width="100%" height={height}>
174
+ <R.ScatterChart
175
+ accessibilityLayer={false}
176
+ margin={{ top: 8, right: 12, bottom: props.xAxis?.label ? 16 : 0, left: 0 }}
177
+ >
178
+ {(props.showGrid ?? true) && (
179
+ <R.CartesianGrid stroke="var(--glyph-border)" strokeDasharray="3 3" yAxisId="left" />
180
+ )}
181
+ <R.XAxis
182
+ type="number"
183
+ dataKey={x}
184
+ name={props.xAxis?.label ?? String(x)}
185
+ hide={props.xAxis?.hide}
186
+ tick={axisTick}
187
+ tickLine={false}
188
+ axisLine={false}
189
+ tickMargin={8}
190
+ tickFormatter={xFormat}
191
+ domain={(props.xAxis?.domain as [number, number] | undefined) ?? ['auto', 'auto']}
192
+ {...(props.xAxis?.label && {
193
+ label: {
194
+ value: props.xAxis.label,
195
+ position: 'insideBottom',
196
+ offset: -12,
197
+ ...axisTick,
198
+ },
199
+ })}
200
+ />
201
+ <R.YAxis
202
+ yAxisId="left"
203
+ type="number"
204
+ dataKey={y}
205
+ name={props.yAxis?.label ?? String(y)}
206
+ hide={props.yAxis?.hide}
207
+ tick={axisTick}
208
+ tickLine={false}
209
+ axisLine={false}
210
+ width={props.yAxis?.width ?? axisWidth(data, [y], yFormat, props.yAxis?.label ? 18 : 0)}
211
+ tickFormatter={yFormat}
212
+ domain={(props.yAxis?.domain as [number, number] | undefined) ?? ['auto', 'auto']}
213
+ {...(props.yAxis?.label && {
214
+ label: { value: props.yAxis.label, angle: -90, position: 'insideLeft', ...axisTick },
215
+ })}
216
+ />
217
+ {size && (
218
+ <R.ZAxis
219
+ type="number"
220
+ dataKey={size}
221
+ range={(props.sizeRange as [number, number] | undefined) ?? [40, 600]}
222
+ />
223
+ )}
224
+ <R.Tooltip
225
+ cursor={{ stroke: 'var(--glyph-border-strong)', strokeDasharray: '3 3' }}
226
+ isAnimationActive={false}
227
+ content={(p) => content(p as ScatterTooltipProps)}
228
+ />
229
+ {overlays({ ...cartesian, brush: false })}
230
+ {groups.map((group) => (
231
+ <R.Scatter
232
+ key={group.key}
233
+ yAxisId="left"
234
+ name={group.key}
235
+ data={group.rows}
236
+ fill={group.color}
237
+ fillOpacity={size ? 0.65 : 0.9}
238
+ stroke="var(--glyph-surface)"
239
+ strokeWidth={1.5}
240
+ hide={hidden.includes(group.key)}
241
+ {...(props.onPointClick && {
242
+ onClick: (point: { payload?: Row }) => {
243
+ if (point.payload) props.onPointClick?.(point.payload as T)
244
+ },
245
+ style: { cursor: 'pointer' },
246
+ })}
247
+ {...animation}
248
+ />
249
+ ))}
250
+ </R.ScatterChart>
251
+ </R.ResponsiveContainer>
252
+ </ChartFrame>
253
+ )
254
+ }
@@ -0,0 +1,111 @@
1
+ import { useId } from 'react'
2
+ import * as R from 'recharts'
3
+ import { type ChartColorValue, resolveColor, useChartAnimation } from './chart-parts'
4
+
5
+ export interface SparklineProps {
6
+ values: readonly number[]
7
+ /** Accessible description, e.g. "Revenue over the last 12 months, rising". */
8
+ title: string
9
+ color?: ChartColorValue
10
+ /** Height in pixels. Default 36. */
11
+ height?: number
12
+ /** `area` (default) fills under the line, `line` is just the stroke, `bar` draws columns. */
13
+ variant?: 'area' | 'line' | 'bar'
14
+ /** @deprecated Use `variant="line"` for no fill. */
15
+ area?: boolean
16
+ /** Mark the highest and lowest points. */
17
+ showMinMax?: boolean
18
+ className?: string
19
+ }
20
+
21
+ /** A tiny trend without axes, for stat cards and table cells. */
22
+ export function Sparkline({
23
+ values,
24
+ title,
25
+ color,
26
+ height = 36,
27
+ variant,
28
+ area,
29
+ showMinMax = false,
30
+ className,
31
+ }: SparklineProps) {
32
+ const id = useId().replace(/:/g, '')
33
+ const animation = useChartAnimation()
34
+ const stroke = resolveColor(color, 0)
35
+ const kind = variant ?? (area === false ? 'line' : 'area')
36
+ const data = values.map((v, i) => ({ i, v }))
37
+ const maxIndex = values.indexOf(Math.max(...values))
38
+ const minIndex = values.indexOf(Math.min(...values))
39
+ const margin = {
40
+ top: showMinMax ? 4 : 2,
41
+ right: showMinMax ? 4 : 2,
42
+ bottom: showMinMax ? 4 : 2,
43
+ left: showMinMax ? 4 : 2,
44
+ }
45
+
46
+ const marker = (props: { cx?: number; cy?: number; index?: number }) => {
47
+ const { cx, cy, index } = props
48
+ if (!showMinMax || cx === undefined || cy === undefined) return <g key={index} />
49
+ if (index !== maxIndex && index !== minIndex) return <g key={index} />
50
+ return (
51
+ <circle
52
+ key={index}
53
+ data-extreme={index === maxIndex ? 'max' : 'min'}
54
+ cx={cx}
55
+ cy={cy}
56
+ r={2.75}
57
+ fill={index === maxIndex ? stroke : 'var(--glyph-surface)'}
58
+ stroke={stroke}
59
+ strokeWidth={1.5}
60
+ />
61
+ )
62
+ }
63
+
64
+ return (
65
+ <div
66
+ role="img"
67
+ aria-label={title}
68
+ data-slot="sparkline"
69
+ data-variant={kind}
70
+ className={className}
71
+ style={{ height }}
72
+ >
73
+ <R.ResponsiveContainer width="100%" height="100%">
74
+ {kind === 'bar' ? (
75
+ <R.BarChart accessibilityLayer={false} data={data} margin={margin} barCategoryGap="18%">
76
+ <R.Bar dataKey="v" radius={[2, 2, 0, 0]} {...animation}>
77
+ {data.map((point) => (
78
+ <R.Cell
79
+ key={point.i}
80
+ fill={stroke}
81
+ fillOpacity={
82
+ showMinMax && (point.i === maxIndex || point.i === minIndex) ? 1 : 0.55
83
+ }
84
+ />
85
+ ))}
86
+ </R.Bar>
87
+ </R.BarChart>
88
+ ) : (
89
+ <R.AreaChart accessibilityLayer={false} data={data} margin={margin}>
90
+ <defs>
91
+ <linearGradient id={id} x1="0" x2="0" y1="0" y2="1">
92
+ <stop offset="0%" stopColor={stroke} stopOpacity={kind === 'area' ? 0.25 : 0} />
93
+ <stop offset="100%" stopColor={stroke} stopOpacity={0} />
94
+ </linearGradient>
95
+ </defs>
96
+ <R.Area
97
+ dataKey="v"
98
+ type="monotone"
99
+ stroke={stroke}
100
+ strokeWidth={1.75}
101
+ fill={`url(#${id})`}
102
+ dot={marker}
103
+ activeDot={false}
104
+ {...animation}
105
+ />
106
+ </R.AreaChart>
107
+ )}
108
+ </R.ResponsiveContainer>
109
+ </div>
110
+ )
111
+ }
@@ -0,0 +1,35 @@
1
+ import { render } from '@testing-library/react'
2
+ import { cloneElement, type ReactElement, type ReactNode } from 'react'
3
+ import { GlyphProvider } from '../../provider/glyph-provider'
4
+
5
+ /** Renders with motion off, so recharts draws final shapes immediately. */
6
+ export function renderChart(ui: ReactElement) {
7
+ const wrapper = ({ children }: { children: ReactNode }) => (
8
+ <GlyphProvider storageKey={null} motion="none">
9
+ {children}
10
+ </GlyphProvider>
11
+ )
12
+ return render(ui, { wrapper })
13
+ }
14
+
15
+ /**
16
+ * jsdom has no layout, so recharts' ResponsiveContainer would draw nothing. Use as
17
+ * `vi.mock('recharts', (original) => import('./test-utils').then((m) => m.mockRecharts(original)))`.
18
+ */
19
+ export async function mockRecharts(importOriginal: () => Promise<unknown>) {
20
+ const actual = (await importOriginal()) as typeof import('recharts')
21
+ return {
22
+ ...actual,
23
+ ResponsiveContainer: ({
24
+ children,
25
+ height,
26
+ }: {
27
+ children: ReactElement
28
+ height?: number | string
29
+ }) =>
30
+ cloneElement(children as ReactElement<{ width?: number; height?: number }>, {
31
+ width: 600,
32
+ height: typeof height === 'number' ? height : 300,
33
+ }),
34
+ }
35
+ }
@@ -0,0 +1,198 @@
1
+ import type { ReactNode } from 'react'
2
+ import * as R from 'recharts'
3
+ import {
4
+ type ChartColorValue,
5
+ ChartFrame,
6
+ type ChartStateProps,
7
+ ChartTooltipCard,
8
+ categoryColor,
9
+ defaultFormatter,
10
+ type Key,
11
+ useChartAnimation,
12
+ } from './chart-parts'
13
+
14
+ type Row = Record<string, unknown>
15
+
16
+ export interface TreemapProps<T extends object> extends ChartStateProps {
17
+ /** One row per rectangle. Rows sharing a `group` are colored and nested together. */
18
+ data: readonly T[]
19
+ /** Field naming each rectangle. */
20
+ category: Key<T>
21
+ /** Field holding each rectangle's size. */
22
+ value: Key<T>
23
+ /** Field grouping rectangles, e.g. a team or product line. Each group gets one color. */
24
+ group?: Key<T>
25
+ title: string
26
+ description?: ReactNode
27
+ hideTitle?: boolean
28
+ colors?: readonly ChartColorValue[]
29
+ valueFormatter?: (value: number) => string
30
+ /** Plot height in pixels. Default 280. */
31
+ height?: number
32
+ showLegend?: boolean
33
+ className?: string
34
+ }
35
+
36
+ interface TileNode {
37
+ name: string
38
+ size?: number
39
+ fill: string
40
+ children?: TileNode[]
41
+ [field: string]: unknown
42
+ }
43
+
44
+ interface TileProps {
45
+ x?: number
46
+ y?: number
47
+ width?: number
48
+ height?: number
49
+ depth?: number
50
+ name?: string
51
+ value?: number
52
+ fill?: string
53
+ children?: unknown
54
+ formatter: (value: number) => string
55
+ }
56
+
57
+ function Tile({
58
+ x = 0,
59
+ y = 0,
60
+ width = 0,
61
+ height = 0,
62
+ depth = 0,
63
+ name,
64
+ value,
65
+ fill,
66
+ children,
67
+ formatter,
68
+ }: TileProps) {
69
+ // Groups are drawn by their children; only leaves are painted.
70
+ if (Array.isArray(children) && children.length > 0) return null
71
+ if (depth === 0) return null
72
+ const roomForName = width > 56 && height > 28
73
+ const roomForValue = width > 56 && height > 46
74
+ return (
75
+ <g>
76
+ <rect
77
+ x={x + 1}
78
+ y={y + 1}
79
+ width={Math.max(width - 2, 0)}
80
+ height={Math.max(height - 2, 0)}
81
+ rx={4}
82
+ fill={fill}
83
+ stroke="var(--glyph-surface)"
84
+ strokeWidth={2}
85
+ />
86
+ {roomForName && (
87
+ <text
88
+ x={x + 10}
89
+ y={y + 20}
90
+ fill="var(--glyph-surface)"
91
+ fontSize={12}
92
+ fontWeight={500}
93
+ style={{ pointerEvents: 'none' }}
94
+ >
95
+ {name}
96
+ </text>
97
+ )}
98
+ {roomForValue && value !== undefined && (
99
+ <text
100
+ x={x + 10}
101
+ y={y + 37}
102
+ fill="var(--glyph-surface)"
103
+ fillOpacity={0.85}
104
+ fontSize={11}
105
+ style={{ pointerEvents: 'none', fontVariantNumeric: 'tabular-nums' }}
106
+ >
107
+ {formatter(value)}
108
+ </text>
109
+ )}
110
+ </g>
111
+ )
112
+ }
113
+
114
+ /** Sizes of many parts of a whole, nested by group, e.g. spend by team and vendor. */
115
+ export function Treemap<T extends object>(props: TreemapProps<T>) {
116
+ const { data, category, value, group, valueFormatter = defaultFormatter, height = 280 } = props
117
+ const animation = useChartAnimation()
118
+ const rows = data as readonly Row[]
119
+ const groupNames: string[] = []
120
+ if (group) {
121
+ for (const row of rows) {
122
+ const name = String(row[group])
123
+ if (!groupNames.includes(name)) groupNames.push(name)
124
+ }
125
+ }
126
+ const tree: TileNode[] = group
127
+ ? groupNames.map((name, i) => {
128
+ const fill = categoryColor(props.colors?.[i], i)
129
+ return {
130
+ name,
131
+ fill,
132
+ children: rows
133
+ .filter((row) => String(row[group]) === name)
134
+ .map((row) => ({ name: String(row[category]), size: Number(row[value]) || 0, fill })),
135
+ }
136
+ })
137
+ : rows.map((row, i) => ({
138
+ name: String(row[category]),
139
+ size: Number(row[value]) || 0,
140
+ fill: categoryColor(props.colors?.[i], i),
141
+ }))
142
+ const table = {
143
+ columns: [String(category), ...(group ? [String(group)] : []), String(value)],
144
+ rows: rows.map((row) => [
145
+ String(row[category]),
146
+ ...(group ? [String(row[group])] : []),
147
+ valueFormatter(Number(row[value])),
148
+ ]),
149
+ }
150
+ const legend =
151
+ group && (props.showLegend ?? true)
152
+ ? groupNames.map((name, i) => ({ key: name, label: name, color: tree[i]!.fill }))
153
+ : undefined
154
+ return (
155
+ <ChartFrame
156
+ title={props.title}
157
+ description={props.description}
158
+ hideTitle={props.hideTitle}
159
+ className={props.className}
160
+ legend={legend}
161
+ table={table}
162
+ height={height}
163
+ isEmpty={rows.length === 0}
164
+ loading={props.loading}
165
+ error={props.error}
166
+ onRetry={props.onRetry}
167
+ empty={props.empty}
168
+ >
169
+ <R.ResponsiveContainer width="100%" height={height}>
170
+ <R.Treemap
171
+ data={tree}
172
+ dataKey="size"
173
+ nameKey="name"
174
+ aspectRatio={4 / 3}
175
+ content={<Tile formatter={valueFormatter} />}
176
+ {...animation}
177
+ >
178
+ <R.Tooltip
179
+ isAnimationActive={false}
180
+ content={(p) => (
181
+ <ChartTooltipCard
182
+ active={p.active}
183
+ payload={(p.payload as never[] | undefined)?.map(
184
+ (item: { payload?: Row; value?: unknown }) => ({
185
+ name: String(item.payload?.name ?? ''),
186
+ value: item.value,
187
+ color: String(item.payload?.fill ?? ''),
188
+ }),
189
+ )}
190
+ formatter={valueFormatter}
191
+ />
192
+ )}
193
+ />
194
+ </R.Treemap>
195
+ </R.ResponsiveContainer>
196
+ </ChartFrame>
197
+ )
198
+ }
@@ -0,0 +1,20 @@
1
+ import { useLayoutEffect, useRef, useState } from 'react'
2
+
3
+ /**
4
+ * Measures an element's content width with a ResizeObserver. Until the first measurement
5
+ * (and in environments without layout, like tests) it reports `fallback`.
6
+ */
7
+ export function useElementWidth<E extends HTMLElement>(fallback = 480) {
8
+ const ref = useRef<E>(null)
9
+ const [width, setWidth] = useState(0)
10
+ useLayoutEffect(() => {
11
+ const element = ref.current
12
+ if (!element) return
13
+ const measure = () => setWidth(Math.round(element.getBoundingClientRect().width))
14
+ measure()
15
+ const observer = new ResizeObserver(measure)
16
+ observer.observe(element)
17
+ return () => observer.disconnect()
18
+ }, [])
19
+ return [ref, width > 0 ? width : fallback] as const
20
+ }
@@ -46,7 +46,7 @@ declare module '@tanstack/react-table' {
46
46
  }
47
47
  }
48
48
 
49
- export const dataTableStyles = tv({
49
+ export const dataTableStyles = /* @__PURE__ */ tv({
50
50
  slots: {
51
51
  root: 'flex min-w-0 flex-col',
52
52
  toolbar: 'flex flex-wrap items-center gap-2',
@@ -170,7 +170,7 @@ export function FormSubmit({ form, onClick, ...props }: FormSubmitProps) {
170
170
  return <Button type="button" loading={isSubmitting} onClick={submitOutside} {...props} />
171
171
  }
172
172
 
173
- export const formErrorStyles = tv({
173
+ export const formErrorStyles = /* @__PURE__ */ tv({
174
174
  slots: {
175
175
  base: 'flex items-start gap-2 rounded-md border border-danger/30 bg-danger/8 px-3 py-2.5 text-small text-danger-text',
176
176
  icon: 'mt-0.5 size-4 shrink-0',
@@ -1,4 +1,4 @@
1
- import type { Theme } from '@glyphui/tokens'
1
+ import type { MotionLevel, Theme } from '@glyphui/tokens'
2
2
  import {
3
3
  createContext,
4
4
  type ElementType,
@@ -45,6 +45,8 @@ export interface GlyphContextValue {
45
45
  theme: Theme
46
46
  linkComponent: LinkComponent
47
47
  useIsActive: UseIsActive
48
+ /** Overrides the theme's motion level for the whole app. */
49
+ motion?: MotionLevel | undefined
48
50
  }
49
51
 
50
52
  export const GlyphContext = createContext<GlyphContextValue | null>(null)