@rokkit/chart 1.3.7 → 1.3.9

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 (162) hide show
  1. package/dist/AnimatedPlot.svelte +26 -8
  2. package/dist/AnimatedPlot.svelte.d.ts +5 -0
  3. package/dist/Chart.svelte +51 -65
  4. package/dist/FacetPlot.svelte +1 -1
  5. package/dist/Plot/Axis.svelte +19 -10
  6. package/dist/Plot/Root.svelte +67 -46
  7. package/dist/Plot/Root.svelte.d.ts +29 -2
  8. package/dist/Plot/Timeline.svelte +39 -13
  9. package/dist/Plot/index.d.ts +5 -5
  10. package/dist/Plot/index.js +5 -5
  11. package/dist/Plot.svelte +95 -178
  12. package/dist/Plot.svelte.d.ts +4 -0
  13. package/dist/PlotState.svelte.d.ts +29 -1
  14. package/dist/PlotState.svelte.js +163 -19
  15. package/dist/PlotSurface.svelte +162 -0
  16. package/dist/PlotSurface.svelte.d.ts +25 -0
  17. package/dist/charts/AreaChart.svelte +12 -2
  18. package/dist/charts/AreaChart.svelte.d.ts +6 -0
  19. package/dist/charts/BarChart.svelte +40 -4
  20. package/dist/charts/BarChart.svelte.d.ts +15 -1
  21. package/dist/charts/BoxPlot.svelte +7 -3
  22. package/dist/charts/BoxPlot.svelte.d.ts +2 -0
  23. package/dist/charts/BubbleChart.svelte +37 -4
  24. package/dist/charts/BubbleChart.svelte.d.ts +12 -1
  25. package/dist/charts/LineChart.svelte +4 -2
  26. package/dist/charts/LineChart.svelte.d.ts +1 -0
  27. package/dist/charts/PieChart.svelte +5 -3
  28. package/dist/charts/PieChart.svelte.d.ts +1 -0
  29. package/dist/charts/ScatterPlot.svelte +35 -4
  30. package/dist/charts/ScatterPlot.svelte.d.ts +11 -1
  31. package/dist/charts/ViolinPlot.svelte +7 -3
  32. package/dist/charts/ViolinPlot.svelte.d.ts +2 -0
  33. package/dist/examples/BarChartExample.svelte +1 -1
  34. package/dist/geoms/Arc.svelte +21 -54
  35. package/dist/geoms/Arc.svelte.d.ts +4 -4
  36. package/dist/geoms/Area.svelte +45 -44
  37. package/dist/geoms/Area.svelte.d.ts +8 -1
  38. package/dist/geoms/Bar.svelte +33 -45
  39. package/dist/geoms/Bar.svelte.d.ts +9 -0
  40. package/dist/geoms/Box.svelte +103 -61
  41. package/dist/geoms/Box.svelte.d.ts +12 -3
  42. package/dist/geoms/Candlestick.svelte +26 -75
  43. package/dist/geoms/Candlestick.svelte.d.ts +2 -0
  44. package/dist/geoms/Heatmap.svelte +21 -66
  45. package/dist/geoms/Heatmap.svelte.d.ts +2 -0
  46. package/dist/geoms/Hexbin.svelte +20 -100
  47. package/dist/geoms/Hexbin.svelte.d.ts +2 -0
  48. package/dist/geoms/Jitter.svelte +67 -0
  49. package/dist/geoms/Jitter.svelte.d.ts +17 -0
  50. package/dist/geoms/Line.svelte +27 -31
  51. package/dist/geoms/Line.svelte.d.ts +5 -0
  52. package/dist/geoms/Point.svelte +31 -60
  53. package/dist/geoms/Point.svelte.d.ts +5 -1
  54. package/dist/geoms/Ribbon.svelte +30 -124
  55. package/dist/geoms/Ribbon.svelte.d.ts +2 -0
  56. package/dist/geoms/Rule.svelte +117 -0
  57. package/dist/geoms/Rule.svelte.d.ts +19 -0
  58. package/dist/geoms/Violin.svelte +36 -31
  59. package/dist/geoms/Violin.svelte.d.ts +10 -3
  60. package/dist/geoms/Waterfall.svelte +25 -79
  61. package/dist/geoms/Waterfall.svelte.d.ts +2 -0
  62. package/dist/geoms/lib/GeomState.svelte.d.ts +51 -0
  63. package/dist/geoms/lib/GeomState.svelte.js +79 -0
  64. package/dist/geoms/lib/aesthetics.d.ts +36 -0
  65. package/dist/geoms/lib/aesthetics.js +45 -0
  66. package/dist/geoms/lib/areas.d.ts +6 -2
  67. package/dist/geoms/lib/areas.js +20 -12
  68. package/dist/geoms/lib/bars.d.ts +18 -3
  69. package/dist/geoms/lib/bars.js +80 -101
  70. package/dist/geoms/lib/marks/arc.d.ts +24 -0
  71. package/dist/geoms/lib/marks/arc.js +28 -0
  72. package/dist/geoms/lib/marks/area.d.ts +23 -0
  73. package/dist/geoms/lib/marks/area.js +38 -0
  74. package/dist/geoms/lib/marks/bar.d.ts +16 -0
  75. package/dist/geoms/lib/marks/bar.js +43 -0
  76. package/dist/geoms/lib/marks/box.d.ts +14 -0
  77. package/dist/geoms/lib/marks/box.js +30 -0
  78. package/dist/geoms/lib/marks/candlestick.d.ts +27 -0
  79. package/dist/geoms/lib/marks/candlestick.js +52 -0
  80. package/dist/geoms/lib/marks/heatmap.d.ts +24 -0
  81. package/dist/geoms/lib/marks/heatmap.js +41 -0
  82. package/dist/geoms/lib/marks/hexbin.d.ts +29 -0
  83. package/dist/geoms/lib/marks/hexbin.js +62 -0
  84. package/dist/geoms/lib/marks/jitter.d.ts +21 -0
  85. package/dist/geoms/lib/marks/jitter.js +36 -0
  86. package/dist/geoms/lib/marks/line.d.ts +26 -0
  87. package/dist/geoms/lib/marks/line.js +25 -0
  88. package/dist/geoms/lib/marks/point.d.ts +25 -0
  89. package/dist/geoms/lib/marks/point.js +58 -0
  90. package/dist/geoms/lib/marks/ribbon.d.ts +31 -0
  91. package/dist/geoms/lib/marks/ribbon.js +77 -0
  92. package/dist/geoms/lib/marks/violin.d.ts +13 -0
  93. package/dist/geoms/lib/marks/violin.js +31 -0
  94. package/dist/geoms/lib/marks/waterfall.d.ts +25 -0
  95. package/dist/geoms/lib/marks/waterfall.js +58 -0
  96. package/dist/index.d.ts +25 -12
  97. package/dist/index.js +26 -13
  98. package/dist/lib/brewing/marks/arcs.js +7 -1
  99. package/dist/lib/brewing/marks/boxes.d.ts +11 -2
  100. package/dist/lib/brewing/marks/boxes.js +32 -11
  101. package/dist/lib/brewing/marks/lines.d.ts +4 -1
  102. package/dist/lib/brewing/marks/lines.js +18 -15
  103. package/dist/lib/brewing/marks/swarm.d.ts +32 -0
  104. package/dist/lib/brewing/marks/swarm.js +125 -0
  105. package/dist/lib/brewing/marks/violins.d.ts +4 -20
  106. package/dist/lib/brewing/marks/violins.js +41 -25
  107. package/dist/lib/brewing/stats.d.ts +3 -1
  108. package/dist/lib/brewing/stats.js +28 -11
  109. package/dist/lib/plot/scales.js +12 -7
  110. package/dist/lib/plot/types.d.ts +9 -1
  111. package/dist/lib/plot/types.js +3 -1
  112. package/dist/lib/preset.d.ts +11 -1
  113. package/dist/lib/preset.js +16 -4
  114. package/package.json +1 -1
  115. package/dist/Plot/Arc.svelte +0 -30
  116. package/dist/Plot/Arc.svelte.d.ts +0 -18
  117. package/dist/Plot/Area.svelte +0 -54
  118. package/dist/Plot/Area.svelte.d.ts +0 -14
  119. package/dist/Plot/Bar.svelte +0 -69
  120. package/dist/Plot/Bar.svelte.d.ts +0 -11
  121. package/dist/Plot/Line.svelte +0 -54
  122. package/dist/Plot/Line.svelte.d.ts +0 -13
  123. package/dist/Plot/Point.svelte +0 -58
  124. package/dist/Plot/Point.svelte.d.ts +0 -13
  125. package/dist/lib/brewer.d.ts +0 -9
  126. package/dist/lib/brewer.js +0 -25
  127. package/dist/lib/brewing/BoxBrewer.svelte.d.ts +0 -8
  128. package/dist/lib/brewing/BoxBrewer.svelte.js +0 -14
  129. package/dist/lib/brewing/CartesianBrewer.svelte.d.ts +0 -8
  130. package/dist/lib/brewing/CartesianBrewer.svelte.js +0 -21
  131. package/dist/lib/brewing/PieBrewer.svelte.d.ts +0 -8
  132. package/dist/lib/brewing/PieBrewer.svelte.js +0 -14
  133. package/dist/lib/brewing/QuartileBrewer.svelte.d.ts +0 -9
  134. package/dist/lib/brewing/QuartileBrewer.svelte.js +0 -51
  135. package/dist/lib/brewing/ViolinBrewer.svelte.d.ts +0 -8
  136. package/dist/lib/brewing/ViolinBrewer.svelte.js +0 -14
  137. package/dist/lib/brewing/axes.svelte.d.ts +0 -66
  138. package/dist/lib/brewing/axes.svelte.js +0 -270
  139. package/dist/lib/brewing/bars.svelte.d.ts +0 -56
  140. package/dist/lib/brewing/bars.svelte.js +0 -201
  141. package/dist/lib/brewing/brewer.svelte.d.ts +0 -124
  142. package/dist/lib/brewing/brewer.svelte.js +0 -277
  143. package/dist/lib/brewing/dimensions.svelte.d.ts +0 -35
  144. package/dist/lib/brewing/dimensions.svelte.js +0 -56
  145. package/dist/lib/brewing/index.svelte.d.ts +0 -118
  146. package/dist/lib/brewing/index.svelte.js +0 -205
  147. package/dist/lib/brewing/legends.svelte.d.ts +0 -48
  148. package/dist/lib/brewing/legends.svelte.js +0 -137
  149. package/dist/lib/brewing/marks/areas.d.ts +0 -31
  150. package/dist/lib/brewing/marks/areas.js +0 -72
  151. package/dist/lib/brewing/marks/bars.d.ts +0 -1
  152. package/dist/lib/brewing/marks/bars.js +0 -49
  153. package/dist/lib/brewing/scales.svelte.d.ts +0 -24
  154. package/dist/lib/brewing/scales.svelte.js +0 -82
  155. package/dist/lib/context.d.ts +0 -13
  156. package/dist/lib/context.js +0 -131
  157. package/dist/lib/plot/chartProps.d.ts +0 -177
  158. package/dist/lib/plot/chartProps.js +0 -76
  159. package/dist/lib/scales.svelte.d.ts +0 -35
  160. package/dist/lib/scales.svelte.js +0 -151
  161. package/dist/lib/ticks.d.ts +0 -36
  162. package/dist/lib/ticks.js +0 -46
