graphein 0.20.0 → 0.22.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 (319) hide show
  1. package/dist/animation/animate.d.ts +6 -1
  2. package/dist/animation/animate.d.ts.map +1 -1
  3. package/dist/animation/animate.js +2 -2
  4. package/dist/animation/animate.js.map +2 -2
  5. package/dist/animation/env.d.ts +5 -0
  6. package/dist/animation/env.d.ts.map +1 -1
  7. package/dist/animation/env.js +4 -0
  8. package/dist/animation/env.js.map +2 -2
  9. package/dist/animation/index.d.ts +1 -0
  10. package/dist/animation/index.d.ts.map +1 -1
  11. package/dist/animation/index.js +1 -0
  12. package/dist/animation/index.js.map +2 -2
  13. package/dist/animation/stagger.d.ts +13 -0
  14. package/dist/animation/stagger.d.ts.map +1 -0
  15. package/dist/animation/stagger.js +13 -0
  16. package/dist/animation/stagger.js.map +7 -0
  17. package/dist/axes/draw.d.ts +5 -1
  18. package/dist/axes/draw.d.ts.map +1 -1
  19. package/dist/axes/draw.js +13 -1
  20. package/dist/axes/draw.js.map +2 -2
  21. package/dist/axes/morph.d.ts +111 -0
  22. package/dist/axes/morph.d.ts.map +1 -0
  23. package/dist/axes/morph.js +207 -0
  24. package/dist/axes/morph.js.map +7 -0
  25. package/dist/axes/overlay.d.ts.map +1 -1
  26. package/dist/axes/overlay.js +88 -25
  27. package/dist/axes/overlay.js.map +2 -2
  28. package/dist/axes/text.d.ts +2 -0
  29. package/dist/axes/text.d.ts.map +1 -1
  30. package/dist/axes/text.js +1 -0
  31. package/dist/axes/text.js.map +2 -2
  32. package/dist/axes/tickLabels.d.ts +2 -0
  33. package/dist/axes/tickLabels.d.ts.map +1 -1
  34. package/dist/axes/tickLabels.js +2 -2
  35. package/dist/axes/tickLabels.js.map +2 -2
  36. package/dist/charts/annotations.d.ts +9 -3
  37. package/dist/charts/annotations.d.ts.map +1 -1
  38. package/dist/charts/annotations.js +82 -27
  39. package/dist/charts/annotations.js.map +2 -2
  40. package/dist/charts/area.d.ts +37 -1
  41. package/dist/charts/area.d.ts.map +1 -1
  42. package/dist/charts/area.js +35 -17
  43. package/dist/charts/area.js.map +2 -2
  44. package/dist/charts/bar.d.ts +53 -0
  45. package/dist/charts/bar.d.ts.map +1 -1
  46. package/dist/charts/bar.js +117 -83
  47. package/dist/charts/bar.js.map +2 -2
  48. package/dist/charts/box.d.ts +31 -0
  49. package/dist/charts/box.d.ts.map +1 -1
  50. package/dist/charts/box.js +93 -70
  51. package/dist/charts/box.js.map +2 -2
  52. package/dist/charts/bubbleMap.d.ts +20 -0
  53. package/dist/charts/bubbleMap.d.ts.map +1 -0
  54. package/dist/charts/bubbleMap.js +951 -0
  55. package/dist/charts/bubbleMap.js.map +7 -0
  56. package/dist/charts/bullet.d.ts.map +1 -1
  57. package/dist/charts/bullet.js +69 -51
  58. package/dist/charts/bullet.js.map +2 -2
  59. package/dist/charts/calendarHeatmap.d.ts.map +1 -1
  60. package/dist/charts/calendarHeatmap.js +56 -19
  61. package/dist/charts/calendarHeatmap.js.map +2 -2
  62. package/dist/charts/candlestick.d.ts +40 -0
  63. package/dist/charts/candlestick.d.ts.map +1 -0
  64. package/dist/charts/candlestick.js +325 -0
  65. package/dist/charts/candlestick.js.map +7 -0
  66. package/dist/charts/choropleth.d.ts.map +1 -1
  67. package/dist/charts/choropleth.js +46 -67
  68. package/dist/charts/choropleth.js.map +2 -2
  69. package/dist/charts/combo.d.ts.map +1 -1
  70. package/dist/charts/combo.js +127 -27
  71. package/dist/charts/combo.js.map +3 -3
  72. package/dist/charts/dumbbell.d.ts.map +1 -1
  73. package/dist/charts/dumbbell.js +100 -31
  74. package/dist/charts/dumbbell.js.map +2 -2
  75. package/dist/charts/funnel.d.ts.map +1 -1
  76. package/dist/charts/funnel.js +93 -28
  77. package/dist/charts/funnel.js.map +3 -3
  78. package/dist/charts/gantt.d.ts +22 -0
  79. package/dist/charts/gantt.d.ts.map +1 -0
  80. package/dist/charts/gantt.js +564 -0
  81. package/dist/charts/gantt.js.map +7 -0
  82. package/dist/charts/gauge.d.ts.map +1 -1
  83. package/dist/charts/gauge.js +30 -4
  84. package/dist/charts/gauge.js.map +2 -2
  85. package/dist/charts/geo.d.ts +87 -0
  86. package/dist/charts/geo.d.ts.map +1 -0
  87. package/dist/charts/geo.js +140 -0
  88. package/dist/charts/geo.js.map +7 -0
  89. package/dist/charts/geometry.d.ts +20 -0
  90. package/dist/charts/geometry.d.ts.map +1 -0
  91. package/dist/charts/geometry.js +25 -0
  92. package/dist/charts/geometry.js.map +7 -0
  93. package/dist/charts/heatmap.d.ts.map +1 -1
  94. package/dist/charts/heatmap.js +58 -49
  95. package/dist/charts/heatmap.js.map +2 -2
  96. package/dist/charts/histogram.d.ts +1 -1
  97. package/dist/charts/histogram.d.ts.map +1 -1
  98. package/dist/charts/histogram.js +49 -31
  99. package/dist/charts/histogram.js.map +2 -2
  100. package/dist/charts/index.d.ts +35 -1
  101. package/dist/charts/index.d.ts.map +1 -1
  102. package/dist/charts/index.js +12 -0
  103. package/dist/charts/index.js.map +2 -2
  104. package/dist/charts/legibility.d.ts +38 -0
  105. package/dist/charts/legibility.d.ts.map +1 -0
  106. package/dist/charts/legibility.js +72 -0
  107. package/dist/charts/legibility.js.map +7 -0
  108. package/dist/charts/line.d.ts +39 -1
  109. package/dist/charts/line.d.ts.map +1 -1
  110. package/dist/charts/line.js +48 -16
  111. package/dist/charts/line.js.map +2 -2
  112. package/dist/charts/matrix.d.ts +2 -1
  113. package/dist/charts/matrix.d.ts.map +1 -1
  114. package/dist/charts/matrix.js +481 -319
  115. package/dist/charts/matrix.js.map +3 -3
  116. package/dist/charts/morphFrame.d.ts +83 -0
  117. package/dist/charts/morphFrame.d.ts.map +1 -0
  118. package/dist/charts/morphFrame.js +128 -0
  119. package/dist/charts/morphFrame.js.map +7 -0
  120. package/dist/charts/pie.d.ts.map +1 -1
  121. package/dist/charts/pie.js +89 -26
  122. package/dist/charts/pie.js.map +2 -2
  123. package/dist/charts/pieState.d.ts +27 -0
  124. package/dist/charts/pieState.d.ts.map +1 -0
  125. package/dist/charts/pieState.js +55 -0
  126. package/dist/charts/pieState.js.map +7 -0
  127. package/dist/charts/radar.d.ts +62 -0
  128. package/dist/charts/radar.d.ts.map +1 -0
  129. package/dist/charts/radar.js +912 -0
  130. package/dist/charts/radar.js.map +7 -0
  131. package/dist/charts/radialBar.d.ts +60 -0
  132. package/dist/charts/radialBar.d.ts.map +1 -0
  133. package/dist/charts/radialBar.js +708 -0
  134. package/dist/charts/radialBar.js.map +7 -0
  135. package/dist/charts/sankey.d.ts.map +1 -1
  136. package/dist/charts/sankey.js +223 -57
  137. package/dist/charts/sankey.js.map +3 -3
  138. package/dist/charts/scatter.d.ts +31 -0
  139. package/dist/charts/scatter.d.ts.map +1 -1
  140. package/dist/charts/scatter.js +48 -12
  141. package/dist/charts/scatter.js.map +2 -2
  142. package/dist/charts/slope.d.ts.map +1 -1
  143. package/dist/charts/slope.js +55 -3
  144. package/dist/charts/slope.js.map +2 -2
  145. package/dist/charts/sunburst.d.ts +14 -0
  146. package/dist/charts/sunburst.d.ts.map +1 -0
  147. package/dist/charts/sunburst.js +885 -0
  148. package/dist/charts/sunburst.js.map +7 -0
  149. package/dist/charts/table.d.ts +2 -1
  150. package/dist/charts/table.d.ts.map +1 -1
  151. package/dist/charts/table.js +214 -224
  152. package/dist/charts/table.js.map +3 -3
  153. package/dist/charts/tableView/canvas.d.ts +16 -1
  154. package/dist/charts/tableView/canvas.d.ts.map +1 -1
  155. package/dist/charts/tableView/canvas.js +361 -252
  156. package/dist/charts/tableView/canvas.js.map +3 -3
  157. package/dist/charts/tableView/conditional.d.ts +66 -40
  158. package/dist/charts/tableView/conditional.d.ts.map +1 -1
  159. package/dist/charts/tableView/conditional.js +163 -256
  160. package/dist/charts/tableView/conditional.js.map +3 -3
  161. package/dist/charts/tableView/dom.d.ts +26 -2
  162. package/dist/charts/tableView/dom.d.ts.map +1 -1
  163. package/dist/charts/tableView/dom.js +609 -269
  164. package/dist/charts/tableView/dom.js.map +3 -3
  165. package/dist/charts/tableView/layout.d.ts +22 -0
  166. package/dist/charts/tableView/layout.d.ts.map +1 -0
  167. package/dist/charts/tableView/layout.js +246 -0
  168. package/dist/charts/tableView/layout.js.map +7 -0
  169. package/dist/charts/tableView/sketch.d.ts +3 -2
  170. package/dist/charts/tableView/sketch.d.ts.map +1 -1
  171. package/dist/charts/tableView/sketch.js +2 -2
  172. package/dist/charts/tableView/sketch.js.map +2 -2
  173. package/dist/charts/tableView/sketchBar.d.ts +7 -0
  174. package/dist/charts/tableView/sketchBar.d.ts.map +1 -0
  175. package/dist/charts/tableView/sketchBar.js +32 -0
  176. package/dist/charts/tableView/sketchBar.js.map +7 -0
  177. package/dist/charts/tableView/sort.d.ts +9 -0
  178. package/dist/charts/tableView/sort.d.ts.map +1 -0
  179. package/dist/charts/tableView/sort.js +70 -0
  180. package/dist/charts/tableView/sort.js.map +7 -0
  181. package/dist/charts/tableView/sparkline.d.ts +30 -0
  182. package/dist/charts/tableView/sparkline.d.ts.map +1 -0
  183. package/dist/charts/tableView/sparkline.js +63 -0
  184. package/dist/charts/tableView/sparkline.js.map +7 -0
  185. package/dist/charts/tableView/style.d.ts +67 -0
  186. package/dist/charts/tableView/style.d.ts.map +1 -0
  187. package/dist/charts/tableView/style.js +131 -0
  188. package/dist/charts/tableView/style.js.map +7 -0
  189. package/dist/charts/tableView/types.d.ts +69 -46
  190. package/dist/charts/tableView/types.d.ts.map +1 -1
  191. package/dist/charts/tableView/types.js +22 -87
  192. package/dist/charts/tableView/types.js.map +2 -2
  193. package/dist/charts/tableView.d.ts +10 -5
  194. package/dist/charts/tableView.d.ts.map +1 -1
  195. package/dist/charts/tableView.js +12 -8
  196. package/dist/charts/tableView.js.map +2 -2
  197. package/dist/charts/treemap.d.ts.map +1 -1
  198. package/dist/charts/treemap.js +177 -68
  199. package/dist/charts/treemap.js.map +3 -3
  200. package/dist/charts/trendline.d.ts +13 -5
  201. package/dist/charts/trendline.d.ts.map +1 -1
  202. package/dist/charts/trendline.js +205 -56
  203. package/dist/charts/trendline.js.map +2 -2
  204. package/dist/charts/waterfall.d.ts.map +1 -1
  205. package/dist/charts/waterfall.js +76 -5
  206. package/dist/charts/waterfall.js.map +2 -2
  207. package/dist/index.d.ts +1 -1
  208. package/dist/index.js +1 -1
  209. package/dist/index.js.map +1 -1
  210. package/dist/interaction/cartesian.d.ts +4 -1
  211. package/dist/interaction/cartesian.d.ts.map +1 -1
  212. package/dist/interaction/cartesian.js +104 -34
  213. package/dist/interaction/cartesian.js.map +2 -2
  214. package/dist/interaction/controller.d.ts +29 -1
  215. package/dist/interaction/controller.d.ts.map +1 -1
  216. package/dist/interaction/controller.js +131 -8
  217. package/dist/interaction/controller.js.map +2 -2
  218. package/dist/interaction/focus.d.ts +23 -0
  219. package/dist/interaction/focus.d.ts.map +1 -0
  220. package/dist/interaction/focus.js +65 -0
  221. package/dist/interaction/focus.js.map +7 -0
  222. package/dist/interaction/tooltip.d.ts +6 -0
  223. package/dist/interaction/tooltip.d.ts.map +1 -1
  224. package/dist/interaction/tooltip.js +41 -16
  225. package/dist/interaction/tooltip.js.map +2 -2
  226. package/dist/interaction/types.d.ts +19 -0
  227. package/dist/interaction/types.d.ts.map +1 -1
  228. package/dist/interaction/veil.d.ts +25 -0
  229. package/dist/interaction/veil.d.ts.map +1 -0
  230. package/dist/interaction/veil.js +35 -0
  231. package/dist/interaction/veil.js.map +7 -0
  232. package/dist/pivot/pivot.d.ts +18 -0
  233. package/dist/pivot/pivot.d.ts.map +1 -1
  234. package/dist/pivot/pivot.js +46 -34
  235. package/dist/pivot/pivot.js.map +2 -2
  236. package/dist/render/chromeMotion.d.ts +65 -0
  237. package/dist/render/chromeMotion.d.ts.map +1 -0
  238. package/dist/render/chromeMotion.js +79 -0
  239. package/dist/render/chromeMotion.js.map +7 -0
  240. package/dist/render/pathSample.d.ts +24 -0
  241. package/dist/render/pathSample.d.ts.map +1 -0
  242. package/dist/render/pathSample.js +76 -0
  243. package/dist/render/pathSample.js.map +7 -0
  244. package/dist/render/transient.d.ts +18 -0
  245. package/dist/render/transient.d.ts.map +1 -0
  246. package/dist/render/transient.js +19 -0
  247. package/dist/render/transient.js.map +7 -0
  248. package/dist/runtime/candlestick.d.ts +112 -0
  249. package/dist/runtime/candlestick.d.ts.map +1 -0
  250. package/dist/runtime/candlestick.js +531 -0
  251. package/dist/runtime/candlestick.js.map +7 -0
  252. package/dist/runtime/cartesian.d.ts +14 -3
  253. package/dist/runtime/cartesian.d.ts.map +1 -1
  254. package/dist/runtime/cartesian.js.map +2 -2
  255. package/dist/runtime/chartAnimation.d.ts +54 -7
  256. package/dist/runtime/chartAnimation.d.ts.map +1 -1
  257. package/dist/runtime/chartAnimation.js +146 -28
  258. package/dist/runtime/chartAnimation.js.map +2 -2
  259. package/dist/runtime/chartRuntime.d.ts +42 -0
  260. package/dist/runtime/chartRuntime.d.ts.map +1 -1
  261. package/dist/runtime/chartRuntime.js +196 -30
  262. package/dist/runtime/chartRuntime.js.map +2 -2
  263. package/dist/runtime/dashboardDom.d.ts.map +1 -1
  264. package/dist/runtime/dashboardDom.js +45 -0
  265. package/dist/runtime/dashboardDom.js.map +2 -2
  266. package/dist/runtime/facet.d.ts +1 -1
  267. package/dist/runtime/facet.d.ts.map +1 -1
  268. package/dist/runtime/gantt.d.ts +137 -0
  269. package/dist/runtime/gantt.d.ts.map +1 -0
  270. package/dist/runtime/gantt.js +647 -0
  271. package/dist/runtime/gantt.js.map +7 -0
  272. package/dist/runtime/morph.d.ts +33 -0
  273. package/dist/runtime/morph.d.ts.map +1 -0
  274. package/dist/runtime/morph.js +332 -0
  275. package/dist/runtime/morph.js.map +7 -0
  276. package/dist/runtime/radar.d.ts +75 -0
  277. package/dist/runtime/radar.d.ts.map +1 -0
  278. package/dist/runtime/radar.js +201 -0
  279. package/dist/runtime/radar.js.map +7 -0
  280. package/dist/runtime/radialBar.d.ts +81 -0
  281. package/dist/runtime/radialBar.d.ts.map +1 -0
  282. package/dist/runtime/radialBar.js +125 -0
  283. package/dist/runtime/radialBar.js.map +7 -0
  284. package/dist/runtime/report/constants.d.ts +2 -2
  285. package/dist/runtime/report/constants.d.ts.map +1 -1
  286. package/dist/runtime/runtimeShared.d.ts +3 -3
  287. package/dist/runtime/runtimeShared.d.ts.map +1 -1
  288. package/dist/runtime/sunburst.d.ts +74 -0
  289. package/dist/runtime/sunburst.d.ts.map +1 -0
  290. package/dist/runtime/sunburst.js +150 -0
  291. package/dist/runtime/sunburst.js.map +7 -0
  292. package/dist/runtime/wire.d.ts.map +1 -1
  293. package/dist/runtime/wire.js +3 -1
  294. package/dist/runtime/wire.js.map +2 -2
  295. package/dist/shape/arc.d.ts +15 -2
  296. package/dist/shape/arc.d.ts.map +1 -1
  297. package/dist/shape/arc.js +204 -32
  298. package/dist/shape/arc.js.map +2 -2
  299. package/dist/spec/chartDefinitions.d.ts +6 -0
  300. package/dist/spec/chartDefinitions.d.ts.map +1 -1
  301. package/dist/spec/chartDefinitions.js +7 -1
  302. package/dist/spec/chartDefinitions.js.map +2 -2
  303. package/dist/spec/templates.d.ts.map +1 -1
  304. package/dist/spec/templates.js +177 -2
  305. package/dist/spec/templates.js.map +2 -2
  306. package/dist/spec/types.d.ts +258 -6
  307. package/dist/spec/types.d.ts.map +1 -1
  308. package/dist/spec/types.js +6 -0
  309. package/dist/spec/types.js.map +2 -2
  310. package/dist/spec/validate/charts.js +147 -15
  311. package/dist/spec/validate/charts.js.map +2 -2
  312. package/dist/spec/validate/common.d.ts +6 -0
  313. package/dist/spec/validate/common.d.ts.map +1 -1
  314. package/dist/spec/validate/overlays.js +2 -2
  315. package/dist/spec/validate/overlays.js.map +2 -2
  316. package/dist/spec/validate.data.d.ts.map +1 -1
  317. package/dist/spec/validate.data.js +8 -3
  318. package/dist/spec/validate.data.js.map +2 -2
  319. package/package.json +1 -1
