basalt-ui 1.30.2 → 1.32.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 (357) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +54 -0
  3. package/MIGRATING.md +256 -12
  4. package/agent/rules/basalt-controls.md +19 -19
  5. package/agent/rules/basalt-mantine.md +5 -5
  6. package/configs/oxlint-plugin.js +371 -4
  7. package/configs/oxlint-plugin.test.ts +327 -2
  8. package/configs/oxlint.json +2 -1
  9. package/dist/agent-chat/composer.d.ts.map +1 -1
  10. package/dist/agent-chat/composer.js +41 -43
  11. package/dist/agent-chat/thread-workspace.d.ts +2 -2
  12. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  13. package/dist/agent-chat/thread-workspace.js +3 -4
  14. package/dist/agent-chat/use-keyboard-inset.d.ts +2 -0
  15. package/dist/agent-chat/use-keyboard-inset.d.ts.map +1 -0
  16. package/dist/agent-chat/use-keyboard-inset.js +34 -0
  17. package/dist/charts/cursor/touch-pin.d.ts +45 -0
  18. package/dist/charts/cursor/touch-pin.d.ts.map +1 -0
  19. package/dist/charts/cursor/touch-pin.js +79 -0
  20. package/dist/charts/hooks/use-discrete-cursor.d.ts +66 -0
  21. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +1 -0
  22. package/dist/charts/hooks/use-discrete-cursor.js +198 -0
  23. package/dist/charts/hooks/use-hysteresis.d.ts +18 -0
  24. package/dist/charts/hooks/use-hysteresis.d.ts.map +1 -0
  25. package/dist/charts/hooks/use-hysteresis.js +12 -0
  26. package/dist/charts/hooks/useBandPlot.d.ts +7 -0
  27. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  28. package/dist/charts/hooks/useBandPlot.js +62 -18
  29. package/dist/charts/hooks/useChartCursor.d.ts +40 -11
  30. package/dist/charts/hooks/useChartCursor.d.ts.map +1 -1
  31. package/dist/charts/hooks/useChartCursor.js +102 -11
  32. package/dist/charts/index.d.ts +0 -1
  33. package/dist/charts/index.d.ts.map +1 -1
  34. package/dist/charts/index.js +0 -10
  35. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  36. package/dist/charts/kinds/BandStrip.js +47 -82
  37. package/dist/charts/kinds/Donut.d.ts +9 -3
  38. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  39. package/dist/charts/kinds/Donut.js +110 -48
  40. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  41. package/dist/charts/kinds/DualPanel.js +138 -145
  42. package/dist/charts/kinds/Heatmap.d.ts +7 -0
  43. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  44. package/dist/charts/kinds/Heatmap.js +37 -16
  45. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  46. package/dist/charts/kinds/MirroredBars.js +68 -111
  47. package/dist/charts/kinds/band-chrome.d.ts +31 -0
  48. package/dist/charts/kinds/band-chrome.d.ts.map +1 -0
  49. package/dist/charts/kinds/band-chrome.js +71 -0
  50. package/dist/charts/kinds/donut-layout.d.ts +47 -0
  51. package/dist/charts/kinds/donut-layout.d.ts.map +1 -0
  52. package/dist/charts/kinds/donut-layout.js +52 -0
  53. package/dist/charts/layout/auto-margin.d.ts +7 -2
  54. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  55. package/dist/charts/layout/auto-margin.js +12 -3
  56. package/dist/charts/layout/end-labels.d.ts +64 -0
  57. package/dist/charts/layout/end-labels.d.ts.map +1 -0
  58. package/dist/charts/layout/end-labels.js +76 -0
  59. package/dist/charts/primitives/Axes.d.ts +32 -4
  60. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  61. package/dist/charts/primitives/Axes.js +62 -16
  62. package/dist/charts/primitives/CartesianChart.d.ts +7 -6
  63. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  64. package/dist/charts/primitives/CartesianChart.js +264 -145
  65. package/dist/charts/primitives/ChartCard.d.ts +0 -14
  66. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  67. package/dist/charts/primitives/ChartCard.js +56 -21
  68. package/dist/charts/primitives/ChartFrame.d.ts +28 -22
  69. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  70. package/dist/charts/primitives/ChartFrame.js +116 -34
  71. package/dist/charts/primitives/ChartLegend.d.ts +19 -15
  72. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  73. package/dist/charts/primitives/ChartLegend.js +86 -73
  74. package/dist/charts/primitives/ChartTooltip.d.ts +5 -0
  75. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  76. package/dist/charts/primitives/ChartTooltip.js +20 -4
  77. package/dist/charts/primitives/Crosshair.js +2 -2
  78. package/dist/charts/primitives/HoverOverlay.d.ts +29 -9
  79. package/dist/charts/primitives/HoverOverlay.d.ts.map +1 -1
  80. package/dist/charts/primitives/HoverOverlay.js +54 -27
  81. package/dist/charts/primitives/HoverOverlay.module.css +13 -0
  82. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +8 -0
  83. package/dist/charts/primitives/chart-card-context.d.ts +33 -0
  84. package/dist/charts/primitives/chart-card-context.d.ts.map +1 -0
  85. package/dist/charts/primitives/chart-card-context.js +18 -0
  86. package/dist/charts/primitives/chart-frame-layout.d.ts +93 -113
  87. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -1
  88. package/dist/charts/primitives/chart-frame-layout.js +75 -34
  89. package/dist/charts/primitives/chart-layout.d.ts +112 -0
  90. package/dist/charts/primitives/chart-layout.d.ts.map +1 -0
  91. package/dist/charts/primitives/chart-layout.js +175 -0
  92. package/dist/charts/primitives/chart-tier.d.ts +13 -11
  93. package/dist/charts/primitives/chart-tier.d.ts.map +1 -1
  94. package/dist/charts/primitives/chart-tier.js +42 -13
  95. package/dist/charts/primitives/legend-disclosure.d.ts +27 -0
  96. package/dist/charts/primitives/legend-disclosure.d.ts.map +1 -0
  97. package/dist/charts/primitives/legend-disclosure.js +153 -0
  98. package/dist/charts/series.d.ts +4 -1
  99. package/dist/charts/series.d.ts.map +1 -1
  100. package/dist/charts/utils/ticks.d.ts +27 -8
  101. package/dist/charts/utils/ticks.d.ts.map +1 -1
  102. package/dist/charts/utils/ticks.js +35 -11
  103. package/dist/common/errors.d.ts +11 -1
  104. package/dist/common/errors.d.ts.map +1 -1
  105. package/dist/common/errors.js +16 -2
  106. package/dist/common/hit-floor.d.ts +10 -0
  107. package/dist/common/hit-floor.d.ts.map +1 -0
  108. package/dist/common/hit-floor.js +6 -0
  109. package/dist/{shell → common}/isomorphic-layout-effect.d.ts +4 -3
  110. package/dist/common/isomorphic-layout-effect.d.ts.map +1 -0
  111. package/dist/common/use-measured-widths.d.ts +37 -0
  112. package/dist/common/use-measured-widths.d.ts.map +1 -0
  113. package/dist/common/use-measured-widths.js +51 -0
  114. package/dist/common/use-media-query.d.ts +6 -0
  115. package/dist/common/use-media-query.d.ts.map +1 -0
  116. package/dist/common/use-media-query.js +40 -0
  117. package/dist/common/validate.d.ts +9 -0
  118. package/dist/common/validate.d.ts.map +1 -1
  119. package/dist/common/validate.js +9 -4
  120. package/dist/content/article-layout.d.ts +4 -2
  121. package/dist/content/article-layout.d.ts.map +1 -1
  122. package/dist/content/article-layout.js +43 -3
  123. package/dist/content/article-layout.module.css +45 -4
  124. package/dist/content/article-layout.module.css.d.ts +3 -0
  125. package/dist/content/code-block.d.ts.map +1 -1
  126. package/dist/content/code-block.js +40 -2
  127. package/dist/content/code-block.module.css +32 -2
  128. package/dist/content/prose.module.css +13 -8
  129. package/dist/controls/actions.d.ts +29 -6
  130. package/dist/controls/actions.d.ts.map +1 -1
  131. package/dist/controls/actions.js +158 -27
  132. package/dist/controls/actions.module.css +14 -1
  133. package/dist/controls/actions.module.css.d.ts +1 -0
  134. package/dist/controls/controls.module.css +13 -31
  135. package/dist/controls/enum-filter.js +2 -2
  136. package/dist/controls/filter-context.d.ts +10 -0
  137. package/dist/controls/filter-context.d.ts.map +1 -1
  138. package/dist/controls/filter-context.js +2 -0
  139. package/dist/controls/filter-pill.d.ts.map +1 -1
  140. package/dist/controls/filter-pill.js +1 -0
  141. package/dist/controls/index.d.ts +1 -1
  142. package/dist/controls/index.d.ts.map +1 -1
  143. package/dist/controls/index.js +0 -2
  144. package/dist/controls/multi-select-filter.js +2 -2
  145. package/dist/controls/sync-button.module.css +2 -1
  146. package/dist/dashboard/section.d.ts.map +1 -1
  147. package/dist/dashboard/section.js +1 -0
  148. package/dist/dashboard/section.module.css +1 -26
  149. package/dist/dashboard/stat-card.d.ts +1 -1
  150. package/dist/dashboard/stat-card.d.ts.map +1 -1
  151. package/dist/dashboard/stat-card.js +4 -1
  152. package/dist/dashboard/stat-card.module.css +6 -9
  153. package/dist/dashboard/stat-group.module.css +33 -66
  154. package/dist/dashboard/widget-grid.d.ts.map +1 -1
  155. package/dist/dashboard/widget-grid.module.css +11 -38
  156. package/dist/dashboard/widget-header.d.ts +14 -4
  157. package/dist/dashboard/widget-header.d.ts.map +1 -1
  158. package/dist/dashboard/widget-header.js +23 -6
  159. package/dist/dashboard/widget-header.module.css +145 -133
  160. package/dist/dashboard/widget-header.module.css.d.ts +2 -0
  161. package/dist/data/data-table-state.d.ts +83 -0
  162. package/dist/data/data-table-state.d.ts.map +1 -0
  163. package/dist/data/data-table-state.js +139 -0
  164. package/dist/data/data-table.d.ts +56 -2
  165. package/dist/data/data-table.d.ts.map +1 -1
  166. package/dist/data/data-table.js +436 -336
  167. package/dist/data/data-table.module.css +94 -0
  168. package/dist/data/data-table.module.css.d.ts +11 -0
  169. package/dist/data/virtual-list.d.ts.map +1 -1
  170. package/dist/data/virtual-list.js +10 -0
  171. package/dist/forms/form-layout.d.ts.map +1 -1
  172. package/dist/forms/form-layout.js +3 -3
  173. package/dist/forms/form-layout.module.css +20 -5
  174. package/dist/forms/form-layout.module.css.d.ts +1 -0
  175. package/dist/guard/index.d.ts +8 -2
  176. package/dist/guard/index.d.ts.map +1 -1
  177. package/dist/guard/index.js +68 -2
  178. package/dist/guard/types.d.ts +3 -3
  179. package/dist/guard/types.d.ts.map +1 -1
  180. package/dist/index.d.ts +1 -1
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +3 -1
  183. package/dist/notifications/center.d.ts.map +1 -1
  184. package/dist/provider/index.d.ts +20 -1
  185. package/dist/provider/index.d.ts.map +1 -1
  186. package/dist/provider/index.js +30 -8
  187. package/dist/shell/app-brand.d.ts.map +1 -1
  188. package/dist/shell/app-brand.js +1 -0
  189. package/dist/shell/app-brand.module.css +2 -2
  190. package/dist/shell/app-header.module.css +18 -8
  191. package/dist/shell/app-main.module.css +54 -3
  192. package/dist/shell/app-main.module.css.d.ts +1 -0
  193. package/dist/shell/app-mobile-nav.module.css +16 -4
  194. package/dist/shell/app-sidebar.module.css +4 -6
  195. package/dist/shell/aside-docking.d.ts +31 -0
  196. package/dist/shell/aside-docking.d.ts.map +1 -0
  197. package/dist/shell/aside-docking.js +19 -0
  198. package/dist/shell/index.d.ts +1 -0
  199. package/dist/shell/index.d.ts.map +1 -1
  200. package/dist/shell/index.js +56 -16
  201. package/dist/shell/mobile-nav-model.d.ts +1 -1
  202. package/dist/shell/page-aside.d.ts +22 -3
  203. package/dist/shell/page-aside.d.ts.map +1 -1
  204. package/dist/shell/page-aside.js +27 -13
  205. package/dist/shell/page-bar.d.ts.map +1 -1
  206. package/dist/shell/page-bar.js +10 -5
  207. package/dist/shell/page-bar.module.css +10 -34
  208. package/dist/shell/use-breakpoint.d.ts +3 -4
  209. package/dist/shell/use-breakpoint.d.ts.map +1 -1
  210. package/dist/shell/use-breakpoint.js +3 -25
  211. package/dist/shell/use-size-class.d.ts +6 -0
  212. package/dist/shell/use-size-class.d.ts.map +1 -0
  213. package/dist/shell/use-size-class.js +19 -0
  214. package/dist/state/persisted-or-local.d.ts +4 -1
  215. package/dist/state/persisted-or-local.d.ts.map +1 -1
  216. package/dist/state/persisted-or-local.js +4 -3
  217. package/dist/state/persisted.d.ts +10 -0
  218. package/dist/state/persisted.d.ts.map +1 -1
  219. package/dist/state/persisted.js +44 -14
  220. package/dist/styles.css +41 -0
  221. package/dist/surfaces.d.ts +4 -4
  222. package/dist/surfaces.d.ts.map +1 -1
  223. package/dist/surfaces.js +11 -3
  224. package/dist/theme/controls.module.css +7 -0
  225. package/dist/theme/ctl-theme.d.ts +1 -0
  226. package/dist/theme/ctl-theme.d.ts.map +1 -1
  227. package/dist/theme/ctl-theme.js +12 -4
  228. package/dist/theme/floating.module.css +37 -0
  229. package/dist/theme/floating.module.css.d.ts +3 -0
  230. package/dist/theme/index.d.ts +2 -2
  231. package/dist/theme/index.d.ts.map +1 -1
  232. package/dist/theme/index.js +34 -5
  233. package/dist/theme/nav-link.module.css +7 -0
  234. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  235. package/dist/tokens/index.d.ts +7 -16
  236. package/dist/tokens/index.d.ts.map +1 -1
  237. package/dist/tokens/index.js +23 -28
  238. package/dist/tokens/palette.d.ts +5 -27
  239. package/dist/tokens/palette.d.ts.map +1 -1
  240. package/dist/tokens/palette.js +8 -30
  241. package/dist/tokens/size-classes.d.ts +40 -0
  242. package/dist/tokens/size-classes.d.ts.map +1 -0
  243. package/dist/tokens/size-classes.js +29 -0
  244. package/dist/tokens.css +8 -4
  245. package/llms.txt +3 -3
  246. package/package.json +18 -17
  247. package/src/agent-chat/composer.tsx +74 -47
  248. package/src/agent-chat/thread-workspace.tsx +8 -11
  249. package/src/agent-chat/use-keyboard-inset.ts +68 -0
  250. package/src/charts/cursor/touch-pin.ts +138 -0
  251. package/src/charts/hooks/use-discrete-cursor.ts +335 -0
  252. package/src/charts/hooks/use-hysteresis.ts +26 -0
  253. package/src/charts/hooks/useBandPlot.ts +90 -27
  254. package/src/charts/hooks/useChartCursor.ts +211 -26
  255. package/src/charts/index.ts +0 -8
  256. package/src/charts/kinds/BandStrip.tsx +25 -61
  257. package/src/charts/kinds/Donut.tsx +153 -62
  258. package/src/charts/kinds/DualPanel.tsx +21 -26
  259. package/src/charts/kinds/Heatmap.tsx +61 -22
  260. package/src/charts/kinds/MirroredBars.tsx +23 -65
  261. package/src/charts/kinds/band-chrome.tsx +91 -0
  262. package/src/charts/kinds/donut-layout.ts +82 -0
  263. package/src/charts/layout/auto-margin.ts +24 -5
  264. package/src/charts/layout/end-labels.ts +135 -0
  265. package/src/charts/primitives/Axes.tsx +112 -21
  266. package/src/charts/primitives/CartesianChart.tsx +282 -111
  267. package/src/charts/primitives/ChartCard.tsx +119 -48
  268. package/src/charts/primitives/ChartFrame.tsx +204 -60
  269. package/src/charts/primitives/ChartLegend.tsx +115 -78
  270. package/src/charts/primitives/ChartTooltip.tsx +24 -3
  271. package/src/charts/primitives/Crosshair.tsx +2 -2
  272. package/src/charts/primitives/HoverOverlay.module.css +13 -0
  273. package/src/charts/primitives/HoverOverlay.module.css.d.ts +8 -0
  274. package/src/charts/primitives/HoverOverlay.tsx +62 -20
  275. package/src/charts/primitives/chart-card-context.ts +46 -0
  276. package/src/charts/primitives/chart-frame-layout.ts +207 -182
  277. package/src/charts/primitives/chart-layout.ts +318 -0
  278. package/src/charts/primitives/chart-tier.tsx +66 -21
  279. package/src/charts/primitives/legend-disclosure.tsx +177 -0
  280. package/src/charts/series.ts +4 -1
  281. package/src/charts/utils/ticks.ts +95 -19
  282. package/src/common/errors.ts +25 -1
  283. package/src/common/hit-floor.ts +9 -0
  284. package/src/{shell → common}/isomorphic-layout-effect.ts +4 -3
  285. package/src/common/use-measured-widths.ts +88 -0
  286. package/src/common/use-media-query.ts +56 -0
  287. package/src/common/validate.ts +17 -4
  288. package/src/content/article-layout.module.css +45 -4
  289. package/src/content/article-layout.module.css.d.ts +3 -0
  290. package/src/content/article-layout.tsx +60 -5
  291. package/src/content/code-block.module.css +32 -2
  292. package/src/content/code-block.tsx +47 -3
  293. package/src/content/prose.module.css +13 -8
  294. package/src/controls/actions.module.css +14 -1
  295. package/src/controls/actions.module.css.d.ts +1 -0
  296. package/src/controls/actions.tsx +223 -75
  297. package/src/controls/controls.module.css +13 -31
  298. package/src/controls/enum-filter.tsx +2 -2
  299. package/src/controls/filter-context.tsx +11 -0
  300. package/src/controls/filter-pill.tsx +1 -0
  301. package/src/controls/index.ts +0 -1
  302. package/src/controls/multi-select-filter.tsx +2 -2
  303. package/src/controls/sync-button.module.css +2 -1
  304. package/src/dashboard/section.module.css +1 -26
  305. package/src/dashboard/section.tsx +1 -0
  306. package/src/dashboard/stat-card.module.css +6 -9
  307. package/src/dashboard/stat-card.tsx +6 -3
  308. package/src/dashboard/stat-group.module.css +33 -66
  309. package/src/dashboard/widget-grid.module.css +11 -38
  310. package/src/dashboard/widget-grid.tsx +7 -6
  311. package/src/dashboard/widget-header.module.css +145 -133
  312. package/src/dashboard/widget-header.module.css.d.ts +2 -0
  313. package/src/dashboard/widget-header.tsx +45 -11
  314. package/src/data/data-table-state.ts +218 -0
  315. package/src/data/data-table.module.css +94 -0
  316. package/src/data/data-table.module.css.d.ts +11 -0
  317. package/src/data/data-table.tsx +547 -299
  318. package/src/data/virtual-list.tsx +31 -0
  319. package/src/forms/form-layout.module.css +20 -5
  320. package/src/forms/form-layout.module.css.d.ts +1 -0
  321. package/src/forms/form-layout.tsx +12 -10
  322. package/src/guard/index.ts +188 -3
  323. package/src/guard/types.ts +3 -2
  324. package/src/index.ts +2 -0
  325. package/src/notifications/center.tsx +3 -0
  326. package/src/provider/index.tsx +60 -7
  327. package/src/shell/app-brand.module.css +2 -2
  328. package/src/shell/app-brand.tsx +1 -0
  329. package/src/shell/app-header.module.css +18 -8
  330. package/src/shell/app-main.module.css +54 -3
  331. package/src/shell/app-main.module.css.d.ts +1 -0
  332. package/src/shell/app-mobile-nav.module.css +16 -4
  333. package/src/shell/app-sidebar.module.css +4 -6
  334. package/src/shell/aside-docking.ts +54 -0
  335. package/src/shell/index.tsx +178 -129
  336. package/src/shell/mobile-nav-model.ts +1 -1
  337. package/src/shell/page-aside.tsx +70 -21
  338. package/src/shell/page-bar.module.css +10 -34
  339. package/src/shell/page-bar.tsx +10 -5
  340. package/src/shell/use-breakpoint.ts +9 -45
  341. package/src/shell/use-size-class.ts +31 -0
  342. package/src/state/persisted-or-local.ts +10 -4
  343. package/src/state/persisted.ts +76 -17
  344. package/src/styles.css +41 -0
  345. package/src/surfaces.ts +9 -1
  346. package/src/theme/controls.module.css +7 -0
  347. package/src/theme/ctl-theme.tsx +15 -3
  348. package/src/theme/floating.module.css +37 -0
  349. package/src/theme/floating.module.css.d.ts +3 -0
  350. package/src/theme/index.ts +46 -8
  351. package/src/theme/nav-link.module.css +7 -0
  352. package/src/theme-lab/derive-controls.tsx +2 -0
  353. package/src/tokens/index.ts +20 -30
  354. package/src/tokens/palette.ts +6 -28
  355. package/src/tokens/size-classes.ts +46 -0
  356. package/dist/shell/isomorphic-layout-effect.d.ts.map +0 -1
  357. /package/dist/{shell → common}/isomorphic-layout-effect.js +0 -0
