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.
- package/dist/animation/animate.d.ts +6 -1
- package/dist/animation/animate.d.ts.map +1 -1
- package/dist/animation/animate.js +2 -2
- package/dist/animation/animate.js.map +2 -2
- package/dist/animation/env.d.ts +5 -0
- package/dist/animation/env.d.ts.map +1 -1
- package/dist/animation/env.js +4 -0
- package/dist/animation/env.js.map +2 -2
- package/dist/animation/index.d.ts +1 -0
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/animation/index.js +1 -0
- package/dist/animation/index.js.map +2 -2
- package/dist/animation/stagger.d.ts +13 -0
- package/dist/animation/stagger.d.ts.map +1 -0
- package/dist/animation/stagger.js +13 -0
- package/dist/animation/stagger.js.map +7 -0
- package/dist/axes/draw.d.ts +5 -1
- package/dist/axes/draw.d.ts.map +1 -1
- package/dist/axes/draw.js +13 -1
- package/dist/axes/draw.js.map +2 -2
- package/dist/axes/morph.d.ts +111 -0
- package/dist/axes/morph.d.ts.map +1 -0
- package/dist/axes/morph.js +207 -0
- package/dist/axes/morph.js.map +7 -0
- package/dist/axes/overlay.d.ts.map +1 -1
- package/dist/axes/overlay.js +88 -25
- package/dist/axes/overlay.js.map +2 -2
- package/dist/axes/text.d.ts +2 -0
- package/dist/axes/text.d.ts.map +1 -1
- package/dist/axes/text.js +1 -0
- package/dist/axes/text.js.map +2 -2
- package/dist/axes/tickLabels.d.ts +2 -0
- package/dist/axes/tickLabels.d.ts.map +1 -1
- package/dist/axes/tickLabels.js +2 -2
- package/dist/axes/tickLabels.js.map +2 -2
- package/dist/charts/annotations.d.ts +9 -3
- package/dist/charts/annotations.d.ts.map +1 -1
- package/dist/charts/annotations.js +82 -27
- package/dist/charts/annotations.js.map +2 -2
- package/dist/charts/area.d.ts +37 -1
- package/dist/charts/area.d.ts.map +1 -1
- package/dist/charts/area.js +35 -17
- package/dist/charts/area.js.map +2 -2
- package/dist/charts/bar.d.ts +53 -0
- package/dist/charts/bar.d.ts.map +1 -1
- package/dist/charts/bar.js +117 -83
- package/dist/charts/bar.js.map +2 -2
- package/dist/charts/box.d.ts +31 -0
- package/dist/charts/box.d.ts.map +1 -1
- package/dist/charts/box.js +93 -70
- package/dist/charts/box.js.map +2 -2
- package/dist/charts/bubbleMap.d.ts +20 -0
- package/dist/charts/bubbleMap.d.ts.map +1 -0
- package/dist/charts/bubbleMap.js +951 -0
- package/dist/charts/bubbleMap.js.map +7 -0
- package/dist/charts/bullet.d.ts.map +1 -1
- package/dist/charts/bullet.js +69 -51
- package/dist/charts/bullet.js.map +2 -2
- package/dist/charts/calendarHeatmap.d.ts.map +1 -1
- package/dist/charts/calendarHeatmap.js +56 -19
- package/dist/charts/calendarHeatmap.js.map +2 -2
- package/dist/charts/candlestick.d.ts +40 -0
- package/dist/charts/candlestick.d.ts.map +1 -0
- package/dist/charts/candlestick.js +325 -0
- package/dist/charts/candlestick.js.map +7 -0
- package/dist/charts/choropleth.d.ts.map +1 -1
- package/dist/charts/choropleth.js +46 -67
- package/dist/charts/choropleth.js.map +2 -2
- package/dist/charts/combo.d.ts.map +1 -1
- package/dist/charts/combo.js +127 -27
- package/dist/charts/combo.js.map +3 -3
- package/dist/charts/dumbbell.d.ts.map +1 -1
- package/dist/charts/dumbbell.js +100 -31
- package/dist/charts/dumbbell.js.map +2 -2
- package/dist/charts/funnel.d.ts.map +1 -1
- package/dist/charts/funnel.js +93 -28
- package/dist/charts/funnel.js.map +3 -3
- package/dist/charts/gantt.d.ts +22 -0
- package/dist/charts/gantt.d.ts.map +1 -0
- package/dist/charts/gantt.js +564 -0
- package/dist/charts/gantt.js.map +7 -0
- package/dist/charts/gauge.d.ts.map +1 -1
- package/dist/charts/gauge.js +30 -4
- package/dist/charts/gauge.js.map +2 -2
- package/dist/charts/geo.d.ts +87 -0
- package/dist/charts/geo.d.ts.map +1 -0
- package/dist/charts/geo.js +140 -0
- package/dist/charts/geo.js.map +7 -0
- package/dist/charts/geometry.d.ts +20 -0
- package/dist/charts/geometry.d.ts.map +1 -0
- package/dist/charts/geometry.js +25 -0
- package/dist/charts/geometry.js.map +7 -0
- package/dist/charts/heatmap.d.ts.map +1 -1
- package/dist/charts/heatmap.js +58 -49
- package/dist/charts/heatmap.js.map +2 -2
- package/dist/charts/histogram.d.ts +1 -1
- package/dist/charts/histogram.d.ts.map +1 -1
- package/dist/charts/histogram.js +49 -31
- package/dist/charts/histogram.js.map +2 -2
- package/dist/charts/index.d.ts +35 -1
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +12 -0
- package/dist/charts/index.js.map +2 -2
- package/dist/charts/legibility.d.ts +38 -0
- package/dist/charts/legibility.d.ts.map +1 -0
- package/dist/charts/legibility.js +72 -0
- package/dist/charts/legibility.js.map +7 -0
- package/dist/charts/line.d.ts +39 -1
- package/dist/charts/line.d.ts.map +1 -1
- package/dist/charts/line.js +48 -16
- package/dist/charts/line.js.map +2 -2
- package/dist/charts/matrix.d.ts +2 -1
- package/dist/charts/matrix.d.ts.map +1 -1
- package/dist/charts/matrix.js +481 -319
- package/dist/charts/matrix.js.map +3 -3
- package/dist/charts/morphFrame.d.ts +83 -0
- package/dist/charts/morphFrame.d.ts.map +1 -0
- package/dist/charts/morphFrame.js +128 -0
- package/dist/charts/morphFrame.js.map +7 -0
- package/dist/charts/pie.d.ts.map +1 -1
- package/dist/charts/pie.js +89 -26
- package/dist/charts/pie.js.map +2 -2
- package/dist/charts/pieState.d.ts +27 -0
- package/dist/charts/pieState.d.ts.map +1 -0
- package/dist/charts/pieState.js +55 -0
- package/dist/charts/pieState.js.map +7 -0
- package/dist/charts/radar.d.ts +62 -0
- package/dist/charts/radar.d.ts.map +1 -0
- package/dist/charts/radar.js +912 -0
- package/dist/charts/radar.js.map +7 -0
- package/dist/charts/radialBar.d.ts +60 -0
- package/dist/charts/radialBar.d.ts.map +1 -0
- package/dist/charts/radialBar.js +708 -0
- package/dist/charts/radialBar.js.map +7 -0
- package/dist/charts/sankey.d.ts.map +1 -1
- package/dist/charts/sankey.js +223 -57
- package/dist/charts/sankey.js.map +3 -3
- package/dist/charts/scatter.d.ts +31 -0
- package/dist/charts/scatter.d.ts.map +1 -1
- package/dist/charts/scatter.js +48 -12
- package/dist/charts/scatter.js.map +2 -2
- package/dist/charts/slope.d.ts.map +1 -1
- package/dist/charts/slope.js +55 -3
- package/dist/charts/slope.js.map +2 -2
- package/dist/charts/sunburst.d.ts +14 -0
- package/dist/charts/sunburst.d.ts.map +1 -0
- package/dist/charts/sunburst.js +885 -0
- package/dist/charts/sunburst.js.map +7 -0
- package/dist/charts/table.d.ts +2 -1
- package/dist/charts/table.d.ts.map +1 -1
- package/dist/charts/table.js +214 -224
- package/dist/charts/table.js.map +3 -3
- package/dist/charts/tableView/canvas.d.ts +16 -1
- package/dist/charts/tableView/canvas.d.ts.map +1 -1
- package/dist/charts/tableView/canvas.js +361 -252
- package/dist/charts/tableView/canvas.js.map +3 -3
- package/dist/charts/tableView/conditional.d.ts +66 -40
- package/dist/charts/tableView/conditional.d.ts.map +1 -1
- package/dist/charts/tableView/conditional.js +163 -256
- package/dist/charts/tableView/conditional.js.map +3 -3
- package/dist/charts/tableView/dom.d.ts +26 -2
- package/dist/charts/tableView/dom.d.ts.map +1 -1
- package/dist/charts/tableView/dom.js +609 -269
- package/dist/charts/tableView/dom.js.map +3 -3
- package/dist/charts/tableView/layout.d.ts +22 -0
- package/dist/charts/tableView/layout.d.ts.map +1 -0
- package/dist/charts/tableView/layout.js +246 -0
- package/dist/charts/tableView/layout.js.map +7 -0
- package/dist/charts/tableView/sketch.d.ts +3 -2
- package/dist/charts/tableView/sketch.d.ts.map +1 -1
- package/dist/charts/tableView/sketch.js +2 -2
- package/dist/charts/tableView/sketch.js.map +2 -2
- package/dist/charts/tableView/sketchBar.d.ts +7 -0
- package/dist/charts/tableView/sketchBar.d.ts.map +1 -0
- package/dist/charts/tableView/sketchBar.js +32 -0
- package/dist/charts/tableView/sketchBar.js.map +7 -0
- package/dist/charts/tableView/sort.d.ts +9 -0
- package/dist/charts/tableView/sort.d.ts.map +1 -0
- package/dist/charts/tableView/sort.js +70 -0
- package/dist/charts/tableView/sort.js.map +7 -0
- package/dist/charts/tableView/sparkline.d.ts +30 -0
- package/dist/charts/tableView/sparkline.d.ts.map +1 -0
- package/dist/charts/tableView/sparkline.js +63 -0
- package/dist/charts/tableView/sparkline.js.map +7 -0
- package/dist/charts/tableView/style.d.ts +67 -0
- package/dist/charts/tableView/style.d.ts.map +1 -0
- package/dist/charts/tableView/style.js +131 -0
- package/dist/charts/tableView/style.js.map +7 -0
- package/dist/charts/tableView/types.d.ts +69 -46
- package/dist/charts/tableView/types.d.ts.map +1 -1
- package/dist/charts/tableView/types.js +22 -87
- package/dist/charts/tableView/types.js.map +2 -2
- package/dist/charts/tableView.d.ts +10 -5
- package/dist/charts/tableView.d.ts.map +1 -1
- package/dist/charts/tableView.js +12 -8
- package/dist/charts/tableView.js.map +2 -2
- package/dist/charts/treemap.d.ts.map +1 -1
- package/dist/charts/treemap.js +177 -68
- package/dist/charts/treemap.js.map +3 -3
- package/dist/charts/trendline.d.ts +13 -5
- package/dist/charts/trendline.d.ts.map +1 -1
- package/dist/charts/trendline.js +205 -56
- package/dist/charts/trendline.js.map +2 -2
- package/dist/charts/waterfall.d.ts.map +1 -1
- package/dist/charts/waterfall.js +76 -5
- package/dist/charts/waterfall.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interaction/cartesian.d.ts +4 -1
- package/dist/interaction/cartesian.d.ts.map +1 -1
- package/dist/interaction/cartesian.js +104 -34
- package/dist/interaction/cartesian.js.map +2 -2
- package/dist/interaction/controller.d.ts +29 -1
- package/dist/interaction/controller.d.ts.map +1 -1
- package/dist/interaction/controller.js +131 -8
- package/dist/interaction/controller.js.map +2 -2
- package/dist/interaction/focus.d.ts +23 -0
- package/dist/interaction/focus.d.ts.map +1 -0
- package/dist/interaction/focus.js +65 -0
- package/dist/interaction/focus.js.map +7 -0
- package/dist/interaction/tooltip.d.ts +6 -0
- package/dist/interaction/tooltip.d.ts.map +1 -1
- package/dist/interaction/tooltip.js +41 -16
- package/dist/interaction/tooltip.js.map +2 -2
- package/dist/interaction/types.d.ts +19 -0
- package/dist/interaction/types.d.ts.map +1 -1
- package/dist/interaction/veil.d.ts +25 -0
- package/dist/interaction/veil.d.ts.map +1 -0
- package/dist/interaction/veil.js +35 -0
- package/dist/interaction/veil.js.map +7 -0
- package/dist/pivot/pivot.d.ts +18 -0
- package/dist/pivot/pivot.d.ts.map +1 -1
- package/dist/pivot/pivot.js +46 -34
- package/dist/pivot/pivot.js.map +2 -2
- package/dist/render/chromeMotion.d.ts +65 -0
- package/dist/render/chromeMotion.d.ts.map +1 -0
- package/dist/render/chromeMotion.js +79 -0
- package/dist/render/chromeMotion.js.map +7 -0
- package/dist/render/pathSample.d.ts +24 -0
- package/dist/render/pathSample.d.ts.map +1 -0
- package/dist/render/pathSample.js +76 -0
- package/dist/render/pathSample.js.map +7 -0
- package/dist/render/transient.d.ts +18 -0
- package/dist/render/transient.d.ts.map +1 -0
- package/dist/render/transient.js +19 -0
- package/dist/render/transient.js.map +7 -0
- package/dist/runtime/candlestick.d.ts +112 -0
- package/dist/runtime/candlestick.d.ts.map +1 -0
- package/dist/runtime/candlestick.js +531 -0
- package/dist/runtime/candlestick.js.map +7 -0
- package/dist/runtime/cartesian.d.ts +14 -3
- package/dist/runtime/cartesian.d.ts.map +1 -1
- package/dist/runtime/cartesian.js.map +2 -2
- package/dist/runtime/chartAnimation.d.ts +54 -7
- package/dist/runtime/chartAnimation.d.ts.map +1 -1
- package/dist/runtime/chartAnimation.js +146 -28
- package/dist/runtime/chartAnimation.js.map +2 -2
- package/dist/runtime/chartRuntime.d.ts +42 -0
- package/dist/runtime/chartRuntime.d.ts.map +1 -1
- package/dist/runtime/chartRuntime.js +196 -30
- package/dist/runtime/chartRuntime.js.map +2 -2
- package/dist/runtime/dashboardDom.d.ts.map +1 -1
- package/dist/runtime/dashboardDom.js +45 -0
- package/dist/runtime/dashboardDom.js.map +2 -2
- package/dist/runtime/facet.d.ts +1 -1
- package/dist/runtime/facet.d.ts.map +1 -1
- package/dist/runtime/gantt.d.ts +137 -0
- package/dist/runtime/gantt.d.ts.map +1 -0
- package/dist/runtime/gantt.js +647 -0
- package/dist/runtime/gantt.js.map +7 -0
- package/dist/runtime/morph.d.ts +33 -0
- package/dist/runtime/morph.d.ts.map +1 -0
- package/dist/runtime/morph.js +332 -0
- package/dist/runtime/morph.js.map +7 -0
- package/dist/runtime/radar.d.ts +75 -0
- package/dist/runtime/radar.d.ts.map +1 -0
- package/dist/runtime/radar.js +201 -0
- package/dist/runtime/radar.js.map +7 -0
- package/dist/runtime/radialBar.d.ts +81 -0
- package/dist/runtime/radialBar.d.ts.map +1 -0
- package/dist/runtime/radialBar.js +125 -0
- package/dist/runtime/radialBar.js.map +7 -0
- package/dist/runtime/report/constants.d.ts +2 -2
- package/dist/runtime/report/constants.d.ts.map +1 -1
- package/dist/runtime/runtimeShared.d.ts +3 -3
- package/dist/runtime/runtimeShared.d.ts.map +1 -1
- package/dist/runtime/sunburst.d.ts +74 -0
- package/dist/runtime/sunburst.d.ts.map +1 -0
- package/dist/runtime/sunburst.js +150 -0
- package/dist/runtime/sunburst.js.map +7 -0
- package/dist/runtime/wire.d.ts.map +1 -1
- package/dist/runtime/wire.js +3 -1
- package/dist/runtime/wire.js.map +2 -2
- package/dist/shape/arc.d.ts +15 -2
- package/dist/shape/arc.d.ts.map +1 -1
- package/dist/shape/arc.js +204 -32
- package/dist/shape/arc.js.map +2 -2
- package/dist/spec/chartDefinitions.d.ts +6 -0
- package/dist/spec/chartDefinitions.d.ts.map +1 -1
- package/dist/spec/chartDefinitions.js +7 -1
- package/dist/spec/chartDefinitions.js.map +2 -2
- package/dist/spec/templates.d.ts.map +1 -1
- package/dist/spec/templates.js +177 -2
- package/dist/spec/templates.js.map +2 -2
- package/dist/spec/types.d.ts +258 -6
- package/dist/spec/types.d.ts.map +1 -1
- package/dist/spec/types.js +6 -0
- package/dist/spec/types.js.map +2 -2
- package/dist/spec/validate/charts.js +147 -15
- package/dist/spec/validate/charts.js.map +2 -2
- package/dist/spec/validate/common.d.ts +6 -0
- package/dist/spec/validate/common.d.ts.map +1 -1
- package/dist/spec/validate/overlays.js +2 -2
- package/dist/spec/validate/overlays.js.map +2 -2
- package/dist/spec/validate.data.d.ts.map +1 -1
- package/dist/spec/validate.data.js +8 -3
- package/dist/spec/validate.data.js.map +2 -2
- package/package.json +1 -1
package/dist/charts/table.js.map
CHANGED
|
@@ -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": "AAAA,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
6
|
-
"names": [
|
|
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 {
|
|
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,
|
|
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"}
|