@opendata-ai/openchart-core 8.0.0-rc.9 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +403 -45
  3. package/dist/index.js +50 -18
  4. package/dist/index.js.map +1 -1
  5. package/dist/styles.css +1 -1
  6. package/dist/styles.css.map +1 -1
  7. package/package.json +1 -2
  8. package/schema/chart.schema.json +375 -69
  9. package/schema/table.schema.json +35 -1
  10. package/schema/vizspec.schema.json +992 -171
  11. package/src/accessibility/__tests__/alt-text.test.ts +0 -110
  12. package/src/accessibility/__tests__/aria.test.ts +0 -125
  13. package/src/accessibility/alt-text.ts +0 -155
  14. package/src/accessibility/aria.ts +0 -75
  15. package/src/accessibility/index.ts +0 -6
  16. package/src/colors/__tests__/colorblind.test.ts +0 -75
  17. package/src/colors/__tests__/contrast.test.ts +0 -119
  18. package/src/colors/__tests__/palettes.test.ts +0 -74
  19. package/src/colors/colorblind.ts +0 -131
  20. package/src/colors/contrast.ts +0 -143
  21. package/src/colors/index.ts +0 -36
  22. package/src/colors/palettes.ts +0 -206
  23. package/src/helpers/__tests__/deep-merge.test.ts +0 -54
  24. package/src/helpers/__tests__/spec-builders.test.ts +0 -338
  25. package/src/helpers/deep-merge.ts +0 -29
  26. package/src/helpers/spec-builders.ts +0 -479
  27. package/src/index.ts +0 -215
  28. package/src/labels/__tests__/collision.test.ts +0 -310
  29. package/src/labels/collision.ts +0 -249
  30. package/src/labels/index.ts +0 -13
  31. package/src/layout/__tests__/chrome.test.ts +0 -208
  32. package/src/layout/__tests__/text-measure.test.ts +0 -57
  33. package/src/layout/chrome.ts +0 -470
  34. package/src/layout/index.ts +0 -18
  35. package/src/layout/text-measure.ts +0 -404
  36. package/src/layout/text-wrap.ts +0 -93
  37. package/src/locale/__tests__/format.test.ts +0 -606
  38. package/src/locale/format.ts +0 -459
  39. package/src/locale/index.ts +0 -21
  40. package/src/responsive/__tests__/breakpoints.test.ts +0 -146
  41. package/src/responsive/__tests__/metrics.test.ts +0 -52
  42. package/src/responsive/breakpoints.ts +0 -177
  43. package/src/responsive/index.ts +0 -53
  44. package/src/responsive/metrics.ts +0 -299
  45. package/src/schema/__tests__/generated-artifacts.test.ts +0 -42
  46. package/src/schema/__tests__/schema.test.ts +0 -179
  47. package/src/styles/__tests__/reduced-motion-selectors.test.ts +0 -28
  48. package/src/styles/animation.css +0 -213
  49. package/src/styles/base.css +0 -102
  50. package/src/styles/chrome.css +0 -174
  51. package/src/styles/dark.css +0 -44
  52. package/src/styles/graph.css +0 -135
  53. package/src/styles/index.css +0 -28
  54. package/src/styles/keyframes.css +0 -151
  55. package/src/styles/legend.css +0 -18
  56. package/src/styles/reduced-motion.css +0 -67
  57. package/src/styles/series-search.css +0 -153
  58. package/src/styles/sparkline.css +0 -16
  59. package/src/styles/table-animation.css +0 -93
  60. package/src/styles/table.css +0 -398
  61. package/src/styles/token-definitions.ts +0 -199
  62. package/src/styles/tokens.css +0 -156
  63. package/src/styles/tooltip.css +0 -126
  64. package/src/styles/you-draw-it.css +0 -126
  65. package/src/theme/__tests__/dark-mode.test.ts +0 -232
  66. package/src/theme/__tests__/defaults.test.ts +0 -73
  67. package/src/theme/__tests__/resolve.test.ts +0 -277
  68. package/src/theme/dark-mode.ts +0 -258
  69. package/src/theme/defaults.ts +0 -110
  70. package/src/theme/index.ts +0 -8
  71. package/src/theme/presets.ts +0 -64
  72. package/src/theme/resolve.ts +0 -312
  73. package/src/types/__tests__/encoding.test.ts +0 -368
  74. package/src/types/__tests__/gradient.test.ts +0 -95
  75. package/src/types/__tests__/spec.test.ts +0 -499
  76. package/src/types/encoding.ts +0 -280
  77. package/src/types/events.ts +0 -236
  78. package/src/types/index.ts +0 -290
  79. package/src/types/layout.ts +0 -2024
  80. package/src/types/schema-roots.ts +0 -32
  81. package/src/types/spec.ts +0 -2925
  82. package/src/types/table.ts +0 -108
  83. package/src/types/theme.ts +0 -209
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "size": {
113
113
  "type": "number",
114
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
114
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
115
115
  },
