@nadicodeai/ui 12.1.95 → 12.1.97

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 (596) hide show
  1. package/AGENTS.md +5 -1
  2. package/dist/components/accordion.d.ts +13 -0
  3. package/dist/components/accordion.d.ts.map +1 -1
  4. package/dist/components/accordion.js +13 -0
  5. package/dist/components/account-menu.d.ts +62 -18
  6. package/dist/components/account-menu.d.ts.map +1 -1
  7. package/dist/components/account-menu.js +32 -8
  8. package/dist/components/action-menu.d.ts +61 -5
  9. package/dist/components/action-menu.d.ts.map +1 -1
  10. package/dist/components/action-menu.js +31 -2
  11. package/dist/components/action-status.d.ts +13 -3
  12. package/dist/components/action-status.d.ts.map +1 -1
  13. package/dist/components/action-status.js +13 -3
  14. package/dist/components/activity-calendar.d.ts +14 -0
  15. package/dist/components/activity-calendar.d.ts.map +1 -1
  16. package/dist/components/activity-calendar.js +14 -0
  17. package/dist/components/activity-feed.d.ts +62 -0
  18. package/dist/components/activity-feed.d.ts.map +1 -0
  19. package/dist/components/activity-feed.js +54 -0
  20. package/dist/components/agent-card.d.ts +15 -0
  21. package/dist/components/agent-card.d.ts.map +1 -1
  22. package/dist/components/agent-card.js +15 -0
  23. package/dist/components/agent-list-row.d.ts +11 -7
  24. package/dist/components/agent-list-row.d.ts.map +1 -1
  25. package/dist/components/agent-list-row.js +10 -8
  26. package/dist/components/agent-orb-appearance.d.ts +5 -4
  27. package/dist/components/agent-orb-appearance.d.ts.map +1 -1
  28. package/dist/components/agent-orb.d.ts +16 -0
  29. package/dist/components/agent-orb.d.ts.map +1 -1
  30. package/dist/components/agent-orb.js +17 -0
  31. package/dist/components/agent-profile.d.ts +39 -10
  32. package/dist/components/agent-profile.d.ts.map +1 -1
  33. package/dist/components/agent-profile.js +40 -10
  34. package/dist/components/alert-dialog.d.ts +14 -0
  35. package/dist/components/alert-dialog.d.ts.map +1 -1
  36. package/dist/components/alert-dialog.js +14 -0
  37. package/dist/components/alert.d.ts +14 -0
  38. package/dist/components/alert.d.ts.map +1 -1
  39. package/dist/components/alert.js +14 -0
  40. package/dist/components/app-mark.d.ts +14 -4
  41. package/dist/components/app-mark.d.ts.map +1 -1
  42. package/dist/components/app-mark.js +16 -4
  43. package/dist/components/approval-row.d.ts +15 -2
  44. package/dist/components/approval-row.d.ts.map +1 -1
  45. package/dist/components/approval-row.js +15 -2
  46. package/dist/components/aspect-ratio.d.ts +10 -0
  47. package/dist/components/aspect-ratio.d.ts.map +1 -1
  48. package/dist/components/aspect-ratio.js +13 -1
  49. package/dist/components/avatar.d.ts +15 -0
  50. package/dist/components/avatar.d.ts.map +1 -1
  51. package/dist/components/avatar.js +15 -0
  52. package/dist/components/badge.d.ts +11 -1
  53. package/dist/components/badge.d.ts.map +1 -1
  54. package/dist/components/badge.js +10 -5
  55. package/dist/components/brand-field.d.ts +10 -0
  56. package/dist/components/brand-field.d.ts.map +1 -1
  57. package/dist/components/brand-field.js +10 -0
  58. package/dist/components/brand.d.ts +14 -0
  59. package/dist/components/brand.d.ts.map +1 -1
  60. package/dist/components/brand.js +18 -4
  61. package/dist/components/breadcrumb.d.ts +20 -2
  62. package/dist/components/breadcrumb.d.ts.map +1 -1
  63. package/dist/components/breadcrumb.js +13 -3
  64. package/dist/components/button-group.d.ts +21 -0
  65. package/dist/components/button-group.d.ts.map +1 -1
  66. package/dist/components/button-group.js +21 -0
  67. package/dist/components/button.d.ts +20 -0
  68. package/dist/components/button.d.ts.map +1 -1
  69. package/dist/components/button.js +20 -0
  70. package/dist/components/calendar.d.ts +15 -0
  71. package/dist/components/calendar.d.ts.map +1 -1
  72. package/dist/components/calendar.js +15 -0
  73. package/dist/components/card-row.d.ts +15 -5
  74. package/dist/components/card-row.d.ts.map +1 -1
  75. package/dist/components/card-row.js +15 -5
  76. package/dist/components/card.d.ts +16 -0
  77. package/dist/components/card.d.ts.map +1 -1
  78. package/dist/components/card.js +16 -0
  79. package/dist/components/carousel.d.ts +12 -0
  80. package/dist/components/carousel.d.ts.map +1 -1
  81. package/dist/components/carousel.js +12 -0
  82. package/dist/components/catalog-drawer.d.ts +29 -0
  83. package/dist/components/catalog-drawer.d.ts.map +1 -0
  84. package/dist/components/catalog-drawer.js +31 -0
  85. package/dist/components/catalog-entry.d.ts +49 -26
  86. package/dist/components/catalog-entry.d.ts.map +1 -1
  87. package/dist/components/catalog-entry.js +5 -27
  88. package/dist/components/channel-view.d.ts +23 -0
  89. package/dist/components/channel-view.d.ts.map +1 -1
  90. package/dist/components/channel-view.js +13 -4
  91. package/dist/components/chart-area-stacked.d.ts +11 -1
  92. package/dist/components/chart-area-stacked.d.ts.map +1 -1
  93. package/dist/components/chart-area-stacked.js +12 -2
  94. package/dist/components/chart-axis.d.ts.map +1 -1
  95. package/dist/components/chart-axis.js +2 -0
  96. package/dist/components/chart-bar-horizontal.d.ts +11 -1
  97. package/dist/components/chart-bar-horizontal.d.ts.map +1 -1
  98. package/dist/components/chart-bar-horizontal.js +15 -2
  99. package/dist/components/chart-bar-multiple.d.ts +9 -4
  100. package/dist/components/chart-bar-multiple.d.ts.map +1 -1
  101. package/dist/components/chart-bar-multiple.js +10 -5
  102. package/dist/components/chart-bar-stacked.d.ts +11 -1
  103. package/dist/components/chart-bar-stacked.d.ts.map +1 -1
  104. package/dist/components/chart-bar-stacked.js +12 -2
  105. package/dist/components/chart-card.d.ts +38 -24
  106. package/dist/components/chart-card.d.ts.map +1 -1
  107. package/dist/components/chart-card.js +21 -8
  108. package/dist/components/chart-date-range-control.d.ts +15 -10
  109. package/dist/components/chart-date-range-control.d.ts.map +1 -1
  110. package/dist/components/chart-date-range-control.js +16 -12
  111. package/dist/components/chart-date-range.d.ts +2 -1
  112. package/dist/components/chart-date-range.d.ts.map +1 -1
  113. package/dist/components/chart-date-range.js +5 -2
  114. package/dist/components/chart-entity-colors.d.ts +7 -0
  115. package/dist/components/chart-entity-colors.d.ts.map +1 -1
  116. package/dist/components/chart-entity-colors.js +7 -0
  117. package/dist/components/chart-sparkline.d.ts +10 -0
  118. package/dist/components/chart-sparkline.d.ts.map +1 -1
  119. package/dist/components/chart-sparkline.js +8 -7
  120. package/dist/components/chart.d.ts +10 -0
  121. package/dist/components/chart.d.ts.map +1 -1
  122. package/dist/components/chart.js +27 -4
  123. package/dist/components/checkbox.d.ts +15 -0
  124. package/dist/components/checkbox.d.ts.map +1 -1
  125. package/dist/components/checkbox.js +15 -0
  126. package/dist/components/code-block.d.ts +15 -0
  127. package/dist/components/code-block.d.ts.map +1 -1
  128. package/dist/components/code-block.js +15 -0
  129. package/dist/components/collapsible.d.ts +12 -0
  130. package/dist/components/collapsible.d.ts.map +1 -1
  131. package/dist/components/collapsible.js +12 -0
  132. package/dist/components/collection-filters.d.ts +15 -2
  133. package/dist/components/collection-filters.d.ts.map +1 -1
  134. package/dist/components/collection-filters.js +13 -1
  135. package/dist/components/collection-page.d.ts +29 -115
  136. package/dist/components/collection-page.d.ts.map +1 -1
  137. package/dist/components/collection-page.js +24 -139
  138. package/dist/components/collection-search.d.ts +14 -0
  139. package/dist/components/collection-search.d.ts.map +1 -1
  140. package/dist/components/collection-search.js +14 -0
  141. package/dist/components/collection-sort.d.ts +13 -3
  142. package/dist/components/collection-sort.d.ts.map +1 -1
  143. package/dist/components/collection-sort.js +17 -4
  144. package/dist/components/collection-toolbar.d.ts +13 -0
  145. package/dist/components/collection-toolbar.d.ts.map +1 -1
  146. package/dist/components/collection-toolbar.js +13 -0
  147. package/dist/components/combobox.d.ts +17 -0
  148. package/dist/components/combobox.d.ts.map +1 -1
  149. package/dist/components/combobox.js +17 -0
  150. package/dist/components/command.d.ts +16 -0
  151. package/dist/components/command.d.ts.map +1 -1
  152. package/dist/components/command.js +16 -0
  153. package/dist/components/company-card/renderer.js +2 -2
  154. package/dist/components/company-card.d.ts +16 -4
  155. package/dist/components/company-card.d.ts.map +1 -1
  156. package/dist/components/company-card.js +22 -10
  157. package/dist/components/confirm-dialog.d.ts +24 -14
  158. package/dist/components/confirm-dialog.d.ts.map +1 -1
  159. package/dist/components/confirm-dialog.js +16 -10
  160. package/dist/components/context-menu.d.ts +10 -0
  161. package/dist/components/context-menu.d.ts.map +1 -1
  162. package/dist/components/context-menu.js +10 -0
  163. package/dist/components/copy-button.d.ts +10 -0
  164. package/dist/components/copy-button.d.ts.map +1 -1
  165. package/dist/components/copy-button.js +10 -0
  166. package/dist/components/dashboard-shell.d.ts +14 -0
  167. package/dist/components/dashboard-shell.d.ts.map +1 -1
  168. package/dist/components/dashboard-shell.js +15 -1
  169. package/dist/components/data-table.d.ts +23 -1
  170. package/dist/components/data-table.d.ts.map +1 -1
  171. package/dist/components/data-table.js +63 -31
  172. package/dist/components/desktop-shell.d.ts +15 -0
  173. package/dist/components/desktop-shell.d.ts.map +1 -1
  174. package/dist/components/desktop-shell.js +15 -0
  175. package/dist/components/dialog.d.ts +16 -0
  176. package/dist/components/dialog.d.ts.map +1 -1
  177. package/dist/components/dialog.js +16 -0
  178. package/dist/components/diff-count.d.ts +11 -0
  179. package/dist/components/diff-count.d.ts.map +1 -1
  180. package/dist/components/diff-count.js +11 -0
  181. package/dist/components/disclosure-row.d.ts +12 -0
  182. package/dist/components/disclosure-row.d.ts.map +1 -1
  183. package/dist/components/disclosure-row.js +12 -0
  184. package/dist/components/disclosure.d.ts +15 -5
  185. package/dist/components/disclosure.d.ts.map +1 -1
  186. package/dist/components/disclosure.js +15 -5
  187. package/dist/components/drawer.d.ts +13 -0
  188. package/dist/components/drawer.d.ts.map +1 -1
  189. package/dist/components/drawer.js +13 -0
  190. package/dist/components/dropdown-menu.d.ts +17 -5
  191. package/dist/components/dropdown-menu.d.ts.map +1 -1
  192. package/dist/components/dropdown-menu.js +20 -7
  193. package/dist/components/empty-art.d.ts +1 -1
  194. package/dist/components/empty-art.d.ts.map +1 -1
  195. package/dist/components/empty-art.js +8 -0
  196. package/dist/components/empty-state.d.ts +24 -10
  197. package/dist/components/empty-state.d.ts.map +1 -1
  198. package/dist/components/empty-state.js +23 -1
  199. package/dist/components/entry-scene.d.ts +33 -20
  200. package/dist/components/entry-scene.d.ts.map +1 -1
  201. package/dist/components/entry-scene.js +40 -9
  202. package/dist/components/expandable-block.d.ts +10 -0
  203. package/dist/components/expandable-block.d.ts.map +1 -1
  204. package/dist/components/expandable-block.js +10 -0
  205. package/dist/components/field.d.ts +17 -0
  206. package/dist/components/field.d.ts.map +1 -1
  207. package/dist/components/field.js +17 -0
  208. package/dist/components/file-diff.d.ts +12 -0
  209. package/dist/components/file-diff.d.ts.map +1 -1
  210. package/dist/components/file-diff.js +12 -0
  211. package/dist/components/file-type-icon.d.ts +12 -0
  212. package/dist/components/file-type-icon.d.ts.map +1 -1
  213. package/dist/components/file-type-icon.js +46 -31
  214. package/dist/components/footer.d.ts +14 -0
  215. package/dist/components/footer.d.ts.map +1 -1
  216. package/dist/components/footer.js +14 -0
  217. package/dist/components/form-dialog.d.ts +10 -0
  218. package/dist/components/form-dialog.d.ts.map +1 -1
  219. package/dist/components/form-dialog.js +10 -0
  220. package/dist/components/form-drawer.d.ts +24 -11
  221. package/dist/components/form-drawer.d.ts.map +1 -1
  222. package/dist/components/form-drawer.js +13 -3
  223. package/dist/components/form.d.ts +17 -0
  224. package/dist/components/form.d.ts.map +1 -1
  225. package/dist/components/form.js +25 -5
  226. package/dist/components/glass-control.d.ts +13 -0
  227. package/dist/components/glass-control.d.ts.map +1 -1
  228. package/dist/components/glass-control.js +13 -0
  229. package/dist/components/heatmap/calendar-heatmap.d.ts.map +1 -1
  230. package/dist/components/heatmap/calendar-heatmap.js +6 -4
  231. package/dist/components/hive-scene.d.ts +14 -0
  232. package/dist/components/hive-scene.d.ts.map +1 -1
  233. package/dist/components/hive-scene.js +14 -0
  234. package/dist/components/house-icons.d.ts +15 -0
  235. package/dist/components/house-icons.d.ts.map +1 -1
  236. package/dist/components/house-icons.js +19 -1
  237. package/dist/components/hover-card.d.ts +15 -0
  238. package/dist/components/hover-card.d.ts.map +1 -1
  239. package/dist/components/hover-card.js +15 -0
  240. package/dist/components/identity-mark.d.ts +55 -0
  241. package/dist/components/identity-mark.d.ts.map +1 -0
  242. package/dist/components/identity-mark.js +66 -0
  243. package/dist/components/input-group.d.ts +16 -0
  244. package/dist/components/input-group.d.ts.map +1 -1
  245. package/dist/components/input-group.js +17 -0
  246. package/dist/components/input-otp.d.ts +15 -0
  247. package/dist/components/input-otp.d.ts.map +1 -1
  248. package/dist/components/input-otp.js +15 -0
  249. package/dist/components/input.d.ts +15 -0
  250. package/dist/components/input.d.ts.map +1 -1
  251. package/dist/components/input.js +15 -0
  252. package/dist/components/item.d.ts +16 -0
  253. package/dist/components/item.d.ts.map +1 -1
  254. package/dist/components/item.js +16 -0
  255. package/dist/components/kbd.d.ts +14 -0
  256. package/dist/components/kbd.d.ts.map +1 -1
  257. package/dist/components/kbd.js +14 -0
  258. package/dist/components/kpi-card.d.ts +21 -13
  259. package/dist/components/kpi-card.d.ts.map +1 -1
  260. package/dist/components/kpi-card.js +14 -3
  261. package/dist/components/label-system.d.ts +12 -0
  262. package/dist/components/label-system.d.ts.map +1 -1
  263. package/dist/components/label-system.js +12 -0
  264. package/dist/components/label.d.ts +15 -0
  265. package/dist/components/label.d.ts.map +1 -1
  266. package/dist/components/label.js +15 -0
  267. package/dist/components/library-shelf.d.ts +35 -0
  268. package/dist/components/library-shelf.d.ts.map +1 -0
  269. package/dist/components/library-shelf.js +40 -0
  270. package/dist/components/memory-item.d.ts +12 -0
  271. package/dist/components/memory-item.d.ts.map +1 -1
  272. package/dist/components/memory-item.js +12 -0
  273. package/dist/components/menu-choice-row.d.ts +13 -5
  274. package/dist/components/menu-choice-row.d.ts.map +1 -1
  275. package/dist/components/menu-choice-row.js +12 -6
  276. package/dist/components/menubar.d.ts +13 -0
  277. package/dist/components/menubar.d.ts.map +1 -1
  278. package/dist/components/menubar.js +13 -0
  279. package/dist/components/message-notice.d.ts +16 -0
  280. package/dist/components/message-notice.d.ts.map +1 -1
  281. package/dist/components/message-notice.js +18 -2
  282. package/dist/components/model-identity.d.ts +16 -3
  283. package/dist/components/model-identity.d.ts.map +1 -1
  284. package/dist/components/model-identity.js +16 -3
  285. package/dist/components/model-mark.d.ts +15 -2
  286. package/dist/components/model-mark.d.ts.map +1 -1
  287. package/dist/components/model-mark.js +36 -23
  288. package/dist/components/nadia-presence.d.ts +10 -4
  289. package/dist/components/nadia-presence.d.ts.map +1 -1
  290. package/dist/components/nadia-presence.js +10 -4
  291. package/dist/components/native-select.d.ts +16 -0
  292. package/dist/components/native-select.d.ts.map +1 -1
  293. package/dist/components/native-select.js +21 -0
  294. package/dist/components/navigation-menu.d.ts +14 -0
  295. package/dist/components/navigation-menu.d.ts.map +1 -1
  296. package/dist/components/navigation-menu.js +14 -0
  297. package/dist/components/notice-banner.d.ts +10 -3
  298. package/dist/components/notice-banner.d.ts.map +1 -1
  299. package/dist/components/notice-banner.js +9 -3
  300. package/dist/components/numbered-steps.d.ts +33 -0
  301. package/dist/components/numbered-steps.d.ts.map +1 -0
  302. package/dist/components/numbered-steps.js +23 -0
  303. package/dist/components/object-page.d.ts +37 -0
  304. package/dist/components/object-page.d.ts.map +1 -0
  305. package/dist/components/object-page.js +19 -0
  306. package/dist/components/object-workspace.d.ts +26 -36
  307. package/dist/components/object-workspace.d.ts.map +1 -1
  308. package/dist/components/object-workspace.js +27 -24
  309. package/dist/components/overview-page.d.ts +24 -0
  310. package/dist/components/overview-page.d.ts.map +1 -0
  311. package/dist/components/overview-page.js +26 -0
  312. package/dist/components/page-actions.d.ts +28 -23
  313. package/dist/components/page-actions.d.ts.map +1 -1
  314. package/dist/components/page-actions.js +20 -14
  315. package/dist/components/page-header.d.ts +11 -5
  316. package/dist/components/page-header.d.ts.map +1 -1
  317. package/dist/components/page-header.js +11 -5
  318. package/dist/components/pagination.d.ts +15 -0
  319. package/dist/components/pagination.d.ts.map +1 -1
  320. package/dist/components/pagination.js +15 -0
  321. package/dist/components/pairing-code.d.ts +15 -4
  322. package/dist/components/pairing-code.d.ts.map +1 -1
  323. package/dist/components/pairing-code.js +15 -4
  324. package/dist/components/pending-label.d.ts +12 -4
  325. package/dist/components/pending-label.d.ts.map +1 -1
  326. package/dist/components/pending-label.js +12 -4
  327. package/dist/components/picture-label.d.ts +15 -7
  328. package/dist/components/picture-label.d.ts.map +1 -1
  329. package/dist/components/picture-label.js +15 -7
  330. package/dist/components/platform-mark.d.ts +12 -3
  331. package/dist/components/platform-mark.d.ts.map +1 -1
  332. package/dist/components/platform-mark.js +12 -3
  333. package/dist/components/plugin-slot-boundary.d.ts +15 -0
  334. package/dist/components/plugin-slot-boundary.d.ts.map +1 -1
  335. package/dist/components/plugin-slot-boundary.js +18 -1
  336. package/dist/components/popover.d.ts +15 -0
  337. package/dist/components/popover.d.ts.map +1 -1
  338. package/dist/components/popover.js +15 -0
  339. package/dist/components/portal-sidebar-frame.d.ts +26 -12
  340. package/dist/components/portal-sidebar-frame.d.ts.map +1 -1
  341. package/dist/components/portal-sidebar-frame.js +26 -0
  342. package/dist/components/product-message.d.ts.map +1 -1
  343. package/dist/components/product-message.js +1 -0
  344. package/dist/components/progress.d.ts +10 -8
  345. package/dist/components/progress.d.ts.map +1 -1
  346. package/dist/components/progress.js +17 -16
  347. package/dist/components/qr-code.d.ts +9 -3
  348. package/dist/components/qr-code.d.ts.map +1 -1
  349. package/dist/components/qr-code.js +9 -3
  350. package/dist/components/radio-group.d.ts +15 -0
  351. package/dist/components/radio-group.d.ts.map +1 -1
  352. package/dist/components/radio-group.js +15 -0
  353. package/dist/components/reading-column.d.ts +11 -0
  354. package/dist/components/reading-column.d.ts.map +1 -1
  355. package/dist/components/reading-column.js +11 -0
  356. package/dist/components/record-identity.d.ts +12 -7
  357. package/dist/components/record-identity.d.ts.map +1 -1
  358. package/dist/components/record-identity.js +12 -7
  359. package/dist/components/record-list.d.ts +119 -0
  360. package/dist/components/record-list.d.ts.map +1 -0
  361. package/dist/components/record-list.js +161 -0
  362. package/dist/components/record-sheet.d.ts +36 -0
  363. package/dist/components/record-sheet.d.ts.map +1 -0
  364. package/dist/components/record-sheet.js +19 -0
  365. package/dist/components/record-time.d.ts +27 -11
  366. package/dist/components/record-time.d.ts.map +1 -1
  367. package/dist/components/record-time.js +35 -14
  368. package/dist/components/resizable.d.ts +10 -0
  369. package/dist/components/resizable.d.ts.map +1 -1
  370. package/dist/components/resizable.js +10 -0
  371. package/dist/components/row-edit-form.d.ts +8 -5
  372. package/dist/components/row-edit-form.d.ts.map +1 -1
  373. package/dist/components/row-edit-form.js +8 -5
  374. package/dist/components/run-timeline.d.ts +24 -11
  375. package/dist/components/run-timeline.d.ts.map +1 -1
  376. package/dist/components/run-timeline.js +13 -6
  377. package/dist/components/scope-switcher.d.ts +11 -0
  378. package/dist/components/scope-switcher.d.ts.map +1 -1
  379. package/dist/components/scope-switcher.js +20 -9
  380. package/dist/components/scroll-area.d.ts +12 -0
  381. package/dist/components/scroll-area.d.ts.map +1 -1
  382. package/dist/components/scroll-area.js +12 -0
  383. package/dist/components/select.d.ts +16 -0
  384. package/dist/components/select.d.ts.map +1 -1
  385. package/dist/components/select.js +16 -0
  386. package/dist/components/separator.d.ts +11 -0
  387. package/dist/components/separator.d.ts.map +1 -1
  388. package/dist/components/separator.js +11 -0
  389. package/dist/components/settings-facts.d.ts +18 -1
  390. package/dist/components/settings-facts.d.ts.map +1 -1
  391. package/dist/components/settings-facts.js +20 -1
  392. package/dist/components/settings-page.d.ts +20 -0
  393. package/dist/components/settings-page.d.ts.map +1 -0
  394. package/dist/components/settings-page.js +16 -0
  395. package/dist/components/settings-section.d.ts +38 -8
  396. package/dist/components/settings-section.d.ts.map +1 -1
  397. package/dist/components/settings-section.js +33 -7
  398. package/dist/components/sheet.d.ts +16 -0
  399. package/dist/components/sheet.d.ts.map +1 -1
  400. package/dist/components/sheet.js +16 -0
  401. package/dist/components/sidebar-sections.d.ts +40 -0
  402. package/dist/components/sidebar-sections.d.ts.map +1 -0
  403. package/dist/components/sidebar-sections.js +35 -0
  404. package/dist/components/sidebar.d.ts +14 -1
  405. package/dist/components/sidebar.d.ts.map +1 -1
  406. package/dist/components/sidebar.js +24 -5
  407. package/dist/components/skeleton.d.ts +10 -0
  408. package/dist/components/skeleton.d.ts.map +1 -1
  409. package/dist/components/skeleton.js +11 -1
  410. package/dist/components/slider.d.ts +14 -0
  411. package/dist/components/slider.d.ts.map +1 -1
  412. package/dist/components/slider.js +14 -0
  413. package/dist/components/sonner.d.ts +18 -0
  414. package/dist/components/sonner.d.ts.map +1 -1
  415. package/dist/components/sonner.js +23 -2
  416. package/dist/components/status-badge.d.ts +13 -2
  417. package/dist/components/status-badge.d.ts.map +1 -1
  418. package/dist/components/status-badge.js +21 -9
  419. package/dist/components/status-dot.d.ts +12 -0
  420. package/dist/components/status-dot.d.ts.map +1 -1
  421. package/dist/components/status-dot.js +12 -0
  422. package/dist/components/status-row.d.ts +14 -0
  423. package/dist/components/status-row.d.ts.map +1 -1
  424. package/dist/components/status-row.js +14 -0
  425. package/dist/components/switch.d.ts +15 -0
  426. package/dist/components/switch.d.ts.map +1 -1
  427. package/dist/components/switch.js +15 -0
  428. package/dist/components/table-card.d.ts +16 -3
  429. package/dist/components/table-card.d.ts.map +1 -1
  430. package/dist/components/table-card.js +16 -3
  431. package/dist/components/table-value.d.ts +24 -2
  432. package/dist/components/table-value.d.ts.map +1 -1
  433. package/dist/components/table-value.js +25 -3
  434. package/dist/components/table.d.ts +16 -0
  435. package/dist/components/table.d.ts.map +1 -1
  436. package/dist/components/table.js +17 -1
  437. package/dist/components/tabs.d.ts +27 -0
  438. package/dist/components/tabs.d.ts.map +1 -1
  439. package/dist/components/tabs.js +27 -0
  440. package/dist/components/tag.d.ts +12 -2
  441. package/dist/components/tag.d.ts.map +1 -1
  442. package/dist/components/tag.js +12 -2
  443. package/dist/components/text-link.d.ts +17 -0
  444. package/dist/components/text-link.d.ts.map +1 -1
  445. package/dist/components/text-link.js +17 -0
  446. package/dist/components/textarea.d.ts +14 -0
  447. package/dist/components/textarea.d.ts.map +1 -1
  448. package/dist/components/textarea.js +14 -0
  449. package/dist/components/theme-mode-switcher.d.ts +21 -0
  450. package/dist/components/theme-mode-switcher.d.ts.map +1 -1
  451. package/dist/components/theme-mode-switcher.js +23 -1
  452. package/dist/components/toggle-group.d.ts +13 -0
  453. package/dist/components/toggle-group.d.ts.map +1 -1
  454. package/dist/components/toggle-group.js +16 -1
  455. package/dist/components/toggle.d.ts +14 -0
  456. package/dist/components/toggle.d.ts.map +1 -1
  457. package/dist/components/toggle.js +14 -0
  458. package/dist/components/tool-icon.d.ts +14 -4
  459. package/dist/components/tool-icon.d.ts.map +1 -1
  460. package/dist/components/tool-icon.js +28 -19
  461. package/dist/components/tooltip.d.ts +15 -0
  462. package/dist/components/tooltip.d.ts.map +1 -1
  463. package/dist/components/tooltip.js +15 -0
  464. package/dist/components/trend-badge.d.ts +16 -1
  465. package/dist/components/trend-badge.d.ts.map +1 -1
  466. package/dist/components/trend-badge.js +16 -7
  467. package/dist/components/update-card.d.ts +36 -0
  468. package/dist/components/update-card.d.ts.map +1 -0
  469. package/dist/components/update-card.js +28 -0
  470. package/dist/components/usage-meter.d.ts +15 -0
  471. package/dist/components/usage-meter.d.ts.map +1 -1
  472. package/dist/components/usage-meter.js +20 -1
  473. package/dist/components/waiting-line.d.ts +13 -10
  474. package/dist/components/waiting-line.d.ts.map +1 -1
  475. package/dist/components/waiting-line.js +13 -10
  476. package/dist/eslint/index.js +9 -0
  477. package/dist/eslint/rules/empty-state-owner.js +145 -0
  478. package/dist/eslint/rules/jsx-class-utility.js +5 -0
  479. package/dist/eslint/rules/menu-owner.js +75 -0
  480. package/dist/eslint/rules/no-choice-control-wrapper.js +2 -0
  481. package/dist/eslint/rules/no-decorative-icon.js +164 -0
  482. package/dist/eslint/rules/no-deprecated-zod-api.js +1 -0
  483. package/dist/eslint/rules/no-shadcn-appearance-override.js +1 -0
  484. package/dist/eslint/rules/no-subject-derived-expectation.js +1 -1
  485. package/dist/eslint/rules/no-write-in-subscription.js +1 -0
  486. package/dist/eslint/rules/page-composition.js +232 -0
  487. package/dist/eslint/rules/rendered-import.js +121 -0
  488. package/dist/eslint/strict-design-system.js +1 -1
  489. package/dist/hooks/use-hydrated.d.ts +2 -0
  490. package/dist/hooks/use-hydrated.d.ts.map +1 -0
  491. package/dist/hooks/use-hydrated.js +7 -0
  492. package/dist/index.d.ts +15 -10
  493. package/dist/index.d.ts.map +1 -1
  494. package/dist/index.js +15 -10
  495. package/dist/internal/agent-orb.d.ts.map +1 -1
  496. package/dist/internal/agent-orb.js +2 -1
  497. package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
  498. package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
  499. package/dist/internal/assistant-ui/reasoning.js +3 -1
  500. package/dist/internal/assistant-ui/thread.js +3 -1
  501. package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
  502. package/dist/internal/assistant-ui/tool-fallback.js +13 -13
  503. package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
  504. package/dist/internal/assistant-ui/tool-group.js +3 -1
  505. package/dist/internal/catalog-list.d.ts +14 -0
  506. package/dist/internal/catalog-list.d.ts.map +1 -0
  507. package/dist/internal/catalog-list.js +53 -0
  508. package/dist/internal/empty.d.ts +6 -9
  509. package/dist/internal/empty.d.ts.map +1 -1
  510. package/dist/internal/empty.js +24 -22
  511. package/dist/internal/footer-strip.d.ts +0 -4
  512. package/dist/internal/footer-strip.d.ts.map +1 -1
  513. package/dist/internal/footer-strip.js +0 -4
  514. package/dist/internal/record-menu-items.d.ts +19 -0
  515. package/dist/internal/record-menu-items.d.ts.map +1 -0
  516. package/dist/internal/record-menu-items.js +20 -0
  517. package/dist/internal/settings-save.d.ts +43 -0
  518. package/dist/internal/settings-save.d.ts.map +1 -0
  519. package/dist/internal/settings-save.js +147 -0
  520. package/dist/lib/theme-mode.d.ts +1 -1
  521. package/dist/lib/theme-mode.js +2 -2
  522. package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -1
  523. package/dist/lib/use-copy-to-clipboard.js +1 -0
  524. package/dist/showcase/assets.d.ts +8 -0
  525. package/dist/showcase/assets.d.ts.map +1 -0
  526. package/dist/showcase/assets.js +13 -0
  527. package/dist/showcase/foundations.d.ts +2 -0
  528. package/dist/showcase/foundations.d.ts.map +1 -0
  529. package/dist/showcase/foundations.js +61 -0
  530. package/dist/showcase/samples.d.ts +21 -0
  531. package/dist/showcase/samples.d.ts.map +1 -0
  532. package/dist/showcase/samples.js +48 -0
  533. package/dist/showcase/showcase.d.ts +10 -0
  534. package/dist/showcase/showcase.d.ts.map +1 -0
  535. package/dist/showcase/showcase.js +44 -0
  536. package/dist/showcase/specimens/actions.d.ts +7 -0
  537. package/dist/showcase/specimens/actions.d.ts.map +1 -0
  538. package/dist/showcase/specimens/actions.js +15 -0
  539. package/dist/showcase/specimens/charts.d.ts +17 -0
  540. package/dist/showcase/specimens/charts.d.ts.map +1 -0
  541. package/dist/showcase/specimens/charts.js +104 -0
  542. package/dist/showcase/specimens/choices.d.ts +21 -0
  543. package/dist/showcase/specimens/choices.d.ts.map +1 -0
  544. package/dist/showcase/specimens/choices.js +68 -0
  545. package/dist/showcase/specimens/compositions.d.ts +39 -0
  546. package/dist/showcase/specimens/compositions.d.ts.map +1 -0
  547. package/dist/showcase/specimens/compositions.js +270 -0
  548. package/dist/showcase/specimens/data.d.ts +31 -0
  549. package/dist/showcase/specimens/data.d.ts.map +1 -0
  550. package/dist/showcase/specimens/data.js +111 -0
  551. package/dist/showcase/specimens/feedback.d.ts +23 -0
  552. package/dist/showcase/specimens/feedback.d.ts.map +1 -0
  553. package/dist/showcase/specimens/feedback.js +64 -0
  554. package/dist/showcase/specimens/index.d.ts +164 -0
  555. package/dist/showcase/specimens/index.d.ts.map +1 -0
  556. package/dist/showcase/specimens/index.js +24 -0
  557. package/dist/showcase/specimens/inputs.d.ts +22 -0
  558. package/dist/showcase/specimens/inputs.d.ts.map +1 -0
  559. package/dist/showcase/specimens/inputs.js +60 -0
  560. package/dist/showcase/specimens/menus.d.ts +20 -0
  561. package/dist/showcase/specimens/menus.d.ts.map +1 -0
  562. package/dist/showcase/specimens/menus.js +65 -0
  563. package/dist/showcase/specimens/navigation.d.ts +22 -0
  564. package/dist/showcase/specimens/navigation.d.ts.map +1 -0
  565. package/dist/showcase/specimens/navigation.js +103 -0
  566. package/dist/showcase/specimens/other.d.ts +26 -0
  567. package/dist/showcase/specimens/other.d.ts.map +1 -0
  568. package/dist/showcase/specimens/other.js +73 -0
  569. package/dist/showcase/specimens/specimen.d.ts +5 -0
  570. package/dist/showcase/specimens/specimen.d.ts.map +1 -0
  571. package/dist/showcase/specimens/specimen.js +1 -0
  572. package/dist/showcase/specimens/status.d.ts +22 -0
  573. package/dist/showcase/specimens/status.d.ts.map +1 -0
  574. package/dist/showcase/specimens/status.js +44 -0
  575. package/dist/showcase/usage.generated.d.ts +16 -0
  576. package/dist/showcase/usage.generated.d.ts.map +1 -0
  577. package/dist/showcase/usage.generated.js +1788 -0
  578. package/dist/standalone/index.js +2 -2
  579. package/dist/standalone/orb-page.js +1 -0
  580. package/dist/styles/components.css +21 -0
  581. package/package.json +8 -3
  582. package/dist/components/automation-section.d.ts +0 -78
  583. package/dist/components/automation-section.d.ts.map +0 -1
  584. package/dist/components/automation-section.js +0 -75
  585. package/dist/components/catalog-tile.d.ts +0 -19
  586. package/dist/components/catalog-tile.d.ts.map +0 -1
  587. package/dist/components/catalog-tile.js +0 -13
  588. package/dist/components/feedback-state.d.ts +0 -14
  589. package/dist/components/feedback-state.d.ts.map +0 -1
  590. package/dist/components/feedback-state.js +0 -65
  591. package/dist/components/installer-shell.d.ts +0 -25
  592. package/dist/components/installer-shell.d.ts.map +0 -1
  593. package/dist/components/installer-shell.js +0 -32
  594. package/dist/components/settings-form.d.ts +0 -9
  595. package/dist/components/settings-form.d.ts.map +0 -1
  596. package/dist/components/settings-form.js +0 -85
