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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/charts/table.ts"],
4
- "sourcesContent": ["import { drawTitleBlock } from './chrome';\r\nimport {\r\n buildTable,\r\n createSketchGridCanvas,\r\n paintSketchGridOverlay,\r\n paintTableCanvas,\r\n resolveConditionalDomain,\r\n type BuildTableOptions,\r\n type ViewColumn,\r\n} from './tableView';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { Surface } from '../render/surface';\r\nimport type { ChartSpec, TableSpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Datum, FieldType, Size } from '../types';\r\nimport { accessor, inferType, toNumber } from '../util/data';\r\nimport { aggregateValues } from '../pivot';\r\n\r\nconst ROW_HEIGHT = 30;\r\nconst BUFFER_ROWS = 8;\r\n\r\ninterface TableDomState {\r\n sortState: TableSortState | null;\r\n specSortSignature: string;\r\n columnSignature: string;\r\n scrollTop: number;\r\n scrollLeft: number;\r\n}\r\n\r\nconst tableStates = new WeakMap<Surface, TableDomState>();\r\n\r\ninterface TableSortState {\r\n key: string;\r\n dir: 'asc' | 'desc';\r\n}\r\n\r\nexport function drawTable(surface: Surface, spec: ChartSpec, tokens: ThemeTokens, size: Size): void {\r\n if (spec.type !== 'table') return;\r\n surface.evidence?.begin('rows');\r\n surface.evidence?.data(0);\r\n if (surface.headless) {\r\n drawTableCanvas(surface, spec, tokens, size);\r\n return;\r\n }\r\n renderTable(surface, spec, tokens, size);\r\n}\r\n\r\nfunction drawTableCanvas(surface: Surface, spec: TableSpec, tokens: ThemeTokens, size: Size): void {\r\n const rect = drawTitleBlock(surface, tokens, size, spec.title);\r\n const data = spec.data ?? [];\r\n const columns = resolveColumns(data, spec);\r\n const read = columns.map((column) => accessor(column.key));\r\n const sortState = initialSortState(spec, columns);\r\n const sortedRows = sortRows(data, columns, read, sortState);\r\n const domains = columns.map((column, colIndex) =>\r\n resolveConditionalDomain(\r\n column.conditionalFormat,\r\n data.map((row) => numericRaw(read[colIndex](row))),\r\n ),\r\n );\r\n\r\n paintTableCanvas({\r\n ctx: surface.marks.ctx,\r\n evidence: surface.evidence,\r\n labels: surface.labels,\r\n dataRepresentation: 'rows',\r\n tokens,\r\n rect,\r\n columns,\r\n rowCount: sortedRows.length,\r\n getCell(rowIndex, colIndex) {\r\n const value = read[colIndex](sortedRows[rowIndex]);\r\n return { value, raw: conditionalRaw(value) };\r\n },\r\n striped: spec.striped === true,\r\n conditionalDomains: domains,\r\n headerRows: buildTableHeaderRows(columns),\r\n footerRow: buildTotalsRow(sortedRows, columns, read, spec),\r\n density: spec.density,\r\n sketch: resolveSketch(spec),\r\n });\r\n}\r\n\r\nfunction renderTable(surface: Surface, spec: TableSpec, tokens: ThemeTokens, size: Size): void {\r\n const rect = drawTitleBlock(surface, tokens, size, spec.title);\r\n const data = spec.data ?? [];\r\n const columns = resolveColumns(data, spec);\r\n const read = columns.map((column) => accessor(column.key));\r\n const sketch = resolveSketch(spec);\r\n const state = tableStateFor(surface, spec, columns);\r\n let sortState = state.sortState;\r\n let sortedRows = sortRows(data, columns, read, sortState);\r\n let footerRow = buildTotalsRow(sortedRows, columns, read, spec);\r\n const domains = columns.map((column, colIndex) =>\r\n resolveConditionalDomain(\r\n column.conditionalFormat,\r\n data.map((row) => numericRaw(read[colIndex](row))),\r\n ),\r\n );\r\n\r\n const host = document.createElement('div');\r\n surface.overlay.appendChild(host);\r\n\r\n const headerRowCount = buildTableHeaderRows(columns)?.length ?? 1;\r\n const overlay = sketch ? createSketchGridCanvas(rect) : null;\r\n if (overlay) surface.overlay.appendChild(overlay.canvas);\r\n\r\n let frame = 0;\r\n const renderWindow = (): void => {\r\n surface.evidence?.reset(size, data.length, spec.background ?? tokens.color.background);\r\n surface.evidence?.begin('rows');\r\n // Keep title chrome once; windowed body labels are replaced, not accumulated on scroll.\r\n if (surface.labels) surface.labels.records.splice(0, surface.labels.records.length,\r\n ...surface.labels.records.filter((l) => l.role === 'title' || l.role === 'subtitle'));\r\n const scrollTop = host.scrollTop || 0;\r\n const rowHeight = densityRowHeight(spec.density);\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - BUFFER_ROWS);\r\n const visible = Math.ceil(Math.max(rect.height, host.clientHeight || rect.height) / rowHeight) + BUFFER_ROWS * 2;\r\n const end = Math.min(sortedRows.length, start + visible);\r\n const buildOpts: BuildTableOptions = {\r\n container: host,\r\n evidence: surface.evidence,\r\n labels: surface.labels,\r\n dataRepresentation: 'rows',\r\n tokens,\r\n rect,\r\n columns,\r\n rowCount: sortedRows.length,\r\n getCell(rowIndex, colIndex) {\r\n const value = read[colIndex](sortedRows[rowIndex]);\r\n return { value, raw: conditionalRaw(value) };\r\n },\r\n striped: spec.striped === true,\r\n stickyHeader: spec.stickyHeader !== false,\r\n onSort(colIndex) {\r\n const key = columns[colIndex]?.key;\r\n if (!key) return;\r\n const previous = sortState;\r\n sortState =\r\n previous?.key === key\r\n ? { key, dir: previous.dir === 'asc' ? 'desc' : 'asc' }\r\n : { key, dir: 'asc' };\r\n state.sortState = sortState;\r\n sortedRows = sortRows(data, columns, read, sortState);\r\n footerRow = buildTotalsRow(sortedRows, columns, read, spec);\r\n host.scrollTop = 0;\r\n state.scrollTop = 0;\r\n renderWindow();\r\n },\r\n sortState: sortStateForView(sortState, columns),\r\n conditionalDomains: domains,\r\n headerRows: buildTableHeaderRows(columns),\r\n footerRow,\r\n density: spec.density,\r\n visibleRange: { start, end, rowHeight },\r\n sketch,\r\n };\r\n buildTable(buildOpts);\r\n if (state.scrollLeft && host.scrollLeft !== state.scrollLeft) host.scrollLeft = state.scrollLeft;\r\n surface.collectEvidence = () => {\r\n surface.evidence?.reset(size, data.length, spec.background ?? tokens.color.background);\r\n surface.evidence?.begin('rows');\r\n if (surface.labels) surface.labels.records.splice(0, surface.labels.records.length,\r\n ...surface.labels.records.filter((l) => l.role === 'title' || l.role === 'subtitle'));\r\n buildOpts.refreshEvidence?.();\r\n };\r\n if (sketch && overlay?.ctx) {\r\n paintSketchGridOverlay(overlay.ctx, {\r\n sketch,\r\n tokens,\r\n rect,\r\n dpr: overlay.dpr,\r\n columns,\r\n widths: buildOpts.widths ?? [],\r\n rowCount: sortedRows.length,\r\n headerRowCount,\r\n hasFooter: Boolean(footerRow),\r\n density: spec.density,\r\n scrollLeft: host.scrollLeft || 0,\r\n scrollTop,\r\n });\r\n }\r\n\r\n };\r\n\r\n host.addEventListener('scroll', () => {\r\n state.scrollTop = host.scrollTop || 0;\r\n state.scrollLeft = host.scrollLeft || 0;\r\n if (frame !== 0) return;\r\n frame = requestFrame(() => {\r\n frame = 0;\r\n renderWindow();\r\n });\r\n });\r\n\r\n renderWindow();\r\n if (state.scrollTop) host.scrollTop = state.scrollTop;\r\n if (state.scrollLeft) host.scrollLeft = state.scrollLeft;\r\n}\r\n\r\r\nfunction tableStateFor(surface: Surface, spec: TableSpec, columns: readonly ViewColumn[]): TableDomState {\r\n const specSortSignature = sortSignature(spec);\r\n const columnSignature = columnsSignature(columns);\r\n const state = tableStates.get(surface) ?? {\r\n sortState: initialSortState(spec, columns),\r\n specSortSignature,\r\n columnSignature,\r\n scrollTop: 0,\r\n scrollLeft: 0,\r\n };\r\n tableStates.set(surface, state);\r\n if (state.specSortSignature !== specSortSignature) {\r\n state.sortState = initialSortState(spec, columns);\r\n state.specSortSignature = specSortSignature;\r\n }\r\n if (state.columnSignature !== columnSignature) {\r\n state.columnSignature = columnSignature;\r\n state.scrollTop = 0;\r\n state.scrollLeft = 0;\r\n }\r\n const sortedKey = state.sortState?.key;\r\n if (sortedKey && !columns.some((column) => column.key === sortedKey)) {\r\n state.sortState = initialSortState(spec, columns);\r\n }\r\n return state;\r\n}\r\r\n\nfunction resolveColumns(data: readonly Datum[], spec: TableSpec): ViewColumn[] {\r\n const declared = spec.columns;\r\n const declaredVisible = declared?.filter((column) => column.hidden !== true);\r\n const fields = declaredVisible ? declaredVisible.map((column) => column.field) : Object.keys(data[0] ?? {});\r\n return fields.map((field, index) => {\r\n const declaredColumn = declaredVisible?.[index];\r\n const type = declaredColumn?.type ?? inferColumnType(data, field);\r\n const align = declaredColumn?.align ?? (type === 'quantitative' ? 'right' : 'left');\r\n return {\r\n key: field,\r\n title: declaredColumn?.title ?? field,\r\n type,\r\n align,\r\n format: declaredColumn?.format,\r\n width: declaredColumn?.width,\r\n conditionalFormat: declaredColumn?.conditionalFormat,\r\n isMeasure: type === 'quantitative',\r\n prefix: declaredColumn?.prefix,\r\n suffix: declaredColumn?.suffix,\r\n negativeStyle: declaredColumn?.negativeStyle,\r\n sortable: declaredColumn?.sortable,\r\n wrap: declaredColumn?.wrap,\r\n group: declaredColumn?.group,\r\n };\r\n });\r\n}\r\n\r\nfunction buildTableHeaderRows(columns: readonly ViewColumn[]) {\r\n if (!columns.some((column) => column.group)) return undefined;\r\n const groups = [];\r\n let index = 0;\r\n while (index < columns.length) {\r\n const group = columns[index].group ?? '';\r\n let span = 1;\r\n while (index + span < columns.length && (columns[index + span].group ?? '') === group) span += 1;\r\n groups.push({ title: group, colSpan: span, align: 'center' as const });\r\n index += span;\r\n }\r\n return [\r\n groups,\r\n columns.map((column, colIndex) => ({\r\n title: column.title,\r\n align: column.align,\r\n colIndex,\r\n })),\r\n ];\r\n}\r\n\r\nfunction buildTotalsRow(\r\n rows: readonly Datum[],\r\n columns: readonly ViewColumn[],\r\n read: readonly ((row: Datum) => unknown)[],\r\n spec: TableSpec,\r\n) {\r\n if (!spec.totals) return undefined;\r\n const label = typeof spec.totals === 'object' ? spec.totals.label ?? 'Total' : 'Total';\r\n const labelIndex = Math.max(0, columns.findIndex((column) => !column.isMeasure));\r\n const declaredVisible = spec.columns?.filter((column) => column.hidden !== true);\r\n return {\r\n cells: columns.map((column, colIndex) => {\r\n if (colIndex === labelIndex) return { value: label, raw: null, label: true };\r\n const declared = declaredVisible?.find((entry) => entry.field === column.key);\r\n const op = declared?.total === false ? false : declared?.total ?? (column.isMeasure ? 'sum' : false);\r\n if (!op) return { value: null, raw: null };\r\n const value = aggregateValues(rows.map((row) => read[colIndex](row)), op);\r\n return { value, raw: value };\r\n }),\r\n };\r\n}\r\n\r\nfunction inferColumnType(data: readonly Datum[], field: string): FieldType {\r\n return data.length === 0 ? 'nominal' : inferType(data, field);\r\n}\r\n\r\nfunction initialSortState(spec: TableSpec, columns: readonly ViewColumn[]): TableSortState | null {\r\n if (!spec.sort) return null;\r\n return columns.some((column) => column.key === spec.sort?.field)\r\n ? { key: spec.sort.field, dir: spec.sort.order ?? 'asc' }\r\n : null;\r\n}\r\n\r\nfunction sortRows(\r\n data: readonly Datum[],\r\n columns: readonly ViewColumn[],\r\n read: readonly ((row: Datum) => unknown)[],\r\n sortState: TableSortState | null,\r\n): Datum[] {\r\n if (!sortState) return [...data];\r\n const col = columns.findIndex((column) => column.key === sortState.key);\r\n if (col === -1) return [...data];\r\n const dir = sortState.dir === 'asc' ? 1 : -1;\r\n const column = columns[col];\r\n const get = read[col];\r\n return data\r\n .map((row, index) => ({ row, index }))\r\n .sort((left, right) => {\r\n const cmp = compareValues(get(left.row), get(right.row), column.type);\r\n return cmp === 0 ? left.index - right.index : cmp * dir;\r\n })\r\n .map((entry) => entry.row);\r\n}\r\n\r\nfunction sortStateForView(sortState: TableSortState | null, columns: readonly ViewColumn[]): { col: number; dir: 'asc' | 'desc' } | undefined {\r\n if (!sortState) return undefined;\r\n const col = columns.findIndex((column) => column.key === sortState.key);\r\n return col === -1 ? undefined : { col, dir: sortState.dir };\r\n}\r\n\r\nfunction sortSignature(spec: TableSpec): string {\r\n return spec.sort ? `${spec.sort.field}\\u001f${spec.sort.order ?? 'asc'}` : '';\r\n}\r\n\r\nfunction columnsSignature(columns: readonly ViewColumn[]): string {\r\n return columns.map((column) => column.key).join('\\u001f');\r\n}\r\n\r\nfunction compareValues(left: unknown, right: unknown, type?: FieldType): number {\r\n if (left == null && right == null) return 0;\r\n if (left == null) return 1;\r\n if (right == null) return -1;\r\n const ln = toNumber(left);\r\n const rn = toNumber(right);\r\n if (Number.isFinite(ln) && Number.isFinite(rn)) return ln === rn ? 0 : ln < rn ? -1 : 1;\r\n if (type === 'temporal' || left instanceof Date || right instanceof Date) {\r\n const lt = left instanceof Date ? left.getTime() : Date.parse(String(left));\r\n const rt = right instanceof Date ? right.getTime() : Date.parse(String(right));\r\n if (Number.isFinite(lt) && Number.isFinite(rt)) return lt === rt ? 0 : lt < rt ? -1 : 1;\r\n }\r\n return String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: 'base' });\r\n}\r\n\r\nfunction numericRaw(value: unknown): number | null {\r\n const n = toNumber(value);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nfunction conditionalRaw(value: unknown): number | string | null {\r\n const n = numericRaw(value);\r\n if (n != null) return n;\r\n if (value == null) return null;\r\n return String(value);\r\n}\r\n\r\nfunction densityRowHeight(density: TableSpec['density']): number {\r\n if (density === 'comfortable') return 36;\r\n if (density === 'compact') return 24;\r\n return ROW_HEIGHT;\r\n}\r\n\r\nfunction requestFrame(callback: () => void): number {\r\n return typeof requestAnimationFrame === 'function' ? requestAnimationFrame(callback) : window.setTimeout(callback, 16);\r\n}\r\n\r\n"],
5
- "mappings": "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",
6
- "names": ["column"]
4
+ "sourcesContent": ["import { drawTitleBlock } from './chrome';\nimport {\n buildColumnFormatter,\n mountTable,\n paintTableCanvas,\n resolveConditionalDomain,\n resolveTableStyle,\n sortRowIndices,\n type DomTableOptions,\n type HeaderCell,\n type TableViewInput,\n type ViewCell,\n type ViewColumn,\n type ViewSparkline,\n} from './tableView';\nimport type { RenderContext } from './index';\nimport { resolveSketch } from '../spec/sketch';\nimport type { Surface } from '../render/surface';\nimport type { ChartSpec, TableColumn, TableSpec } from '../spec/types';\nimport type { PointSelection } from '../spec/selection';\nimport type { ThemeTokens } from '../theme';\nimport type { Datum, FieldType, Rect, Size } from '../types';\nimport { accessor, inferType, toKey, toNumber } from '../util/data';\nimport { isNumberFormat } from '../format';\nimport { aggregateValues } from '../pivot';\nimport { applyPick } from '../interaction/select';\nimport { makeMatcher } from '../interaction/predicate';\n\ninterface TableDomState {\n sortState: TableSortState | null;\n specSortSignature: string;\n columnSignature: string;\n scrollTop: number;\n scrollLeft: number;\n}\n\ninterface TableSortState {\n /** Unique column id (duplicate fields stay distinguishable). */\n key: string;\n dir: 'asc' | 'desc';\n}\n\n/** Column metadata derived once per dataset + column config, reused across redraws. */\ninterface TablePrep {\n columns: ViewColumn[];\n read: Array<(row: Datum) => unknown>;\n domains: Array<[number, number] | null>;\n extremes: Array<[number, number] | null>;\n}\n\nconst tableStates = new WeakMap<Surface, TableDomState>();\nconst prepCache = new WeakMap<readonly Datum[], Map<string, TablePrep>>();\n\nexport function drawTable(surface: Surface, spec: ChartSpec, tokens: ThemeTokens, size: Size, context?: RenderContext): void {\n if (spec.type !== 'table') return;\n surface.evidence?.begin('rows');\n surface.evidence?.data(0);\n const rect = drawTitleBlock(surface, tokens, size, spec.title);\n if (surface.headless) drawTableCanvas(surface, spec, tokens, rect, context);\n else renderTable(surface, spec, tokens, size, rect, context);\n}\n\nfunction drawTableCanvas(surface: Surface, spec: TableSpec, tokens: ThemeTokens, rect: Rect, context?: RenderContext): void {\n const data = spec.data ?? [];\n const prep = prepareTable(data, spec);\n const sortState = initialSortState(spec, prep.columns);\n const order = sortOrder(data, prep, sortState);\n paintTableCanvas({\n ...viewInput(spec, tokens, rect, data, prep, order, sortState, context),\n ctx: surface.marks.ctx,\n evidence: surface.evidence,\n labels: surface.labels,\n });\n}\n\nfunction renderTable(surface: Surface, spec: TableSpec, tokens: ThemeTokens, size: Size, rect: Rect, context?: RenderContext): void {\n const data = spec.data ?? [];\n const prep = prepareTable(data, spec);\n const state = tableStateFor(surface, spec, prep.columns);\n let order = sortOrder(data, prep, state.sortState);\n const resetEvidence = () => {\n surface.evidence?.reset(size, data.length, spec.background ?? tokens.color.background);\n surface.evidence?.begin('rows');\n if (surface.labels) surface.labels.records.splice(0, surface.labels.records.length,\n ...surface.labels.records.filter((l) => l.role === 'title' || l.role === 'subtitle'));\n };\n const select = context?.store && context.param\n ? { store: context.store, param: context.param, def: context.def ?? { type: 'point' as const } }\n : null;\n const options = (): DomTableOptions => ({\n ...viewInput(spec, tokens, rect, data, prep, order, state.sortState, context),\n container: surface.overlay,\n evidence: surface.evidence,\n labels: surface.labels,\n stickyHeader: spec.stickyHeader !== false,\n scrollTop: state.scrollTop,\n scrollLeft: state.scrollLeft,\n onScroll(top, left) {\n state.scrollTop = top;\n state.scrollLeft = left;\n },\n onSort(colIndex) {\n const id = prep.columns[colIndex]?.id;\n if (!id) return;\n const previous = state.sortState;\n state.sortState = previous?.key === id ? { key: id, dir: previous.dir === 'asc' ? 'desc' : 'asc' } : { key: id, dir: 'asc' };\n order = sortOrder(data, prep, state.sortState);\n view.host.scrollTop = 0;\n state.scrollTop = 0;\n resetEvidence();\n view.update(options());\n },\n onRowClick: select ? (row) => {\n const datum = data[order[row]];\n if (!datum) return;\n const fields = select.def.fields?.length ? select.def.fields : identityFields(prep.columns);\n if (!fields.length) return;\n const pick: PointSelection = { kind: 'point', fields, tuples: [fields.map((field) => accessor(field)(datum))] };\n applyPick(select, pick);\n resetEvidence();\n view.update(options());\n } : undefined,\n });\n const view = mountTable(options());\n surface.collectEvidence = () => {\n resetEvidence();\n view.recordEvidence();\n };\n}\n\nfunction viewInput(\n spec: TableSpec,\n tokens: ThemeTokens,\n rect: Rect,\n data: readonly Datum[],\n prep: TablePrep,\n order: readonly number[],\n sortState: TableSortState | null,\n context?: RenderContext,\n): TableViewInput {\n const style = resolveTableStyle(tokens, spec.density, spec.gridlines);\n const emphasis = context?.emphasis ?? null;\n const own = context?.param ? context.store?.get(context.param) ?? null : null;\n const selected = own ? makeMatcher(own) : null;\n const sortCol = sortState ? prep.columns.findIndex((column) => column.id === sortState.key) : -1;\n return {\n tokens,\n rect,\n columns: prep.columns,\n rowCount: order.length,\n getCell(rowIndex, colIndex) {\n const value = prep.read[colIndex](data[order[rowIndex]]);\n return { value, raw: conditionalRaw(value) };\n },\n highlighted: emphasis || selected\n ? (row) => {\n const datum = data[order[row]];\n return Boolean(datum && ((selected?.(datum)) || emphasis?.match(datum)));\n }\n : undefined,\n frozenColumns: Math.max(0, Math.min(prep.columns.length, Math.floor(spec.frozenColumns ?? 0))),\n striped: spec.striped === true,\n formatters: prep.columns.map((column, i) =>\n buildColumnFormatter(column.conditionalFormat, prep.domains[i], tokens, style.color.background)),\n extremes: prep.extremes,\n headerRows: buildTableHeaderRows(prep.columns),\n footerRow: buildTotalsRow(data, order, prep, spec),\n density: spec.density,\n gridlines: spec.gridlines,\n sortState: sortCol >= 0 && sortState ? { col: sortCol, dir: sortState.dir } : undefined,\n sketch: resolveSketch(spec),\n dataRepresentation: 'rows',\n };\n}\n\nfunction prepareTable(data: readonly Datum[], spec: TableSpec): TablePrep {\n const signature = JSON.stringify(spec.columns ?? null);\n let byConfig = prepCache.get(data);\n const hit = byConfig?.get(signature);\n if (hit) return hit;\n const columns = resolveColumns(data, spec);\n const read = columns.map((column) => accessor(column.key));\n const domains: Array<[number, number] | null> = [];\n const extremes: Array<[number, number] | null> = [];\n columns.forEach((column, i) => {\n const numeric = column.isMeasure || column.conditionalFormat;\n if (!numeric || column.sparkline) {\n domains.push(null);\n extremes.push(null);\n return;\n }\n let min = Infinity;\n let max = -Infinity;\n for (const row of data) {\n const n = toNumber(read[i](row));\n if (!Number.isFinite(n)) continue;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n const extent: [number, number] | null = min === Infinity ? null : [min, max];\n domains.push(column.conditionalFormat ? resolveConditionalDomain(column.conditionalFormat, extent ? extent : []) : null);\n extremes.push(column.isMeasure ? extent : null);\n });\n const prep = { columns, read, domains, extremes };\n if (!byConfig) {\n byConfig = new Map();\n prepCache.set(data, byConfig);\n }\n if (byConfig.size > 8) byConfig.clear();\n byConfig.set(signature, prep);\n return prep;\n}\n\nfunction sortOrder(data: readonly Datum[], prep: TablePrep, sortState: TableSortState | null): number[] {\n const col = sortState ? prep.columns.findIndex((column) => column.id === sortState.key) : -1;\n if (!sortState || col < 0) return Array.from({ length: data.length }, (_, i) => i);\n const read = prep.read[col];\n return sortRowIndices(data.length, (i) => read(data[i]), sortState.dir, prep.columns[col].type);\n}\n\nfunction tableStateFor(surface: Surface, spec: TableSpec, columns: readonly ViewColumn[]): TableDomState {\n const specSortSignature = sortSignature(spec);\n const columnSignature = columns.map((column) => column.id).join('\\u001f');\n const state = tableStates.get(surface) ?? {\n sortState: initialSortState(spec, columns),\n specSortSignature,\n columnSignature,\n scrollTop: 0,\n scrollLeft: 0,\n };\n tableStates.set(surface, state);\n if (state.specSortSignature !== specSortSignature) {\n state.sortState = initialSortState(spec, columns);\n state.specSortSignature = specSortSignature;\n }\n if (state.columnSignature !== columnSignature) {\n state.columnSignature = columnSignature;\n state.scrollTop = 0;\n state.scrollLeft = 0;\n }\n const sortedKey = state.sortState?.key;\n if (sortedKey && !columns.some((column) => column.id === sortedKey)) {\n state.sortState = initialSortState(spec, columns);\n }\n return state;\n}\n\nfunction resolveColumns(data: readonly Datum[], spec: TableSpec): ViewColumn[] {\n const declared = spec.columns?.filter((column) => column.hidden !== true);\n const defs: TableColumn[] = declared ?? Object.keys(data[0] ?? {}).map((field) => ({ field }));\n const seen = new Map<string, number>();\n let previousGroup: string | undefined;\n return defs.map((def, index) => {\n const field = def.field;\n const occurrence = seen.get(field) ?? 0;\n seen.set(field, occurrence + 1);\n const sparkline = resolveSparkline(def, data);\n const type: FieldType = def.type ?? (sparkline ? 'nominal' : inferColumnType(data, field));\n const isMeasure = type === 'quantitative' && !sparkline;\n const align = def.align ?? (isMeasure ? 'right' : 'left');\n const group = def.group;\n const groupStart = index > 0 && (group ?? '') !== (previousGroup ?? '');\n previousGroup = group;\n return {\n key: field,\n id: occurrence === 0 ? field : `${field}~${occurrence}`,\n title: def.title ?? field,\n type,\n align,\n format: def.format,\n width: def.width,\n conditionalFormat: def.conditionalFormat,\n isMeasure,\n prefix: def.prefix,\n suffix: def.suffix,\n negativeStyle: def.negativeStyle,\n sortable: def.sortable,\n wrap: def.wrap,\n group,\n groupStart: groupStart && (declared ?? []).some((column) => column.group),\n sparkline,\n total: undefined,\n totalOp: def.total,\n } as ViewColumn & { totalOp?: TableColumn['total'] };\n });\n}\n\nfunction resolveSparkline(def: TableColumn, data: readonly Datum[]): ViewSparkline | undefined {\n const spark = def.sparkline;\n if (!spark) return undefined;\n const cfg = spark === true ? {} : spark;\n return { type: cfg.type ?? 'line', color: cfg.color, domain: cfg.domain === 'column' ? columnSparkDomain(def.field, data) : 'row' };\n}\n\n/** A shared sparkline scale spans every finite value in the column, so rows compare. */\nfunction columnSparkDomain(field: string, data: readonly Datum[]): [number, number] | 'row' {\n const read = accessor(field);\n let min = Infinity;\n let max = -Infinity;\n for (const row of data) {\n const values = read(row);\n if (!Array.isArray(values)) continue;\n for (const v of values) {\n const n = toNumber(v);\n if (!Number.isFinite(n)) continue;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n }\n return min === Infinity ? 'row' : [min, max];\n}\n\nfunction buildTableHeaderRows(columns: readonly ViewColumn[]): HeaderCell[][] | undefined {\n if (!columns.some((column) => column.group)) return undefined;\n const groups: HeaderCell[] = [];\n let index = 0;\n while (index < columns.length) {\n const group = columns[index].group ?? '';\n let span = 1;\n while (index + span < columns.length && (columns[index + span].group ?? '') === group) span += 1;\n groups.push({ title: group, colSpan: span, align: 'center' });\n index += span;\n }\n return [groups, columns.map((column, colIndex) => ({ title: column.title, align: column.align, colIndex }))];\n}\n\n/** Percent-formatted measures are ratios: summing them is meaningless, so they total only on request. */\nfunction isRatioColumn(column: ViewColumn): boolean {\n const format = column.format;\n return (typeof format === 'string' && format.includes('%') && isNumberFormat(format)) || column.suffix?.trim() === '%';\n}\n\nfunction buildTotalsRow(data: readonly Datum[], order: readonly number[], prep: TablePrep, spec: TableSpec) {\n if (!spec.totals) return undefined;\n const label = typeof spec.totals === 'object' ? spec.totals.label ?? 'Total' : 'Total';\n const columns = prep.columns as Array<ViewColumn & { totalOp?: TableColumn['total'] }>;\n const labelIndex = Math.max(0, columns.findIndex((column) => !column.isMeasure));\n return {\n kind: 'total' as const,\n cells: columns.map((column, colIndex): ViewCell => {\n if (colIndex === labelIndex) return { value: label, raw: null, label: true };\n const op = column.totalOp === false ? false : column.totalOp ?? (column.isMeasure && !isRatioColumn(column) ? 'sum' : false);\n if (!op) return { value: null, raw: null };\n const read = prep.read[colIndex];\n const value = aggregateValues(order.map((i) => read(data[i])), op);\n return { value, raw: value };\n }),\n };\n}\n\n/** Non-measure columns identify a row when a click publishes a selection. */\nfunction identityFields(columns: readonly ViewColumn[]): string[] {\n const out: string[] = [];\n for (const column of columns) if (!column.isMeasure && !column.sparkline && !out.includes(column.key)) out.push(column.key);\n return out;\n}\n\nfunction inferColumnType(data: readonly Datum[], field: string): FieldType {\n return data.length === 0 ? 'nominal' : inferType(data, field);\n}\n\nfunction initialSortState(spec: TableSpec, columns: readonly ViewColumn[]): TableSortState | null {\n if (!spec.sort) return null;\n const column = columns.find((c) => c.key === spec.sort?.field);\n return column?.id ? { key: column.id, dir: spec.sort.order ?? 'asc' } : null;\n}\n\nfunction sortSignature(spec: TableSpec): string {\n return spec.sort ? `${spec.sort.field}\\u001f${spec.sort.order ?? 'asc'}` : '';\n}\n\nfunction conditionalRaw(value: unknown): number | string | null {\n const n = toNumber(value);\n if (Number.isFinite(n)) return n;\n if (value == null) return null;\n return typeof value === 'object' ? toKey(value) : String(value);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
@@ -1,3 +1,18 @@
1
- import { CanvasTableOptions } from './types.js';
1
+ import { BAR_GAP } from './conditional.js';
2
+ import { type TableViewInput } from './types.js';
3
+ export type CanvasTableOptions = TableViewInput & {
4
+ ctx: CanvasRenderingContext2D;
5
+ /** Disclose rows/columns that a static export cannot show (default true). */
6
+ clippedCue?: boolean;
7
+ /** Rows the table measures for column widths (all hierarchy rows of a matrix). */
8
+ measure?: Pick<TableViewInput, 'rowCount' | 'getCell' | 'rowInfo'>;
9
+ };
10
+ /**
11
+ * Paint a table into a canvas — the static (headless/PNG) counterpart of the
12
+ * DOM table, sharing its layout, styling and conditional formatting. A static
13
+ * snapshot cannot scroll, so rows and columns that do not fit are counted,
14
+ * disclosed in a continuation row, and recorded as suppressed labels.
15
+ */
2
16
  export declare function paintTableCanvas(opts: CanvasTableOptions): void;
17
+ export { BAR_GAP };
3
18
  //# sourceMappingURL=canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/charts/tableView/canvas.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAA6I,MAAM,SAAS,CAAC;AAExL,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CA6E/D"}
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/charts/tableView/canvas.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,OAAO,EASR,MAAM,eAAe,CAAC;AAIvB,OAAO,EAOL,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG;IAChD,GAAG,EAAE,wBAAwB,CAAC;IAC9B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kFAAkF;IAClF,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;CACpE,CAAC;AAgBF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAkE/D;AAyVD,OAAO,EAAE,OAAO,EAAE,CAAC"}