@vamos-ui/react 0.0.0-stage → 0.2.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 (665) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/dist/blocks/block-heading.d.ts +29 -0
  4. package/dist/blocks/block-heading.js +39 -0
  5. package/dist/blocks/block-image.d.ts +52 -0
  6. package/dist/blocks/block-image.js +48 -0
  7. package/dist/blocks/block-link.d.ts +30 -0
  8. package/dist/blocks/block-link.js +36 -0
  9. package/dist/blocks/create-blocks.d.ts +54 -0
  10. package/dist/blocks/create-blocks.js +52 -0
  11. package/dist/blocks/index.d.ts +55 -0
  12. package/dist/blocks/index.js +59 -0
  13. package/dist/blocks/json-ld.d.ts +18 -0
  14. package/dist/blocks/json-ld.js +44 -0
  15. package/dist/blocks/labels.d.ts +20 -0
  16. package/dist/blocks/labels.js +43 -0
  17. package/dist/blocks/rich-text.d.ts +36 -0
  18. package/dist/blocks/rich-text.js +106 -0
  19. package/dist/blocks/schema/define-block.d.ts +151 -0
  20. package/dist/blocks/schema/define-block.js +120 -0
  21. package/dist/blocks/schema/emphasis.d.ts +17 -0
  22. package/dist/blocks/schema/emphasis.js +69 -0
  23. package/dist/blocks/schema/fields.d.ts +497 -0
  24. package/dist/blocks/schema/fields.js +240 -0
  25. package/dist/blocks/schema/icons.d.ts +2 -0
  26. package/dist/blocks/schema/icons.js +26 -0
  27. package/dist/blocks/schema/index.d.ts +18 -0
  28. package/dist/blocks/schema/index.js +21 -0
  29. package/dist/blocks/schema/lint-types.d.ts +16 -0
  30. package/dist/blocks/schema/lint-types.js +2 -0
  31. package/dist/blocks/schema/lint.d.ts +32 -0
  32. package/dist/blocks/schema/lint.js +164 -0
  33. package/dist/blocks/schema/localize.d.ts +20 -0
  34. package/dist/blocks/schema/localize.js +29 -0
  35. package/dist/blocks/schema/localized.d.ts +25 -0
  36. package/dist/blocks/schema/localized.js +53 -0
  37. package/dist/blocks/schema/migrate.d.ts +24 -0
  38. package/dist/blocks/schema/migrate.js +75 -0
  39. package/dist/blocks/schema/nodes.d.ts +196 -0
  40. package/dist/blocks/schema/nodes.js +78 -0
  41. package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
  42. package/dist/blocks/schema/rich-doc-schema.js +66 -0
  43. package/dist/blocks/schema/rich-doc.d.ts +90 -0
  44. package/dist/blocks/schema/rich-doc.js +62 -0
  45. package/dist/blocks/schema/safety.d.ts +20 -0
  46. package/dist/blocks/schema/safety.js +49 -0
  47. package/dist/blocks/schema/types.d.ts +172 -0
  48. package/dist/blocks/schema/types.js +3 -0
  49. package/dist/blocks/schema/validate.d.ts +17 -0
  50. package/dist/blocks/schema/validate.js +32 -0
  51. package/dist/blocks/schema/walk.d.ts +22 -0
  52. package/dist/blocks/schema/walk.js +60 -0
  53. package/dist/blocks/section-header.d.ts +38 -0
  54. package/dist/blocks/section-header.js +22 -0
  55. package/dist/blocks/section.d.ts +59 -0
  56. package/dist/blocks/section.js +66 -0
  57. package/dist/blocks/site/_kit-1.d.ts +100 -0
  58. package/dist/blocks/site/_kit-1.js +135 -0
  59. package/dist/blocks/site/_site-icon-1.d.ts +6 -0
  60. package/dist/blocks/site/_site-icon-1.js +15 -0
  61. package/dist/blocks/site/announcement-bar.d.ts +42 -0
  62. package/dist/blocks/site/announcement-bar.js +38 -0
  63. package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
  64. package/dist/blocks/site/announcement-dismiss.js +28 -0
  65. package/dist/blocks/site/article-layout.d.ts +65 -0
  66. package/dist/blocks/site/article-layout.js +88 -0
  67. package/dist/blocks/site/blog-list.d.ts +79 -0
  68. package/dist/blocks/site/blog-list.js +78 -0
  69. package/dist/blocks/site/comparison-table.d.ts +54 -0
  70. package/dist/blocks/site/comparison-table.js +38 -0
  71. package/dist/blocks/site/consent-banner.d.ts +52 -0
  72. package/dist/blocks/site/consent-banner.js +33 -0
  73. package/dist/blocks/site/contact-dock.d.ts +52 -0
  74. package/dist/blocks/site/contact-dock.js +55 -0
  75. package/dist/blocks/site/contact-form.d.ts +60 -0
  76. package/dist/blocks/site/contact-form.js +45 -0
  77. package/dist/blocks/site/cta-booking.d.ts +43 -0
  78. package/dist/blocks/site/cta-booking.js +69 -0
  79. package/dist/blocks/site/cta.d.ts +74 -0
  80. package/dist/blocks/site/cta.js +112 -0
  81. package/dist/blocks/site/embed-facade.d.ts +20 -0
  82. package/dist/blocks/site/embed-facade.js +21 -0
  83. package/dist/blocks/site/faq.d.ts +48 -0
  84. package/dist/blocks/site/faq.js +51 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +49 -0
  87. package/dist/blocks/site/feature-tabs.d.ts +22 -0
  88. package/dist/blocks/site/feature-tabs.js +11 -0
  89. package/dist/blocks/site/footer.d.ts +68 -0
  90. package/dist/blocks/site/footer.js +61 -0
  91. package/dist/blocks/site/gallery-section.d.ts +42 -0
  92. package/dist/blocks/site/gallery-section.js +47 -0
  93. package/dist/blocks/site/hero-video.d.ts +15 -0
  94. package/dist/blocks/site/hero-video.js +31 -0
  95. package/dist/blocks/site/hero.d.ts +64 -0
  96. package/dist/blocks/site/hero.js +67 -0
  97. package/dist/blocks/site/logo-strip.d.ts +42 -0
  98. package/dist/blocks/site/logo-strip.js +26 -0
  99. package/dist/blocks/site/map-hours.d.ts +83 -0
  100. package/dist/blocks/site/map-hours.js +125 -0
  101. package/dist/blocks/site/media-text.d.ts +45 -0
  102. package/dist/blocks/site/media-text.js +55 -0
  103. package/dist/blocks/site/menu-list.d.ts +74 -0
  104. package/dist/blocks/site/menu-list.js +84 -0
  105. package/dist/blocks/site/navbar-submenu.d.ts +18 -0
  106. package/dist/blocks/site/navbar-submenu.js +51 -0
  107. package/dist/blocks/site/navbar.d.ts +67 -0
  108. package/dist/blocks/site/navbar.js +64 -0
  109. package/dist/blocks/site/not-found.d.ts +40 -0
  110. package/dist/blocks/site/not-found.js +38 -0
  111. package/dist/blocks/site/page-intro.d.ts +46 -0
  112. package/dist/blocks/site/page-intro.js +44 -0
  113. package/dist/blocks/site/pricing-table.d.ts +67 -0
  114. package/dist/blocks/site/pricing-table.js +82 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +41 -0
  117. package/dist/blocks/site/registry-1.d.ts +720 -0
  118. package/dist/blocks/site/registry-1.js +783 -0
  119. package/dist/blocks/site/registry-2.d.ts +914 -0
  120. package/dist/blocks/site/registry-2.js +563 -0
  121. package/dist/blocks/site/rich-text-section.d.ts +34 -0
  122. package/dist/blocks/site/rich-text-section.js +32 -0
  123. package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
  124. package/dist/blocks/site/shared/brand-icons.js +56 -0
  125. package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
  126. package/dist/blocks/site/shared/consent-gate.js +43 -0
  127. package/dist/blocks/site/shared/consent-island.d.ts +38 -0
  128. package/dist/blocks/site/shared/consent-island.js +63 -0
  129. package/dist/blocks/site/shared/consent.d.ts +49 -0
  130. package/dist/blocks/site/shared/consent.js +130 -0
  131. package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
  132. package/dist/blocks/site/shared/contact-form-island.js +100 -0
  133. package/dist/blocks/site/shared/copy-link.d.ts +10 -0
  134. package/dist/blocks/site/shared/copy-link.js +25 -0
  135. package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
  136. package/dist/blocks/site/shared/dock-avoid.js +107 -0
  137. package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
  138. package/dist/blocks/site/shared/dock-hours.js +25 -0
  139. package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
  140. package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
  141. package/dist/blocks/site/shared/island-keys.d.ts +10 -0
  142. package/dist/blocks/site/shared/island-keys.js +44 -0
  143. package/dist/blocks/site/shared/kit-2.d.ts +55 -0
  144. package/dist/blocks/site/shared/kit-2.js +84 -0
  145. package/dist/blocks/site/shared/labels-2.d.ts +209 -0
  146. package/dist/blocks/site/shared/labels-2.js +427 -0
  147. package/dist/blocks/site/shared/open-now.d.ts +22 -0
  148. package/dist/blocks/site/shared/open-now.js +27 -0
  149. package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
  150. package/dist/blocks/site/shared/opening-hours.js +245 -0
  151. package/dist/blocks/site/shared/site-accent.d.ts +48 -0
  152. package/dist/blocks/site/shared/site-accent.js +249 -0
  153. package/dist/blocks/site/shared/site-form.d.ts +79 -0
  154. package/dist/blocks/site/shared/site-form.js +111 -0
  155. package/dist/blocks/site/shared/site-routing.d.ts +54 -0
  156. package/dist/blocks/site/shared/site-routing.js +86 -0
  157. package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
  158. package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
  159. package/dist/blocks/site/site-shell.d.ts +97 -0
  160. package/dist/blocks/site/site-shell.js +227 -0
  161. package/dist/blocks/site/stats-band.d.ts +40 -0
  162. package/dist/blocks/site/stats-band.js +41 -0
  163. package/dist/blocks/site/team.d.ts +44 -0
  164. package/dist/blocks/site/team.js +48 -0
  165. package/dist/blocks/site/testimonials.d.ts +68 -0
  166. package/dist/blocks/site/testimonials.js +65 -0
  167. package/dist/blocks/types.d.ts +63 -0
  168. package/dist/blocks/types.js +2 -0
  169. package/dist/business/approval-flow.d.ts +152 -0
  170. package/dist/business/approval-flow.js +221 -0
  171. package/dist/business/export-core.d.ts +55 -0
  172. package/dist/business/export-core.js +101 -0
  173. package/dist/business/export.d.ts +148 -0
  174. package/dist/business/export.js +264 -0
  175. package/dist/business/import-core.d.ts +104 -0
  176. package/dist/business/import-core.js +281 -0
  177. package/dist/business/import-wizard.d.ts +186 -0
  178. package/dist/business/import-wizard.js +401 -0
  179. package/dist/business/index.d.ts +11 -0
  180. package/dist/business/index.js +20 -0
  181. package/dist/business/line-items-core.d.ts +129 -0
  182. package/dist/business/line-items-core.js +183 -0
  183. package/dist/business/line-items.d.ts +119 -0
  184. package/dist/business/line-items.js +299 -0
  185. package/dist/business/multi-step-form.d.ts +131 -0
  186. package/dist/business/multi-step-form.js +337 -0
  187. package/dist/business/permission-core.d.ts +59 -0
  188. package/dist/business/permission-core.js +99 -0
  189. package/dist/business/permission-matrix.d.ts +158 -0
  190. package/dist/business/permission-matrix.js +341 -0
  191. package/dist/business/setup-checklist.d.ts +80 -0
  192. package/dist/business/setup-checklist.js +92 -0
  193. package/dist/charts/area-chart.d.ts +35 -0
  194. package/dist/charts/area-chart.js +33 -0
  195. package/dist/charts/bar-chart.d.ts +27 -0
  196. package/dist/charts/bar-chart.js +42 -0
  197. package/dist/charts/bar-list.d.ts +47 -0
  198. package/dist/charts/bar-list.js +60 -0
  199. package/dist/charts/chart-shell.d.ts +173 -0
  200. package/dist/charts/chart-shell.js +205 -0
  201. package/dist/charts/chart.d.ts +73 -0
  202. package/dist/charts/chart.js +106 -0
  203. package/dist/charts/combo-chart.d.ts +29 -0
  204. package/dist/charts/combo-chart.js +47 -0
  205. package/dist/charts/donut-chart.d.ts +33 -0
  206. package/dist/charts/donut-chart.js +113 -0
  207. package/dist/charts/funnel.d.ts +51 -0
  208. package/dist/charts/funnel.js +69 -0
  209. package/dist/charts/gauge.d.ts +62 -0
  210. package/dist/charts/gauge.js +104 -0
  211. package/dist/charts/heatmap.d.ts +81 -0
  212. package/dist/charts/heatmap.js +338 -0
  213. package/dist/charts/index.d.ts +12 -0
  214. package/dist/charts/index.js +14 -0
  215. package/dist/charts/line-chart.d.ts +21 -0
  216. package/dist/charts/line-chart.js +36 -0
  217. package/dist/charts/test-utils.d.ts +2 -0
  218. package/dist/charts/test-utils.js +38 -0
  219. package/dist/charts/utils.d.ts +130 -0
  220. package/dist/charts/utils.js +262 -0
  221. package/dist/components/accordion.d.ts +47 -0
  222. package/dist/components/accordion.js +70 -0
  223. package/dist/components/activity-timeline.d.ts +149 -0
  224. package/dist/components/activity-timeline.js +122 -0
  225. package/dist/components/address-field.d.ts +116 -0
  226. package/dist/components/address-field.js +219 -0
  227. package/dist/components/alert-dialog.d.ts +99 -0
  228. package/dist/components/alert-dialog.js +192 -0
  229. package/dist/components/alert.d.ts +42 -0
  230. package/dist/components/alert.js +82 -0
  231. package/dist/components/app-shell.d.ts +159 -0
  232. package/dist/components/app-shell.js +289 -0
  233. package/dist/components/attachment-list.d.ts +96 -0
  234. package/dist/components/attachment-list.js +196 -0
  235. package/dist/components/audit-log.d.ts +150 -0
  236. package/dist/components/audit-log.js +205 -0
  237. package/dist/components/avatar.d.ts +87 -0
  238. package/dist/components/avatar.js +126 -0
  239. package/dist/components/badge.d.ts +41 -0
  240. package/dist/components/badge.js +68 -0
  241. package/dist/components/breadcrumb.d.ts +78 -0
  242. package/dist/components/breadcrumb.js +106 -0
  243. package/dist/components/button-group.d.ts +52 -0
  244. package/dist/components/button-group.js +77 -0
  245. package/dist/components/button.d.ts +58 -0
  246. package/dist/components/button.js +107 -0
  247. package/dist/components/calendar.d.ts +240 -0
  248. package/dist/components/calendar.js +483 -0
  249. package/dist/components/card.d.ts +66 -0
  250. package/dist/components/card.js +76 -0
  251. package/dist/components/carousel.d.ts +170 -0
  252. package/dist/components/carousel.js +348 -0
  253. package/dist/components/checkbox.d.ts +78 -0
  254. package/dist/components/checkbox.js +138 -0
  255. package/dist/components/color-picker.d.ts +112 -0
  256. package/dist/components/color-picker.js +235 -0
  257. package/dist/components/combobox.d.ts +136 -0
  258. package/dist/components/combobox.js +294 -0
  259. package/dist/components/command.d.ts +275 -0
  260. package/dist/components/command.js +493 -0
  261. package/dist/components/comment-thread.d.ts +252 -0
  262. package/dist/components/comment-thread.js +449 -0
  263. package/dist/components/context-menu.d.ts +77 -0
  264. package/dist/components/context-menu.js +82 -0
  265. package/dist/components/currency-input.d.ts +43 -0
  266. package/dist/components/currency-input.js +85 -0
  267. package/dist/components/date-picker.d.ts +141 -0
  268. package/dist/components/date-picker.js +241 -0
  269. package/dist/components/date-range-picker.d.ts +91 -0
  270. package/dist/components/date-range-picker.js +251 -0
  271. package/dist/components/description-list.d.ts +92 -0
  272. package/dist/components/description-list.js +42 -0
  273. package/dist/components/dialog.d.ts +139 -0
  274. package/dist/components/dialog.js +185 -0
  275. package/dist/components/dropdown-menu.d.ts +100 -0
  276. package/dist/components/dropdown-menu.js +102 -0
  277. package/dist/components/editor-layout.d.ts +166 -0
  278. package/dist/components/editor-layout.js +237 -0
  279. package/dist/components/empty-state.d.ts +49 -0
  280. package/dist/components/empty-state.js +68 -0
  281. package/dist/components/entity-card.d.ts +83 -0
  282. package/dist/components/entity-card.js +92 -0
  283. package/dist/components/file-upload.d.ts +256 -0
  284. package/dist/components/file-upload.js +490 -0
  285. package/dist/components/formatted-input.d.ts +177 -0
  286. package/dist/components/formatted-input.js +399 -0
  287. package/dist/components/hierarchy-chart.d.ts +190 -0
  288. package/dist/components/hierarchy-chart.js +890 -0
  289. package/dist/components/hover-card.d.ts +21 -0
  290. package/dist/components/hover-card.js +32 -0
  291. package/dist/components/iban-input.d.ts +38 -0
  292. package/dist/components/iban-input.js +112 -0
  293. package/dist/components/id-input.d.ts +65 -0
  294. package/dist/components/id-input.js +130 -0
  295. package/dist/components/image.d.ts +130 -0
  296. package/dist/components/image.js +168 -0
  297. package/dist/components/input-otp.d.ts +62 -0
  298. package/dist/components/input-otp.js +73 -0
  299. package/dist/components/input.d.ts +141 -0
  300. package/dist/components/input.js +187 -0
  301. package/dist/components/item.d.ts +96 -0
  302. package/dist/components/item.js +113 -0
  303. package/dist/components/kbd.d.ts +64 -0
  304. package/dist/components/kbd.js +119 -0
  305. package/dist/components/list-layout.d.ts +144 -0
  306. package/dist/components/list-layout.js +210 -0
  307. package/dist/components/native-select.d.ts +33 -0
  308. package/dist/components/native-select.js +48 -0
  309. package/dist/components/navigation-menu.d.ts +127 -0
  310. package/dist/components/navigation-menu.js +129 -0
  311. package/dist/components/notification-center.d.ts +164 -0
  312. package/dist/components/notification-center.js +399 -0
  313. package/dist/components/page-header.d.ts +60 -0
  314. package/dist/components/page-header.js +60 -0
  315. package/dist/components/pagination.d.ts +121 -0
  316. package/dist/components/pagination.js +174 -0
  317. package/dist/components/phone-input.d.ts +49 -0
  318. package/dist/components/phone-input.js +266 -0
  319. package/dist/components/popover.d.ts +38 -0
  320. package/dist/components/popover.js +69 -0
  321. package/dist/components/progress.d.ts +79 -0
  322. package/dist/components/progress.js +97 -0
  323. package/dist/components/radio-group.d.ts +43 -0
  324. package/dist/components/radio-group.js +81 -0
  325. package/dist/components/record-detail-layout.d.ts +167 -0
  326. package/dist/components/record-detail-layout.js +233 -0
  327. package/dist/components/record-picker.d.ts +199 -0
  328. package/dist/components/record-picker.js +650 -0
  329. package/dist/components/resizable.d.ts +50 -0
  330. package/dist/components/resizable.js +88 -0
  331. package/dist/components/scroll-area.d.ts +40 -0
  332. package/dist/components/scroll-area.js +56 -0
  333. package/dist/components/select.d.ts +126 -0
  334. package/dist/components/select.js +137 -0
  335. package/dist/components/separator.d.ts +31 -0
  336. package/dist/components/separator.js +41 -0
  337. package/dist/components/settings-layout.d.ts +134 -0
  338. package/dist/components/settings-layout.js +180 -0
  339. package/dist/components/sheet.d.ts +103 -0
  340. package/dist/components/sheet.js +165 -0
  341. package/dist/components/sidebar.d.ts +171 -0
  342. package/dist/components/sidebar.js +421 -0
  343. package/dist/components/signature-pad.d.ts +85 -0
  344. package/dist/components/signature-pad.js +283 -0
  345. package/dist/components/skeleton.d.ts +64 -0
  346. package/dist/components/skeleton.js +53 -0
  347. package/dist/components/slider.d.ts +57 -0
  348. package/dist/components/slider.js +133 -0
  349. package/dist/components/slug-input.d.ts +69 -0
  350. package/dist/components/slug-input.js +201 -0
  351. package/dist/components/sparkline.d.ts +54 -0
  352. package/dist/components/sparkline.js +122 -0
  353. package/dist/components/spinner.d.ts +34 -0
  354. package/dist/components/spinner.js +34 -0
  355. package/dist/components/stat.d.ts +135 -0
  356. package/dist/components/stat.js +130 -0
  357. package/dist/components/status-picker.d.ts +107 -0
  358. package/dist/components/status-picker.js +175 -0
  359. package/dist/components/stepper.d.ts +86 -0
  360. package/dist/components/stepper.js +103 -0
  361. package/dist/components/switch.d.ts +34 -0
  362. package/dist/components/switch.js +70 -0
  363. package/dist/components/table.d.ts +101 -0
  364. package/dist/components/table.js +72 -0
  365. package/dist/components/tabs.d.ts +103 -0
  366. package/dist/components/tabs.js +173 -0
  367. package/dist/components/tag-input.d.ts +77 -0
  368. package/dist/components/tag-input.js +305 -0
  369. package/dist/components/task-list.d.ts +89 -0
  370. package/dist/components/task-list.js +238 -0
  371. package/dist/components/time-picker.d.ts +119 -0
  372. package/dist/components/time-picker.js +399 -0
  373. package/dist/components/toast.d.ts +87 -0
  374. package/dist/components/toast.js +142 -0
  375. package/dist/components/toggle.d.ts +77 -0
  376. package/dist/components/toggle.js +109 -0
  377. package/dist/components/tooltip.d.ts +69 -0
  378. package/dist/components/tooltip.js +105 -0
  379. package/dist/components/top-bar.d.ts +87 -0
  380. package/dist/components/top-bar.js +99 -0
  381. package/dist/components/tree-select.d.ts +89 -0
  382. package/dist/components/tree-select.js +243 -0
  383. package/dist/components/tree-view.d.ts +109 -0
  384. package/dist/components/tree-view.js +170 -0
  385. package/dist/components/typography.d.ts +107 -0
  386. package/dist/components/typography.js +128 -0
  387. package/dist/components/user-picker.d.ts +89 -0
  388. package/dist/components/user-picker.js +162 -0
  389. package/dist/components/version-history.d.ts +191 -0
  390. package/dist/components/version-history.js +431 -0
  391. package/dist/data-table/csv.d.ts +27 -0
  392. package/dist/data-table/csv.js +68 -0
  393. package/dist/data-table/data-table.d.ts +423 -0
  394. package/dist/data-table/data-table.js +1259 -0
  395. package/dist/data-table/filter-bar.d.ts +146 -0
  396. package/dist/data-table/filter-bar.js +569 -0
  397. package/dist/data-table/filter-fns.d.ts +65 -0
  398. package/dist/data-table/filter-fns.js +382 -0
  399. package/dist/data-table/index.d.ts +8 -0
  400. package/dist/data-table/index.js +9 -0
  401. package/dist/data-table/saved-views.d.ts +100 -0
  402. package/dist/data-table/saved-views.js +251 -0
  403. package/dist/data-table/types.d.ts +168 -0
  404. package/dist/data-table/types.js +87 -0
  405. package/dist/data-table/url-state.d.ts +94 -0
  406. package/dist/data-table/url-state.js +303 -0
  407. package/dist/data-table/view-state.d.ts +16 -0
  408. package/dist/data-table/view-state.js +81 -0
  409. package/dist/editor/_test-setup.d.ts +1 -0
  410. package/dist/editor/_test-setup.js +33 -0
  411. package/dist/editor/block-editor.d.ts +137 -0
  412. package/dist/editor/block-editor.js +280 -0
  413. package/dist/editor/commands.d.ts +31 -0
  414. package/dist/editor/commands.js +150 -0
  415. package/dist/editor/context.d.ts +108 -0
  416. package/dist/editor/context.js +30 -0
  417. package/dist/editor/convert.d.ts +66 -0
  418. package/dist/editor/convert.js +567 -0
  419. package/dist/editor/drag-handle.d.ts +10 -0
  420. package/dist/editor/drag-handle.js +69 -0
  421. package/dist/editor/extensions.d.ts +34 -0
  422. package/dist/editor/extensions.js +239 -0
  423. package/dist/editor/index.d.ts +14 -0
  424. package/dist/editor/index.js +17 -0
  425. package/dist/editor/inserter.d.ts +12 -0
  426. package/dist/editor/inserter.js +88 -0
  427. package/dist/editor/inspector.d.ts +17 -0
  428. package/dist/editor/inspector.js +65 -0
  429. package/dist/editor/items.d.ts +62 -0
  430. package/dist/editor/items.js +195 -0
  431. package/dist/editor/labels.d.ts +119 -0
  432. package/dist/editor/labels.js +130 -0
  433. package/dist/editor/markdown.d.ts +14 -0
  434. package/dist/editor/markdown.js +209 -0
  435. package/dist/editor/menus.d.ts +20 -0
  436. package/dist/editor/menus.js +236 -0
  437. package/dist/editor/nodes.d.ts +14 -0
  438. package/dist/editor/nodes.js +201 -0
  439. package/dist/editor/outline.d.ts +11 -0
  440. package/dist/editor/outline.js +52 -0
  441. package/dist/editor/schema-form.d.ts +64 -0
  442. package/dist/editor/schema-form.js +290 -0
  443. package/dist/editor/slash-menu.d.ts +15 -0
  444. package/dist/editor/slash-menu.js +119 -0
  445. package/dist/fonts/catalog.d.ts +53 -0
  446. package/dist/fonts/catalog.js +121 -0
  447. package/dist/fonts/font-picker.d.ts +70 -0
  448. package/dist/fonts/font-picker.js +225 -0
  449. package/dist/fonts/index.d.ts +6 -0
  450. package/dist/fonts/index.js +7 -0
  451. package/dist/fonts/loader.d.ts +66 -0
  452. package/dist/fonts/loader.js +161 -0
  453. package/dist/fonts/pairing-picker.d.ts +31 -0
  454. package/dist/fonts/pairing-picker.js +81 -0
  455. package/dist/fonts/pairings.d.ts +84 -0
  456. package/dist/fonts/pairings.js +149 -0
  457. package/dist/fonts/provider.d.ts +34 -0
  458. package/dist/fonts/provider.js +51 -0
  459. package/dist/form/index.d.ts +1 -0
  460. package/dist/form/index.js +1 -0
  461. package/dist/format/core.d.ts +149 -0
  462. package/dist/format/core.js +357 -0
  463. package/dist/format/index.d.ts +4 -0
  464. package/dist/format/index.js +5 -0
  465. package/dist/format/use-format.d.ts +1 -0
  466. package/dist/format/use-format.js +3 -0
  467. package/dist/index.d.ts +86 -0
  468. package/dist/index.js +87 -0
  469. package/dist/lib/cn.d.ts +3 -0
  470. package/dist/lib/cn.js +16 -0
  471. package/dist/lib/color.d.ts +64 -0
  472. package/dist/lib/color.js +177 -0
  473. package/dist/lib/compose-refs.d.ts +24 -0
  474. package/dist/lib/compose-refs.js +45 -0
  475. package/dist/lib/data-islands.d.ts +194 -0
  476. package/dist/lib/data-islands.js +368 -0
  477. package/dist/lib/date.d.ts +129 -0
  478. package/dist/lib/date.js +386 -0
  479. package/dist/lib/field-context.d.ts +64 -0
  480. package/dist/lib/field-context.js +62 -0
  481. package/dist/lib/floating-arrow.d.ts +18 -0
  482. package/dist/lib/floating-arrow.js +15 -0
  483. package/dist/lib/islands.d.ts +38 -0
  484. package/dist/lib/islands.js +40 -0
  485. package/dist/lib/labels.d.ts +51 -0
  486. package/dist/lib/labels.js +56 -0
  487. package/dist/lib/layer.d.ts +36 -0
  488. package/dist/lib/layer.js +42 -0
  489. package/dist/lib/locale.d.ts +85 -0
  490. package/dist/lib/locale.js +105 -0
  491. package/dist/lib/menu.d.ts +58 -0
  492. package/dist/lib/menu.js +99 -0
  493. package/dist/lib/message-format.d.ts +20 -0
  494. package/dist/lib/message-format.js +116 -0
  495. package/dist/lib/nav.d.ts +132 -0
  496. package/dist/lib/nav.js +178 -0
  497. package/dist/lib/provider.d.ts +100 -0
  498. package/dist/lib/provider.js +105 -0
  499. package/dist/lib/public.d.ts +22 -0
  500. package/dist/lib/public.js +33 -0
  501. package/dist/lib/sr-name.d.ts +18 -0
  502. package/dist/lib/sr-name.js +17 -0
  503. package/dist/lib/text.d.ts +100 -0
  504. package/dist/lib/text.js +233 -0
  505. package/dist/lib/theme-scope.d.ts +58 -0
  506. package/dist/lib/theme-scope.js +59 -0
  507. package/dist/lib/use-async-list.d.ts +60 -0
  508. package/dist/lib/use-async-list.js +119 -0
  509. package/dist/lib/use-container-width.d.ts +19 -0
  510. package/dist/lib/use-container-width.js +39 -0
  511. package/dist/lib/use-controllable-state.d.ts +33 -0
  512. package/dist/lib/use-controllable-state.js +56 -0
  513. package/dist/lib/use-edge-fade.d.ts +13 -0
  514. package/dist/lib/use-edge-fade.js +43 -0
  515. package/dist/lib/use-formatted-input.d.ts +69 -0
  516. package/dist/lib/use-formatted-input.js +152 -0
  517. package/dist/lib/use-hotkeys.d.ts +80 -0
  518. package/dist/lib/use-hotkeys.js +221 -0
  519. package/dist/lib/use-hover-intent.d.ts +44 -0
  520. package/dist/lib/use-hover-intent.js +119 -0
  521. package/dist/lib/use-media-query.d.ts +21 -0
  522. package/dist/lib/use-media-query.js +28 -0
  523. package/dist/lib/use-reduced-motion.d.ts +8 -0
  524. package/dist/lib/use-reduced-motion.js +13 -0
  525. package/dist/lib/use-tree.d.ts +153 -0
  526. package/dist/lib/use-tree.js +534 -0
  527. package/dist/lib/value-format.d.ts +25 -0
  528. package/dist/lib/value-format.js +56 -0
  529. package/dist/lib/variants.d.ts +131 -0
  530. package/dist/lib/variants.js +109 -0
  531. package/dist/locale-data/core/date.d.ts +24 -0
  532. package/dist/locale-data/core/date.js +68 -0
  533. package/dist/locale-data/core/decimal.d.ts +19 -0
  534. package/dist/locale-data/core/decimal.js +79 -0
  535. package/dist/locale-data/core/holidays.d.ts +30 -0
  536. package/dist/locale-data/core/holidays.js +79 -0
  537. package/dist/locale-data/core/iban.d.ts +29 -0
  538. package/dist/locale-data/core/iban.js +74 -0
  539. package/dist/locale-data/core/index.d.ts +7 -0
  540. package/dist/locale-data/core/index.js +6 -0
  541. package/dist/locale-data/core/types.d.ts +173 -0
  542. package/dist/locale-data/core/types.js +6 -0
  543. package/dist/locale-data/core/week-info.d.ts +23 -0
  544. package/dist/locale-data/core/week-info.js +85 -0
  545. package/dist/locale-data/core/working-days.d.ts +27 -0
  546. package/dist/locale-data/core/working-days.js +133 -0
  547. package/dist/locale-data/index.d.ts +2 -0
  548. package/dist/locale-data/index.js +4 -0
  549. package/dist/locale-data/tr/address-tr.json +1 -0
  550. package/dist/locale-data/tr/address.d.ts +23 -0
  551. package/dist/locale-data/tr/address.js +52 -0
  552. package/dist/locale-data/tr/holidays.d.ts +31 -0
  553. package/dist/locale-data/tr/holidays.js +81 -0
  554. package/dist/locale-data/tr/iban.d.ts +21 -0
  555. package/dist/locale-data/tr/iban.js +45 -0
  556. package/dist/locale-data/tr/id.d.ts +36 -0
  557. package/dist/locale-data/tr/id.js +120 -0
  558. package/dist/locale-data/tr/index.d.ts +12 -0
  559. package/dist/locale-data/tr/index.js +33 -0
  560. package/dist/locale-data/tr/kdv.d.ts +91 -0
  561. package/dist/locale-data/tr/kdv.js +222 -0
  562. package/dist/locales/en.d.ts +2102 -0
  563. package/dist/locales/en.js +2088 -0
  564. package/dist/locales/tr.d.ts +2086 -0
  565. package/dist/locales/tr.js +2087 -0
  566. package/dist/media/focal-point.d.ts +42 -0
  567. package/dist/media/focal-point.js +96 -0
  568. package/dist/media/gallery-layout.d.ts +19 -0
  569. package/dist/media/gallery-layout.js +61 -0
  570. package/dist/media/gallery.d.ts +64 -0
  571. package/dist/media/gallery.js +138 -0
  572. package/dist/media/image-cropper.d.ts +86 -0
  573. package/dist/media/image-cropper.js +170 -0
  574. package/dist/media/image-field.d.ts +115 -0
  575. package/dist/media/image-field.js +212 -0
  576. package/dist/media/index.d.ts +19 -0
  577. package/dist/media/index.js +23 -0
  578. package/dist/media/lightbox.d.ts +82 -0
  579. package/dist/media/lightbox.js +171 -0
  580. package/dist/media/link-preview.d.ts +97 -0
  581. package/dist/media/link-preview.js +177 -0
  582. package/dist/media/media-library.d.ts +244 -0
  583. package/dist/media/media-library.js +776 -0
  584. package/dist/media/media-picker.d.ts +96 -0
  585. package/dist/media/media-picker.js +209 -0
  586. package/dist/media/media-provider.d.ts +23 -0
  587. package/dist/media/media-provider.js +44 -0
  588. package/dist/media/media-utils.d.ts +39 -0
  589. package/dist/media/media-utils.js +145 -0
  590. package/dist/media/memory-adapter.d.ts +22 -0
  591. package/dist/media/memory-adapter.js +162 -0
  592. package/dist/media/rest-adapter.d.ts +90 -0
  593. package/dist/media/rest-adapter.js +208 -0
  594. package/dist/media/serp.d.ts +62 -0
  595. package/dist/media/serp.js +108 -0
  596. package/dist/media/test-fixtures.d.ts +3 -0
  597. package/dist/media/test-fixtures.js +37 -0
  598. package/dist/media/types.d.ts +183 -0
  599. package/dist/media/types.js +3 -0
  600. package/dist/media/use-pan-zoom.d.ts +51 -0
  601. package/dist/media/use-pan-zoom.js +156 -0
  602. package/dist/media/use-upload-queue.d.ts +64 -0
  603. package/dist/media/use-upload-queue.js +115 -0
  604. package/dist/media/video-player.d.ts +135 -0
  605. package/dist/media/video-player.js +319 -0
  606. package/dist/next/index.d.ts +42 -0
  607. package/dist/next/index.js +36 -0
  608. package/dist/render/block-renderer.d.ts +56 -0
  609. package/dist/render/block-renderer.js +137 -0
  610. package/dist/render/index.d.ts +6 -0
  611. package/dist/render/index.js +7 -0
  612. package/dist/render/prepare.d.ts +61 -0
  613. package/dist/render/prepare.js +119 -0
  614. package/dist/scheduler/core/duration.d.ts +83 -0
  615. package/dist/scheduler/core/duration.js +174 -0
  616. package/dist/scheduler/core/gantt.d.ts +63 -0
  617. package/dist/scheduler/core/gantt.js +226 -0
  618. package/dist/scheduler/core/index.d.ts +6 -0
  619. package/dist/scheduler/core/index.js +7 -0
  620. package/dist/scheduler/core/layout.d.ts +97 -0
  621. package/dist/scheduler/core/layout.js +249 -0
  622. package/dist/scheduler/core/time-scale.d.ts +89 -0
  623. package/dist/scheduler/core/time-scale.js +173 -0
  624. package/dist/scheduler/gantt.d.ts +125 -0
  625. package/dist/scheduler/gantt.js +532 -0
  626. package/dist/scheduler/index.d.ts +6 -0
  627. package/dist/scheduler/index.js +7 -0
  628. package/dist/scheduler/resource-calendar.d.ts +218 -0
  629. package/dist/scheduler/resource-calendar.js +661 -0
  630. package/dist/scheduler/scheduler.d.ts +168 -0
  631. package/dist/scheduler/scheduler.js +768 -0
  632. package/dist/scheduler/shared.d.ts +63 -0
  633. package/dist/scheduler/shared.js +145 -0
  634. package/dist/scheduler/time-tracker.d.ts +138 -0
  635. package/dist/scheduler/time-tracker.js +403 -0
  636. package/dist/sortable/core.d.ts +67 -0
  637. package/dist/sortable/core.js +167 -0
  638. package/dist/sortable/index.d.ts +8 -0
  639. package/dist/sortable/index.js +10 -0
  640. package/dist/sortable/kanban-core.d.ts +70 -0
  641. package/dist/sortable/kanban-core.js +67 -0
  642. package/dist/sortable/kanban.d.ts +147 -0
  643. package/dist/sortable/kanban.js +472 -0
  644. package/dist/sortable/sortable-list.d.ts +71 -0
  645. package/dist/sortable/sortable-list.js +76 -0
  646. package/dist/sortable/sortable-tree.d.ts +101 -0
  647. package/dist/sortable/sortable-tree.js +450 -0
  648. package/dist/sortable/sortable.d.ts +188 -0
  649. package/dist/sortable/sortable.js +485 -0
  650. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  651. package/dist/sortable/use-pointer-drag.js +173 -0
  652. package/dist/sortable/use-time-scale.d.ts +11 -0
  653. package/dist/sortable/use-time-scale.js +19 -0
  654. package/dist/styles/base.css +51 -0
  655. package/dist/styles/blocks.css +949 -0
  656. package/dist/styles/calendar.css +642 -0
  657. package/dist/styles/charts.css +264 -0
  658. package/dist/styles/data.css +474 -0
  659. package/dist/styles/editors.css +1022 -0
  660. package/dist/styles/forms.css +406 -0
  661. package/dist/styles/media.css +515 -0
  662. package/dist/styles/navigation.css +293 -0
  663. package/dist/styles/overlays.css +244 -0
  664. package/dist/styles.css +742 -0
  665. package/package.json +156 -4
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ import { type ChartProps } from "./chart-shell.js";
3
+ import type { ChartReference } from "./area-chart.js";
4
+ export interface BarChartProps<T extends object> extends Omit<ChartProps<T>, "children"> {
5
+ /** Keys to draw. Default: every config key. */
6
+ series?: string[];
7
+ /** `vertical` = columns (default), `horizontal` = rows growing from inline-start (rankings). */
8
+ layout?: "vertical" | "horizontal";
9
+ stack?: "none" | "stacked" | "percent";
10
+ /** Corner radius in px. Stacked bars round the outer segment only. Default 4. */
11
+ radius?: number;
12
+ /** Rows for which this returns true keep full colour; the rest are dimmed. */
13
+ highlight?: (row: T) => boolean;
14
+ /** Values printed on the bars. */
15
+ valueLabels?: boolean;
16
+ barSize?: "auto" | number;
17
+ reference?: ChartReference[];
18
+ }
19
+ /**
20
+ * Category comparison: grouped, stacked or 100% stacked; columns or ranked rows. Negative values get
21
+ * a prominent zero line.
22
+ *
23
+ * ```tsx
24
+ * <BarChart title="Won deals by rep" data={reps} x="rep" layout="horizontal" config={{ won: { label: "Won", format: "currency" } }} />
25
+ * ```
26
+ */
27
+ export declare function BarChart<T extends object>({ series, layout, stack, radius, highlight, valueLabels, barSize, reference, ...props }: BarChartProps<T>): React.JSX.Element;
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Bar, BarChart as RBarChart, Cell, LabelList, ReferenceLine } from "recharts";
5
+ import { Chart, useChart } from "./chart-shell.js";
6
+ import { ChartFrame, ChartGrid, ChartReferenceLine, ChartTooltip, ChartXAxis, ChartYAxis, useValueAxisWidth } from "./chart.js";
7
+ import { estimateAxisWidth, extent, formatValue, seriesColor } from "./utils.js";
8
+ /**
9
+ * Category comparison: grouped, stacked or 100% stacked; columns or ranked rows. Negative values get
10
+ * a prominent zero line.
11
+ *
12
+ * ```tsx
13
+ * <BarChart title="Won deals by rep" data={reps} x="rep" layout="horizontal" config={{ won: { label: "Won", format: "currency" } }} />
14
+ * ```
15
+ */
16
+ export function BarChart({ series, layout = "vertical", stack = "none", radius = 4, highlight, valueLabels, barSize = "auto", reference, ...props }) {
17
+ return (_jsx(Chart, { skeleton: layout === "horizontal" ? "bar-horizontal" : "bar", ...props, children: _jsx(BarPlot, { series: series, layout: layout, stack: stack, radius: radius, highlight: highlight, valueLabels: valueLabels, barSize: barSize, reference: reference }) }));
18
+ }
19
+ function BarPlot({ series: keys, layout, stack, radius = 4, highlight, valueLabels, barSize, reference }) {
20
+ const chart = useChart();
21
+ const all = chart.series.filter((s) => (keys ? keys.includes(s.key) : true));
22
+ const visible = all.filter((s) => !chart.isHidden(s.key));
23
+ const stacked = stack !== "none";
24
+ const percent = stack === "percent";
25
+ const horizontal = layout === "horizontal";
26
+ const [min] = extent(chart.data, visible.map((s) => s.key), stacked);
27
+ const valueWidth = useValueAxisWidth(visible.map((s) => s.key), { stacked, percent });
28
+ const categoryWidth = React.useMemo(() => (horizontal && chart.x ? Math.min(160, estimateAxisWidth(chart.data.map((r) => chart.formatX(r[chart.x])), 12)) : 0), [horizontal, chart]);
29
+ if (process.env.NODE_ENV !== "production" && chart.data.length > 20 && !horizontal) {
30
+ console.warn("[vamos-ui] BarChart: more than 20 categories — use layout=\"horizontal\" or group the tail into \"Other\".");
31
+ }
32
+ const lastKey = visible[visible.length - 1]?.key;
33
+ const r = (key) => {
34
+ if (stacked && key !== lastKey)
35
+ return [0, 0, 0, 0];
36
+ return horizontal ? [0, radius, radius, 0] : [radius, radius, 0, 0];
37
+ };
38
+ const tickPercent = (v) => chart.f.percent(v, { maximumFractionDigits: 0 });
39
+ return (_jsx(ChartFrame, { children: _jsxs(RBarChart, { data: chart.data, layout: horizontal ? "vertical" : "horizontal", stackOffset: percent ? "expand" : min < 0 && stacked ? "sign" : undefined, margin: { top: valueLabels && !horizontal ? 18 : 6, right: valueLabels && horizontal ? 48 : 8, bottom: 0, left: 0 }, barCategoryGap: horizontal ? "22%" : "28%", barGap: 3, children: [_jsx(ChartGrid, { vertical: horizontal, horizontal: !horizontal }), horizontal ? (_jsxs(_Fragment, { children: [_jsx(ChartXAxis, { type: "number", niceTicks: "snap125", dataKey: undefined, tickFormatter: percent ? tickPercent : (v) => chart.formatTick(v), minTickGap: 24 }), _jsx(ChartYAxis, { type: "category", dataKey: chart.x, width: categoryWidth, tickFormatter: (v) => chart.formatX(v), interval: 0 })] })) : (_jsxs(_Fragment, { children: [_jsx(ChartXAxis, {}), _jsx(ChartYAxis, { width: valueWidth, tickFormatter: percent ? tickPercent : undefined })] })), _jsx(ChartTooltip, { cursor: { fill: "var(--hover)" }, showTotal: stacked && !percent, showShare: percent }), min < 0 ? (horizontal ? _jsx(ReferenceLine, { x: 0, stroke: "var(--fg-subtle)", strokeWidth: 1 }) : _jsx(ReferenceLine, { y: 0, stroke: "var(--fg-subtle)", strokeWidth: 1 })) : null, reference?.map((ref, i) => (horizontal ? _jsx(ChartReferenceLine, { x: ref.y, label: ref.label, color: ref.color }, i) : _jsx(ChartReferenceLine, { y: ref.y, label: ref.label, color: ref.color, labelPosition: ref.labelPosition }, i))), all.map((s) => (_jsxs(Bar, { dataKey: s.key, name: s.label, hide: chart.isHidden(s.key), stackId: stacked ? "stack" : undefined, fill: seriesColor(s.key), radius: r(s.key), barSize: barSize === "auto" ? undefined : barSize, maxBarSize: horizontal ? 22 : 44, isAnimationActive: chart.animate, animationDuration: 500, onClick: chart.onPointClick ? (_, index) => chart.data[index] && chart.onPointClick?.(chart.data[index], s.key) : undefined, style: chart.onPointClick ? { cursor: "pointer" } : undefined, children: [highlight
40
+ ? chart.data.map((row, i) => (_jsx(Cell, { fill: highlight(row) ? seriesColor(s.key) : `color-mix(in oklch, ${seriesColor(s.key)} 35%, transparent)` }, i)))
41
+ : null, valueLabels && (!stacked || s.key === lastKey) ? (_jsx(LabelList, { dataKey: s.key, position: horizontal ? "right" : "top", offset: 6, className: "vui-chart-value-label", formatter: (v) => formatValue(chart.f, chart.config[s.key]?.format, v, { compact: true }) })) : null] }, s.key)))] }) }));
42
+ }
@@ -0,0 +1,47 @@
1
+ import * as React from "react";
2
+ import { type ChartLabels } from "./chart-shell.js";
3
+ import { type ChartColor, type FormatSpec } from "./utils.js";
4
+ export interface BarListItem {
5
+ key: string;
6
+ label: React.ReactNode;
7
+ /** Plain-text label for sorting and the accessible row text, when `label` is not a string. */
8
+ textLabel?: string;
9
+ value: number;
10
+ href?: string;
11
+ icon?: React.ReactNode;
12
+ /** Change vs the previous period, as a ratio (`0.12` → "+12%"). */
13
+ delta?: number;
14
+ }
15
+ export interface BarListProps extends Omit<React.HTMLAttributes<HTMLOListElement>, "onClick"> {
16
+ data: BarListItem[];
17
+ format?: FormatSpec;
18
+ /** Bar colour token. Default: the accent tint (`accent-soft`). */
19
+ color?: ChartColor;
20
+ /** Show the top N; the rest become "Other (12)". */
21
+ max?: number;
22
+ sort?: "desc" | "asc" | "none";
23
+ /** Adds each row's share of the total. */
24
+ showShare?: boolean;
25
+ /** Row activation. Rows with `href` render as links instead. */
26
+ onItemClick?: (item: BarListItem) => void;
27
+ size?: "sm" | "md";
28
+ /** `filled` puts the label on the bar; `track` draws a thin bar under the label. */
29
+ variant?: "filled" | "track";
30
+ loading?: boolean;
31
+ /** Rows of the loading skeleton. Default 5. */
32
+ loadingRows?: number;
33
+ /** Shown when `data` is empty. */
34
+ emptyMessage?: React.ReactNode;
35
+ labels?: Partial<ChartLabels>;
36
+ /** Accessible name of the list. */
37
+ "aria-label"?: string;
38
+ }
39
+ /**
40
+ * A ranked list with proportional bars — top pages, lead sources, referrers. Plain DOM (no chart
41
+ * library), so it is cheap enough for every dashboard card.
42
+ *
43
+ * ```tsx
44
+ * <BarList aria-label="Top sources" data={[{ key: "google", label: "Google", value: 4120 }]} showShare />
45
+ * ```
46
+ */
47
+ export declare const BarList: React.ForwardRefExoticComponent<BarListProps & React.RefAttributes<HTMLOListElement>>;
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { ArrowDownRight, ArrowUpRight } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useFormat, useLocale } from "../lib/locale.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { getCollator } from "../lib/text.js";
9
+ import { Skeleton } from "../components/skeleton.js";
10
+ import { chartLabels } from "./chart-shell.js";
11
+ import { formatValue, resolveChartColor } from "./utils.js";
12
+ const textOf = (item) => item.textLabel ?? (typeof item.label === "string" ? item.label : item.key);
13
+ /**
14
+ * A ranked list with proportional bars — top pages, lead sources, referrers. Plain DOM (no chart
15
+ * library), so it is cheap enough for every dashboard card.
16
+ *
17
+ * ```tsx
18
+ * <BarList aria-label="Top sources" data={[{ key: "google", label: "Google", value: 4120 }]} showShare />
19
+ * ```
20
+ */
21
+ export const BarList = React.forwardRef(function BarList({ data, format = "number", color, max, sort = "desc", showShare, onItemClick, size = "md", variant = "filled", loading, loadingRows = 5, emptyMessage, labels, className, ...props }, ref) {
22
+ const f = useFormat();
23
+ const { locale } = useLocale();
24
+ const t = useLabels("chart", chartLabels, labels);
25
+ const rows = React.useMemo(() => {
26
+ const collator = getCollator(locale);
27
+ const sorted = sort === "none" ? [...data] : [...data].sort((a, b) => (sort === "desc" ? b.value - a.value : a.value - b.value) || collator.compare(textOf(a), textOf(b)));
28
+ if (max && sorted.length > max) {
29
+ const rest = sorted.slice(max);
30
+ const other = { key: "__other", label: t("otherCount", { count: rest.length }), value: rest.reduce((s, r) => s + r.value, 0) };
31
+ return [...sorted.slice(0, max), other];
32
+ }
33
+ return sorted;
34
+ }, [data, sort, max, locale, t]);
35
+ const total = rows.reduce((s, r) => s + Math.max(0, r.value), 0);
36
+ const top = rows.reduce((m, r) => Math.max(m, r.value), 0) || 1;
37
+ const rowH = size === "sm" ? "h-7" : "h-8";
38
+ const barColor = color ? resolveChartColor(color) : undefined;
39
+ if (loading)
40
+ return (_jsxs("div", { "aria-busy": true, className: cn("grid gap-1.5", className), children: [_jsx("span", { role: "status", className: "sr-only", children: t("loading") }), Array.from({ length: loadingRows }, (_, i) => (_jsx(Skeleton, { className: cn(rowH), style: { width: `${96 - i * (70 / loadingRows)}%` } }, i)))] }));
41
+ if (!rows.length)
42
+ return _jsx("p", { className: cn("py-6 text-center text-[13px] text-fg-muted", className), children: emptyMessage ?? t("empty") });
43
+ return (_jsx("ol", { ref: ref, "data-slot": "bar-list", "data-variant": variant, className: cn("vui-bar-list grid gap-1", size === "sm" ? "text-[12.5px]" : "text-[13px]", className), ...props, children: rows.map((item) => {
44
+ const width = `${Math.max(0, (item.value / top) * 100)}%`;
45
+ const valueText = formatValue(f, format, item.value);
46
+ const share = total ? f.percent(item.value / total) : undefined;
47
+ const deltaText = item.delta !== undefined ? `${item.delta >= 0 ? "+" : "−"}${f.percent(Math.abs(item.delta))}` : undefined;
48
+ const srText = [textOf(item), valueText, showShare ? share : undefined, deltaText].filter(Boolean).join(", ");
49
+ const isOther = item.key === "__other";
50
+ const interactive = Boolean(item.href || (onItemClick && !isOther));
51
+ const inner = (_jsxs(_Fragment, { children: [variant === "filled" ? (_jsx("span", { "aria-hidden": true, className: cn("vui-bar-list-bar absolute inset-y-0 start-0 rounded-ui-sm", !barColor && "bg-accent-soft", isOther && "opacity-60"), style: { width, ...(barColor ? { background: `color-mix(in oklch, ${barColor} 24%, transparent)` } : null) } })) : null, _jsxs("span", { className: "relative flex min-w-0 flex-1 items-center gap-2 ps-2.5", children: [item.icon ? _jsx("span", { className: "flex size-4 shrink-0 items-center justify-center [&>img]:size-4 [&>img]:rounded-[3px] [&>svg]:size-3.5 text-fg-muted", children: item.icon }) : null, _jsx("span", { className: cn("truncate", isOther ? "text-fg-muted" : "text-fg"), title: textOf(item), children: item.label })] }), variant === "track" ? (_jsx("span", { "aria-hidden": true, className: "absolute inset-x-2.5 bottom-0.5 h-1 overflow-hidden rounded-full bg-track", children: _jsx("span", { className: cn("block h-full rounded-full", !barColor && "bg-accent-ink"), style: { width, ...(barColor ? { background: barColor } : null) } }) })) : null, _jsxs("span", { className: "relative flex shrink-0 items-center gap-3 pe-2.5 font-mono text-[12.5px] tabular", children: [item.delta !== undefined ? _jsx(BarListDelta, { value: item.delta, format: (v) => f.percent(Math.abs(v)) }) : null, _jsx("span", { className: "text-fg", children: valueText }), showShare ? _jsx("span", { className: "w-11 text-end text-fg-subtle", children: share }) : null] })] }));
52
+ const rowClass = cn("relative flex w-full items-center gap-3 rounded-ui-sm text-start", rowH, variant === "track" && "pb-1.5");
53
+ return (_jsxs("li", { className: "relative", children: [interactive ? null : _jsx("span", { className: "sr-only", children: srText }), item.href ? (_jsx("a", { href: item.href, "aria-label": srText, className: cn(rowClass, "transition-colors focus-ring hover:bg-hover"), children: inner })) : onItemClick && !isOther ? (_jsx("button", { type: "button", "aria-label": srText, onClick: () => onItemClick(item), className: cn(rowClass, "transition-colors focus-ring hover:bg-hover"), children: inner })) : (_jsx("div", { "aria-hidden": true, className: rowClass, children: inner }))] }, item.key));
54
+ }) }));
55
+ });
56
+ function BarListDelta({ value, format }) {
57
+ const up = value >= 0;
58
+ const Icon = up ? ArrowUpRight : ArrowDownRight;
59
+ return (_jsxs("span", { className: cn("inline-flex items-center gap-0.5 text-[11.5px]", up ? "text-success" : "text-danger"), children: [_jsx(Icon, { "aria-hidden": true, className: "size-3" }), up ? "+" : "−", format(value)] }));
60
+ }
@@ -0,0 +1,173 @@
1
+ import * as React from "react";
2
+ import { type LabelFn } from "../lib/labels.js";
3
+ import type { Formatter } from "../format/core.js";
4
+ import { patternDash, type ChartConfig, type ChartHeight, type ChartState, type FormatSpec, type ResolvedSeries } from "./utils.js";
5
+ export declare const chartLabels: {
6
+ viewTable: string;
7
+ viewChart: string;
8
+ legend: string;
9
+ empty: string;
10
+ error: string;
11
+ retry: string;
12
+ loading: string;
13
+ refreshing: string;
14
+ total: string;
15
+ other: string;
16
+ otherCount: string;
17
+ share: string;
18
+ category: string;
19
+ value: string;
20
+ range: string;
21
+ seriesSummary: string;
22
+ };
23
+ export type ChartLabels = typeof chartLabels;
24
+ export type ChartSkeletonKind = "area" | "line" | "bar" | "bar-horizontal" | "donut" | "grid";
25
+ export interface ChartTableColumn {
26
+ key: string;
27
+ label: string;
28
+ format?: FormatSpec;
29
+ /** Row header column (first column). */
30
+ header?: boolean;
31
+ }
32
+ /** Overrides the generated data table (columns + rows). */
33
+ export interface ChartTableSpec {
34
+ columns: ChartTableColumn[];
35
+ rows: Record<string, unknown>[];
36
+ }
37
+ type Row = Record<string, unknown>;
38
+ export interface ChartContextValue {
39
+ config: ChartConfig;
40
+ series: ResolvedSeries[];
41
+ visibleSeries: ResolvedSeries[];
42
+ isHidden: (key: string) => boolean;
43
+ toggleSeries: (key: string) => void;
44
+ data: Row[];
45
+ x?: string;
46
+ xFormat?: FormatSpec;
47
+ yFormat?: FormatSpec;
48
+ /** Full value of a series ("$1,240.00"). */
49
+ formatSeries: (key: string, value: unknown) => string;
50
+ /** Compact value-axis tick ("$1.2K"). */
51
+ formatTick: (value: unknown, spec?: FormatSpec) => string;
52
+ /** x value; `long` for tooltip headers and tables ("Nov 1, 2026"). */
53
+ formatX: (value: unknown, long?: boolean) => string;
54
+ f: Formatter;
55
+ t: LabelFn<ChartLabels>;
56
+ /** `animate` resolved against `prefers-reduced-motion`. */
57
+ animate: boolean;
58
+ tooltipIndicator: "dot" | "line" | "dashed";
59
+ onPointClick?: (row: Row, seriesKey: string) => void;
60
+ height: number | undefined;
61
+ idPrefix: string;
62
+ }
63
+ /** Chart context: config, formatters and hidden series. Use inside `<Chart>`. */
64
+ export declare function useChart(): ChartContextValue;
65
+ /** Like `useChart`, but `null` outside a Chart. */
66
+ export declare const useOptionalChart: () => ChartContextValue | null;
67
+ export interface ChartProps<T extends object = Row> extends Omit<React.HTMLAttributes<HTMLElement>, "title" | "children" | "onClick"> {
68
+ data: T[];
69
+ config: ChartConfig;
70
+ /** Category / time key of a row. */
71
+ x?: keyof T & string;
72
+ /** Header of the x column in the data table. Default: the x key, capitalised. */
73
+ xLabel?: string;
74
+ xFormat?: FormatSpec;
75
+ /** Value axis format. Default: the first series' format, compact. */
76
+ yFormat?: FormatSpec;
77
+ /** Plot height: presets sm 160 / md 260 / lg 360 or pixels. Set this or `aspect` (no layout shift). `"auto"` sizes to the content (DOM charts such as Heatmap). */
78
+ height?: ChartHeight | "auto";
79
+ /** Width / height ratio instead of a fixed height. */
80
+ aspect?: number;
81
+ /** Loading / refreshing / empty / error. Default: empty when `data` is empty, else ready. */
82
+ state?: ChartState;
83
+ /** Accessible name and table caption (not shown — put a visible title in the Card header). */
84
+ title: string;
85
+ /** Text alternative. Default: generated from the data (range, low, high, average). */
86
+ summary?: string | ((data: T[]) => string);
87
+ /** Shows a "View as table" switch. The table is always in the page for screen readers. */
88
+ tableToggle?: boolean;
89
+ /** Default `"top"` with 2+ series, `"none"` with one. */
90
+ legend?: "top" | "bottom" | "none";
91
+ tooltipIndicator?: "dot" | "line" | "dashed";
92
+ /** Transitions on data change. Always off under reduced motion. Default `true`. */
93
+ animate?: boolean;
94
+ /** Drill-down. Also makes the rows of the visible data table activatable. */
95
+ onPointClick?: (row: T, seriesKey: string) => void;
96
+ /** Controlled hidden series. */
97
+ hiddenSeries?: string[];
98
+ defaultHiddenSeries?: string[];
99
+ onHiddenSeriesChange?: (keys: string[]) => void;
100
+ labels?: Partial<ChartLabels>;
101
+ /** Replace the generated data table. */
102
+ table?: ChartTableSpec;
103
+ /** Content beside (or under) the plot — e.g. the Donut legend list. */
104
+ aside?: React.ReactNode;
105
+ asidePosition?: "side" | "bottom";
106
+ /** Shape of the loading skeleton. Default `"area"`. */
107
+ skeleton?: ChartSkeletonKind;
108
+ /** Extra controls at the end of the toolbar (range picker…). */
109
+ toolbar?: React.ReactNode;
110
+ /** Plot content: a ready chart's Recharts tree, `<ChartFrame>` with raw Recharts, or any SVG. */
111
+ children?: React.ReactNode;
112
+ }
113
+ /**
114
+ * The shell every chart shares: series → token colours (`--series-<key>`), locale formatting,
115
+ * an interactive legend, loading / refreshing / empty / error states, a generated text summary and
116
+ * a data-table alternative.
117
+ *
118
+ * ```tsx
119
+ * <Chart title="Visits" data={rows} config={{ visits: { label: "Visits" } }} x="date" height="md">
120
+ * <ChartFrame><RAreaChart data={rows}>…</RAreaChart></ChartFrame>
121
+ * </Chart>
122
+ * ```
123
+ */
124
+ export declare function Chart<T extends object>(props: ChartProps<T>): React.JSX.Element;
125
+ export interface ChartLegendContentProps extends React.HTMLAttributes<HTMLDivElement> {
126
+ /** Keys to list. Default: every series of the config. */
127
+ keys?: string[];
128
+ /** Click toggles visibility. Default `true`. */
129
+ interactive?: boolean;
130
+ /** Swatch shape. Default: a line for line/area patterns, a dot otherwise. */
131
+ swatch?: "dot" | "line";
132
+ }
133
+ /** The legend: one toggle per series (`aria-pressed`). At least one series always stays visible. */
134
+ export declare function ChartLegendContent({ keys, interactive, swatch, className, ...props }: ChartLegendContentProps): React.JSX.Element;
135
+ /** Swatch used by tooltips and lists: `dot`, `line` or `dashed`. */
136
+ export declare function ChartIndicator({ color, variant, pattern }: {
137
+ color: string;
138
+ variant?: "dot" | "line" | "dashed";
139
+ pattern?: ResolvedSeries["pattern"];
140
+ }): React.JSX.Element;
141
+ /** Chart-shaped loading placeholder (wave, bars, ring or grid) — never a spinner. */
142
+ export declare function ChartSkeleton({ kind, label, className }: {
143
+ kind?: ChartSkeletonKind;
144
+ label?: string;
145
+ className?: string;
146
+ }): React.JSX.Element;
147
+ /** Thin indeterminate bar on top of a chart that is refetching (old data stays, dimmed). */
148
+ export declare function ChartRefreshBar({ label, className }: {
149
+ label?: string;
150
+ className?: string;
151
+ }): React.JSX.Element;
152
+ /** Empty state that keeps the chart height: a quiet message and an optional action. */
153
+ export declare function ChartEmpty({ message, action, className }: {
154
+ message?: React.ReactNode;
155
+ action?: React.ReactNode;
156
+ className?: string;
157
+ }): React.JSX.Element;
158
+ /** Error state: icon, message and a retry action. */
159
+ export declare function ChartError({ message, onRetry, retryLabel, className }: {
160
+ message?: React.ReactNode;
161
+ onRetry?: () => void;
162
+ retryLabel?: string;
163
+ className?: string;
164
+ }): React.JSX.Element;
165
+ export interface ChartDataTableProps extends React.HTMLAttributes<HTMLDivElement> {
166
+ caption: string;
167
+ spec: ChartTableSpec;
168
+ /** Makes each row header a button (drill-down without a pointer). */
169
+ onRowClick?: (row: Record<string, unknown>) => void;
170
+ }
171
+ /** The accessible alternative of a chart: same numbers, same formatters, as a real `<table>`. */
172
+ export declare function ChartDataTable({ caption, spec, onRowClick, className, ...props }: ChartDataTableProps): React.JSX.Element;
173
+ export { patternDash };
@@ -0,0 +1,205 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // The Chart shell — context, legend, states, data-table alternative. No Recharts import here,
4
+ // so SVG/DOM charts (Heatmap) can reuse it without loading the chart library.
5
+ import * as React from "react";
6
+ import { CircleAlert, Table2, ChartColumnBig } from "lucide-react";
7
+ import { cn } from "../lib/cn.js";
8
+ import { useFormat } from "../lib/locale.js";
9
+ import { useLabels } from "../lib/labels.js";
10
+ import { useControllableState } from "../lib/use-controllable-state.js";
11
+ import { useReducedMotion } from "../lib/use-reduced-motion.js";
12
+ import { Button } from "../components/button.js";
13
+ import { CHART_HEIGHTS, formatCategory, formatValue, patternDash, resolveChartColor, resolveSeries, seriesColor, seriesVarName, summarizeSeries, } from "./utils.js";
14
+ export const chartLabels = {
15
+ viewTable: "View as table",
16
+ viewChart: "View as chart",
17
+ legend: "Series",
18
+ empty: "No data for this range",
19
+ error: "This chart couldn't load.",
20
+ retry: "Try again",
21
+ loading: "Loading chart…",
22
+ refreshing: "Updating…",
23
+ total: "Total",
24
+ other: "Other",
25
+ otherCount: "Other ({count})",
26
+ share: "Share",
27
+ category: "Category",
28
+ value: "Value",
29
+ range: "{from} – {to}.",
30
+ seriesSummary: "{label}: low {min} ({minAt}), high {max} ({maxAt}), average {avg}.",
31
+ };
32
+ const ChartContext = React.createContext(null);
33
+ /** Chart context: config, formatters and hidden series. Use inside `<Chart>`. */
34
+ export function useChart() {
35
+ const ctx = React.useContext(ChartContext);
36
+ if (!ctx)
37
+ throw new Error("useChart must be used inside <Chart>.");
38
+ return ctx;
39
+ }
40
+ /** Like `useChart`, but `null` outside a Chart. */
41
+ export const useOptionalChart = () => React.useContext(ChartContext);
42
+ const capitalise = (s) => (s ? s[0].toUpperCase() + s.slice(1) : s);
43
+ /**
44
+ * The shell every chart shares: series → token colours (`--series-<key>`), locale formatting,
45
+ * an interactive legend, loading / refreshing / empty / error states, a generated text summary and
46
+ * a data-table alternative.
47
+ *
48
+ * ```tsx
49
+ * <Chart title="Visits" data={rows} config={{ visits: { label: "Visits" } }} x="date" height="md">
50
+ * <ChartFrame><RAreaChart data={rows}>…</RAreaChart></ChartFrame>
51
+ * </Chart>
52
+ * ```
53
+ */
54
+ export function Chart(props) {
55
+ const { data: dataProp, config, x, xLabel, xFormat, yFormat, height, aspect, state: stateProp, title, summary, tableToggle, legend, tooltipIndicator = "dot", animate = true, onPointClick, hiddenSeries, defaultHiddenSeries, onHiddenSeriesChange, labels, table, aside, asidePosition = "side", skeleton = "area", toolbar, className, style, children, ...rest } = props;
56
+ const data = dataProp;
57
+ const f = useFormat();
58
+ const t = useLabels("chart", chartLabels, labels);
59
+ const reduced = useReducedMotion();
60
+ const rawId = React.useId();
61
+ const idPrefix = `vc${rawId.replace(/[^a-zA-Z0-9]/g, "")}`;
62
+ const series = React.useMemo(() => resolveSeries(config), [config]);
63
+ const [hidden, setHidden] = useControllableState({
64
+ value: hiddenSeries,
65
+ defaultValue: () => defaultHiddenSeries ?? series.filter((s) => s.hidden).map((s) => s.key),
66
+ onChange: onHiddenSeriesChange,
67
+ name: "Chart",
68
+ });
69
+ const hiddenSet = React.useMemo(() => new Set(hidden), [hidden]);
70
+ const visibleSeries = React.useMemo(() => series.filter((s) => !hiddenSet.has(s.key)), [series, hiddenSet]);
71
+ const toggleSeries = React.useCallback((key) => setHidden((prev) => {
72
+ if (prev.includes(key))
73
+ return prev.filter((k) => k !== key);
74
+ // at least one series stays visible
75
+ if (series.filter((s) => !prev.includes(s.key)).length <= 1)
76
+ return prev;
77
+ return [...prev, key];
78
+ }), [setHidden, series]);
79
+ const status = stateProp ?? (data.length === 0 ? { status: "empty" } : { status: "ready" });
80
+ const [showTable, setShowTable] = React.useState(false);
81
+ const seriesFormat = React.useCallback((key) => config[key]?.format, [config]);
82
+ const ctx = React.useMemo(() => ({
83
+ config,
84
+ series,
85
+ visibleSeries,
86
+ isHidden: (k) => hiddenSet.has(k),
87
+ toggleSeries,
88
+ data,
89
+ x,
90
+ xFormat,
91
+ yFormat: yFormat ?? series[0]?.format,
92
+ formatSeries: (key, v) => formatValue(f, seriesFormat(key), v),
93
+ formatTick: (v, spec) => formatValue(f, spec ?? yFormat ?? series[0]?.format, v, { compact: true }),
94
+ formatX: (v, long) => formatCategory(f, xFormat, v, long),
95
+ f,
96
+ t,
97
+ animate: animate && !reduced,
98
+ tooltipIndicator,
99
+ onPointClick: onPointClick,
100
+ height: height === "auto" ? undefined : typeof height === "string" ? CHART_HEIGHTS[height] : height,
101
+ idPrefix,
102
+ }), [config, series, visibleSeries, hiddenSet, toggleSeries, data, x, xFormat, yFormat, f, t, animate, reduced, tooltipIndicator, onPointClick, height, idPrefix, seriesFormat]);
103
+ const vars = React.useMemo(() => {
104
+ const out = {};
105
+ for (const s of series)
106
+ out[seriesVarName(s.key)] = resolveChartColor(s.color);
107
+ return out;
108
+ }, [series]);
109
+ const summaryText = React.useMemo(() => {
110
+ if (typeof summary === "function")
111
+ return summary(dataProp);
112
+ if (typeof summary === "string")
113
+ return summary;
114
+ return summarizeSeries({ f, rows: data, series: visibleSeries, x, xFormat, templates: { range: t.labels.range, series: t.labels.seriesSummary } });
115
+ }, [summary, dataProp, data, f, visibleSeries, x, xFormat, t]);
116
+ const tableSpec = React.useMemo(() => table ?? {
117
+ columns: [
118
+ ...(x ? [{ key: x, label: xLabel ?? capitalise(x), header: true, format: xFormat }] : []),
119
+ ...series.map((s) => ({ key: s.key, label: s.label, format: s.format })),
120
+ ],
121
+ rows: data,
122
+ }, [table, x, xLabel, xFormat, series, data]);
123
+ const legendPos = legend ?? (series.length > 1 ? "top" : "none");
124
+ const summaryId = `${idPrefix}-summary`;
125
+ const plotHeight = ctx.height;
126
+ const busy = status.status === "loading" || status.status === "refreshing";
127
+ const showToolbar = legendPos === "top" || tableToggle || toolbar;
128
+ let body;
129
+ if (status.status === "loading")
130
+ body = _jsx(ChartSkeleton, { kind: skeleton, label: t("loading") });
131
+ else if (status.status === "empty")
132
+ body = _jsx(ChartEmpty, { message: status.message ?? t("empty"), action: status.action });
133
+ else if (status.status === "error")
134
+ body = _jsx(ChartError, { message: status.message ?? t("error"), onRetry: status.onRetry, retryLabel: t("retry") });
135
+ else if (showTable)
136
+ body = _jsx(ChartDataTable, { caption: title, spec: tableSpec, onRowClick: onPointClick ? (row) => onPointClick(row, visibleSeries[0]?.key ?? "") : undefined, className: cn("overflow-auto", height === "auto" ? "max-h-96" : "h-full") });
137
+ else
138
+ body = (_jsxs(_Fragment, { children: [status.status === "refreshing" ? _jsx(ChartRefreshBar, { label: t("refreshing") }) : null, _jsx("div", { className: cn("size-full transition-opacity duration-200", status.status === "refreshing" && "opacity-60"), children: children })] }));
139
+ const plot = (_jsx("div", { "data-slot": "chart-body", "data-state": status.status, "aria-busy": busy || undefined, className: cn("vui-chart-body relative min-w-0", aside && asidePosition === "side" ? "flex-1" : "w-full"), style: height === "auto"
140
+ ? status.status === "ready" || status.status === "refreshing"
141
+ ? undefined
142
+ : { minHeight: CHART_HEIGHTS.sm }
143
+ : plotHeight !== undefined
144
+ ? { height: plotHeight }
145
+ : aspect
146
+ ? { aspectRatio: String(aspect) }
147
+ : { height: CHART_HEIGHTS.md }, children: body }));
148
+ return (_jsx(ChartContext.Provider, { value: ctx, children: _jsxs("figure", { "data-slot": "chart", "aria-label": title, "aria-describedby": summaryText ? summaryId : undefined, className: cn("vui-chart m-0 grid min-w-0 gap-3", className), style: { ...vars, ...style }, ...rest, children: [showToolbar ? (_jsxs("div", { "data-slot": "chart-toolbar", className: "flex min-h-7 flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [legendPos === "top" ? _jsx(ChartLegendContent, {}) : _jsx("span", {}), tableToggle || toolbar ? (_jsxs("div", { className: "flex items-center gap-1.5", children: [toolbar, tableToggle ? (_jsxs(Button, { size: "xs", variant: "ghost", "aria-pressed": showTable, onClick: () => setShowTable((v) => !v), className: "text-fg-muted", children: [showTable ? _jsx(ChartColumnBig, { className: "size-3.5" }) : _jsx(Table2, { className: "size-3.5" }), showTable ? t("viewChart") : t("viewTable")] })) : null] })) : null] })) : null, aside ? (_jsx("div", { className: cn("@container"), children: _jsxs("div", { className: cn("flex flex-col gap-5", asidePosition === "side" && "@md:flex-row @md:items-center"), children: [plot, _jsx("div", { "data-slot": "chart-aside", className: cn("min-w-0", asidePosition === "side" && "@md:w-[min(46%,18rem)]"), children: aside })] }) })) : (plot), legendPos === "bottom" ? _jsx(ChartLegendContent, { className: "justify-center" }) : null, summaryText ? (_jsx("p", { id: summaryId, className: "sr-only", children: summaryText })) : null, !showTable && status.status !== "loading" && status.status !== "error" && tableSpec.rows.length ? _jsx(ChartDataTable, { caption: title, spec: tableSpec, className: "sr-only" }) : null] }) }));
149
+ }
150
+ /** The legend: one toggle per series (`aria-pressed`). At least one series always stays visible. */
151
+ export function ChartLegendContent({ keys, interactive = true, swatch, className, ...props }) {
152
+ const { series, isHidden, toggleSeries, visibleSeries, t } = useChart();
153
+ const items = keys ? series.filter((s) => keys.includes(s.key)) : series;
154
+ return (_jsx("div", { role: "group", "aria-label": t("legend"), "data-slot": "chart-legend", className: cn("flex flex-wrap items-center gap-x-1 gap-y-1", className), ...props, children: items.map((s) => {
155
+ const hidden = isHidden(s.key);
156
+ const locked = !hidden && visibleSeries.length <= 1;
157
+ const Icon = s.icon;
158
+ const content = (_jsxs(_Fragment, { children: [Icon ? _jsx(Icon, { className: "size-3.5" }) : _jsx(LegendSwatch, { color: seriesColor(s.key), pattern: s.pattern, shape: swatch ?? (s.pattern !== "solid" ? "line" : "dot") }), _jsx("span", { className: cn(hidden && "line-through decoration-fg-subtle"), children: s.label })] }));
159
+ if (!interactive)
160
+ return (_jsx("span", { className: "inline-flex items-center gap-1.5 px-1.5 text-[12.5px] text-fg-muted", children: content }, s.key));
161
+ return (_jsx("button", { type: "button", "aria-pressed": !hidden, "aria-disabled": locked || undefined, onClick: () => toggleSeries(s.key), className: cn("inline-flex h-7 items-center gap-1.5 rounded-ui-sm px-2 text-[12.5px] text-fg-muted transition-[color,background-color,opacity] focus-ring hover:bg-hover hover:text-fg", hidden && "opacity-55", locked && "cursor-default hover:bg-transparent"), children: content }, s.key));
162
+ }) }));
163
+ }
164
+ function LegendSwatch({ color, pattern, shape }) {
165
+ if (shape === "line")
166
+ return (_jsx("svg", { width: "14", height: "8", viewBox: "0 0 14 8", "aria-hidden": true, className: "shrink-0", children: _jsx("line", { x1: "1", y1: "4", x2: "13", y2: "4", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeDasharray: pattern === "dashed" ? "4 3" : pattern === "dotted" ? "0.5 3" : undefined }) }));
167
+ return _jsx("span", { "aria-hidden": true, className: "size-2 shrink-0 rounded-[3px]", style: { background: color } });
168
+ }
169
+ /** Swatch used by tooltips and lists: `dot`, `line` or `dashed`. */
170
+ export function ChartIndicator({ color, variant = "dot", pattern }) {
171
+ if (variant === "line" || variant === "dashed")
172
+ return (_jsx("svg", { width: "12", height: "10", viewBox: "0 0 12 10", "aria-hidden": true, className: "shrink-0", children: _jsx("line", { x1: "1", y1: "5", x2: "11", y2: "5", stroke: color, strokeWidth: "2.25", strokeLinecap: "round", strokeDasharray: variant === "dashed" || pattern === "dashed" ? "3 2.5" : pattern === "dotted" ? "0.5 3" : undefined }) }));
173
+ return _jsx("span", { "aria-hidden": true, className: "size-2 shrink-0 rounded-[3px]", style: { background: color } });
174
+ }
175
+ /* ------------------------------------------------------------------ */
176
+ /* States */
177
+ /* ------------------------------------------------------------------ */
178
+ const BAR_HEIGHTS = [42, 64, 50, 78, 58, 88, 70, 54, 82, 66, 92, 60];
179
+ /** Chart-shaped loading placeholder (wave, bars, ring or grid) — never a spinner. */
180
+ export function ChartSkeleton({ kind = "area", label, className }) {
181
+ return (_jsxs("div", { "data-slot": "chart-skeleton", "data-kind": kind, className: cn("vui-chart-skeleton absolute inset-0 flex", className), children: [label ? (_jsx("span", { role: "status", className: "sr-only", children: label })) : null, kind === "bar" ? (_jsx("div", { "aria-hidden": true, className: "flex size-full items-end gap-[3%] ps-10 pb-6", children: BAR_HEIGHTS.map((h, i) => (_jsx("div", { className: "ui-shimmer flex-1 rounded-t-[4px] bg-skeleton", style: { height: `${h}%` } }, i))) })) : kind === "bar-horizontal" ? (_jsx("div", { "aria-hidden": true, className: "flex size-full flex-col justify-around gap-2 py-2 ps-20", children: [92, 76, 64, 50, 38, 26].map((w, i) => (_jsx("div", { className: "ui-shimmer h-[9%] min-h-2 rounded-e-[4px] bg-skeleton", style: { width: `${w}%` } }, i))) })) : kind === "donut" ? (_jsx("div", { "aria-hidden": true, className: "grid size-full place-items-center", children: _jsx("div", { className: "vui-chart-skeleton-ring ui-shimmer aspect-square h-[82%] max-h-full rounded-full bg-skeleton" }) })) : kind === "grid" ? (_jsx("div", { "aria-hidden": true, className: "vui-chart-skeleton-grid ui-shimmer size-full rounded-ui-sm" })) : (_jsx("div", { "aria-hidden": true, className: "flex size-full flex-col ps-10 pb-6", children: _jsx("div", { className: cn("ui-shimmer mt-auto h-[78%] w-full bg-skeleton", kind === "line" ? "vui-chart-skeleton-line" : "vui-chart-skeleton-wave") }) }))] }));
182
+ }
183
+ /** Thin indeterminate bar on top of a chart that is refetching (old data stays, dimmed). */
184
+ export function ChartRefreshBar({ label, className }) {
185
+ return (_jsxs("div", { "data-slot": "chart-refresh", className: cn("absolute inset-x-0 top-0 z-10 h-0.5 overflow-hidden rounded-full bg-track", className), children: [label ? (_jsx("span", { role: "status", className: "sr-only", children: label })) : null, _jsx("div", { "aria-hidden": true, className: "vui-chart-refresh-bar h-full w-2/5 rounded-full bg-accent-ink" })] }));
186
+ }
187
+ /** Empty state that keeps the chart height: a quiet message and an optional action. */
188
+ export function ChartEmpty({ message, action, className }) {
189
+ return (_jsxs("div", { "data-slot": "chart-empty", className: cn("absolute inset-0 grid place-items-center", className), children: [_jsx("div", { "aria-hidden": true, className: "vui-chart-empty-grid absolute inset-0" }), _jsxs("div", { className: "relative flex flex-col items-center gap-2.5 px-6 text-center", children: [_jsx("p", { className: "text-[13px] text-fg-muted", children: message }), action] })] }));
190
+ }
191
+ /** Error state: icon, message and a retry action. */
192
+ export function ChartError({ message, onRetry, retryLabel = "Try again", className }) {
193
+ return (_jsx("div", { "data-slot": "chart-error", role: "alert", className: cn("absolute inset-0 grid place-items-center", className), children: _jsxs("div", { className: "flex flex-col items-center gap-2.5 px-6 text-center", children: [_jsx(CircleAlert, { "aria-hidden": true, className: "size-5 text-danger" }), _jsx("p", { className: "max-w-xs text-[13px] text-fg-muted", children: message }), onRetry ? (_jsx(Button, { size: "sm", onClick: onRetry, children: retryLabel })) : null] }) }));
194
+ }
195
+ /** The accessible alternative of a chart: same numbers, same formatters, as a real `<table>`. */
196
+ export function ChartDataTable({ caption, spec, onRowClick, className, ...props }) {
197
+ const f = useFormat();
198
+ return (_jsx("div", { "data-slot": "chart-table", className: cn("min-w-0", className), ...props, children: _jsxs("table", { className: "w-full border-collapse text-[13px]", children: [_jsx("caption", { className: "sr-only", children: caption }), _jsx("thead", { children: _jsx("tr", { children: spec.columns.map((c, i) => (_jsx("th", { scope: "col", className: cn("sticky top-0 z-[1] border-b border-line bg-[var(--chart-tooltip)] px-3 py-2 text-[12px] font-medium whitespace-nowrap text-fg-muted", i === 0 ? "text-start" : "text-end"), children: c.label }, c.key))) }) }), _jsx("tbody", { children: spec.rows.map((row, ri) => (_jsx("tr", { className: "border-b border-line last:border-b-0", children: spec.columns.map((c, ci) => {
199
+ const text = c.header ? formatCategory(f, c.format, row[c.key], true) : formatValue(f, c.format, row[c.key]);
200
+ if (ci === 0 || c.header)
201
+ return (_jsx("th", { scope: "row", className: "px-3 py-1.5 text-start font-normal whitespace-nowrap text-fg", children: onRowClick ? (_jsx("button", { type: "button", onClick: () => onRowClick(row), className: "rounded-ui-sm text-start text-accent-ink underline-offset-4 focus-ring hover:underline", children: text })) : (text) }, c.key));
202
+ return (_jsx("td", { className: "px-3 py-1.5 text-end font-mono text-[12.5px] whitespace-nowrap text-fg tabular", children: text }, c.key));
203
+ }) }, ri))) })] }) }));
204
+ }
205
+ export { patternDash };