package/dist/Plot.svelte CHANGED
@@ -1,14 +1,13 @@
1
1
  <script lang="ts">
2
- import { setContext, getContext, untrack } from 'svelte'
2
+ import { getContext } from 'svelte'
3
3
  import type { Snippet } from 'svelte'
4
- import { PlotState } from './PlotState.svelte.js'
5
4
  import { defaultPreset } from './lib/preset.js'
6
5
  import type { PlotSpec, PlotHelpers } from './lib/plot/types.js'
6
+ import PlotSurface from './PlotSurface.svelte'
7
7
  import Axis from './Plot/Axis.svelte'
8
8
  import Grid from './Plot/Grid.svelte'
9
9
  import Legend from './Plot/Legend.svelte'
10
10
  import Tooltip from './Plot/Tooltip.svelte'
11
- import DefinePatterns from './patterns/DefinePatterns.svelte'
12
11
  import Bar from './geoms/Bar.svelte'
13
12
  import Line from './geoms/Line.svelte'
14
13
  import Area from './geoms/Area.svelte'
@@ -57,6 +56,10 @@
57
56
  onselect?: (detail: unknown) => void
58
57
  selectable?: boolean
59
58
  selected?: Row[]
59
+ /** Animate marks on data/flip changes (opt-out for e.g. AnimatedPlot, which
60
+ * tweens its own frames). Enabled one frame after the width settles so the
61
+ * initial layout paints un-animated. Default `true`. */
62
+ animate?: boolean
60
63
  children?: Snippet