@@ -3,24 +3,35 @@ import { GridRows } from "@visx/grid";
3
3
  import { Group } from "@visx/group";
4
4
  import { scaleLinear, scaleLog, scalePoint } from "@visx/scale";
5
5
  import { useMemo, useRef, useState } from "react";
6
- import { VX } from "../../tokens/index.js";
6
+ import { VX, alpha } from "../../tokens/index.js";
7
+ import { classifyDomain } from "../cursor/resolve.js";
7
8
  import { useChartCursor } from "../hooks/useChartCursor.js";
8
9
  import { autoMargin, probeAxisLabels } from "../layout/auto-margin.js";
10
+ import { END_LABEL_GAP, planEndLabels } from "../layout/end-labels.js";
9
11
  import { logTickValues, niceLogDomain } from "../layout/log-ticks.js";
10
12
  import { deriveLegend, deriveTooltipRows } from "../series.js";
11
13
  import { padAutoLower, padAutoUpper } from "../utils/domain.js";
12
14
  import { fmtAxisDate } from "../utils/format.js";
13
- import { autoXLabelRotate, smartTicks, smartTicksEvery, xLabelPxFor } from "../utils/ticks.js";
14
- import { AxisBottomDate, AxisLeftNumeric, AxisRightNumeric } from "./Axes.js";
15
+ import { rotatedXLabelPx, smartTicks, smartTicksEvery, xLabelPxFor } from "../utils/ticks.js";
16
+ import { AxisBottomDate, AxisLeftNumeric, AxisRightNumeric, TICK_FONT_FAMILY } from "./Axes.js";
15
17
  import { ChartFrame, resolveLegend } from "./ChartFrame.js";
