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
@@ -4,18 +4,27 @@ import type { ThemeTokens } from '../../theme/index.js';
4
4
  import type { FieldType, Rect } from '../../types.js';
5
5
  import type { EvidenceLedger, DataRepresentation } from '../../render/evidence.js';
6
6
  import type { LabelLedger } from '../../render/labelLedger.js';
7
- export declare const HEADER_ROW_HEIGHT = 32;
8
- export declare const MIN_COL_WIDTH = 72;
9
- export declare const DEFAULT_BODY_ROW_HEIGHT = 30;
10
- export declare const FILL_EPS = 0.5;
7
+ import type { ColumnFormatter } from './conditional.js';
8
+ import type { TableDensity, TableGridlines } from './style.js';
11
9
  /** A wobbly, asymmetric border-radius that reads as a hand-drawn frame. */
12
10
  export declare const SKETCH_BORDER_RADIUS = "14px 6px 16px 7px / 7px 15px 6px 14px";
11
+ /** Line-chart, filled-area, or column sparkline drawn from a cell's numeric array. */
12
+ export interface ViewSparkline {
13
+ type: 'line' | 'area' | 'bar';
14
+ color?: string;
15
+ /** Shared column scale (comparable magnitudes) or per-row scale (shape only). */
16
+ domain: [number, number] | 'row';
17
+ }
13
18
  export interface ViewColumn {
19
+ /** Field key used to read values (not necessarily unique). */
14
20
  key: string;
21
+ /** Unique column identity (sort state, DOM classes). Defaults to the key. */
22
+ id?: string;
15
23
  title: string;
16
24
  align: 'left' | 'center' | 'right';
17
25
  format?: string;
18
26
  type?: FieldType;
27
+ /** Fixed width in CSS px. */
19
28
  width?: number;
20
29
  conditionalFormat?: ConditionalFormat;
21
30
  isMeasure?: boolean;
@@ -25,6 +34,14 @@ export interface ViewColumn {
25
34
  sortable?: boolean;
26
35
  wrap?: boolean;
27
36
  group?: string;
37
+ /** Draw the cell's numeric array as a sparkline instead of text. */
38
+ sparkline?: ViewSparkline;
39
+ /** Stepped hierarchy column of a matrix (indent + expand/collapse). */
40
+ rowHeader?: boolean;
41
+ /** A grand-total / subtotal value column of a matrix. */
42
+ total?: boolean;
43
+ /** Draws a separator before this column (column-group boundary). */
44
+ groupStart?: boolean;
28
45
  }
29
46
  export interface HeaderCell {
30
47
  title: string;
@@ -33,71 +50,77 @@ export interface HeaderCell {
33
50
  align?: 'left' | 'center' | 'right';
34
51
  colIndex?: number;
35
52
  }
53
+ export interface ViewCell {
54
+ value: unknown;
55
+ raw: number | string | null;
56
+ /** Free text (labels) rather than a value to format. */
57
+ label?: boolean;
58
+ }
59
+ export type RowKind = 'leaf' | 'group' | 'subtotal' | 'grandtotal';
60
+ export interface ViewRowInfo {
61
+ kind: RowKind;
62
+ /** Hierarchy level for stepped row headers. */
63
+ depth: number;
64
+ expandable?: boolean;
65
+ expanded?: boolean;
66
+ /** Accessible name of the row (row-header text). */
67
+ label?: string;
68
+ }
36
69
  export interface VisibleRange {
37
70
  start: number;
38
71
  end: number;
39
72
  rowHeight: number;
40
73
  }
41
- export interface BuildTableOptions {
42
- container: HTMLElement;
74
+ /** What both the DOM and canvas table renderers consume. */
75
+ export interface TableViewInput {
43
76
  tokens: ThemeTokens;
44
77
  rect: Rect;
45
78
  columns: ViewColumn[];
46
79
  rowCount: number;
47
- getCell(rowIndex: number, colIndex: number): {
48
- value: unknown;
49
- raw: number | string | null;
50
- };
51
- rowClass?(rowIndex: number): 'normal' | 'subtotal' | 'grandtotal';
52
- cellIndent?(rowIndex: number, colIndex: number): number;
53
- rowHeaderSpan?: number;
80
+ getCell(rowIndex: number, colIndex: number): ViewCell;
81
+ rowInfo?(rowIndex: number): ViewRowInfo;
82
+ /** Rows matching an active highlight are tinted. */
83
+ highlighted?(rowIndex: number): boolean;
84
+ /** Leading columns pinned while scrolling horizontally (the matrix row header). */
85
+ frozenColumns?: number;
54
86
  striped?: boolean;
55
- stickyHeader?: boolean;
56
- onSort?(colIndex: number): void;
57
- sortState?: {
58
- col: number;
59
- dir: 'asc' | 'desc';
60
- };
61
87
  conditionalDomains?: Array<[number, number] | null>;
88
+ /** Precompiled per-column formatters; built from `conditionalDomains` when omitted. */
89
+ formatters?: Array<ColumnFormatter | null>;
90
+ /** Conditional formats apply to these row kinds only (default: leaf rows). */
91
+ formatKinds?: readonly RowKind[];
92
+ /** Per-row formatter override (a matrix scales each hierarchy level separately); null leaves the row plain. */
93
+ rowFormatters?(rowIndex: number): ReadonlyArray<ColumnFormatter | null> | null;
94
+ /** Known [min, max] numeric extremes per column for width measurement. */
95
+ extremes?: Array<[number, number] | null>;
62
96
  headerRows?: HeaderCell[][];
63
97
  footerRow?: {
64
- cells: Array<{
65
- value: unknown;
66
- raw: number | string | null;
67
- label?: boolean;
68
- }>;
98
+ cells: ViewCell[];
99
+ kind?: 'total' | 'grandtotal';
100
+ };
101
+ density?: TableDensity;
102
+ gridlines?: TableGridlines;
103
+ sortState?: {
104
+ col: number;
105
+ dir: 'asc' | 'desc';
69
106
  };
70
- density?: 'comfortable' | 'standard' | 'compact';
71
- visibleRange?: VisibleRange;
72
- /** Render hand-drawn chrome (wobbly frame, grid, and data bars) for sketch
73
- * mode. Carries the resolved rough style (roughness/bowing/seed/...) or null. */
107
+ /** Hand-drawn chrome (wobbly frame, grid, and data bars) or null. */
74
108
  sketch?: ResolvedSketch | null;
75
- /** Computed internally by buildTable; column pixel widths fitted to the container. */
109
+ /** Column pixel widths, filled in by the renderer. */
76
110
  widths?: number[];
77
111
  evidence?: EvidenceLedger;
78
112
  labels?: LabelLedger;
79
113
  dataRepresentation?: DataRepresentation;
80
114
  sourceRepresentedRows?: number;
81
- refreshEvidence?: () => void;
82
115
  }
83
- export type CanvasTableOptions = Omit<BuildTableOptions, 'container' | 'onSort'> & {
84
- ctx: CanvasRenderingContext2D;
85
- clippedCue?: boolean;
86
- };
87
116
  export declare function formatCellValue(value: unknown, column: Pick<ViewColumn, 'format'>): string;
88
117
  export declare function formatDisplayValue(value: unknown, column: Pick<ViewColumn, 'format' | 'prefix' | 'suffix' | 'negativeStyle'>): string;
89
- export declare function resolveConditionalDomain(conditionalFormat: ConditionalFormat | undefined, values: readonly (number | null | undefined)[]): [number, number] | null;
90
- export declare function computeFittedWidths(columns: readonly ViewColumn[], available: number, minimum?: number): number[];
91
- export declare function sumWidths(widths: readonly number[]): number;
92
- export declare function densityMetrics(density: BuildTableOptions['density']): {
93
- rowHeight: number;
94
- headerHeight: number;
95
- padding: string;
96
- paddingX: number;
97
- };
98
- export declare function normalizedHeaderRows(opts: Pick<BuildTableOptions, 'headerRows' | 'columns'>): HeaderCell[][];
99
- export declare function defaultColumnWidth(column: ViewColumn): number;
100
- export declare function leftOffset(opts: BuildTableOptions, colIndex: number): number;
118
+ /** Display text of a cell: labels verbatim, values through the column format. */
119
+ export declare function cellText(cell: ViewCell, column: ViewColumn): string;
120
+ export declare function defaultRowInfo(): ViewRowInfo;
121
+ export declare function normalizedHeaderRows(opts: Pick<TableViewInput, 'headerRows' | 'columns'>): HeaderCell[][];
122
+ export declare function columnId(column: ViewColumn, index: number): string;
101
123
  export declare function clampInt(value: number, min: number, max: number): number;
124
+ export declare function sumWidths(widths: readonly number[], start?: number, end?: number): number;
102
125
  export declare function setStyles(styleable: HTMLElement, styles: Record<string, string>): void;
103
126
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/charts/tableView/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/charts/tableView/types.ts"],"names":[],"mappings":"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"}
@@ -1,117 +1,52 @@
1
1
  import { formatValue } from "../../format/index.js";
2
- const HEADER_ROW_HEIGHT = 32;
3
- const MIN_COL_WIDTH = 72;
4
- const DEFAULT_BODY_ROW_HEIGHT = 30;
5
- const FILL_EPS = 0.5;
6
2
  const SKETCH_BORDER_RADIUS = "14px 6px 16px 7px / 7px 15px 6px 14px";
7
3
  function formatCellValue(value, column) {
8
4
  return formatValue(value, column.format);
9
5
  }
10
6
  function formatDisplayValue(value, column) {
7
+ if (value == null || value === "") return "";
11
8
  const raw = typeof value === "number" ? value : Number(value);
12
- const negative = Number.isFinite(raw) && raw < 0;
13
- const baseValue = negative && (column.negativeStyle === "parens" || column.negativeStyle === "parens-red") ? Math.abs(raw) : value;
14
- const formatted = formatCellValue(baseValue, column);
15
- const wrapped = negative && (column.negativeStyle === "parens" || column.negativeStyle === "parens-red") ? `(${formatted})` : formatted;
16
- return `${column.prefix ?? ""}${wrapped}${column.suffix ?? ""}`;
9
+ const parens = (column.negativeStyle === "parens" || column.negativeStyle === "parens-red") && Number.isFinite(raw) && raw < 0 && typeof value !== "boolean";
10
+ const formatted = formatCellValue(parens ? Math.abs(raw) : value, column);
11
+ return `${column.prefix ?? ""}${parens ? `(${formatted})` : formatted}${column.suffix ?? ""}`;
17
12
  }
18
- function resolveConditionalDomain(conditionalFormat, values) {
19
- if (!conditionalFormat) return null;
20
- if ("domain" in conditionalFormat && conditionalFormat.domain) return conditionalFormat.domain;
21
- let min = Infinity;
22
- let max = -Infinity;
23
- for (const value of values) {
24
- if (value == null || !Number.isFinite(value)) continue;
25
- if (value < min) min = value;
26
- if (value > max) max = value;
27
- }
28
- return min === Infinity ? null : [min, max];
29
- }
30
- function computeFittedWidths(columns, available, minimum = MIN_COL_WIDTH) {
31
- const natural = columns.map((column) => column.width ?? defaultColumnWidth(column));
32
- const naturalTotal = natural.reduce((sum, w) => sum + w, 0) || 1;
33
- if (available <= FILL_EPS) return natural;
34
- if (naturalTotal <= available) {
35
- const extra = available - naturalTotal;
36
- return natural.map((w) => w + extra * (w / naturalTotal));
37
- }
38
- const widths = natural.slice();
39
- for (let pass = 0; pass < columns.length; pass += 1) {
40
- const total = widths.reduce((sum, w) => sum + w, 0);
41
- if (total <= available + FILL_EPS) break;
42
- let flexTotal = 0;
43
- let fixedTotal = 0;
44
- for (const w of widths) {
45
- if (w > minimum + FILL_EPS) flexTotal += w;
46
- else fixedTotal += w;
47
- }
48
- if (flexTotal <= 0) break;
49
- const targetFlex = available - fixedTotal;
50
- const factor = targetFlex <= 0 ? 0 : targetFlex / flexTotal;
51
- for (let i = 0; i < widths.length; i += 1) {
52
- if (widths[i] > minimum + FILL_EPS) {
53
- widths[i] = Math.max(minimum, widths[i] * factor);
54
- }
55
- }
56
- }
57
- return widths;
13
+ function cellText(cell, column) {
14
+ if (cell.label) return cell.value == null ? "" : String(cell.value);
15
+ if (Array.isArray(cell.value) && column.sparkline) return "";
16
+ return formatDisplayValue(cell.value, column);
58
17
  }
59
- function sumWidths(widths) {
60
- return widths.reduce((sum, w) => sum + w, 0);
61
- }
62
- function densityMetrics(density) {
63
- if (density === "comfortable") return { rowHeight: 36, headerHeight: 36, padding: "8px 12px", paddingX: 12 };
64
- if (density === "compact") return { rowHeight: 24, headerHeight: 28, padding: "3px 8px", paddingX: 8 };
65
- return { rowHeight: DEFAULT_BODY_ROW_HEIGHT, headerHeight: HEADER_ROW_HEIGHT, padding: "6px 10px", paddingX: 10 };
18
+ function defaultRowInfo() {
19
+ return { kind: "leaf", depth: 0 };
66
20
  }
67
21
  function normalizedHeaderRows(opts) {
68
22
  if (opts.headerRows) return opts.headerRows;
69
- return [
70
- opts.columns.map((column, colIndex) => ({
71
- title: column.title,
72
- align: column.align,
73
- colIndex
74
- }))
75
- ];
76
- }
77
- function defaultColumnWidth(column) {
78
- if (column.width) return column.width;
79
- if (column.isMeasure || column.align === "right") return 112;
80
- if (column.type === "temporal") return 132;
81
- return 148;
23
+ return [opts.columns.map((column, colIndex) => ({ title: column.title, align: column.align, colIndex }))];
82
24
  }
83
- function leftOffset(opts, colIndex) {
84
- const widths = opts.widths ?? opts.columns.map((column) => column.width ?? defaultColumnWidth(column));
85
- let left = 0;
86
- for (let i = 0; i < colIndex; i += 1) left += widths[i] ?? 0;
87
- return left;
25
+ function columnId(column, index) {
26
+ return column.id ?? `${column.key}#${index}`;
88
27
  }
89
28
  function clampInt(value, min, max) {
90
29
  return Math.max(min, Math.min(max, Math.floor(value)));
91
30
  }
31
+ function sumWidths(widths, start = 0, end = widths.length) {
32
+ let total = 0;
33
+ for (let i = start; i < end; i++) total += widths[i] ?? 0;
34
+ return total;
35
+ }
92
36
  function setStyles(styleable, styles) {
93
37
  for (const [key, value] of Object.entries(styles)) {
94
- styleable.style.setProperty(kebab(key), value);
38
+ styleable.style.setProperty(key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`), value);
95
39
  }
96
40
  }
97
- function kebab(key) {
98
- return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
99
- }
100
41
  export {
101
- DEFAULT_BODY_ROW_HEIGHT,
102
- FILL_EPS,
103
- HEADER_ROW_HEIGHT,
104
- MIN_COL_WIDTH,
105
42
  SKETCH_BORDER_RADIUS,
43
+ cellText,
106
44
  clampInt,
107
- computeFittedWidths,
108
- defaultColumnWidth,
109
- densityMetrics,
45
+ columnId,
46
+ defaultRowInfo,
110
47
  formatCellValue,
111
48
  formatDisplayValue,
112
- leftOffset,
113
49
  normalizedHeaderRows,
114
- resolveConditionalDomain,
115
50
  setStyles,
116
51
  sumWidths
117
52
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/charts/tableView/types.ts"],
4
- "sourcesContent": ["import type { ConditionalFormat } from '../../spec/types';\nimport type { ResolvedSketch } from '../../spec/sketch';\nimport type { ThemeTokens } from '../../theme';\nimport type { FieldType, Rect } from '../../types';\nimport { formatValue } from '../../format';\nimport type { EvidenceLedger, DataRepresentation } from '../../render/evidence';\nimport type { LabelLedger } from '../../render/labelLedger';\nexport const HEADER_ROW_HEIGHT = 32;\nexport const MIN_COL_WIDTH = 72;\nexport const DEFAULT_BODY_ROW_HEIGHT = 30;\nexport const FILL_EPS = 0.5;\n/** A wobbly, asymmetric border-radius that reads as a hand-drawn frame. */\nexport const SKETCH_BORDER_RADIUS = '14px 6px 16px 7px / 7px 15px 6px 14px';\n\nexport interface ViewColumn {\n key: string;\n title: string;\n align: 'left' | 'center' | 'right';\n format?: string;\n type?: FieldType;\n width?: number;\n conditionalFormat?: ConditionalFormat;\n isMeasure?: boolean;\n prefix?: string;\n suffix?: string;\n negativeStyle?: 'sign' | 'parens' | 'red' | 'parens-red';\n sortable?: boolean;\n wrap?: boolean;\n group?: string;\n}\n\nexport interface HeaderCell {\n title: string;\n colSpan?: number;\n rowSpan?: number;\n align?: 'left' | 'center' | 'right';\n colIndex?: number;\n}\n\nexport interface VisibleRange {\n start: number;\n end: number;\n rowHeight: number;\n}\n\nexport interface BuildTableOptions {\n container: HTMLElement;\n tokens: ThemeTokens;\n rect: Rect;\n columns: ViewColumn[];\n rowCount: number;\n getCell(rowIndex: number, colIndex: number): { value: unknown; raw: number | string | null };\n rowClass?(rowIndex: number): 'normal' | 'subtotal' | 'grandtotal';\n cellIndent?(rowIndex: number, colIndex: number): number;\n rowHeaderSpan?: number;\n striped?: boolean;\n stickyHeader?: boolean;\n onSort?(colIndex: number): void;\n sortState?: { col: number; dir: 'asc' | 'desc' };\n conditionalDomains?: Array<[number, number] | null>;\n headerRows?: HeaderCell[][];\n footerRow?: { cells: Array<{ value: unknown; raw: number | string | null; label?: boolean }> };\n density?: 'comfortable' | 'standard' | 'compact';\n visibleRange?: VisibleRange;\n /** Render hand-drawn chrome (wobbly frame, grid, and data bars) for sketch\n * mode. Carries the resolved rough style (roughness/bowing/seed/...) or null. */\n sketch?: ResolvedSketch | null;\n /** Computed internally by buildTable; column pixel widths fitted to the container. */\n widths?: number[];\n evidence?: EvidenceLedger;\n labels?: LabelLedger;\n dataRepresentation?: DataRepresentation;\n sourceRepresentedRows?: number;\n refreshEvidence?: () => void;\n}\n\nexport type CanvasTableOptions = Omit<BuildTableOptions, 'container' | 'onSort'> & {\n ctx: CanvasRenderingContext2D;\n clippedCue?: boolean;\n};\n\nexport function formatCellValue(value: unknown, column: Pick<ViewColumn, 'format'>): string {\n return formatValue(value, column.format);\n}\n\nexport function formatDisplayValue(\n value: unknown,\n column: Pick<ViewColumn, 'format' | 'prefix' | 'suffix' | 'negativeStyle'>,\n): string {\n const raw = typeof value === 'number' ? value : Number(value);\n const negative = Number.isFinite(raw) && raw < 0;\n const baseValue =\n negative && (column.negativeStyle === 'parens' || column.negativeStyle === 'parens-red') ? Math.abs(raw) : value;\n const formatted = formatCellValue(baseValue, column);\n const wrapped = negative && (column.negativeStyle === 'parens' || column.negativeStyle === 'parens-red')\n ? `(${formatted})`\n : formatted;\n return `${column.prefix ?? ''}${wrapped}${column.suffix ?? ''}`;\n}\n\nexport function resolveConditionalDomain(\n conditionalFormat: ConditionalFormat | undefined,\n values: readonly (number | null | undefined)[],\n): [number, number] | null {\n if (!conditionalFormat) return null;\n if ('domain' in conditionalFormat && conditionalFormat.domain) return conditionalFormat.domain;\n let min = Infinity;\n let max = -Infinity;\n for (const value of values) {\n if (value == null || !Number.isFinite(value)) continue;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n return min === Infinity ? null : [min, max];\n}\n\nexport function computeFittedWidths(columns: readonly ViewColumn[], available: number, minimum = MIN_COL_WIDTH): number[] {\n const natural = columns.map((column) => column.width ?? defaultColumnWidth(column));\n const naturalTotal = natural.reduce((sum, w) => sum + w, 0) || 1;\n if (available <= FILL_EPS) return natural;\n if (naturalTotal <= available) {\n const extra = available - naturalTotal;\n return natural.map((w) => w + extra * (w / naturalTotal));\n }\n // Shrink to fit: iteratively scale columns above the minimum, letting any\n // column clamped at the minimum push its deficit onto the still-flexible ones,\n // so the total lands exactly on `available` whenever the minimums allow it.\n const widths = natural.slice();\n for (let pass = 0; pass < columns.length; pass += 1) {\n const total = widths.reduce((sum, w) => sum + w, 0);\n if (total <= available + FILL_EPS) break;\n let flexTotal = 0;\n let fixedTotal = 0;\n for (const w of widths) {\n if (w > minimum + FILL_EPS) flexTotal += w;\n else fixedTotal += w;\n }\n if (flexTotal <= 0) break;\n const targetFlex = available - fixedTotal;\n const factor = targetFlex <= 0 ? 0 : targetFlex / flexTotal;\n for (let i = 0; i < widths.length; i += 1) {\n if (widths[i] > minimum + FILL_EPS) {\n widths[i] = Math.max(minimum, widths[i] * factor);\n }\n }\n }\n return widths;\n}\n\nexport function sumWidths(widths: readonly number[]): number {\n return widths.reduce((sum, w) => sum + w, 0);\n}\n\nexport function densityMetrics(density: BuildTableOptions['density']): {\n rowHeight: number;\n headerHeight: number;\n padding: string;\n paddingX: number;\n} {\n if (density === 'comfortable') return { rowHeight: 36, headerHeight: 36, padding: '8px 12px', paddingX: 12 };\n if (density === 'compact') return { rowHeight: 24, headerHeight: 28, padding: '3px 8px', paddingX: 8 };\n return { rowHeight: DEFAULT_BODY_ROW_HEIGHT, headerHeight: HEADER_ROW_HEIGHT, padding: '6px 10px', paddingX: 10 };\n}\n\nexport function normalizedHeaderRows(opts: Pick<BuildTableOptions, 'headerRows' | 'columns'>): HeaderCell[][] {\n if (opts.headerRows) return opts.headerRows;\n return [\n opts.columns.map((column, colIndex) => ({\n title: column.title,\n align: column.align,\n colIndex,\n })),\n ];\n}\n\nexport function defaultColumnWidth(column: ViewColumn): number {\n if (column.width) return column.width;\n if (column.isMeasure || column.align === 'right') return 112;\n if (column.type === 'temporal') return 132;\n return 148;\n}\n\nexport function leftOffset(opts: BuildTableOptions, colIndex: number): number {\n const widths = opts.widths ?? opts.columns.map((column) => column.width ?? defaultColumnWidth(column));\n let left = 0;\n for (let i = 0; i < colIndex; i += 1) left += widths[i] ?? 0;\n return left;\n}\n\nexport function clampInt(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.floor(value)));\n}\n\nexport function setStyles(styleable: HTMLElement, styles: Record<string, string>): void {\n for (const [key, value] of Object.entries(styles)) {\n styleable.style.setProperty(kebab(key), value);\n }\n}\n\nfunction kebab(key: string): string {\n return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { ConditionalFormat } from '../../spec/types';\nimport type { ResolvedSketch } from '../../spec/sketch';\nimport type { ThemeTokens } from '../../theme';\nimport type { FieldType, Rect } from '../../types';\nimport { formatValue } from '../../format';\nimport type { EvidenceLedger, DataRepresentation } from '../../render/evidence';\nimport type { LabelLedger } from '../../render/labelLedger';\nimport type { ColumnFormatter } from './conditional';\nimport type { TableDensity, TableGridlines } from './style';\n\n/** A wobbly, asymmetric border-radius that reads as a hand-drawn frame. */\nexport const SKETCH_BORDER_RADIUS = '14px 6px 16px 7px / 7px 15px 6px 14px';\n\n/** Line-chart, filled-area, or column sparkline drawn from a cell's numeric array. */\nexport interface ViewSparkline {\n type: 'line' | 'area' | 'bar';\n color?: string;\n /** Shared column scale (comparable magnitudes) or per-row scale (shape only). */\n domain: [number, number] | 'row';\n}\n\nexport interface ViewColumn {\n /** Field key used to read values (not necessarily unique). */\n key: string;\n /** Unique column identity (sort state, DOM classes). Defaults to the key. */\n id?: string;\n title: string;\n align: 'left' | 'center' | 'right';\n format?: string;\n type?: FieldType;\n /** Fixed width in CSS px. */\n width?: number;\n conditionalFormat?: ConditionalFormat;\n isMeasure?: boolean;\n prefix?: string;\n suffix?: string;\n negativeStyle?: 'sign' | 'parens' | 'red' | 'parens-red';\n sortable?: boolean;\n wrap?: boolean;\n group?: string;\n /** Draw the cell's numeric array as a sparkline instead of text. */\n sparkline?: ViewSparkline;\n /** Stepped hierarchy column of a matrix (indent + expand/collapse). */\n rowHeader?: boolean;\n /** A grand-total / subtotal value column of a matrix. */\n total?: boolean;\n /** Draws a separator before this column (column-group boundary). */\n groupStart?: boolean;\n}\n\nexport interface HeaderCell {\n title: string;\n colSpan?: number;\n rowSpan?: number;\n align?: 'left' | 'center' | 'right';\n colIndex?: number;\n}\n\nexport interface ViewCell {\n value: unknown;\n raw: number | string | null;\n /** Free text (labels) rather than a value to format. */\n label?: boolean;\n}\n\nexport type RowKind = 'leaf' | 'group' | 'subtotal' | 'grandtotal';\n\nexport interface ViewRowInfo {\n kind: RowKind;\n /** Hierarchy level for stepped row headers. */\n depth: number;\n expandable?: boolean;\n expanded?: boolean;\n /** Accessible name of the row (row-header text). */\n label?: string;\n}\n\nexport interface VisibleRange {\n start: number;\n end: number;\n rowHeight: number;\n}\n\n/** What both the DOM and canvas table renderers consume. */\nexport interface TableViewInput {\n tokens: ThemeTokens;\n rect: Rect;\n columns: ViewColumn[];\n rowCount: number;\n getCell(rowIndex: number, colIndex: number): ViewCell;\n rowInfo?(rowIndex: number): ViewRowInfo;\n /** Rows matching an active highlight are tinted. */\n highlighted?(rowIndex: number): boolean;\n /** Leading columns pinned while scrolling horizontally (the matrix row header). */\n frozenColumns?: number;\n striped?: boolean;\n conditionalDomains?: Array<[number, number] | null>;\n /** Precompiled per-column formatters; built from `conditionalDomains` when omitted. */\n formatters?: Array<ColumnFormatter | null>;\n /** Conditional formats apply to these row kinds only (default: leaf rows). */\n formatKinds?: readonly RowKind[];\n /** Per-row formatter override (a matrix scales each hierarchy level separately); null leaves the row plain. */\n rowFormatters?(rowIndex: number): ReadonlyArray<ColumnFormatter | null> | null;\n /** Known [min, max] numeric extremes per column for width measurement. */\n extremes?: Array<[number, number] | null>;\n headerRows?: HeaderCell[][];\n footerRow?: { cells: ViewCell[]; kind?: 'total' | 'grandtotal' };\n density?: TableDensity;\n gridlines?: TableGridlines;\n sortState?: { col: number; dir: 'asc' | 'desc' };\n /** Hand-drawn chrome (wobbly frame, grid, and data bars) or null. */\n sketch?: ResolvedSketch | null;\n /** Column pixel widths, filled in by the renderer. */\n widths?: number[];\n evidence?: EvidenceLedger;\n labels?: LabelLedger;\n dataRepresentation?: DataRepresentation;\n sourceRepresentedRows?: number;\n}\n\nexport function formatCellValue(value: unknown, column: Pick<ViewColumn, 'format'>): string {\n return formatValue(value, column.format);\n}\n\nexport function formatDisplayValue(\n value: unknown,\n column: Pick<ViewColumn, 'format' | 'prefix' | 'suffix' | 'negativeStyle'>,\n): string {\n if (value == null || value === '') return '';\n const raw = typeof value === 'number' ? value : Number(value);\n const parens = (column.negativeStyle === 'parens' || column.negativeStyle === 'parens-red') &&\n Number.isFinite(raw) && raw < 0 && typeof value !== 'boolean';\n const formatted = formatCellValue(parens ? Math.abs(raw) : value, column);\n return `${column.prefix ?? ''}${parens ? `(${formatted})` : formatted}${column.suffix ?? ''}`;\n}\n\n/** Display text of a cell: labels verbatim, values through the column format. */\nexport function cellText(cell: ViewCell, column: ViewColumn): string {\n if (cell.label) return cell.value == null ? '' : String(cell.value);\n if (Array.isArray(cell.value) && column.sparkline) return '';\n return formatDisplayValue(cell.value, column);\n}\n\nexport function defaultRowInfo(): ViewRowInfo {\n return { kind: 'leaf', depth: 0 };\n}\n\nexport function normalizedHeaderRows(opts: Pick<TableViewInput, 'headerRows' | 'columns'>): HeaderCell[][] {\n if (opts.headerRows) return opts.headerRows;\n return [opts.columns.map((column, colIndex) => ({ title: column.title, align: column.align, colIndex }))];\n}\n\nexport function columnId(column: ViewColumn, index: number): string {\n return column.id ?? `${column.key}#${index}`;\n}\n\nexport function clampInt(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.floor(value)));\n}\n\nexport function sumWidths(widths: readonly number[], start = 0, end = widths.length): number {\n let total = 0;\n for (let i = start; i < end; i++) total += widths[i] ?? 0;\n return total;\n}\n\nexport function setStyles(styleable: HTMLElement, styles: Record<string, string>): void {\n for (const [key, value] of Object.entries(styles)) {\n styleable.style.setProperty(key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`), value);\n }\n}\n"],
5
+ "mappings": "AAIA,SAAS,mBAAmB;AAOrB,MAAM,uBAAuB;AA6G7B,SAAS,gBAAgB,OAAgB,QAA4C;AAC1F,SAAO,YAAY,OAAO,OAAO,MAAM;AACzC;AAEO,SAAS,mBACd,OACA,QACQ;AACR,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,QAAM,UAAU,OAAO,kBAAkB,YAAY,OAAO,kBAAkB,iBAC5E,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK,OAAO,UAAU;AACtD,QAAM,YAAY,gBAAgB,SAAS,KAAK,IAAI,GAAG,IAAI,OAAO,MAAM;AACxE,SAAO,GAAG,OAAO,UAAU,EAAE,GAAG,SAAS,IAAI,SAAS,MAAM,SAAS,GAAG,OAAO,UAAU,EAAE;AAC7F;AAGO,SAAS,SAAS,MAAgB,QAA4B;AACnE,MAAI,KAAK,MAAO,QAAO,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,KAAK;AAClE,MAAI,MAAM,QAAQ,KAAK,KAAK,KAAK,OAAO,UAAW,QAAO;AAC1D,SAAO,mBAAmB,KAAK,OAAO,MAAM;AAC9C;AAEO,SAAS,iBAA8B;AAC5C,SAAO,EAAE,MAAM,QAAQ,OAAO,EAAE;AAClC;AAEO,SAAS,qBAAqB,MAAsE;AACzG,MAAI,KAAK,WAAY,QAAO,KAAK;AACjC,SAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,QAAQ,cAAc,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,SAAS,EAAE,CAAC;AAC1G;AAEO,SAAS,SAAS,QAAoB,OAAuB;AAClE,SAAO,OAAO,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK;AAC5C;AAEO,SAAS,SAAS,OAAe,KAAa,KAAqB;AACxE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEO,SAAS,UAAU,QAA2B,QAAQ,GAAG,MAAM,OAAO,QAAgB;AAC3F,MAAI,QAAQ;AACZ,WAAS,IAAI,OAAO,IAAI,KAAK,IAAK,UAAS,OAAO,CAAC,KAAK;AACxD,SAAO;AACT;AAEO,SAAS,UAAU,WAAwB,QAAsC;AACtF,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,cAAU,MAAM,YAAY,IAAI,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE,GAAG,KAAK;AAAA,EACxF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,12 @@
1
- export { buildTable } from './tableView/dom.js';
1
+ export { mountTable, RENDER_ALL_CELLS } from './tableView/dom.js';
2
+ export type { DomTableOptions, DomTableView } from './tableView/dom.js';
2
3
  export { paintTableCanvas } from './tableView/canvas.js';
3
- export { createSketchGridCanvas, paintSketchGridOverlay } from './tableView/sketch.js';
4
- export { computeFittedWidths, densityMetrics, formatCellValue, formatDisplayValue, resolveConditionalDomain } from './tableView/types.js';
5
- export type { BuildTableOptions, CanvasTableOptions, HeaderCell, ViewColumn, VisibleRange } from './tableView/types.js';
6
- export type { SketchGridOverlay } from './tableView/sketch.js';
4
+ export type { CanvasTableOptions } from './tableView/canvas.js';
5
+ export { buildColumnFormatter, resolveConditionalDomain } from './tableView/conditional.js';
6
+ export type { CellPaint, ColumnFormatter } from './tableView/conditional.js';
7
+ export { cellText, formatCellValue, formatDisplayValue } from './tableView/types.js';
8
+ export type { HeaderCell, RowKind, TableViewInput, ViewCell, ViewColumn, ViewRowInfo, ViewSparkline } from './tableView/types.js';
9
+ export { densityMetrics, resolveTableStyle } from './tableView/style.js';
10
+ export type { TableDensity, TableGridlines } from './tableView/style.js';
11
+ export { sortRowIndices } from './tableView/sort.js';
7
12
  //# sourceMappingURL=tableView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tableView.d.ts","sourceRoot":"","sources":["../../src/charts/tableView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACvI,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrH,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"tableView.d.ts","sourceRoot":"","sources":["../../src/charts/tableView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClF,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/H,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,16 +1,20 @@
1
- import { buildTable } from "./tableView/dom.js";
1
+ import { mountTable, RENDER_ALL_CELLS } from "./tableView/dom.js";
2
2
  import { paintTableCanvas } from "./tableView/canvas.js";
3
- import { createSketchGridCanvas, paintSketchGridOverlay } from "./tableView/sketch.js";
4
- import { computeFittedWidths, densityMetrics, formatCellValue, formatDisplayValue, resolveConditionalDomain } from "./tableView/types.js";
3
+ import { buildColumnFormatter, resolveConditionalDomain } from "./tableView/conditional.js";
4
+ import { cellText, formatCellValue, formatDisplayValue } from "./tableView/types.js";
5
+ import { densityMetrics, resolveTableStyle } from "./tableView/style.js";
6
+ import { sortRowIndices } from "./tableView/sort.js";
5
7
  export {
6
- buildTable,
7
- computeFittedWidths,
8
- createSketchGridCanvas,
8
+ RENDER_ALL_CELLS,
9
+ buildColumnFormatter,
10
+ cellText,
9
11
  densityMetrics,
10
12
  formatCellValue,
11
13
  formatDisplayValue,
12
- paintSketchGridOverlay,
14
+ mountTable,
13
15
  paintTableCanvas,
14
- resolveConditionalDomain
16
+ resolveConditionalDomain,
17
+ resolveTableStyle,
18
+ sortRowIndices
15
19
  };
16
20
  //# sourceMappingURL=tableView.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/charts/tableView.ts"],
4
- "sourcesContent": ["export { buildTable } from './tableView/dom';\nexport { paintTableCanvas } from './tableView/canvas';\nexport { createSketchGridCanvas, paintSketchGridOverlay } from './tableView/sketch';\nexport { computeFittedWidths, densityMetrics, formatCellValue, formatDisplayValue, resolveConditionalDomain } from './tableView/types';\nexport type { BuildTableOptions, CanvasTableOptions, HeaderCell, ViewColumn, VisibleRange } from './tableView/types';\nexport type { SketchGridOverlay } from './tableView/sketch';\n"],
5
- "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB,8BAA8B;AAC/D,SAAS,qBAAqB,gBAAgB,iBAAiB,oBAAoB,gCAAgC;",
4
+ "sourcesContent": ["export { mountTable, RENDER_ALL_CELLS } from './tableView/dom';\nexport type { DomTableOptions, DomTableView } from './tableView/dom';\nexport { paintTableCanvas } from './tableView/canvas';\nexport type { CanvasTableOptions } from './tableView/canvas';\nexport { buildColumnFormatter, resolveConditionalDomain } from './tableView/conditional';\nexport type { CellPaint, ColumnFormatter } from './tableView/conditional';\nexport { cellText, formatCellValue, formatDisplayValue } from './tableView/types';\nexport type { HeaderCell, RowKind, TableViewInput, ViewCell, ViewColumn, ViewRowInfo, ViewSparkline } from './tableView/types';\nexport { densityMetrics, resolveTableStyle } from './tableView/style';\nexport type { TableDensity, TableGridlines } from './tableView/style';\nexport { sortRowIndices } from './tableView/sort';\n"],
5
+ "mappings": "AAAA,SAAS,YAAY,wBAAwB;AAE7C,SAAS,wBAAwB;AAEjC,SAAS,sBAAsB,gCAAgC;AAE/D,SAAS,UAAU,iBAAiB,0BAA0B;AAE9D,SAAS,gBAAgB,yBAAyB;AAElD,SAAS,sBAAsB;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"treemap.d.ts","sourceRoot":"","sources":["../../src/charts/treemap.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAS,IAAI,EAAQ,IAAI,EAAE,MAAM,UAAU,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IAClF,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,IAAI,CAAC;CACZ;AAqFD,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAkCnH;AAqXD,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,aAAa,GACtB,gBAAgB,GAAG,IAAI,CA0BzB"}
1
+ {"version":3,"file":"treemap.d.ts","sourceRoot":"","sources":["../../src/charts/treemap.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAS,IAAI,EAAQ,IAAI,EAAE,MAAM,UAAU,CAAC;AAIxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IAClF,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,IAAI,CAAC;CACZ;AA8GD,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAkCnH;AA2fD,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,aAAa,GACtB,gBAAgB,GAAG,IAAI,CAoDzB"}