@@ -1,4 +1,57 @@
1
1
  import type { Surface } from '../render/surface.js';
2
2
  import type { CartesianModel } from '../runtime/cartesian.js';
3
+ type CornerSide = 'top' | 'bottom' | 'left' | 'right' | 'none';
4
+ interface BarRect {
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ color: string;
10
+ cornerSide: CornerSide;
11
+ }
12
+ /**
13
+ * One bar (or stacked segment) in category/value-axis pixel space. Marks stay
14
+ * in axis space rather than screen space so the same paint pass serves both
15
+ * orientations and update morphs can interpolate them directly.
16
+ */
17
+ export interface BarMark {
18
+ /** Stable identity: series key + category key (+ a duplicate ordinal). */
19
+ key: string;
20
+ seriesKey: string;
21
+ category: string;
22
+ /** Category-axis start pixel and thickness. */
23
+ catStart: number;
24
+ catThick: number;
25
+ /** Value-axis pixels of the base edge and the value end. */
26
+ base: number;
27
+ end: number;
28
+ color: string;
29
+ alpha: number;
30
+ /** Whether the value end is rounded (false for inner stacked segments). */
31
+ rounded: boolean;
32
+ /** Stacked layouts: stack identity (sign + category) and level from the baseline. */
33
+ stack?: string;
34
+ level?: number;
35
+ }
36
+ export interface BarGeometry {
37
+ kind: 'bar';
38
+ marks: BarMark[];
39
+ radius: number;
40
+ horizontal: boolean;
41
+ /** Value-axis pixel of the zero baseline. */
42
+ baseline: number;
43
+ /** Rows the layout represents (including zero-length bars). */
44
+ represented: number;
45
+ }
46
+ /** Screen rect for a mark, or null when it has no drawable extent. */
47
+ export declare function barMarkRect(geometry: Pick<BarGeometry, 'horizontal'>, mark: BarMark): BarRect | null;
48
+ /**
49
+ * Resolve every bar for the current model without drawing. Returns null when
50
+ * the model has no band axis to lay bars out on.
51
+ */
52
+ export declare function layoutBars(model: CartesianModel): BarGeometry | null;
53
+ /** Paint resolved bar marks onto the surface's marks layer, clipped to the plot. */
54
+ export declare function paintBars(surface: Surface, model: CartesianModel, geometry: BarGeometry): void;
3
55
  export declare function drawBar(surface: Surface, model: CartesianModel): void;