116
116
  "filled": {
117
117
  "type": "boolean",
@@ -152,8 +152,15 @@
152
152
  "description": "Clip marks to the chart area."
153
153
  },
154
154
  "trendline": {
155
- "type": "boolean",
156
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
155
+ "anyOf": [
156
+ {
157
+ "type": "boolean"
158
+ },
159
+ {
160
+ "$ref": "#/definitions/TrendlineConfig"
161
+ }
162
+ ],
163
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
157
164
  },
158
165
  "dx": {
159
166
  "type": "number",
@@ -380,7 +387,7 @@
380
387
  },
381
388
  "size": {
382
389
  "type": "number",
383
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
390
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
384
391
  },
385
392
  "filled": {
386
393
  "type": "boolean",
@@ -421,8 +428,15 @@
421
428
  "description": "Clip marks to the chart area."
422
429
  },
423
430
  "trendline": {
424
- "type": "boolean",
425
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
431
+ "anyOf": [
432
+ {
433
+ "type": "boolean"
434
+ },
435
+ {
436
+ "$ref": "#/definitions/TrendlineConfig"
437
+ }
438
+ ],
439
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
426
440
  },
427
441
  "dx": {
428
442
  "type": "number",
@@ -649,7 +663,7 @@
649
663
  },
650
664
  "size": {
651
665
  "type": "number",
652
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
666
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
653
667
  },
654
668
  "filled": {
655
669
  "type": "boolean",
@@ -690,8 +704,15 @@
690
704
  "description": "Clip marks to the chart area."
691
705
  },
692
706
  "trendline": {
693
- "type": "boolean",
694
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
707
+ "anyOf": [
708
+ {
709
+ "type": "boolean"
710
+ },
711
+ {
712
+ "$ref": "#/definitions/TrendlineConfig"
713
+ }
714
+ ],
715
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
695
716
  },
696
717
  "dx": {
697
718
  "type": "number",
@@ -918,7 +939,7 @@
918
939
  },
919
940
  "size": {
920
941
  "type": "number",
921
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
942
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
922
943
  },
923
944
  "filled": {
924
945
  "type": "boolean",
@@ -959,8 +980,15 @@
959
980
  "description": "Clip marks to the chart area."
960
981
  },
961
982
  "trendline": {
962
- "type": "boolean",
963
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
983
+ "anyOf": [
984
+ {
985
+ "type": "boolean"
986
+ },
987
+ {
988
+ "$ref": "#/definitions/TrendlineConfig"
989
+ }
990
+ ],
991
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
964
992
  },
965
993
  "dx": {
966
994
  "type": "number",
@@ -1187,7 +1215,7 @@
1187
1215
  },
1188
1216
  "size": {
1189
1217
  "type": "number",
1190
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
1218
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
1191
1219
  },
1192
1220
  "filled": {
1193
1221
  "type": "boolean",
@@ -1228,8 +1256,15 @@
1228
1256
  "description": "Clip marks to the chart area."
1229
1257
  },
1230
1258
  "trendline": {
1231
- "type": "boolean",
1232
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
1259
+ "anyOf": [
1260
+ {
1261
+ "type": "boolean"
1262
+ },
1263
+ {
1264
+ "$ref": "#/definitions/TrendlineConfig"
1265
+ }
1266
+ ],
1267
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
1233
1268
  },
1234
1269
  "dx": {
1235
1270
  "type": "number",
@@ -1456,7 +1491,7 @@
1456
1491
  },
1457
1492
  "size": {
1458
1493
  "type": "number",
1459
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
1494
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
1460
1495
  },
1461
1496
  "filled": {
1462
1497
  "type": "boolean",
@@ -1497,8 +1532,15 @@
1497
1532
  "description": "Clip marks to the chart area."
1498
1533
  },
1499
1534
  "trendline": {
1500
- "type": "boolean",
1501
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
1535
+ "anyOf": [
1536
+ {
1537
+ "type": "boolean"
1538
+ },
1539
+ {
1540
+ "$ref": "#/definitions/TrendlineConfig"
1541
+ }
1542
+ ],
1543
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
1502
1544
  },
