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/spec/templates.js
CHANGED
|
@@ -301,6 +301,106 @@ const STARTER_SPECS = {
|
|
|
301
301
|
featureId: "id",
|
|
302
302
|
projection: "identity"
|
|
303
303
|
},
|
|
304
|
+
radar: {
|
|
305
|
+
type: "radar",
|
|
306
|
+
title: "Product comparison",
|
|
307
|
+
data: [
|
|
308
|
+
{ attribute: "Speed", score: 8, product: "Alpha" },
|
|
309
|
+
{ attribute: "Speed", score: 6, product: "Beta" },
|
|
310
|
+
{ attribute: "Battery", score: 6, product: "Alpha" },
|
|
311
|
+
{ attribute: "Battery", score: 9, product: "Beta" },
|
|
312
|
+
{ attribute: "Camera", score: 9, product: "Alpha" },
|
|
313
|
+
{ attribute: "Camera", score: 7, product: "Beta" },
|
|
314
|
+
{ attribute: "Price", score: 5, product: "Alpha" },
|
|
315
|
+
{ attribute: "Price", score: 8, product: "Beta" },
|
|
316
|
+
{ attribute: "Design", score: 7, product: "Alpha" },
|
|
317
|
+
{ attribute: "Design", score: 6, product: "Beta" }
|
|
318
|
+
],
|
|
319
|
+
encoding: {
|
|
320
|
+
category: { field: "attribute" },
|
|
321
|
+
value: { field: "score" },
|
|
322
|
+
series: { field: "product" }
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
gantt: {
|
|
326
|
+
type: "gantt",
|
|
327
|
+
title: "Launch plan",
|
|
328
|
+
data: [
|
|
329
|
+
{ task: "Research", start: "2024-01-02", end: "2024-01-19", team: "Product" },
|
|
330
|
+
{ task: "Design", start: "2024-01-15", end: "2024-02-09", team: "Design" },
|
|
331
|
+
{ task: "Build", start: "2024-02-01", end: "2024-03-15", team: "Engineering" },
|
|
332
|
+
{ task: "Launch", start: "2024-03-20", end: "2024-03-20", team: "Product" }
|
|
333
|
+
],
|
|
334
|
+
encoding: {
|
|
335
|
+
task: { field: "task" },
|
|
336
|
+
start: { field: "start", type: "temporal" },
|
|
337
|
+
end: { field: "end", type: "temporal" },
|
|
338
|
+
group: { field: "team" }
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
sunburst: {
|
|
342
|
+
type: "sunburst",
|
|
343
|
+
title: "Revenue by region",
|
|
344
|
+
data: [
|
|
345
|
+
{ region: "Americas", country: "United States", revenue: 120 },
|
|
346
|
+
{ region: "Americas", country: "Brazil", revenue: 40 },
|
|
347
|
+
{ region: "Europe", country: "Germany", revenue: 70 },
|
|
348
|
+
{ region: "Europe", country: "France", revenue: 50 },
|
|
349
|
+
{ region: "Asia", country: "Japan", revenue: 60 }
|
|
350
|
+
],
|
|
351
|
+
levels: ["region", "country"],
|
|
352
|
+
encoding: {
|
|
353
|
+
value: { field: "revenue" }
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
candlestick: {
|
|
357
|
+
type: "candlestick",
|
|
358
|
+
title: "Daily price",
|
|
359
|
+
data: [
|
|
360
|
+
{ date: "2024-01-02", open: 100, high: 106, low: 98, close: 104 },
|
|
361
|
+
{ date: "2024-01-03", open: 104, high: 108, low: 101, close: 102 },
|
|
362
|
+
{ date: "2024-01-04", open: 102, high: 103, low: 95, close: 96 },
|
|
363
|
+
{ date: "2024-01-05", open: 96, high: 101, low: 94, close: 100 }
|
|
364
|
+
],
|
|
365
|
+
encoding: {
|
|
366
|
+
x: { field: "date", type: "temporal" },
|
|
367
|
+
open: { field: "open" },
|
|
368
|
+
high: { field: "high" },
|
|
369
|
+
low: { field: "low" },
|
|
370
|
+
close: { field: "close" }
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
bubbleMap: {
|
|
374
|
+
type: "bubbleMap",
|
|
375
|
+
title: "Customers by city",
|
|
376
|
+
data: [
|
|
377
|
+
{ city: "Seattle", lon: -122.33, lat: 47.61, customers: 120 },
|
|
378
|
+
{ city: "Chicago", lon: -87.63, lat: 41.88, customers: 260 },
|
|
379
|
+
{ city: "New York", lon: -74.01, lat: 40.71, customers: 410 },
|
|
380
|
+
{ city: "Austin", lon: -97.74, lat: 30.27, customers: 180 }
|
|
381
|
+
],
|
|
382
|
+
encoding: {
|
|
383
|
+
longitude: { field: "lon" },
|
|
384
|
+
latitude: { field: "lat" },
|
|
385
|
+
size: { field: "customers" },
|
|
386
|
+
label: { field: "city" }
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
radialBar: {
|
|
390
|
+
type: "radialBar",
|
|
391
|
+
title: "Goal progress",
|
|
392
|
+
data: [
|
|
393
|
+
{ goal: "Revenue", pct: 82 },
|
|
394
|
+
{ goal: "Pipeline", pct: 64 },
|
|
395
|
+
{ goal: "Retention", pct: 91 },
|
|
396
|
+
{ goal: "NPS", pct: 47 }
|
|
397
|
+
],
|
|
398
|
+
encoding: {
|
|
399
|
+
category: { field: "goal" },
|
|
400
|
+
value: { field: "pct" }
|
|
401
|
+
},
|
|
402
|
+
max: 100
|
|
403
|
+
},
|
|
304
404
|
dropdown: {
|
|
305
405
|
type: "dropdown",
|
|
306
406
|
title: "Region filter",
|
|
@@ -555,7 +655,7 @@ const CHART_METADATA = {
|
|
|
555
655
|
rows("Displays individual rows. Optional totals aggregate columns separately; they do not replace the detail rows."),
|
|
556
656
|
[requirement("column-discovery", ["columns"], "Declare columns for intentional ordering and explicit heterogeneous/nested field visibility.")],
|
|
557
657
|
[guidance(["columns"], "Browser tables support scrolling; static headless output can only display rows/columns that fit.")],
|
|
558
|
-
["sorting", "scrolling", "totals", "groups", "conditional-format", "static-snapshot"]
|
|
658
|
+
["sorting", "scrolling", "totals", "groups", "conditional-format", "sparklines", "frozen-columns", "row-selection", "static-snapshot"]
|
|
559
659
|
),
|
|
560
660
|
matrix: metadata(
|
|
561
661
|
"Pivot or cross-tab summary",
|
|
@@ -564,7 +664,7 @@ const CHART_METADATA = {
|
|
|
564
664
|
{ mode: "pivot", by: ["rows[]", "columns[]"], defaultOp: "sum", operationPath: "values[].op", caveats: ["Aggregates records at each pivot cell with an explicit operation (sum by default). showAs computes percentages from leaf-cell denominators."] },
|
|
565
665
|
[requirement("aggregation-choice", ["values[].op"], "Choose the aggregation and denominator deliberately; numeric type alone does not justify summation.")],
|
|
566
666
|
[guidance(["rows[]", "columns[]"], "Cell count grows with the product of distinct keys; sparse cells do not establish zero observations.")],
|
|
567
|
-
["pivot", "totals", "show-as-percent", "conditional-format", "scrolling", "static-snapshot"]
|
|
667
|
+
["pivot", "totals", "show-as-percent", "conditional-format", "expand-collapse", "row-sort", "cross-filter", "scrolling", "static-snapshot"]
|
|
568
668
|
),
|
|
569
669
|
box: metadata(
|
|
570
670
|
"Spread and distribution by group",
|
|
@@ -593,6 +693,81 @@ const CHART_METADATA = {
|
|
|
593
693
|
[guidance(["encoding.key"], "Prefer one measure per feature key and review join coverage.", { unique: true })],
|
|
594
694
|
["geojson", "projection", "continuous-color"]
|
|
595
695
|
),
|
|
696
|
+
radar: metadata(
|
|
697
|
+
"Compare several measures across series",
|
|
698
|
+
["category", "value"],
|
|
699
|
+
[category("encoding.category"), measure("encoding.value"), role("encoding.series", "series", ALL_FIELD_TYPES, false)],
|
|
700
|
+
{ mode: "lookup", by: ["encoding.series", "encoding.category"], defaultOp: "first", caveats: ["Uses the first finite value at each series/spoke; repeated keys are not summed and missing spokes are not invented."] },
|
|
701
|
+
[finiteMeasure("encoding.value"), requirement("comparable-scale", ["encoding.value", "max"], "Every spoke shares one radial scale, so measures need comparable units (scores, percentages, normalized values).")],
|
|
702
|
+
[guidance(["encoding.category"], "Three to about ten spokes read well; fewer than three cannot enclose an area.", { minimum: 3, recommendedMaximum: 10 }), guidance(["encoding.series"], "A few overlapping polygons stay distinguishable.", { recommendedMaximum: 5 })],
|
|
703
|
+
["series", "polygon-grid", "circle-grid", "fill", "points"]
|
|
704
|
+
),
|
|
705
|
+
gantt: metadata(
|
|
706
|
+
"Schedule of tasks over time",
|
|
707
|
+
["task", "start", "end"],
|
|
708
|
+
[
|
|
709
|
+
category("encoding.task"),
|
|
710
|
+
role("encoding.start", "time", ["temporal", "quantitative"]),
|
|
711
|
+
role("encoding.end", "time", ["temporal", "quantitative"]),
|
|
712
|
+
role("encoding.group", "series", CATEGORY_TYPES, false),
|
|
713
|
+
role("encoding.progress", "measure", ["quantitative"], false)
|
|
714
|
+
],
|
|
715
|
+
rows("Each row is one bar (or a milestone when end equals start); repeated tasks share a lane and are not merged."),
|
|
716
|
+
[
|
|
717
|
+
requirement("ordered-interval", ["encoding.start", "encoding.end"], "Each row needs a valid start and an end at or after it; reversed or missing bounds are not reordered or invented."),
|
|
718
|
+
requirement("progress-fraction", ["encoding.progress"], "When supplied, progress is a fraction from 0 to 1.")
|
|
719
|
+
],
|
|
720
|
+
[guidance(["encoding.task"], "Each lane needs vertical room for its label; long plans need more height.", { recommendedMaximum: 30 })],
|
|
721
|
+
["milestones", "progress", "group-color", "lane-sort", "annotations"]
|
|
722
|
+
),
|
|
723
|
+
sunburst: metadata(
|
|
724
|
+
"Hierarchical part-to-whole in rings",
|
|
725
|
+
["levels", "value"],
|
|
726
|
+
[category("levels[]"), measure("encoding.value")],
|
|
727
|
+
aggregate(["levels[]"], "Sums positive finite values at every level of the hierarchy; nonpositive rows add no angle and FieldDef.aggregate is not consumed."),
|
|
728
|
+
[
|
|
729
|
+
requirement("positive-weights", ["encoding.value"], "Arc angles need positive finite weights. Signed composition needs an explicit alternative."),
|
|
730
|
+
requirement("consistent-hierarchy", ["levels[]"], "Each row carries every level field; missing parents are not inferred.")
|
|
731
|
+
],
|
|
732
|
+
[guidance(["levels[]"], "Two to four rings stay legible; outer rings get thin with many leaves.", { minimum: 1, recommendedMaximum: 4 })],
|
|
733
|
+
["hierarchy", "center-total", "arc-labels"]
|
|
734
|
+
),
|
|
735
|
+
candlestick: metadata(
|
|
736
|
+
"Open/high/low/close price action over time",
|
|
737
|
+
["x", "open", "high", "low", "close"],
|
|
738
|
+
[role("encoding.x", "time", ["temporal", "ordinal", "nominal"]), measure("encoding.open"), measure("encoding.high"), measure("encoding.low"), measure("encoding.close")],
|
|
739
|
+
rows("Each row is one period; repeated periods draw separate candles and are not merged."),
|
|
740
|
+
[requirement("ohlc-range", ["encoding.open", "encoding.high", "encoding.low", "encoding.close"], "Use finite prices where low \u2264 open, close \u2264 high; inconsistent ranges are drawn to their extremes rather than corrected.")],
|
|
741
|
+
[guidance(["encoding.x"], "Candles narrow as periods increase; very long series read better as a line.", { recommendedMaximum: 250 })],
|
|
742
|
+
["ohlc-style", "up-down-colors", "annotations"]
|
|
743
|
+
),
|
|
744
|
+
bubbleMap: metadata(
|
|
745
|
+
"Sized points over geography",
|
|
746
|
+
["longitude", "latitude"],
|
|
747
|
+
[
|
|
748
|
+
role("encoding.longitude", "geography", ["quantitative"]),
|
|
749
|
+
role("encoding.latitude", "geography", ["quantitative"]),
|
|
750
|
+
role("encoding.size", "size", ["quantitative"], false),
|
|
751
|
+
role("encoding.color", "category", ALL_FIELD_TYPES, false),
|
|
752
|
+
role("encoding.label", "text", ALL_FIELD_TYPES, false)
|
|
753
|
+
],
|
|
754
|
+
rows("Each row is one bubble at its coordinates; nearby rows overlap rather than being clustered or summed. Rows with unusable coordinates or sizes, or (over a basemap) off the map, are omitted and counted."),
|
|
755
|
+
[
|
|
756
|
+
requirement("valid-coordinates", ["encoding.longitude", "encoding.latitude"], "Longitude must be in \u2212180\u2026180 and latitude in \u221290\u202690 degrees; names are never geocoded."),
|
|
757
|
+
requirement("nonnegative-size", ["encoding.size"], "When supplied, size needs nonnegative finite values: non-finite sizes are omitted, and a negative size keeps only its location (a hollow ring, not an area).")
|
|
758
|
+
],
|
|
759
|
+
[guidance(["encoding.longitude", "encoding.latitude"], "Dense points overlap; inspect render evidence rather than assuming every bubble is distinguishable.")],
|
|
760
|
+
["geojson-basemap", "projection", "bubble-size", "size-legend", "continuous-color", "categorical-color", "bubble-labels"]
|
|
761
|
+
),
|
|
762
|
+
radialBar: metadata(
|
|
763
|
+
"Category values as arcs around a center",
|
|
764
|
+
["category", "value"],
|
|
765
|
+
[category("encoding.category"), measure("encoding.value")],
|
|
766
|
+
aggregate(["encoding.category"], "Sums finite nonnegative values per category in first-seen order; negative and non-numeric rows are omitted and counted. FieldDef.aggregate does not change this operation."),
|
|
767
|
+
[requirement("nonnegative-values", ["encoding.value"], "Arc length and wedge area need nonnegative values; choose max explicitly for percentages.")],
|
|
768
|
+
[guidance(["encoding.category"], "A handful of rings or wedges stays legible.", { recommendedMaximum: 12 })],
|
|
769
|
+
["radial-layout", "polar-layout", "tracks", "max"]
|
|
770
|
+
),
|
|
596
771
|
dropdown: slicer("Single- or multi-select field filter", void 0, ["single-select", "multiple-select"]),
|
|
597
772
|
search: slicer("Text search filter for a field", void 0, ["text-search"]),
|
|
598
773
|
list: slicer("Checkbox list filter for a field", void 0, ["multiple-select"]),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spec/templates.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ChartSpec, ChartType } from './types';\nimport { CHART_TYPES } from './types';\nimport { chartDefinition } from './chartDefinitions';\nimport type { FieldType } from '../types';\n\nexport interface FieldRoleInfo {\n /** Spec path, including [] for repeated definitions. */\n path: string;\n role: 'position' | 'measure' | 'category' | 'series' | 'size' | 'time' | 'target' | 'geography' | 'filter' | 'text';\n types: FieldType[];\n required: boolean;\n}\n\nexport interface DataRequirement {\n code: string;\n fields: string[];\n description: string;\n}\n\nexport interface CardinalityGuidance {\n fields: string[];\n minimum?: number;\n maximum?: number;\n recommendedMaximum?: number;\n unique?: boolean;\n description: string;\n}\n\nexport interface AggregationCapability {\n mode: 'rows' | 'aggregate' | 'bin' | 'distribution' | 'value' | 'pivot' | 'lookup' | 'filter-domain' | 'running-total';\n by: string[];\n defaultOp?: string;\n /** Spec path controlling the operation, only when the renderer consumes it. */\n operationPath?: string;\n caveats: string[];\n}\n\nexport interface ChartCapabilities {\n fieldRoles: FieldRoleInfo[];\n requirements: DataRequirement[];\n cardinality: CardinalityGuidance[];\n aggregation: AggregationCapability;\n features: string[];\n}\n\n/** Agent-facing metadata for one chart family and its starter template. */\nexport interface ChartTypeInfo {\n /** The chart type string accepted by {@link starterSpec}. */\n type: ChartType;\n /** A one-line description of when to use this chart type. */\n purpose: string;\n /** Required channels, fields, or top-level properties needed for validity. */\n requiredChannels: string[];\n /** A minimal valid starter spec for this chart type. */\n example: ChartSpec;\n /** Additive machine-readable authoring guidance, populated by listChartTypes. */\n capabilities?: ChartCapabilities;\n}\n\nconst STARTER_SPECS = {\n line: {\n type: 'line',\n title: 'Monthly users',\n data: [\n { month: '2024-01', users: 42 },\n { month: '2024-02', users: 58 },\n { month: '2024-03', users: 64 },\n ],\n encoding: {\n x: { field: 'month', type: 'temporal' },\n y: { field: 'users' },\n },\n },\n area: {\n type: 'area',\n title: 'Monthly revenue',\n data: [\n { month: '2024-01', revenue: 120 },\n { month: '2024-02', revenue: 150 },\n { month: '2024-03', revenue: 180 },\n ],\n encoding: {\n x: { field: 'month', type: 'temporal' },\n y: { field: 'revenue' },\n },\n },\n bar: {\n type: 'bar',\n title: 'Sales by region',\n data: [\n { region: 'North', sales: 120 },\n { region: 'South', sales: 95 },\n { region: 'West', sales: 140 },\n ],\n encoding: {\n x: { field: 'region' },\n y: { field: 'sales' },\n },\n },\n scatter: {\n type: 'scatter',\n title: 'Price vs. demand',\n data: [\n { price: 10, demand: 80 },\n { price: 15, demand: 65 },\n { price: 20, demand: 48 },\n ],\n encoding: {\n x: { field: 'price' },\n y: { field: 'demand' },\n },\n },\n combo: {\n type: 'combo',\n title: 'Revenue and margin',\n data: [\n { month: 'Jan', revenue: 120, margin: 0.31 },\n { month: 'Feb', revenue: 150, margin: 0.35 },\n { month: 'Mar', revenue: 135, margin: 0.33 },\n ],\n encoding: {\n x: { field: 'month' },\n },\n layers: [\n { mark: 'bar', encoding: { y: { field: 'revenue' } } },\n { mark: 'line', axis: 'right', encoding: { y: { field: 'margin', format: '.0%' } } },\n ],\n },\n histogram: {\n type: 'histogram',\n title: 'Order value distribution',\n data: [\n { value: 12 },\n { value: 18 },\n { value: 25 },\n { value: 32 },\n ],\n encoding: {\n x: { field: 'value' },\n },\n },\n pie: {\n type: 'pie',\n title: 'Share by channel',\n data: [\n { channel: 'Direct', share: 45 },\n { channel: 'Partner', share: 30 },\n { channel: 'Search', share: 25 },\n ],\n encoding: {\n theta: { field: 'share' },\n color: { field: 'channel' },\n },\n },\n heatmap: {\n type: 'heatmap',\n title: 'Activity by day and hour',\n data: [\n { day: 'Mon', hour: 'Morning', activity: 12 },\n { day: 'Mon', hour: 'Evening', activity: 18 },\n { day: 'Tue', hour: 'Morning', activity: 9 },\n { day: 'Tue', hour: 'Evening', activity: 21 },\n ],\n encoding: {\n x: { field: 'day' },\n y: { field: 'hour' },\n color: { field: 'activity' },\n },\n },\n funnel: {\n type: 'funnel',\n title: 'Signup conversion',\n data: [\n { stage: 'Visitors', users: 1000 },\n { stage: 'Trials', users: 420 },\n { stage: 'Customers', users: 180 },\n ],\n encoding: {\n stage: { field: 'stage' },\n value: { field: 'users' },\n },\n },\n kpi: {\n type: 'kpi',\n title: 'Total revenue',\n data: [\n { revenue: 120 },\n { revenue: 150 },\n ],\n value: { field: 'revenue', aggregate: 'sum' },\n label: 'Revenue',\n },\n treemap: {\n type: 'treemap',\n title: 'Portfolio value',\n data: [\n { category: 'Product A', value: 60 },\n { category: 'Product B', value: 40 },\n { category: 'Product C', value: 25 },\n ],\n encoding: {\n category: { field: 'category' },\n value: { field: 'value' },\n },\n },\n gauge: {\n type: 'gauge',\n title: 'Quota attainment',\n data: [\n { attainment: 72 },\n { attainment: 81 },\n ],\n value: { field: 'attainment', aggregate: 'mean' },\n max: 100,\n label: 'Attainment',\n },\n bullet: {\n type: 'bullet',\n title: 'Revenue vs. target',\n data: [\n { revenue: 72 },\n { revenue: 81 },\n ],\n value: { field: 'revenue', aggregate: 'mean' },\n target: 90,\n max: 100,\n label: 'Revenue',\n },\n calendarHeatmap: {\n type: 'calendarHeatmap',\n title: 'Daily activity',\n data: [\n { date: '2024-01-01', value: 3 },\n { date: '2024-01-02', value: 7 },\n { date: '2024-01-03', value: 4 },\n ],\n encoding: {\n date: { field: 'date', type: 'temporal' },\n color: { field: 'value' },\n },\n },\n waterfall: {\n type: 'waterfall',\n title: 'Profit bridge',\n data: [\n { stage: 'Start', change: 100 },\n { stage: 'Growth', change: 35 },\n { stage: 'Costs', change: -20 },\n ],\n encoding: {\n stage: { field: 'stage' },\n value: { field: 'change' },\n },\n },\n slope: {\n type: 'slope',\n title: 'Before and after',\n data: [\n { period: 'Before', score: 42, segment: 'A' },\n { period: 'After', score: 58, segment: 'A' },\n { period: 'Before', score: 35, segment: 'B' },\n { period: 'After', score: 46, segment: 'B' },\n ],\n encoding: {\n x: { field: 'period' },\n y: { field: 'score' },\n series: { field: 'segment' },\n },\n },\n dumbbell: {\n type: 'dumbbell',\n title: 'Before and after by category',\n data: [\n { category: 'A', value: 42, group: 'Before' },\n { category: 'A', value: 58, group: 'After' },\n { category: 'B', value: 35, group: 'Before' },\n { category: 'B', value: 46, group: 'After' },\n ],\n encoding: {\n category: { field: 'category' },\n value: { field: 'value' },\n group: { field: 'group' },\n },\n },\n table: {\n type: 'table',\n title: 'Regional sales',\n data: [\n { region: 'North', sales: 120 },\n { region: 'South', sales: 95 },\n ],\n },\n matrix: {\n type: 'matrix',\n title: 'Sales matrix',\n data: [\n { region: 'North', segment: 'Consumer', sales: 120 },\n { region: 'South', segment: 'Business', sales: 95 },\n ],\n rows: ['region'],\n columns: ['segment'],\n values: [{ field: 'sales', op: 'sum' }],\n },\n box: {\n type: 'box',\n title: 'Latency by tier',\n data: [\n { tier: 'Free', latency: 120 },\n { tier: 'Free', latency: 180 },\n { tier: 'Pro', latency: 90 },\n { tier: 'Pro', latency: 110 },\n ],\n encoding: {\n x: { field: 'tier' },\n y: { field: 'latency' },\n },\n },\n sankey: {\n type: 'sankey',\n title: 'Traffic flow',\n data: [\n { source: 'Visits', target: 'Signup', value: 100 },\n { source: 'Signup', target: 'Trial', value: 60 },\n { source: 'Trial', target: 'Paid', value: 25 },\n ],\n encoding: {\n source: { field: 'source' },\n target: { field: 'target' },\n value: { field: 'value' },\n },\n },\n choropleth: {\n type: 'choropleth',\n title: 'Regional index',\n geo: {\n type: 'FeatureCollection',\n features: [\n {\n type: 'Feature',\n properties: { id: 'A' },\n geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]] },\n },\n {\n type: 'Feature',\n properties: { id: 'B' },\n geometry: { type: 'Polygon', coordinates: [[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]] },\n },\n ],\n },\n data: [\n { region: 'A', value: 42 },\n { region: 'B', value: 88 },\n ],\n encoding: {\n key: { field: 'region' },\n color: { field: 'value' },\n },\n featureId: 'id',\n projection: 'identity',\n },\n dropdown: {\n type: 'dropdown',\n title: 'Region filter',\n data: [\n { region: 'North' },\n { region: 'South' },\n ],\n field: 'region',\n },\n search: {\n type: 'search',\n title: 'Customer search',\n data: [\n { customer: 'Acme' },\n { customer: 'Globex' },\n ],\n field: 'customer',\n },\n list: {\n type: 'list',\n title: 'Category filter',\n data: [\n { category: 'Hardware' },\n { category: 'Software' },\n ],\n field: 'category',\n },\n range: {\n type: 'range',\n title: 'Price range',\n data: [\n { price: 10 },\n { price: 25 },\n ],\n field: 'price',\n },\n dateRange: {\n type: 'dateRange',\n title: 'Date range',\n data: [\n { date: '2024-01-01' },\n { date: '2024-01-31' },\n ],\n field: 'date',\n },\n} satisfies Record<ChartType, ChartSpec>;\n\nconst ALL_FIELD_TYPES: FieldType[] = ['quantitative', 'temporal', 'nominal', 'ordinal'];\nconst CATEGORY_TYPES: FieldType[] = ['nominal', 'ordinal'];\nconst role = (path: string, name: FieldRoleInfo['role'], types = ALL_FIELD_TYPES, required = true): FieldRoleInfo =>\n ({ path, role: name, types, required });\nconst measure = (path: string, required = true) => role(path, 'measure', ['quantitative'], required);\nconst category = (path: string, required = true) => role(path, 'category', CATEGORY_TYPES, required);\nconst requirement = (code: string, fields: string[], description: string): DataRequirement => ({ code, fields, description });\nconst guidance = (fields: string[], description: string, extra: Omit<CardinalityGuidance, 'fields' | 'description'> = {}): CardinalityGuidance =>\n ({ fields, description, ...extra });\nconst rows = (caveat = 'Rows are plotted as-is. FieldDef.aggregate does not group them; use an explicit aggregate transform when appropriate.'): AggregationCapability =>\n ({ mode: 'rows', by: [], caveats: [caveat] });\nconst aggregate = (by: string[], caveat: string, operationPath?: string): AggregationCapability =>\n ({ mode: 'aggregate', by, defaultOp: 'sum', ...(operationPath ? { operationPath } : {}), caveats: [caveat] });\nconst valueAggregation: AggregationCapability = {\n mode: 'value', by: [], defaultOp: 'sum', operationPath: 'value.aggregate',\n caveats: ['A literal is used directly. A field reference aggregates the rows, defaulting to sum; value, target, and comparison references choose their operations independently.'],\n};\nconst finiteMeasure = (field: string) => requirement('finite-measure', [field], 'Use finite numeric values; supported numeric strings, booleans, and Date epochs retain their existing coercion.');\nconst cartesianRoles = () => [\n role('encoding.x', 'position'), measure('encoding.y'),\n role('encoding.series', 'series', ALL_FIELD_TYPES, false),\n];\nconst orderedKeys = () => guidance(\n ['encoding.x', 'encoding.series'], 'Prefer one observation at each position within a series. Repeated keys need an explicit decision.', { unique: true },\n);\nconst seriesGuidance = () => guidance(['encoding.series'], 'Legibility depends on the target size; no series are grouped automatically.', { recommendedMaximum: 12 });\nconst metadata = (\n purpose: string, requiredChannels: string[], fieldRoles: FieldRoleInfo[], aggregation: AggregationCapability,\n requirements: DataRequirement[], cardinality: CardinalityGuidance[], features: string[],\n) => ({\n purpose, requiredChannels,\n capabilities: { fieldRoles, aggregation, requirements, cardinality, features: ['transform', ...features] },\n});\nconst slicer = (purpose: string, type: FieldType | undefined, features: string[]) => metadata(\n purpose, ['field'], [role('field', 'filter', type ? [type] : ALL_FIELD_TYPES)],\n {\n mode: 'filter-domain', by: ['field'], defaultOp: type === 'quantitative' || type === 'temporal' ? 'extent' : 'distinct',\n caveats: ['Builds an option/range domain and publishes a selection; does not aggregate measures. Browser interaction and static headless snapshots differ.'],\n },\n [requirement('field-values', ['field'], type === 'temporal' ? 'Use supported dates; local calendar strings retain local-date semantics.'\n : type === 'quantitative' ? 'Use finite numeric values for the range.' : 'Use field values suitable for display and selection.')],\n [guidance(['field'], type ? 'A constant field has no nonzero selectable interval.' : 'For many distinct options prefer search or dropdown over a long checkbox list.')],\n ['selection-param', 'browser-interaction', 'static-snapshot', ...features],\n);\n\n// One exhaustive metadata record, driven by the same CHART_TYPES/starter contract.\nconst CHART_METADATA = {\n line: metadata('Trend over time', ['x', 'y'], cartesianRoles(), rows(),\n [finiteMeasure('encoding.y')],\n [orderedKeys(), seriesGuidance()],\n ['series', 'area-fill', 'facet', 'trendline', 'insights', 'data-labels']),\n area: metadata('Part-to-whole or filled trend over time', ['x', 'y'],\n [...cartesianRoles(), measure('encoding.y2', false)], rows(),\n [finiteMeasure('encoding.y'), requirement('stack-semantics', ['stack'], 'Choose stacking explicitly; gaps do not establish zero observations.')],\n [orderedKeys(), seriesGuidance()],\n ['series', 'stack', 'range-band', 'facet', 'trendline', 'insights']),\n bar: metadata('Compare categories', ['x', 'y'], cartesianRoles(), rows(),\n [finiteMeasure('encoding.y'), requirement('zero-baseline', ['encoding.y.scale'], 'Bar length needs a zero baseline unless the caller explicitly chooses a truncated scale.')],\n [orderedKeys(), guidance(['encoding.x'], 'More categories need more space or an explicit alternative; no top-N filtering is automatic.', { recommendedMaximum: 30 }), seriesGuidance()],\n ['series', 'stack', 'horizontal', 'facet', 'insights', 'data-labels']),\n scatter: metadata('Correlation or distribution across two measures', ['x', 'y'],\n [role('encoding.x', 'position'), measure('encoding.y'), role('encoding.size', 'size', ['quantitative'], false), role('encoding.color', 'category', ALL_FIELD_TYPES, false)],\n rows('Observations remain separate; overlapping points may be draw-side reduced at high density, not aggregated into new data.'),\n [finiteMeasure('encoding.y'), requirement('nonnegative-size', ['encoding.size'], 'When supplied, size needs nonnegative finite values.')],\n [guidance(['encoding.x', 'encoding.y'], 'Dense point clouds may overlap; inspect render evidence rather than assuming every point is distinguishable.')],\n ['bubble-size', 'continuous-color', 'series', 'facet', 'trendline', 'density-reduction']),\n combo: metadata('Two measures or mark types on a shared axis', ['x', 'layers[].mark', 'layers[].encoding.y'],\n [role('encoding.x', 'position'), measure('layers[].encoding.y')], rows(),\n [finiteMeasure('layers[].encoding.y'), requirement('explicit-units', ['layers[].axis'], 'A right axis is an explicit choice; different units are never inferred.')],\n [guidance(['layers'], 'Use a small number of distinct, clearly labeled measures.', { minimum: 1, recommendedMaximum: 3 })],\n ['layered-marks', 'shared-x', 'dual-axis']),\n histogram: metadata('Distribution of one quantitative measure', ['x'], [measure('encoding.x')],\n { mode: 'bin', by: ['encoding.x'], defaultOp: 'count', caveats: ['Bins finite observations and counts them; density changes normalization. FieldDef.aggregate is not a bin operation.'] },\n [finiteMeasure('encoding.x')],\n [guidance(['encoding.x'], 'Constant or singleton inputs have limited distribution evidence.', { minimum: 1 })],\n ['automatic-bins', 'bin-controls', 'density']),\n pie: metadata('Composition of a total', ['theta', 'color'],\n [measure('encoding.theta'), category('encoding.color')],\n aggregate(['encoding.color'], 'Repeated categories aggregate theta (sum by default). Nonpositive slice results cannot express a signed composition.', 'encoding.theta.aggregate'),\n [requirement('nonnegative-composition', ['encoding.theta'], 'A meaningful part-to-whole view needs nonnegative shares and a positive total; do not silently discard negative shares.')],\n [guidance(['encoding.color'], 'Prefer bars or an explicit alternative for many slices; small shares may need callouts.', { recommendedMaximum: 7 })],\n ['donut', 'callout-labels', 'percent-labels']),\n heatmap: metadata('Density across two categories', ['x', 'y', 'color'],\n [category('encoding.x'), category('encoding.y'), measure('encoding.color')],\n { mode: 'lookup', by: ['encoding.x', 'encoding.y'], defaultOp: 'last', caveats: ['Repeated cells overpaint in input order; the last finite value is visible. No cell aggregation or gap filling is implied.'] },\n [finiteMeasure('encoding.color')],\n [guidance(['encoding.x', 'encoding.y'], 'Prefer unique cells. Absent combinations remain absent; cell-label legibility depends on both axis counts and size.', { unique: true })],\n ['cell-labels', 'continuous-color']),\n funnel: metadata('Conversion through stages', ['stage', 'value'],\n [category('encoding.stage'), measure('encoding.value')],\n aggregate(['encoding.stage'], 'Sums values per stage in first-seen order; FieldDef.aggregate does not change this operation.'),\n [requirement('ordered-stages', ['encoding.stage', 'encoding.value'], 'Choose meaningful stage order and nonnegative counts; decreasing values support conversion interpretation.')],\n [guidance(['encoding.stage'], 'Keep stages few enough to compare and label.', { recommendedMaximum: 12 })],\n ['conversion-percent', 'stage-order']),\n kpi: metadata('Single headline value or compact scorecard', ['value'],\n [measure('value'), role('delta', 'measure', ['quantitative'], false)], valueAggregation,\n [requirement('literal-or-aggregate', ['value'], 'Supply a finite literal or explicitly choose a field aggregation; summing rates/identifiers is not justified by their numeric type.')],\n [guidance(['value'], 'A headline resolves to one value, even when source data has many rows.')],\n ['literal-value', 'delta', 'sparkline', 'comparisons', 'unit']),\n treemap: metadata('Hierarchical or categorical part-to-whole', ['category', 'value'],\n [category('encoding.category'), measure('encoding.value'), category('encoding.group', false), role('encoding.color', 'category', ALL_FIELD_TYPES, false)],\n aggregate(['encoding.group', 'encoding.category'], 'Sums positive finite values within each group/category; nonpositive rows do not produce area and FieldDef.aggregate is not consumed.'),\n [requirement('positive-area', ['encoding.value'], 'Area requires positive finite weights. Signed composition needs an explicit alternative.')],\n [guidance(['encoding.category'], 'Many or highly skewed weights create small unlabeled tiles; inspect label omissions.')],\n ['group-hierarchy', 'tile-labels', 'continuous-color']),\n gauge: metadata('Single value against a scale', ['value', 'max'],\n [measure('value'), role('max', 'target', ['quantitative']), role('target', 'target', ['quantitative'], false)], valueAggregation,\n [requirement('bounded-scale', ['min', 'max'], 'Choose a finite maximum greater than the minimum; a target alone does not establish a maximum.')],\n [guidance(['value'], 'One resolved value per gauge; use multiple views for independent KPIs.')],\n ['literal-value', 'target', 'compare', 'bands', 'legend']),\n bullet: metadata('Compact KPI versus a target', ['value'],\n [measure('value'), role('target', 'target', ['quantitative'], false)], valueAggregation,\n [requirement('comparable-target', ['value', 'target', 'ranges'], 'Targets and qualitative ranges must use the same caller-defined units as the value.')],\n [guidance(['value'], 'One resolved KPI per bullet graph.')],\n ['literal-value', 'target', 'qualitative-ranges']),\n calendarHeatmap: metadata('Daily values over a year', ['date', 'color'],\n [role('encoding.date', 'time', ['temporal']), measure('encoding.color')],\n aggregate(['encoding.date'], 'Sums finite values within each local calendar day. Missing days are not zero and daily aggregation must be meaningful.'),\n [requirement('valid-calendar-date', ['encoding.date'], 'Use valid dates; explicit offsets and local bare calendar dates keep their existing parsing semantics.'), finiteMeasure('encoding.color')],\n [guidance(['encoding.date'], 'Dense daily data over roughly a year fits the calendar idiom; long spans need more space.')],\n ['local-calendar', 'continuous-color']),\n waterfall: metadata('Running total or bridge of signed deltas', ['stage', 'value'],\n [category('encoding.stage'), measure('encoding.value')],\n { mode: 'running-total', by: [], defaultOp: 'sum', caveats: ['Each row is an ordered signed step. Repeated stage labels are not grouped; totals/subtotals are explicit configuration.'] },\n [finiteMeasure('encoding.value'), requirement('ordered-deltas', ['encoding.stage'], 'The row order and whether values are deltas are caller decisions, not consequences of numeric signs.')],\n [guidance(['encoding.stage'], 'A short bridge is easier to label and audit.', { recommendedMaximum: 20 })],\n ['signed-deltas', 'total', 'subtotals']),\n slope: metadata('Before/after change across series', ['x', 'y', 'series'],\n [role('encoding.x', 'position'), measure('encoding.y'), role('encoding.series', 'series')],\n { mode: 'lookup', by: ['encoding.series', 'encoding.x'], defaultOp: 'first', caveats: ['Uses the first usable value at each series/position; repeated keys are not summed. Missing endpoints are not invented.'] },\n [finiteMeasure('encoding.y'), requirement('comparable-endpoints', ['encoding.x', 'encoding.series'], 'Before/after interpretation requires comparable positions for each series.')],\n [guidance(['encoding.x'], 'Two positions support before/after comparison; additional positions are supported but change the interpretation.', { minimum: 2, recommendedMaximum: 2 }), orderedKeys(), seriesGuidance()],\n ['endpoint-labels', 'color-by-change']),\n dumbbell: metadata('Gap between two groups by category', ['category', 'value', 'group'],\n [category('encoding.category'), measure('encoding.value'), role('encoding.group', 'series')],\n rows('Retains finite dots per category/group without aggregating duplicates. More than two groups are supported, but do not imply a single before/after pair.'),\n [finiteMeasure('encoding.value'), requirement('comparable-groups', ['encoding.group'], 'Choose comparable group meanings; missing pairs remain missing.')],\n [guidance(['encoding.group'], 'Two groups make one gap easiest to interpret.', { minimum: 2, recommendedMaximum: 2 }), guidance(['encoding.category', 'encoding.group'], 'Prefer one value per comparison endpoint.', { unique: true })],\n ['gap-sort', 'multiple-groups', 'dot-labels']),\n table: metadata('Tabular detail', [], [role('columns[].field', 'text', ALL_FIELD_TYPES, false)],\n rows('Displays individual rows. Optional totals aggregate columns separately; they do not replace the detail rows.'),\n [requirement('column-discovery', ['columns'], 'Declare columns for intentional ordering and explicit heterogeneous/nested field visibility.')],\n [guidance(['columns'], 'Browser tables support scrolling; static headless output can only display rows/columns that fit.')],\n ['sorting', 'scrolling', 'totals', 'groups', 'conditional-format', 'static-snapshot']),\n matrix: metadata('Pivot or cross-tab summary', ['rows', 'values'],\n [category('rows[]'), category('columns[]', false), measure('values[].field')],\n { mode: 'pivot', by: ['rows[]', 'columns[]'], defaultOp: 'sum', operationPath: 'values[].op', caveats: ['Aggregates records at each pivot cell with an explicit operation (sum by default). showAs computes percentages from leaf-cell denominators.'] },\n [requirement('aggregation-choice', ['values[].op'], 'Choose the aggregation and denominator deliberately; numeric type alone does not justify summation.')],\n [guidance(['rows[]', 'columns[]'], 'Cell count grows with the product of distinct keys; sparse cells do not establish zero observations.')],\n ['pivot', 'totals', 'show-as-percent', 'conditional-format', 'scrolling', 'static-snapshot']),\n box: metadata('Spread and distribution by group', ['x', 'y'],\n [category('encoding.x'), measure('encoding.y'), role('encoding.series', 'series', ALL_FIELD_TYPES, false)],\n { mode: 'distribution', by: ['encoding.x', 'encoding.series'], defaultOp: 'quartiles', caveats: ['Summarizes finite raw observations as quartiles/whiskers/outliers; do not pass precomputed means as though they were a distribution.'] },\n [finiteMeasure('encoding.y')],\n [guidance(['encoding.x', 'encoding.series'], 'Multiple observations per group are needed to convey a meaningful spread; singleton/constant groups are degenerate.')],\n ['quartiles', 'whiskers', 'outliers', 'series']),\n sankey: metadata('Flows between nodes', ['source', 'target', 'value'],\n [role('encoding.source', 'category'), role('encoding.target', 'category'), measure('encoding.value')],\n rows('Each positive finite row is a link; repeated links remain separate. Node magnitude is derived from incident flows.'),\n [requirement('acyclic-positive-flow', ['encoding.source', 'encoding.target', 'encoding.value'], 'Use nonempty distinct endpoints and positive weights. Self-links and feedback/cyclic links cannot all be represented.')],\n [guidance(['encoding.source', 'encoding.target'], 'Many nodes or links need more space; omitted labels and feedback links require review.')],\n ['flow-width', 'node-labels']),\n choropleth: metadata('Values over map regions', ['geo', 'key', 'color', 'featureId'],\n [role('encoding.key', 'geography'), measure('encoding.color')],\n { mode: 'lookup', by: ['encoding.key'], defaultOp: 'last', caveats: ['The last finite value for each nonempty join key is used. Unmatched data/geometry is not a zero observation; repeated keys are not summed.'] },\n [requirement('geojson-join', ['geo', 'featureId', 'encoding.key'], 'Supply geometry and an explicit matching feature property; neither geometry nor geographic meaning is inferred from names.'), finiteMeasure('encoding.color')],\n [guidance(['encoding.key'], 'Prefer one measure per feature key and review join coverage.', { unique: true })],\n ['geojson', 'projection', 'continuous-color']),\n dropdown: slicer('Single- or multi-select field filter', undefined, ['single-select', 'multiple-select']),\n search: slicer('Text search filter for a field', undefined, ['text-search']),\n list: slicer('Checkbox list filter for a field', undefined, ['multiple-select']),\n range: slicer('Numeric range filter for a field', 'quantitative', ['numeric-range']),\n dateRange: slicer('Temporal range filter for a field', 'temporal', ['date-range', 'presets']),\n} satisfies Record<ChartType, Omit<ChartTypeInfo, 'type' | 'example'> & { capabilities: ChartCapabilities }>;\n\nfunction cloneSpec(spec: ChartSpec): ChartSpec {\n return JSON.parse(JSON.stringify(spec)) as ChartSpec;\n}\n\n/**\n * Return a minimal valid starter spec for a chart type, including placeholder\n * inline data whose fields match the spec's encodings and field references.\n */\nexport function starterSpec(type: ChartType): ChartSpec {\n return cloneSpec(STARTER_SPECS[type]);\n}\n\n/**\n * List every registered chart/slicer type, machine-readable data requirements\n * and capabilities, and a ready-to-render starter. Guidance never transforms data.\n */\nexport function listChartTypes(): (ChartTypeInfo & { capabilities: ChartCapabilities })[] {\n return CHART_TYPES.map((type) => ({\n type,\n purpose: CHART_METADATA[type].purpose,\n requiredChannels: [...chartDefinition(type).requiredChannels],\n example: starterSpec(type),\n capabilities: JSON.parse(JSON.stringify(CHART_METADATA[type].capabilities)) as ChartCapabilities,\n }));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { ChartSpec, ChartType } from './types';\nimport { CHART_TYPES } from './types';\nimport { chartDefinition } from './chartDefinitions';\nimport type { FieldType } from '../types';\n\nexport interface FieldRoleInfo {\n /** Spec path, including [] for repeated definitions. */\n path: string;\n role: 'position' | 'measure' | 'category' | 'series' | 'size' | 'time' | 'target' | 'geography' | 'filter' | 'text';\n types: FieldType[];\n required: boolean;\n}\n\nexport interface DataRequirement {\n code: string;\n fields: string[];\n description: string;\n}\n\nexport interface CardinalityGuidance {\n fields: string[];\n minimum?: number;\n maximum?: number;\n recommendedMaximum?: number;\n unique?: boolean;\n description: string;\n}\n\nexport interface AggregationCapability {\n mode: 'rows' | 'aggregate' | 'bin' | 'distribution' | 'value' | 'pivot' | 'lookup' | 'filter-domain' | 'running-total';\n by: string[];\n defaultOp?: string;\n /** Spec path controlling the operation, only when the renderer consumes it. */\n operationPath?: string;\n caveats: string[];\n}\n\nexport interface ChartCapabilities {\n fieldRoles: FieldRoleInfo[];\n requirements: DataRequirement[];\n cardinality: CardinalityGuidance[];\n aggregation: AggregationCapability;\n features: string[];\n}\n\n/** Agent-facing metadata for one chart family and its starter template. */\nexport interface ChartTypeInfo {\n /** The chart type string accepted by {@link starterSpec}. */\n type: ChartType;\n /** A one-line description of when to use this chart type. */\n purpose: string;\n /** Required channels, fields, or top-level properties needed for validity. */\n requiredChannels: string[];\n /** A minimal valid starter spec for this chart type. */\n example: ChartSpec;\n /** Additive machine-readable authoring guidance, populated by listChartTypes. */\n capabilities?: ChartCapabilities;\n}\n\nconst STARTER_SPECS = {\n line: {\n type: 'line',\n title: 'Monthly users',\n data: [\n { month: '2024-01', users: 42 },\n { month: '2024-02', users: 58 },\n { month: '2024-03', users: 64 },\n ],\n encoding: {\n x: { field: 'month', type: 'temporal' },\n y: { field: 'users' },\n },\n },\n area: {\n type: 'area',\n title: 'Monthly revenue',\n data: [\n { month: '2024-01', revenue: 120 },\n { month: '2024-02', revenue: 150 },\n { month: '2024-03', revenue: 180 },\n ],\n encoding: {\n x: { field: 'month', type: 'temporal' },\n y: { field: 'revenue' },\n },\n },\n bar: {\n type: 'bar',\n title: 'Sales by region',\n data: [\n { region: 'North', sales: 120 },\n { region: 'South', sales: 95 },\n { region: 'West', sales: 140 },\n ],\n encoding: {\n x: { field: 'region' },\n y: { field: 'sales' },\n },\n },\n scatter: {\n type: 'scatter',\n title: 'Price vs. demand',\n data: [\n { price: 10, demand: 80 },\n { price: 15, demand: 65 },\n { price: 20, demand: 48 },\n ],\n encoding: {\n x: { field: 'price' },\n y: { field: 'demand' },\n },\n },\n combo: {\n type: 'combo',\n title: 'Revenue and margin',\n data: [\n { month: 'Jan', revenue: 120, margin: 0.31 },\n { month: 'Feb', revenue: 150, margin: 0.35 },\n { month: 'Mar', revenue: 135, margin: 0.33 },\n ],\n encoding: {\n x: { field: 'month' },\n },\n layers: [\n { mark: 'bar', encoding: { y: { field: 'revenue' } } },\n { mark: 'line', axis: 'right', encoding: { y: { field: 'margin', format: '.0%' } } },\n ],\n },\n histogram: {\n type: 'histogram',\n title: 'Order value distribution',\n data: [\n { value: 12 },\n { value: 18 },\n { value: 25 },\n { value: 32 },\n ],\n encoding: {\n x: { field: 'value' },\n },\n },\n pie: {\n type: 'pie',\n title: 'Share by channel',\n data: [\n { channel: 'Direct', share: 45 },\n { channel: 'Partner', share: 30 },\n { channel: 'Search', share: 25 },\n ],\n encoding: {\n theta: { field: 'share' },\n color: { field: 'channel' },\n },\n },\n heatmap: {\n type: 'heatmap',\n title: 'Activity by day and hour',\n data: [\n { day: 'Mon', hour: 'Morning', activity: 12 },\n { day: 'Mon', hour: 'Evening', activity: 18 },\n { day: 'Tue', hour: 'Morning', activity: 9 },\n { day: 'Tue', hour: 'Evening', activity: 21 },\n ],\n encoding: {\n x: { field: 'day' },\n y: { field: 'hour' },\n color: { field: 'activity' },\n },\n },\n funnel: {\n type: 'funnel',\n title: 'Signup conversion',\n data: [\n { stage: 'Visitors', users: 1000 },\n { stage: 'Trials', users: 420 },\n { stage: 'Customers', users: 180 },\n ],\n encoding: {\n stage: { field: 'stage' },\n value: { field: 'users' },\n },\n },\n kpi: {\n type: 'kpi',\n title: 'Total revenue',\n data: [\n { revenue: 120 },\n { revenue: 150 },\n ],\n value: { field: 'revenue', aggregate: 'sum' },\n label: 'Revenue',\n },\n treemap: {\n type: 'treemap',\n title: 'Portfolio value',\n data: [\n { category: 'Product A', value: 60 },\n { category: 'Product B', value: 40 },\n { category: 'Product C', value: 25 },\n ],\n encoding: {\n category: { field: 'category' },\n value: { field: 'value' },\n },\n },\n gauge: {\n type: 'gauge',\n title: 'Quota attainment',\n data: [\n { attainment: 72 },\n { attainment: 81 },\n ],\n value: { field: 'attainment', aggregate: 'mean' },\n max: 100,\n label: 'Attainment',\n },\n bullet: {\n type: 'bullet',\n title: 'Revenue vs. target',\n data: [\n { revenue: 72 },\n { revenue: 81 },\n ],\n value: { field: 'revenue', aggregate: 'mean' },\n target: 90,\n max: 100,\n label: 'Revenue',\n },\n calendarHeatmap: {\n type: 'calendarHeatmap',\n title: 'Daily activity',\n data: [\n { date: '2024-01-01', value: 3 },\n { date: '2024-01-02', value: 7 },\n { date: '2024-01-03', value: 4 },\n ],\n encoding: {\n date: { field: 'date', type: 'temporal' },\n color: { field: 'value' },\n },\n },\n waterfall: {\n type: 'waterfall',\n title: 'Profit bridge',\n data: [\n { stage: 'Start', change: 100 },\n { stage: 'Growth', change: 35 },\n { stage: 'Costs', change: -20 },\n ],\n encoding: {\n stage: { field: 'stage' },\n value: { field: 'change' },\n },\n },\n slope: {\n type: 'slope',\n title: 'Before and after',\n data: [\n { period: 'Before', score: 42, segment: 'A' },\n { period: 'After', score: 58, segment: 'A' },\n { period: 'Before', score: 35, segment: 'B' },\n { period: 'After', score: 46, segment: 'B' },\n ],\n encoding: {\n x: { field: 'period' },\n y: { field: 'score' },\n series: { field: 'segment' },\n },\n },\n dumbbell: {\n type: 'dumbbell',\n title: 'Before and after by category',\n data: [\n { category: 'A', value: 42, group: 'Before' },\n { category: 'A', value: 58, group: 'After' },\n { category: 'B', value: 35, group: 'Before' },\n { category: 'B', value: 46, group: 'After' },\n ],\n encoding: {\n category: { field: 'category' },\n value: { field: 'value' },\n group: { field: 'group' },\n },\n },\n table: {\n type: 'table',\n title: 'Regional sales',\n data: [\n { region: 'North', sales: 120 },\n { region: 'South', sales: 95 },\n ],\n },\n matrix: {\n type: 'matrix',\n title: 'Sales matrix',\n data: [\n { region: 'North', segment: 'Consumer', sales: 120 },\n { region: 'South', segment: 'Business', sales: 95 },\n ],\n rows: ['region'],\n columns: ['segment'],\n values: [{ field: 'sales', op: 'sum' }],\n },\n box: {\n type: 'box',\n title: 'Latency by tier',\n data: [\n { tier: 'Free', latency: 120 },\n { tier: 'Free', latency: 180 },\n { tier: 'Pro', latency: 90 },\n { tier: 'Pro', latency: 110 },\n ],\n encoding: {\n x: { field: 'tier' },\n y: { field: 'latency' },\n },\n },\n sankey: {\n type: 'sankey',\n title: 'Traffic flow',\n data: [\n { source: 'Visits', target: 'Signup', value: 100 },\n { source: 'Signup', target: 'Trial', value: 60 },\n { source: 'Trial', target: 'Paid', value: 25 },\n ],\n encoding: {\n source: { field: 'source' },\n target: { field: 'target' },\n value: { field: 'value' },\n },\n },\n choropleth: {\n type: 'choropleth',\n title: 'Regional index',\n geo: {\n type: 'FeatureCollection',\n features: [\n {\n type: 'Feature',\n properties: { id: 'A' },\n geometry: { type: 'Polygon', coordinates: [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]] },\n },\n {\n type: 'Feature',\n properties: { id: 'B' },\n geometry: { type: 'Polygon', coordinates: [[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]] },\n },\n ],\n },\n data: [\n { region: 'A', value: 42 },\n { region: 'B', value: 88 },\n ],\n encoding: {\n key: { field: 'region' },\n color: { field: 'value' },\n },\n featureId: 'id',\n projection: 'identity',\n },\n radar: {\n type: 'radar',\n title: 'Product comparison',\n data: [\n { attribute: 'Speed', score: 8, product: 'Alpha' },\n { attribute: 'Speed', score: 6, product: 'Beta' },\n { attribute: 'Battery', score: 6, product: 'Alpha' },\n { attribute: 'Battery', score: 9, product: 'Beta' },\n { attribute: 'Camera', score: 9, product: 'Alpha' },\n { attribute: 'Camera', score: 7, product: 'Beta' },\n { attribute: 'Price', score: 5, product: 'Alpha' },\n { attribute: 'Price', score: 8, product: 'Beta' },\n { attribute: 'Design', score: 7, product: 'Alpha' },\n { attribute: 'Design', score: 6, product: 'Beta' },\n ],\n encoding: {\n category: { field: 'attribute' },\n value: { field: 'score' },\n series: { field: 'product' },\n },\n },\n gantt: {\n type: 'gantt',\n title: 'Launch plan',\n data: [\n { task: 'Research', start: '2024-01-02', end: '2024-01-19', team: 'Product' },\n { task: 'Design', start: '2024-01-15', end: '2024-02-09', team: 'Design' },\n { task: 'Build', start: '2024-02-01', end: '2024-03-15', team: 'Engineering' },\n { task: 'Launch', start: '2024-03-20', end: '2024-03-20', team: 'Product' },\n ],\n encoding: {\n task: { field: 'task' },\n start: { field: 'start', type: 'temporal' },\n end: { field: 'end', type: 'temporal' },\n group: { field: 'team' },\n },\n },\n sunburst: {\n type: 'sunburst',\n title: 'Revenue by region',\n data: [\n { region: 'Americas', country: 'United States', revenue: 120 },\n { region: 'Americas', country: 'Brazil', revenue: 40 },\n { region: 'Europe', country: 'Germany', revenue: 70 },\n { region: 'Europe', country: 'France', revenue: 50 },\n { region: 'Asia', country: 'Japan', revenue: 60 },\n ],\n levels: ['region', 'country'],\n encoding: {\n value: { field: 'revenue' },\n },\n },\n candlestick: {\n type: 'candlestick',\n title: 'Daily price',\n data: [\n { date: '2024-01-02', open: 100, high: 106, low: 98, close: 104 },\n { date: '2024-01-03', open: 104, high: 108, low: 101, close: 102 },\n { date: '2024-01-04', open: 102, high: 103, low: 95, close: 96 },\n { date: '2024-01-05', open: 96, high: 101, low: 94, close: 100 },\n ],\n encoding: {\n x: { field: 'date', type: 'temporal' },\n open: { field: 'open' },\n high: { field: 'high' },\n low: { field: 'low' },\n close: { field: 'close' },\n },\n },\n bubbleMap: {\n type: 'bubbleMap',\n title: 'Customers by city',\n data: [\n { city: 'Seattle', lon: -122.33, lat: 47.61, customers: 120 },\n { city: 'Chicago', lon: -87.63, lat: 41.88, customers: 260 },\n { city: 'New York', lon: -74.01, lat: 40.71, customers: 410 },\n { city: 'Austin', lon: -97.74, lat: 30.27, customers: 180 },\n ],\n encoding: {\n longitude: { field: 'lon' },\n latitude: { field: 'lat' },\n size: { field: 'customers' },\n label: { field: 'city' },\n },\n },\n radialBar: {\n type: 'radialBar',\n title: 'Goal progress',\n data: [\n { goal: 'Revenue', pct: 82 },\n { goal: 'Pipeline', pct: 64 },\n { goal: 'Retention', pct: 91 },\n { goal: 'NPS', pct: 47 },\n ],\n encoding: {\n category: { field: 'goal' },\n value: { field: 'pct' },\n },\n max: 100,\n },\n dropdown: {\n type: 'dropdown',\n title: 'Region filter',\n data: [\n { region: 'North' },\n { region: 'South' },\n ],\n field: 'region',\n },\n search: {\n type: 'search',\n title: 'Customer search',\n data: [\n { customer: 'Acme' },\n { customer: 'Globex' },\n ],\n field: 'customer',\n },\n list: {\n type: 'list',\n title: 'Category filter',\n data: [\n { category: 'Hardware' },\n { category: 'Software' },\n ],\n field: 'category',\n },\n range: {\n type: 'range',\n title: 'Price range',\n data: [\n { price: 10 },\n { price: 25 },\n ],\n field: 'price',\n },\n dateRange: {\n type: 'dateRange',\n title: 'Date range',\n data: [\n { date: '2024-01-01' },\n { date: '2024-01-31' },\n ],\n field: 'date',\n },\n} satisfies Record<ChartType, ChartSpec>;\n\nconst ALL_FIELD_TYPES: FieldType[] = ['quantitative', 'temporal', 'nominal', 'ordinal'];\nconst CATEGORY_TYPES: FieldType[] = ['nominal', 'ordinal'];\nconst role = (path: string, name: FieldRoleInfo['role'], types = ALL_FIELD_TYPES, required = true): FieldRoleInfo =>\n ({ path, role: name, types, required });\nconst measure = (path: string, required = true) => role(path, 'measure', ['quantitative'], required);\nconst category = (path: string, required = true) => role(path, 'category', CATEGORY_TYPES, required);\nconst requirement = (code: string, fields: string[], description: string): DataRequirement => ({ code, fields, description });\nconst guidance = (fields: string[], description: string, extra: Omit<CardinalityGuidance, 'fields' | 'description'> = {}): CardinalityGuidance =>\n ({ fields, description, ...extra });\nconst rows = (caveat = 'Rows are plotted as-is. FieldDef.aggregate does not group them; use an explicit aggregate transform when appropriate.'): AggregationCapability =>\n ({ mode: 'rows', by: [], caveats: [caveat] });\nconst aggregate = (by: string[], caveat: string, operationPath?: string): AggregationCapability =>\n ({ mode: 'aggregate', by, defaultOp: 'sum', ...(operationPath ? { operationPath } : {}), caveats: [caveat] });\nconst valueAggregation: AggregationCapability = {\n mode: 'value', by: [], defaultOp: 'sum', operationPath: 'value.aggregate',\n caveats: ['A literal is used directly. A field reference aggregates the rows, defaulting to sum; value, target, and comparison references choose their operations independently.'],\n};\nconst finiteMeasure = (field: string) => requirement('finite-measure', [field], 'Use finite numeric values; supported numeric strings, booleans, and Date epochs retain their existing coercion.');\nconst cartesianRoles = () => [\n role('encoding.x', 'position'), measure('encoding.y'),\n role('encoding.series', 'series', ALL_FIELD_TYPES, false),\n];\nconst orderedKeys = () => guidance(\n ['encoding.x', 'encoding.series'], 'Prefer one observation at each position within a series. Repeated keys need an explicit decision.', { unique: true },\n);\nconst seriesGuidance = () => guidance(['encoding.series'], 'Legibility depends on the target size; no series are grouped automatically.', { recommendedMaximum: 12 });\nconst metadata = (\n purpose: string, requiredChannels: string[], fieldRoles: FieldRoleInfo[], aggregation: AggregationCapability,\n requirements: DataRequirement[], cardinality: CardinalityGuidance[], features: string[],\n) => ({\n purpose, requiredChannels,\n capabilities: { fieldRoles, aggregation, requirements, cardinality, features: ['transform', ...features] },\n});\nconst slicer = (purpose: string, type: FieldType | undefined, features: string[]) => metadata(\n purpose, ['field'], [role('field', 'filter', type ? [type] : ALL_FIELD_TYPES)],\n {\n mode: 'filter-domain', by: ['field'], defaultOp: type === 'quantitative' || type === 'temporal' ? 'extent' : 'distinct',\n caveats: ['Builds an option/range domain and publishes a selection; does not aggregate measures. Browser interaction and static headless snapshots differ.'],\n },\n [requirement('field-values', ['field'], type === 'temporal' ? 'Use supported dates; local calendar strings retain local-date semantics.'\n : type === 'quantitative' ? 'Use finite numeric values for the range.' : 'Use field values suitable for display and selection.')],\n [guidance(['field'], type ? 'A constant field has no nonzero selectable interval.' : 'For many distinct options prefer search or dropdown over a long checkbox list.')],\n ['selection-param', 'browser-interaction', 'static-snapshot', ...features],\n);\n\n// One exhaustive metadata record, driven by the same CHART_TYPES/starter contract.\nconst CHART_METADATA = {\n line: metadata('Trend over time', ['x', 'y'], cartesianRoles(), rows(),\n [finiteMeasure('encoding.y')],\n [orderedKeys(), seriesGuidance()],\n ['series', 'area-fill', 'facet', 'trendline', 'insights', 'data-labels']),\n area: metadata('Part-to-whole or filled trend over time', ['x', 'y'],\n [...cartesianRoles(), measure('encoding.y2', false)], rows(),\n [finiteMeasure('encoding.y'), requirement('stack-semantics', ['stack'], 'Choose stacking explicitly; gaps do not establish zero observations.')],\n [orderedKeys(), seriesGuidance()],\n ['series', 'stack', 'range-band', 'facet', 'trendline', 'insights']),\n bar: metadata('Compare categories', ['x', 'y'], cartesianRoles(), rows(),\n [finiteMeasure('encoding.y'), requirement('zero-baseline', ['encoding.y.scale'], 'Bar length needs a zero baseline unless the caller explicitly chooses a truncated scale.')],\n [orderedKeys(), guidance(['encoding.x'], 'More categories need more space or an explicit alternative; no top-N filtering is automatic.', { recommendedMaximum: 30 }), seriesGuidance()],\n ['series', 'stack', 'horizontal', 'facet', 'insights', 'data-labels']),\n scatter: metadata('Correlation or distribution across two measures', ['x', 'y'],\n [role('encoding.x', 'position'), measure('encoding.y'), role('encoding.size', 'size', ['quantitative'], false), role('encoding.color', 'category', ALL_FIELD_TYPES, false)],\n rows('Observations remain separate; overlapping points may be draw-side reduced at high density, not aggregated into new data.'),\n [finiteMeasure('encoding.y'), requirement('nonnegative-size', ['encoding.size'], 'When supplied, size needs nonnegative finite values.')],\n [guidance(['encoding.x', 'encoding.y'], 'Dense point clouds may overlap; inspect render evidence rather than assuming every point is distinguishable.')],\n ['bubble-size', 'continuous-color', 'series', 'facet', 'trendline', 'density-reduction']),\n combo: metadata('Two measures or mark types on a shared axis', ['x', 'layers[].mark', 'layers[].encoding.y'],\n [role('encoding.x', 'position'), measure('layers[].encoding.y')], rows(),\n [finiteMeasure('layers[].encoding.y'), requirement('explicit-units', ['layers[].axis'], 'A right axis is an explicit choice; different units are never inferred.')],\n [guidance(['layers'], 'Use a small number of distinct, clearly labeled measures.', { minimum: 1, recommendedMaximum: 3 })],\n ['layered-marks', 'shared-x', 'dual-axis']),\n histogram: metadata('Distribution of one quantitative measure', ['x'], [measure('encoding.x')],\n { mode: 'bin', by: ['encoding.x'], defaultOp: 'count', caveats: ['Bins finite observations and counts them; density changes normalization. FieldDef.aggregate is not a bin operation.'] },\n [finiteMeasure('encoding.x')],\n [guidance(['encoding.x'], 'Constant or singleton inputs have limited distribution evidence.', { minimum: 1 })],\n ['automatic-bins', 'bin-controls', 'density']),\n pie: metadata('Composition of a total', ['theta', 'color'],\n [measure('encoding.theta'), category('encoding.color')],\n aggregate(['encoding.color'], 'Repeated categories aggregate theta (sum by default). Nonpositive slice results cannot express a signed composition.', 'encoding.theta.aggregate'),\n [requirement('nonnegative-composition', ['encoding.theta'], 'A meaningful part-to-whole view needs nonnegative shares and a positive total; do not silently discard negative shares.')],\n [guidance(['encoding.color'], 'Prefer bars or an explicit alternative for many slices; small shares may need callouts.', { recommendedMaximum: 7 })],\n ['donut', 'callout-labels', 'percent-labels']),\n heatmap: metadata('Density across two categories', ['x', 'y', 'color'],\n [category('encoding.x'), category('encoding.y'), measure('encoding.color')],\n { mode: 'lookup', by: ['encoding.x', 'encoding.y'], defaultOp: 'last', caveats: ['Repeated cells overpaint in input order; the last finite value is visible. No cell aggregation or gap filling is implied.'] },\n [finiteMeasure('encoding.color')],\n [guidance(['encoding.x', 'encoding.y'], 'Prefer unique cells. Absent combinations remain absent; cell-label legibility depends on both axis counts and size.', { unique: true })],\n ['cell-labels', 'continuous-color']),\n funnel: metadata('Conversion through stages', ['stage', 'value'],\n [category('encoding.stage'), measure('encoding.value')],\n aggregate(['encoding.stage'], 'Sums values per stage in first-seen order; FieldDef.aggregate does not change this operation.'),\n [requirement('ordered-stages', ['encoding.stage', 'encoding.value'], 'Choose meaningful stage order and nonnegative counts; decreasing values support conversion interpretation.')],\n [guidance(['encoding.stage'], 'Keep stages few enough to compare and label.', { recommendedMaximum: 12 })],\n ['conversion-percent', 'stage-order']),\n kpi: metadata('Single headline value or compact scorecard', ['value'],\n [measure('value'), role('delta', 'measure', ['quantitative'], false)], valueAggregation,\n [requirement('literal-or-aggregate', ['value'], 'Supply a finite literal or explicitly choose a field aggregation; summing rates/identifiers is not justified by their numeric type.')],\n [guidance(['value'], 'A headline resolves to one value, even when source data has many rows.')],\n ['literal-value', 'delta', 'sparkline', 'comparisons', 'unit']),\n treemap: metadata('Hierarchical or categorical part-to-whole', ['category', 'value'],\n [category('encoding.category'), measure('encoding.value'), category('encoding.group', false), role('encoding.color', 'category', ALL_FIELD_TYPES, false)],\n aggregate(['encoding.group', 'encoding.category'], 'Sums positive finite values within each group/category; nonpositive rows do not produce area and FieldDef.aggregate is not consumed.'),\n [requirement('positive-area', ['encoding.value'], 'Area requires positive finite weights. Signed composition needs an explicit alternative.')],\n [guidance(['encoding.category'], 'Many or highly skewed weights create small unlabeled tiles; inspect label omissions.')],\n ['group-hierarchy', 'tile-labels', 'continuous-color']),\n gauge: metadata('Single value against a scale', ['value', 'max'],\n [measure('value'), role('max', 'target', ['quantitative']), role('target', 'target', ['quantitative'], false)], valueAggregation,\n [requirement('bounded-scale', ['min', 'max'], 'Choose a finite maximum greater than the minimum; a target alone does not establish a maximum.')],\n [guidance(['value'], 'One resolved value per gauge; use multiple views for independent KPIs.')],\n ['literal-value', 'target', 'compare', 'bands', 'legend']),\n bullet: metadata('Compact KPI versus a target', ['value'],\n [measure('value'), role('target', 'target', ['quantitative'], false)], valueAggregation,\n [requirement('comparable-target', ['value', 'target', 'ranges'], 'Targets and qualitative ranges must use the same caller-defined units as the value.')],\n [guidance(['value'], 'One resolved KPI per bullet graph.')],\n ['literal-value', 'target', 'qualitative-ranges']),\n calendarHeatmap: metadata('Daily values over a year', ['date', 'color'],\n [role('encoding.date', 'time', ['temporal']), measure('encoding.color')],\n aggregate(['encoding.date'], 'Sums finite values within each local calendar day. Missing days are not zero and daily aggregation must be meaningful.'),\n [requirement('valid-calendar-date', ['encoding.date'], 'Use valid dates; explicit offsets and local bare calendar dates keep their existing parsing semantics.'), finiteMeasure('encoding.color')],\n [guidance(['encoding.date'], 'Dense daily data over roughly a year fits the calendar idiom; long spans need more space.')],\n ['local-calendar', 'continuous-color']),\n waterfall: metadata('Running total or bridge of signed deltas', ['stage', 'value'],\n [category('encoding.stage'), measure('encoding.value')],\n { mode: 'running-total', by: [], defaultOp: 'sum', caveats: ['Each row is an ordered signed step. Repeated stage labels are not grouped; totals/subtotals are explicit configuration.'] },\n [finiteMeasure('encoding.value'), requirement('ordered-deltas', ['encoding.stage'], 'The row order and whether values are deltas are caller decisions, not consequences of numeric signs.')],\n [guidance(['encoding.stage'], 'A short bridge is easier to label and audit.', { recommendedMaximum: 20 })],\n ['signed-deltas', 'total', 'subtotals']),\n slope: metadata('Before/after change across series', ['x', 'y', 'series'],\n [role('encoding.x', 'position'), measure('encoding.y'), role('encoding.series', 'series')],\n { mode: 'lookup', by: ['encoding.series', 'encoding.x'], defaultOp: 'first', caveats: ['Uses the first usable value at each series/position; repeated keys are not summed. Missing endpoints are not invented.'] },\n [finiteMeasure('encoding.y'), requirement('comparable-endpoints', ['encoding.x', 'encoding.series'], 'Before/after interpretation requires comparable positions for each series.')],\n [guidance(['encoding.x'], 'Two positions support before/after comparison; additional positions are supported but change the interpretation.', { minimum: 2, recommendedMaximum: 2 }), orderedKeys(), seriesGuidance()],\n ['endpoint-labels', 'color-by-change']),\n dumbbell: metadata('Gap between two groups by category', ['category', 'value', 'group'],\n [category('encoding.category'), measure('encoding.value'), role('encoding.group', 'series')],\n rows('Retains finite dots per category/group without aggregating duplicates. More than two groups are supported, but do not imply a single before/after pair.'),\n [finiteMeasure('encoding.value'), requirement('comparable-groups', ['encoding.group'], 'Choose comparable group meanings; missing pairs remain missing.')],\n [guidance(['encoding.group'], 'Two groups make one gap easiest to interpret.', { minimum: 2, recommendedMaximum: 2 }), guidance(['encoding.category', 'encoding.group'], 'Prefer one value per comparison endpoint.', { unique: true })],\n ['gap-sort', 'multiple-groups', 'dot-labels']),\n table: metadata('Tabular detail', [], [role('columns[].field', 'text', ALL_FIELD_TYPES, false)],\n rows('Displays individual rows. Optional totals aggregate columns separately; they do not replace the detail rows.'),\n [requirement('column-discovery', ['columns'], 'Declare columns for intentional ordering and explicit heterogeneous/nested field visibility.')],\n [guidance(['columns'], 'Browser tables support scrolling; static headless output can only display rows/columns that fit.')],\n ['sorting', 'scrolling', 'totals', 'groups', 'conditional-format', 'sparklines', 'frozen-columns', 'row-selection', 'static-snapshot']),\n matrix: metadata('Pivot or cross-tab summary', ['rows', 'values'],\n [category('rows[]'), category('columns[]', false), measure('values[].field')],\n { mode: 'pivot', by: ['rows[]', 'columns[]'], defaultOp: 'sum', operationPath: 'values[].op', caveats: ['Aggregates records at each pivot cell with an explicit operation (sum by default). showAs computes percentages from leaf-cell denominators.'] },\n [requirement('aggregation-choice', ['values[].op'], 'Choose the aggregation and denominator deliberately; numeric type alone does not justify summation.')],\n [guidance(['rows[]', 'columns[]'], 'Cell count grows with the product of distinct keys; sparse cells do not establish zero observations.')],\n ['pivot', 'totals', 'show-as-percent', 'conditional-format', 'expand-collapse', 'row-sort', 'cross-filter', 'scrolling', 'static-snapshot']),\n box: metadata('Spread and distribution by group', ['x', 'y'],\n [category('encoding.x'), measure('encoding.y'), role('encoding.series', 'series', ALL_FIELD_TYPES, false)],\n { mode: 'distribution', by: ['encoding.x', 'encoding.series'], defaultOp: 'quartiles', caveats: ['Summarizes finite raw observations as quartiles/whiskers/outliers; do not pass precomputed means as though they were a distribution.'] },\n [finiteMeasure('encoding.y')],\n [guidance(['encoding.x', 'encoding.series'], 'Multiple observations per group are needed to convey a meaningful spread; singleton/constant groups are degenerate.')],\n ['quartiles', 'whiskers', 'outliers', 'series']),\n sankey: metadata('Flows between nodes', ['source', 'target', 'value'],\n [role('encoding.source', 'category'), role('encoding.target', 'category'), measure('encoding.value')],\n rows('Each positive finite row is a link; repeated links remain separate. Node magnitude is derived from incident flows.'),\n [requirement('acyclic-positive-flow', ['encoding.source', 'encoding.target', 'encoding.value'], 'Use nonempty distinct endpoints and positive weights. Self-links and feedback/cyclic links cannot all be represented.')],\n [guidance(['encoding.source', 'encoding.target'], 'Many nodes or links need more space; omitted labels and feedback links require review.')],\n ['flow-width', 'node-labels']),\n choropleth: metadata('Values over map regions', ['geo', 'key', 'color', 'featureId'],\n [role('encoding.key', 'geography'), measure('encoding.color')],\n { mode: 'lookup', by: ['encoding.key'], defaultOp: 'last', caveats: ['The last finite value for each nonempty join key is used. Unmatched data/geometry is not a zero observation; repeated keys are not summed.'] },\n [requirement('geojson-join', ['geo', 'featureId', 'encoding.key'], 'Supply geometry and an explicit matching feature property; neither geometry nor geographic meaning is inferred from names.'), finiteMeasure('encoding.color')],\n [guidance(['encoding.key'], 'Prefer one measure per feature key and review join coverage.', { unique: true })],\n ['geojson', 'projection', 'continuous-color']),\n radar: metadata('Compare several measures across series', ['category', 'value'],\n [category('encoding.category'), measure('encoding.value'), role('encoding.series', 'series', ALL_FIELD_TYPES, false)],\n { mode: 'lookup', by: ['encoding.series', 'encoding.category'], defaultOp: 'first', caveats: ['Uses the first finite value at each series/spoke; repeated keys are not summed and missing spokes are not invented.'] },\n [finiteMeasure('encoding.value'), requirement('comparable-scale', ['encoding.value', 'max'], 'Every spoke shares one radial scale, so measures need comparable units (scores, percentages, normalized values).')],\n [guidance(['encoding.category'], 'Three to about ten spokes read well; fewer than three cannot enclose an area.', { minimum: 3, recommendedMaximum: 10 }), guidance(['encoding.series'], 'A few overlapping polygons stay distinguishable.', { recommendedMaximum: 5 })],\n ['series', 'polygon-grid', 'circle-grid', 'fill', 'points']),\n gantt: metadata('Schedule of tasks over time', ['task', 'start', 'end'],\n [category('encoding.task'), role('encoding.start', 'time', ['temporal', 'quantitative']), role('encoding.end', 'time', ['temporal', 'quantitative']),\n role('encoding.group', 'series', CATEGORY_TYPES, false), role('encoding.progress', 'measure', ['quantitative'], false)],\n rows('Each row is one bar (or a milestone when end equals start); repeated tasks share a lane and are not merged.'),\n [requirement('ordered-interval', ['encoding.start', 'encoding.end'], 'Each row needs a valid start and an end at or after it; reversed or missing bounds are not reordered or invented.'),\n requirement('progress-fraction', ['encoding.progress'], 'When supplied, progress is a fraction from 0 to 1.')],\n [guidance(['encoding.task'], 'Each lane needs vertical room for its label; long plans need more height.', { recommendedMaximum: 30 })],\n ['milestones', 'progress', 'group-color', 'lane-sort', 'annotations']),\n sunburst: metadata('Hierarchical part-to-whole in rings', ['levels', 'value'],\n [category('levels[]'), measure('encoding.value')],\n aggregate(['levels[]'], 'Sums positive finite values at every level of the hierarchy; nonpositive rows add no angle and FieldDef.aggregate is not consumed.'),\n [requirement('positive-weights', ['encoding.value'], 'Arc angles need positive finite weights. Signed composition needs an explicit alternative.'),\n requirement('consistent-hierarchy', ['levels[]'], 'Each row carries every level field; missing parents are not inferred.')],\n [guidance(['levels[]'], 'Two to four rings stay legible; outer rings get thin with many leaves.', { minimum: 1, recommendedMaximum: 4 })],\n ['hierarchy', 'center-total', 'arc-labels']),\n candlestick: metadata('Open/high/low/close price action over time', ['x', 'open', 'high', 'low', 'close'],\n [role('encoding.x', 'time', ['temporal', 'ordinal', 'nominal']), measure('encoding.open'), measure('encoding.high'), measure('encoding.low'), measure('encoding.close')],\n rows('Each row is one period; repeated periods draw separate candles and are not merged.'),\n [requirement('ohlc-range', ['encoding.open', 'encoding.high', 'encoding.low', 'encoding.close'], 'Use finite prices where low \u2264 open, close \u2264 high; inconsistent ranges are drawn to their extremes rather than corrected.')],\n [guidance(['encoding.x'], 'Candles narrow as periods increase; very long series read better as a line.', { recommendedMaximum: 250 })],\n ['ohlc-style', 'up-down-colors', 'annotations']),\n bubbleMap: metadata('Sized points over geography', ['longitude', 'latitude'],\n [role('encoding.longitude', 'geography', ['quantitative']), role('encoding.latitude', 'geography', ['quantitative']),\n role('encoding.size', 'size', ['quantitative'], false), role('encoding.color', 'category', ALL_FIELD_TYPES, false), role('encoding.label', 'text', ALL_FIELD_TYPES, false)],\n rows('Each row is one bubble at its coordinates; nearby rows overlap rather than being clustered or summed. Rows with unusable coordinates or sizes, or (over a basemap) off the map, are omitted and counted.'),\n [requirement('valid-coordinates', ['encoding.longitude', 'encoding.latitude'], 'Longitude must be in \u2212180\u2026180 and latitude in \u221290\u202690 degrees; names are never geocoded.'),\n requirement('nonnegative-size', ['encoding.size'], 'When supplied, size needs nonnegative finite values: non-finite sizes are omitted, and a negative size keeps only its location (a hollow ring, not an area).')],\n [guidance(['encoding.longitude', 'encoding.latitude'], 'Dense points overlap; inspect render evidence rather than assuming every bubble is distinguishable.')],\n ['geojson-basemap', 'projection', 'bubble-size', 'size-legend', 'continuous-color', 'categorical-color', 'bubble-labels']),\n radialBar: metadata('Category values as arcs around a center', ['category', 'value'],\n [category('encoding.category'), measure('encoding.value')],\n aggregate(['encoding.category'], 'Sums finite nonnegative values per category in first-seen order; negative and non-numeric rows are omitted and counted. FieldDef.aggregate does not change this operation.'),\n [requirement('nonnegative-values', ['encoding.value'], 'Arc length and wedge area need nonnegative values; choose max explicitly for percentages.')],\n [guidance(['encoding.category'], 'A handful of rings or wedges stays legible.', { recommendedMaximum: 12 })],\n ['radial-layout', 'polar-layout', 'tracks', 'max']),\n dropdown: slicer('Single- or multi-select field filter', undefined, ['single-select', 'multiple-select']),\n search: slicer('Text search filter for a field', undefined, ['text-search']),\n list: slicer('Checkbox list filter for a field', undefined, ['multiple-select']),\n range: slicer('Numeric range filter for a field', 'quantitative', ['numeric-range']),\n dateRange: slicer('Temporal range filter for a field', 'temporal', ['date-range', 'presets']),\n} satisfies Record<ChartType, Omit<ChartTypeInfo, 'type' | 'example'> & { capabilities: ChartCapabilities }>;\n\nfunction cloneSpec(spec: ChartSpec): ChartSpec {\n return JSON.parse(JSON.stringify(spec)) as ChartSpec;\n}\n\n/**\n * Return a minimal valid starter spec for a chart type, including placeholder\n * inline data whose fields match the spec's encodings and field references.\n */\nexport function starterSpec(type: ChartType): ChartSpec {\n return cloneSpec(STARTER_SPECS[type]);\n}\n\n/**\n * List every registered chart/slicer type, machine-readable data requirements\n * and capabilities, and a ready-to-render starter. Guidance never transforms data.\n */\nexport function listChartTypes(): (ChartTypeInfo & { capabilities: ChartCapabilities })[] {\n return CHART_TYPES.map((type) => ({\n type,\n purpose: CHART_METADATA[type].purpose,\n requiredChannels: [...chartDefinition(type).requiredChannels],\n example: starterSpec(type),\n capabilities: JSON.parse(JSON.stringify(CHART_METADATA[type].capabilities)) as ChartCapabilities,\n }));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|