@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,73 @@
1
+ import * as React from "react";
2
+ import { type CartesianGridProps, type ReferenceLineProps, type TooltipProps, type TooltipValueType as ValueType, type XAxisProps, type YAxisProps } from "recharts";
3
+ import type { NameType } from "recharts/types/component/DefaultTooltipContent";
4
+ import { type ChartColor, type FormatSpec } from "./utils.js";
5
+ export interface ChartFrameProps {
6
+ /** One Recharts chart element (`<RAreaChart data={…}>…</RAreaChart>`). */
7
+ children: React.ReactElement;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Sizes a Recharts chart to the Chart body (height from `height` / `aspect` on `<Chart>`), so the
12
+ * first paint never shifts layout. Use it for raw Recharts inside `<Chart>`.
13
+ */
14
+ export declare function ChartFrame({ children, className }: ChartFrameProps): React.JSX.Element;
15
+ interface TooltipEntry {
16
+ dataKey?: unknown;
17
+ name?: unknown;
18
+ value?: unknown;
19
+ type?: string;
20
+ payload?: unknown;
21
+ }
22
+ export interface ChartTooltipContentProps {
23
+ /** Injected by Recharts. */
24
+ active?: boolean;
25
+ /** Injected by Recharts. */
26
+ payload?: readonly TooltipEntry[];
27
+ /** Injected by Recharts. */
28
+ label?: unknown;
29
+ indicator?: "dot" | "line" | "dashed";
30
+ /** Adds a total row (stacked charts). */
31
+ showTotal?: boolean;
32
+ /** Percent-stacked charts: show each value's share next to it. */
33
+ showShare?: boolean;
34
+ hideLabel?: boolean;
35
+ /** Custom header text. */
36
+ labelFormatter?: (label: unknown, payload: readonly TooltipEntry[]) => React.ReactNode;
37
+ className?: string;
38
+ }
39
+ /**
40
+ * Tooltip body: opaque `--chart-tooltip` surface (no blur — it re-renders on every pointer move),
41
+ * formatted header, one row per visible series, optional total.
42
+ */
43
+ export declare function ChartTooltipContent({ active, payload, label, indicator, showTotal, showShare, hideLabel, labelFormatter, className }: ChartTooltipContentProps): React.JSX.Element | null;
44
+ export type ChartTooltipProps = Omit<TooltipProps<ValueType, NameType>, "content" | "labelFormatter"> & Pick<ChartTooltipContentProps, "indicator" | "showTotal" | "showShare" | "hideLabel" | "labelFormatter">;
45
+ /** Recharts Tooltip wired to `ChartTooltipContent` and the themed cursor. */
46
+ export declare function ChartTooltip({ indicator, showTotal, showShare, hideLabel, labelFormatter, cursor, ...props }: ChartTooltipProps): React.JSX.Element;
47
+ /** Horizontal grid lines in `--chart-grid`. */
48
+ export declare function ChartGrid(props: CartesianGridProps): React.JSX.Element;
49
+ /** Category / time axis: no lines, axis-coloured ticks, density-aware gaps, formatted with `xFormat`. */
50
+ export declare function ChartXAxis({ tickFormatter, ...props }: XAxisProps): React.JSX.Element;
51
+ /** Value axis with compact ticks ("$1.2M") and a width measured from the longest tick. */
52
+ export declare function ChartYAxis({ format, keys, stacked, tickFormatter, width: widthProp, ...props }: YAxisProps & {
53
+ format?: FormatSpec;
54
+ keys?: string[];
55
+ stacked?: boolean;
56
+ }): React.JSX.Element;
57
+ /** A labelled reference line (target, average). Colour is a token. */
58
+ export declare function ChartReferenceLine({ color, label, labelPosition, ...props }: Omit<ReferenceLineProps, "label"> & {
59
+ color?: ChartColor;
60
+ label?: string;
61
+ labelPosition?: "above" | "below";
62
+ }): React.JSX.Element;
63
+ /** Width for a value axis: estimated from every tick it could draw. */
64
+ export declare function useValueAxisWidth(keys: string[], o?: {
65
+ stacked?: boolean;
66
+ format?: FormatSpec;
67
+ percent?: boolean;
68
+ }): number;
69
+ /** Recharts `onClick` → `onPointClick(row, seriesKey)` from the active tooltip index. */
70
+ export declare function usePointClick(seriesKey?: string): ((state: {
71
+ activeTooltipIndex?: unknown;
72
+ } | null) => void) | undefined;
73
+ export {};
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // Recharts parts of the Chart frame: responsive plot, themed tooltip, axes and grid.
4
+ import * as React from "react";
5
+ import { CartesianGrid, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis, } from "recharts";
6
+ import { cn } from "../lib/cn.js";
7
+ import { ChartIndicator, useChart, useOptionalChart } from "./chart-shell.js";
8
+ import { estimateAxisWidth, extent, formatValue, niceCeil, niceStep, resolveChartColor, seriesColor } from "./utils.js";
9
+ /**
10
+ * Sizes a Recharts chart to the Chart body (height from `height` / `aspect` on `<Chart>`), so the
11
+ * first paint never shifts layout. Use it for raw Recharts inside `<Chart>`.
12
+ */
13
+ export function ChartFrame({ children, className }) {
14
+ return (_jsx("div", { "data-slot": "chart-frame", className: cn("size-full min-w-0", className), children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", minWidth: 0, children: children }) }));
15
+ }
16
+ /**
17
+ * Tooltip body: opaque `--chart-tooltip` surface (no blur — it re-renders on every pointer move),
18
+ * formatted header, one row per visible series, optional total.
19
+ */
20
+ export function ChartTooltipContent({ active, payload, label, indicator, showTotal, showShare, hideLabel, labelFormatter, className }) {
21
+ const chart = useOptionalChart();
22
+ if (!active || !payload?.length || !chart)
23
+ return null;
24
+ const rows = payload.filter((p) => p.dataKey !== undefined && !chart.isHidden(String(p.dataKey)) && p.type !== "none");
25
+ if (!rows.length)
26
+ return null;
27
+ const ind = indicator ?? chart.tooltipIndicator;
28
+ const raw = (rows[0]?.payload ?? {});
29
+ const header = hideLabel ? null : labelFormatter ? labelFormatter(label, rows) : chart.formatX(chart.x ? raw[chart.x] : label, true);
30
+ const numeric = (k) => {
31
+ const v = Number(raw[k]);
32
+ return Number.isFinite(v) ? v : 0;
33
+ };
34
+ const total = rows.reduce((sum, p) => sum + numeric(String(p.dataKey)), 0);
35
+ return (_jsxs("div", { "data-slot": "chart-tooltip", className: cn("vui-chart-tooltip min-w-36 rounded-ui-sm px-2.5 py-2 text-[12px]", className), children: [header ? _jsx("div", { className: "mb-1.5 font-medium text-fg", children: header }) : null, _jsxs("div", { className: "grid gap-1", children: [rows.map((p) => {
36
+ const key = String(p.dataKey);
37
+ const s = chart.series.find((x) => x.key === key);
38
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ChartIndicator, { color: seriesColor(key), variant: ind, pattern: s?.pattern }), _jsx("span", { className: "me-auto text-fg-muted", children: s?.label ?? String(p.name ?? key) }), _jsx("span", { className: "font-mono text-fg tabular", children: chart.formatSeries(key, raw[key] ?? p.value) }), showShare && total ? _jsx("span", { className: "w-11 text-end font-mono text-fg-subtle tabular", children: chart.f.percent(numeric(key) / total) }) : null] }, key));
39
+ }), showTotal && rows.length > 1 ? (_jsxs("div", { className: "mt-0.5 flex items-center gap-2 border-t border-line pt-1.5", children: [_jsx("span", { className: "me-auto text-fg-muted", children: chart.t("total") }), _jsx("span", { className: "font-mono font-medium text-fg tabular", children: chart.formatSeries(String(rows[0]?.dataKey), total) })] })) : null] })] }));
40
+ }
41
+ /** Recharts Tooltip wired to `ChartTooltipContent` and the themed cursor. */
42
+ export function ChartTooltip({ indicator, showTotal, showShare, hideLabel, labelFormatter, cursor, ...props }) {
43
+ return (_jsx(Tooltip, { isAnimationActive: false, cursor: cursor ?? { stroke: "var(--chart-cursor)", strokeWidth: 1 }, content: _jsx(ChartTooltipContent, { indicator: indicator, showTotal: showTotal, showShare: showShare, hideLabel: hideLabel, labelFormatter: labelFormatter }), ...props }));
44
+ }
45
+ /* ------------------------------------------------------------------ */
46
+ /* Axes & grid */
47
+ /* ------------------------------------------------------------------ */
48
+ const TICK = { fill: "var(--chart-axis)" };
49
+ /** Horizontal grid lines in `--chart-grid`. */
50
+ export function ChartGrid(props) {
51
+ return _jsx(CartesianGrid, { stroke: "var(--chart-grid)", vertical: false, ...props });
52
+ }
53
+ /** Category / time axis: no lines, axis-coloured ticks, density-aware gaps, formatted with `xFormat`. */
54
+ export function ChartXAxis({ tickFormatter, ...props }) {
55
+ const chart = useChart();
56
+ return (_jsx(XAxis, { dataKey: chart.x, tickLine: false, axisLine: false, tick: TICK, tickMargin: 8, minTickGap: 18, interval: "preserveStartEnd", tickFormatter: tickFormatter ?? ((v) => chart.formatX(v)), ...props }));
57
+ }
58
+ /** Value axis with compact ticks ("$1.2M") and a width measured from the longest tick. */
59
+ export function ChartYAxis({ format, keys, stacked, tickFormatter, width: widthProp, ...props }) {
60
+ const chart = useChart();
61
+ const axisKeys = keys ?? chart.visibleSeries.map((s) => s.key);
62
+ const width = useValueAxisWidth(axisKeys, { stacked, format });
63
+ const compactFrom = axisCompactFrom(extent(chart.data, axisKeys, stacked));
64
+ const fallback = (v) => formatValue(chart.f, format ?? chart.yFormat, v, { compact: true, compactFrom });
65
+ return _jsx(YAxis, { niceTicks: "snap125", tickLine: false, axisLine: false, tick: TICK, tickMargin: 6, width: widthProp ?? width, tickFormatter: tickFormatter ?? fallback, ...props });
66
+ }
67
+ /** A labelled reference line (target, average). Colour is a token. */
68
+ export function ChartReferenceLine({ color = "fg-subtle", label, labelPosition = "below", ...props }) {
69
+ return (_jsx(ReferenceLine, { stroke: resolveChartColor(color), strokeDasharray: "4 4", strokeWidth: 1, ifOverflow: "extendDomain", label: label ? { value: label, position: labelPosition === "above" ? "insideBottomRight" : "insideTopRight", fill: resolveChartColor(color === "fg-subtle" ? "fg-muted" : color), fontSize: 11 } : undefined, ...props }));
70
+ }
71
+ /** Once the top tick reaches 10K, every tick ≥ 1000 is compact too ("5K" next to "10K", never "5,000"). */
72
+ function axisCompactFrom([lo, hi]) {
73
+ return Math.max(niceCeil(Math.abs(hi)), niceCeil(Math.abs(lo))) >= 10000 ? 1000 : 10000;
74
+ }
75
+ /** Width for a value axis: estimated from every tick it could draw. */
76
+ export function useValueAxisWidth(keys, o = {}) {
77
+ const chart = useChart();
78
+ return React.useMemo(() => {
79
+ if (o.percent)
80
+ return estimateAxisWidth([chart.f.percent(1)]);
81
+ const [min, max] = extent(chart.data, keys, o.stacked);
82
+ const compactFrom = axisCompactFrom([min, max]);
83
+ // Format every tick the axis could draw (snap125 may stop at 800K while niceCeil says 1M).
84
+ const lo = Math.min(0, min);
85
+ const hi = Math.max(0, max);
86
+ const step = niceStep((hi - lo) / 4) || 1;
87
+ const values = [niceCeil(Math.abs(hi)), lo < 0 ? -niceCeil(-lo) : 0];
88
+ for (let v = Math.floor(lo / step) * step, i = 0; v <= hi + step && i < 24; v += step, i++)
89
+ values.push(Number(v.toPrecision(12)));
90
+ return estimateAxisWidth(values.map((v) => formatValue(chart.f, o.format ?? chart.yFormat, v, { compact: true, compactFrom })));
91
+ }, [chart.data, chart.f, chart.yFormat, keys, o.stacked, o.format, o.percent]);
92
+ }
93
+ /** Recharts `onClick` → `onPointClick(row, seriesKey)` from the active tooltip index. */
94
+ export function usePointClick(seriesKey) {
95
+ const chart = useChart();
96
+ return React.useMemo(() => {
97
+ if (!chart.onPointClick)
98
+ return undefined;
99
+ return (state) => {
100
+ const i = Number(state?.activeTooltipIndex);
101
+ const row = Number.isInteger(i) ? chart.data[i] : undefined;
102
+ if (row)
103
+ chart.onPointClick?.(row, seriesKey ?? chart.visibleSeries[0]?.key ?? "");
104
+ };
105
+ }, [chart, seriesKey]);
106
+ }
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import { type ChartProps } from "./chart-shell.js";
3
+ import { type FormatSpec } from "./utils.js";
4
+ export interface ComboChartProps<T extends object> extends Omit<ChartProps<T>, "children"> {
5
+ /** Keys drawn as bars (default axis: start). */
6
+ bars: string[];
7
+ /** Keys drawn as lines (default axis: end). */
8
+ lines: string[];
9
+ /** Keys drawn as filled areas behind the bars. */
10
+ areas?: string[];
11
+ /** Format of the end axis. Default: the first end-axis series' format. */
12
+ endAxisFormat?: FormatSpec;
13
+ /** Show the end axis. Hidden: values still appear in the tooltip and table. Default `true`. */
14
+ endAxis?: boolean;
15
+ /** Stack the bars. */
16
+ stackBars?: boolean;
17
+ /** Axis titles (label + unit) — recommended, two value scales need naming. */
18
+ startAxisLabel?: string;
19
+ endAxisLabel?: string;
20
+ }
21
+ /**
22
+ * Volume and rate on two axes — bars on the start axis, a line on the end axis, zero lines aligned
23
+ * so neither scale exaggerates. Axis sides are logical and swap in RTL.
24
+ *
25
+ * ```tsx
26
+ * <ComboChart title="Quotes and win rate" data={rows} x="month" bars={["quotes"]} lines={["winRate"]} config={config} />
27
+ * ```
28
+ */
29
+ export declare function ComboChart<T extends object>({ bars, lines, areas, endAxisFormat, endAxis, stackBars, startAxisLabel, endAxisLabel, ...props }: ComboChartProps<T>): React.JSX.Element;
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Area, Bar, ComposedChart, Line } from "recharts";
5
+ import { useLocale } from "../lib/locale.js";
6
+ import { Chart, useChart } from "./chart-shell.js";
7
+ import { ChartFrame, ChartGrid, ChartTooltip, ChartXAxis, ChartYAxis, useValueAxisWidth } from "./chart.js";
8
+ import { alignZeroDomains, extent, patternDash, seriesColor } from "./utils.js";
9
+ /**
10
+ * Volume and rate on two axes — bars on the start axis, a line on the end axis, zero lines aligned
11
+ * so neither scale exaggerates. Axis sides are logical and swap in RTL.
12
+ *
13
+ * ```tsx
14
+ * <ComboChart title="Quotes and win rate" data={rows} x="month" bars={["quotes"]} lines={["winRate"]} config={config} />
15
+ * ```
16
+ */
17
+ export function ComboChart({ bars, lines, areas = [], endAxisFormat, endAxis = true, stackBars, startAxisLabel, endAxisLabel, ...props }) {
18
+ return (_jsx(Chart, { skeleton: "bar", ...props, children: _jsx(ComboPlot, { bars: bars, lines: lines, areas: areas, endAxisFormat: endAxisFormat, endAxis: endAxis, stackBars: stackBars, startAxisLabel: startAxisLabel, endAxisLabel: endAxisLabel }) }));
19
+ }
20
+ function ComboPlot({ bars, lines, areas = [], endAxisFormat, endAxis, stackBars, startAxisLabel, endAxisLabel }) {
21
+ const chart = useChart();
22
+ const rtl = useLocale().dir === "rtl";
23
+ const axisOf = (key, fallback) => chart.config[key]?.axis ?? fallback;
24
+ const visible = (k) => !chart.isHidden(k);
25
+ const startKeys = [...bars.filter((k) => axisOf(k, "start") === "start"), ...lines.filter((k) => axisOf(k, "end") === "start"), ...areas.filter((k) => axisOf(k, "start") === "start")].filter(visible);
26
+ const endKeys = [...bars.filter((k) => axisOf(k, "start") === "end"), ...lines.filter((k) => axisOf(k, "end") === "end"), ...areas.filter((k) => axisOf(k, "start") === "end")].filter(visible);
27
+ const startStacked = Boolean(stackBars);
28
+ const endFormat = endAxisFormat ?? chart.config[endKeys[0] ?? ""]?.format;
29
+ const startFormat = chart.config[startKeys[0] ?? ""]?.format ?? chart.yFormat;
30
+ const [startDomain, endDomain] = React.useMemo(() => {
31
+ const a = extent(chart.data, startKeys, startStacked);
32
+ const b = extent(chart.data, endKeys);
33
+ return alignZeroDomains(a, b);
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35
+ }, [chart.data, startKeys.join(), endKeys.join(), startStacked]);
36
+ // Non-negative data: four equal steps on both axes, so the grid lines serve both scales.
37
+ const ticksOf = (d) => (d[0] === 0 ? [0, 1, 2, 3, 4].map((i) => Number(((d[1] * i) / 4).toPrecision(12))) : undefined);
38
+ const startWidth = useValueAxisWidth(startKeys, { stacked: startStacked, format: startFormat });
39
+ const endWidth = useValueAxisWidth(endKeys, { format: endFormat });
40
+ const left = rtl ? "end" : "start";
41
+ const yId = (key, fallback) => axisOf(key, fallback);
42
+ const titleProps = (value, side) => value ? { value, angle: -90, position: side === "left" ? "insideLeft" : "insideRight", className: "vui-chart-axis-title", offset: 0, style: { textAnchor: "middle" } } : undefined;
43
+ return (_jsx(ChartFrame, { children: _jsxs(ComposedChart, { data: chart.data, margin: { top: 8, right: 4, bottom: 0, left: 4 }, barCategoryGap: "30%", children: [_jsx(ChartGrid, { yAxisId: "start" }), _jsx(ChartXAxis, {}), _jsx(ChartYAxis, { yAxisId: "start", orientation: left === "start" ? "left" : "right", domain: startDomain, ticks: ticksOf(startDomain), width: startWidth + (startAxisLabel ? 16 : 0), tickFormatter: (v) => chart.formatTick(v, startFormat), label: titleProps(startAxisLabel, left === "start" ? "left" : "right"), keys: startKeys }), _jsx(ChartYAxis, { yAxisId: "end", orientation: left === "start" ? "right" : "left", domain: endDomain, ticks: ticksOf(endDomain), hide: !endAxis || endKeys.length === 0, width: endWidth + (endAxisLabel ? 16 : 0), tickFormatter: (v) => chart.formatTick(v, endFormat), label: titleProps(endAxisLabel, left === "start" ? "right" : "left"), keys: endKeys }), _jsx(ChartTooltip, { cursor: { fill: "var(--hover)" } }), areas.map((key) => (_jsx(Area, { yAxisId: yId(key, "start"), dataKey: key, name: chart.config[key]?.label, hide: chart.isHidden(key), type: "monotone", stroke: seriesColor(key), strokeWidth: 1.5, fill: `color-mix(in oklch, ${seriesColor(key)} 16%, transparent)`, isAnimationActive: chart.animate }, key))), bars.map((key, i) => (_jsx(Bar, { yAxisId: yId(key, "start"), dataKey: key, name: chart.config[key]?.label, hide: chart.isHidden(key), stackId: stackBars ? "bars" : undefined, fill: seriesColor(key), radius: stackBars && i < bars.length - 1 ? 0 : [4, 4, 0, 0], maxBarSize: 40, isAnimationActive: chart.animate }, key))), lines.map((key) => {
44
+ const s = chart.series.find((x) => x.key === key);
45
+ return (_jsx(Line, { yAxisId: yId(key, "end"), dataKey: key, name: s?.label, hide: chart.isHidden(key), type: "monotone", stroke: seriesColor(key), strokeWidth: 2, strokeDasharray: patternDash(s?.pattern), dot: { r: 2.5, fill: seriesColor(key), stroke: "var(--chart-tooltip)", strokeWidth: 1.5 }, activeDot: { r: 4, strokeWidth: 2, stroke: "var(--chart-tooltip)", fill: seriesColor(key) }, isAnimationActive: chart.animate }, key));
46
+ })] }) }));
47
+ }
@@ -0,0 +1,33 @@
1
+ import * as React from "react";
2
+ import { type ChartProps } from "./chart-shell.js";
3
+ import { type FormatSpec } from "./utils.js";
4
+ export interface DonutChartProps<T extends object> extends Omit<ChartProps<T>, "children" | "x" | "legend" | "height" | "aspect" | "aside" | "table"> {
5
+ /** Row key holding the slice id (matches config keys). */
6
+ nameKey: keyof T & string;
7
+ /** Row key holding the slice value. */
8
+ valueKey: keyof T & string;
9
+ /** Centre content: the visible total (default), your own node, or nothing. Hovering a slice shows that slice. */
10
+ center?: React.ReactNode | "total" | "none";
11
+ /** Label under the centre total. Default "Total". */
12
+ centerLabel?: string;
13
+ /** Slices beyond this count merge into "Other" (`fg-subtle`). Default 5. */
14
+ maxSlices?: number;
15
+ variant?: "donut" | "pie" | "half";
16
+ /** Legend list with value + share: beside the ring (default), under it, or none. */
17
+ legend?: "side" | "bottom" | "none";
18
+ size?: "sm" | "md" | "lg" | number;
19
+ /** Format of the values. Default: the first config entry's format, else `"number"`. */
20
+ format?: FormatSpec;
21
+ /** Controlled active slice (hover / legend focus). */
22
+ activeKey?: string | null;
23
+ onActiveChange?: (key: string | null) => void;
24
+ }
25
+ /**
26
+ * Parts of a whole (≤ 6 slices). The legend is a real list with value and share, so the chart never
27
+ * relies on colour alone; focusing an item highlights its slice and the centre shows its numbers.
28
+ *
29
+ * ```tsx
30
+ * <DonutChart title="Leads by source" data={rows} nameKey="source" valueKey="leads" config={{ organic: { label: "Organic search" } }} />
31
+ * ```
32
+ */
33
+ export declare function DonutChart<T extends object>({ data, nameKey, valueKey, config, center, centerLabel, maxSlices, variant, legend, size, format, activeKey, onActiveChange, summary, ...props }: DonutChartProps<T>): React.JSX.Element;
@@ -0,0 +1,113 @@
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 { Cell, Pie, PieChart, Sector } from "recharts";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useControllableState } from "../lib/use-controllable-state.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { Chart, ChartIndicator, chartLabels, useChart } from "./chart-shell.js";
9
+ import { useFormat } from "../lib/locale.js";
10
+ import { formatValue, seriesColor } from "./utils.js";
11
+ const SIZES = { sm: 120, md: 180, lg: 240 };
12
+ const OTHER_KEY = "__other";
13
+ /**
14
+ * Parts of a whole (≤ 6 slices). The legend is a real list with value and share, so the chart never
15
+ * relies on colour alone; focusing an item highlights its slice and the centre shows its numbers.
16
+ *
17
+ * ```tsx
18
+ * <DonutChart title="Leads by source" data={rows} nameKey="source" valueKey="leads" config={{ organic: { label: "Organic search" } }} />
19
+ * ```
20
+ */
21
+ export function DonutChart({ data, nameKey, valueKey, config, center = "total", centerLabel, maxSlices = 5, variant = "donut", legend = "side", size = "md", format, activeKey, onActiveChange, summary, ...props }) {
22
+ const rows = data;
23
+ const f = useFormat();
24
+ const t = useLabels("chart", chartLabels, props.labels);
25
+ const valueFormat = format ?? Object.values(config)[0]?.format;
26
+ const [active, setActive] = useControllableState({ value: activeKey, defaultValue: null, onChange: onActiveChange, name: "DonutChart" });
27
+ const px = typeof size === "number" ? size : SIZES[size];
28
+ const height = variant === "half" ? Math.round(px / 2) + 10 : px;
29
+ const { slices, effectiveConfig } = React.useMemo(() => {
30
+ const raw = rows.map((r) => ({ key: String(r[nameKey]), value: Math.max(0, Number(r[valueKey]) || 0) }));
31
+ let list = raw;
32
+ if (raw.length > maxSlices) {
33
+ const sorted = [...raw].sort((a, b) => b.value - a.value);
34
+ const keep = new Set(sorted.slice(0, maxSlices - 1).map((s) => s.key));
35
+ const rest = raw.filter((s) => !keep.has(s.key));
36
+ list = [...raw.filter((s) => keep.has(s.key)), { key: OTHER_KEY, value: rest.reduce((s, r) => s + r.value, 0) }];
37
+ }
38
+ const cfg = {};
39
+ for (const s of list)
40
+ cfg[s.key] = s.key === OTHER_KEY ? { label: config[OTHER_KEY]?.label ?? "", color: "fg-subtle", format } : { ...config[s.key], label: config[s.key]?.label ?? s.key, format: valueFormat };
41
+ return { slices: list, effectiveConfig: cfg };
42
+ }, [rows, nameKey, valueKey, maxSlices, config, valueFormat]);
43
+ const total = slices.reduce((s, r) => s + r.value, 0);
44
+ const otherLabel = t("other");
45
+ const labelOf = (k) => (k === OTHER_KEY ? effectiveConfig[k]?.label || otherLabel : (effectiveConfig[k]?.label ?? k));
46
+ const table = {
47
+ columns: [
48
+ { key: "label", label: t("category"), header: true },
49
+ { key: "value", label: t("value"), format: valueFormat },
50
+ { key: "share", label: t("share"), format: "percent" },
51
+ ],
52
+ rows: slices.map((s) => ({ label: labelOf(s.key), value: s.value, share: total ? s.value / total : 0 })),
53
+ };
54
+ const summaryText = summary ?? (total ? slices.map((s) => `${labelOf(s.key)} ${f.percent(s.value / total)} (${formatValue(f, valueFormat, s.value)})`).join(", ") + "." : "");
55
+ const ctx = React.useMemo(() => ({ active, setActive, raw: slices }), [active, setActive, slices]);
56
+ return (_jsx(DonutContext.Provider, { value: ctx, children: _jsx(Chart, { ...props, data: slices, config: effectiveConfig, height: height, legend: "none", skeleton: "donut", summary: summaryText, table: table, state: props.state ?? (rows.length === 0 ? { status: "empty" } : undefined), aside: legend === "none" ? undefined : _jsx(DonutLegend, {}), asidePosition: legend === "bottom" ? "bottom" : "side", children: _jsx(DonutPlot, { px: px, height: height, variant: variant, center: center, centerLabel: centerLabel }) }) }));
57
+ }
58
+ const DonutContext = React.createContext(null);
59
+ const useDonut = () => React.useContext(DonutContext);
60
+ function useSlices(slices) {
61
+ const chart = useChart();
62
+ return React.useMemo(() => {
63
+ const visible = slices.filter((s) => !chart.isHidden(s.key));
64
+ const total = visible.reduce((s, r) => s + r.value, 0);
65
+ return slices.map((s) => ({
66
+ key: s.key,
67
+ label: s.key === OTHER_KEY ? chart.config[s.key]?.label || chart.t("other") : (chart.config[s.key]?.label ?? s.key),
68
+ value: s.value,
69
+ share: total && !chart.isHidden(s.key) ? s.value / total : 0,
70
+ }));
71
+ }, [slices, chart]);
72
+ }
73
+ function DonutPlot({ px, height, variant, center, centerLabel, }) {
74
+ const chart = useChart();
75
+ const { active, setActive, raw } = useDonut();
76
+ const slices = useSlices(raw);
77
+ const visible = slices.filter((s) => !chart.isHidden(s.key) && s.value > 0);
78
+ const total = visible.reduce((s, r) => s + r.value, 0);
79
+ const half = variant === "half";
80
+ const outer = half ? px / 2 - 4 : px / 2 - 4;
81
+ const inner = variant === "pie" ? 0 : outer * (px < 140 ? 0.66 : 0.72);
82
+ const activeSlice = active ? slices.find((s) => s.key === active && !chart.isHidden(s.key)) : undefined;
83
+ const fmt = (v) => chart.formatSeries(raw[0]?.key ?? "", v);
84
+ let centerNode = null;
85
+ if (variant !== "pie" && center !== "none") {
86
+ if (activeSlice)
87
+ centerNode = (_jsxs(_Fragment, { children: [_jsx("span", { className: "max-w-[80%] truncate text-[11.5px] text-fg-muted", children: activeSlice.label }), _jsx("span", { className: cn("font-mono leading-none font-medium tracking-[-0.02em] text-fg tabular", px >= 180 ? "text-[22px]" : "text-[17px]"), children: fmt(activeSlice.value) }), _jsx("span", { className: "font-mono text-[11.5px] text-fg-subtle tabular", children: chart.f.percent(activeSlice.share) })] }));
88
+ else if (center === "total" || center === undefined)
89
+ centerNode = (_jsxs(_Fragment, { children: [_jsx("span", { className: cn("font-mono leading-none font-medium tracking-[-0.02em] text-fg tabular", px >= 180 ? "text-[24px]" : "text-[17px]"), children: fmt(total) }), _jsx("span", { className: "text-[11.5px] text-fg-muted", children: centerLabel ?? chart.t("total") })] }));
90
+ else
91
+ centerNode = center;
92
+ }
93
+ const shape = (p) => {
94
+ const key = String(p.payload?.key ?? "");
95
+ const isActive = key === active;
96
+ const dim = active && !isActive;
97
+ const { key: _key, ...sector } = p;
98
+ void _key;
99
+ return _jsx(Sector, { ...sector, outerRadius: (p.outerRadius ?? outer) + (isActive ? 4 : 0), fillOpacity: dim ? 0.45 : 1, style: { transition: "fill-opacity 160ms" } });
100
+ };
101
+ return (_jsx("div", { className: "flex size-full items-center justify-center", onMouseLeave: () => setActive(null), children: _jsxs("div", { className: "relative", style: { width: px, height }, children: [_jsx(PieChart, { width: px, height: height, accessibilityLayer: false, margin: { top: 0, right: 0, bottom: 0, left: 0 }, children: total === 0 ? (_jsx(Pie, { data: [{ key: "empty", value: 1 }], dataKey: "value", cx: "50%", cy: half ? height - 6 : "50%", innerRadius: inner, outerRadius: outer, startAngle: half ? 180 : 90, endAngle: half ? 0 : -270, stroke: "none", isAnimationActive: false, rootTabIndex: -1, children: _jsx(Cell, { fill: "var(--track)" }) })) : (_jsx(Pie, { data: visible, dataKey: "value", nameKey: "label", cx: "50%", cy: half ? height - 6 : "50%", innerRadius: inner, outerRadius: outer, startAngle: half ? 180 : 90, endAngle: half ? 0 : -270, paddingAngle: visible.length > 1 ? (variant === "pie" ? 0.8 : 1.6) : 0, cornerRadius: variant === "pie" ? 0 : 3, stroke: variant === "pie" ? "var(--chart-tooltip)" : "none", strokeWidth: variant === "pie" ? 1.5 : 0, shape: shape, isAnimationActive: chart.animate, animationDuration: 600, rootTabIndex: -1, onMouseEnter: (d) => setActive(d.payload?.key ?? null), children: visible.map((s) => (_jsx(Cell, { fill: seriesColor(s.key) }, s.key))) })) }), centerNode ? (_jsx("div", { "aria-hidden": true, className: cn("pointer-events-none absolute inset-x-0 flex flex-col items-center gap-1 text-center", half ? "bottom-1.5" : "inset-y-0 justify-center"), children: total === 0 && !activeSlice ? _jsx("span", { className: "text-[12px] text-fg-muted", children: chart.t("empty") }) : centerNode })) : null] }) }));
102
+ }
103
+ /** Legend list for a donut: a `<ul>` with swatch, label, value and share. Click hides a slice; focus highlights it. */
104
+ function DonutLegend() {
105
+ const chart = useChart();
106
+ const { active, setActive, raw } = useDonut();
107
+ const slices = useSlices(raw);
108
+ return (_jsx("ul", { "data-slot": "donut-legend", "aria-label": chart.t("legend"), className: "grid gap-0.5", children: slices.map((s) => {
109
+ const hidden = chart.isHidden(s.key);
110
+ const locked = !hidden && chart.visibleSeries.length <= 1;
111
+ return (_jsx("li", { children: _jsxs("button", { type: "button", "aria-pressed": !hidden, "aria-disabled": locked || undefined, onClick: () => chart.toggleSeries(s.key), onFocus: () => setActive(hidden ? null : s.key), onBlur: () => setActive(null), onMouseEnter: () => setActive(hidden ? null : s.key), onMouseLeave: () => setActive(null), className: cn("flex h-8 w-full items-center gap-2.5 rounded-ui-sm px-2 text-start text-[13px] transition-[background-color,opacity] focus-ring hover:bg-hover", active === s.key && "bg-hover", hidden && "opacity-50"), children: [_jsx(ChartIndicator, { color: seriesColor(s.key) }), _jsx("span", { className: cn("me-auto truncate text-fg", hidden && "line-through decoration-fg-subtle"), children: s.label }), _jsx("span", { className: "font-mono text-[12.5px] text-fg tabular", children: chart.formatSeries(s.key, s.value) }), _jsx("span", { className: "w-11 text-end font-mono text-[12px] text-fg-subtle tabular", children: hidden ? "—" : chart.f.percent(s.share) })] }) }, s.key));
112
+ }) }));
113
+ }
@@ -0,0 +1,51 @@
1
+ import * as React from "react";
2
+ import { type ChartColor, type FormatSpec } from "./utils.js";
3
+ export declare const funnelLabels: {
4
+ conversion: string;
5
+ overall: string;
6
+ dropoff: string;
7
+ stage: string;
8
+ stageWithConversion: string;
9
+ compare: string;
10
+ points: string;
11
+ loading: string;
12
+ empty: string;
13
+ };
14
+ export type FunnelLabels = typeof funnelLabels;
15
+ export interface FunnelStep {
16
+ key: string;
17
+ label: string;
18
+ value: number;
19
+ /** Money (or any second number) per stage, e.g. pipeline value. */
20
+ amount?: number;
21
+ href?: string;
22
+ }
23
+ export interface FunnelProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onClick"> {
24
+ steps: FunnelStep[];
25
+ /** `horizontal` = stage columns (falls back to rows in a narrow container); `vertical` = stacked rows (mobile). */
26
+ orientation?: "horizontal" | "vertical";
27
+ format?: FormatSpec;
28
+ /** Format of `amount`. Default compact currency. */
29
+ amountFormat?: FormatSpec;
30
+ /** Metrics under each stage. Default `["conversion", "dropoff"]`. */
31
+ show?: ("conversion" | "overall" | "dropoff")[];
32
+ /** Base colour; later stages fade. Default `chart-1`. */
33
+ color?: ChartColor;
34
+ /** The same stages for a previous period — adds a marker and the conversion change. */
35
+ compareTo?: FunnelStep[];
36
+ onStepClick?: (step: FunnelStep) => void;
37
+ size?: "sm" | "md";
38
+ loading?: boolean;
39
+ /** Accessible name of the list. */
40
+ title?: string;
41
+ labels?: Partial<FunnelLabels>;
42
+ }
43
+ /**
44
+ * Stage-by-stage conversion as aligned bars: value, conversion from the previous stage, drop-off and
45
+ * an optional amount. Drop-off is muted, not red — losing leads between stages is normal.
46
+ *
47
+ * ```tsx
48
+ * <Funnel title="Sales pipeline" steps={[{ key: "leads", label: "Leads", value: 1240 }, …]} />
49
+ * ```
50
+ */
51
+ export declare const Funnel: React.ForwardRefExoticComponent<FunnelProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { CornerDownRight } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useFormat } from "../lib/locale.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { Skeleton } from "../components/skeleton.js";
9
+ import { formatValue, resolveChartColor } from "./utils.js";
10
+ export const funnelLabels = {
11
+ conversion: "{percent} of {previous}",
12
+ overall: "{percent} overall",
13
+ dropoff: "−{count}",
14
+ stage: "{label}: {value}",
15
+ stageWithConversion: "{label}: {value} ({percent} of {previous})",
16
+ compare: "{delta} vs previous period",
17
+ points: "{value} pt",
18
+ loading: "Loading…",
19
+ empty: "No stages yet",
20
+ };
21
+ /**
22
+ * Stage-by-stage conversion as aligned bars: value, conversion from the previous stage, drop-off and
23
+ * an optional amount. Drop-off is muted, not red — losing leads between stages is normal.
24
+ *
25
+ * ```tsx
26
+ * <Funnel title="Sales pipeline" steps={[{ key: "leads", label: "Leads", value: 1240 }, …]} />
27
+ * ```
28
+ */
29
+ export const Funnel = React.forwardRef(function Funnel({ steps, orientation = "horizontal", format = "integer", amountFormat = "currency", show = ["conversion", "dropoff"], color = "chart-1", compareTo, onStepClick, size = "md", loading, title, labels, className, style, ...props }, ref) {
30
+ const f = useFormat();
31
+ const t = useLabels("funnel", funnelLabels, labels);
32
+ const first = steps[0]?.value ?? 0;
33
+ const max = Math.max(first, ...steps.map((s) => s.value), 1);
34
+ const base = resolveChartColor(color);
35
+ if (process.env.NODE_ENV !== "production") {
36
+ steps.forEach((s, i) => {
37
+ if (i > 0 && s.value > steps[i - 1].value)
38
+ console.warn(`[vamos-ui] Funnel: stage "${s.key}" is larger than the stage before it.`);
39
+ });
40
+ }
41
+ if (loading)
42
+ return (_jsxs("div", { ref: ref, "aria-busy": true, className: cn("grid gap-3", className), ...props, children: [_jsx("span", { role: "status", className: "sr-only", children: t("loading") }), [100, 72, 48, 30, 18].map((w, i) => (_jsxs("div", { className: "grid gap-1.5", children: [_jsx(Skeleton, { shape: "text", className: "w-24 text-[13px]" }), _jsx(Skeleton, { className: "h-6", style: { width: `${w}%` } })] }, i)))] }));
43
+ if (!steps.length)
44
+ return _jsx("p", { className: cn("py-6 text-center text-[13px] text-fg-muted", className), children: t("empty") });
45
+ const pct = (v) => f.percent(v, { maximumFractionDigits: v < 0.1 ? 1 : 0 });
46
+ const prevSteps = compareTo ? new Map(compareTo.map((s, i) => [s.key, { step: s, prev: compareTo[i - 1] }])) : null;
47
+ return (_jsx("div", { ref: ref, "data-slot": "funnel", "data-orientation": orientation, "data-size": size, className: cn("vui-funnel @container", className), style: style, ...props, children: _jsx("ol", { "aria-label": title, className: "vui-funnel-list", style: { "--funnel-n": steps.length }, children: steps.map((s, i) => {
48
+ const prev = steps[i - 1];
49
+ const conv = prev ? (prev.value > 0 ? s.value / prev.value : null) : null;
50
+ const overall = first > 0 ? s.value / first : null;
51
+ const drop = prev ? prev.value - s.value : 0;
52
+ const valueText = formatValue(f, format, s.value);
53
+ const convText = conv === null ? "—" : pct(conv);
54
+ const fade = steps.length > 1 ? 100 - (i / (steps.length - 1)) * 52 : 100;
55
+ const fill = `color-mix(in oklch, ${base} ${fade}%, var(--surface-solid, var(--surface)))`;
56
+ const cmp = prevSteps?.get(s.key);
57
+ const prevConv = cmp?.prev && cmp.prev.value > 0 ? cmp.step.value / cmp.prev.value : null;
58
+ const convDelta = conv !== null && prevConv !== null ? conv - prevConv : null;
59
+ const deltaText = convDelta === null ? null : `${convDelta >= 0 ? "+" : "−"}${t("points", { value: f.number(Math.abs(convDelta) * 100, { maximumFractionDigits: 1 }) })}`;
60
+ const srText = [
61
+ prev ? t("stageWithConversion", { label: s.label, value: valueText, percent: convText, previous: prev.label }) : t("stage", { label: s.label, value: valueText }),
62
+ s.amount !== undefined ? formatValue(f, amountFormat, s.amount) : null,
63
+ deltaText ? t("compare", { delta: deltaText }) : null,
64
+ ]
65
+ .filter(Boolean)
66
+ .join(", ");
67
+ return (_jsxs("li", { className: "vui-funnel-step group/step relative", children: [_jsxs("div", { className: "vui-funnel-head flex min-w-0 items-baseline justify-between gap-3", children: [s.href ? (_jsx("a", { href: s.href, "aria-label": srText, className: "truncate rounded-ui-sm text-[13px] text-fg focus-ring after:absolute after:inset-0 hover:underline hover:underline-offset-4", children: s.label })) : onStepClick ? (_jsx("button", { type: "button", "aria-label": srText, onClick: () => onStepClick(s), className: "truncate rounded-ui-sm text-start text-[13px] text-fg focus-ring after:absolute after:inset-0 group-hover/step:underline group-hover/step:underline-offset-4", children: s.label })) : (_jsxs("span", { className: "truncate text-[13px] text-fg", children: [_jsx("span", { "aria-hidden": true, children: s.label }), _jsx("span", { className: "sr-only", children: srText })] })), _jsx("span", { "aria-hidden": true, className: "vui-funnel-value font-mono text-fg tabular", children: valueText })] }), _jsxs("div", { "aria-hidden": true, className: "vui-funnel-track", children: [_jsx("div", { className: "vui-funnel-fill", style: { "--p": Math.max(1.5, (s.value / max) * 100), background: fill } }), cmp ? _jsx("div", { className: "vui-funnel-marker", style: { "--p": Math.min(100, (cmp.step.value / Math.max(max, compareTo?.[0]?.value ?? 0)) * 100) } }) : null] }), _jsxs("div", { "aria-hidden": true, className: "vui-funnel-meta flex flex-wrap items-center gap-x-2.5 gap-y-0.5 font-mono text-[11.5px] text-fg-muted tabular", children: [s.amount !== undefined ? _jsx("span", { className: "text-fg", children: formatValue(f, amountFormat, s.amount, { compact: true }) }) : null, prev && show.includes("conversion") ? (_jsxs("span", { className: "inline-flex items-center gap-1 text-fg", title: t("conversion", { percent: convText, previous: prev.label }), children: [_jsx(CornerDownRight, { className: "size-3 text-fg-subtle" }), convText] })) : null, prev && show.includes("dropoff") && drop > 0 ? _jsx("span", { className: "text-fg-subtle", children: t("dropoff", { count: formatValue(f, format, drop) }) }) : null, i > 0 && show.includes("overall") && overall !== null ? _jsx("span", { className: "text-fg-subtle", children: t("overall", { percent: pct(overall) }) }) : null, deltaText ? _jsx("span", { className: cn(convDelta >= 0 ? "text-success" : "text-danger"), children: deltaText }) : null] })] }, s.key));
68
+ }) }) }));
69
+ });
@@ -0,0 +1,62 @@
1
+ import * as React from "react";
2
+ import { type ChartColor, type FormatSpec } from "./utils.js";
3
+ export declare const gaugeLabels: {
4
+ valueText: string;
5
+ valueTextWithLabel: string;
6
+ target: string;
7
+ noValue: string;
8
+ };
9
+ export type GaugeLabels = typeof gaugeLabels;
10
+ export interface GaugeThreshold {
11
+ /** Applies from this value up. */
12
+ at: number;
13
+ color: ChartColor;
14
+ /** Word for the band ("Fair") — shown under the value and read in `aria-valuetext`. */
15
+ label?: string;
16
+ }
17
+ export interface ProgressRingProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "color"> {
18
+ /** Current value. `null` = unknown (empty track, "—"). */
19
+ value: number | null;
20
+ /** Default 100. */
21
+ max?: number;
22
+ size?: "xs" | "sm" | "md" | "lg" | number;
23
+ /** Stroke width in px. Default: about a tenth of the size. */
24
+ thickness?: number;
25
+ /** Fill token, or `"auto"` to take it from `thresholds`. Default `chart-1`. */
26
+ color?: ChartColor | "auto";
27
+ thresholds?: GaugeThreshold[];
28
+ /** Centre content (md and lg). Default: the formatted value. Pass `null` for none. */
29
+ label?: React.ReactNode;
30
+ /** `percent` shows value / max; any other spec formats the value itself. */
31
+ format?: FormatSpec;
32
+ /** `progress` (task completion) → role="progressbar"; `meter` (a score) → role="meter". Default `progress`. */
33
+ semantic?: "progress" | "meter";
34
+ "aria-label": string;
35
+ labels?: Partial<GaugeLabels>;
36
+ }
37
+ export interface GaugeProps extends ProgressRingProps {
38
+ /** Sweep of the arc. Default 270. */
39
+ arc?: 180 | 270;
40
+ /** Paint the threshold ranges as a thin outer band. */
41
+ showThresholdBands?: boolean;
42
+ /** A marker on the arc (quota, goal). */
43
+ target?: number;
44
+ }
45
+ /**
46
+ * A full ring for progress to a target — profile completeness, quota, upload. Plain SVG; `xs` fits
47
+ * in a table cell.
48
+ *
49
+ * ```tsx
50
+ * <ProgressRing value={85} aria-label="Profile completeness" format="percent" size="md" />
51
+ * ```
52
+ */
53
+ export declare const ProgressRing: React.ForwardRefExoticComponent<ProgressRingProps & React.RefAttributes<HTMLDivElement>>;
54
+ /**
55
+ * A score or attainment on a 180° / 270° arc with optional threshold bands and a target marker —
56
+ * SEO score, quota, NPS. `semantic="meter"` for scores.
57
+ *
58
+ * ```tsx
59
+ * <Gauge value={64} aria-label="SEO score" semantic="meter" thresholds={[{ at: 0, color: "danger", label: "Poor" }, { at: 50, color: "warning", label: "Fair" }, { at: 80, color: "success", label: "Good" }]} color="auto" />
60
+ * ```
61
+ */
62
+ export declare const Gauge: React.ForwardRefExoticComponent<GaugeProps & React.RefAttributes<HTMLDivElement>>;