61
64
  }
62
65
 
@@ -66,7 +69,7 @@
66
69
  helpers = {},
67
70
  width = 600,
68
71
  height = 400,
69
- mode = 'light',
72
+ mode = undefined,
70
73
  grid = true,
71
74
  axes = true,
72
75
  margin = undefined,
@@ -88,29 +91,13 @@
88
91
  onselect = undefined,
89
92
  selectable = false,
90
93
  selected = $bindable([]),
94
+ animate = true,
91
95
  children
92
96
  }: Props = $props()
93
97
 
94
98
  const chartPresetCtx = getContext<ChartPresetCtx | undefined>('chart-preset')
95
99
  const chartPreset = $derived(chartPresetCtx?.current ?? defaultPreset)
96
100
 
97
- // Responsive width: observe container and use actual pixel width for scale calculations
98
- let svgEl = $state<SVGSVGElement | null>(null)
99
- let containerEl = $state<HTMLDivElement | null>(null)
100
- let observedWidth = $state(0)
101
-
102
- $effect(() => {
103
- if (!containerEl) return
104
- const ro = new ResizeObserver((entries) => {
105
- const w = Math.floor(entries[0].contentRect.width)
106
- if (w > 0) observedWidth = w
107
- })
108
- ro.observe(containerEl)
109
- return () => ro.disconnect()
110
- })
111
-
112
- const effectiveWidth = $derived(observedWidth > 0 ? observedWidth : (spec?.width ?? width))
113
- const svgHeight = $derived(spec?.height ?? height)
114
101
  const gridValue = $derived(spec?.grid ?? grid)