1503
1545
  "dx": {
1504
1546
  "type": "number",
@@ -1725,7 +1767,7 @@
1725
1767
  },
1726
1768
  "size": {
1727
1769
  "type": "number",
1728
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
1770
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
1729
1771
  },
1730
1772
  "filled": {
1731
1773
  "type": "boolean",
@@ -1766,8 +1808,15 @@
1766
1808
  "description": "Clip marks to the chart area."
1767
1809
  },
1768
1810
  "trendline": {
1769
- "type": "boolean",
1770
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
1811
+ "anyOf": [
1812
+ {
1813
+ "type": "boolean"
1814
+ },
1815
+ {
1816
+ "$ref": "#/definitions/TrendlineConfig"
1817
+ }
1818
+ ],
1819
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
1771
1820
  },
1772
1821
  "dx": {
1773
1822
  "type": "number",
@@ -1994,7 +2043,7 @@
1994
2043
  },
1995
2044
  "size": {
1996
2045
  "type": "number",
1997
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
2046
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
1998
2047
  },
1999
2048
  "filled": {
2000
2049
  "type": "boolean",
@@ -2035,8 +2084,15 @@
2035
2084
  "description": "Clip marks to the chart area."
2036
2085
  },
2037
2086
  "trendline": {
2038
- "type": "boolean",
2039
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
2087
+ "anyOf": [
2088
+ {
2089
+ "type": "boolean"
2090
+ },
2091
+ {
2092
+ "$ref": "#/definitions/TrendlineConfig"
2093
+ }
2094
+ ],
2095
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
2040
2096
  },
2041
2097
  "dx": {
2042
2098
  "type": "number",
@@ -2263,7 +2319,7 @@
2263
2319
  },
2264
2320
  "size": {
2265
2321
  "type": "number",
2266
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
2322
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
2267
2323
  },
2268
2324
  "filled": {
2269
2325
  "type": "boolean",
@@ -2304,8 +2360,15 @@
2304
2360
  "description": "Clip marks to the chart area."
2305
2361
  },
2306
2362
  "trendline": {
2307
- "type": "boolean",
2308
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
2363
+ "anyOf": [
2364
+ {
2365
+ "type": "boolean"
2366
+ },
2367
+ {
2368
+ "$ref": "#/definitions/TrendlineConfig"
2369
+ }
2370
+ ],
2371
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
2309
2372
  },
2310
2373
  "dx": {
2311
2374
  "type": "number",
@@ -2532,7 +2595,7 @@
2532
2595
  },
2533
2596
  "size": {
2534
2597
  "type": "number",
2535
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
2598
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
2536
2599
  },
2537
2600
  "filled": {
2538
2601
  "type": "boolean",
@@ -2573,8 +2636,15 @@
2573
2636
  "description": "Clip marks to the chart area."
2574
2637
  },
2575
2638
  "trendline": {
2576
- "type": "boolean",
2577
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
2639
+ "anyOf": [
2640
+ {
2641
+ "type": "boolean"
2642
+ },
2643
+ {
2644
+ "$ref": "#/definitions/TrendlineConfig"
2645
+ }
2646
+ ],
2647
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
2578
2648
  },
2579
2649
  "dx": {
2580
2650
  "type": "number",
@@ -2801,7 +2871,7 @@
2801
2871
  },
2802
2872
  "size": {
2803
2873
  "type": "number",
2804
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
2874
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
2805
2875
  },
2806
2876
  "filled": {
2807
2877
  "type": "boolean",
@@ -2842,8 +2912,15 @@
2842
2912
  "description": "Clip marks to the chart area."
2843
2913
  },
2844
2914
  "trendline": {
2845
- "type": "boolean",
2846
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
2915
+ "anyOf": [
2916
+ {
2917
+ "type": "boolean"
2918
+ },
2919
+ {
2920
+ "$ref": "#/definitions/TrendlineConfig"
2921
+ }
2922
+ ],
2923
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
2847
2924
  },
2848
2925
  "dx": {
2849
2926
  "type": "number",
@@ -3070,7 +3147,7 @@
3070
3147
  },
3071
3148
  "size": {
3072
3149
  "type": "number",
3073
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
3150
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
3074
3151
  },
3075
3152
  "filled": {
3076
3153
  "type": "boolean",
@@ -3111,8 +3188,15 @@
3111
3188
  "description": "Clip marks to the chart area."
3112
3189
  },
