@perspective-dev/viewer-charts 4.3.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 (258) hide show
  1. package/LICENSE.md +193 -0
  2. package/dist/cdn/perspective-viewer-charts.js +3 -0
  3. package/dist/cdn/perspective-viewer-charts.js.map +7 -0
  4. package/dist/esm/axis/axis-primitives.d.ts +24 -0
  5. package/dist/esm/axis/bar-axis.d.ts +51 -0
  6. package/dist/esm/axis/canvas.d.ts +24 -0
  7. package/dist/esm/axis/categorical-axis-core.d.ts +42 -0
  8. package/dist/esm/axis/categorical-axis.d.ts +27 -0
  9. package/dist/esm/axis/facet-chrome.d.ts +13 -0
  10. package/dist/esm/axis/label-geometry.d.ts +41 -0
  11. package/dist/esm/axis/legend.d.ts +44 -0
  12. package/dist/esm/axis/numeric-axis.d.ts +20 -0
  13. package/dist/esm/charts/candlestick/candlestick-build.d.ts +129 -0
  14. package/dist/esm/charts/candlestick/candlestick-interact.d.ts +10 -0
  15. package/dist/esm/charts/candlestick/candlestick-render.d.ts +24 -0
  16. package/dist/esm/charts/candlestick/candlestick.d.ts +144 -0
  17. package/dist/esm/charts/candlestick/glyphs/draw-candlesticks.d.ts +36 -0
  18. package/dist/esm/charts/candlestick/glyphs/draw-ohlc.d.ts +33 -0
  19. package/dist/esm/charts/canvas-types.d.ts +15 -0
  20. package/dist/esm/charts/cartesian/cartesian-build.d.ts +14 -0
  21. package/dist/esm/charts/cartesian/cartesian-interact.d.ts +20 -0
  22. package/dist/esm/charts/cartesian/cartesian-render.d.ts +26 -0
  23. package/dist/esm/charts/cartesian/cartesian.d.ts +239 -0
  24. package/dist/esm/charts/cartesian/glyph.d.ts +53 -0
  25. package/dist/esm/charts/cartesian/glyphs/density.d.ts +142 -0
  26. package/dist/esm/charts/cartesian/glyphs/lines.d.ts +23 -0
  27. package/dist/esm/charts/cartesian/glyphs/points.d.ts +24 -0
  28. package/dist/esm/charts/cartesian/label-interner.d.ts +21 -0
  29. package/dist/esm/charts/cartesian/tooltip-lines.d.ts +11 -0
  30. package/dist/esm/charts/chart-base.d.ts +402 -0
  31. package/dist/esm/charts/chart.d.ts +338 -0
  32. package/dist/esm/charts/common/band-layout.d.ts +32 -0
  33. package/dist/esm/charts/common/categorical-y-chart.d.ts +53 -0
  34. package/dist/esm/charts/common/category-axis-resolver.d.ts +90 -0
  35. package/dist/esm/charts/common/chrome-cache.d.ts +18 -0
  36. package/dist/esm/charts/common/draw-tooltip-box.d.ts +9 -0
  37. package/dist/esm/charts/common/leaf-color.d.ts +33 -0
  38. package/dist/esm/charts/common/node-store.d.ts +81 -0
  39. package/dist/esm/charts/common/tree-chart.d.ts +48 -0
  40. package/dist/esm/charts/common/tree-chrome.d.ts +31 -0
  41. package/dist/esm/charts/common/tree-data.d.ts +54 -0
  42. package/dist/esm/charts/common/visible-extent.d.ts +51 -0
  43. package/dist/esm/charts/heatmap/heatmap-build.d.ts +86 -0
  44. package/dist/esm/charts/heatmap/heatmap-interact.d.ts +19 -0
  45. package/dist/esm/charts/heatmap/heatmap-render.d.ts +19 -0
  46. package/dist/esm/charts/heatmap/heatmap-y-axis.d.ts +46 -0
  47. package/dist/esm/charts/heatmap/heatmap.d.ts +117 -0
  48. package/dist/esm/charts/map/map.d.ts +67 -0
  49. package/dist/esm/charts/registry.d.ts +14 -0
  50. package/dist/esm/charts/series/glyphs/draw-areas.d.ts +30 -0
  51. package/dist/esm/charts/series/glyphs/draw-bars.d.ts +15 -0
  52. package/dist/esm/charts/series/glyphs/draw-lines.d.ts +34 -0
  53. package/dist/esm/charts/series/glyphs/draw-scatter.d.ts +33 -0
  54. package/dist/esm/charts/series/series-build.d.ts +228 -0
  55. package/dist/esm/charts/series/series-interact.d.ts +35 -0
  56. package/dist/esm/charts/series/series-render.d.ts +41 -0
  57. package/dist/esm/charts/series/series-type.d.ts +49 -0
  58. package/dist/esm/charts/series/series.d.ts +317 -0
  59. package/dist/esm/charts/sunburst/sunburst-interact.d.ts +7 -0
  60. package/dist/esm/charts/sunburst/sunburst-layout.d.ts +33 -0
  61. package/dist/esm/charts/sunburst/sunburst-render.d.ts +22 -0
  62. package/dist/esm/charts/sunburst/sunburst.d.ts +85 -0
  63. package/dist/esm/charts/treemap/treemap-interact.d.ts +12 -0
  64. package/dist/esm/charts/treemap/treemap-layout.d.ts +28 -0
  65. package/dist/esm/charts/treemap/treemap-render.d.ts +18 -0
  66. package/dist/esm/charts/treemap/treemap.d.ts +74 -0
  67. package/dist/esm/config.d.ts +27 -0
  68. package/dist/esm/data/lazy-row.d.ts +32 -0
  69. package/dist/esm/data/split-groups.d.ts +20 -0
  70. package/dist/esm/data/view-reader.d.ts +35 -0
  71. package/dist/esm/event-detail.d.ts +28 -0
  72. package/dist/esm/index.d.ts +3 -0
  73. package/dist/esm/interaction/hit-test.d.ts +30 -0
  74. package/dist/esm/interaction/host-sink-dom.d.ts +19 -0
  75. package/dist/esm/interaction/host-sink-message.d.ts +46 -0
  76. package/dist/esm/interaction/lazy-tooltip.d.ts +61 -0
  77. package/dist/esm/interaction/raw-event-forwarder.d.ts +27 -0
  78. package/dist/esm/interaction/spatial-grid.d.ts +15 -0
  79. package/dist/esm/interaction/tooltip-controller.d.ts +193 -0
  80. package/dist/esm/interaction/zoom-controller.d.ts +106 -0
  81. package/dist/esm/interaction/zoom-router.d.ts +48 -0
  82. package/dist/esm/layout/facet-grid.d.ts +126 -0
  83. package/dist/esm/layout/plot-layout.d.ts +104 -0
  84. package/dist/esm/layout/ticks.d.ts +17 -0
  85. package/dist/esm/map/mercator.d.ts +102 -0
  86. package/dist/esm/map/tile-cache.d.ts +38 -0
  87. package/dist/esm/map/tile-layer.d.ts +66 -0
  88. package/dist/esm/map/tile-loader.d.ts +52 -0
  89. package/dist/esm/map/tile-source.d.ts +66 -0
  90. package/dist/esm/perspective-viewer-charts.js +3 -0
  91. package/dist/esm/perspective-viewer-charts.js.map +7 -0
  92. package/dist/esm/plugin/charts.d.ts +40 -0
  93. package/dist/esm/plugin/plugin.d.ts +95 -0
  94. package/dist/esm/render/scheduler.d.ts +41 -0
  95. package/dist/esm/theme/gradient.d.ts +48 -0
  96. package/dist/esm/theme/palette.d.ts +13 -0
  97. package/dist/esm/theme/theme-snapshot.d.ts +7 -0
  98. package/dist/esm/theme/theme.d.ts +53 -0
  99. package/dist/esm/transport/protocol.d.ts +430 -0
  100. package/dist/esm/transport/renderer-transport.d.ts +201 -0
  101. package/dist/esm/utils/css.d.ts +1 -0
  102. package/dist/esm/utils/font-snapshot.d.ts +50 -0
  103. package/dist/esm/webgl/buffer-pool.d.ts +62 -0
  104. package/dist/esm/webgl/context-manager.d.ts +184 -0
  105. package/dist/esm/webgl/gradient-texture.d.ts +17 -0
  106. package/dist/esm/webgl/instanced-attrs.d.ts +44 -0
  107. package/dist/esm/webgl/plot-frame.d.ts +39 -0
  108. package/dist/esm/webgl/program-cache.d.ts +13 -0
  109. package/dist/esm/webgl/shader-manifest.d.ts +53 -0
  110. package/dist/esm/webgl/shader-registry.d.ts +22 -0
  111. package/dist/esm/worker/boot.d.ts +0 -0
  112. package/dist/esm/worker/dispatch.d.ts +9 -0
  113. package/dist/esm/worker/font-loader.d.ts +2 -0
  114. package/dist/esm/worker/renderer.worker.d.ts +115 -0
  115. package/dist/esm/worker/session-host.d.ts +26 -0
  116. package/package.json +47 -0
  117. package/src/css/perspective-viewer-charts.css +95 -0
  118. package/src/ts/axis/axis-primitives.ts +125 -0
  119. package/src/ts/axis/bar-axis.ts +345 -0
  120. package/src/ts/axis/canvas.ts +64 -0
  121. package/src/ts/axis/categorical-axis-core.ts +125 -0
  122. package/src/ts/axis/categorical-axis.ts +716 -0
  123. package/src/ts/axis/facet-chrome.ts +42 -0
  124. package/src/ts/axis/label-geometry.ts +188 -0
  125. package/src/ts/axis/legend.ts +218 -0
  126. package/src/ts/axis/numeric-axis.ts +353 -0
  127. package/src/ts/charts/candlestick/candlestick-build.ts +516 -0
  128. package/src/ts/charts/candlestick/candlestick-interact.ts +256 -0
  129. package/src/ts/charts/candlestick/candlestick-render.ts +387 -0
  130. package/src/ts/charts/candlestick/candlestick.ts +367 -0
  131. package/src/ts/charts/candlestick/glyphs/draw-candlesticks.ts +432 -0
  132. package/src/ts/charts/candlestick/glyphs/draw-ohlc.ts +317 -0
  133. package/src/ts/charts/canvas-types.ts +30 -0
  134. package/src/ts/charts/cartesian/cartesian-build.ts +616 -0
  135. package/src/ts/charts/cartesian/cartesian-interact.ts +355 -0
  136. package/src/ts/charts/cartesian/cartesian-render.ts +948 -0
  137. package/src/ts/charts/cartesian/cartesian.ts +469 -0
  138. package/src/ts/charts/cartesian/glyph.ts +81 -0
  139. package/src/ts/charts/cartesian/glyphs/density.ts +1263 -0
  140. package/src/ts/charts/cartesian/glyphs/lines.ts +320 -0
  141. package/src/ts/charts/cartesian/glyphs/points.ts +239 -0
  142. package/src/ts/charts/cartesian/label-interner.ts +56 -0
  143. package/src/ts/charts/cartesian/tooltip-lines.ts +80 -0
  144. package/src/ts/charts/chart-base.ts +840 -0
  145. package/src/ts/charts/chart.ts +427 -0
  146. package/src/ts/charts/common/band-layout.ts +63 -0
  147. package/src/ts/charts/common/categorical-y-chart.ts +81 -0
  148. package/src/ts/charts/common/category-axis-resolver.ts +314 -0
  149. package/src/ts/charts/common/chrome-cache.ts +79 -0
  150. package/src/ts/charts/common/draw-tooltip-box.ts +84 -0
  151. package/src/ts/charts/common/leaf-color.ts +92 -0
  152. package/src/ts/charts/common/node-store.ts +235 -0
  153. package/src/ts/charts/common/tree-chart.ts +76 -0
  154. package/src/ts/charts/common/tree-chrome.ts +123 -0
  155. package/src/ts/charts/common/tree-data.ts +623 -0
  156. package/src/ts/charts/common/visible-extent.ts +112 -0
  157. package/src/ts/charts/heatmap/heatmap-build.ts +426 -0
  158. package/src/ts/charts/heatmap/heatmap-interact.ts +274 -0
  159. package/src/ts/charts/heatmap/heatmap-render.ts +815 -0
  160. package/src/ts/charts/heatmap/heatmap-y-axis.ts +351 -0
  161. package/src/ts/charts/heatmap/heatmap.ts +368 -0
  162. package/src/ts/charts/map/map.ts +201 -0
  163. package/src/ts/charts/registry.ts +65 -0
  164. package/src/ts/charts/series/glyphs/draw-areas.ts +331 -0
  165. package/src/ts/charts/series/glyphs/draw-bars.ts +113 -0
  166. package/src/ts/charts/series/glyphs/draw-lines.ts +320 -0
  167. package/src/ts/charts/series/glyphs/draw-scatter.ts +328 -0
  168. package/src/ts/charts/series/series-build.ts +848 -0
  169. package/src/ts/charts/series/series-interact.ts +604 -0
  170. package/src/ts/charts/series/series-render.ts +1109 -0
  171. package/src/ts/charts/series/series-type.ts +99 -0
  172. package/src/ts/charts/series/series.ts +794 -0
  173. package/src/ts/charts/sunburst/sunburst-interact.ts +460 -0
  174. package/src/ts/charts/sunburst/sunburst-layout.ts +238 -0
  175. package/src/ts/charts/sunburst/sunburst-render.ts +887 -0
  176. package/src/ts/charts/sunburst/sunburst.ts +248 -0
  177. package/src/ts/charts/treemap/treemap-interact.ts +445 -0
  178. package/src/ts/charts/treemap/treemap-layout.ts +328 -0
  179. package/src/ts/charts/treemap/treemap-render.ts +886 -0
  180. package/src/ts/charts/treemap/treemap.ts +247 -0
  181. package/src/ts/config.ts +41 -0
  182. package/src/ts/data/lazy-row.ts +140 -0
  183. package/src/ts/data/split-groups.ts +97 -0
  184. package/src/ts/data/view-reader.ts +107 -0
  185. package/src/ts/event-detail.ts +44 -0
  186. package/src/ts/index.ts +53 -0
  187. package/src/ts/interaction/hit-test.ts +106 -0
  188. package/src/ts/interaction/host-sink-dom.ts +85 -0
  189. package/src/ts/interaction/host-sink-message.ts +75 -0
  190. package/src/ts/interaction/lazy-tooltip.ts +102 -0
  191. package/src/ts/interaction/raw-event-forwarder.ts +175 -0
  192. package/src/ts/interaction/spatial-grid.ts +100 -0
  193. package/src/ts/interaction/tooltip-controller.ts +407 -0
  194. package/src/ts/interaction/zoom-controller.ts +468 -0
  195. package/src/ts/interaction/zoom-router.ts +230 -0
  196. package/src/ts/layout/facet-grid.ts +346 -0
  197. package/src/ts/layout/plot-layout.ts +277 -0
  198. package/src/ts/layout/ticks.ts +168 -0
  199. package/src/ts/map/mercator.ts +204 -0
  200. package/src/ts/map/tile-cache.ts +96 -0
  201. package/src/ts/map/tile-layer.ts +382 -0
  202. package/src/ts/map/tile-loader.ts +143 -0
  203. package/src/ts/map/tile-source.ts +156 -0
  204. package/src/ts/plugin/charts.ts +286 -0
  205. package/src/ts/plugin/plugin.ts +668 -0
  206. package/src/ts/render/scheduler.ts +339 -0
  207. package/src/ts/shaders/area.frag.glsl +20 -0
  208. package/src/ts/shaders/area.vert.glsl +19 -0
  209. package/src/ts/shaders/bar.frag.glsl +25 -0
  210. package/src/ts/shaders/bar.vert.glsl +60 -0
  211. package/src/ts/shaders/candlestick-body.frag.glsl +19 -0
  212. package/src/ts/shaders/candlestick-body.vert.glsl +34 -0
  213. package/src/ts/shaders/density-extreme.frag.glsl +30 -0
  214. package/src/ts/shaders/density-mrt.frag.glsl +44 -0
  215. package/src/ts/shaders/density-mrt.vert.glsl +48 -0
  216. package/src/ts/shaders/density-resolve.frag.glsl +89 -0
  217. package/src/ts/shaders/density-resolve.vert.glsl +23 -0
  218. package/src/ts/shaders/density-splat.frag.glsl +34 -0
  219. package/src/ts/shaders/density-splat.vert.glsl +52 -0
  220. package/src/ts/shaders/gridline.frag.glsl +18 -0
  221. package/src/ts/shaders/gridline.vert.glsl +18 -0
  222. package/src/ts/shaders/heatmap.frag.glsl +23 -0
  223. package/src/ts/shaders/heatmap.vert.glsl +42 -0
  224. package/src/ts/shaders/line-uniform.frag.glsl +26 -0
  225. package/src/ts/shaders/line-uniform.vert.glsl +54 -0
  226. package/src/ts/shaders/line.frag.glsl +28 -0
  227. package/src/ts/shaders/line.vert.glsl +87 -0
  228. package/src/ts/shaders/scatter.frag.glsl +39 -0
  229. package/src/ts/shaders/scatter.vert.glsl +67 -0
  230. package/src/ts/shaders/sunburst-arc.frag.glsl +19 -0
  231. package/src/ts/shaders/sunburst-arc.vert.glsl +79 -0
  232. package/src/ts/shaders/tile.frag.glsl +27 -0
  233. package/src/ts/shaders/tile.vert.glsl +35 -0
  234. package/src/ts/shaders/treemap.frag.glsl +19 -0
  235. package/src/ts/shaders/treemap.vert.glsl +25 -0
  236. package/src/ts/shaders/y-scatter.frag.glsl +30 -0
  237. package/src/ts/shaders/y-scatter.vert.glsl +31 -0
  238. package/src/ts/theme/gradient.ts +312 -0
  239. package/src/ts/theme/palette.ts +64 -0
  240. package/src/ts/theme/theme-snapshot.ts +66 -0
  241. package/src/ts/theme/theme.ts +166 -0
  242. package/src/ts/transport/protocol.ts +497 -0
  243. package/src/ts/transport/renderer-transport.ts +788 -0
  244. package/src/ts/utils/css.ts +36 -0
  245. package/src/ts/utils/font-snapshot.ts +159 -0
  246. package/src/ts/webgl/buffer-pool.ts +163 -0
  247. package/src/ts/webgl/context-manager.ts +414 -0
  248. package/src/ts/webgl/gradient-texture.ts +84 -0
  249. package/src/ts/webgl/instanced-attrs.ts +139 -0
  250. package/src/ts/webgl/plot-frame.ts +91 -0
  251. package/src/ts/webgl/program-cache.ts +46 -0
  252. package/src/ts/webgl/shader-manifest.ts +148 -0
  253. package/src/ts/webgl/shader-registry.ts +97 -0
  254. package/src/ts/worker/boot.ts +22 -0
  255. package/src/ts/worker/dispatch.ts +99 -0
  256. package/src/ts/worker/font-loader.ts +89 -0
  257. package/src/ts/worker/renderer.worker.ts +734 -0
  258. package/src/ts/worker/session-host.ts +118 -0