@@ -1 +1 @@
1
- {"version":3,"file":"chart-bar-multiple.d.ts","sourceRoot":"","sources":["../../src/components/chart-bar-multiple.tsx"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAGjC;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,WAAW,EACX,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,cAAc,EACd,cAAsC,EACtC,aAAa,EACb,UAAoB,EACpB,UAAU,EACV,IAAgB,EAChB,SAAS,GACV,EAAE,cAAc,+BAgEhB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-bar-multiple.d.ts","sourceRoot":"","sources":["../../src/components/chart-bar-multiple.tsx"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAGjC;;;;;;;;;GASG;AACH,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,cAAc,EACd,cAAsC,EACtC,aAAa,EACb,UAAU,EACV,UAAU,EACV,IAAgB,EAChB,SAAS,GACV,EAAE,cAAc,+BAgEhB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -8,15 +8,20 @@ import { CHART_Y_AXIS_TICK_COUNT, niceAxisTicks, seriesAxisMax } from "./chart-a
8
8
  import { CHART_LEGEND_CLASS, ChartCard, chartPlotClassName, chartSeriesConfig, defaultValueFormatter, foldOtherSeries, } from "./chart-card.js";
9
9
  import { entityColor } from "./chart-entity-colors.js";
10
10
  /**
11
- * Grouped bars: two or more measures side by side per period, on ONE axis in
12
- * one unit. A rate over those measures (a margin percentage) is a KPI card, not
13
- * a second axis on this plot.
11
+ * Grouped bars: two or more measures side by side per period, on one axis in one unit.
12
+ *
13
+ * @family Charts
14
+ * @when Two money measures compared period by period: monthly recurring revenue against model cost.
15
+ * @instead Never a second axis: a ratio such as gross margin is a `KpiCard` beside it. One measure split by entity is `ChartBarStacked`.
16
+ * @behaviour Bars side by side in series order, 4 px gap, every corner 4 px, at most 48 px wide, one shared value axis on nice steps.
17
+ * @words Series named in full: "Monthly recurring revenue", "Model cost". Months as short names on the axis, the full month in the tooltip.
18
+ * @access The plot is named by its title; each bar's figure is in the tooltip and, where the page needs it, a table.
14
19
  */
15
- function ChartBarMultiple({ title, description, action, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter = defaultValueFormatter, axisFormatter, otherLabel = "Other", emptyState, size = "default", className, }) {
20
+ function ChartBarMultiple({ title, period, controls, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter = defaultValueFormatter, axisFormatter, otherLabel, emptyState, size = "default", className, }) {
16
21
  const folded = foldOtherSeries(series, data, entityColorMap, otherLabel);
17
22
  const chartConfig = chartSeriesConfig(folded.series, entityColorMap);
18
23
  const domainMax = seriesAxisMax(folded.data, folded.series.map((entry) => entry.id));
19
- return (_jsx(ChartCard, { title: title, description: description, action: action, summary: summary, aside: aside, footer: footer, ...(headingLevel ? { headingLevel } : {}), className: className, children: (titleId) => emptyState && data.length === 0 ? (emptyState) : (_jsx(ChartContainer, { config: chartConfig, className: chartPlotClassName(size), children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey, tickLine: false, tickMargin: 10, axisLine: false }), _jsx(YAxis, { width: "auto", tickLine: false, axisLine: false, tickMargin: 8, tickCount: CHART_Y_AXIS_TICK_COUNT, ...(domainMax === undefined
24
+ return (_jsx(ChartCard, { title: title, period: period, controls: controls, summary: summary, aside: aside, ...(footer ? { footer } : {}), ...(headingLevel ? { headingLevel } : {}), className: className, children: (titleId) => emptyState && data.length === 0 ? (emptyState) : (_jsx(ChartContainer, { config: chartConfig, className: chartPlotClassName(size), children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey, tickLine: false, tickMargin: 10, axisLine: false }), _jsx(YAxis, { width: "auto", tickLine: false, axisLine: false, tickMargin: 8, tickCount: CHART_Y_AXIS_TICK_COUNT, ...(domainMax === undefined
20
25
  ? {}
21
26
  : {
22
27
  domain: [0, domainMax],
@@ -1,5 +1,15 @@
1
1
  import { type ChartCardProps } from "./chart-card.js";
2
- declare function ChartBarStacked({ title, description, action, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter, axisFormatter, otherLabel, emptyState, size, share, className, }: ChartCardProps & {
2
+ /**
3
+ * One total over time, each bar split by entity; with `share`, one bar split to 100%.
4
+ *
5
+ * @family Charts
6
+ * @when How a total moved over time split by Customer, member account or model; with `share`, what part of one total each holds, with no time axis.
7
+ * @instead For a continuous volume in three series or fewer use `ChartAreaStacked`. Two measures side by side use `ChartBarMultiple`. Exact lookup is a table.
8
+ * @behaviour Stacked in series order, bottom segment rounded below and top above at 4 px, bars at most 48 px. The Portal names five entities and folds the rest into "Everything else". The share plot is 64 px, legend included.
9
+ * @words Entity names as the reader knows them, never ids. The neutral remainder is "Everything else". Values through the page's shared money formatter.
10
+ * @access The plot is an image named by the card title; the tooltip and legend are read with it. The share bar sits above the full-width table that carries each figure.
11
+ */
12
+ declare function ChartBarStacked({ title, period, controls, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter, axisFormatter, otherLabel, emptyState, size, share, className, }: ChartCardProps & {
3
13
  /**
4
14
  * One bar across the card, each entity a segment of 100%: the share of a
5
15
  * total with no time axis. `data` is then a single row keyed by series id.
@@ -1 +1 @@
1
- {"version":3,"file":"chart-bar-stacked.d.ts","sourceRoot":"","sources":["../../src/components/chart-bar-stacked.tsx"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAmBjC,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,WAAW,EACX,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,cAAc,EACd,cAAsC,EACtC,aAAa,EACb,UAAoB,EACpB,UAAU,EACV,IAAgB,EAChB,KAAa,EACb,SAAS,GACV,EAAE,cAAc,GAAG;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,+BAgGA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-bar-stacked.d.ts","sourceRoot":"","sources":["../../src/components/chart-bar-stacked.tsx"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAmBjC;;;;;;;;;GASG;AACH,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,cAAc,EACd,cAAsC,EACtC,aAAa,EACb,UAAU,EACV,UAAU,EACV,IAAgB,EAChB,KAAa,EACb,SAAS,GACV,EAAE,cAAc,GAAG;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,+BAgGA;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -27,11 +27,21 @@ function shareRadius(index, count) {
27
27
  return [0, 4, 4, 0];
28
28
  return [0, 0, 0, 0];
29
29
  }
30
- function ChartBarStacked({ title, description, action, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter = defaultValueFormatter, axisFormatter, otherLabel = "Other", emptyState, size = "default", share = false, className, }) {
30
+ /**
31
+ * One total over time, each bar split by entity; with `share`, one bar split to 100%.
32
+ *
33
+ * @family Charts
34
+ * @when How a total moved over time split by Customer, member account or model; with `share`, what part of one total each holds, with no time axis.
35
+ * @instead For a continuous volume in three series or fewer use `ChartAreaStacked`. Two measures side by side use `ChartBarMultiple`. Exact lookup is a table.
36
+ * @behaviour Stacked in series order, bottom segment rounded below and top above at 4 px, bars at most 48 px. The Portal names five entities and folds the rest into "Everything else". The share plot is 64 px, legend included.
37
+ * @words Entity names as the reader knows them, never ids. The neutral remainder is "Everything else". Values through the page's shared money formatter.
38
+ * @access The plot is an image named by the card title; the tooltip and legend are read with it. The share bar sits above the full-width table that carries each figure.
39
+ */
40
+ function ChartBarStacked({ title, period, controls, summary, aside, footer, headingLevel, data, xKey, series, entityColorMap, valueFormatter = defaultValueFormatter, axisFormatter, otherLabel, emptyState, size = "default", share = false, className, }) {
31
41
  const folded = foldOtherSeries(series, data, entityColorMap, otherLabel);
32
42
  const chartConfig = chartSeriesConfig(folded.series, entityColorMap);
33
43
  const domainMax = stackedAxisMax(folded.data, folded.series.map((entry) => entry.id));
34
- return (_jsx(ChartCard, { title: title, description: description, action: action, summary: summary, aside: aside, footer: footer, ...(headingLevel ? { headingLevel } : {}), className: className, children: (titleId) => emptyState && data.length === 0 ? (emptyState) : share ? (_jsx(ChartContainer, { config: chartConfig, className: "aspect-auto h-16 w-full", children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, layout: "vertical", stackOffset: "expand", children: [_jsx(XAxis, { type: "number", hide: true }), _jsx(YAxis, { type: "category", dataKey: xKey, hide: true }), _jsx(ChartTooltip, { cursor: false, content: _jsx(ChartTooltipContent, { hideLabel: true, indicator: "line", valueFormatter: valueFormatter }) }), _jsx(ChartLegend, { itemSorter: null, content: _jsx(ChartLegendContent, { className: CHART_LEGEND_CLASS }) }), folded.series.map((entry, index) => (_jsx(Bar, { dataKey: entry.id, stackId: "a", fill: entityColor(entityColorMap, entry.id), radius: shareRadius(index, folded.series.length) }, entry.id)))] }) })) : (_jsx(ChartContainer, { config: chartConfig, className: chartPlotClassName(size), children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey, tickLine: false, tickMargin: 10, axisLine: false }), _jsx(YAxis, { width: "auto", tickLine: false, axisLine: false, tickMargin: 8, tickCount: CHART_Y_AXIS_TICK_COUNT, ...(domainMax === undefined
44
+ return (_jsx(ChartCard, { title: title, period: period, controls: controls, summary: summary, aside: aside, ...(footer ? { footer } : {}), ...(headingLevel ? { headingLevel } : {}), className: className, children: (titleId) => emptyState && data.length === 0 ? (emptyState) : share ? (_jsx(ChartContainer, { config: chartConfig, className: "aspect-auto h-16 w-full", children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, layout: "vertical", stackOffset: "expand", children: [_jsx(XAxis, { type: "number", hide: true }), _jsx(YAxis, { type: "category", dataKey: xKey, hide: true }), _jsx(ChartTooltip, { cursor: false, content: _jsx(ChartTooltipContent, { hideLabel: true, indicator: "line", valueFormatter: valueFormatter }) }), _jsx(ChartLegend, { itemSorter: null, content: _jsx(ChartLegendContent, { className: CHART_LEGEND_CLASS }) }), folded.series.map((entry, index) => (_jsx(Bar, { dataKey: entry.id, stackId: "a", fill: entityColor(entityColorMap, entry.id), radius: shareRadius(index, folded.series.length) }, entry.id)))] }) })) : (_jsx(ChartContainer, { config: chartConfig, className: chartPlotClassName(size), children: _jsxs(BarChart, { accessibilityLayer: true, "aria-labelledby": titleId, data: folded.data, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey, tickLine: false, tickMargin: 10, axisLine: false }), _jsx(YAxis, { width: "auto", tickLine: false, axisLine: false, tickMargin: 8, tickCount: CHART_Y_AXIS_TICK_COUNT, ...(domainMax === undefined
35
45
  ? {}
36
46
  : {
37
47
  domain: [0, domainMax],
@@ -1,16 +1,8 @@
1
1
  import * as React from "react";
2
2
  import type { ChartConfig } from "./chart.js";
3
3
  import { type EntityColorMap } from "./chart-entity-colors.js";
4
+ import { type PageCommand } from "./page-actions.js";
4
5
  import { type TrendDirection, type TrendTone } from "./trend-badge.js";
5
- /**
6
- * chart-card — the Card frame and series plumbing every chart in this kit
7
- * renders, so the four registry blocks (`chart-bar-stacked`,
8
- * `chart-area-stacked`, `chart-bar-multiple`) hold only
9
- * their own plot. It is the stock block's own shell —
10
- * `Card > CardHeader(CardTitle, CardDescription, CardAction) > CardContent >
11
- * CardFooter?` — named once instead of copied into each file. A page never
12
- * builds a chart card frame by hand.
13
- */
14
6
  type ChartSeries = {
15
7
  /** Stable entity id: the data key in each datum and the color-map key. */
16
8
  id: string;
@@ -23,7 +15,7 @@ type ChartSummaryTrend = {
23
15
  direction: TrendDirection;
24
16
  tone: TrendTone;
25
17
  comparison: React.ReactNode;
26
- directionLabel?: string;
18
+ directionLabel: string;
27
19
  };
28
20
  type ChartSummaryProps = {
29
21
  label: React.ReactNode;
@@ -33,18 +25,27 @@ type ChartSummaryProps = {
33
25
  trend?: ChartSummaryTrend;
34
26
  status?: React.ReactNode;
35
27
  };
28
+ /** The footer strip: when the reading was taken, left; the way to its owner, right. */
29
+ type ChartCardFooter = {
30
+ /** "Read at 12:42", "Updated 4 minutes ago". */
31
+ reading: React.ReactNode;
32
+ /** "Open in Analytics". */
33
+ link?: PageCommand;
34
+ };
36
35
  type ChartCardProps = {
36
+ /** Names the measure and its split: "Model spend by Customer". */
37
37
  title: React.ReactNode;
38
- description?: React.ReactNode;
38
+ /** Under the title: "Per day · today is partial", "30 September to 13 October 2026". */
39
+ period?: React.ReactNode;
39
40
  /** The title's heading level in the page outline. Defaults to 2. */
40
41
  headingLevel?: 2 | 3 | 4;
41
- /** Trailing header slot, e.g. an "Explore" link. */
42
- action?: React.ReactNode;
43
- /** A measured summary between the header and plot. */
42
+ /** At the header's trailing edge: the metric `ToggleGroup`, and a period `Select` where the page has none. */
43
+ controls?: React.ReactNode;
44
+ /** A `ChartSummary` between the header and the plot. */
44
45
  summary?: React.ReactNode;
45
- /** Related ranking or breakdown beside the plot on wide cards. */
46
+ /** A ranking beside the plot on wide cards, never a second card. */
46
47
  aside?: React.ReactNode;
47
- footer?: React.ReactNode;
48
+ footer?: ChartCardFooter;
48
49
  data: readonly ChartDatum[];
49
50
  /** The datum key carrying the category or period. */
50
51
  xKey: string;
@@ -55,8 +56,8 @@ type ChartCardProps = {
55
56
  valueFormatter?: (value: number) => string;
56
57
  /** Axis ticks only: a compact reading (1.6B, 800M, $14) where the tooltip keeps the exact figure. Defaults to `valueFormatter`. */
57
58
  axisFormatter?: (value: number) => string;
58
- /** Label for the folded neutral series (entities past the sixth). */
59
- otherLabel?: string;
59
+ /** The folded neutral series past the sixth entity, in the reader's language: "Everything else". */
60
+ otherLabel: string;
60
61
  /** Rendered in CardContent instead of the plot when `data` is empty. */
61
62
  emptyState?: React.ReactNode;
62
63
  size?: ChartCardSize;
@@ -65,6 +66,10 @@ type ChartCardProps = {
65
66
  declare function defaultValueFormatter(value: number): string;
66
67
  /** The chart config the legend and tooltip read: each series' label and color. */
67
68
  declare function chartSeriesConfig(series: readonly ChartSeries[], entityColorMap: EntityColorMap): ChartConfig;
69
+ type FoldedSeries = {
70
+ series: ChartSeries[];
71
+ data: ChartDatum[];
72
+ };
68
73
  /**
69
74
  * Folds every series whose entity color resolves to the neutral register into
70
75
  * ONE aggregated series (values summed per bucket). Past the sixth entity the
@@ -72,11 +77,20 @@ declare function chartSeriesConfig(series: readonly ChartSeries[], entityColorMa
72
77
  * indistinguishable neutral mark is unreadable. Series resolving to a hue pass
73
78
  * through unchanged, so six or fewer are never rewritten.
74
79
  */
75
- declare function foldOtherSeries(series: readonly ChartSeries[], data: readonly ChartDatum[], entityColorMap: EntityColorMap, otherLabel: string): {
76
- series: ChartSeries[];
77
- data: ChartDatum[];
78
- };
79
- declare function ChartCard({ title, description, action, summary, aside, footer, headingLevel, className, children, }: Pick<ChartCardProps, "title" | "description" | "action" | "summary" | "aside" | "footer" | "headingLevel" | "className"> & {
80
+ declare function foldOtherSeries(series: readonly ChartSeries[], data: readonly ChartDatum[], entityColorMap: EntityColorMap, otherLabel: string): FoldedSeries;
81
+ /**
82
+ * The card every chart in the kit renders: one header, the summary, the plot, its legend and the reading's time. The
83
+ * plots (`ChartBarStacked`, `ChartAreaStacked`, `ChartBarMultiple`, `ChartBarHorizontal`) hold only their own plot; a
84
+ * page never builds a chart card frame by hand.
85
+ *
86
+ * @family Charts
87
+ * @when Every chart and every reading built around one: the frame a page never builds by hand. A chart is a named section of its page.
88
+ * @instead A single figure is a `KpiCard`, never nested inside a chart. A ranking beside the plot goes in the card's `aside`, not a second card.
89
+ * @behaviour Header grid: title and period in the first column, controls in the second from a 28 rem card width, under the title below it. Summary, plot, legend, footer in that order. An empty dataset shows its `emptyState` in the plot's place. The footer is a recessed strip behind a hairline: the reading's time left, the link to its owner right.
90
+ * @words Title names the measure and its split: "Model spend by Customer". Period as dates. Footer: the reading's time, "Updated 4 minutes ago" or "Read at 12:42", and the way to its owner, "Open in Analytics". Sentence case throughout.
91
+ * @access The title is a heading at the page's level (default 2) and labels the plot. The plot is focusable and shows the 2 px focus outline only on keyboard focus.
92
+ */
93
+ declare function ChartCard({ title, period, controls, summary, aside, footer, headingLevel, className, children, }: Pick<ChartCardProps, "title" | "period" | "controls" | "summary" | "aside" | "footer" | "headingLevel" | "className"> & {
80
94
  /** Receives the title's id, which the plot takes as `aria-labelledby`. */
81
95
  children: (titleId: string) => React.ReactNode;
82
96
  }): React.JSX.Element;
@@ -92,5 +106,5 @@ declare const CHART_FOCUS_CLASS = "[&_.recharts-surface:focus-visible]:nc-focus-
92
106
  /** Legend below the plot, left-aligned, wrapping to a second line. */
93
107
  declare const CHART_LEGEND_CLASS = "flex-wrap justify-start";
94
108
  export { CHART_FOCUS_CLASS, CHART_LEGEND_CLASS, ChartCard, ChartSummary, chartPlotClassName, chartSeriesConfig, defaultValueFormatter, foldOtherSeries, };
95
- export type { ChartCardProps, ChartCardSize, ChartDatum, ChartSeries, ChartSummaryProps, ChartSummaryTrend, };
109
+ export type { ChartCardFooter, ChartCardProps, ChartCardSize, ChartDatum, ChartSeries, ChartSummaryProps, ChartSummaryTrend, };
96
110
  //# sourceMappingURL=chart-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-card.d.ts","sourceRoot":"","sources":["../../src/components/chart-card.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-card.d.ts","sourceRoot":"","sources":["../../src/components/chart-card.tsx"],"names":[],"mappings":"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"}
@@ -2,9 +2,11 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { cn } from "../lib/utils.js";
5
- import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "./card.js";
5
+ import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle, } from "./card.js";
6
6
  import { CHART_ENTITY_OTHER_COLOR, entityColor, } from "./chart-entity-colors.js";
7
+ import { PageCommandButton } from "./page-actions.js";
7
8
  import { TrendBadge } from "./trend-badge.js";
9
+ import { FooterStrip } from "../internal/footer-strip.js";
8
10
  /** Fixed plot heights, so charts on a page share one register. */
9
11
  const chartSizes = {
10
12
  default: "h-64",
@@ -39,24 +41,35 @@ function foldOtherSeries(series, data, entityColorMap, otherLabel) {
39
41
  ...series.filter((entry) => !isNeutral(entry)),
40
42
  { id: OTHER_SERIES_ID, label: otherLabel },
41
43
  ];
44
+ const neutralIds = new Set(neutral.map((entry) => entry.id));
42
45
  const foldedData = data.map((datum) => {
43
46
  const otherSum = neutral.reduce((sum, entry) => {
44
47
  const value = datum[entry.id];
48
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- a chart datum is our own Record<string, number | string>; only typeof tells a value from a label.
45
49
  return sum + (typeof value === "number" ? value : 0);
46
50
  }, 0);
47
- const next = { ...datum };
48
- for (const entry of neutral) {
49
- delete next[entry.id];
50
- }
51
+ const next = Object.fromEntries(Object.entries(datum).filter(([key]) => !neutralIds.has(key)));
51
52
  next[OTHER_SERIES_ID] = otherSum;
52
53
  return next;
53
54
  });
54
55
  return { series: folded, data: foldedData };
55
56
  }
56
- function ChartCard({ title, description, action, summary, aside, footer, headingLevel = 2, className, children, }) {
57
+ /**
58
+ * The card every chart in the kit renders: one header, the summary, the plot, its legend and the reading's time. The
59
+ * plots (`ChartBarStacked`, `ChartAreaStacked`, `ChartBarMultiple`, `ChartBarHorizontal`) hold only their own plot; a
60
+ * page never builds a chart card frame by hand.
61
+ *
62
+ * @family Charts
63
+ * @when Every chart and every reading built around one: the frame a page never builds by hand. A chart is a named section of its page.
64
+ * @instead A single figure is a `KpiCard`, never nested inside a chart. A ranking beside the plot goes in the card's `aside`, not a second card.
65
+ * @behaviour Header grid: title and period in the first column, controls in the second from a 28 rem card width, under the title below it. Summary, plot, legend, footer in that order. An empty dataset shows its `emptyState` in the plot's place. The footer is a recessed strip behind a hairline: the reading's time left, the link to its owner right.
66
+ * @words Title names the measure and its split: "Model spend by Customer". Period as dates. Footer: the reading's time, "Updated 4 minutes ago" or "Read at 12:42", and the way to its owner, "Open in Analytics". Sentence case throughout.
67
+ * @access The title is a heading at the page's level (default 2) and labels the plot. The plot is focusable and shows the 2 px focus outline only on keyboard focus.
68
+ */
69
+ function ChartCard({ title, period, controls, summary, aside, footer, headingLevel = 2, className, children, }) {
57
70
  const titleId = React.useId();
58
- return (_jsxs(Card, { "data-slot": "chart-card", className: cn("@container/chart-card", className), children: [_jsxs(CardHeader, { className: "has-data-[slot=card-action]:grid-cols-1 [&>[data-slot=card-action]]:col-start-1 [&>[data-slot=card-action]]:row-span-1 [&>[data-slot=card-action]]:row-start-3 [&>[data-slot=card-action]]:justify-self-start @md/chart-card:has-data-[slot=card-action]:grid-cols-[1fr_auto] @md/chart-card:[&>[data-slot=card-action]]:col-start-2 @md/chart-card:[&>[data-slot=card-action]]:row-span-2 @md/chart-card:[&>[data-slot=card-action]]:row-start-1 @md/chart-card:[&>[data-slot=card-action]]:justify-self-end", children: [_jsx(CardTitle, { id: titleId, role: "heading", "aria-level": headingLevel, children: title }), description ? _jsx(CardDescription, { children: description }) : null, action ? _jsx(CardAction, { children: action }) : null] }), summary ? (_jsx("div", { "data-slot": "chart-card-summary", className: "px-(--card-spacing)", children: summary })) : null, _jsxs(CardContent, { className: cn(aside &&
59
- "grid min-w-0 gap-(--card-spacing) lg:grid-cols-[minmax(0,2fr)_minmax(16rem,1fr)]"), children: [_jsx("div", { className: "min-w-0", children: children(titleId) }), aside ? (_jsx("aside", { "data-slot": "chart-card-aside", className: "min-w-0 border-t border-border pt-(--card-spacing) lg:border-t-0 lg:border-l lg:pt-0 lg:pl-(--card-spacing)", children: aside })) : null] }), footer ? (_jsx(CardFooter, { className: "flex-col items-start gap-2 text-sm", children: footer })) : null] }));
71
+ return (_jsxs(Card, { "data-slot": "chart-card", className: cn("@container/chart-card", className), children: [_jsxs(CardHeader, { className: "has-data-[slot=card-action]:grid-cols-1 [&>[data-slot=card-action]]:col-start-1 [&>[data-slot=card-action]]:row-span-1 [&>[data-slot=card-action]]:row-start-3 [&>[data-slot=card-action]]:justify-self-start @md/chart-card:has-data-[slot=card-action]:grid-cols-[1fr_auto] @md/chart-card:[&>[data-slot=card-action]]:col-start-2 @md/chart-card:[&>[data-slot=card-action]]:row-span-2 @md/chart-card:[&>[data-slot=card-action]]:row-start-1 @md/chart-card:[&>[data-slot=card-action]]:justify-self-end", children: [_jsx(CardTitle, { id: titleId, role: "heading", "aria-level": headingLevel, children: title }), period ? _jsx(CardDescription, { children: period }) : null, controls ? _jsx(CardAction, { children: controls }) : null] }), summary ? (_jsx("div", { "data-slot": "chart-card-summary", className: "px-(--card-spacing)", children: summary })) : null, _jsxs(CardContent, { className: cn(aside &&
72
+ "grid min-w-0 gap-(--card-spacing) lg:grid-cols-[minmax(0,2fr)_minmax(16rem,1fr)]"), children: [_jsx("div", { className: "min-w-0", children: children(titleId) }), aside ? (_jsx("aside", { "data-slot": "chart-card-aside", className: "min-w-0 border-t border-border pt-(--card-spacing) lg:border-t-0 lg:border-l lg:pt-0 lg:pl-(--card-spacing)", children: aside })) : null] }), footer ? (_jsx(FooterStrip, { hint: footer.reading, hintSlot: "chart-card-reading", children: footer.link ? _jsx(PageCommandButton, { command: footer.link, variant: "ghost" }) : null })) : null] }));
60
73
  }
61
74
  function ChartSummary({ label, value, valueTitle, valueSize = "default", trend, status, }) {
62
75
  return (_jsxs("div", { "data-slot": "chart-summary", className: "flex flex-col items-start gap-2", children: [_jsx("div", { className: "text-muted-foreground text-sm", children: label }), _jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-3", children: [_jsx("div", { "data-slot": "chart-summary-value", className: cn("truncate tabular-nums", valueSize === "lg" ? "text-heading-lg" : "text-heading-md"), title: valueTitle, children: value }), trend ? (_jsx(TrendBadge, { direction: trend.direction, directionLabel: trend.directionLabel, tone: trend.tone, value: trend.value })) : null, status] }), trend ? (_jsx("div", { "data-slot": "chart-summary-comparison", className: "text-muted-foreground text-sm", children: trend.comparison })) : null] }));
@@ -1,21 +1,26 @@
1
1
  import * as React from "react";
2
2
  import { type DateRangePreset, type DateRangeValue } from "./chart-date-range.js";
3
+ /**
4
+ * The period a chart reads: a `Select` of presets with a custom window from a calendar.
5
+ *
6
+ * @family Charts
7
+ * @when The reading period of an overview or a chart: on the title row through `PageActions`' `period`, or in a `ChartCard`'s `controls` where the page has none.
8
+ * @instead A choice of metric is a `ToggleGroup` in the card's controls. A date a person enters in a form is a date field.
9
+ * @behaviour One select with the presets and a custom window; the value is encoded into the URL by the caller with `encodeDateRange`.
10
+ * @words Presets name the window: "Past 7 days", "Past 14 days", "Past 30 days", "This cycle". A custom window reads as its dates.
11
+ * @access The select carries the control's accessible name and announces the current range.
12
+ */
3
13
  declare function DateRangeControl({ value, onChange, label, presets, presetLabels, customLabel, formatCustomValue, className, }: {
4
14
  value: DateRangeValue;
5
15
  onChange: (value: DateRangeValue) => void;
6
16
  /** Accessible name for the control. */
7
- label?: string;
17
+ label: string;
8
18
  /** Which presets to offer, in order. Defaults to the full codec set. */
9
19
  presets?: readonly DateRangePreset[];
10
- presetLabels?: Partial<Record<DateRangePreset, string>>;
11
- customLabel?: string;
12
- /**
13
- * Renders the selected custom window as a finished, localized label. The
14
- * package owns no locale, so without it the trigger falls back to the ISO
15
- * pair the codec stores — a storage format, never a label a reader should
16
- * meet. Every locale-aware consumer passes this.
17
- */
18
- formatCustomValue?: (value: {
20
+ presetLabels: Record<DateRangePreset, string>;
21
+ customLabel: string;
22
+ /** Renders the selected custom window as a finished label in the reader's language. */
23
+ formatCustomValue: (value: {
19
24
  from: string;
20
25
  to: string;
21
26
  }) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"chart-date-range-control.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range-control.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAkCvC,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,KAAoB,EACpB,OAA4B,EAC5B,YAAY,EACZ,WAAsB,EACtB,iBAAiB,EACjB,SAAS,GACV,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAiGA;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-date-range-control.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range-control.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AA2BvC;;;;;;;;;GASG;AACH,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,OAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,GACV,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,iBAAiB,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAiGA;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -7,7 +7,7 @@ import * as React from "react";
7
7
  import { cn } from "../lib/utils.js";
8
8
  import { Popover, PopoverContent } from "./popover.js";
9
9
  import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "./select.js";
10
- import { DATE_RANGE_PRESETS, formatIsoDay, parseIsoDay, } from "./chart-date-range.js";
10
+ import { DATE_RANGE_PRESETS, formatIsoDay, isDateRangePreset, parseIsoDay, } from "./chart-date-range.js";
11
11
  /**
12
12
  * chart-date-range-control — ONE Select of relative presets with a "Custom"
13
13
  * entry that opens a range calendar in a Popover anchored to it. A page
@@ -30,13 +30,17 @@ function preloadCalendar(open) {
30
30
  if (open)
31
31
  loadCalendar().catch(() => undefined);
32
32
  }
33
- const DEFAULT_PRESET_LABELS = {
34
- "7d": "Past 7 days",
35
- "14d": "Past 14 days",
36
- "30d": "Past 30 days",
37
- cycle: "This cycle",
38
- };
39
- function DateRangeControl({ value, onChange, label = "Date range", presets = DATE_RANGE_PRESETS, presetLabels, customLabel = "Custom", formatCustomValue, className, }) {
33
+ /**
34
+ * The period a chart reads: a `Select` of presets with a custom window from a calendar.
35
+ *
36
+ * @family Charts
37
+ * @when The reading period of an overview or a chart: on the title row through `PageActions`' `period`, or in a `ChartCard`'s `controls` where the page has none.
38
+ * @instead A choice of metric is a `ToggleGroup` in the card's controls. A date a person enters in a form is a date field.
39
+ * @behaviour One select with the presets and a custom window; the value is encoded into the URL by the caller with `encodeDateRange`.
40
+ * @words Presets name the window: "Past 7 days", "Past 14 days", "Past 30 days", "This cycle". A custom window reads as its dates.
41
+ * @access The select carries the control's accessible name and announces the current range.
42
+ */
43
+ function DateRangeControl({ value, onChange, label, presets = DATE_RANGE_PRESETS, presetLabels, customLabel, formatCustomValue, className, }) {
40
44
  const [open, setOpen] = React.useState(false);
41
45
  const [pending, setPending] = React.useState(undefined);
42
46
  const anchor = React.useRef(null);
@@ -44,8 +48,8 @@ function DateRangeControl({ value, onChange, label = "Date range", presets = DAT
44
48
  const selected = pending ??
45
49
  (isCustom ? { from: parseIsoDay(value.from), to: parseIsoDay(value.to) } : undefined);
46
50
  const triggerLabel = isCustom
47
- ? (formatCustomValue?.({ from: value.from, to: value.to }) ?? `${value.from} – ${value.to}`)
48
- : (presetLabels?.[value.preset] ?? DEFAULT_PRESET_LABELS[value.preset]);
51
+ ? formatCustomValue({ from: value.from, to: value.to })
52
+ : presetLabels[value.preset];
49
53
  function handleOpenChange(nextOpen) {
50
54
  setOpen(nextOpen);
51
55
  if (!nextOpen) {
@@ -57,7 +61,7 @@ function DateRangeControl({ value, onChange, label = "Date range", presets = DAT
57
61
  setOpen(true);
58
62
  return;
59
63
  }
60
- if (next !== null) {
64
+ if (next !== null && isDateRangePreset(next)) {
61
65
  onChange({ kind: "preset", preset: next });
62
66
  }
63
67
  }
@@ -82,6 +86,6 @@ function DateRangeControl({ value, onChange, label = "Date range", presets = DAT
82
86
  }
83
87
  setPending(range);
84
88
  }
85
- return (_jsxs("div", { ref: anchor, "data-slot": "date-range-control", className: cn("inline-flex", className), children: [_jsxs(Select, { value: isCustom ? CUSTOM_VALUE : value.preset, onValueChange: handleSelectChange, onOpenChange: preloadCalendar, children: [_jsx(SelectTrigger, { "aria-label": label, className: "w-auto min-w-36", children: _jsx(SelectValue, { children: triggerLabel }) }), _jsx(SelectContent, { children: _jsxs(SelectGroup, { children: [presets.map((preset) => (_jsx(SelectItem, { value: preset, children: presetLabels?.[preset] ?? DEFAULT_PRESET_LABELS[preset] }, preset))), _jsx(SelectItem, { value: CUSTOM_VALUE, children: customLabel })] }) })] }), _jsx(Popover, { open: open, onOpenChange: handleOpenChange, children: _jsx(PopoverContent, { anchor: anchor, align: "start", className: "w-auto p-0", children: _jsx(React.Suspense, { fallback: null, children: _jsx(Calendar, { mode: "range", numberOfMonths: 2, defaultMonth: selected?.from, selected: selected, onSelect: handleCalendarSelect }) }) }) })] }));
89
+ return (_jsxs("div", { ref: anchor, "data-slot": "date-range-control", className: cn("inline-flex", className), children: [_jsxs(Select, { value: isCustom ? CUSTOM_VALUE : value.preset, onValueChange: handleSelectChange, onOpenChange: preloadCalendar, children: [_jsx(SelectTrigger, { "aria-label": label, className: "w-auto min-w-36", children: _jsx(SelectValue, { children: triggerLabel }) }), _jsx(SelectContent, { children: _jsxs(SelectGroup, { children: [presets.map((preset) => (_jsx(SelectItem, { value: preset, children: presetLabels[preset] }, preset))), _jsx(SelectItem, { value: CUSTOM_VALUE, children: customLabel })] }) })] }), _jsx(Popover, { open: open, onOpenChange: handleOpenChange, children: _jsx(PopoverContent, { anchor: anchor, align: "start", className: "w-auto p-0", children: _jsx(React.Suspense, { fallback: null, children: _jsx(Calendar, { mode: "range", numberOfMonths: 2, defaultMonth: selected?.from, selected: selected, onSelect: handleCalendarSelect }) }) }) })] }));
86
90
  }
87
91
  export { DateRangeControl };
@@ -18,6 +18,7 @@ type DateRangeValue = {
18
18
  from: string;
19
19
  to: string;
20
20
  };
21
+ declare function isDateRangePreset(value: string): value is DateRangePreset;
21
22
  /**
22
23
  * Encodes a date-range value for URL state: a preset encodes as its token
23
24
  * ("7d", "cycle", …) and a custom range as "yyyy-mm-dd..yyyy-mm-dd".
@@ -33,6 +34,6 @@ declare function decodeDateRange(raw: string | null | undefined): DateRangeValue
33
34
  declare function parseIsoDay(iso: string): Date;
34
35
  /** Formats a local date as "yyyy-mm-dd". */
35
36
  declare function formatIsoDay(date: Date): string;
36
- export { DATE_RANGE_PRESETS, decodeDateRange, encodeDateRange, formatIsoDay, parseIsoDay };
37
+ export { DATE_RANGE_PRESETS, decodeDateRange, encodeDateRange, formatIsoDay, isDateRangePreset, parseIsoDay, };
37
38
  export type { DateRangePreset, DateRangeValue };
38
39
  //# sourceMappingURL=chart-date-range.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-date-range.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,QAAA,MAAM,kBAAkB,wCAAyC,CAAC;AAElE,KAAK,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,KAAK,cAAc,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAKjD;;;GAGG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAuB9E;AAED,wEAAwE;AACxE,iBAAS,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAItC;AAED,4CAA4C;AAC5C,iBAAS,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKxC;AAMD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAC3F,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-date-range.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,QAAA,MAAM,kBAAkB,wCAAyC,CAAC;AAElE,KAAK,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,KAAK,cAAc,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,iBAAS,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAElE;AAKD;;;GAGG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAuB9E;AAED,wEAAwE;AACxE,iBAAS,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAItC;AAED,4CAA4C;AAC5C,iBAAS,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKxC;AAMD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,GACZ,CAAC;AACF,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
@@ -9,6 +9,9 @@
9
9
  * interactive picker lives in `chart-date-range-control`.
10
10
  */
11
11
  const DATE_RANGE_PRESETS = ["7d", "14d", "30d", "cycle"];
12
+ function isDateRangePreset(value) {
13
+ return DATE_RANGE_PRESETS.some((preset) => preset === value);
14
+ }
12
15
  const ISO_DAY = /^\d{4}-\d{2}-\d{2}$/;
13
16
  const CUSTOM_SEPARATOR = "..";
14
17
  /**
@@ -27,7 +30,7 @@ function decodeDateRange(raw) {
27
30
  if (!raw) {
28
31
  return null;
29
32
  }
30
- if (DATE_RANGE_PRESETS.includes(raw)) {
33
+ if (isDateRangePreset(raw)) {
31
34
  return { kind: "preset", preset: raw };
32
35
  }
33
36
  const [from, to, ...rest] = raw.split(CUSTOM_SEPARATOR);
@@ -58,4 +61,4 @@ function formatIsoDay(date) {
58
61
  function isRealIsoDay(iso) {
59
62
  return formatIsoDay(parseIsoDay(iso)) === iso;
60
63
  }
61
- export { DATE_RANGE_PRESETS, decodeDateRange, encodeDateRange, formatIsoDay, parseIsoDay };
64
+ export { DATE_RANGE_PRESETS, decodeDateRange, encodeDateRange, formatIsoDay, isDateRangePreset, parseIsoDay, };
@@ -30,6 +30,13 @@ type EntityColorMap = Readonly<Record<string, string>>;
30
30
  * Assigns `var(--nc-chart-1..6)` in fixed order by FIRST APPEARANCE of each
31
31
  * stable entity id. Duplicate ids keep their first assignment. Entities past
32
32
  * the sixth unique id fold to the neutral "other" register.
33
+ *
34
+ * @family Charts
35
+ * @when Once per surface, from the full list of entities the page shows, passed to every chart and table row on it.
36
+ * @instead Never a hue picked by rank, position or index, and never a colour meaning health or trend: status is a `StatusBadge`, a change is a `TrendBadge`.
37
+ * @behaviour A hue follows its entity: one assignment per surface, the same in the chart and its table, stable through filtering and sorting. Six categorical hues colour data and nothing else; past six the tail folds into one neutral series in the muted ink, summed per bucket.
38
+ * @words None of its own. The folded tail is named by the page: "Everything else".
39
+ * @access Hue is never the only reading: the legend is always on and every value is text in the tooltip or a table.
33
40
  */
34
41
  declare function createEntityColorMap(entityIds: readonly string[]): EntityColorMap;
35
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chart-entity-colors.d.ts","sourceRoot":"","sources":["../../src/components/chart-entity-colors.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,QAAA,MAAM,yBAAyB,yIAOrB,CAAC;AAEX;;;;;;;;;GASG;AACH,QAAA,MAAM,wBAAwB,oBAAoB,CAAC;AAEnD,KAAK,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;GAIG;AACH,iBAAS,oBAAoB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAyB1E;AAED;;;;GAIG;AACH,iBAAS,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC;AAClG,YAAY,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-entity-colors.d.ts","sourceRoot":"","sources":["../../src/components/chart-entity-colors.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,QAAA,MAAM,yBAAyB,yIAOrB,CAAC;AAEX;;;;;;;;;GASG;AACH,QAAA,MAAM,wBAAwB,oBAAoB,CAAC;AAEnD,KAAK,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,iBAAS,oBAAoB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAyB1E;AAED;;;;GAIG;AACH,iBAAS,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC;AAClG,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -36,6 +36,13 @@ const CHART_ENTITY_OTHER_COLOR = "var(--nc-muted)";
36
36
  * Assigns `var(--nc-chart-1..6)` in fixed order by FIRST APPEARANCE of each
37
37
  * stable entity id. Duplicate ids keep their first assignment. Entities past
38
38
  * the sixth unique id fold to the neutral "other" register.
39
+ *
40
+ * @family Charts
41
+ * @when Once per surface, from the full list of entities the page shows, passed to every chart and table row on it.
42
+ * @instead Never a hue picked by rank, position or index, and never a colour meaning health or trend: status is a `StatusBadge`, a change is a `TrendBadge`.
43
+ * @behaviour A hue follows its entity: one assignment per surface, the same in the chart and its table, stable through filtering and sorting. Six categorical hues colour data and nothing else; past six the tail folds into one neutral series in the muted ink, summed per bucket.
44
+ * @words None of its own. The folded tail is named by the page: "Everything else".
45
+ * @access Hue is never the only reading: the legend is always on and every value is text in the tooltip or a table.
39
46
  */
40
47
  function createEntityColorMap(entityIds) {
41
48
  // Assign through a Map so ids that collide with Object.prototype members
@@ -1,3 +1,13 @@
1
+ /**
2
+ * The stock linear line with nothing around it: no axes, no grid, no tooltip, no card.
3
+ *
4
+ * @family Charts
5
+ * @when What is trending: a row in a list, beside its name and its delta.
6
+ * @instead When the reader needs values, axes or a period, use a full chart card. A KPI value carries its delta badge, not a sparkline, unless the card owns one.
7
+ * @behaviour 96 by 32 px, a 2 px linear line. Stroke is one chart token or the entity's colour.
8
+ * @words None of its own. The row names the measure and the window: "Requests · past 8 weeks".
9
+ * @access Decorative by default, hidden from assistive technology, because the value and delta beside it carry the reading. Standalone it takes a `label` and becomes an image.
10
+ */
1
11
  declare function ChartSparkline({ data, label, color, className, }: {
2
12
  data: readonly number[];
3
13
  /** Accessible name for standalone use; omit inside a named stat. */
@@ -1 +1 @@
1
- {"version":3,"file":"chart-sparkline.d.ts","sourceRoot":"","sources":["../../src/components/chart-sparkline.tsx"],"names":[],"mappings":"AAsBA,iBAAS,cAAc,CAAC,EACtB,IAAI,EACJ,KAAK,EACL,KAA2B,EAC3B,SAAS,GACV,EAAE;IACD,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAwBA;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"chart-sparkline.d.ts","sourceRoot":"","sources":["../../src/components/chart-sparkline.tsx"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,iBAAS,cAAc,CAAC,EACtB,IAAI,EACJ,KAAK,EACL,KAA2B,EAC3B,SAAS,GACV,EAAE;IACD,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAwBA;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -6,16 +6,17 @@ import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import { Line, LineChart } from "recharts";
7
7
  import { cn } from "../lib/utils.js";
8
8
  import { ChartContainer } from "./chart.js";
9
+ const SPARKLINE_SERIES_KEY = "value";
9
10
  /**
10
- * chart-sparkline — the trend line a KPI card carries beside its value. The
11
- * stock linear line chart with nothing around it: no axes, no grid, no
12
- * tooltip, and no card.
11
+ * The stock linear line with nothing around it: no axes, no grid, no tooltip, no card.
13
12
  *
14
- * It is decorative by default and stays out of the accessibility tree, because
15
- * the value and the change beside it already carry the reading. A standalone
16
- * sparkline passes `label` and becomes a named image.
13
+ * @family Charts
14
+ * @when What is trending: a row in a list, beside its name and its delta.
15
+ * @instead When the reader needs values, axes or a period, use a full chart card. A KPI value carries its delta badge, not a sparkline, unless the card owns one.
16
+ * @behaviour 96 by 32 px, a 2 px linear line. Stroke is one chart token or the entity's colour.
17
+ * @words None of its own. The row names the measure and the window: "Requests · past 8 weeks".
18
+ * @access Decorative by default, hidden from assistive technology, because the value and delta beside it carry the reading. Standalone it takes a `label` and becomes an image.
17
19
  */
18
- const SPARKLINE_SERIES_KEY = "value";
19
20
  function ChartSparkline({ data, label, color = "var(--nc-chart-1)", className, }) {
20
21
  const chartData = data.map((value, index) => ({ index, [SPARKLINE_SERIES_KEY]: value }));
21
22
  const chartConfig = {
@@ -19,6 +19,16 @@ export type ChartConfig = Record<string, {
19
19
  color?: never;
20
20
  theme: ChartTheme;
21
21
  })>;
22
+ /**
23
+ * shadcn's chart foundation: the Recharts container, its tooltip and its legend, themed by the series config.
24
+ *
25
+ * @family Charts
26
+ * @when Inside a kit plot only: `ChartBarStacked`, `ChartAreaStacked`, `ChartBarMultiple`, `ChartBarHorizontal`, `ChartSparkline` render through it.
27
+ * @instead A page renders a kit plot in its `ChartCard`, never this container or a Recharts import of its own. A chart the kit lacks is pulled from the shadcn registry into the kit first.
28
+ * @behaviour Maps each series id to its colour token, sizes the plot to its frame, and draws the tooltip with the exact figure and the legend below the plot: an 8 px dot, 6 px to the name, 16 px between, left-aligned and wrapping.
29
+ * @words None of its own: series labels come from the config the plot builds from the page's words.
30
+ * @access The plot it holds is named by the card title through `aria-labelledby`; Recharts' accessibility layer makes it keyboard focusable.
31
+ */
22
32
  declare function ChartContainer({ id, className, children, config, initialDimension, ...props }: React.ComponentProps<"div"> & {
23
33
  config: ChartConfig;
24
34
  children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>["children"];
@@ -1 +1 @@
1
- {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/components/chart.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,iBAAiB,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAKjD,QAAA,MAAM,MAAM;;;CAAwC,CAAC;AAGrD,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AACvC,KAAK,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AA4BF,MAAM,MAAM,WAAW,GAAG,MAAM,CAC9B,MAAM,EACN;IACE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC5B,GAAG,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAC/E,CAAC;AAkBF,iBAAS,cAAc,CAAC,EACtB,EAAE,EACF,SAAS,EACT,QAAQ,EACR,MAAM,EACN,gBAAoC,EACpC,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,CAAC;IACzF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,qBAuBA;AAED,QAAA,MAAM,UAAU,GAAI,gBAAgB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,6BA4BtE,CAAC;AAEF,QAAA,MAAM,YAAY,kCAA4B,CAAC;AAE/C,iBAAS,mBAAmB,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,SAAiB,EACjB,SAAiB,EACjB,aAAqB,EACrB,KAAK,EACL,cAAc,EACd,cAAc,EACd,SAAS,EACT,KAAK,EACL,OAAO,EACP,QAAQ,EACR,cAAc,GACf,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,OAAO,CAAC,GACvD,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAOlB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C,GAAG,IAAI,CACN,iBAAiB,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,eAAe,CAAC,EAC/E,oBAAoB,CACrB,4BAmHF;AAED,QAAA,MAAM,WAAW,sGAA2B,CAAC;AAE7C,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,QAAgB,EAChB,OAAO,EACP,OAAO,GACR,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAIlB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,eAAe,CAAC,4BAwCrE;AA2BD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,UAAU,GACX,CAAC"}
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/components/chart.tsx"],"names":[],"mappings":"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"}