3113
3190
  "trendline": {
3114
- "type": "boolean",
3115
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
3191
+ "anyOf": [
3192
+ {
3193
+ "type": "boolean"
3194
+ },
3195
+ {
3196
+ "$ref": "#/definitions/TrendlineConfig"
3197
+ }
3198
+ ],
3199
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
3116
3200
  },
3117
3201
  "dx": {
3118
3202
  "type": "number",
@@ -3339,7 +3423,7 @@
3339
3423
  },
3340
3424
  "size": {
3341
3425
  "type": "number",
3342
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
3426
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
3343
3427
  },
3344
3428
  "filled": {
3345
3429
  "type": "boolean",
@@ -3380,8 +3464,15 @@
3380
3464
  "description": "Clip marks to the chart area."
3381
3465
  },
3382
3466
  "trendline": {
3383
- "type": "boolean",
3384
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
3467
+ "anyOf": [
3468
+ {
3469
+ "type": "boolean"
3470
+ },
3471
+ {
3472
+ "$ref": "#/definitions/TrendlineConfig"
3473
+ }
3474
+ ],
3475
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
3385
3476
  },
3386
3477
  "dx": {
3387
3478
  "type": "number",
@@ -3608,7 +3699,7 @@
3608
3699
  },
3609
3700
  "size": {
3610
3701
  "type": "number",
3611
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
3702
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
3612
3703
  },
3613
3704
  "filled": {
3614
3705
  "type": "boolean",
@@ -3649,8 +3740,15 @@
3649
3740
  "description": "Clip marks to the chart area."
3650
3741
  },
3651
3742
  "trendline": {
3652
- "type": "boolean",
3653
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
3743
+ "anyOf": [
3744
+ {
3745
+ "type": "boolean"
3746
+ },
3747
+ {
3748
+ "$ref": "#/definitions/TrendlineConfig"
3749
+ }
3750
+ ],
3751
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
3654
3752
  },
3655
3753
  "dx": {
3656
3754
  "type": "number",
@@ -3877,7 +3975,7 @@
3877
3975
  },
3878
3976
  "size": {
3879
3977
  "type": "number",
3880
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
3978
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
3881
3979
  },
3882
3980
  "filled": {
3883
3981
  "type": "boolean",
@@ -3918,8 +4016,15 @@
3918
4016
  "description": "Clip marks to the chart area."
3919
4017
  },
3920
4018
  "trendline": {
3921
- "type": "boolean",
3922
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
4019
+ "anyOf": [
4020
+ {
4021
+ "type": "boolean"
4022
+ },
4023
+ {
4024
+ "$ref": "#/definitions/TrendlineConfig"
4025
+ }
4026
+ ],
4027
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
3923
4028
  },
3924
4029
  "dx": {
3925
4030
  "type": "number",
@@ -4146,7 +4251,7 @@
4146
4251
  },
4147
4252
  "size": {
4148
4253
  "type": "number",
4149
- "description": "Fixed bar thickness in pixels for bar/column marks. When set, bars are this height (horizontal) or width (vertical), centered within the band."
4254
+ "description": "Bar/column marks: fixed bar thickness in pixels. When set, bars are this height (horizontal) or width (vertical), centered within the band.\n\nPoint marks: the dot RADIUS in pixels (default 5, typical 2-12). This is NOT Vega-Lite's point `size`, which is an area in px^2 -- a VL size of 110 corresponds to `size: 6` here (r = sqrt(area / pi)). Validation rejects values above 50 with the conversion."
4150
4255
  },
4151
4256
  "filled": {
4152
4257
  "type": "boolean",
@@ -4187,8 +4292,15 @@
4187
4292
  "description": "Clip marks to the chart area."
4188
4293
  },
4189
4294
  "trendline": {
4190
- "type": "boolean",
4191
- "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals."
4295
+ "anyOf": [
4296
+ {
4297
+ "type": "boolean"
4298
+ },
4299
+ {
4300
+ "$ref": "#/definitions/TrendlineConfig"
4301
+ }
4302
+ ],
4303
+ "description": "Overlay a least-squares regression line on scatter (point) marks. Defaults to true. Set `mark: { type: 'point', trendline: false }` to suppress it when the chart already carries its own reference line (e.g. a manual x=y diagonal in a separate layer), which would otherwise produce two competing diagonals.\n\nPass an object to control stacking order: the line renders `below` the points by default, but a dense scatter (thousands of overlapping dots) fully occludes a line drawn underneath, so `{ layer: 'above' }` lifts the reference line over the cloud."
4192
4304
  },