115
102
  const showGrid = $derived(gridValue !== false)
116
103
  const gridLines = $derived(
@@ -123,18 +110,22 @@
123
110
  // Accessible data table — screen reader fallback
124
111
  const tableData = $derived(spec?.data ?? data)
125
112
  const tableColumns = $derived.by(() => {
126
- const cols = [spec?.x, spec?.y, spec?.color ?? spec?.fill].filter(
127
- (c): c is string => Boolean(c)
128
- )
113
+ // Dedupe: a channel may repeat (e.g. x === color), and the table's keyed each
114
+ // requires unique column names.
115
+ const cols = [...new Set(
116
+ [spec?.x, spec?.y, spec?.color ?? spec?.fill].filter((c): c is string => Boolean(c))
117
+ )]
129
118
  if (cols.length > 0) return cols
130
119
  const first = tableData[0]
131
120
  return first ? Object.keys(first) : []
132
121
  })
133
122
 
123
+ // Config for the shared PlotSurface (which owns PlotState, the responsive width, context,
124
+ // animation, patterns, and zoom). `width` is the fallback — PlotSurface observes the container.
134
125
  function buildPlotConfig() {
135
126
  return {
136
127
  data: spec?.data ?? data,
137
- width: effectiveWidth,
128
+ width: spec?.width ?? width,
138
129
  height: spec?.height ?? height,
139
130
  mode,
140
131
  margin,
@@ -148,60 +139,14 @@
148
139
  colorScheme: spec?.colorScheme,
149
140
  colorMidpoint: spec?.colorMidpoint,
150
141
  orientation: spec?.orientation,
142
+ sort: spec?.sort,
143
+ continuousCategory: spec?.continuousCategory,
151
144
  chartPreset,
152
145
  onselect,
153
146
  selectable
154
147
  }
155
148
  }
156
149
 
157
- // Create PlotState with initial values and provide as context.
158
- // untrack() suppresses "captures initial value" warnings — intentional:
159
- // the $effect below handles all subsequent reactive updates.
160
- const plotState = untrack(() => new PlotState(buildPlotConfig()))
161
- setContext('plot-state', plotState)
162
-
163
- // Keep state in sync when reactive config changes
164
- $effect(() => {
165
- plotState.update(buildPlotConfig())
166
- })
167
-
168
- // external control → state
169
- $effect(() => {
170
- plotState.setSelected(selected)
171
- })
172
- // clicks (state) → prop, guarded to avoid an update loop
173
- $effect(() => {
174
- const rows = plotState.selectedRows
175
- const same = rows.length === selected.length && rows.every((r, i) => r === selected[i])
176
- if (!same) selected = rows
177
- })
178
-
179
- $effect(() => {
180
- if (!zoom || !svgEl) return
181
- // d3-zoom/d3-selection are client-only; load them dynamically so they are
182
- // not bundled into (and tree-shaken-as-unused from) the SSR/main bundle.
183
- let cancelled = false
184
- let detach: (() => void) | undefined
185
- Promise.all([import('d3-zoom'), import('d3-selection')]).then(
186
- ([{ zoom: d3Zoom }, { select }]) => {
187
- if (cancelled || !svgEl) return
188
- const zoomBehavior = d3Zoom<SVGSVGElement, unknown>()
189
- .scaleExtent([1, 8])
190
- .on('zoom', (event) => {
191
- plotState.applyZoom(event.transform)
192
- })
193
- const sel = select(svgEl)
194
- sel.call(zoomBehavior)
195
- detach = () => sel.on('.zoom', null)
196
- }
197
- )
198
- return () => {
199
- cancelled = true
200
- detach?.()
201
- plotState.resetZoom()
202
- }
203
- })
204
-
205
150
  // Geoms from spec (spec-driven API)
206
151
  const specGeoms = $derived(spec?.geoms ?? [])
207
152
 
@@ -229,111 +174,100 @@
229
174
  }