@@ -0,0 +1,353 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ import type { Canvas2D, Context2D } from "../charts/canvas-types";
14
+ import { PlotLayout, type PlotRect } from "../layout/plot-layout";
15
+ import {
16
+ computeNiceTicks,
17
+ formatTickValue,
18
+ formatDateTickValue,
19
+ } from "../layout/ticks";
20
+ import { getScaledContext } from "./canvas";
21
+ import {
22
+ drawGridlinesX,
23
+ drawGridlinesY,
24
+ drawXTickRow,
25
+ drawYTickColumn,
26
+ } from "./axis-primitives";
27
+ import type { Theme } from "../theme/theme";
28
+
29
+ export interface AxisDomain {
30
+ min: number;
31
+ max: number;
32
+ label: string;
33
+ isDate?: boolean;
34
+ }
35
+
36
+ export interface TickResult {
37
+ xTicks: number[];
38
+ yTicks: number[];
39
+ }
40
+
41
+ export function computeTicks(
42
+ xDomain: AxisDomain,
43
+ yDomain: AxisDomain,
44
+ layout: PlotLayout,
45
+ ): TickResult {
46
+ const { plotRect: plot } = layout;
47
+ const targetXTicks = Math.max(2, Math.floor(plot.width / 90));
48
+ const targetYTicks = Math.max(2, Math.floor(plot.height / 60));
49
+ return {
50
+ xTicks: computeNiceTicks(xDomain.min, xDomain.max, targetXTicks),
51
+ yTicks: computeNiceTicks(yDomain.min, yDomain.max, targetYTicks),
52
+ };
53
+ }
54
+
55
+ export function renderGridlines(
56
+ canvas: Canvas2D,
57
+ layout: PlotLayout,
58
+ xTicks: number[],
59
+ yTicks: number[],
60
+ theme: Theme,
61
+ dpr: number,
62
+ ): void {
63
+ const ctx = getScaledContext(canvas, dpr);
64
+ if (!ctx) {
65
+ return;
66
+ }
67
+
68
+ const { plotRect: plot } = layout;
69
+ ctx.strokeStyle = theme.gridlineColor;
70
+ ctx.lineWidth = 1;
71
+ drawGridlinesX(ctx, plot, xTicks, (v) => layout.dataToPixel(v, 0).px);
72
+ drawGridlinesY(ctx, plot, yTicks, (v) => layout.dataToPixel(0, v).py);
73
+ }
74
+
75
+ function tickFmt(
76
+ domain: AxisDomain,
77
+ ticks: number[],
78
+ override?: (v: number) => string,
79
+ ): (v: number) => string {
80
+ if (override) {
81
+ return override;
82
+ }
83
+
84
+ const step = ticks.length > 1 ? ticks[1] - ticks[0] : 0;
85
+ return domain.isDate
86
+ ? (v: number) => formatDateTickValue(v, step)
87
+ : formatTickValue;
88
+ }
89
+
90
+ /**
91
+ * Shared core for X-axis rendering used by both per-cell and outer-band
92
+ * variants. `axisY` is the pixel Y of the axis line; `band` defines the
93
+ * span of that line. `labelBand` (when label-rendering is requested)
94
+ * gives the box used to position/center the axis label below it.
95
+ */
96
+ function renderXAxisCore(
97
+ ctx: Context2D,
98
+ xDomain: AxisDomain,
99
+ xTicks: number[],
100
+ layouts: PlotLayout[],
101
+ axisY: number,
102
+ band: { x: number; width: number },
103
+ theme: Theme,
104
+ label: { cx: number; baselineY: number } | null,
105
+ formatter?: (v: number) => string,
106
+ ): void {
107
+ const { tickColor, labelColor, axisLineColor, fontFamily } = theme;
108
+ const fmt = tickFmt(xDomain, xTicks, formatter);
109
+
110
+ ctx.strokeStyle = axisLineColor;
111
+ ctx.lineWidth = 1;
112
+ ctx.beginPath();
113
+ ctx.moveTo(band.x, axisY);
114
+ ctx.lineTo(band.x + band.width, axisY);
115
+ ctx.stroke();
116
+
117
+ ctx.fillStyle = tickColor;
118
+ ctx.strokeStyle = tickColor;
119
+ ctx.font = `11px ${fontFamily}`;
120
+ for (const layout of layouts) {
121
+ drawXTickRow(
122
+ ctx,
123
+ layout.plotRect,
124
+ xTicks,
125
+ axisY,
126
+ "bottom",
127
+ (v) => layout.dataToPixel(v, 0).px,
128
+ fmt,
129
+ );
130
+ }
131
+
132
+ if (label && xDomain.label) {
133
+ ctx.fillStyle = labelColor;
134
+ ctx.font = `13px ${fontFamily}`;
135
+ ctx.textAlign = "center";
136
+ ctx.textBaseline = "bottom";
137
+ ctx.fillText(xDomain.label, label.cx, label.baselineY);
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Shared core for Y-axis rendering. `axisX` is the pixel X of the axis
143
+ * line; `band` defines its vertical span. `label` (when set) gives the
144
+ * pivot point for the rotated axis label.
145
+ */
146
+ function renderYAxisCore(
147
+ ctx: Context2D,
148
+ yDomain: AxisDomain,
149
+ yTicks: number[],
150
+ layouts: PlotLayout[],
151
+ axisX: number,
152
+ band: { y: number; height: number },
153
+ theme: Theme,
154
+ label: { pivotY: number } | null,
155
+ formatter?: (v: number) => string,
156
+ ): void {
157
+ const { tickColor, labelColor, axisLineColor, fontFamily } = theme;
158
+ const fmt = tickFmt(yDomain, yTicks, formatter);
159
+
160
+ ctx.strokeStyle = axisLineColor;
161
+ ctx.lineWidth = 1;
162
+ ctx.beginPath();
163
+ ctx.moveTo(axisX, band.y);
164
+ ctx.lineTo(axisX, band.y + band.height);
165
+ ctx.stroke();
166
+
167
+ ctx.fillStyle = tickColor;
168
+ ctx.strokeStyle = tickColor;
169
+ ctx.font = `11px ${fontFamily}`;
170
+ for (const layout of layouts) {
171
+ drawYTickColumn(
172
+ ctx,
173
+ layout.plotRect,
174
+ yTicks,
175
+ axisX,
176
+ "left",
177
+ (v) => layout.dataToPixel(0, v).py,
178
+ fmt,
179
+ );
180
+ }
181
+
182
+ if (label && yDomain.label) {
183
+ ctx.fillStyle = labelColor;
184
+ ctx.font = `13px ${fontFamily}`;
185
+ ctx.save();
186
+ ctx.translate(14, label.pivotY);
187
+ ctx.rotate(-Math.PI / 2);
188
+ ctx.textAlign = "center";
189
+ ctx.textBaseline = "bottom";
190
+ ctx.fillText(yDomain.label, 0, 0);
191
+ ctx.restore();
192
+ }
193
+ }
194
+
195
+ export function renderCellXAxis(
196
+ canvas: Canvas2D,
197
+ xDomain: AxisDomain,
198
+ layout: PlotLayout,
199
+ xTicks: number[],
200
+ theme: Theme,
201
+ hasLabel: boolean,
202
+ dpr: number,
203
+ formatter?: (v: number) => string,
204
+ ): void {
205
+ const ctx = getScaledContext(canvas, dpr);
206
+ if (!ctx) {
207
+ return;
208
+ }
209
+
210
+ const { plotRect: plot } = layout;
211
+ renderXAxisCore(
212
+ ctx,
213
+ xDomain,
214
+ xTicks,
215
+ [layout],
216
+ plot.y + plot.height,
217
+ plot,
218
+ theme,
219
+ hasLabel
220
+ ? {
221
+ cx: plot.x + plot.width / 2,
222
+ baselineY: layout.cssHeight - 2,
223
+ }
224
+ : null,
225
+ formatter,
226
+ );
227
+ }
228
+
229
+ export function renderCellYAxis(
230
+ canvas: Canvas2D,
231
+ yDomain: AxisDomain,
232
+ layout: PlotLayout,
233
+ yTicks: number[],
234
+ theme: Theme,
235
+ hasLabel: boolean,
236
+ dpr: number,
237
+ formatter?: (v: number) => string,
238
+ ): void {
239
+ const ctx = getScaledContext(canvas, dpr);
240
+ if (!ctx) {
241
+ return;
242
+ }
243
+
244
+ const { plotRect: plot } = layout;
245
+ renderYAxisCore(
246
+ ctx,
247
+ yDomain,
248
+ yTicks,
249
+ [layout],
250
+ plot.x,
251
+ plot,
252
+ theme,
253
+ hasLabel ? { pivotY: plot.y + plot.height / 2 } : null,
254
+ formatter,
255
+ );
256
+ }
257
+
258
+ export function renderAxesChrome(
259
+ canvas: Canvas2D,
260
+ xDomain: AxisDomain,
261
+ yDomain: AxisDomain,
262
+ layout: PlotLayout,
263
+ xTicks: number[],
264
+ yTicks: number[],
265
+ theme: Theme,
266
+ dpr: number,
267
+ xFormatter?: (v: number) => string,
268
+ yFormatter?: (v: number) => string,
269
+ ): void {
270
+ renderCellYAxis(
271
+ canvas,
272
+ yDomain,
273
+ layout,
274
+ yTicks,
275
+ theme,
276
+ true,
277
+ dpr,
278
+ yFormatter,
279
+ );
280
+ renderCellXAxis(
281
+ canvas,
282
+ xDomain,
283
+ layout,
284
+ xTicks,
285
+ theme,
286
+ true,
287
+ dpr,
288
+ xFormatter,
289
+ );
290
+ }
291
+
292
+ export function renderOuterXAxis(
293
+ canvas: Canvas2D,
294
+ rect: PlotRect,
295
+ xDomain: AxisDomain,
296
+ xTicks: number[],
297
+ colLayouts: PlotLayout[],
298
+ theme: Theme,
299
+ hasLabel: boolean,
300
+ dpr: number,
301
+ formatter?: (v: number) => string,
302
+ ): void {
303
+ const ctx = getScaledContext(canvas, dpr);
304
+ if (!ctx) {
305
+ return;
306
+ }
307
+
308
+ renderXAxisCore(
309
+ ctx,
310
+ xDomain,
311
+ xTicks,
312
+ colLayouts,
313
+ rect.y,
314
+ rect,
315
+ theme,
316
+ hasLabel
317
+ ? {
318
+ cx: rect.x + rect.width / 2,
319
+ baselineY: rect.y + rect.height - 2,
320
+ }
321
+ : null,
322
+ formatter,
323
+ );
324
+ }
325
+
326
+ export function renderOuterYAxis(
327
+ canvas: Canvas2D,
328
+ rect: PlotRect,
329
+ yDomain: AxisDomain,
330
+ yTicks: number[],
331
+ rowLayouts: PlotLayout[],
332
+ theme: Theme,
333
+ hasLabel: boolean,
334
+ dpr: number,
335
+ formatter?: (v: number) => string,
336
+ ): void {
337
+ const ctx = getScaledContext(canvas, dpr);
338
+ if (!ctx) {
339
+ return;
340
+ }
341
+
342
+ renderYAxisCore(
343
+ ctx,
344
+ yDomain,
345
+ yTicks,
346
+ rowLayouts,
347
+ rect.x + rect.width,
348
+ rect,
349
+ theme,
350
+ hasLabel ? { pivotY: rect.y + rect.height / 2 } : null,
351
+ formatter,
352
+ );
353
+ }