4193
4305
  "dx": {
4194
4306
  "type": "number",
@@ -4455,6 +4567,29 @@
4455
4567
  "additionalProperties": false,
4456
4568
  "description": "Radial gradient definition. Coordinates are in [0,1] normalized space relative to the mark's bounding box."
4457
4569
  },
4570
+ "TrendlineConfig": {
4571
+ "type": "object",
4572
+ "properties": {
4573
+ "layer": {
4574
+ "type": "string",
4575
+ "enum": [
4576
+ "above",
4577
+ "below"
4578
+ ],
4579
+ "description": "Stacking order relative to the point marks. `'below'` (default) draws the line behind the dots; `'above'` draws it on top so it stays visible over a dense cloud."
4580
+ },
4581
+ "stroke": {
4582
+ "type": "string",
4583
+ "description": "Stroke color. Defaults to the theme's high-contrast text color so the line reads on both light and dark grounds. Set an explicit CSS color to override."
4584
+ },
4585
+ "strokeWidth": {
4586
+ "type": "number",
4587
+ "description": "Stroke width in pixels. Defaults to 1.5. Over a dense cloud with `layer: 'above'`, a heavier line (e.g. 2.5) stays legible where the thin default disappears into the dots."
4588
+ }
4589
+ },
4590
+ "additionalProperties": false,
4591
+ "description": "Configuration for the scatter regression trend line. Passed as the object form of `MarkDef.trendline`."
4592
+ },
4458
4593
  "ArcEncoding<DataRow>": {
4459
4594
  "type": "object",
4460
4595
  "properties": {
@@ -4489,7 +4624,7 @@
4489
4624
  "$ref": "#/definitions/ValueDef"
4490
4625
  }
4491
4626
  ],
4492
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
4627
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
4493
4628
  },
4494
4629
  "detail": {
4495
4630
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -4554,6 +4689,14 @@
4554
4689
  "facet": {
4555
4690
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
4556
4691
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
4692
+ },
4693
+ "row": {
4694
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
4695
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
4696
+ },
4697
+ "column": {
4698
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
4699
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
4557
4700
  }
4558
4701
  },
4559
4702
  "required": [
@@ -4901,7 +5044,7 @@
4901
5044
  },
4902
5045
  "padding": {
4903
5046
  "type": "number",
4904
- "description": "Padding for band/point scales."
5047
+ "description": "Padding for band/point scales. Point-scale default (a categorical x/y on a line/area/point mark) is 0 for line and area marks (the trend runs flush to the plot edges) and 0.5 for other marks (e.g. scatter, so points don't collide with the axis). `paddingOuter` is accepted as an alias here since point scales have no inner bands."
4905
5048
  },
4906
5049
  "paddingInner": {
4907
5050
  "type": "number",
@@ -5063,12 +5206,13 @@
5063
5206
  "type": "string",
5064
5207
  "enum": [
5065
5208
  "top",
5209
+ "top-left",
5066
5210
  "right",
5067
5211
  "bottom",
5068
5212
  "bottom-right",
5069
5213
  "inline"
5070
5214
  ],
5071
- "description": "Legend position at a given breakpoint."
5215
+ "description": "Legend position at a given breakpoint. `'top-left'` is a map-only overlay position: the legend floats inside the map area's top-left corner (with its own backdrop) instead of reserving a block of figure height. Charts treat it as the default position."
5072
5216
  },
5073
5217
  "AnnotationOffset": {
5074
5218
  "type": "object",
@@ -5860,6 +6004,10 @@
5860
6004
  "color": {
5861
6005
  "type": "string",
5862
6006
  "description": "Text color (CSS color string)."
6007
+ },
6008
+ "maxLines": {
6009
+ "type": "number",
6010
+ "description": "Maximum number of lines this chrome text may wrap to. Additional lines are dropped and the last kept line is truncated with an ellipsis. Bounds the chrome's contribution to layout height at any container width. Applies whether the font size comes from the theme default or an explicit override. Caps height only, not horizontal overflow of a single unbreakable word."
5863
6011
  }
5864
6012
  },
5865
6013
  "additionalProperties": false,