16
- import { useChartTierMetrics } from "./chart-tier.js";
17
- import { ChartTooltipFloat, TooltipBody, TooltipHeader, TooltipRow } from "./ChartTooltip.js";
18
+ import {
19
+ compactNumber,
20
+ isTightClass,
21
+ planXLabels,
22
+ resolveMarginFloor,
23
+ resolveYPlacement,
24
+ shouldCompactYLabels,
25
+ yTickCount
26
+ } from "./chart-layout.js";
27
+ import { useChartContainerClass, useChartMetrics } from "./chart-tier.js";
28
+ import { ChartTooltipFloat, TooltipBody, TooltipHeader, TooltipRows } from "./ChartTooltip.js";
18
29
  import { Crosshair, SeriesDot } from "./Crosshair.js";
19
- import { HoverOverlay } from "./HoverOverlay.js";
30
+ import { cursorSliderProps, HoverOverlay } from "./HoverOverlay.js";
20
31
  import { XZoneRects } from "./XZoneRects.js";
21
32
  import { ZoneRects } from "./ZoneRects.js";
22
- const DEFAULT_TICKS = 5;
23
33
  const DEFAULT_AUTO_PAD = 1.1;
34
+ const AXIS_TINT_ALPHA = 0.8;
24
35
  function resolveAxisDomain(cfg, data, series, extraBounds = []) {
25
36
  const domain = cfg?.domain ?? "auto";
26
37
  if (Array.isArray(domain)) return domain;
@@ -57,6 +68,30 @@ function resolveAxisDomain(cfg, data, series, extraBounds = []) {
57
68
  if (lower === upper) return [Math.min(lower, 0), upper === 0 ? 1 : upper * pad];
58
69
  return [lower, upper];
59
70
  }
71
+ function probeYAxis(opts) {
72
+ const { domain, ticks, nice, scale, format } = opts;
73
+ const base = probeAxisLabels({
74
+ domain,
75
+ ticks,
76
+ nice,
77
+ ...scale !== void 0 && { scale },
78
+ ...format !== void 0 && { format }
79
+ });
80
+ if (format !== void 0 || !shouldCompactYLabels(base.labels)) {
81
+ return base;
82
+ }
83
+ const compact = (v) => compactNumber(v) ?? base.format(v);
84
+ return {
85
+ labels: probeAxisLabels({
86
+ domain,
87
+ ticks,
88
+ nice,
89
+ format: compact,
90
+ ...scale !== void 0 && { scale }
91
+ }).labels,
92
+ format: compact
93
+ };
94
+ }
60
95
  function buildYScale(cfg, domain, yMax, ticks) {
61
96
  if (cfg?.scale === "log") {
62
97
  const scale = scaleLog({
@@ -74,6 +109,24 @@ function buildYScale(cfg, domain, yMax, ticks) {
74
109
  ...cfg?.nice === true && { nice: true }
75
110
  });
76
111
  }
112
+ function resolveXAxisLayout(input) {
113
+ const { marginInput, flatMargin, rotated45Margin, flatLabelPx, xLabels, fontPx, categorical } = input;
114
+ const flatXMax = Math.max(input.plotWidth - flatMargin.left - flatMargin.right, 0);
115
+ const xPlan = planXLabels({ labels: xLabels, plotWidth: flatXMax, fontPx, categorical });
116
+ const rotate = input.xLabelRotate ?? (categorical ? xPlan.rotate : 0);
117
+ if (rotate === 45) {
118
+ const tickLabelPx = rotatedXLabelPx(xLabels, fontPx);
119
+ return { baseMargin: rotated45Margin, rotate, wrapWidth: void 0, tickLabelPx };
120
+ }
121
+ if (rotate === 90) {
122
+ const baseMargin2 = autoMargin({ ...marginInput, rotate });
123
+ return { baseMargin: baseMargin2, rotate, wrapWidth: void 0, tickLabelPx: flatLabelPx };
124
+ }
125
+ if (!xPlan.wrap)
126
+ return { baseMargin: flatMargin, rotate, wrapWidth: void 0, tickLabelPx: flatLabelPx };
127
+ const baseMargin = autoMargin({ ...marginInput, bottomLines: xPlan.lines });
128
+ return { baseMargin, rotate, wrapWidth: xPlan.wrapPx, tickLabelPx: xPlan.labelPx };
129
+ }
77
130
  function CartesianChart({
78
131
  data,
79
132
  chartId,
@@ -175,7 +228,9 @@ function CartesianPlot({
175
228
  children
176
229
  }) {
177
230
  const { hidden } = plot;
178
- const tier = useChartTierMetrics();
231
+ const tier = useChartMetrics();
232
+ const containerClass = useChartContainerClass();
233
+ const tight = isTightClass(containerClass);
179
234
  const visible = useMemo(() => series.filter((s) => !hidden.has(s.key)), [series, hidden]);
180
235
  const leftSeries = useMemo(() => visible.filter((s) => s.axis !== "right"), [visible]);
181
236
  const rightSeries = useMemo(() => visible.filter((s) => s.axis === "right"), [visible]);
@@ -195,84 +250,136 @@ function CartesianPlot({
195
250
  () => y2 === void 0 ? null : resolveAxisDomain(y2, data, rightSeries, rightBounds),
196
251
  [y2, data, rightSeries, rightBounds]
197
252
  );
198
- const leftTicks = y?.ticks ?? DEFAULT_TICKS;
199
- const rightTicks = y2?.ticks ?? DEFAULT_TICKS;
253
+ const estimatedPlotHeight = plot.height - tier.margin.top - tier.margin.bottom;
254
+ const leftTicks = y?.ticks ?? yTickCount(estimatedPlotHeight);
255
+ const rightTicks = y2?.ticks ?? yTickCount(estimatedPlotHeight);
200
256
  const { labels: leftLabels, format: leftFormat } = useMemo(
201
- () => probeAxisLabels({
257
+ () => probeYAxis({
202
258
  domain: leftDomain,
203
259
  ticks: leftTicks,
204
260
  nice: y?.nice ?? false,
205
- ...y?.scale !== void 0 && { scale: y.scale },
206
- ...y?.format !== void 0 && { format: y.format }
261
+ scale: y?.scale,
262
+ format: y?.format
207
263
  }),
208
264
  [leftDomain, leftTicks, y?.format, y?.nice, y?.scale]
209
265
  );
210
266
  const { labels: rightLabels, format: rightFormat } = useMemo(
211
- () => rightDomain === null ? { labels: [], format: (v) => String(v) } : probeAxisLabels({
267
+ () => rightDomain === null ? { labels: [], format: (v) => String(v) } : probeYAxis({
212
268
  domain: rightDomain,
213
269
  ticks: rightTicks,
214
270
  nice: y2?.nice ?? false,
215
- ...y2?.scale !== void 0 && { scale: y2.scale },
216
- ...y2?.format !== void 0 && { format: y2.format }
271
+ scale: y2?.scale,
272
+ format: y2?.format
217
273
  }),
218
274
  [rightDomain, rightTicks, y2?.format, y2?.nice, y2?.scale]
219
275
  );
220
276
  const xLabels = useMemo(() => keys.map(formatX), [keys, formatX]);
221
- const xLabelPx = useMemo(() => xLabelPxFor(xLabels, tier.axisFont), [xLabels, tier.axisFont]);
222
- const marginInput = useMemo(
223
- () => ({
224
- left: leftLabels,
277
+ const yPlacement = resolveYPlacement(containerClass, { marginOverrideLeft: marginOverride?.left });
278
+ const categorical = tight && classifyDomain(keys) === "band";
279
+ const flatLabelPx = useMemo(() => xLabelPxFor(xLabels, tier.axisFont), [xLabels, tier.axisFont]);
280
+ const measured = useMemo(() => {
281
+ const marginInput = {
282
+ left: yPlacement === "outside" ? leftLabels : [],
225
283
  right: rightLabels,
226
284
  bottom: xLabels,
227
285
  fontPx: tier.axisFont,
228
- floor: tier.margin,
286
+ // An inside-placed y label paints IN the plot, so the left gutter it used to reserve
287
+ // (the phone tier's own margin floor) is dead space — only the inside-label floor applies.
288
+ floor: resolveMarginFloor(yPlacement, tier.margin),
289
+ anchorTerminals: tight,
229
290
  ...marginOverride !== void 0 && { override: marginOverride }
291
+ };
292
+ return {
293
+ marginInput,
294
+ flatMargin: autoMargin(marginInput),
295
+ rotated45Margin: autoMargin({ ...marginInput, rotate: 45 })
296
+ };
297
+ }, [
298
+ leftLabels,
299
+ rightLabels,
300
+ xLabels,
301
+ tier.axisFont,
302
+ tier.margin,
303
+ marginOverride,
304
+ tight,
305
+ yPlacement
306
+ ]);
307
+ const { baseMargin, rotate, wrapWidth, tickLabelPx } = useMemo(
308
+ () => resolveXAxisLayout({
309
+ ...measured,
310
+ flatLabelPx,
311
+ xLabels,
312
+ fontPx: tier.axisFont,
313
+ plotWidth: plot.width,
314
+ categorical,
315
+ xLabelRotate
230
316
  }),
231
- [leftLabels, rightLabels, xLabels, tier.axisFont, tier.margin, marginOverride]
317
+ [measured, flatLabelPx, xLabels, tier.axisFont, plot.width, categorical, xLabelRotate]
232
318
  );
233
- const flatMargin = useMemo(() => autoMargin(marginInput), [marginInput]);
234
- const rotated45Margin = useMemo(() => autoMargin({ ...marginInput, rotate: 45 }), [marginInput]);
235
- const rotate = xLabelRotate ?? autoXLabelRotate({
236
- tier: tier.tier,
237
- xMax: Math.max(plot.width - flatMargin.left - flatMargin.right, 0),
238
- labelPx: xLabelPx,
239
- rotatedXMax: Math.max(plot.width - rotated45Margin.left - rotated45Margin.right, 0)
240
- });
319
+ const yMax = Math.max(plot.height - baseMargin.top - baseMargin.bottom, 0);
320
+ const yScale = useMemo(
321
+ () => buildYScale(y, leftDomain, yMax, leftTicks),
322
+ [y, leftDomain, yMax, leftTicks]
323
+ );
324
+ const endPlan = useMemo(
325
+ () => planEndLabels({
326
+ containerClass,
327
+ hasY2: y2 !== void 0,
328
+ hasMarginRight: marginOverride?.right !== void 0,
329
+ hasHeaderLegend: plot.legendInHeader,
330
+ visible,
331
+ data,
332
+ yScale,
333
+ yMax,
334
+ fontPx: tier.axisFont,
335
+ plotWidth: plot.width - baseMargin.left - baseMargin.right
336
+ }),
337
+ [
338
+ containerClass,
339
+ y2,
340
+ marginOverride?.right,
341
+ plot.legendInHeader,
342
+ visible,
343
+ data,
344
+ yScale,
345
+ yMax,
346
+ tier.axisFont,
347
+ plot.width,
348
+ baseMargin.left,
349
+ baseMargin.right
350
+ ]
351
+ );
352
+ const endLabels = endPlan?.labels ?? [];
241
353
  const margin = useMemo(
242
- () => rotate === 0 ? flatMargin : rotate === 45 ? rotated45Margin : autoMargin({ ...marginInput, rotate }),
243
- [flatMargin, rotated45Margin, marginInput, rotate]
354
+ () => endPlan === null ? baseMargin : { ...baseMargin, right: baseMargin.right + endPlan.gutter },
355
+ [baseMargin, endPlan]
244
356
  );
245
357
  const xMax = Math.max(plot.width - margin.left - margin.right, 0);
246
- const yMax = Math.max(plot.height - margin.top - margin.bottom, 0);
247
358
  const xScale = useMemo(
248
359
  () => scalePoint({ domain: keys, range: [0, xMax], padding: 0.5 }),
249
360
  [keys, xMax]
250
361
  );
251
- const yScale = useMemo(
252
- () => buildYScale(y, leftDomain, yMax, leftTicks),
253
- [y, leftDomain, yMax, leftTicks]
254
- );
255
362
  const y2Scale = useMemo(
256
363
  () => rightDomain === null ? null : buildYScale(y2, rightDomain, yMax, rightTicks),
257
364
  [y2, rightDomain, yMax, rightTicks]
258
365
  );
259
- const tickValues = useMemo(
260
- () => xTickValues !== void 0 ? [...xTickValues(keys, xMax)] : xTicks === void 0 ? (
261
- // A rotated label stacks diagonally instead of beside its neighbour, so its WIDTH no
262
- // longer governs tick spacing — the constant floor takes over, exactly as before.
263
- smartTicks(keys, xMax, rotate === 0 ? xLabelPx : void 0)
264
- ) : smartTicksEvery(keys, xTicks),
265
- [keys, xMax, xTicks, xTickValues, xLabelPx, rotate]
266
- );
366
+ const tickValues = useMemo(() => {
367
+ if (xTickValues !== void 0) return [...xTickValues(keys, xMax)];
368
+ if (xTicks !== void 0) return smartTicksEvery(keys, xTicks);
369
+ if (containerClass === "micro")
370
+ return keys.length > 1 ? [keys[0], keys[keys.length - 1]] : keys;
371
+ return smartTicks(keys, xMax, rotate === 0 || rotate === 45 ? tickLabelPx : void 0, tight);
372
+ }, [keys, xMax, xTicks, xTickValues, tickLabelPx, rotate, containerClass, tight]);
373
+ const svgRef = useRef(null);
267
374
  const cursor = useChartCursor({
268
375
  data,
269
376
  chartId,
270
377
  getKey: getX,
271
378
  xScale,
272
379
  marginLeft: margin.left,
380
+ boundaryRef: svgRef,
273
381
  ...cursorResolution !== void 0 && { resolution: cursorResolution }
274
382
  });
275
- const svgRef = useRef(null);
276
383
  const tooltipEnabled = tooltip !== false;
277
384
  const tooltipCfg = tooltip === false ? void 0 : tooltip;
278
385
  const point = cursor.point;
@@ -285,10 +392,13 @@ function CartesianPlot({
285
392
  ),
286
393
  [visible, leftFormat, rightFormat]
287
394
  );
395
+ const tintAxes = y2 !== void 0 && leftSeries.length === 1 && rightSeries.length === 1;
396
+ const leftTint = tintAxes ? alpha(leftSeries[0].color, AXIS_TINT_ALPHA) : void 0;
397
+ const rightTint = tintAxes ? alpha(rightSeries[0].color, AXIS_TINT_ALPHA) : void 0;
288
398
  const rows = tooltipEnabled && point !== null ? deriveTooltipRows(tooltipSeries, point, leftFormat) : [];
289
399
  const isFollowerRender = !cursor.isSource && tooltipCfg?.onFollow === true;
290
400
  const showTooltip = tooltipEnabled && point !== null && (cursor.isSource || isFollowerRender);
291
- const useAnchoredPosition = tooltipCfg?.follow === false || isFollowerRender;
401
+ const useAnchoredPosition = tooltipCfg?.follow === false || tooltipCfg?.follow === void 0 && cursor.isTouch || isFollowerRender;
292
402
  const anchorX = useAnchoredPosition && point !== null && cursorX !== null ? cursorX : null;
293
403
  const svgRect = anchorX === null ? void 0 : svgRef.current?.getBoundingClientRect();
294
404
  const tooltipAnchor = svgRect === void 0 || anchorX === null ? cursor.anchor : { x: svgRect.left + margin.left + anchorX, y: svgRect.top + margin.top };
@@ -306,94 +416,114 @@ function CartesianPlot({
306
416
  highlighted
307
417
  };
308
418
  return /* @__PURE__ */ jsxs(Fragment, { children: [
309
- /* @__PURE__ */ jsx("svg", { ref: svgRef, width: plot.width, height: plot.height, children: /* @__PURE__ */ jsxs(Group, { left: margin.left, top: margin.top, children: [
310
- (y?.grid ?? true) && /* @__PURE__ */ jsx(GridRows, { scale: yScale, width: xMax, stroke: VX.grid, numTicks: leftTicks }),
311
- xZones !== void 0 && /* @__PURE__ */ jsx(XZoneRects, { zones: xZones, height: yMax, xScale }),
312
- zones !== void 0 && /* @__PURE__ */ jsx(ZoneRects, { zones, width: xMax, leftScale: yScale, rightScale: y2Scale }),
313
- children(ctx),
314
- refLines?.map((line, i) => {
315
- const scale = line.axis === "right" && y2Scale !== null ? y2Scale : yScale;
316
- return /* @__PURE__ */ jsx(
317
- "line",
318
- {
319
- x1: 0,
320
- x2: xMax,
321
- y1: scale(line.value),
322
- y2: scale(line.value),
323
- stroke: line.color,
324
- strokeWidth: 1,
325
- strokeDasharray: line.dashed === true ? VX.dashArray : void 0
326
- },
327
- `${line.axis ?? "left"}-${line.value}-${i}`
328
- );
329
- }),
330
- tooltipEnabled && point !== null && cursorX !== null && /* @__PURE__ */ jsxs(Fragment, { children: [
331
- /* @__PURE__ */ jsx(Crosshair, { x: cursorX, top: 0, bottom: yMax }),
332
- visible.map((s) => {
333
- if (s.mark === "bar") return null;
334
- const value = cursorValue === void 0 ? s.getValue(point) : cursorValue(point, s, visible);
335
- if (value === null) return null;
336
- const scale = s.axis === "right" && y2Scale !== null ? y2Scale : yScale;
337
- const cy = scale(value);
338
- if (!Number.isFinite(cy)) return null;
339
- const marker = s.getMarker?.(point);
340
- return /* @__PURE__ */ jsx(
341
- SeriesDot,
419
+ /* @__PURE__ */ jsx(
420
+ "svg",
421
+ {
422
+ ref: svgRef,
423
+ width: plot.width,
424
+ height: plot.height,
425
+ style: { touchAction: "pan-y" },
426
+ children: /* @__PURE__ */ jsxs(Group, { left: margin.left, top: margin.top, children: [
427
+ (y?.grid ?? true) && /* @__PURE__ */ jsx(GridRows, { scale: yScale, width: xMax, stroke: VX.grid, numTicks: leftTicks }),
428
+ xZones !== void 0 && /* @__PURE__ */ jsx(XZoneRects, { zones: xZones, height: yMax, xScale }),
429
+ zones !== void 0 && /* @__PURE__ */ jsx(ZoneRects, { zones, width: xMax, leftScale: yScale, rightScale: y2Scale }),
430
+ children(ctx),
431
+ refLines?.map((line, i) => {
432
+ const scale = line.axis === "right" && y2Scale !== null ? y2Scale : yScale;
433
+ return /* @__PURE__ */ jsx(
434
+ "line",
435
+ {
436
+ x1: 0,
437
+ x2: xMax,
438
+ y1: scale(line.value),
439
+ y2: scale(line.value),
440
+ stroke: line.color,
441
+ strokeWidth: 1,
442
+ strokeDasharray: line.dashed === true ? VX.dashArray : void 0
443
+ },
444
+ `${line.axis ?? "left"}-${line.value}-${i}`
445
+ );
446
+ }),
447
+ tooltipEnabled && point !== null && cursorX !== null && /* @__PURE__ */ jsxs(Fragment, { children: [
448
+ /* @__PURE__ */ jsx(Crosshair, { x: cursorX, top: 0, bottom: yMax }),
449
+ visible.map((s) => {
450
+ if (s.mark === "bar") return null;
451
+ const value = cursorValue === void 0 ? s.getValue(point) : cursorValue(point, s, visible);
452
+ if (value === null) return null;
453
+ const scale = s.axis === "right" && y2Scale !== null ? y2Scale : yScale;
454
+ const cy = scale(value);
455
+ if (!Number.isFinite(cy)) return null;
456
+ const marker = s.getMarker?.(point);
457
+ return /* @__PURE__ */ jsx(
458
+ SeriesDot,
459
+ {
460
+ cx: cursorX,
461
+ cy,
462
+ color: marker?.color ?? s.color,
463
+ ...marker?.r !== void 0 && { r: marker.r }
464
+ },
465
+ s.key
466
+ );
467
+ })
468
+ ] }),
469
+ yPlacement !== "none" && /* @__PURE__ */ jsx(
470
+ AxisLeftNumeric,
471
+ {
472
+ scale: yScale,
473
+ numTicks: leftTicks,
474
+ tickFormat: (v) => leftFormat(Number(v)),
475
+ inside: yPlacement === "inside",
476
+ ...leftTint !== void 0 && { tickColor: leftTint }
477
+ }
478
+ ),
479
+ y2Scale !== null && /* @__PURE__ */ jsx(
480
+ AxisRightNumeric,
342
481
  {
343
- cx: cursorX,
344
- cy,
345
- color: marker?.color ?? s.color,
346
- ...marker?.r !== void 0 && { r: marker.r }
482
+ scale: y2Scale,
483
+ left: xMax,
484
+ numTicks: rightTicks,
485
+ tickFormat: (v) => rightFormat(Number(v)),
486
+ ...rightTint !== void 0 && { tickColor: rightTint }
487
+ }
488
+ ),
489
+ /* @__PURE__ */ jsx(
490
+ AxisBottomDate,
491
+ {
492
+ top: yMax,
493
+ scale: xScale,
494
+ tickValues,
495
+ tickFormat: (v) => formatX(String(v)),
496
+ ...rotate !== 0 && { rotate },
497
+ anchorTerminals: tight && rotate === 0,
498
+ ...wrapWidth !== void 0 && { wrapWidth }
499
+ }
500
+ ),
501
+ endLabels.map(({ series: s, y: labelY }) => /* @__PURE__ */ jsx(
502
+ "text",
503
+ {
504
+ x: xMax + END_LABEL_GAP,
505
+ y: labelY,
506
+ dy: "0.35em",
507
+ fill: s.color,
508
+ fontFamily: TICK_FONT_FAMILY,
509
+ fontSize: tier.axisFont,
510
+ opacity: highlighted === null || s.key === highlighted || s.parent === highlighted ? 1 : 0.25,
511
+ pointerEvents: "none",
512
+ children: s.label
347
513
  },
348
- s.key
349
- );
350
- })
351
- ] }),
352
- /* @__PURE__ */ jsx(
353
- AxisLeftNumeric,
354
- {
355
- scale: yScale,
356
- numTicks: leftTicks,
357
- tickFormat: (v) => leftFormat(Number(v))
358
- }
359
- ),
360
- y2Scale !== null && /* @__PURE__ */ jsx(
361
- AxisRightNumeric,
362
- {
363
- scale: y2Scale,
364
- left: xMax,
365
- numTicks: rightTicks,
366
- tickFormat: (v) => rightFormat(Number(v))
367
- }
368
- ),
369
- /* @__PURE__ */ jsx(
370
- AxisBottomDate,
371
- {
372
- top: yMax,
373
- scale: xScale,
374
- tickValues,
375
- tickFormat: (v) => formatX(String(v)),
376
- ...rotate !== 0 && { rotate }
377
- }
378
- ),
379
- /* @__PURE__ */ jsx(
380
- HoverOverlay,
381
- {
382
- width: xMax,
383
- height: yMax,
384
- onMove: cursor.onPointerMove,
385
- onLeave: cursor.onPointerLeave,
386
- onKeyDown: cursor.onKeyDown,
387
- onBlur: cursor.onBlur,
388
- valueMax: Math.max(data.length - 1, 0),
389
- ...point !== null && {
390
- valueNow: data.indexOf(point),
391
- valueText: formatX(getX(point))
392
- },
393
- ...ariaLabel !== void 0 && { ariaLabel }
394
- }
395
- )
396
- ] }) }),
514
+ `end-${s.key}`
515
+ )),
516
+ /* @__PURE__ */ jsx(
517
+ HoverOverlay,
518
+ {
519
+ width: xMax,
520
+ height: yMax,
521
+ ...cursorSliderProps({ cursor, data, getX, formatX, ariaLabel })
522
+ }
523
+ )
524
+ ] })
525
+ }
526
+ ),
397
527
  showTooltip && /* @__PURE__ */ jsxs(ChartTooltipFloat, { anchor: tooltipAnchor, ariaLive: cursor.isSource, children: [
398
528
  /* @__PURE__ */ jsx(
399
529
  TooltipHeader,
@@ -407,18 +537,7 @@ function CartesianPlot({
407
537
  ),
408
538
  /* @__PURE__ */ jsxs(TooltipBody, { children: [
409
539
  tooltipCfg?.prependRows?.(point, { visible, hidden }),
410
- rows.map((row) => /* @__PURE__ */ jsx(
411
- TooltipRow,
412
- {
413
- color: row.color,
414
- label: row.label,
415
- value: row.value,
416
- shape: row.shape,
417
- dashed: row.dashed,
418
- ...row.strokeWidth !== void 0 && { strokeWidth: row.strokeWidth }
419
- },
420
- row.key
421
- )),
540
+ /* @__PURE__ */ jsx(TooltipRows, { rows }),
422
541
  tooltipCfg?.extraRows?.(point, { visible, hidden })
423
542
  ] })
424
543
  ] })
@@ -1,17 +1,3 @@
1
- /**
2
- * Standard wrapper for every visx chart (docs/CONTROLS-SPEC.md §2.2) — card with a `WidgetHeader
3
- * tier="widget"` title row (icon/info/value/delta/count/actions) plus an optional subtitle, over a
4
- * clipped chart body. Do not wrap visx charts in bare divs.
5
- *
6
- * `WidgetHeader` lives in `src/dashboard/` and is itself Mantine-free, so composing it here
7
- * keeps `./charts` resolving with no `@mantine/*` installed (`check-dist-layering.mjs`,
8
- * `basalt/token-layer-boundary`). The `actions` slot cannot mount `CtlSlot` (Mantine-coupled) for
9
- * the same reason — it carries only `data-basalt-tier="widget"`; a basalt control placed there
10
- * sizes itself (`size="ctl"` internally), and a raw Mantine element is not auto-tiered.
11
- *
12
- * The header renders only when at least one of title/info/value/actions/icon/count is set — ending
13
- * the `''`-as-hidden-header sentinel a consumer used to reach for otherwise.
14
- */
15
1
  import type { ReactNode } from 'react';
16
2
  import type { BasaltProps, SlotStylesProps } from '../../common/props.js';
17
3
  import type { DeltaPolarity } from '../../dashboard/delta-badge.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ChartCard.d.ts","sourceRoot":"","sources":["../../../src/charts/primitives/ChartCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AA0ChD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GACtC,eAAe,CAAC,aAAa,CAAC,GAAG;IAC/B,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;8FAC0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;kEAC8D;IAC9D,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+FAA+F;IAC/F,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;sDACkD;IAClD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;oGACgG;IAChG,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAEH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,KAAK,EACL,OAAO,EACP,KAAK,EACL,iBAAuB,EACvB,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE,cAAc,+BAgEhB"}
1
+ {"version":3,"file":"ChartCard.d.ts","sourceRoot":"","sources":["../../../src/charts/primitives/ChartCard.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAKhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAuFhD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GACtC,eAAe,CAAC,aAAa,CAAC,GAAG;IAC/B,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;8FAC0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;kEAC8D;IAC9D,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+FAA+F;IAC/F,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;sDACkD;IAClD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;oGACgG;IAChG,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAEH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,KAAK,EACL,OAAO,EACP,KAAK,EACL,iBAAuB,EACvB,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE,cAAc,+BAsFhB"}