56
+ export {};
4
57
  //# sourceMappingURL=bar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../src/charts/bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA6P3D,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAsBrE"}
1
+ {"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../src/charts/bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,KAAK,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,UAAU,OAAO;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;CACrB;AAoFD,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAIpG;AA8ID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAYpE;AAED,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CA2B9F;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAQrE"}
@@ -1,6 +1,7 @@
1
1
  import { roundedRect } from "../shape/index.js";
2
2
  import { RoughPen } from "../rough/index.js";
3
3
  import { accessor, toKey, toNumber } from "../util/data.js";
4
+ import { staggerProgress } from "../animation/stagger.js";
4
5
  import { rowAlpha } from "./emphasis.js";
5
6
  function finite(value) {
6
7
  return Number.isFinite(value);
@@ -56,8 +57,26 @@ function orientedRect(horizontal, catStart, catThick, base, value, color) {
56
57
  cornerSide: value < base ? "top" : value > base ? "bottom" : "none"
57
58
  };
58
59
  }
59
- function drawGroupedBars(surface, model, radius, pen) {
60
- const ctx = surface.marks.ctx;
60
+ function barMarkRect(geometry, mark) {
61
+ const rect = orientedRect(geometry.horizontal, mark.catStart, mark.catThick, mark.base, mark.end, mark.color);
62
+ if (rect && !mark.rounded) rect.cornerSide = "none";
63
+ return rect;
64
+ }
65
+ function entranceGrowth(model) {
66
+ const t = model.entranceProgress ?? 1;
67
+ const stagger = model.entranceStagger ?? 0;
68
+ if (!(stagger > 0) || t >= 1) return () => t;
69
+ const categories = model.x.categories ?? [];
70
+ const order = new Map(categories.map((category, index) => [category, index]));
71
+ return (categoryKey) => staggerProgress(t, order.get(categoryKey) ?? 0, categories.length, stagger, model.entranceEase);
72
+ }
73
+ function markKey(seen, seriesKey, categoryKey) {
74
+ const base = `${seriesKey}${categoryKey}`;
75
+ const n = seen.get(base) ?? 0;
76
+ seen.set(base, n + 1);
77
+ return n === 0 ? base : `${base}${n}`;
78
+ }
79
+ function layoutGroupedBars(model, out) {
61
80
  let represented = 0;
62
81
  const readX = accessor(model.x.field);
63
82
  const readY = accessor(model.y.field ?? "");
@@ -67,62 +86,55 @@ function drawGroupedBars(surface, model, radius, pen) {
67
86
  const subWidth = seriesCount > 1 ? bandWidth / seriesCount : bandWidth;
68
87
  const gap = seriesCount > 1 && subWidth > 3 ? Math.min(1, subWidth * 0.15) : 0;
69
88
  const barThick = Math.max(0, subWidth - gap);
70
- const t = model.entranceProgress ?? 1;
71
- const grow = (pixel) => model.y.baseline + (pixel - model.y.baseline) * t;
89
+ const growthOf = entranceGrowth(model);
90
+ const grow = (pixel, t) => model.y.baseline + (pixel - model.y.baseline) * t;
91
+ const seen = /* @__PURE__ */ new Map();
72
92
  model.series.forEach((series, seriesIndex) => {
73
- ctx.fillStyle = series.color;
74
93
  for (const row of series.rows) {
75
94
  const raw = readY(row);
76
95
  const value = toNumber(raw);
77
96
  if (raw == null || raw === "" || !finite(value)) continue;
78
- const center = model.x.pixel(readX(row));
97
+ const xValue = readX(row);
98
+ const center = model.x.pixel(xValue);
79
99
  if (center == null || !Number.isFinite(center)) continue;
80
100
  const valuePixel = model.y.pixel(value);
81
101
  if (!Number.isFinite(valuePixel)) continue;
82
102
  represented++;
103
+ const categoryKey = toKey(xValue);
104
+ const t = growthOf(categoryKey);
83
105
  const catStart = center - bandWidth / 2 + seriesIndex * subWidth + gap / 2;
84
- const rect = orientedRect(
85
- horizontal,
106
+ const base = grow(model.y.baseline, t);
107
+ const end = grow(valuePixel, t);
108
+ if (!orientedRect(horizontal, catStart, barThick, base, end, series.color)) continue;
109
+ out.push({
110
+ key: markKey(seen, series.key, categoryKey),
111
+ seriesKey: series.key,
112
+ category: categoryKey,
86
113
  catStart,
87
- barThick,
88
- grow(model.y.baseline),
89
- grow(valuePixel),
90
- series.color
91
- );
92
- if (rect) {
93
- const alpha = rowAlpha(model.emphasis, row);
94
- drawRect(ctx, rect, radius, pen, alpha);
95
- surface.evidence?.mark(
96
- "bar",
97
- rect.x,
98
- rect.y,
99
- rect.width,
100
- rect.height,
101
- rect.color,
102
- alpha,
103
- model.plot,
104
- 1,
105
- void 0,
106
- alpha < 1
107
- );
108
- }
114
+ catThick: barThick,
115
+ base,
116
+ end,
117
+ color: series.color,
118
+ alpha: rowAlpha(model.emphasis, row),
119
+ rounded: true
120
+ });
109
121
  }
110
122
  });
111
- surface.evidence?.data(represented);
123
+ return represented;
112
124
  }
113
- function drawStackedBars(surface, model, radius, pen) {
114
- const ctx = surface.marks.ctx;
125
+ function layoutStackedBars(model, out) {
115
126
  let represented = 0;
116
127
  const readX = accessor(model.x.field);
117
128
  const readY = accessor(model.y.field ?? "");
118
129
  const horizontal = model.orientation === "horizontal";
119
130
  const positiveTotals = /* @__PURE__ */ new Map();
120
131
  const negativeTotals = /* @__PURE__ */ new Map();
121
- const segments = [];
122
- const roundedEnds = /* @__PURE__ */ new Map();
132
+ const levels = /* @__PURE__ */ new Map();
133
+ const outerSegments = /* @__PURE__ */ new Map();
123
134
  const bandWidth = model.x.bandwidth;
124
- const t = model.entranceProgress ?? 1;
125
- const grow = (pixel) => model.y.baseline + (pixel - model.y.baseline) * t;
135
+ const growthOf = entranceGrowth(model);
136
+ const grow = (pixel, t) => model.y.baseline + (pixel - model.y.baseline) * t;
137
+ const seen = /* @__PURE__ */ new Map();
126
138
  for (const series of model.series) {
127
139
  for (const row of series.rows) {
128
140
  const xValue = readX(row);
@@ -141,66 +153,88 @@ function drawStackedBars(surface, model, radius, pen) {
141
153
  const base = totals.get(categoryKey) ?? 0;
142
154
  const top = base + value;
143
155
  totals.set(categoryKey, top);
144
- const rect = orientedRect(
145
- horizontal,
146
- center - bandWidth / 2,
147
- bandWidth,
148
- grow(model.y.pixel(base)),
149
- grow(model.y.pixel(top)),
150
- series.color
151
- );
152
- if (!rect) continue;
156
+ const t = growthOf(categoryKey);
157
+ const basePx = grow(model.y.pixel(base), t);
158
+ const endPx = grow(model.y.pixel(top), t);
159
+ const catStart = center - bandWidth / 2;
160
+ if (!orientedRect(horizontal, catStart, bandWidth, basePx, endPx, series.color)) continue;
153
161
  represented++;
154
- segments.push({ ...rect, stackEndKey, alpha: rowAlpha(model.emphasis, row) });
155
- roundedEnds.set(stackEndKey, segments.length - 1);
162
+ const level = levels.get(stackEndKey) ?? 0;
163
+ levels.set(stackEndKey, level + 1);
164
+ out.push({
165
+ key: markKey(seen, series.key, categoryKey),
166
+ seriesKey: series.key,
167
+ category: categoryKey,
168
+ catStart,
169
+ catThick: bandWidth,
170
+ base: basePx,
171
+ end: endPx,
172
+ color: series.color,
173
+ alpha: rowAlpha(model.emphasis, row),
174
+ rounded: false,
175
+ stack: stackEndKey,
176
+ level
177
+ });
178
+ outerSegments.set(stackEndKey, out.length - 1);
156
179
  }
157
180
  }
158
- segments.forEach((segment, index) => {
159
- const isOuterSegment = roundedEnds.get(segment.stackEndKey) === index;
160
- drawRect(
161
- ctx,
162
- { ...segment, cornerSide: isOuterSegment ? segment.cornerSide : "none" },
163
- radius,
164
- pen,
165
- segment.alpha
166
- );
167
- surface.evidence?.mark(
168
- "bar",
169
- segment.x,
170
- segment.y,
171
- segment.width,
172
- segment.height,
173
- segment.color,
174
- segment.alpha,
175
- model.plot,
176
- 1,
177
- void 0,
178
- segment.alpha < 1
179
- );
180
- });
181
- surface.evidence?.data(represented);
181
+ for (const index of outerSegments.values()) out[index].rounded = true;
182
+ return represented;
182
183
  }
183
- function drawBar(surface, model) {
184
- surface.evidence?.begin("rows");
185
- surface.evidence?.data(0);
184
+ function layoutBars(model) {
185
+ if (model.x.kind !== "band" || model.x.bandwidth <= 0 || model.series.length === 0) return null;
186
+ const marks = [];
187
+ const represented = model.stacked ? layoutStackedBars(model, marks) : layoutGroupedBars(model, marks);
188
+ return {
189
+ kind: "bar",
190
+ marks,
191
+ radius: defaultRadius(model, model.spec),
192
+ horizontal: model.orientation === "horizontal",
193
+ baseline: model.y.baseline,
194
+ represented
195
+ };
196
+ }
197
+ function paintBars(surface, model, geometry) {
186
198
  const ctx = surface.marks.ctx;
187
- const spec = model.spec;
188
199
  const { plot } = model;
189
- const radius = defaultRadius(model, spec);
190
200
  const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;
191
- if (model.x.kind !== "band" || model.x.bandwidth <= 0 || model.series.length === 0) return;
192
201
  ctx.save();
193
202
  ctx.beginPath();
194
203
  ctx.rect(plot.x, plot.y, plot.width, plot.height);
195
204
  ctx.clip();
196
- if (model.stacked) {
197
- drawStackedBars(surface, model, radius, pen);
198
- } else {
199
- drawGroupedBars(surface, model, radius, pen);
205
+ for (const mark of geometry.marks) {
206
+ const rect = barMarkRect(geometry, mark);
207
+ if (!rect) continue;
208
+ drawRect(ctx, rect, geometry.radius, pen, mark.alpha);
209
+ surface.evidence?.mark(
210
+ "bar",
211
+ rect.x,
212
+ rect.y,
213
+ rect.width,
214
+ rect.height,
215
+ rect.color,
216
+ mark.alpha,
217
+ plot,
218
+ 1,
219
+ void 0,
220
+ mark.alpha < 1
221
+ );
200
222
  }
201
223
  ctx.restore();
202
224
  }
225
+ function drawBar(surface, model) {
226
+ surface.evidence?.begin("rows");
227
+ surface.evidence?.data(0);
228
+ const geometry = layoutBars(model);
229
+ model.geometry = geometry ?? void 0;
230
+ if (!geometry) return;
231
+ paintBars(surface, model, geometry);
232
+ surface.evidence?.data(geometry.represented);
233
+ }
203
234
  export {
204
- drawBar
235
+ barMarkRect,
236
+ drawBar,
237
+ layoutBars,
238
+ paintBars
205
239
  };
206
240
  //# sourceMappingURL=bar.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/charts/bar.ts"],
4
- "sourcesContent": ["import type { Surface } from '../render/surface';\nimport type { CartesianModel } from '../runtime/cartesian';\nimport type { BarSpec } from '../spec/types';\nimport { roundedRect } from '../shape';\nimport { RoughPen } from '../rough';\nimport { accessor, toKey, toNumber } from '../util/data';\nimport { rowAlpha } from './emphasis';\n\ntype CornerSide = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\ninterface BarRect {\n x: number;\n y: number;\n width: number;\n height: number;\n color: string;\n cornerSide: CornerSide;\n}\n\ninterface StackSegment extends BarRect {\n stackEndKey: string;\n alpha: number;\n}\n\nfunction finite(value: number): boolean {\n return Number.isFinite(value);\n}\n\nfunction defaultRadius(model: CartesianModel, spec: BarSpec): number {\n return Math.max(0, spec.cornerRadius ?? Math.min(4, model.tokens.radius.sm));\n}\n\nfunction makeRadii(side: CornerSide, radius: number): number | [number, number, number, number] {\n if (side === 'top') return [radius, radius, 0, 0];\n if (side === 'bottom') return [0, 0, radius, radius];\n if (side === 'right') return [0, radius, radius, 0];\n if (side === 'left') return [radius, 0, 0, radius];\n return 0;\n}\n\nfunction drawRect(\n ctx: CanvasRenderingContext2D,\n rect: BarRect,\n radius: number,\n pen?: RoughPen | null,\n alpha = 1,\n): void {\n if (!finite(rect.x) || !finite(rect.y) || !finite(rect.width) || !finite(rect.height)) return;\n if (rect.width <= 0 || rect.height <= 0) return;\n\n const prevAlpha = ctx.globalAlpha;\n if (alpha !== 1) ctx.globalAlpha = prevAlpha * alpha;\n\n if (pen) {\n pen.rect(rect.x, rect.y, rect.width, rect.height, { stroke: rect.color, fill: rect.color });\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\n return;\n }\n\n const r = Math.min(radius, rect.width / 2, rect.height / 2);\n ctx.beginPath();\n roundedRect(ctx, rect.x, rect.y, rect.width, rect.height, makeRadii(rect.cornerSide, r));\n ctx.fillStyle = rect.color;\n ctx.fill();\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\n}\n\n/**\n * Build a screen-space rect from category-axis and value-axis pixels. `catStart`\n * and `catThick` are the bar's position and thickness along the category (band)\n * axis; `base` and `value` are pixels along the value axis. For vertical bars the\n * category axis is horizontal (screen x) and the value axis vertical; for\n * horizontal bars they swap. Corners round on the growing value end.\n */\nfunction orientedRect(\n horizontal: boolean,\n catStart: number,\n catThick: number,\n base: number,\n value: number,\n color: string,\n): BarRect | null {\n if (!finite(catStart) || !finite(catThick) || !finite(base) || !finite(value)) return null;\n const lo = Math.min(base, value);\n const len = Math.abs(value - base);\n if (catThick <= 0 || len <= 0) return null;\n if (horizontal) {\n return {\n x: lo,\n y: catStart,\n width: len,\n height: catThick,\n color,\n cornerSide: value > base ? 'right' : value < base ? 'left' : 'none',\n };\n }\n return {\n x: catStart,\n y: lo,\n width: catThick,\n height: len,\n color,\n cornerSide: value < base ? 'top' : value > base ? 'bottom' : 'none',\n };\n}\n\nfunction drawGroupedBars(\n surface: Surface,\n model: CartesianModel,\n radius: number,\n pen?: RoughPen | null,\n): void {\n const ctx = surface.marks.ctx;\n let represented = 0;\n const readX = accessor(model.x.field);\n const readY = accessor(model.y.field ?? '');\n const horizontal = model.orientation === 'horizontal';\n const seriesCount = model.series.length;\n const bandWidth = model.x.bandwidth;\n const subWidth = seriesCount > 1 ? bandWidth / seriesCount : bandWidth;\n const gap = seriesCount > 1 && subWidth > 3 ? Math.min(1, subWidth * 0.15) : 0;\n const barThick = Math.max(0, subWidth - gap);\n // Entrance: interpolate every value-axis pixel toward the baseline so bars\n // grow out of the axis. Identity (`grow(p) === p`) once progress reaches 1.\n const t = model.entranceProgress ?? 1;\n const grow = (pixel: number): number => model.y.baseline + (pixel - model.y.baseline) * t;\n\n model.series.forEach((series, seriesIndex) => {\n ctx.fillStyle = series.color;\n for (const row of series.rows) {\n const raw = readY(row);\n const value = toNumber(raw);\n if (raw == null || raw === '' || !finite(value)) continue;\n\n const center = model.x.pixel(readX(row));\n if (center == null || !Number.isFinite(center)) continue;\n const valuePixel = model.y.pixel(value);\n if (!Number.isFinite(valuePixel)) continue;\n represented++;\n\n const catStart = center - bandWidth / 2 + seriesIndex * subWidth + gap / 2;\n const rect = orientedRect(\n horizontal,\n catStart,\n barThick,\n grow(model.y.baseline),\n grow(valuePixel),\n series.color,\n );\n if (rect) {\n const alpha = rowAlpha(model.emphasis, row);\n drawRect(ctx, rect, radius, pen, alpha);\n surface.evidence?.mark(\n 'bar',\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n rect.color,\n alpha,\n model.plot,\n 1,\n undefined,\n alpha < 1,\n );\n }\n }\n });\n surface.evidence?.data(represented);\n}\n\nfunction drawStackedBars(\n surface: Surface,\n model: CartesianModel,\n radius: number,\n pen?: RoughPen | null,\n): void {\n const ctx = surface.marks.ctx;\n let represented = 0;\n const readX = accessor(model.x.field);\n const readY = accessor(model.y.field ?? '');\n const horizontal = model.orientation === 'horizontal';\n const positiveTotals = new Map<string, number>();\n const negativeTotals = new Map<string, number>();\n const segments: StackSegment[] = [];\n const roundedEnds = new Map<string, number>();\n const bandWidth = model.x.bandwidth;\n // Entrance: scale the whole stack out of the value baseline (see grouped bars).\n const t = model.entranceProgress ?? 1;\n const grow = (pixel: number): number => model.y.baseline + (pixel - model.y.baseline) * t;\n\n for (const series of model.series) {\n for (const row of series.rows) {\n const xValue = readX(row);\n const center = model.x.pixel(xValue);\n if (center == null || !Number.isFinite(center)) continue;\n\n const raw = readY(row);\n const value = toNumber(raw);\n if (raw == null || raw === '' || !finite(value)) continue;\n if (value === 0) {\n if (Number.isFinite(model.y.pixel(value))) represented++;\n continue;\n }\n\n const categoryKey = toKey(xValue);\n const totals = value >= 0 ? positiveTotals : negativeTotals;\n const stackEndKey = `${value >= 0 ? 'pos' : 'neg'}:${categoryKey}`;\n const base = totals.get(categoryKey) ?? 0;\n const top = base + value;\n totals.set(categoryKey, top);\n\n const rect = orientedRect(\n horizontal,\n center - bandWidth / 2,\n bandWidth,\n grow(model.y.pixel(base)),\n grow(model.y.pixel(top)),\n series.color,\n );\n if (!rect) continue;\n represented++;\n\n segments.push({ ...rect, stackEndKey, alpha: rowAlpha(model.emphasis, row) });\n roundedEnds.set(stackEndKey, segments.length - 1);\n }\n }\n\n segments.forEach((segment, index) => {\n const isOuterSegment = roundedEnds.get(segment.stackEndKey) === index;\n drawRect(\n ctx,\n { ...segment, cornerSide: isOuterSegment ? segment.cornerSide : 'none' },\n radius,\n pen,\n segment.alpha,\n );\n surface.evidence?.mark(\n 'bar',\n segment.x,\n segment.y,\n segment.width,\n segment.height,\n segment.color,\n segment.alpha,\n model.plot,\n 1,\n undefined,\n segment.alpha < 1,\n );\n });\n surface.evidence?.data(represented);\n}\n\nexport function drawBar(surface: Surface, model: CartesianModel): void {\n surface.evidence?.begin('rows');\n surface.evidence?.data(0);\n const ctx = surface.marks.ctx;\n const spec = model.spec as BarSpec;\n const { plot } = model;\n const radius = defaultRadius(model, spec);\n const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;\n\n if (model.x.kind !== 'band' || model.x.bandwidth <= 0 || model.series.length === 0) return;\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n if (model.stacked) {\n drawStackedBars(surface, model, radius, pen);\n } else {\n drawGroupedBars(surface, model, radius, pen);\n }\n\n ctx.restore();\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Surface } from '../render/surface';\nimport type { CartesianModel } from '../runtime/cartesian';\nimport type { BarSpec } from '../spec/types';\nimport { roundedRect } from '../shape';\nimport { RoughPen } from '../rough';\nimport { accessor, toKey, toNumber } from '../util/data';\nimport { staggerProgress } from '../animation/stagger';\nimport { rowAlpha } from './emphasis';\n\ntype CornerSide = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\ninterface BarRect {\n x: number;\n y: number;\n width: number;\n height: number;\n color: string;\n cornerSide: CornerSide;\n}\n\n/**\n * One bar (or stacked segment) in category/value-axis pixel space. Marks stay\n * in axis space rather than screen space so the same paint pass serves both\n * orientations and update morphs can interpolate them directly.\n */\nexport interface BarMark {\n /** Stable identity: series key + category key (+ a duplicate ordinal). */\n key: string;\n seriesKey: string;\n category: string;\n /** Category-axis start pixel and thickness. */\n catStart: number;\n catThick: number;\n /** Value-axis pixels of the base edge and the value end. */\n base: number;\n end: number;\n color: string;\n alpha: number;\n /** Whether the value end is rounded (false for inner stacked segments). */\n rounded: boolean;\n /** Stacked layouts: stack identity (sign + category) and level from the baseline. */\n stack?: string;\n level?: number;\n}\n\nexport interface BarGeometry {\n kind: 'bar';\n marks: BarMark[];\n radius: number;\n horizontal: boolean;\n /** Value-axis pixel of the zero baseline. */\n baseline: number;\n /** Rows the layout represents (including zero-length bars). */\n represented: number;\n}\n\nfunction finite(value: number): boolean {\n return Number.isFinite(value);\n}\n\nfunction defaultRadius(model: CartesianModel, spec: BarSpec): number {\n return Math.max(0, spec.cornerRadius ?? Math.min(4, model.tokens.radius.sm));\n}\n\nfunction makeRadii(side: CornerSide, radius: number): number | [number, number, number, number] {\n if (side === 'top') return [radius, radius, 0, 0];\n if (side === 'bottom') return [0, 0, radius, radius];\n if (side === 'right') return [0, radius, radius, 0];\n if (side === 'left') return [radius, 0, 0, radius];\n return 0;\n}\n\nfunction drawRect(\n ctx: CanvasRenderingContext2D,\n rect: BarRect,\n radius: number,\n pen?: RoughPen | null,\n alpha = 1,\n): void {\n if (!finite(rect.x) || !finite(rect.y) || !finite(rect.width) || !finite(rect.height)) return;\n if (rect.width <= 0 || rect.height <= 0) return;\n\n const prevAlpha = ctx.globalAlpha;\n if (alpha !== 1) ctx.globalAlpha = prevAlpha * alpha;\n\n if (pen) {\n pen.rect(rect.x, rect.y, rect.width, rect.height, { stroke: rect.color, fill: rect.color });\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\n return;\n }\n\n const r = Math.min(radius, rect.width / 2, rect.height / 2);\n ctx.beginPath();\n roundedRect(ctx, rect.x, rect.y, rect.width, rect.height, makeRadii(rect.cornerSide, r));\n ctx.fillStyle = rect.color;\n ctx.fill();\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\n}\n\n/**\n * Build a screen-space rect from category-axis and value-axis pixels. `catStart`\n * and `catThick` are the bar's position and thickness along the category (band)\n * axis; `base` and `value` are pixels along the value axis. For vertical bars the\n * category axis is horizontal (screen x) and the value axis vertical; for\n * horizontal bars they swap. Corners round on the growing value end.\n */\nfunction orientedRect(\n horizontal: boolean,\n catStart: number,\n catThick: number,\n base: number,\n value: number,\n color: string,\n): BarRect | null {\n if (!finite(catStart) || !finite(catThick) || !finite(base) || !finite(value)) return null;\n const lo = Math.min(base, value);\n const len = Math.abs(value - base);\n if (catThick <= 0 || len <= 0) return null;\n if (horizontal) {\n return {\n x: lo,\n y: catStart,\n width: len,\n height: catThick,\n color,\n cornerSide: value > base ? 'right' : value < base ? 'left' : 'none',\n };\n }\n return {\n x: catStart,\n y: lo,\n width: catThick,\n height: len,\n color,\n cornerSide: value < base ? 'top' : value > base ? 'bottom' : 'none',\n };\n}\n\n/** Screen rect for a mark, or null when it has no drawable extent. */\nexport function barMarkRect(geometry: Pick<BarGeometry, 'horizontal'>, mark: BarMark): BarRect | null {\n const rect = orientedRect(geometry.horizontal, mark.catStart, mark.catThick, mark.base, mark.end, mark.color);\n if (rect && !mark.rounded) rect.cornerSide = 'none';\n return rect;\n}\n\n/**\n * Entrance growth along the value axis. Without a stagger every bar shares the\n * runtime's eased progress; with one, `entranceProgress` is the raw clock and\n * each category starts a little later than the previous one.\n */\nfunction entranceGrowth(model: CartesianModel): (categoryKey: string) => number {\n const t = model.entranceProgress ?? 1;\n const stagger = model.entranceStagger ?? 0;\n if (!(stagger > 0) || t >= 1) return () => t;\n const categories = model.x.categories ?? [];\n const order = new Map(categories.map((category, index) => [category, index]));\n return (categoryKey) =>\n staggerProgress(t, order.get(categoryKey) ?? 0, categories.length, stagger, model.entranceEase);\n}\n\nfunction markKey(seen: Map<string, number>, seriesKey: string, categoryKey: string): string {\n const base = `${seriesKey}\\u0001${categoryKey}`;\n const n = seen.get(base) ?? 0;\n seen.set(base, n + 1);\n return n === 0 ? base : `${base}\\u0001${n}`;\n}\n\nfunction layoutGroupedBars(model: CartesianModel, out: BarMark[]): number {\n let represented = 0;\n const readX = accessor(model.x.field);\n const readY = accessor(model.y.field ?? '');\n const horizontal = model.orientation === 'horizontal';\n const seriesCount = model.series.length;\n const bandWidth = model.x.bandwidth;\n const subWidth = seriesCount > 1 ? bandWidth / seriesCount : bandWidth;\n const gap = seriesCount > 1 && subWidth > 3 ? Math.min(1, subWidth * 0.15) : 0;\n const barThick = Math.max(0, subWidth - gap);\n // Entrance: interpolate every value-axis pixel toward the baseline so bars\n // grow out of the axis. Identity (`grow(p) === p`) once progress reaches 1.\n const growthOf = entranceGrowth(model);\n const grow = (pixel: number, t: number): number => model.y.baseline + (pixel - model.y.baseline) * t;\n const seen = new Map<string, number>();\n\n model.series.forEach((series, seriesIndex) => {\n for (const row of series.rows) {\n const raw = readY(row);\n const value = toNumber(raw);\n if (raw == null || raw === '' || !finite(value)) continue;\n\n const xValue = readX(row);\n const center = model.x.pixel(xValue);\n if (center == null || !Number.isFinite(center)) continue;\n const valuePixel = model.y.pixel(value);\n if (!Number.isFinite(valuePixel)) continue;\n represented++;\n\n const categoryKey = toKey(xValue);\n const t = growthOf(categoryKey);\n const catStart = center - bandWidth / 2 + seriesIndex * subWidth + gap / 2;\n const base = grow(model.y.baseline, t);\n const end = grow(valuePixel, t);\n if (!orientedRect(horizontal, catStart, barThick, base, end, series.color)) continue;\n out.push({\n key: markKey(seen, series.key, categoryKey),\n seriesKey: series.key,\n category: categoryKey,\n catStart,\n catThick: barThick,\n base,\n end,\n color: series.color,\n alpha: rowAlpha(model.emphasis, row),\n rounded: true,\n });\n }\n });\n return represented;\n}\n\nfunction layoutStackedBars(model: CartesianModel, out: BarMark[]): number {\n let represented = 0;\n const readX = accessor(model.x.field);\n const readY = accessor(model.y.field ?? '');\n const horizontal = model.orientation === 'horizontal';\n const positiveTotals = new Map<string, number>();\n const negativeTotals = new Map<string, number>();\n const levels = new Map<string, number>();\n const outerSegments = new Map<string, number>();\n const bandWidth = model.x.bandwidth;\n // Entrance: scale the whole stack out of the value baseline (see grouped bars).\n const growthOf = entranceGrowth(model);\n const grow = (pixel: number, t: number): number => model.y.baseline + (pixel - model.y.baseline) * t;\n const seen = new Map<string, number>();\n\n for (const series of model.series) {\n for (const row of series.rows) {\n const xValue = readX(row);\n const center = model.x.pixel(xValue);\n if (center == null || !Number.isFinite(center)) continue;\n\n const raw = readY(row);\n const value = toNumber(raw);\n if (raw == null || raw === '' || !finite(value)) continue;\n if (value === 0) {\n if (Number.isFinite(model.y.pixel(value))) represented++;\n continue;\n }\n\n const categoryKey = toKey(xValue);\n const totals = value >= 0 ? positiveTotals : negativeTotals;\n const stackEndKey = `${value >= 0 ? 'pos' : 'neg'}:${categoryKey}`;\n const base = totals.get(categoryKey) ?? 0;\n const top = base + value;\n totals.set(categoryKey, top);\n\n const t = growthOf(categoryKey);\n const basePx = grow(model.y.pixel(base), t);\n const endPx = grow(model.y.pixel(top), t);\n const catStart = center - bandWidth / 2;\n if (!orientedRect(horizontal, catStart, bandWidth, basePx, endPx, series.color)) continue;\n represented++;\n\n const level = levels.get(stackEndKey) ?? 0;\n levels.set(stackEndKey, level + 1);\n out.push({\n key: markKey(seen, series.key, categoryKey),\n seriesKey: series.key,\n category: categoryKey,\n catStart,\n catThick: bandWidth,\n base: basePx,\n end: endPx,\n color: series.color,\n alpha: rowAlpha(model.emphasis, row),\n rounded: false,\n stack: stackEndKey,\n level,\n });\n outerSegments.set(stackEndKey, out.length - 1);\n }\n }\n for (const index of outerSegments.values()) out[index].rounded = true;\n return represented;\n}\n\n/**\n * Resolve every bar for the current model without drawing. Returns null when\n * the model has no band axis to lay bars out on.\n */\nexport function layoutBars(model: CartesianModel): BarGeometry | null {\n if (model.x.kind !== 'band' || model.x.bandwidth <= 0 || model.series.length === 0) return null;\n const marks: BarMark[] = [];\n const represented = model.stacked ? layoutStackedBars(model, marks) : layoutGroupedBars(model, marks);\n return {\n kind: 'bar',\n marks,\n radius: defaultRadius(model, model.spec as BarSpec),\n horizontal: model.orientation === 'horizontal',\n baseline: model.y.baseline,\n represented,\n };\n}\n\n/** Paint resolved bar marks onto the surface's marks layer, clipped to the plot. */\nexport function paintBars(surface: Surface, model: CartesianModel, geometry: BarGeometry): void {\n const ctx = surface.marks.ctx;\n const { plot } = model;\n const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const mark of geometry.marks) {\n const rect = barMarkRect(geometry, mark);\n if (!rect) continue;\n drawRect(ctx, rect, geometry.radius, pen, mark.alpha);\n surface.evidence?.mark(\n 'bar',\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n rect.color,\n mark.alpha,\n plot,\n 1,\n undefined,\n mark.alpha < 1,\n );\n }\n ctx.restore();\n}\n\nexport function drawBar(surface: Surface, model: CartesianModel): void {\n surface.evidence?.begin('rows');\n surface.evidence?.data(0);\n const geometry = layoutBars(model);\n model.geometry = geometry ?? undefined;\n if (!geometry) return;\n paintBars(surface, model, geometry);\n surface.evidence?.data(geometry.represented);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -31,10 +31,41 @@ export interface BoxLayout {
31
31
  geoms: BoxGeom[];
32
32
  showOutliers: boolean;
33
33
  }
34
+ /** One box as drawn: pixel-space whiskers, quartiles and outliers. */
35
+ export interface BoxMark {
36
+ key: string;
37
+ /** Category key (x) and series key, for hover focus subsets. */
38
+ category: string;
39
+ seriesKey?: string;
40
+ color: string;
41
+ cx: number;
42
+ boxW: number;
43
+ yQ1: number;
44
+ yQ3: number;
45
+ yMed: number;
46
+ yLo: number;
47
+ yHi: number;
48
+ /** Outlier centers (px). */
49
+ outliers: number[];
50
+ /** Opacity: the highlight's dim, times any morph fade. */
51
+ alpha: number;
52
+ /** Observations summarized (render evidence). */
53
+ count: number;
54
+ }
55
+ /** A box plot's resolved marks — what {@link paintBoxes} draws and update morphs tween. */
56
+ export interface BoxGeometry {
57
+ kind: 'box';
58
+ marks: BoxMark[];
59
+ showOutliers: boolean;
60
+ }
34
61
  /** Type-7 (linear interpolation) quantile of a pre-sorted ascending array. */
35
62
  export declare function computeStats(values: number[], whisker: 'tukey' | 'minMax'): BoxStats | null;
36
63
  /** Resolve per-category (and per-series) box geometry without drawing. */
37
64
  export declare function computeBoxes(model: CartesianModel): BoxLayout | null;
65
+ /** Resolve the boxes' pixel geometry (including highlight dimming) without drawing. */
66
+ export declare function layoutBoxes(model: CartesianModel): BoxGeometry | null;
67
+ /** Paint box geometry (clipped to the plot), recording evidence for each box and outlier. */
68
+ export declare function paintBoxes(surface: Surface, model: CartesianModel, geometry: BoxGeometry): void;
38
69
  export declare function drawBox(surface: Surface, model: CartesianModel): void;
39
70
  /** Box-plot interaction (the runtime uses this instead of the generic cartesian one). */
40
71
  export declare function buildBoxInteraction(model: CartesianModel): InteractionModel | void;
@@ -1 +1 @@
1
- {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/charts/box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS3D,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CA+B3F;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAwDpE;AAgID,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAuDrE;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CA4DlF"}
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/charts/box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS3D,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CA+B3F;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAwDpE;AA6GD,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAsBrE;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CA8C/F;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAWrE;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CA4DlF"}