@@ -6912,7 +7060,7 @@
6912
7060
  "update": {
6913
7061
  "anyOf": [
6914
7062
  {
6915
- "$ref": "#/definitions/AnimationPhaseConfig"
7063
+ "$ref": "#/definitions/UpdatePhaseConfig"
6916
7064
  },
6917
7065
  {
6918
7066
  "type": "boolean"
@@ -6993,6 +7141,36 @@
6993
7141
  "additionalProperties": false,
6994
7142
  "description": "Stagger configuration for sequential element reveal."
6995
7143
  },
7144
+ "UpdatePhaseConfig": {
7145
+ "type": "object",
7146
+ "properties": {
7147
+ "duration": {
7148
+ "type": "number",
7149
+ "description": "Duration in ms. Default: 500 for enter."
7150
+ },
7151
+ "ease": {
7152
+ "$ref": "#/definitions/AnimationEase",
7153
+ "description": "Easing preset. Default: 'smooth'."
7154
+ },
7155
+ "stagger": {
7156
+ "anyOf": [
7157
+ {
7158
+ "$ref": "#/definitions/AnimationStagger"
7159
+ },
7160
+ {
7161
+ "type": "boolean"
7162
+ }
7163
+ ],
7164
+ "description": "Stagger config. true = defaults, false = no stagger. Default: true for enter."
7165
+ },
7166
+ "maxMarks": {
7167
+ "type": "number",
7168
+ "description": "Maximum mark count that still runs a tweened data-update transition. Default: 500. Above the cap the chart swaps instantly instead, because per-frame SVG attribute writes on thousands of elements drop frames on low-end devices. Raise it deliberately when the audience is desktop-heavy and you have measured the frame budget."
7169
+ }
7170
+ },
7171
+ "additionalProperties": false,
7172
+ "description": "Data-update phase config. Adds `maxMarks` on top of the shared phase options; the cap is meaningless for enter/exit, which animate via CSS."
7173
+ },
6996
7174
  "Display": {
6997
7175
  "type": "string",
6998
7176
  "enum": [
@@ -7154,7 +7332,7 @@
7154
7332
  "$ref": "#/definitions/ValueDef"
7155
7333
  }
7156
7334
  ],
7157
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7335
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7158
7336
  },
7159
7337
  "detail": {
7160
7338
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7219,6 +7397,14 @@
7219
7397
  "facet": {
7220
7398
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7221
7399
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7400
+ },
7401
+ "row": {
7402
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7403
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7404
+ },
7405
+ "column": {
7406
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7407
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7222
7408
  }
7223
7409
  },
7224
7410
  "required": [
@@ -7265,7 +7451,7 @@
7265
7451
  "$ref": "#/definitions/ValueDef"
7266
7452
  }
7267
7453
  ],
7268
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7454
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7269
7455
  },
7270
7456
  "detail": {
7271
7457
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7330,6 +7516,14 @@
7330
7516
  "facet": {
7331
7517
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7332
7518
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7519
+ },
7520
+ "row": {
7521
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7522
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7523
+ },
7524
+ "column": {
7525
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7526
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7333
7527
  }
7334
7528
  },
7335
7529
  "required": [
@@ -7376,7 +7570,7 @@
7376
7570
  "$ref": "#/definitions/ValueDef"
7377
7571
  }
7378
7572
  ],
7379
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7573
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7380
7574
  },
7381
7575
  "detail": {
7382
7576
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7441,6 +7635,14 @@
7441
7635
  "facet": {
7442
7636
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7443
7637
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7638
+ },
7639
+ "row": {
7640
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7641
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7642
+ },
7643
+ "column": {
7644
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7645
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7444
7646
  }
7445
7647
  },
7446
7648
  "required": [
@@ -7487,7 +7689,7 @@
7487
7689
  "$ref": "#/definitions/ValueDef"
7488
7690
  }
7489
7691
  ],
7490
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7692
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7491
7693
  },
7492
7694
  "detail": {
7493
7695
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7552,6 +7754,14 @@
7552
7754
  "facet": {
7553
7755
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7554
7756
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7757
+ },
7758
+ "row": {
7759
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7760
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7761
+ },
7762
+ "column": {
7763
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7764
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7555
7765
  }
7556
7766
  },
7557
7767
  "required": [
@@ -7598,7 +7808,7 @@
7598
7808
  "$ref": "#/definitions/ValueDef"
7599
7809
  }
7600
7810
  ],
7601
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7811
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7602
7812
  },
7603
7813
  "detail": {
7604
7814
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7663,6 +7873,14 @@
7663
7873
  "facet": {
7664
7874
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7665
7875
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7876
+ },
7877
+ "row": {
7878
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7879
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7880
+ },
7881
+ "column": {
7882
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7883
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7666
7884
  }
7667
7885
  },
7668
7886
  "required": [
@@ -7709,7 +7927,7 @@
7709
7927
  "$ref": "#/definitions/ValueDef"
7710
7928
  }