230
175
  </script>
231
176
 
232
- <div class="plot-root" data-plot-root data-mode={mode} bind:this={containerEl}>
177
+ <div class="plot-root">
233
178
  {#if chartTitle}
234
179
  <div class="plot-title" data-plot-title>{chartTitle}</div>
235
180
  {/if}
236
181
 
237
- <svg
238
- bind:this={svgEl}
239
- width={effectiveWidth}
240
- height={svgHeight}
241
- viewBox="0 0 {effectiveWidth} {svgHeight}"
242
- role="img"
243
- aria-label={chartTitle || 'Chart visualization'}
244
- style:cursor={zoom ? 'grab' : undefined}
182
+ <!-- The shared root shell (PlotState, responsive width, context, animation, patterns, zoom).
183
+ The batteries below (grid/axes/geoms/overlays) render inside its canvas via context. -->
184
+ <PlotSurface
185
+ config={buildPlotConfig()}
186
+ {animate}
187
+ {zoom}
188
+ ariaLabel={chartTitle || 'Chart visualization'}
189
+ summary={chartSummary}
190
+ bind:selected
245
191
  >
246
- {#if chartSummary}
247
- <desc>{chartSummary}</desc>
192
+ <!-- Grid (behind everything) -->
193
+ {#if showGrid}
194
+ <Grid lines={gridLines} {xTicks} {yTicks} />
248
195
  {/if}
249
- <!-- SVG pattern defs -->
250
- <DefinePatterns />
251
196
 
252
- <g
253
- class="plot-canvas"
254
- transform="translate({plotState.margin.left}, {plotState.margin.top})"
255
- data-plot-canvas
256
- >
257
- <!-- Grid (behind everything) -->
258
- {#if showGrid}
259
- <Grid lines={gridLines} {xTicks} {yTicks} />
197
+ <!-- Declarative children (geom components) -->
198
+ {@render children?.()}
199
+
200
+ <!-- Spec-driven geoms -->
201
+ {#each specGeoms as geomSpec (geomSpec.type)}
202
+ {@const GeomComponent = resolveGeomComponent(geomSpec.type)}
203
+ {#if GeomComponent}
204
+ <GeomComponent
205
+ x={geomSpec.x ?? spec?.x}
206
+ y={geomSpec.y ?? spec?.y}
207
+ color={geomSpec.color ?? spec?.color}
208
+ fill={geomSpec.fill ?? spec?.fill}
209
+ pattern={geomSpec.pattern}
210
+ symbol={geomSpec.symbol}
211
+ stat={geomSpec.stat}
212
+ label={geomSpec.label}
213
+ options={{
214
+ ...(spec?.stack !== undefined ? { stack: spec.stack } : {}),
215
+ ...(spec?.orientation !== undefined ? { orientation: spec.orientation } : {}),
216
+ ...(geomSpec.options ?? {})
217
+ }}
218
+ />
260
219
  {/if}
220
+ {/each}
261
221
 
262
- <!-- Declarative children (geom components) -->
263
- {@render children?.()}
222
+ <!-- Axes -->
223
+ {#if axes}
224
+ <Axis type="x" label={spec?.labels?.[spec?.x ?? ''] ?? ''} format={xFormat} ticks={xTicks} {minorTicks} />
225
+ <Axis type="y" label={spec?.labels?.[spec?.y ?? ''] ?? ''} format={yFormat} ticks={yTicks} {minorTicks} />
226
+ {/if}
264
227
 
265
- <!-- Spec-driven geoms -->
266
- {#each specGeoms as geomSpec (geomSpec.type)}
267
- {@const GeomComponent = resolveGeomComponent(geomSpec.type)}
268
- {#if GeomComponent}
269
- <GeomComponent
270
- x={geomSpec.x ?? spec?.x}
271
- y={geomSpec.y ?? spec?.y}
272
- color={geomSpec.color ?? spec?.color}
273
- fill={geomSpec.fill ?? spec?.fill}
274
- pattern={geomSpec.pattern}
275
- symbol={geomSpec.symbol}
276
- stat={geomSpec.stat}
277
- label={geomSpec.label}
278
- options={{
279
- ...(spec?.stack !== undefined ? { stack: spec.stack } : {}),
280
- ...(spec?.orientation !== undefined ? { orientation: spec.orientation } : {}),
281
- ...(geomSpec.options ?? {})
282
- }}
283
- />
284
- {/if}
285
- {/each}
228
+ {#if trend !== null && trend !== undefined}
229
+ <Trend x={overlayX} y={overlayY} {trend} />
230
+ {/if}
286
231
 
287
- <!-- Axes -->
288
- {#if axes}
289
- <Axis type="x" label={spec?.labels?.[spec?.x ?? ''] ?? ''} format={xFormat} ticks={xTicks} {minorTicks} />
290
- <Axis type="y" label={spec?.labels?.[spec?.y ?? ''] ?? ''} format={yFormat} ticks={yTicks} {minorTicks} />
291
- {/if}
232
+ {#if (highlight !== null && highlight !== undefined) || selectable || selected.length}
233
+ <Highlight x={overlayX} y={overlayY} {highlight} {label} />
234
+ {/if}
292
235
 
293
- {#if trend !== null && trend !== undefined}
294
- <Trend x={overlayX} y={overlayY} {trend} />
236
+ <!-- HTML overlays — outside the svg but INSIDE the plot-state context. -->
237
+ {#snippet overlay()}
238
+ {#if showLegend}
239
+ <Legend labels={spec?.labels ?? {}} />
295
240
  {/if}
296
241
 
297
- {#if (highlight !== null && highlight !== undefined) || selectable || selected.length}
298
- <Highlight x={overlayX} y={overlayY} {highlight} {label} />
242
+ {#if tooltip}
243
+ <Tooltip {tooltip} />
299
244
  {/if}
300
- </g>
301
- </svg>
302
245
 
303
- <!-- Legend (HTML, outside SVG) -->
304
- {#if showLegend}
305
- <Legend labels={spec?.labels ?? {}} />
306
- {/if}
307
-
308
- <!-- Tooltip (HTML, fixed-position overlay) -->
309
- {#if tooltip}
310
- <Tooltip {tooltip} />
311
- {/if}
312
-
313
- <!-- Accessible data table — visually hidden, announces data to screen readers -->
314
- {#if tableData.length > 0 && tableColumns.length > 0}
315
- <table class="plot-sr-table" aria-label={chartTitle || 'Chart data'}>
316
- {#if chartTitle}
317
- <caption>{chartTitle}</caption>
318
- {/if}
319
- <thead>
320
- <tr>
321
- {#each tableColumns as col (col)}
322
- <th scope="col">{col}</th>
323
- {/each}
324
- </tr>
325
- </thead>
326
- <tbody>
327
- {#each tableData as row, i (i)}
328
- <tr>
329
- {#each tableColumns as col (col)}
330
- <td>{row[col] ?? ''}</td>
246
+ {#if tableData.length > 0 && tableColumns.length > 0}
247
+ <table class="plot-sr-table" aria-label={chartTitle || 'Chart data'}>
248
+ {#if chartTitle}
249
+ <caption>{chartTitle}</caption>
250
+ {/if}
251
+ <thead>
252
+ <tr>
253
+ {#each tableColumns as col (col)}
254
+ <th scope="col">{col}</th>
255
+ {/each}
256
+ </tr>
257
+ </thead>
258
+ <tbody>
259
+ {#each tableData as row, i (i)}
260
+ <tr>
261
+ {#each tableColumns as col (col)}
262
+ <td>{row[col] ?? ''}</td>
263
+ {/each}
264
+ </tr>
331
265
  {/each}
332
- </tr>
333
- {/each}
334
- </tbody>
335
- </table>
336
- {/if}
266
+ </tbody>
267
+ </table>
268
+ {/if}
269
+ {/snippet}
270
+ </PlotSurface>
337
271
  </div>
338
272
 
339
273
  <style>
@@ -343,23 +277,6 @@
343
277
  height: auto;
344
278
  }
345
279
 
346
- [data-plot-root][data-mode='light'] {
347
- color: rgba(var(--color-surface-700, 59, 65, 77), 1);
348
- }
349
-
350
- [data-plot-root][data-mode='dark'] {
351
- color: rgba(var(--color-surface-200, 224, 224, 224), 1);
352
- }
353
-
354
- svg {
355
- display: block;
356
- overflow: visible;
357
- }
358
-
359
- .plot-canvas {
360
- pointer-events: all;
361
- }
362
-
363
280
  .plot-title {
364
281
  font-size: 14px;
365
282
  font-weight: 600;
@@ -39,6 +39,10 @@ type Props = {
39
39
  onselect?: (detail: unknown) => void;
40
40
  selectable?: boolean;
41
41
  selected?: Row[];
42
+ /** Animate marks on data/flip changes (opt-out for e.g. AnimatedPlot, which
43
+ * tweens its own frames). Enabled one frame after the width settles so the
44
+ * initial layout paints un-animated. Default `true`. */
45
+ animate?: boolean;
42
46
  children?: Snippet;
43
47
  };
44
48
  declare const Plot: import("svelte").Component<Props, {}, "selected">;
@@ -21,6 +21,7 @@ export class PlotState {
21
21
  patterns: Map<unknown, string> | SvelteMap<any, any>;
22
22
  symbols: Map<unknown, string> | SvelteMap<any, any>;
23
23
  colorField: any;
24
+ fillField: any;
24
25
  patternField: any;
25
26
  symbolField: any;
26
27
  geomTypes: SvelteSet<any>;
@@ -41,6 +42,23 @@ export class PlotState {
41
42
  symbols: any;
42
43
  };
43
44
  get data(): any[];
45
+ /** @returns {{ x?: string, y?: string, color?: string, fill?: string, pattern?: string, symbol?: string }} */
46
+ get channels(): {
47
+ x?: string;
48
+ y?: string;
49
+ color?: string;
50
+ fill?: string;
51
+ pattern?: string;
52
+ symbol?: string;
53
+ };
54
+ get isFlipped(): boolean;
55
+ get continuousCategory(): boolean;
56
+ place(u: any, v: any): {
57
+ x: any;
58
+ y: any;
59
+ };
60
+ get bandScale(): any;
61
+ get valueScale(): any;
44
62
  get margin(): {
45
63
  top: number;
46
64
  right: number;
@@ -64,9 +82,19 @@ export class PlotState {
64
82
  };
65
83
  opacity: {
66
84
  area: number;
85
+ bar: number;
86
+ line: number;
87
+ point: number;
88
+ arc: number;
67
89
  box: number;
68
90
  violin: number;
69
- point: number;
91
+ jitter: number;
92
+ heatmap: number;
93
+ candlestick: number;
94
+ hexbin: number;
95
+ ribbon: number;
96
+ waterfall: number;
97
+ rule: number;
70
98
  };
71
99
  patterns: string[];
72
100
  symbols: string[];