7711
7929
  ],
7712
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
7930
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7713
7931
  },
7714
7932
  "detail": {
7715
7933
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7774,6 +7992,14 @@
7774
7992
  "facet": {
7775
7993
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7776
7994
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
7995
+ },
7996
+ "row": {
7997
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7998
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
7999
+ },
8000
+ "column": {
8001
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8002
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7777
8003
  }
7778
8004
  },
7779
8005
  "required": [
@@ -7820,7 +8046,7 @@
7820
8046
  "$ref": "#/definitions/ValueDef"
7821
8047
  }
7822
8048
  ],
7823
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8049
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7824
8050
  },
7825
8051
  "detail": {
7826
8052
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7885,6 +8111,14 @@
7885
8111
  "facet": {
7886
8112
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7887
8113
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8114
+ },
8115
+ "row": {
8116
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8117
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8118
+ },
8119
+ "column": {
8120
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8121
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7888
8122
  }
7889
8123
  },
7890
8124
  "additionalProperties": false,
@@ -7927,7 +8161,7 @@
7927
8161
  "$ref": "#/definitions/ValueDef"
7928
8162
  }
7929
8163
  ],
7930
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8164
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
7931
8165
  },
7932
8166
  "detail": {
7933
8167
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -7992,6 +8226,14 @@
7992
8226
  "facet": {
7993
8227
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
7994
8228
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8229
+ },
8230
+ "row": {
8231
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8232
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8233
+ },
8234
+ "column": {
8235
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8236
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
7995
8237
  }
7996
8238
  },
7997
8239
  "required": [
@@ -8035,7 +8277,7 @@
8035
8277
  "$ref": "#/definitions/ValueDef"
8036
8278
  }
8037
8279
  ],
8038
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8280
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8039
8281
  },
8040
8282
  "detail": {
8041
8283
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8100,6 +8342,14 @@
8100
8342
  "facet": {
8101
8343
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8102
8344
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8345
+ },
8346
+ "row": {
8347
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8348
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8349
+ },
8350
+ "column": {
8351
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8352
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8103
8353
  }
8104
8354
  },
8105
8355
  "required": [
@@ -8145,7 +8395,7 @@
8145
8395
  "$ref": "#/definitions/ValueDef"
8146
8396
  }
8147
8397
  ],
8148
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8398
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8149
8399
  },
8150
8400
  "detail": {
8151
8401
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8210,6 +8460,14 @@
8210
8460
  "facet": {
8211
8461
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8212
8462
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8463
+ },
8464
+ "row": {
8465
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8466
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8467
+ },
8468
+ "column": {
8469
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8470
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8213
8471
  }
8214
8472
  },
8215
8473
  "required": [
@@ -8255,7 +8513,7 @@
8255
8513
  "$ref": "#/definitions/ValueDef"
8256
8514
  }
8257
8515
  ],
8258
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8516
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8259
8517
  },
8260
8518
  "detail": {
8261
8519
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8320,6 +8578,14 @@
8320
8578
  "facet": {
8321
8579
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8322
8580
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8581
+ },
8582
+ "row": {
8583
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8584
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8585
+ },
8586
+ "column": {
8587
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8588
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8323
8589
  }
8324
8590
  },
8325
8591
  "required": [
@@ -8366,7 +8632,7 @@
8366
8632
  "$ref": "#/definitions/ValueDef"
8367
8633
  }
8368
8634
  ],
8369
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8635
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8370
8636
  },
8371
8637
  "detail": {
8372
8638
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8431,6 +8697,14 @@
8431
8697
  "facet": {
8432
8698
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8433
8699
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8700
+ },
8701
+ "row": {
8702
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8703
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8704
+ },
8705
+ "column": {
8706
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8707
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8434
8708
  }
8435
8709
  },
8436
8710
  "required": [
@@ -8477,7 +8751,7 @@
8477
8751
  "$ref": "#/definitions/ValueDef"
8478
8752
  }
8479
8753
  ],
8480
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8754
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8481
8755
  },
8482
8756
  "detail": {
8483
8757
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8542,6 +8816,14 @@
8542
8816
  "facet": {
8543
8817
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8544
8818
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8819
+ },
8820
+ "row": {
8821
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8822
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8823
+ },
8824
+ "column": {
8825
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8826
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8545
8827
  }
8546
8828
  },
8547
8829
  "additionalProperties": false,
@@ -8574,7 +8856,7 @@
8574
8856
  "$ref": "#/definitions/ValueDef"
8575
8857
  }
8576
8858
  ],
8577
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8859
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8578
8860
  },
8579
8861
  "detail": {
8580
8862
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8639,6 +8921,14 @@
8639
8921
  "facet": {
8640
8922
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8641
8923
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
8924
+ },
8925
+ "row": {
8926
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8927
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
8928
+ },
8929
+ "column": {
8930
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8931
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8642
8932
  }
8643
8933
  },
8644
8934
  "required": [
@@ -8682,7 +8972,7 @@
8682
8972
  "$ref": "#/definitions/ValueDef"
8683
8973
  }
8684
8974
  ],
8685
- "description": "Size channel. Used by point/bubble charts to scale dot area by a quantitative field. Accepts a conditional definition to vary size based on data predicates, or a bare `{ value }` constant (VL aligned; expanded to `mark.size`)."
8975
+ "description": "Size channel. Used by point/bubble charts to scale dots by a quantitative field, area-proportionally (sqrt curve). The units are dot RADII in px: `scale.range` defaults to [3, 30] for scatter, and a bare `{ value }` constant expands to `mark.size`, also a radius. This differs from Vega-Lite, where point size is an area in px^2 -- VL-scale values (60-900) are rejected by validation with the conversion. Accepts a conditional definition to vary size based on data predicates."
8686
8976
  },
8687
8977
  "detail": {
8688
8978
  "$ref": "#/definitions/EncodingChannel%3CDataRow%3E",
@@ -8747,6 +9037,14 @@
8747
9037
  "facet": {
8748
9038
  "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
8749
9039
  "description": "Facet channel: partitions data into a grid of small-multiple panels. Each unique value of the facet field produces one panel. Panels share scales by default; use `resolve: { scale: { y: 'independent' } }` for per-panel axes."
9040
+ },
9041
+ "row": {
9042
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
9043
+ "description": "Row facet channel: partitions data into vertically-stacked panels. Each unique value of the row field produces one panel, arranged in a single column. Shares the x-axis scale by default; y-axis is independent. Mutually exclusive with `facet` and `column`."
9044
+ },
9045
+ "column": {
9046
+ "$ref": "#/definitions/FacetChannel%3CDataRow%3E",
9047
+ "description": "Column facet channel: partitions data into side-by-side panels. Each unique value of the column field produces one panel, arranged in a single row. Shares the y-axis scale by default; x-axis is independent. Mutually exclusive with `facet` and `row`."
8750
9048
  }
8751
9049
  },
8752
9050
  "required": [
@@ -8783,6 +9081,14 @@
8783
9081
  "$ref": "#/definitions/Chrome",
8784
9082
  "description": "Editorial chrome (title, subtitle, source, etc.)."
8785
9083
  },
9084
+ "chromeLayout": {
9085
+ "type": "string",
9086
+ "enum": [
9087
+ "subtract",
9088
+ "grow"
9089
+ ],
9090
+ "description": "How chrome height interacts with the container height budget.\n\n- `'subtract'` (default): the container height is fixed and chrome text (title/subtitle/source) is subtracted from it, shrinking the plot. This is the historical behavior.\n- `'grow'`: the container height is treated as the *plot* budget, and the rendered SVG grows taller by the measured chrome height. The plot keeps its full budget (minus axis/padding overhead) regardless of how many lines the title wraps to.\n\n`'grow'` is a no-op for faceted specs in this version."
9091
+ },
8786
9092
  "title": {
8787
9093
  "anyOf": [
8788
9094
  {
@@ -8884,14 +9190,14 @@
8884
9190
  },
8885
9191
  "watermark": {
8886
9192
  "type": "boolean",
8887
- "description": "Whether to show the tryOpenData.ai watermark. Defaults to true."
9193
+ "description": "Whether to show the tryOpenData.ai watermark. Defaults to true; auto-hides when the container is under 200px tall (the cramped height class) unless explicitly set."
8888
9194
  },
8889
9195
  "hiddenSeries": {
8890
9196
  "type": "array",
8891
9197
  "items": {
8892
9198
  "type": "string"
8893
9199
  },
8894
- "description": "Series names to hide from rendering. Hidden series remain in the legend but are visually dimmed."
9200
+ "description": "Series names to hide from rendering by default. This is the authored persistence target for legend visibility. Runtime legend toggles (legend-toggle edit events) layer on top of this via ephemeral runtime sets but never modify it."
8895
9201
  },
8896
9202
  "seriesStyles": {
8897
9203
  "type": "object",