ggaction 0.0.22 → 0.0.23

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 (34) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +81 -89
  3. package/knowledge/action-card.schema.json +1 -1
  4. package/knowledge/action-cards.json +1 -1
  5. package/knowledge/intent-taxonomy.json +1 -1
  6. package/knowledge/mcp-resources.json +1 -1
  7. package/package.json +6 -3
  8. package/src/actions/charts/interval-regression.js +2 -2
  9. package/src/actions/data/edit.js +1 -1
  10. package/src/actions/data/timeUnit.js +1 -1
  11. package/src/actions/facets/actions.js +1 -1
  12. package/src/actions/guides/legends/categorical/components.js +1 -4
  13. package/src/actions/regression/create.js +6 -1
  14. package/src/actions/regression/edit.js +10 -1
  15. package/src/core/compositionState.js +5 -3
  16. package/src/core/facetAxisPolicy.js +30 -0
  17. package/src/grammar/curveCommands.js +35 -2
  18. package/src/grammar/datasetSchema.js +1 -1
  19. package/src/grammar/facetHeaders.js +1 -1
  20. package/src/grammar/facets/guides.js +7 -5
  21. package/src/grammar/regression/parameters.js +7 -0
  22. package/src/grammar/timeUnit.js +9 -3
  23. package/src/inspectionDescriptors.js +1 -1
  24. package/src/layout/facets.js +1 -1
  25. package/src/layout/guideCollisions.js +9 -3
  26. package/src/materialization/facetContentBounds.js +96 -0
  27. package/src/materialization/facetGuides/layout.js +1 -1
  28. package/src/materialization/facetGuides/placement.js +16 -0
  29. package/src/materialization/facetHeaders.js +1 -1
  30. package/src/materialization/facets.js +1 -1
  31. package/src/materialization/graphicHierarchy.js +25 -1
  32. package/src/persistence/validation.js +6 -0
  33. package/src/version.js +1 -1
  34. package/types/program.d.ts +17 -11
@@ -1 +1 @@
1
- {"schemaVersion":2,"packageVersion":"0.0.22","constraints":[{"id":"program.canvas","phrases":["chart canvas","create canvas","plot bounds"]},{"id":"program.data","phrases":["create dataset","load rows","inline data"]},{"id":"chart.scatter","phrases":["scatter plot","scatter chart","point chart"]},{"id":"chart.dot","phrases":["dot plot","categorical dot plot","category dot chart"]},{"id":"chart.lollipop","phrases":["lollipop plot","lollipop chart","baseline stem chart"]},{"id":"chart.dumbbell","phrases":["dumbbell plot","dumbbell chart","connected dot plot","before and after chart"]},{"id":"chart.ecdf","phrases":["ecdf plot","ecdf chart","empirical cumulative distribution","empirical cumulative distribution plot"]},{"id":"chart.interval","phrases":["interval plot","point interval plot","point and interval chart"]},{"id":"chart.regression","phrases":["regression plot","regression scatter plot","scatter plot with fit"],"shadows":["chart.scatter"]},{"id":"chart.line","phrases":["line chart","line plot","time series chart"]},{"id":"chart.bar","phrases":["bar chart","bar plot","column chart"]},{"id":"chart.bar.horizontal","phrases":["horizontal bar chart","horizontal bar plot","horizontal bars"],"shadows":["chart.bar"]},{"id":"chart.histogram","phrases":["histogram","binned distribution","frequency distribution","frequency histogram"]},{"id":"chart.heatmap","phrases":["heatmap","heat map","two dimensional distribution"]},{"id":"chart.parallel","phrases":["parallel coordinates","parallel coordinate plot"]},{"id":"chart.box","phrases":["box plot","boxplot","quartile plot"]},{"id":"chart.violin","phrases":["violin plot","violin chart"]},{"id":"chart.gradient","phrases":["gradient plot","density gradient"]},{"id":"chart.density","phrases":["density plot","density curve","kernel density plot"]},{"id":"chart.area","phrases":["area chart","area plot"]},{"id":"chart.rug","phrases":["rug plot","rug chart","edge tick distribution"]},{"id":"chart.strip","phrases":["strip plot","strip chart","jittered strip plot"]},{"id":"chart.beeswarm","phrases":["beeswarm plot","beeswarm chart","packed point plot","swarm plot"]},{"id":"chart.raincloud","phrases":["raincloud plot","raincloud chart","half violin with box and points","density summary raw points"]},{"id":"chart.horizon","phrases":["horizon chart","horizon plot"]},{"id":"chart.pie","phrases":["pie chart","pie plot"],"exclusiveGroup":"polar.partition-chart"},{"id":"chart.donut","phrases":["donut chart","doughnut chart","donut plot"],"exclusiveGroup":"polar.partition-chart"},{"id":"chart.rose","phrases":["rose chart","rose plot","coxcomb chart","polar area chart"],"shadows":["chart.bar","chart.area"]},{"id":"chart.radialBar","phrases":["radial bar chart","radial bar plot"],"shadows":["chart.bar"]},{"id":"chart.polarScatter","phrases":["polar scatter plot","polar scatter chart","radial scatter plot"],"shadows":["chart.scatter"]},{"id":"chart.polarLine","phrases":["polar line plot","polar line chart","radial line chart"],"shadows":["chart.line"]},{"id":"chart.radar","phrases":["radar chart","spider chart"]},{"id":"mark.point","phrases":["point mark","circle marks"]},{"id":"mark.tick","phrases":["tick mark","tick plot"]},{"id":"mark.text","phrases":["text mark","data labels"]},{"id":"mark.line","phrases":["line mark","path mark"]},{"id":"mark.bar","phrases":["bar mark","rectangle bars"]},{"id":"mark.area","phrases":["area mark","filled area"]},{"id":"mark.rule","phrases":["rule mark","reference line mark"],"shadows":["mark.line"]},{"id":"mark.arc","phrases":["arc mark","polar sectors"]},{"id":"mark.rect","phrases":["rect mark","rectangle cells"]},{"id":"transform.filter","phrases":["filter data","filtered dataset","filter rows"]},{"id":"transform.density","phrases":["density data","kde data","kernel density data"]},{"id":"transform.regression","phrases":["regression data","fitted rows","loess data"]},{"id":"transform.window","phrases":["moving average","moving mean","window transform","rank rows","lag values"]},{"id":"transform.timeUnit","phrases":["time unit","date bucket","month bucket","year bucket"]},{"id":"transform.bin1d","phrases":["bin one field","one dimensional bins","histogram bins"]},{"id":"transform.bin2d","phrases":["bin two fields","two dimensional bins","2d bins","bin2d","rectangular bins","binned heatmap"]},{"id":"transform.interval","phrases":["interval data","confidence interval data","summary interval"]},{"id":"transform.ecdf","phrases":["ecdf data","empirical cumulative distribution data","cumulative probability transform"]},{"id":"statistics.regression","phrases":["regression line","trend line","fitted line","regression fit","best fit line","fitted trend"]},{"id":"statistics.errorBar","phrases":["error bars","error bar","point and whisker","point whisker plot","uncertainty whiskers"]},{"id":"statistics.errorBand","phrases":["error band","uncertainty ribbon","confidence band"]},{"id":"scale.create","phrases":["create scale","named scale","custom scale"]},{"id":"scale.log","phrases":["log scale","logarithmic scale"]},{"id":"scale.time","phrases":["time scale","temporal scale"]},{"id":"scale.color","phrases":["color scale","colour scale","palette scale"]},{"id":"encoding.channels","phrases":["atomic encoding update","encode channels together","batch encoding channels"]},{"id":"encoding.x","phrases":["x encoding","encode x","map to x"]},{"id":"encoding.y","phrases":["y encoding","encode y","map to y"]},{"id":"encoding.color","phrases":["color encoding","encode color","map to color","color legend","colour legend"]},{"id":"encoding.size","phrases":["size encoding","encode size","map to size","size legend"]},{"id":"encoding.shape","phrases":["shape encoding","encode shape","map to shape","shape legend"]},{"id":"encoding.angle","phrases":["angle encoding","encode angle","rotate ticks","rotate points"]},{"id":"encoding.opacity","phrases":["opacity encoding","encode opacity","map to opacity","opacity legend"]},{"id":"encoding.strokeDash","phrases":["stroke dash encoding","stroke dash","dashed stroke","dash encoding","line style encoding","stroke dash legend"]},{"id":"encoding.strokeWidth","phrases":["stroke width encoding","encode stroke width","line width encoding","stroke width legend"]},{"id":"encoding.text","phrases":["text encoding","encode text","label field"]},{"id":"encoding.group","phrases":["group encoding","group series","series grouping"]},{"id":"encoding.theta","phrases":["theta encoding","angular encoding","encode theta"]},{"id":"encoding.radius","phrases":["radius encoding","radial encoding","encode radius"]},{"id":"encoding.parallel","phrases":["parallel dimensions","dimension axes"]},{"id":"guide.all","phrases":["create guides","automatic guides","all guides"]},{"id":"guide.axes","phrases":["axes","axis guides","x and y axes"]},{"id":"guide.xAxis","phrases":["x axis","horizontal axis"]},{"id":"guide.yAxis","phrases":["y axis","vertical axis"]},{"id":"guide.thetaAxis","phrases":["theta axis","angular axis"]},{"id":"guide.radialAxis","phrases":["radial axis","radius axis"]},{"id":"guide.legend","phrases":["legend","encoding key"]},{"id":"guide.grid","phrases":["grid lines","chart grid","reference grid","grid"]},{"id":"guide.title","phrases":["chart title","add title","with title","titled","title and subtitle"]},{"id":"guide.subtitle","phrases":["subtitle","title and subtitle"]},{"id":"layout.coordinateAspect","phrases":["coordinate aspect ratio","equal data units","equal axis units","square plot frame"]},{"id":"layout.polarFrame","phrases":["move polar chart center","polar frame radius","fixed polar radius","off-center polar plot"]},{"id":"layout.legend.bottom","phrases":["legend at bottom","bottom legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.top","phrases":["legend at top","top legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.left","phrases":["legend at left","left legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.right","phrases":["legend at right","right legend"],"exclusiveGroup":"legend.position"},{"id":"layout.labels","phrases":["avoid label overlap","label collision","layout labels","label collision avoidance"]},{"id":"layout.labels.semanticPlacement","phrases":["labels outside bars","bar end labels","inside arc labels","semantic label placement","reset label placement"]},{"id":"selection.labels.membership","phrases":["select labels","edit label selection","label only selected items","show all labels"]},{"id":"lifecycle.labels.remove","phrases":["remove mark labels","remove labels","delete mark labels","delete attached labels","remove labels from bar","remove labels from bars"]},{"id":"layout.jitter","phrases":["jitter points","point jitter","reduce overplotting"]},{"id":"layout.packing","phrases":["pack points","point packing","avoid point overlap","collision free points"]},{"id":"layout.categoryOrder","phrases":["order categories","sort categories","category order"]},{"id":"layout.facet","phrases":["facet chart","small multiples","repeat chart by field"]},{"id":"selection.store","phrases":["store selection","reusable selection","select marks"]},{"id":"selection.highlight","phrases":["highlight marks","highlight selected","conditional highlight"]},{"id":"selection.filter","phrases":["filter marks","retain matching marks"]},{"id":"composition.horizontal","phrases":["horizontal concat","horizontally concatenate","charts side by side"]},{"id":"composition.vertical","phrases":["vertical concat","vertically concatenate","stack charts vertically"]},{"id":"renderer.canvas","phrases":["render to canvas","browser canvas","canvas renderer","as canvas","on canvas","on the chart canvas"]},{"id":"renderer.svg","phrases":["render svg","export svg","svg output","as svg","vector svg","svg document","accessible svg","svg"]},{"id":"renderer.png","phrases":["render png","export png","png output","as png"]},{"id":"renderer.pdf","phrases":["render pdf","export pdf","pdf output","as pdf","vector pdf","pdf document"]},{"id":"unsupported.geo","phrases":["map chart","geographic chart","geo projection","choropleth"],"unsupported":"Geographic projections and map marks are outside the current ggaction contract."},{"id":"unsupported.animation","phrases":["animate chart","chart animation","animated transition","animated chart","animation","transitions"],"unsupported":"Animation is outside the current static-chart contract."},{"id":"unsupported.interaction","phrases":["interactive tooltip","hover tooltip","tooltip on hover","tooltip","tooltips","zoom interaction","pan interaction","brush interaction","hover interaction","click interaction","interactive chart","event handling"],"unsupported":"Interactive runtime behaviors are outside the current static-chart contract."},{"id":"unsupported.3d","phrases":["3d chart","three dimensional chart","three dimensional plot"],"unsupported":"Three-dimensional charts are not supported."},{"id":"unsupported.jpg","phrases":["export jpg","render jpeg","jpeg output","jpeg image","jpg image"],"unsupported":"JPEG is not a current renderer; use SVG, PNG, PDF, or Browser Canvas."}],"providers":[{"id":"action.createCanvas","kind":"action","name":"createCanvas","order":10,"anchors":["program.canvas"],"covers":["program.canvas"],"baseOptions":{}},{"id":"action.createData","kind":"action","name":"createData","order":20,"anchors":["program.data"],"covers":["program.data"],"baseOptions":{"values":"[{ category: \"A\", x: 1, y: 2, value: 3 }]"}},{"id":"action.createScatterPlot","kind":"action","name":"createScatterPlot","order":40,"anchors":["chart.scatter"],"covers":["chart.scatter","encoding.x","encoding.y","encoding.color","encoding.size","encoding.shape","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createDotPlot","kind":"action","name":"createDotPlot","order":40,"anchors":["chart.dot"],"covers":["chart.dot","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""}},{"id":"action.createLollipopPlot","kind":"action","name":"createLollipopPlot","order":40,"anchors":["chart.lollipop"],"covers":["chart.lollipop","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""}},{"id":"action.createDumbbellPlot","kind":"action","name":"createDumbbellPlot","order":40,"anchors":["chart.dumbbell"],"covers":["chart.dumbbell","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","start":"\"before\"","end":"\"after\""}},{"id":"action.createECDFPlot","kind":"action","name":"createECDFPlot","order":40,"anchors":["chart.ecdf"],"covers":["chart.ecdf","transform.ecdf","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"field":"\"value\""}},{"id":"action.createIntervalPlot","kind":"action","name":"createIntervalPlot","order":40,"anchors":["chart.interval"],"covers":["chart.interval","statistics.errorBar","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"x":"\"category\"","y":"\"value\""}},{"id":"action.createRegressionPlot","kind":"action","name":"createRegressionPlot","order":40,"anchors":["chart.regression"],"covers":["chart.regression","chart.scatter","statistics.regression","statistics.errorBand","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createLinePlot","kind":"action","name":"createLinePlot","order":40,"anchors":["chart.line"],"covers":["chart.line","encoding.x","encoding.y","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.group":{"groupBy":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createBarPlot","kind":"action","name":"createBarPlot","order":40,"anchors":["chart.bar"],"covers":["chart.bar","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"category\"","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createHorizontalBar","kind":"action","name":"createBarMark","order":40,"anchors":["chart.bar.horizontal"],"covers":["chart.bar.horizontal"],"baseOptions":{"id":"\"bar\""}},{"id":"action.createHistogram","kind":"action","name":"createHistogram","order":40,"anchors":["chart.histogram"],"covers":["chart.histogram","transform.bin1d","encoding.color","guide.axes","guide.legend"],"baseOptions":{"field":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createHeatmap","kind":"action","name":"createHeatmap","order":40,"anchors":["chart.heatmap"],"covers":["chart.heatmap","transform.bin2d","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\"","bin":"{}"},"optionsByConstraint":{"encoding.color":{"color":"{}"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createParallelCoordinates","kind":"action","name":"createParallelCoordinates","order":40,"anchors":["chart.parallel"],"covers":["chart.parallel","encoding.parallel","encoding.color","encoding.strokeDash","guide.axes","guide.legend"],"baseOptions":{"dimensions":"[\"a\", \"b\"]"},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createBoxPlot","kind":"action","name":"createBoxPlot","order":40,"anchors":["chart.box"],"covers":["chart.box","guide.axes"],"baseOptions":{},"optionsByConstraint":{"guide.axes":{"guides":"{}"}}},{"id":"action.createViolinPlot","kind":"action","name":"createViolinPlot","order":40,"anchors":["chart.violin"],"covers":["chart.violin","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"category\"","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createGradientPlot","kind":"action","name":"createGradientPlot","order":40,"anchors":["chart.gradient"],"covers":["chart.gradient","guide.axes"],"baseOptions":{},"optionsByConstraint":{"guide.axes":{"guides":"{}"}}},{"id":"action.createDensityPlot","kind":"action","name":"createDensityPlot","order":50,"anchors":["chart.density"],"covers":["chart.density","guide.axes","guide.xAxis","guide.yAxis","guide.grid","guide.all"],"baseOptions":{"field":"\"value\""}},{"id":"action.createAreaPlot","kind":"action","name":"createAreaPlot","order":10,"anchors":["chart.area"],"covers":["chart.area","encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createRugPlot","kind":"action","name":"createRugPlot","order":40,"anchors":["chart.rug"],"covers":["chart.rug","encoding.x","guide.axes","guide.xAxis","guide.all"],"baseOptions":{"x":"\"value\"","edge":"\"bottom\""}},{"id":"action.createStripPlot","kind":"action","name":"createStripPlot","order":40,"anchors":["chart.strip"],"covers":["chart.strip","encoding.x","encoding.color","encoding.size","encoding.shape","guide.axes","guide.xAxis","guide.legend","guide.all","layout.jitter"],"baseOptions":{"x":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.xAxis":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.jitter":{"jitter":"{ maxOffset: { pixels: 4 }, seed: \"strip\" }"}}},{"id":"action.createBeeswarmPlot","kind":"action","name":"createBeeswarmPlot","order":40,"anchors":["chart.beeswarm"],"covers":["chart.beeswarm","encoding.x","encoding.y","encoding.color","encoding.size","encoding.shape","guide.axes","guide.legend","guide.all","layout.packing"],"baseOptions":{"x":"{ field: \"category\", fieldType: \"nominal\" }","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"color":"\"category\"","guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.packing":{"packing":"{ key: \"id\" }"}}},{"id":"action.createRaincloudPlot","kind":"action","name":"createRaincloudPlot","order":40,"anchors":["chart.raincloud"],"covers":["chart.raincloud","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend","guide.all","layout.packing"],"baseOptions":{"category":"{ field: \"category\", fieldType: \"nominal\" }","value":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"color":"\"category\"","guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.packing":{"points":"{ type: \"beeswarm\", packing: { key: \"id\" } }"}}},{"id":"action.createHorizonPlot","kind":"action","name":"createHorizonPlot","order":50,"anchors":["chart.horizon"],"covers":["chart.horizon","encoding.x","encoding.y","guide.axes","guide.xAxis","guide.grid","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createPieChart","kind":"action","name":"createPiePlot","order":40,"anchors":["chart.pie"],"covers":["chart.pie","encoding.color","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createDonutChart","kind":"action","name":"createPiePlot","order":40,"anchors":["chart.donut"],"covers":["chart.donut","encoding.color","guide.legend","guide.all"],"baseOptions":{"category":"\"category\"","arc":"{ innerRadius: 0.55, padAngle: 2 }"}},{"id":"action.createRoseChart","kind":"action","name":"createRosePlot","order":40,"anchors":["chart.rose"],"covers":["chart.rose","encoding.theta","encoding.radius","encoding.color","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createRadialBarChart","kind":"action","name":"createRadialBarPlot","order":40,"anchors":["chart.radialBar"],"covers":["chart.radialBar","encoding.theta","encoding.radius","encoding.color","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createPolarScatterPlot","kind":"action","name":"createPolarScatterPlot","order":40,"anchors":["chart.polarScatter"],"covers":["chart.polarScatter","encoding.theta","encoding.radius","encoding.color","encoding.size","encoding.shape","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"theta":"\"angle\"","radius":"\"distance\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createPolarLinePlot","kind":"action","name":"createPolarLinePlot","order":40,"anchors":["chart.polarLine"],"covers":["chart.polarLine","encoding.theta","encoding.radius","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"theta":"\"angle\"","radius":"\"distance\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.group":{"groupBy":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createRadarPlot","kind":"action","name":"createRadarPlot","order":40,"anchors":["chart.radar"],"covers":["chart.radar","encoding.theta","encoding.radius","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"series\""},"encoding.group":{"groupBy":"\"series\""},"encoding.strokeDash":{"strokeDash":"{ field: \"series\" }"},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createPointMark","kind":"action","name":"createPointMark","order":40,"anchors":["mark.point"],"covers":["mark.point"],"baseOptions":{}},{"id":"action.createTickMark","kind":"action","name":"createTickMark","order":40,"anchors":["mark.tick"],"covers":["mark.tick"],"baseOptions":{}},{"id":"action.createTextMark","kind":"action","name":"createTextMark","order":40,"anchors":["mark.text"],"covers":["mark.text"],"baseOptions":{}},{"id":"action.createLineMark","kind":"action","name":"createLineMark","order":40,"anchors":["mark.line"],"covers":["mark.line"],"baseOptions":{}},{"id":"action.createBarMark","kind":"action","name":"createBarMark","order":40,"anchors":["mark.bar"],"covers":["mark.bar"],"baseOptions":{}},{"id":"action.createAreaMark","kind":"action","name":"createAreaMark","order":40,"anchors":["mark.area"],"covers":["mark.area"],"baseOptions":{}},{"id":"action.createRuleMark","kind":"action","name":"createRuleMark","order":40,"anchors":["mark.rule"],"covers":["mark.rule"],"baseOptions":{}},{"id":"action.createArcMark","kind":"action","name":"createArcMark","order":40,"anchors":["mark.arc"],"covers":["mark.arc"],"baseOptions":{}},{"id":"action.createRectMark","kind":"action","name":"createRectMark","order":40,"anchors":["mark.rect"],"covers":["mark.rect"],"baseOptions":{}},{"id":"action.filterData","kind":"action","name":"filterData","order":30,"anchors":["transform.filter"],"covers":["transform.filter"],"baseOptions":{"id":"\"filtered\"","field":"\"value\"","predicate":"{ op: \"gt\", value: 0 }"}},{"id":"action.createDensityData","kind":"action","name":"createDensityData","order":30,"anchors":["transform.density"],"covers":["transform.density"],"baseOptions":{"id":"\"density\"","field":"\"value\""}},{"id":"action.createRegressionData","kind":"action","name":"createRegressionData","order":30,"anchors":["transform.regression"],"covers":["transform.regression"],"baseOptions":{"id":"\"regression\"","x":"\"x\"","y":"\"y\""}},{"id":"action.createWindowData","kind":"action","name":"createWindowData","order":30,"anchors":["transform.window"],"covers":["transform.window"],"baseOptions":{"id":"\"windowed\"","operations":"[{ op: \"movingMean\", field: \"value\", as: \"movingMean\", frame: { preceding: 2 } }]"}},{"id":"action.createTimeUnitData","kind":"action","name":"createTimeUnitData","order":30,"anchors":["transform.timeUnit"],"covers":["transform.timeUnit"],"baseOptions":{"id":"\"monthly\"","field":"\"date\"","unit":"\"month\"","as":"\"month\""}},{"id":"action.encodeHistogram","kind":"action","name":"encodeHistogram","order":50,"anchors":["transform.bin1d"],"covers":["transform.bin1d"],"baseOptions":{"field":"\"value\""}},{"id":"action.createBin2DData","kind":"action","name":"createBin2DData","order":30,"anchors":["transform.bin2d"],"covers":["transform.bin2d"],"baseOptions":{"id":"\"bins\"","x":"\"x\"","y":"\"y\""}},{"id":"action.createIntervalData","kind":"action","name":"createIntervalData","order":30,"anchors":["transform.interval"],"covers":["transform.interval"],"baseOptions":{"id":"\"interval\"","field":"\"value\""}},{"id":"action.createECDFData","kind":"action","name":"createECDFData","order":30,"anchors":["transform.ecdf"],"covers":["transform.ecdf"],"baseOptions":{"id":"\"ecdf\"","field":"\"value\""}},{"id":"action.createRegression","kind":"action","name":"createRegression","order":60,"anchors":["statistics.regression"],"covers":["mark.line","transform.regression","statistics.regression","statistics.errorBand"],"baseOptions":{}},{"id":"action.createErrorBar","kind":"action","name":"createErrorBar","order":60,"anchors":["statistics.errorBar"],"covers":["statistics.errorBar"],"baseOptions":{}},{"id":"action.createErrorBand","kind":"action","name":"createErrorBand","order":61,"anchors":["statistics.errorBand"],"covers":["statistics.errorBand"],"baseOptions":{}},{"id":"action.createScale","kind":"action","name":"createScale","order":35,"anchors":["scale.create"],"covers":["scale.create"],"baseOptions":{"id":"\"scale-1\""}},{"id":"action.createLogScale","kind":"action","name":"createScale","order":35,"anchors":["scale.log"],"covers":["scale.log"],"baseOptions":{"id":"\"scale-1\"","type":"\"log\""}},{"id":"action.createTimeScale","kind":"action","name":"createScale","order":35,"anchors":["scale.time"],"covers":["scale.time"],"baseOptions":{"id":"\"scale-1\"","type":"\"time\""}},{"id":"action.createColorScale","kind":"action","name":"createScale","order":35,"anchors":["scale.color"],"covers":["scale.color"],"baseOptions":{"id":"\"color-scale\"","type":"\"ordinal\"","range":"{ palette: \"tableau10\" }"}},{"id":"action.encodeX","kind":"action","name":"encodeX","order":50,"anchors":["encoding.x"],"covers":["encoding.x"],"baseOptions":{"field":"\"x\""}},{"id":"action.encodeY","kind":"action","name":"encodeY","order":50,"anchors":["encoding.y"],"covers":["encoding.y"],"baseOptions":{"field":"\"y\""}},{"id":"action.encodeChannels","kind":"action","name":"encodeChannels","order":51,"anchors":["encoding.channels"],"covers":["encoding.channels"],"baseOptions":{"target":"\"point\"","channels":"{ x: { field: \"x\" }, y: { field: \"y\" } }"}},{"id":"action.encodeColor","kind":"action","name":"encodeColor","order":55,"anchors":["encoding.color"],"covers":["encoding.color"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeSize","kind":"action","name":"encodeSize","order":55,"anchors":["encoding.size"],"covers":["encoding.size"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeShape","kind":"action","name":"encodeShape","order":55,"anchors":["encoding.shape"],"covers":["encoding.shape"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeAngle","kind":"action","name":"encodeAngle","order":55,"anchors":["encoding.angle"],"covers":["encoding.angle"],"baseOptions":{"value":"45"}},{"id":"action.encodeOpacity","kind":"action","name":"encodeOpacity","order":55,"anchors":["encoding.opacity"],"covers":["encoding.opacity"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeStrokeDash","kind":"action","name":"encodeStrokeDash","order":55,"anchors":["encoding.strokeDash"],"covers":["encoding.strokeDash"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeStrokeWidth","kind":"action","name":"encodeStrokeWidth","order":55,"anchors":["encoding.strokeWidth"],"covers":["encoding.strokeWidth"],"baseOptions":{"value":"2"}},{"id":"action.encodeText","kind":"action","name":"encodeText","order":55,"anchors":["encoding.text"],"covers":["encoding.text"],"baseOptions":{"field":"\"label\""}},{"id":"action.encodeGroup","kind":"action","name":"encodeGroup","order":52,"anchors":["encoding.group"],"covers":["encoding.group"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeTheta","kind":"action","name":"encodeTheta","order":50,"anchors":["encoding.theta"],"covers":["encoding.theta"],"baseOptions":{"field":"\"angle\""}},{"id":"action.encodeR","kind":"action","name":"encodeR","order":50,"anchors":["encoding.radius"],"covers":["encoding.radius"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeParallelCoordinates","kind":"action","name":"encodeParallelCoordinates","order":50,"anchors":["encoding.parallel"],"covers":["encoding.parallel"],"baseOptions":{"dimensions":"[\"a\", \"b\"]"}},{"id":"action.createGuides","kind":"action","name":"createGuides","order":70,"anchors":["guide.all"],"covers":["guide.all","guide.axes","guide.legend","guide.grid"],"baseOptions":{}},{"id":"action.createAxes","kind":"action","name":"createAxes","order":70,"anchors":["guide.axes"],"covers":["guide.axes"],"baseOptions":{}},{"id":"action.createXAxis","kind":"action","name":"createXAxis","order":70,"anchors":["guide.xAxis"],"covers":["guide.xAxis"],"baseOptions":{}},{"id":"action.createYAxis","kind":"action","name":"createYAxis","order":70,"anchors":["guide.yAxis"],"covers":["guide.yAxis"],"baseOptions":{}},{"id":"action.createThetaAxis","kind":"action","name":"createThetaAxis","order":70,"anchors":["guide.thetaAxis"],"covers":["guide.thetaAxis"],"baseOptions":{}},{"id":"action.createRadialAxis","kind":"action","name":"createRadialAxis","order":70,"anchors":["guide.radialAxis"],"covers":["guide.radialAxis"],"baseOptions":{}},{"id":"action.createLegend","kind":"action","name":"createLegend","order":70,"anchors":["guide.legend"],"covers":["guide.legend"],"baseOptions":{}},{"id":"action.createGrid","kind":"action","name":"createGrid","order":70,"anchors":["guide.grid"],"covers":["guide.grid"],"baseOptions":{}},{"id":"action.createTitle","kind":"action","name":"createTitle","order":70,"anchors":["guide.title","guide.subtitle"],"covers":["guide.title","guide.subtitle"],"baseOptions":{"text":"\"Chart title\""},"optionsByConstraint":{"guide.subtitle":{"subtitle":"\"Chart subtitle\""}}},{"id":"action.editCoordinate","kind":"action","name":"editCoordinate","order":80,"anchors":["layout.coordinateAspect"],"covers":["layout.coordinateAspect"],"baseOptions":{"target":"\"main\"","aspect":"{ mode: \"data\", ratio: 1 }"}},{"id":"action.editPolarFrame","kind":"action","name":"editCoordinate","order":80,"anchors":["layout.polarFrame"],"covers":["layout.polarFrame"],"baseOptions":{"target":"\"polar\"","polarFrame":"{ center: { x: 0.4, y: 0.5 }, radius: { unit: \"fraction\", value: 0.9 } }"}},{"id":"action.legendBottom","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.bottom"],"covers":["layout.legend.bottom"],"baseOptions":{"position":"\"bottom\""}},{"id":"action.legendTop","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.top"],"covers":["layout.legend.top"],"baseOptions":{"position":"\"top\""}},{"id":"action.legendLeft","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.left"],"covers":["layout.legend.left"],"baseOptions":{"position":"\"left\""}},{"id":"action.legendRight","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.right"],"covers":["layout.legend.right"],"baseOptions":{"position":"\"right\""}},{"id":"action.layoutLabels","kind":"action","name":"layoutLabels","order":80,"anchors":["layout.labels"],"covers":["layout.labels"],"baseOptions":{"axis":"\"y\""}},{"id":"action.editMarkLabelSelection","kind":"action","name":"editMarkLabelSelection","order":80,"anchors":["selection.labels.membership"],"covers":["selection.labels.membership"],"baseOptions":{"target":"\"labels\"","all":"true"}},{"id":"action.editMarkLabelPlacement","kind":"action","name":"editMarkLabelPlacement","order":80,"anchors":["layout.labels.semanticPlacement"],"covers":["layout.labels.semanticPlacement"],"baseOptions":{"target":"\"labels\"","placement":"{ anchor: \"outsideEnd\" }"}},{"id":"action.removeMarkLabels","kind":"action","name":"removeMarkLabels","order":80,"anchors":["lifecycle.labels.remove"],"covers":["lifecycle.labels.remove"],"baseOptions":{"source":"\"bars\""}},{"id":"action.jitterPoints","kind":"action","name":"jitterPoints","order":80,"anchors":["layout.jitter"],"covers":["layout.jitter"],"baseOptions":{"channel":"\"x\"","maxOffset":"{ pixels: 4 }"}},{"id":"action.packPoints","kind":"action","name":"packPoints","order":80,"anchors":["layout.packing"],"covers":["layout.packing"],"baseOptions":{"channel":"\"x\""}},{"id":"action.orderCategories","kind":"action","name":"orderCategories","order":80,"anchors":["layout.categoryOrder"],"covers":["layout.categoryOrder"],"baseOptions":{"channel":"\"x\"","by":"\"category\""}},{"id":"action.facet","kind":"action","name":"facet","order":80,"anchors":["layout.facet"],"covers":["layout.facet","guide.axes","guide.legend"],"baseOptions":{"field":"\"category\""},"optionsByConstraint":{"guide.axes":{"guides":"{ axes: \"outer\", legend: \"shared\" }"},"guide.legend":{"guides":"{ axes: \"outer\", legend: \"shared\" }"}}},{"id":"action.selectMarks","kind":"action","name":"selectMarks","order":75,"anchors":["selection.store"],"covers":["selection.store"],"baseOptions":{"id":"\"selection-1\"","field":"\"category\"","op":"\"eq\"","value":"\"A\""}},{"id":"action.highlightMarks","kind":"action","name":"highlightMarks","order":76,"anchors":["selection.highlight"],"covers":["selection.highlight"],"baseOptions":{"select":"{ field: \"category\", op: \"eq\", value: \"A\" }","color":"\"#f28e2b\""}},{"id":"action.filterMarks","kind":"action","name":"filterMarks","order":75,"anchors":["selection.filter"],"covers":["selection.filter"],"baseOptions":{"field":"\"value\"","op":"\"gt\"","value":"0"}},{"id":"runtime.hconcat","kind":"runtime","name":"hconcat","order":90,"anchors":["composition.horizontal"],"covers":["composition.horizontal"],"signature":"hconcat(options: CompositionOptions): ChartProgram;","call":"hconcat({ programs: [program, program] })","route":"/reference/runtime/#ggaction"},{"id":"runtime.vconcat","kind":"runtime","name":"vconcat","order":90,"anchors":["composition.vertical"],"covers":["composition.vertical"],"signature":"vconcat(options: CompositionOptions): ChartProgram;","call":"vconcat({ programs: [program, program] })","route":"/reference/runtime/#ggaction"},{"id":"runtime.render","kind":"runtime","name":"render","order":100,"anchors":["renderer.canvas"],"covers":["renderer.canvas"],"signature":"render(program: Pick<ChartProgram, \"graphicSpec\">, context: CanvasRenderingContext2D, options?: { pixelRatio?: number }): void;","call":"render(program, context)","route":"/reference/runtime/#ggaction"},{"id":"runtime.renderToSVG","kind":"runtime","name":"renderToSVG","order":100,"anchors":["renderer.svg"],"covers":["renderer.svg"],"signature":"renderToSVG(program: Pick<ChartProgram, \"graphicSpec\">, options?: SVGRenderOptions): string;","call":"renderToSVG(program)","route":"/reference/runtime/#ggactionsvg"},{"id":"runtime.renderToPNG","kind":"runtime","name":"renderToPNG","order":100,"anchors":["renderer.png"],"covers":["renderer.png"],"signature":"renderToPNG(program: Pick<ChartProgram, \"graphicSpec\">, options: { output: string; pixelRatio?: number }): Promise<PNGRenderResult>;","call":"await renderToPNG(program, { output: \"chart.png\" })","route":"/reference/runtime/#ggactionpng"},{"id":"runtime.renderToPDF","kind":"runtime","name":"renderToPDF","order":100,"anchors":["renderer.pdf"],"covers":["renderer.pdf"],"signature":"renderToPDF(program: Pick<ChartProgram, \"graphicSpec\">, options: PDFRenderOptions): Promise<PDFRenderResult>;","call":"await renderToPDF(program, { output: \"chart.pdf\" })","route":"/reference/runtime/#ggactionpdf"}]}
1
+ {"schemaVersion":2,"packageVersion":"0.0.23","constraints":[{"id":"program.canvas","phrases":["chart canvas","create canvas","plot bounds"]},{"id":"program.data","phrases":["create dataset","load rows","inline data"]},{"id":"chart.scatter","phrases":["scatter plot","scatter chart","point chart"]},{"id":"chart.dot","phrases":["dot plot","categorical dot plot","category dot chart"]},{"id":"chart.lollipop","phrases":["lollipop plot","lollipop chart","baseline stem chart"]},{"id":"chart.dumbbell","phrases":["dumbbell plot","dumbbell chart","connected dot plot","before and after chart"]},{"id":"chart.ecdf","phrases":["ecdf plot","ecdf chart","empirical cumulative distribution","empirical cumulative distribution plot"]},{"id":"chart.interval","phrases":["interval plot","point interval plot","point and interval chart"]},{"id":"chart.regression","phrases":["regression plot","regression scatter plot","scatter plot with fit"],"shadows":["chart.scatter"]},{"id":"chart.line","phrases":["line chart","line plot","time series chart"]},{"id":"chart.bar","phrases":["bar chart","bar plot","column chart"]},{"id":"chart.bar.horizontal","phrases":["horizontal bar chart","horizontal bar plot","horizontal bars"],"shadows":["chart.bar"]},{"id":"chart.histogram","phrases":["histogram","binned distribution","frequency distribution","frequency histogram"]},{"id":"chart.heatmap","phrases":["heatmap","heat map","two dimensional distribution"]},{"id":"chart.parallel","phrases":["parallel coordinates","parallel coordinate plot"]},{"id":"chart.box","phrases":["box plot","boxplot","quartile plot"]},{"id":"chart.violin","phrases":["violin plot","violin chart"]},{"id":"chart.gradient","phrases":["gradient plot","density gradient"]},{"id":"chart.density","phrases":["density plot","density curve","kernel density plot"]},{"id":"chart.area","phrases":["area chart","area plot"]},{"id":"chart.rug","phrases":["rug plot","rug chart","edge tick distribution"]},{"id":"chart.strip","phrases":["strip plot","strip chart","jittered strip plot"]},{"id":"chart.beeswarm","phrases":["beeswarm plot","beeswarm chart","packed point plot","swarm plot"]},{"id":"chart.raincloud","phrases":["raincloud plot","raincloud chart","half violin with box and points","density summary raw points"]},{"id":"chart.horizon","phrases":["horizon chart","horizon plot"]},{"id":"chart.pie","phrases":["pie chart","pie plot"],"exclusiveGroup":"polar.partition-chart"},{"id":"chart.donut","phrases":["donut chart","doughnut chart","donut plot"],"exclusiveGroup":"polar.partition-chart"},{"id":"chart.rose","phrases":["rose chart","rose plot","coxcomb chart","polar area chart"],"shadows":["chart.bar","chart.area"]},{"id":"chart.radialBar","phrases":["radial bar chart","radial bar plot"],"shadows":["chart.bar"]},{"id":"chart.polarScatter","phrases":["polar scatter plot","polar scatter chart","radial scatter plot"],"shadows":["chart.scatter"]},{"id":"chart.polarLine","phrases":["polar line plot","polar line chart","radial line chart"],"shadows":["chart.line"]},{"id":"chart.radar","phrases":["radar chart","spider chart"]},{"id":"mark.point","phrases":["point mark","circle marks"]},{"id":"mark.tick","phrases":["tick mark","tick plot"]},{"id":"mark.text","phrases":["text mark","data labels"]},{"id":"mark.line","phrases":["line mark","path mark"]},{"id":"mark.bar","phrases":["bar mark","rectangle bars"]},{"id":"mark.area","phrases":["area mark","filled area"]},{"id":"mark.rule","phrases":["rule mark","reference line mark"],"shadows":["mark.line"]},{"id":"mark.arc","phrases":["arc mark","polar sectors"]},{"id":"mark.rect","phrases":["rect mark","rectangle cells"]},{"id":"transform.filter","phrases":["filter data","filtered dataset","filter rows"]},{"id":"transform.density","phrases":["density data","kde data","kernel density data"]},{"id":"transform.regression","phrases":["regression data","fitted rows","loess data"]},{"id":"transform.window","phrases":["moving average","moving mean","window transform","rank rows","lag values"]},{"id":"transform.timeUnit","phrases":["time unit","date bucket","month bucket","year bucket"]},{"id":"transform.bin1d","phrases":["bin one field","one dimensional bins","histogram bins"]},{"id":"transform.bin2d","phrases":["bin two fields","two dimensional bins","2d bins","bin2d","rectangular bins","binned heatmap"]},{"id":"transform.interval","phrases":["interval data","confidence interval data","summary interval"]},{"id":"transform.ecdf","phrases":["ecdf data","empirical cumulative distribution data","cumulative probability transform"]},{"id":"statistics.regression","phrases":["regression line","trend line","fitted line","regression fit","best fit line","fitted trend"]},{"id":"statistics.errorBar","phrases":["error bars","error bar","point and whisker","point whisker plot","uncertainty whiskers"]},{"id":"statistics.errorBand","phrases":["error band","uncertainty ribbon","confidence band"]},{"id":"scale.create","phrases":["create scale","named scale","custom scale"]},{"id":"scale.log","phrases":["log scale","logarithmic scale"]},{"id":"scale.time","phrases":["time scale","temporal scale"]},{"id":"scale.color","phrases":["color scale","colour scale","palette scale"]},{"id":"encoding.channels","phrases":["atomic encoding update","encode channels together","batch encoding channels"]},{"id":"encoding.x","phrases":["x encoding","encode x","map to x"]},{"id":"encoding.y","phrases":["y encoding","encode y","map to y"]},{"id":"encoding.color","phrases":["color encoding","encode color","map to color","color legend","colour legend"]},{"id":"encoding.size","phrases":["size encoding","encode size","map to size","size legend"]},{"id":"encoding.shape","phrases":["shape encoding","encode shape","map to shape","shape legend"]},{"id":"encoding.angle","phrases":["angle encoding","encode angle","rotate ticks","rotate points"]},{"id":"encoding.opacity","phrases":["opacity encoding","encode opacity","map to opacity","opacity legend"]},{"id":"encoding.strokeDash","phrases":["stroke dash encoding","stroke dash","dashed stroke","dash encoding","line style encoding","stroke dash legend"]},{"id":"encoding.strokeWidth","phrases":["stroke width encoding","encode stroke width","line width encoding","stroke width legend"]},{"id":"encoding.text","phrases":["text encoding","encode text","label field"]},{"id":"encoding.group","phrases":["group encoding","group series","series grouping"]},{"id":"encoding.theta","phrases":["theta encoding","angular encoding","encode theta"]},{"id":"encoding.radius","phrases":["radius encoding","radial encoding","encode radius"]},{"id":"encoding.parallel","phrases":["parallel dimensions","dimension axes"]},{"id":"guide.all","phrases":["create guides","automatic guides","all guides"]},{"id":"guide.axes","phrases":["axes","axis guides","x and y axes"]},{"id":"guide.xAxis","phrases":["x axis","horizontal axis"]},{"id":"guide.yAxis","phrases":["y axis","vertical axis"]},{"id":"guide.thetaAxis","phrases":["theta axis","angular axis"]},{"id":"guide.radialAxis","phrases":["radial axis","radius axis"]},{"id":"guide.legend","phrases":["legend","encoding key"]},{"id":"guide.grid","phrases":["grid lines","chart grid","reference grid","grid"]},{"id":"guide.title","phrases":["chart title","add title","with title","titled","title and subtitle"]},{"id":"guide.subtitle","phrases":["subtitle","title and subtitle"]},{"id":"layout.coordinateAspect","phrases":["coordinate aspect ratio","equal data units","equal axis units","square plot frame"]},{"id":"layout.polarFrame","phrases":["move polar chart center","polar frame radius","fixed polar radius","off-center polar plot"]},{"id":"layout.legend.bottom","phrases":["legend at bottom","bottom legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.top","phrases":["legend at top","top legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.left","phrases":["legend at left","left legend"],"exclusiveGroup":"legend.position"},{"id":"layout.legend.right","phrases":["legend at right","right legend"],"exclusiveGroup":"legend.position"},{"id":"layout.labels","phrases":["avoid label overlap","label collision","layout labels","label collision avoidance"]},{"id":"layout.labels.semanticPlacement","phrases":["labels outside bars","bar end labels","inside arc labels","semantic label placement","reset label placement"]},{"id":"selection.labels.membership","phrases":["select labels","edit label selection","label only selected items","show all labels"]},{"id":"lifecycle.labels.remove","phrases":["remove mark labels","remove labels","delete mark labels","delete attached labels","remove labels from bar","remove labels from bars"]},{"id":"layout.jitter","phrases":["jitter points","point jitter","reduce overplotting"]},{"id":"layout.packing","phrases":["pack points","point packing","avoid point overlap","collision free points"]},{"id":"layout.categoryOrder","phrases":["order categories","sort categories","category order"]},{"id":"layout.facet","phrases":["facet chart","small multiples","repeat chart by field"]},{"id":"selection.store","phrases":["store selection","reusable selection","select marks"]},{"id":"selection.highlight","phrases":["highlight marks","highlight selected","conditional highlight"]},{"id":"selection.filter","phrases":["filter marks","retain matching marks"]},{"id":"composition.horizontal","phrases":["horizontal concat","horizontally concatenate","charts side by side"]},{"id":"composition.vertical","phrases":["vertical concat","vertically concatenate","stack charts vertically"]},{"id":"renderer.canvas","phrases":["render to canvas","browser canvas","canvas renderer","as canvas","on canvas","on the chart canvas"]},{"id":"renderer.svg","phrases":["render svg","export svg","svg output","as svg","vector svg","svg document","accessible svg","svg"]},{"id":"renderer.png","phrases":["render png","export png","png output","as png"]},{"id":"renderer.pdf","phrases":["render pdf","export pdf","pdf output","as pdf","vector pdf","pdf document"]},{"id":"unsupported.geo","phrases":["map chart","geographic chart","geo projection","choropleth"],"unsupported":"Geographic projections and map marks are outside the current ggaction contract."},{"id":"unsupported.animation","phrases":["animate chart","chart animation","animated transition","animated chart","animation","transitions"],"unsupported":"Animation is outside the current static-chart contract."},{"id":"unsupported.interaction","phrases":["interactive tooltip","hover tooltip","tooltip on hover","tooltip","tooltips","zoom interaction","pan interaction","brush interaction","hover interaction","click interaction","interactive chart","event handling"],"unsupported":"Interactive runtime behaviors are outside the current static-chart contract."},{"id":"unsupported.3d","phrases":["3d chart","three dimensional chart","three dimensional plot"],"unsupported":"Three-dimensional charts are not supported."},{"id":"unsupported.jpg","phrases":["export jpg","render jpeg","jpeg output","jpeg image","jpg image"],"unsupported":"JPEG is not a current renderer; use SVG, PNG, PDF, or Browser Canvas."}],"providers":[{"id":"action.createCanvas","kind":"action","name":"createCanvas","order":10,"anchors":["program.canvas"],"covers":["program.canvas"],"baseOptions":{}},{"id":"action.createData","kind":"action","name":"createData","order":20,"anchors":["program.data"],"covers":["program.data"],"baseOptions":{"values":"[{ category: \"A\", x: 1, y: 2, value: 3 }]"}},{"id":"action.createScatterPlot","kind":"action","name":"createScatterPlot","order":40,"anchors":["chart.scatter"],"covers":["chart.scatter","encoding.x","encoding.y","encoding.color","encoding.size","encoding.shape","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createDotPlot","kind":"action","name":"createDotPlot","order":40,"anchors":["chart.dot"],"covers":["chart.dot","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""}},{"id":"action.createLollipopPlot","kind":"action","name":"createLollipopPlot","order":40,"anchors":["chart.lollipop"],"covers":["chart.lollipop","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""}},{"id":"action.createDumbbellPlot","kind":"action","name":"createDumbbellPlot","order":40,"anchors":["chart.dumbbell"],"covers":["chart.dumbbell","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"category":"\"category\"","start":"\"before\"","end":"\"after\""}},{"id":"action.createECDFPlot","kind":"action","name":"createECDFPlot","order":40,"anchors":["chart.ecdf"],"covers":["chart.ecdf","transform.ecdf","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"field":"\"value\""}},{"id":"action.createIntervalPlot","kind":"action","name":"createIntervalPlot","order":40,"anchors":["chart.interval"],"covers":["chart.interval","statistics.errorBar","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"x":"\"category\"","y":"\"value\""}},{"id":"action.createRegressionPlot","kind":"action","name":"createRegressionPlot","order":40,"anchors":["chart.regression"],"covers":["chart.regression","chart.scatter","statistics.regression","statistics.errorBand","encoding.x","encoding.y","guide.axes","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createLinePlot","kind":"action","name":"createLinePlot","order":40,"anchors":["chart.line"],"covers":["chart.line","encoding.x","encoding.y","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.group":{"groupBy":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createBarPlot","kind":"action","name":"createBarPlot","order":40,"anchors":["chart.bar"],"covers":["chart.bar","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"category\"","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createHorizontalBar","kind":"action","name":"createBarMark","order":40,"anchors":["chart.bar.horizontal"],"covers":["chart.bar.horizontal"],"baseOptions":{"id":"\"bar\""}},{"id":"action.createHistogram","kind":"action","name":"createHistogram","order":40,"anchors":["chart.histogram"],"covers":["chart.histogram","transform.bin1d","encoding.color","guide.axes","guide.legend"],"baseOptions":{"field":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createHeatmap","kind":"action","name":"createHeatmap","order":40,"anchors":["chart.heatmap"],"covers":["chart.heatmap","transform.bin2d","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"x\"","y":"\"y\"","bin":"{}"},"optionsByConstraint":{"encoding.color":{"color":"{}"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createParallelCoordinates","kind":"action","name":"createParallelCoordinates","order":40,"anchors":["chart.parallel"],"covers":["chart.parallel","encoding.parallel","encoding.color","encoding.strokeDash","guide.axes","guide.legend"],"baseOptions":{"dimensions":"[\"a\", \"b\"]"},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createBoxPlot","kind":"action","name":"createBoxPlot","order":40,"anchors":["chart.box"],"covers":["chart.box","guide.axes"],"baseOptions":{},"optionsByConstraint":{"guide.axes":{"guides":"{}"}}},{"id":"action.createViolinPlot","kind":"action","name":"createViolinPlot","order":40,"anchors":["chart.violin"],"covers":["chart.violin","encoding.color","guide.axes","guide.legend"],"baseOptions":{"x":"\"category\"","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"}}},{"id":"action.createGradientPlot","kind":"action","name":"createGradientPlot","order":40,"anchors":["chart.gradient"],"covers":["chart.gradient","guide.axes"],"baseOptions":{},"optionsByConstraint":{"guide.axes":{"guides":"{}"}}},{"id":"action.createDensityPlot","kind":"action","name":"createDensityPlot","order":50,"anchors":["chart.density"],"covers":["chart.density","guide.axes","guide.xAxis","guide.yAxis","guide.grid","guide.all"],"baseOptions":{"field":"\"value\""}},{"id":"action.createAreaPlot","kind":"action","name":"createAreaPlot","order":10,"anchors":["chart.area"],"covers":["chart.area","encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createRugPlot","kind":"action","name":"createRugPlot","order":40,"anchors":["chart.rug"],"covers":["chart.rug","encoding.x","guide.axes","guide.xAxis","guide.all"],"baseOptions":{"x":"\"value\"","edge":"\"bottom\""}},{"id":"action.createStripPlot","kind":"action","name":"createStripPlot","order":40,"anchors":["chart.strip"],"covers":["chart.strip","encoding.x","encoding.color","encoding.size","encoding.shape","guide.axes","guide.xAxis","guide.legend","guide.all","layout.jitter"],"baseOptions":{"x":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.xAxis":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.jitter":{"jitter":"{ maxOffset: { pixels: 4 }, seed: \"strip\" }"}}},{"id":"action.createBeeswarmPlot","kind":"action","name":"createBeeswarmPlot","order":40,"anchors":["chart.beeswarm"],"covers":["chart.beeswarm","encoding.x","encoding.y","encoding.color","encoding.size","encoding.shape","guide.axes","guide.legend","guide.all","layout.packing"],"baseOptions":{"x":"{ field: \"category\", fieldType: \"nominal\" }","y":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"color":"\"category\"","guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.packing":{"packing":"{ key: \"id\" }"}}},{"id":"action.createRaincloudPlot","kind":"action","name":"createRaincloudPlot","order":40,"anchors":["chart.raincloud"],"covers":["chart.raincloud","encoding.x","encoding.y","encoding.color","guide.axes","guide.legend","guide.all","layout.packing"],"baseOptions":{"category":"{ field: \"category\", fieldType: \"nominal\" }","value":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"guide.axes":{"guides":"{}"},"guide.legend":{"color":"\"category\"","guides":"{ legend: {} }"},"guide.all":{"guides":"{}"},"layout.packing":{"points":"{ type: \"beeswarm\", packing: { key: \"id\" } }"}}},{"id":"action.createHorizonPlot","kind":"action","name":"createHorizonPlot","order":50,"anchors":["chart.horizon"],"covers":["chart.horizon","encoding.x","encoding.y","guide.axes","guide.xAxis","guide.grid","guide.all"],"baseOptions":{"x":"\"x\"","y":"\"y\""}},{"id":"action.createPieChart","kind":"action","name":"createPiePlot","order":40,"anchors":["chart.pie"],"covers":["chart.pie","encoding.color","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createDonutChart","kind":"action","name":"createPiePlot","order":40,"anchors":["chart.donut"],"covers":["chart.donut","encoding.color","guide.legend","guide.all"],"baseOptions":{"category":"\"category\"","arc":"{ innerRadius: 0.55, padAngle: 2 }"}},{"id":"action.createRoseChart","kind":"action","name":"createRosePlot","order":40,"anchors":["chart.rose"],"covers":["chart.rose","encoding.theta","encoding.radius","encoding.color","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createRadialBarChart","kind":"action","name":"createRadialBarPlot","order":40,"anchors":["chart.radialBar"],"covers":["chart.radialBar","encoding.theta","encoding.radius","encoding.color","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\""}},{"id":"action.createPolarScatterPlot","kind":"action","name":"createPolarScatterPlot","order":40,"anchors":["chart.polarScatter"],"covers":["chart.polarScatter","encoding.theta","encoding.radius","encoding.color","encoding.size","encoding.shape","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"theta":"\"angle\"","radius":"\"distance\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.size":{"size":"\"value\""},"encoding.shape":{"shape":"\"category\""},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createPolarLinePlot","kind":"action","name":"createPolarLinePlot","order":40,"anchors":["chart.polarLine"],"covers":["chart.polarLine","encoding.theta","encoding.radius","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"theta":"\"angle\"","radius":"\"distance\""},"optionsByConstraint":{"encoding.color":{"color":"\"category\""},"encoding.group":{"groupBy":"\"category\""},"encoding.strokeDash":{"strokeDash":"{ field: \"category\" }"},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createRadarPlot","kind":"action","name":"createRadarPlot","order":40,"anchors":["chart.radar"],"covers":["chart.radar","encoding.theta","encoding.radius","encoding.color","encoding.group","encoding.strokeDash","guide.axes","guide.grid","guide.legend","guide.all"],"baseOptions":{"category":"\"category\"","value":"\"value\""},"optionsByConstraint":{"encoding.color":{"color":"\"series\""},"encoding.group":{"groupBy":"\"series\""},"encoding.strokeDash":{"strokeDash":"{ field: \"series\" }"},"guide.axes":{"guides":"{}"},"guide.grid":{"guides":"{}"},"guide.legend":{"guides":"{ legend: {} }"},"guide.all":{"guides":"{}"}}},{"id":"action.createPointMark","kind":"action","name":"createPointMark","order":40,"anchors":["mark.point"],"covers":["mark.point"],"baseOptions":{}},{"id":"action.createTickMark","kind":"action","name":"createTickMark","order":40,"anchors":["mark.tick"],"covers":["mark.tick"],"baseOptions":{}},{"id":"action.createTextMark","kind":"action","name":"createTextMark","order":40,"anchors":["mark.text"],"covers":["mark.text"],"baseOptions":{}},{"id":"action.createLineMark","kind":"action","name":"createLineMark","order":40,"anchors":["mark.line"],"covers":["mark.line"],"baseOptions":{}},{"id":"action.createBarMark","kind":"action","name":"createBarMark","order":40,"anchors":["mark.bar"],"covers":["mark.bar"],"baseOptions":{}},{"id":"action.createAreaMark","kind":"action","name":"createAreaMark","order":40,"anchors":["mark.area"],"covers":["mark.area"],"baseOptions":{}},{"id":"action.createRuleMark","kind":"action","name":"createRuleMark","order":40,"anchors":["mark.rule"],"covers":["mark.rule"],"baseOptions":{}},{"id":"action.createArcMark","kind":"action","name":"createArcMark","order":40,"anchors":["mark.arc"],"covers":["mark.arc"],"baseOptions":{}},{"id":"action.createRectMark","kind":"action","name":"createRectMark","order":40,"anchors":["mark.rect"],"covers":["mark.rect"],"baseOptions":{}},{"id":"action.filterData","kind":"action","name":"filterData","order":30,"anchors":["transform.filter"],"covers":["transform.filter"],"baseOptions":{"id":"\"filtered\"","field":"\"value\"","predicate":"{ op: \"gt\", value: 0 }"}},{"id":"action.createDensityData","kind":"action","name":"createDensityData","order":30,"anchors":["transform.density"],"covers":["transform.density"],"baseOptions":{"id":"\"density\"","field":"\"value\""}},{"id":"action.createRegressionData","kind":"action","name":"createRegressionData","order":30,"anchors":["transform.regression"],"covers":["transform.regression"],"baseOptions":{"id":"\"regression\"","x":"\"x\"","y":"\"y\""}},{"id":"action.createWindowData","kind":"action","name":"createWindowData","order":30,"anchors":["transform.window"],"covers":["transform.window"],"baseOptions":{"id":"\"windowed\"","operations":"[{ op: \"movingMean\", field: \"value\", as: \"movingMean\", frame: { preceding: 2 } }]"}},{"id":"action.createTimeUnitData","kind":"action","name":"createTimeUnitData","order":30,"anchors":["transform.timeUnit"],"covers":["transform.timeUnit"],"baseOptions":{"id":"\"monthly\"","field":"\"date\"","unit":"\"month\"","as":"\"month\""}},{"id":"action.encodeHistogram","kind":"action","name":"encodeHistogram","order":50,"anchors":["transform.bin1d"],"covers":["transform.bin1d"],"baseOptions":{"field":"\"value\""}},{"id":"action.createBin2DData","kind":"action","name":"createBin2DData","order":30,"anchors":["transform.bin2d"],"covers":["transform.bin2d"],"baseOptions":{"id":"\"bins\"","x":"\"x\"","y":"\"y\""}},{"id":"action.createIntervalData","kind":"action","name":"createIntervalData","order":30,"anchors":["transform.interval"],"covers":["transform.interval"],"baseOptions":{"id":"\"interval\"","field":"\"value\""}},{"id":"action.createECDFData","kind":"action","name":"createECDFData","order":30,"anchors":["transform.ecdf"],"covers":["transform.ecdf"],"baseOptions":{"id":"\"ecdf\"","field":"\"value\""}},{"id":"action.createRegression","kind":"action","name":"createRegression","order":60,"anchors":["statistics.regression"],"covers":["mark.line","transform.regression","statistics.regression","statistics.errorBand"],"baseOptions":{}},{"id":"action.createErrorBar","kind":"action","name":"createErrorBar","order":60,"anchors":["statistics.errorBar"],"covers":["statistics.errorBar"],"baseOptions":{}},{"id":"action.createErrorBand","kind":"action","name":"createErrorBand","order":61,"anchors":["statistics.errorBand"],"covers":["statistics.errorBand"],"baseOptions":{}},{"id":"action.createScale","kind":"action","name":"createScale","order":35,"anchors":["scale.create"],"covers":["scale.create"],"baseOptions":{"id":"\"scale-1\""}},{"id":"action.createLogScale","kind":"action","name":"createScale","order":35,"anchors":["scale.log"],"covers":["scale.log"],"baseOptions":{"id":"\"scale-1\"","type":"\"log\""}},{"id":"action.createTimeScale","kind":"action","name":"createScale","order":35,"anchors":["scale.time"],"covers":["scale.time"],"baseOptions":{"id":"\"scale-1\"","type":"\"time\""}},{"id":"action.createColorScale","kind":"action","name":"createScale","order":35,"anchors":["scale.color"],"covers":["scale.color"],"baseOptions":{"id":"\"color-scale\"","type":"\"ordinal\"","range":"{ palette: \"tableau10\" }"}},{"id":"action.encodeX","kind":"action","name":"encodeX","order":50,"anchors":["encoding.x"],"covers":["encoding.x"],"baseOptions":{"field":"\"x\""}},{"id":"action.encodeY","kind":"action","name":"encodeY","order":50,"anchors":["encoding.y"],"covers":["encoding.y"],"baseOptions":{"field":"\"y\""}},{"id":"action.encodeChannels","kind":"action","name":"encodeChannels","order":51,"anchors":["encoding.channels"],"covers":["encoding.channels"],"baseOptions":{"target":"\"point\"","channels":"{ x: { field: \"x\" }, y: { field: \"y\" } }"}},{"id":"action.encodeColor","kind":"action","name":"encodeColor","order":55,"anchors":["encoding.color"],"covers":["encoding.color"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeSize","kind":"action","name":"encodeSize","order":55,"anchors":["encoding.size"],"covers":["encoding.size"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeShape","kind":"action","name":"encodeShape","order":55,"anchors":["encoding.shape"],"covers":["encoding.shape"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeAngle","kind":"action","name":"encodeAngle","order":55,"anchors":["encoding.angle"],"covers":["encoding.angle"],"baseOptions":{"value":"45"}},{"id":"action.encodeOpacity","kind":"action","name":"encodeOpacity","order":55,"anchors":["encoding.opacity"],"covers":["encoding.opacity"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeStrokeDash","kind":"action","name":"encodeStrokeDash","order":55,"anchors":["encoding.strokeDash"],"covers":["encoding.strokeDash"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeStrokeWidth","kind":"action","name":"encodeStrokeWidth","order":55,"anchors":["encoding.strokeWidth"],"covers":["encoding.strokeWidth"],"baseOptions":{"value":"2"}},{"id":"action.encodeText","kind":"action","name":"encodeText","order":55,"anchors":["encoding.text"],"covers":["encoding.text"],"baseOptions":{"field":"\"label\""}},{"id":"action.encodeGroup","kind":"action","name":"encodeGroup","order":52,"anchors":["encoding.group"],"covers":["encoding.group"],"baseOptions":{"field":"\"category\""}},{"id":"action.encodeTheta","kind":"action","name":"encodeTheta","order":50,"anchors":["encoding.theta"],"covers":["encoding.theta"],"baseOptions":{"field":"\"angle\""}},{"id":"action.encodeR","kind":"action","name":"encodeR","order":50,"anchors":["encoding.radius"],"covers":["encoding.radius"],"baseOptions":{"field":"\"value\""}},{"id":"action.encodeParallelCoordinates","kind":"action","name":"encodeParallelCoordinates","order":50,"anchors":["encoding.parallel"],"covers":["encoding.parallel"],"baseOptions":{"dimensions":"[\"a\", \"b\"]"}},{"id":"action.createGuides","kind":"action","name":"createGuides","order":70,"anchors":["guide.all"],"covers":["guide.all","guide.axes","guide.legend","guide.grid"],"baseOptions":{}},{"id":"action.createAxes","kind":"action","name":"createAxes","order":70,"anchors":["guide.axes"],"covers":["guide.axes"],"baseOptions":{}},{"id":"action.createXAxis","kind":"action","name":"createXAxis","order":70,"anchors":["guide.xAxis"],"covers":["guide.xAxis"],"baseOptions":{}},{"id":"action.createYAxis","kind":"action","name":"createYAxis","order":70,"anchors":["guide.yAxis"],"covers":["guide.yAxis"],"baseOptions":{}},{"id":"action.createThetaAxis","kind":"action","name":"createThetaAxis","order":70,"anchors":["guide.thetaAxis"],"covers":["guide.thetaAxis"],"baseOptions":{}},{"id":"action.createRadialAxis","kind":"action","name":"createRadialAxis","order":70,"anchors":["guide.radialAxis"],"covers":["guide.radialAxis"],"baseOptions":{}},{"id":"action.createLegend","kind":"action","name":"createLegend","order":70,"anchors":["guide.legend"],"covers":["guide.legend"],"baseOptions":{}},{"id":"action.createGrid","kind":"action","name":"createGrid","order":70,"anchors":["guide.grid"],"covers":["guide.grid"],"baseOptions":{}},{"id":"action.createTitle","kind":"action","name":"createTitle","order":70,"anchors":["guide.title","guide.subtitle"],"covers":["guide.title","guide.subtitle"],"baseOptions":{"text":"\"Chart title\""},"optionsByConstraint":{"guide.subtitle":{"subtitle":"\"Chart subtitle\""}}},{"id":"action.editCoordinate","kind":"action","name":"editCoordinate","order":80,"anchors":["layout.coordinateAspect"],"covers":["layout.coordinateAspect"],"baseOptions":{"target":"\"main\"","aspect":"{ mode: \"data\", ratio: 1 }"}},{"id":"action.editPolarFrame","kind":"action","name":"editCoordinate","order":80,"anchors":["layout.polarFrame"],"covers":["layout.polarFrame"],"baseOptions":{"target":"\"polar\"","polarFrame":"{ center: { x: 0.4, y: 0.5 }, radius: { unit: \"fraction\", value: 0.9 } }"}},{"id":"action.legendBottom","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.bottom"],"covers":["layout.legend.bottom"],"baseOptions":{"position":"\"bottom\""}},{"id":"action.legendTop","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.top"],"covers":["layout.legend.top"],"baseOptions":{"position":"\"top\""}},{"id":"action.legendLeft","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.left"],"covers":["layout.legend.left"],"baseOptions":{"position":"\"left\""}},{"id":"action.legendRight","kind":"action","name":"editLegendLayout","order":80,"anchors":["layout.legend.right"],"covers":["layout.legend.right"],"baseOptions":{"position":"\"right\""}},{"id":"action.layoutLabels","kind":"action","name":"layoutLabels","order":80,"anchors":["layout.labels"],"covers":["layout.labels"],"baseOptions":{"axis":"\"y\""}},{"id":"action.editMarkLabelSelection","kind":"action","name":"editMarkLabelSelection","order":80,"anchors":["selection.labels.membership"],"covers":["selection.labels.membership"],"baseOptions":{"target":"\"labels\"","all":"true"}},{"id":"action.editMarkLabelPlacement","kind":"action","name":"editMarkLabelPlacement","order":80,"anchors":["layout.labels.semanticPlacement"],"covers":["layout.labels.semanticPlacement"],"baseOptions":{"target":"\"labels\"","placement":"{ anchor: \"outsideEnd\" }"}},{"id":"action.removeMarkLabels","kind":"action","name":"removeMarkLabels","order":80,"anchors":["lifecycle.labels.remove"],"covers":["lifecycle.labels.remove"],"baseOptions":{"source":"\"bars\""}},{"id":"action.jitterPoints","kind":"action","name":"jitterPoints","order":80,"anchors":["layout.jitter"],"covers":["layout.jitter"],"baseOptions":{"channel":"\"x\"","maxOffset":"{ pixels: 4 }"}},{"id":"action.packPoints","kind":"action","name":"packPoints","order":80,"anchors":["layout.packing"],"covers":["layout.packing"],"baseOptions":{"channel":"\"x\""}},{"id":"action.orderCategories","kind":"action","name":"orderCategories","order":80,"anchors":["layout.categoryOrder"],"covers":["layout.categoryOrder"],"baseOptions":{"channel":"\"x\"","by":"\"category\""}},{"id":"action.facet","kind":"action","name":"facet","order":80,"anchors":["layout.facet"],"covers":["layout.facet","guide.axes","guide.legend"],"baseOptions":{"field":"\"category\""},"optionsByConstraint":{"guide.axes":{"guides":"{ axes: \"outer\", legend: \"shared\" }"},"guide.legend":{"guides":"{ axes: \"outer\", legend: \"shared\" }"}}},{"id":"action.selectMarks","kind":"action","name":"selectMarks","order":75,"anchors":["selection.store"],"covers":["selection.store"],"baseOptions":{"id":"\"selection-1\"","field":"\"category\"","op":"\"eq\"","value":"\"A\""}},{"id":"action.highlightMarks","kind":"action","name":"highlightMarks","order":76,"anchors":["selection.highlight"],"covers":["selection.highlight"],"baseOptions":{"select":"{ field: \"category\", op: \"eq\", value: \"A\" }","color":"\"#f28e2b\""}},{"id":"action.filterMarks","kind":"action","name":"filterMarks","order":75,"anchors":["selection.filter"],"covers":["selection.filter"],"baseOptions":{"field":"\"value\"","op":"\"gt\"","value":"0"}},{"id":"runtime.hconcat","kind":"runtime","name":"hconcat","order":90,"anchors":["composition.horizontal"],"covers":["composition.horizontal"],"signature":"hconcat(options: CompositionOptions): ChartProgram;","call":"hconcat({ programs: [program, program] })","route":"/reference/runtime/#ggaction"},{"id":"runtime.vconcat","kind":"runtime","name":"vconcat","order":90,"anchors":["composition.vertical"],"covers":["composition.vertical"],"signature":"vconcat(options: CompositionOptions): ChartProgram;","call":"vconcat({ programs: [program, program] })","route":"/reference/runtime/#ggaction"},{"id":"runtime.render","kind":"runtime","name":"render","order":100,"anchors":["renderer.canvas"],"covers":["renderer.canvas"],"signature":"render(program: Pick<ChartProgram, \"graphicSpec\">, context: CanvasRenderingContext2D, options?: { pixelRatio?: number }): void;","call":"render(program, context)","route":"/reference/runtime/#ggaction"},{"id":"runtime.renderToSVG","kind":"runtime","name":"renderToSVG","order":100,"anchors":["renderer.svg"],"covers":["renderer.svg"],"signature":"renderToSVG(program: Pick<ChartProgram, \"graphicSpec\">, options?: SVGRenderOptions): string;","call":"renderToSVG(program)","route":"/reference/runtime/#ggactionsvg"},{"id":"runtime.renderToPNG","kind":"runtime","name":"renderToPNG","order":100,"anchors":["renderer.png"],"covers":["renderer.png"],"signature":"renderToPNG(program: Pick<ChartProgram, \"graphicSpec\">, options: { output: string; pixelRatio?: number }): Promise<PNGRenderResult>;","call":"await renderToPNG(program, { output: \"chart.png\" })","route":"/reference/runtime/#ggactionpng"},{"id":"runtime.renderToPDF","kind":"runtime","name":"renderToPDF","order":100,"anchors":["renderer.pdf"],"covers":["renderer.pdf"],"signature":"renderToPDF(program: Pick<ChartProgram, \"graphicSpec\">, options: PDFRenderOptions): Promise<PDFRenderResult>;","call":"await renderToPDF(program, { output: \"chart.pdf\" })","route":"/reference/runtime/#ggactionpdf"}]}
@@ -1 +1 @@
1
- {"schemaVersion":2,"packageVersion":"0.0.22","overview":{"title":"ggaction compact authoring overview","text":"Use search_ggaction once with only the exact user chart request; do not append dataset contents or code scaffolding. The result contains exact authoring imports, chart() initialization, non-duplicated createCanvas and createData prerequisites, syntax-valid immutable steps with deterministic runtime dependencies closed, ordered actionPlan entries, applied options, explicit placeholder bindings, unmatched requirements, canonical routes, terminal unsupported constraints, and open unresolved decisions. Do not treat template field names as inferred dataset facts. Do not preload the full documentation. Read an action card when one exact action needs more detail. Read only the resource URIs attached to unresolved entries; unsupported entries are terminal and require no documentation read. The server is read-only and never executes chart code."},"recipes":[{"id":"scatter-svg","title":"Scatterplot with a bottom color legend and SVG output","summary":"Selects the chart facade, legend layout action, and browser-safe SVG renderer in execution order.","query":"scatter plot with a color legend at bottom as svg"},{"id":"moving-average-line-png","title":"Moving-average line chart as PNG","summary":"Combines a window transform, line facade, guides, and the Node PNG renderer.","query":"moving average line chart with axes and export png"},{"id":"binned-heatmap","title":"Binned heatmap with guides","summary":"Uses the heatmap facade to own 2D binning, position, color, axes, and legend requirements.","query":"binned heatmap with color legend and axes"},{"id":"regression-scatterplot","title":"Scatterplot with a regression layer","summary":"Builds the scatterplot before adding the statistical regression layer.","query":"scatter plot with a regression line"},{"id":"selection-highlight","title":"Stored selection and highlight","summary":"Stores a named mark selection before applying a graphical highlight to that selection.","query":"store selection then highlight marks"},{"id":"parallel-svg","title":"Styled parallel coordinates as SVG","summary":"Combines parallel coordinates, color and dash encodings, guides, and SVG output.","query":"parallel coordinates with color encoding, stroke dash encoding, axes, and legend as svg"},{"id":"facet-shared-guides","title":"Small multiples with shared guides","summary":"Uses the facet action as the owner of the small-multiple layout and shared guides.","query":"small multiples with shared legend and axes"},{"id":"horizontal-composition-svg","title":"Horizontal chart composition as SVG","summary":"Composes complete programs horizontally before serializing the parent program to SVG.","query":"put charts side by side and export svg"}],"docs":[{"id":"choose-chart-type","title":"Choose a chart or mark type","route":"/api/basic-charts/","text":"# Choose a chart or mark type\n\nName the intended chart or mark. Common complete chart facades are `createScatterPlot`, `createLinePlot`, `createBarPlot`, `createHistogram`, and `createHeatmap`. For lower-level authoring, choose a mark such as point, line, area, bar, rect, rule, tick, text, or arc, then add its required position encodings. Run `search_ggaction` again with the chosen chart type."},{"id":"choose-renderer","title":"Choose an output renderer","route":"/api/rendering/","text":"# Choose an output renderer\n\nUse `render(program, context)` for Browser Canvas, `renderToSVG(program)` for a browser-safe SVG string, `renderToPNG(program, output)` for Node PNG output, or `renderToPDF(program, output)` for a single-page vector PDF. Run `search_ggaction` again with one explicit format. JPEG output is not currently supported."},{"id":"legend-layout","title":"Resolve legend layout requirements","route":"/api/legends/","text":"# Resolve legend layout requirements\n\nA single legend resource can occupy one position at a time. Choose `top`, `bottom`, `left`, or `right`, or give distinct legends explicit IDs and edit each target separately. Run `search_ggaction` again with one position per legend."},{"id":"unsupported-capabilities","title":"Current static-chart limitations","route":"/supported-features/","text":"# Current static-chart limitations\n\nThe current authoring contract does not provide geographic maps, animation, interactive event handling, 3D charts, or JPEG rendering. The compact resolver reports these requirements explicitly instead of substituting a different chart. Consult the supported-features route before redesigning the task with current static actions."},{"id":"getting-started","title":"Clarify an unrecognized authoring request","route":"/getting-started/","text":"# Clarify an authoring request\n\nDescribe the chart or mark, its data/transform needs, position and appearance encodings, guides or layout, and output format in one request. Exact action names are also accepted. Example: `scatter plot with x and y, a bottom color legend, and SVG output`."},{"id":"action-reference","title":"Resolve a current action gap","route":"/reference/actions/","text":"# Resolve a current action gap\n\nUse the complete action reference only for a constraint that the compact resolver recognized but could not cover. Confirm the exact action signature, required resource ID, and supported options, then rerun `search_ggaction` with the exact action name and complete task request."},{"id":"responsive-layout","title":"Resolve responsive size and pixel density","route":"/responsive-charts/","text":"# Resolve responsive layout\n\nA ggaction program is immutable and has concrete Canvas dimensions. Measure the host container, choose the intended aspect ratio and pixel ratio, rebuild with `editCanvas`, and rerender from a `ResizeObserver`. Do not rely on CSS scaling as chart layout. Run `search_ggaction` again only after concrete dimensions or a host resize policy are known."},{"id":"accessibility","title":"Resolve output accessibility requirements","route":"/accessibility/","text":"# Resolve output accessibility\n\nChoose an output-specific accessible name and description, provide a data-table or textual alternative, and avoid color-only meaning. SVG supports explicit `title` and `description` renderer options. Canvas requires host ARIA and fallback content. Use exportAccessibleData from ggaction/accessibility for final visual rows and composition hierarchy; see /api/rendering/#accessible-data-alternatives for its schema and unsupported-owner errors. The host creates the actual table. Static output does not add keyboard interaction or tooltips."}]}
1
+ {"schemaVersion":2,"packageVersion":"0.0.23","overview":{"title":"ggaction compact authoring overview","text":"Use search_ggaction with the exact user chart request, up to 500 characters per query; retain longer requests in host context, split into bounded tasks, and reconcile every original requirement; do not append dataset contents or code scaffolding. The result contains exact authoring imports, chart() initialization, non-duplicated createCanvas and createData prerequisites, syntax-valid immutable steps with deterministic runtime dependencies closed, ordered actionPlan entries, applied options, explicit placeholder bindings, unmatched requirements, canonical routes, terminal unsupported constraints, and open unresolved decisions. Do not treat template field names as inferred dataset facts. Do not preload the full documentation. Read an action card when one exact action needs more detail. Read only the resource URIs attached to unresolved entries; unsupported entries are terminal and require no documentation read. The server is read-only and never executes chart code. Resolved packets still require runtime validation. After an execution error, retain the prior program and inspect diagnostics; the latest unresolved-resource allowlist is not expanded by execution failure. Public documentation access is a separate host capability."},"recipes":[{"id":"scatter-svg","title":"Scatterplot with a bottom color legend and SVG output","summary":"Selects the chart facade, legend layout action, and browser-safe SVG renderer in execution order.","query":"scatter plot with a color legend at bottom as svg"},{"id":"moving-average-line-png","title":"Moving-average line chart as PNG","summary":"Combines a window transform, line facade, guides, and the Node PNG renderer.","query":"moving average line chart with axes and export png"},{"id":"binned-heatmap","title":"Binned heatmap with guides","summary":"Uses the heatmap facade to own 2D binning, position, color, axes, and legend requirements.","query":"binned heatmap with color legend and axes"},{"id":"regression-scatterplot","title":"Scatterplot with a regression layer","summary":"Builds the scatterplot before adding the statistical regression layer.","query":"scatter plot with a regression line"},{"id":"selection-highlight","title":"Stored selection and highlight","summary":"Stores a named mark selection before applying a graphical highlight to that selection.","query":"store selection then highlight marks"},{"id":"parallel-svg","title":"Styled parallel coordinates as SVG","summary":"Combines parallel coordinates, color and dash encodings, guides, and SVG output.","query":"parallel coordinates with color encoding, stroke dash encoding, axes, and legend as svg"},{"id":"facet-shared-guides","title":"Small multiples with shared guides","summary":"Uses the facet action as the owner of the small-multiple layout and shared guides.","query":"small multiples with shared legend and axes"},{"id":"horizontal-composition-svg","title":"Horizontal chart composition as SVG","summary":"Composes complete programs horizontally before serializing the parent program to SVG.","query":"put charts side by side and export svg"}],"docs":[{"id":"choose-chart-type","title":"Choose a chart or mark type","route":"/api/basic-charts/","text":"# Choose a chart or mark type\n\nName the intended chart or mark. Common complete chart facades are `createScatterPlot`, `createLinePlot`, `createBarPlot`, `createHistogram`, and `createHeatmap`. For lower-level authoring, choose a mark such as point, line, area, bar, rect, rule, tick, text, or arc, then add its required position encodings. Run `search_ggaction` again with the chosen chart type."},{"id":"choose-renderer","title":"Choose an output renderer","route":"/api/rendering/","text":"# Choose an output renderer\n\nUse `render(program, context)` for Browser Canvas, `renderToSVG(program)` for a browser-safe SVG string, `renderToPNG(program, output)` for Node PNG output, or `renderToPDF(program, output)` for a single-page vector PDF. Run `search_ggaction` again with one explicit format. JPEG output is not currently supported."},{"id":"legend-layout","title":"Resolve legend layout requirements","route":"/api/legends/","text":"# Resolve legend layout requirements\n\nA single legend resource can occupy one position at a time. Choose `top`, `bottom`, `left`, or `right`, or give distinct legends explicit IDs and edit each target separately. Run `search_ggaction` again with one position per legend."},{"id":"unsupported-capabilities","title":"Current static-chart limitations","route":"/supported-features/","text":"# Current static-chart limitations\n\nThe current authoring contract does not provide geographic maps, animation, interactive event handling, 3D charts, or JPEG rendering. The compact resolver reports these requirements explicitly instead of substituting a different chart. Consult the supported-features route before redesigning the task with current static actions."},{"id":"getting-started","title":"Clarify an unrecognized authoring request","route":"/getting-started/","text":"# Clarify an authoring request\n\nDescribe the chart or mark, its data/transform needs, position and appearance encodings, guides or layout, and output format in one request. Exact action names are also accepted. Example: `scatter plot with x and y, a bottom color legend, and SVG output`."},{"id":"action-reference","title":"Resolve a current action gap","route":"/reference/actions/","text":"# Resolve a current action gap\n\nUse the complete action reference only for a constraint that the compact resolver recognized but could not cover. Confirm the exact action signature, required resource ID, and supported options, then rerun `search_ggaction` with the exact action name and complete task request."},{"id":"responsive-layout","title":"Resolve responsive size and pixel density","route":"/responsive-charts/","text":"# Resolve responsive layout\n\nA ggaction program is immutable and has concrete Canvas dimensions. Measure the host container, choose the intended aspect ratio and pixel ratio, rebuild with `editCanvas`, and rerender from a `ResizeObserver`. Do not rely on CSS scaling as chart layout. Run `search_ggaction` again only after concrete dimensions or a host resize policy are known."},{"id":"accessibility","title":"Resolve output accessibility requirements","route":"/accessibility/","text":"# Resolve output accessibility\n\nChoose an output-specific accessible name and description, provide a data-table or textual alternative, and avoid color-only meaning. SVG supports explicit `title` and `description` renderer options. Canvas requires host ARIA and fallback content. Use exportAccessibleData from ggaction/accessibility for final visual rows and composition hierarchy; see /api/rendering/#accessible-data-alternatives for its schema and unsupported-owner errors. The host creates the actual table. Static output does not add keyboard interaction or tooltips."}]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ggaction",
3
- "version": "0.0.22",
3
+ "version": "0.0.23",
4
4
  "description": "Build charts through immutable, traceable graphical actions.",
5
5
  "license": "MIT",
6
6
  "author": "Hyeon Jeon",
@@ -155,7 +155,7 @@
155
155
  "benchmark:runtime": "node scripts/benchmark-runtime.js",
156
156
  "benchmark:authoring": "node scripts/evaluate-authoring-requirements.js",
157
157
  "test:platform": "node scripts/test-platform-package.js",
158
- "test:browser:compat": "node scripts/run-tests.js browser browser/backend-compatibility.browser.js",
158
+ "test:browser:compat": "node scripts/run-tests.js browser browser/backend-compatibility.browser.js browser/facet-content-headers.browser.js",
159
159
  "release:prepare": "node scripts/prepare-release.js"
160
160
  },
161
161
  "engines": {
@@ -170,13 +170,16 @@
170
170
  "@axe-core/playwright": "^4.12.1",
171
171
  "@modelcontextprotocol/sdk": "1.32.1",
172
172
  "@napi-rs/canvas": "^1.0.2",
173
+ "@xmldom/xmldom": "0.9.12",
174
+ "acorn": "8.19.0",
173
175
  "ajv": "^8.20.0",
174
176
  "es-module-lexer": "^1.7.0",
175
177
  "esbuild": "0.28.2",
176
178
  "gifenc": "^1.0.3",
177
179
  "playwright": "^1.61.1",
178
180
  "typescript": "^7.0.2",
179
- "vite": "^6.4.3"
181
+ "vite": "^6.4.3",
182
+ "yaml": "2.9.1"
180
183
  },
181
184
  "peerDependencies": {
182
185
  "@modelcontextprotocol/sdk": "1.32.1",
@@ -136,7 +136,7 @@ export const createIntervalPlot = /* @__PURE__ */ action(
136
136
  const REGRESSION_OPTIONS = Object.freeze([
137
137
  "id", "data", "coordinate", "x", "y", "color", "size", "shape", "point",
138
138
  "groupBy", "method", "degree", "span", "robustIterations", "confidenceMethod", "level", "confidence",
139
- "interval", "band", "line", "guides"
139
+ "interval", "band", "line", "placement", "predict", "sourceBinding", "missing", "guides"
140
140
  ]);
141
141
 
142
142
  export const createRegressionPlot = /* @__PURE__ */ action(
@@ -164,7 +164,7 @@ export const createRegressionPlot = /* @__PURE__ */ action(
164
164
  });
165
165
  const regression = Object.fromEntries([
166
166
  "groupBy", "method", "degree", "span", "robustIterations", "confidenceMethod", "level",
167
- "confidence", "interval", "band", "line"
167
+ "confidence", "interval", "band", "line", "placement", "predict", "sourceBinding", "missing"
168
168
  ].filter(key => Object.hasOwn(args, key)).map(key => [key, args[key]]));
169
169
  next = next.createRegression({ target: id, ...regression });
170
170
  return applyFacadeGuides(next, guides, id, guides);
@@ -476,7 +476,7 @@ export const editBinData = /* @__PURE__ */ focusedEditor(
476
476
  export const editTimeUnitData = /* @__PURE__ */ focusedEditor(
477
477
  "editTimeUnitData", "timeUnit", [
478
478
  "field", "unit", "as", "temporalUnit", "timeZone", "weekStartsOn",
479
- "weekRule"
479
+ "weekRule", "missing"
480
480
  ]
481
481
  );
482
482
  export const editWindowData = /* @__PURE__ */ focusedEditor(
@@ -6,7 +6,7 @@ import { derivedCreator, derivedMaterializer } from "./shared.js";
6
6
 
7
7
  const OPTIONS = Object.freeze([
8
8
  "id", "source", "field", "unit", "as", "temporalUnit", "timeZone",
9
- "weekStartsOn", "weekRule"
9
+ "weekStartsOn", "weekRule", "missing"
10
10
  ]);
11
11
 
12
12
  export const materializeTimeUnitData = /* @__PURE__ */ derivedMaterializer(
@@ -1 +1 @@
1
- import{DEFAULT_ACTION_METHODS as Z}from"../../core/vocabulary.js";import{axisGraphicIds as ee}from"../../materialization/guides/resources.js";import{cartesianAxisOwners as te,axisTargetArgs as ie}from"../../selectors/axes.js";import{resolveGraphicBounds as ne}from"../../layout/canvas.js";import{action as x,closedAction as z,getWrappedActionMetadata as ae}from"../../core/action.js";import{registerFacetDataRevision as oe,reviseUnitData as ce}from"../data/revise.js";import{applyMaterializationPlan as re}from"../../materialization/dependencies.js";import{getMarkMaterializationStep as se}from"../../materialization/marks/index.js";import{buildMaterializationPlan as de}from"../../materialization/planner.js";import{freezeOwned as L,isPlainObject as w}from"../../core/immutable.js";import{validateUserId as M}from"../../core/identifiers.js";import{validateNonEmptyString as T,validateNonNegativeFinite as le,validateOptionObject as S,validatePositiveFinite as fe}from"../../core/validation.js";import{resolveFacetDefinition as P,resolveFacetGridDefinition as R}from"../../grammar/facets/index.js";import{collectFacetScaleBindings as A,resolveFacetFamily as G}from"../../grammar/facets/dependencies.js";import{FACET_SCALE_CHANNELS as $,normalizeFacetScalePolicies as k}from"../../grammar/facets/scales.js";import{resolveFacetLayout as pe}from"../../layout/facets.js";import{compositionChildDescriptor as ue}from"../../materialization/composition.js";import{deriveFacetChildren as I}from"./derive.js";import{resolveFacetChildrenScales as he}from"./derive.js";import{replayDerivedData as me}from"./replay.js";import{composeFacetGuides as ge}from"./guides.js";import{applyCompositionState as _}from"../composition/actions.js";import{replayCompositionThemeState as we}from"../theme/composition.js";import{findDataset as Se}from"../../selectors/datasets.js";import{findLayer as N}from"../../selectors/layers.js";import{findSemanticScale as ye}from"../../selectors/scales.js";import{normalizeDisplayLabelMap as H}from"../../grammar/displayLabels.js";import{resolveRotation as be}from"../../grammar/rotation.js";import{normalizeFacetHeaderTitle as Ce}from"../../grammar/facetHeaders.js";import{createDefaultFacetHeaders as Fe,normalizeFacetHeadersConfig as U,resolveFacetHeaderConfig as ve}from"../../materialization/facetHeaders.js";const Ee=Object.freeze(["id","field","data","values","columns","gap","spacing","topLane","align","padding","scales","guides","headers"]),Oe=Object.freeze(["id","data","rows","columns","combinations","gap","spacing","topLane","align","padding","scales","guides","headers"]),xe=Object.freeze(["id","target","channel","fields","columns","gap","spacing","topLane","align","padding","scales","guides","headers"]),ze=new Set(Z),Te=Object.freeze(["program","action"]),W=Object.freeze(["axes","legend"]),K=Object.freeze(["fontSize","fontFamily","fontWeight","color","offset","role","labelMap","side","align","rotation","title","anchor"]),V=Object.freeze(["fontSize","fontFamily","fontWeight","color","offset","align","rotation","anchor"]);function C(t,e=!1){if(t===void 0)return{axes:"each",legend:!1};S(t,W,"facet.guides");const n=t.axes??"each";if(!["each","outer"].includes(n))throw new Error('facet guides.axes must be "each" or "outer".');const i=t.legend??!1;if(i!==!1&&i!=="shared"&&!w(i))throw new Error('facet guides.legend must be false, "shared", or legend options.');if(!e&&w(i)&&Object.hasOwn(i,"type"))throw new Error("Facet legend options do not accept internal type tags.");return{axes:n,legend:i}}function F(t,e){if(t._assertCompositionProgram(e),t.compositionSpec.type!=="facet")throw new Error(`${e} requires a facet composition.`)}function v(t,e){const n=new Set(A(t.semanticSpec).map(i=>i.policyKey));return Object.fromEntries($.flatMap(i=>n.has(i)&&e[i]!==void 0?[[i,e[i]]]:[]))}function E(t,e=!1){const n=t.compositionSpec.children.find(l=>t.children[l]?.semanticSpec.layers.length>0)??t.compositionSpec.children[0],i=t.children[n];if(i===void 0)throw new Error(`Facet "${t.compositionSpec.id}" requires a retained child.`);const{facets:c,guides:o,...d}=t.materializationConfigs,{legend:r,...s}=t.semanticSpec.guides,a={...i.materializationConfigs.guides,axis:o?.axis??i.guideConfigs.axis,grid:o?.grid??i.guideConfigs.grid};return e&&delete d.title,new t.constructor({semanticSpec:e?{...t.semanticSpec,title:{},guides:{...s,...i.semanticSpec.guides.legend===void 0?{}:{legend:i.semanticSpec.guides.legend}}}:t.semanticSpec,graphicSpec:i.graphicSpec,resolvedScales:t.resolvedScales,materializationConfigs:L({...d,...i.materializationConfigs.theme===void 0?{}:{theme:i.materializationConfigs.theme},...a===void 0?{}:{guides:a},canvas:i.materializationConfigs.canvas}),children:{},context:t.context,trace:t.trace,actionStack:t.actionStack,actionSequence:t._actionSequence})}function j(t,{scales:e,guides:n}){const i=t.compositionSpec;if(i.facet.repeat!==void 0){const f=E(t),u=X(f,{id:i.id,...i.facet.repeat}),m=J(f,u,v(f,e),!0);return _(t,{children:m.children,compositionSpec:{...i,facet:{...i.facet,scales:e,guides:n}}},i.children)}const c=i.facet.grid===void 0?P(t.semanticSpec,{id:i.id,data:i.facet.data,field:i.facet.field,values:i.facet.values}):R(t.semanticSpec,{id:i.id,data:i.facet.data,rows:i.facet.grid.rows,columns:i.facet.grid.columns,combinations:i.facet.grid.combinations}),o=v(t,e),d=k(t.semanticSpec,o),r=E(t),s=I(r,c,{closeInheritedAction:!0,stripTitle:!0,scales:o}),a={...i,facet:{...i.facet,scales:d.channels,guides:n}};let l=t._withoutMaterializationConfig(["guides","legend"]);for(const[f,u]of Object.entries(r.guideConfigs.legend??{}))l=l._withLegendConfig(f,u);return _(l,{children:s.children,compositionSpec:a},a.children)}function q(t,e,n,i="editFacetHeaders"){S(e,K,i,{allowEmpty:!1,emptyMessage:`${i} requires at least one change.`});const c=e.role??"all";if(!["all","row","column"].includes(c))throw new Error(`Unknown facet header role "${c}".`);if(c==="all"&&Object.hasOwn(e,"side"))throw new Error(`${i} side requires an explicit row or column role.`);if(c==="all"&&Object.hasOwn(e,"title"))throw new Error(`${i} title requires an explicit row or column role.`);if(c==="row"&&n===void 0)throw new Error(`${i} row role requires a row-column facet grid.`);if(Object.hasOwn(e,"side")){const a=c==="row"?["left","right"]:n===void 0?["top","bottom","left","right"]:["top","bottom"];if(!a.includes(e.side))throw new Error(`${i} ${c} side must be ${a.join(" or ")}.`)}if(Object.hasOwn(e,"align")&&!["start","center","end"].includes(e.align))throw new Error(`${i} align must be start, center, or end.`);if(c==="all"&&Object.keys(e).every(a=>a==="role"))throw new Error(`${i} requires at least one change.`);const o=U(t),d=c==="all"?"common":c,r={...o[d]};if(Object.hasOwn(e,"title")){const a=Ce(r.title,e.title);a===void 0?delete r.title:r.title=a}for(const a of V)Object.hasOwn(e,a)&&(r[a]=e[a]);Object.hasOwn(e,"rotation")&&(r.rotation=be(e.rotation,`${i} ${c} rotation`)),Object.hasOwn(e,"side")&&(r.side=e.side),Object.hasOwn(e,"labelMap")&&(e.labelMap==="auto"?delete r.labelMap:r.labelMap=H(e.labelMap,`${i} ${c} labelMap`));const s={...o,...c==="all"?{}:{mode:"roles"},[d]:r};for(const a of["all","row","column"]){const l=ve(s,a);if(fe(l.fontSize,`Facet ${a} header fontSize`),T(l.fontFamily,`Facet ${a} header fontFamily`),T(l.color,`Facet ${a} header color`),le(l.offset,`Facet ${a} header offset`),l.rotation!==void 0&&!Number.isFinite(l.rotation))throw new TypeError(`Facet ${a} header rotation must resolve to finite radians.`);if(!(typeof l.fontWeight=="string"&&l.fontWeight.length>0||Number.isFinite(l.fontWeight)))throw new TypeError(`Facet ${a} header fontWeight must be a non-empty string or number.`);if(!["start","center","end"].includes(l.align))throw new Error(`Facet ${a} header align must be start, center, or end.`);l.labelMap!==void 0&&H(l.labelMap,`Facet ${a} header labelMap`)}return s}function $e(t,e){let n=Fe();if(t===void 0)return n;S(t,[...V,"labelMap","row","column"],"facet.headers");const{row:i,column:c,...o}=t;Object.keys(o).length>0&&(n=q(n,o,e,"facet.headers"));for(const[d,r]of[["row",i],["column",c]])r!==void 0&&(S(r,K.filter(s=>s!=="role"),`facet.headers.${d}`),n=q(n,{...r,role:d},e,`facet.headers.${d}`));return n}function B(t,e,{definition:n,derived:i,guides:c,scalePolicies:o,facet:d}){const r=t.materializationConfigs.facets?.[n.id]?.headers,s=e.headers===void 0&&r!==void 0?U(r):$e(e.headers,n.grid),a=pe({spacing:e.spacing,topLane:e.topLane,plots:Object.entries(i.children).map(([f,u])=>({id:f,...ne(u)})),children:n.cells.map(f=>({...ue(f.id,i.children[f.id]),value:f.value,...n.grid===void 0?{}:{row:f.row,column:f.column}})),columns:n.grid?.columns.values.length??e.columns,gap:e.gap,align:e.align,padding:e.padding,sharedLegend:c.legend==="shared"}),l={id:n.id,type:"facet",children:n.cells.map(f=>f.id),columns:a.columns,gap:a.gap,align:a.align,padding:a.padding,...a.spacing===void 0?{}:{spacing:a.spacing},...a.topLane===void 0?{}:{topLane:a.topLane},facet:{data:n.data,...d,scales:o.channels,guides:c}};return _(t._withMaterializationConfig(["facets",n.id],{headers:s}),{children:i.children,compositionSpec:l},l.children)}function Y(t,e,n){return z({op:t,description:e},t==="facet"?Ee:Oe,function(i={}){const c=C(i.guides),o=n(this.semanticSpec,i);if(o.family!=="cartesian"&&c.axes==="outer")throw new Error("Polar and Parallel facets do not support outer axes.");const d=k(this.semanticSpec,i.scales??{}),r=I(this,o,{closeInheritedAction:!0,stripTitle:!0,scales:i.scales??{}}),s=o.grid===void 0?{field:o.field,values:o.values}:{values:o.cells.map(a=>a.value),grid:{...o.grid,cells:o.cells.map(a=>({id:a.id,row:a.row,column:a.column,rowValue:a.rowValue,columnValue:a.columnValue,empty:a.empty}))}};return B(this,i,{definition:o,derived:r,guides:c,scalePolicies:d,facet:s})})}const ke=Y("facet","Repeat one direct-source chart by field value.",P);function X(t,e){if(!w(e))throw new TypeError("repeatCharts options must be a plain object.");const n=M(e.id??"repeat","Repeat id"),i=w(e.channel);if(i){const p=Object.keys(e.channel);if(p.length!==1||p[0]!=="parallelDimension"||typeof e.channel.parallelDimension!="string"||e.channel.parallelDimension.length===0)throw new Error("repeatCharts Parallel channel must contain exactly one non-empty parallelDimension.")}else if(!["x","y","theta","r"].includes(e.channel))throw new Error('repeatCharts channel must be "x", "y", "theta", "r", or one parallelDimension.');if(!Array.isArray(e.fields)||e.fields.length===0||e.fields.some(p=>typeof p!="string"||p.length===0))throw new TypeError("repeatCharts fields must be a non-empty array of field names.");if(new Set(e.fields).size!==e.fields.length)throw new Error("repeatCharts fields must be unique.");const c=G(t.semanticSpec).family,o=e.channel==="r"?"radius":e.channel,d=t.semanticSpec.layers.filter(p=>{if(i){const b=(p.encoding?.parallel?.dimensions??[]).filter(y=>y.field===e.channel.parallelDimension);return c==="parallel"&&p.mark?.type==="line"&&b.length===1}if(["x","y"].includes(e.channel))return c==="cartesian"&&p.encoding?.x?.scale!==void 0&&p.encoding?.y?.scale!==void 0&&p.encoding?.[e.channel]?.field!==void 0&&["point","line","area","bar","rule","tick","rect"].includes(p.mark?.type);const g=t.markConfigs[p.id]?.compositionRole;return c!=="polar"||["pie","radar"].includes(g)?!1:["point","line","arc"].includes(p.mark?.type)&&p.encoding?.[o]?.field!==void 0});let r;if(e.target!==void 0){if(r=M(e.target,"Repeat target"),!d.some(p=>p.id===r))throw new Error(`repeatCharts target "${r}" is not eligible for the requested field role.`)}else if(d.length===1)r=d[0].id;else throw new Error(d.length===0?"repeatCharts requires one eligible complete mark for the requested field role.":"repeatCharts target is ambiguous; provide target.");if(t.semanticSpec.layers.filter(p=>{if(p.id===r)return!1;const g=p.mark?.type==="text"&&p.source===r,b=t.markConfigs[p.id]?.statisticalReference?.source===r;return!g&&!b}).length>0)throw new Error("repeatCharts currently supports one direct mark only.");const a=t.markConfigs[r]??{},l=["boxPlot","gradientPlot","violinPlot","regressionPlot","endpointPlot","ecdfPlot","raincloudPlot","intervalPlot"].find(p=>a[p]!==void 0);if(l!==void 0)throw new Error(`repeatCharts does not replace the ${l} composite role.`);const f=N(t,r),u=Se(t,f.data);if(u?.transform?.length>0&&u.transform[0].type!=="lookup")throw new Error("repeatCharts does not rewrite a derived dataset dependency.");const m=i?f.encoding.parallel:f.encoding[o],h=i?m.dimensions.findIndex(p=>p.field===e.channel.parallelDimension):void 0;return{id:n,target:r,channel:i?{...e.channel}:e.channel,policyKey:i?"parallelDimensions":e.channel,fields:[...e.fields],data:f.data,encoding:m,...h===void 0?{}:{dimensionIndex:h},cells:e.fields.map((p,g)=>({id:`${n}-field-${g+1}`,field:p,value:p}))}}function _e(t,e){const n=t.encoding;return{target:t.target,field:e,fieldType:n.fieldType,...n.temporalUnit===void 0?{}:{temporalUnit:n.temporalUnit},...n.aggregate===void 0?{}:{aggregate:n.aggregate},...n.bin===void 0?{}:{bin:n.bin},...n.stack===void 0?{}:{stack:n.stack},...n.weight===void 0?{}:{weight:n.weight},scale:{id:n.scale}}}function je(t,e,n){return e.encoding.dimensions.map((i,c)=>{const o=ye(t,i.scale);if(o===void 0)throw new Error(`repeatCharts Parallel dimension scale "${i.scale}" is missing.`);const{id:d,...r}=o,s=c===e.dimensionIndex;return{field:s?n:i.field,fieldType:i.fieldType,title:s&&i.title===i.field?n:i.title,scale:r}})}function qe(t,e,n){if(w(e.channel))return t.encodeParallelCoordinates({target:e.target,coordinate:N(t,e.target).coordinate,dimensions:je(t,e,n),...e.encoding.key===void 0?{}:{key:e.encoding.key},missing:e.encoding.missing});const i={x:"encodeX",y:"encodeY",theta:"encodeTheta",r:"encodeR"}[e.channel];return t[i](_e(e,n))}function J(t,e,n,i){const c=t.semanticSpec.title.text===void 0?t:t.removeTitle(),o=Object.fromEntries(e.cells.map(d=>[d.id,qe(c,e,d.field)]));return he(c,e.cells.map(d=>d.id),o,n,i)}const De=z({op:"repeatCharts",description:"Repeat one direct chart across an ordered field-role list."},xe,function(t={}){const e=C(t.guides);if(e.axes==="outer")throw new Error("repeatCharts does not promote axes across different repeated fields.");const n=X(this,t),i={...t.scales??{},[n.policyKey]:t.scales?.[n.policyKey]??"independent"},c=k(this.semanticSpec,i),o=J(this,n,i,!0);return B(this,t,{definition:n,derived:o,guides:e,scalePolicies:c,facet:{values:n.fields,repeat:{target:n.target,channel:n.channel,fields:n.fields}}})}),Le=Y("facetGrid","Repeat one direct-source Cartesian chart across a row and column field grid.",R),Me=x({op:"editFacetHeaders",description:"Edit parent-owned facet header appearance.",scope:"composition"},function(t={}){F(this,"editFacetHeaders");const e=this.compositionSpec.id,n=this.materializationConfigs.facets?.[e];if(!w(n?.headers))throw new Error(`Facet "${e}" requires header configuration.`);const i=q(n.headers,t,this.compositionSpec.facet.grid);return this._withMaterializationConfig(["facets",e],{...n,headers:i}).materializeComposition()}),Pe=x({op:"editFacetScales",description:"Edit facet scale-resolution policies and rederive every cell.",scope:"composition"},function(t={}){F(this,"editFacetScales"),S(t,$,"editFacetScales",{allowEmpty:!1,emptyMessage:"editFacetScales requires at least one channel policy change."});for(const i of Object.keys(t))if(!A(this.semanticSpec).some(c=>c.policyKey===i))throw new Error(`Facet scale channel "${i}" is not used by an affected layer.`);const e=this.compositionSpec.facet,n={...e.scales,...t};if($.every(i=>n[i]===e.scales[i]))throw new Error("editFacetScales requires at least one channel policy change.");return j(this,{scales:n,guides:e.guides})}),Re=x({op:"editFacetGuides",description:"Edit facet guide ownership and rederive every cell.",scope:"composition"},function(t={}){F(this,"editFacetGuides"),S(t,W,"editFacetGuides",{allowEmpty:!1,emptyMessage:"editFacetGuides requires at least one guide policy."});const e=this.compositionSpec.facet;Object.hasOwn(t,"legend")&&C({legend:t.legend});const n=C({...e.guides,...t},!0);if(G(this.semanticSpec).family!=="cartesian"&&n.axes==="outer")throw new Error("Polar and Parallel facets do not support outer axes.");if(e.repeat!==void 0&&n.axes==="outer")throw new Error("repeatCharts does not promote axes across different repeated fields.");return j(this,{scales:e.scales,guides:n})});function Ae(t,e,n=!1){if(!(t instanceof e.constructor))throw new TypeError("editFacetSource program must be a ChartProgram.");if(t.compositionSpec!==void 0)throw new Error("editFacetSource program must be a complete unit ChartProgram.");if(t.actionStack.length!==0)throw new Error("editFacetSource program has an unfinished action stack.");const i=e.compositionSpec.children.find(a=>e.children[a]?.semanticSpec.layers.length>0)??e.compositionSpec.children[0],c=e.children[i]?.materializationConfigs??{},{canvas:o,theme:d,facets:r,...s}=c;return new e.constructor({semanticSpec:t.semanticSpec,graphicSpec:t.graphicSpec,resolvedScales:t.resolvedScales,materializationConfigs:L({...n?{...s,...t.materializationConfigs}:{...t.materializationConfigs,...s},...t.materializationConfigs.canvas===void 0?{}:{canvas:t.materializationConfigs.canvas},...t.materializationConfigs.theme===void 0?{}:{theme:t.materializationConfigs.theme}}),children:{},context:t.context,trace:e.trace,actionStack:e.actionStack,actionSequence:e._actionSequence})}const Ge=z({op:"editFacetSource",description:"Reapply one facet, grid, or repeat recipe to a revised complete unit program.",scope:"composition"},Te,function(t={}){F(this,"editFacetSource");const e=this.compositionSpec,n=this.materializationConfigs.facets?.[e.id];if(Object.hasOwn(t,"program")===Object.hasOwn(t,"action"))throw new Error("editFacetSource requires exactly one of program or action.");let i=t.program,c=this;if(t.action!==void 0){S(t.action,["method","options"],"editFacetSource action");const l=T(t.action.method,"editFacetSource action method");let f=E(this,!0);const u=typeof f[l]=="function"?ae(f[l]):void 0;if(!u||!ze.has(l)||u.scope==="composition"||/^(?:_|materialize|rematerialize|replay|editSemantic$|editGraphics$|createGraphics$)/.test(l))throw new Error("editFacetSource action requires a unit chart-authoring action.");f=re(f,de({marks:f.semanticSpec.layers.map(h=>se(f,h))}));for(const h of te(f)){const p=f.guideConfigs.axis?.[h.id]??{},g=ee(h.channel,h.id);for(const[b,y]of["line","ticks","labels","title"].entries()){if(!p[y]||f.graphicSpec.objects[g[b]])continue;const{mode:D,inferredValues:Ie,inferredText:Ne,inferredRotation:He,inferredOffset:Ue,...O}=p[y];D==="values"&&delete O.count,D==="count"&&delete O.values;const Q=y[0].toUpperCase()+y.slice(1);f=f[`create${h.channel.toUpperCase()}Axis${Q}`]({...O,...ie(h.id,h.channel)})}}const m=f[l](t.action.options??{});c=new this.constructor({...this,trace:m.trace,actionStack:m.actionStack,actionSequence:m._actionSequence}),i=new this.constructor({...m,actionStack:[],actionSequence:m._actionSequence})}let o=Ae(i,c,t.action!==void 0);n!==void 0&&(o=o._withMaterializationConfig(["facets",e.id],n));const d=w(e.facet.guides.legend),r=d?{...e.facet.guides,legend:!1}:e.facet.guides;let s;const a=v(o,v(this,e.facet.scales));if(e.facet.grid!==void 0?s=o.facetGrid({id:e.id,data:e.facet.data,rows:e.facet.grid.rows,columns:e.facet.grid.columns,combinations:e.facet.grid.combinations,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:r}):e.facet.repeat!==void 0?s=o.repeatCharts({id:e.id,...e.facet.repeat,columns:e.columns,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:r}):s=o.facet({id:e.id,data:e.facet.data,field:e.facet.field,values:e.facet.values,columns:e.columns,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:r}),d){const l=s.compositionSpec;s=s._withCompositionState({children:s.children,compositionSpec:{...l,facet:{...l.facet,guides:e.facet.guides}}})}return n!==void 0&&(s=s._withMaterializationConfig(["facets",e.id],n).materializeComposition()),s.semanticSpec.title.text!==void 0&&(s=s.removeTitle()),this.semanticSpec.title.text!==void 0&&(s=s.createTitle({...this.titleConfig,...this.semanticSpec.title})),we(s,this.materializationConfigs.theme)});function Ct(t){oe((e,n)=>{const{program:i,plan:c}=ce(E(e),n),o=e.compositionSpec,d=new e.constructor({...i,graphicSpec:e.graphicSpec,children:e.children,materializationConfigs:{...i.materializationConfigs,facets:e.materializationConfigs.facets,...e.titleConfig===void 0?{}:{title:e.titleConfig}},actionSequence:i._actionSequence,compositionSpec:{...o,facet:{...o.facet,data:c.replacements.get(o.facet.data)??o.facet.data}}});return j(d,o.facet)}),t.prototype.replayDerivedData=me,t.prototype.composeFacetGuides=ge,t.prototype.facet=ke,t.prototype.facetGrid=Le,t.prototype.repeatCharts=De,t.prototype.editFacetHeaders=Me,t.prototype.editFacetScales=Pe,t.prototype.editFacetGuides=Re,t.prototype.editFacetSource=Ge}export{Re as editFacetGuides,Me as editFacetHeaders,Pe as editFacetScales,Ge as editFacetSource,ke as facet,Le as facetGrid,Ct as registerFacetActions,De as repeatCharts};
1
+ import{normalizeFacetAxes as R,validateFacetAxisPolicy as x}from"../../core/facetAxisPolicy.js";import{DEFAULT_ACTION_METHODS as te}from"../../core/vocabulary.js";import{axisGraphicIds as ie}from"../../materialization/guides/resources.js";import{cartesianAxisOwners as ne,axisTargetArgs as ae}from"../../selectors/axes.js";import{resolveGraphicBounds as oe}from"../../layout/canvas.js";import{action as z,closedAction as T,getWrappedActionMetadata as ce}from"../../core/action.js";import{registerFacetDataRevision as se,reviseUnitData as re}from"../data/revise.js";import{applyMaterializationPlan as de}from"../../materialization/dependencies.js";import{getMarkMaterializationStep as le}from"../../materialization/marks/index.js";import{buildMaterializationPlan as fe}from"../../materialization/planner.js";import{freezeOwned as A,isPlainObject as S}from"../../core/immutable.js";import{validateUserId as P}from"../../core/identifiers.js";import{validateNonEmptyString as $,validateNonNegativeFinite as pe,validateOptionObject as w,validatePositiveFinite as ue}from"../../core/validation.js";import{resolveFacetDefinition as G,resolveFacetGridDefinition as I}from"../../grammar/facets/index.js";import{collectFacetScaleBindings as N,resolveFacetFamily as k}from"../../grammar/facets/dependencies.js";import{FACET_SCALE_CHANNELS as _,normalizeFacetScalePolicies as j}from"../../grammar/facets/scales.js";import{resolveFacetLayout as he}from"../../layout/facets.js";import{compositionChildDescriptor as me}from"../../materialization/composition.js";import{deriveFacetChildren as H}from"./derive.js";import{resolveFacetChildrenScales as ge}from"./derive.js";import{replayDerivedData as Se}from"./replay.js";import{composeFacetGuides as we}from"./guides.js";import{applyCompositionState as q}from"../composition/actions.js";import{replayCompositionThemeState as ye}from"../theme/composition.js";import{findDataset as Fe}from"../../selectors/datasets.js";import{findLayer as U}from"../../selectors/layers.js";import{findSemanticScale as be}from"../../selectors/scales.js";import{normalizeDisplayLabelMap as W}from"../../grammar/displayLabels.js";import{resolveRotation as ve}from"../../grammar/rotation.js";import{normalizeFacetHeaderTitle as Ce}from"../../grammar/facetHeaders.js";import{createDefaultFacetHeaders as Ee,normalizeFacetHeadersConfig as K,resolveFacetHeaderConfig as Oe}from"../../materialization/facetHeaders.js";const xe=Object.freeze(["id","field","data","values","columns","gap","spacing","topLane","align","padding","scales","guides","headers"]),ze=Object.freeze(["id","data","rows","columns","combinations","gap","spacing","topLane","align","padding","scales","guides","headers"]),Te=Object.freeze(["id","target","channel","fields","columns","gap","spacing","topLane","align","padding","scales","guides","headers"]),$e=new Set(te),ke=Object.freeze(["program","action"]),V=Object.freeze(["axes","legend"]),B=Object.freeze(["fontSize","fontFamily","fontWeight","color","offset","role","labelMap","side","align","rotation","title","anchor"]),Y=Object.freeze(["fontSize","fontFamily","fontWeight","color","offset","align","rotation","anchor"]);function b(t,e=!1){if(t===void 0)return{axes:"each",legend:!1};w(t,V,"facet.guides");const n=R(t.axes),i=t.legend??!1;if(i!==!1&&i!=="shared"&&!S(i))throw new Error('facet guides.legend must be false, "shared", or legend options.');if(!e&&S(i)&&Object.hasOwn(i,"type"))throw new Error("Facet legend options do not accept internal type tags.");return{axes:n,legend:i}}function v(t,e){if(t._assertCompositionProgram(e),t.compositionSpec.type!=="facet")throw new Error(`${e} requires a facet composition.`)}function C(t,e){const n=new Set(N(t.semanticSpec).map(i=>i.policyKey));return Object.fromEntries(_.flatMap(i=>n.has(i)&&e[i]!==void 0?[[i,e[i]]]:[]))}function E(t,e=!1){const n=t.compositionSpec.children.find(l=>t.children[l]?.semanticSpec.layers.length>0)??t.compositionSpec.children[0],i=t.children[n];if(i===void 0)throw new Error(`Facet "${t.compositionSpec.id}" requires a retained child.`);const{facets:c,guides:o,...d}=t.materializationConfigs,{legend:s,...r}=t.semanticSpec.guides,a={...i.materializationConfigs.guides,axis:o?.axis??i.guideConfigs.axis,grid:o?.grid??i.guideConfigs.grid};return e&&delete d.title,new t.constructor({semanticSpec:e?{...t.semanticSpec,title:{},guides:{...r,...i.semanticSpec.guides.legend===void 0?{}:{legend:i.semanticSpec.guides.legend}}}:t.semanticSpec,graphicSpec:i.graphicSpec,resolvedScales:t.resolvedScales,materializationConfigs:A({...d,...i.materializationConfigs.theme===void 0?{}:{theme:i.materializationConfigs.theme},...a===void 0?{}:{guides:a},canvas:i.materializationConfigs.canvas}),children:{},context:t.context,trace:t.trace,actionStack:t.actionStack,actionSequence:t._actionSequence})}function D(t,{scales:e,guides:n}){const i=t.compositionSpec;if(i.facet.repeat!==void 0){const f=E(t),u=Q(f,{id:i.id,...i.facet.repeat}),m=Z(f,u,C(f,e),!0);return q(t,{children:m.children,compositionSpec:{...i,facet:{...i.facet,scales:e,guides:n}}},i.children)}const c=i.facet.grid===void 0?G(t.semanticSpec,{id:i.id,data:i.facet.data,field:i.facet.field,values:i.facet.values}):I(t.semanticSpec,{id:i.id,data:i.facet.data,rows:i.facet.grid.rows,columns:i.facet.grid.columns,combinations:i.facet.grid.combinations}),o=C(t,e),d=j(t.semanticSpec,o),s=E(t),r=H(s,c,{closeInheritedAction:!0,stripTitle:!0,scales:o}),a={...i,facet:{...i.facet,scales:d.channels,guides:n}};let l=t._withoutMaterializationConfig(["guides","legend"]);for(const[f,u]of Object.entries(s.guideConfigs.legend??{}))l=l._withLegendConfig(f,u);return q(l,{children:r.children,compositionSpec:a},a.children)}function L(t,e,n,i="editFacetHeaders"){w(e,B,i,{allowEmpty:!1,emptyMessage:`${i} requires at least one change.`});const c=e.role??"all";if(!["all","row","column"].includes(c))throw new Error(`Unknown facet header role "${c}".`);if(c==="all"&&Object.hasOwn(e,"side"))throw new Error(`${i} side requires an explicit row or column role.`);if(c==="all"&&Object.hasOwn(e,"title"))throw new Error(`${i} title requires an explicit row or column role.`);if(c==="row"&&n===void 0)throw new Error(`${i} row role requires a row-column facet grid.`);if(Object.hasOwn(e,"side")){const a=c==="row"?["left","right"]:n===void 0?["top","bottom","left","right"]:["top","bottom"];if(!a.includes(e.side))throw new Error(`${i} ${c} side must be ${a.join(" or ")}.`)}if(Object.hasOwn(e,"align")&&!["start","center","end"].includes(e.align))throw new Error(`${i} align must be start, center, or end.`);if(c==="all"&&Object.keys(e).every(a=>a==="role"))throw new Error(`${i} requires at least one change.`);const o=K(t),d=c==="all"?"common":c,s={...o[d]};if(Object.hasOwn(e,"title")){const a=Ce(s.title,e.title);a===void 0?delete s.title:s.title=a}for(const a of Y)Object.hasOwn(e,a)&&(s[a]=e[a]);Object.hasOwn(e,"rotation")&&(s.rotation=ve(e.rotation,`${i} ${c} rotation`)),Object.hasOwn(e,"side")&&(s.side=e.side),Object.hasOwn(e,"labelMap")&&(e.labelMap==="auto"?delete s.labelMap:s.labelMap=W(e.labelMap,`${i} ${c} labelMap`));const r={...o,...c==="all"?{}:{mode:"roles"},[d]:s};for(const a of["all","row","column"]){const l=Oe(r,a);if(ue(l.fontSize,`Facet ${a} header fontSize`),$(l.fontFamily,`Facet ${a} header fontFamily`),$(l.color,`Facet ${a} header color`),pe(l.offset,`Facet ${a} header offset`),l.rotation!==void 0&&!Number.isFinite(l.rotation))throw new TypeError(`Facet ${a} header rotation must resolve to finite radians.`);if(!(typeof l.fontWeight=="string"&&l.fontWeight.length>0||Number.isFinite(l.fontWeight)))throw new TypeError(`Facet ${a} header fontWeight must be a non-empty string or number.`);if(!["start","center","end"].includes(l.align))throw new Error(`Facet ${a} header align must be start, center, or end.`);l.labelMap!==void 0&&W(l.labelMap,`Facet ${a} header labelMap`)}return r}function _e(t,e){let n=Ee();if(t===void 0)return n;w(t,[...Y,"labelMap","row","column"],"facet.headers");const{row:i,column:c,...o}=t;Object.keys(o).length>0&&(n=L(n,o,e,"facet.headers"));for(const[d,s]of[["row",i],["column",c]])s!==void 0&&(w(s,B.filter(r=>r!=="role"),`facet.headers.${d}`),n=L(n,{...s,role:d},e,`facet.headers.${d}`));return n}function X(t,e,{definition:n,derived:i,guides:c,scalePolicies:o,facet:d}){const s=t.materializationConfigs.facets?.[n.id]?.headers,r=e.headers===void 0&&s!==void 0?K(s):_e(e.headers,n.grid),a=he({spacing:e.spacing,topLane:e.topLane,plots:Object.entries(i.children).map(([f,u])=>({id:f,...oe(u)})),children:n.cells.map(f=>({...me(f.id,i.children[f.id]),value:f.value,...n.grid===void 0?{}:{row:f.row,column:f.column}})),columns:n.grid?.columns.values.length??e.columns,gap:e.gap,align:e.align,padding:e.padding,sharedLegend:c.legend==="shared"}),l={id:n.id,type:"facet",children:n.cells.map(f=>f.id),columns:a.columns,gap:a.gap,align:a.align,padding:a.padding,...a.spacing===void 0?{}:{spacing:a.spacing},...a.topLane===void 0?{}:{topLane:a.topLane},facet:{data:n.data,...d,scales:o.channels,guides:c}};return q(t._withMaterializationConfig(["facets",n.id],{headers:r}),{children:i.children,compositionSpec:l},l.children)}function J(t,e,n){return T({op:t,description:e},t==="facet"?xe:ze,function(i={}){const c=b(i.guides),o=n(this.semanticSpec,i);x(c.axes,o.family);const d=j(this.semanticSpec,i.scales??{}),s=H(this,o,{closeInheritedAction:!0,stripTitle:!0,scales:i.scales??{}}),r=o.grid===void 0?{field:o.field,values:o.values}:{values:o.cells.map(a=>a.value),grid:{...o.grid,cells:o.cells.map(a=>({id:a.id,row:a.row,column:a.column,rowValue:a.rowValue,columnValue:a.columnValue,empty:a.empty}))}};return X(this,i,{definition:o,derived:s,guides:c,scalePolicies:d,facet:r})})}const je=J("facet","Repeat one direct-source chart by field value.",G);function Q(t,e){if(!S(e))throw new TypeError("repeatCharts options must be a plain object.");const n=P(e.id??"repeat","Repeat id"),i=S(e.channel);if(i){const p=Object.keys(e.channel);if(p.length!==1||p[0]!=="parallelDimension"||typeof e.channel.parallelDimension!="string"||e.channel.parallelDimension.length===0)throw new Error("repeatCharts Parallel channel must contain exactly one non-empty parallelDimension.")}else if(!["x","y","theta","r"].includes(e.channel))throw new Error('repeatCharts channel must be "x", "y", "theta", "r", or one parallelDimension.');if(!Array.isArray(e.fields)||e.fields.length===0||e.fields.some(p=>typeof p!="string"||p.length===0))throw new TypeError("repeatCharts fields must be a non-empty array of field names.");if(new Set(e.fields).size!==e.fields.length)throw new Error("repeatCharts fields must be unique.");const c=k(t.semanticSpec).family,o=e.channel==="r"?"radius":e.channel,d=t.semanticSpec.layers.filter(p=>{if(i){const F=(p.encoding?.parallel?.dimensions??[]).filter(y=>y.field===e.channel.parallelDimension);return c==="parallel"&&p.mark?.type==="line"&&F.length===1}if(["x","y"].includes(e.channel))return c==="cartesian"&&p.encoding?.x?.scale!==void 0&&p.encoding?.y?.scale!==void 0&&p.encoding?.[e.channel]?.field!==void 0&&["point","line","area","bar","rule","tick","rect"].includes(p.mark?.type);const g=t.markConfigs[p.id]?.compositionRole;return c!=="polar"||["pie","radar"].includes(g)?!1:["point","line","arc"].includes(p.mark?.type)&&p.encoding?.[o]?.field!==void 0});let s;if(e.target!==void 0){if(s=P(e.target,"Repeat target"),!d.some(p=>p.id===s))throw new Error(`repeatCharts target "${s}" is not eligible for the requested field role.`)}else if(d.length===1)s=d[0].id;else throw new Error(d.length===0?"repeatCharts requires one eligible complete mark for the requested field role.":"repeatCharts target is ambiguous; provide target.");if(t.semanticSpec.layers.filter(p=>{if(p.id===s)return!1;const g=p.mark?.type==="text"&&p.source===s,F=t.markConfigs[p.id]?.statisticalReference?.source===s;return!g&&!F}).length>0)throw new Error("repeatCharts currently supports one direct mark only.");const a=t.markConfigs[s]??{},l=["boxPlot","gradientPlot","violinPlot","regressionPlot","endpointPlot","ecdfPlot","raincloudPlot","intervalPlot"].find(p=>a[p]!==void 0);if(l!==void 0)throw new Error(`repeatCharts does not replace the ${l} composite role.`);const f=U(t,s),u=Fe(t,f.data);if(u?.transform?.length>0&&u.transform[0].type!=="lookup")throw new Error("repeatCharts does not rewrite a derived dataset dependency.");const m=i?f.encoding.parallel:f.encoding[o],h=i?m.dimensions.findIndex(p=>p.field===e.channel.parallelDimension):void 0;return{id:n,target:s,channel:i?{...e.channel}:e.channel,policyKey:i?"parallelDimensions":e.channel,fields:[...e.fields],data:f.data,encoding:m,...h===void 0?{}:{dimensionIndex:h},cells:e.fields.map((p,g)=>({id:`${n}-field-${g+1}`,field:p,value:p}))}}function qe(t,e){const n=t.encoding;return{target:t.target,field:e,fieldType:n.fieldType,...n.temporalUnit===void 0?{}:{temporalUnit:n.temporalUnit},...n.aggregate===void 0?{}:{aggregate:n.aggregate},...n.bin===void 0?{}:{bin:n.bin},...n.stack===void 0?{}:{stack:n.stack},...n.weight===void 0?{}:{weight:n.weight},scale:{id:n.scale}}}function De(t,e,n){return e.encoding.dimensions.map((i,c)=>{const o=be(t,i.scale);if(o===void 0)throw new Error(`repeatCharts Parallel dimension scale "${i.scale}" is missing.`);const{id:d,...s}=o,r=c===e.dimensionIndex;return{field:r?n:i.field,fieldType:i.fieldType,title:r&&i.title===i.field?n:i.title,scale:s}})}function Le(t,e,n){if(S(e.channel))return t.encodeParallelCoordinates({target:e.target,coordinate:U(t,e.target).coordinate,dimensions:De(t,e,n),...e.encoding.key===void 0?{}:{key:e.encoding.key},missing:e.encoding.missing});const i={x:"encodeX",y:"encodeY",theta:"encodeTheta",r:"encodeR"}[e.channel];return t[i](qe(e,n))}function Z(t,e,n,i){const c=t.semanticSpec.title.text===void 0?t:t.removeTitle(),o=Object.fromEntries(e.cells.map(d=>[d.id,Le(c,e,d.field)]));return ge(c,e.cells.map(d=>d.id),o,n,i)}const Me=T({op:"repeatCharts",description:"Repeat one direct chart across an ordered field-role list."},Te,function(t={}){const e=b(t.guides),n=Q(this,t);x(e.axes,k(this.semanticSpec).family,!0);const i={...t.scales??{},[n.policyKey]:t.scales?.[n.policyKey]??"independent"},c=j(this.semanticSpec,i),o=Z(this,n,i,!0);return X(this,t,{definition:n,derived:o,guides:e,scalePolicies:c,facet:{values:n.fields,repeat:{target:n.target,channel:n.channel,fields:n.fields}}})}),Re=J("facetGrid","Repeat one direct-source Cartesian chart across a row and column field grid.",I),Ae=z({op:"editFacetHeaders",description:"Edit parent-owned facet header appearance.",scope:"composition"},function(t={}){v(this,"editFacetHeaders");const e=this.compositionSpec.id,n=this.materializationConfigs.facets?.[e];if(!S(n?.headers))throw new Error(`Facet "${e}" requires header configuration.`);const i=L(n.headers,t,this.compositionSpec.facet.grid);return this._withMaterializationConfig(["facets",e],{...n,headers:i}).materializeComposition()}),Pe=z({op:"editFacetScales",description:"Edit facet scale-resolution policies and rederive every cell.",scope:"composition"},function(t={}){v(this,"editFacetScales"),w(t,_,"editFacetScales",{allowEmpty:!1,emptyMessage:"editFacetScales requires at least one channel policy change."});for(const i of Object.keys(t))if(!N(this.semanticSpec).some(c=>c.policyKey===i))throw new Error(`Facet scale channel "${i}" is not used by an affected layer.`);const e=this.compositionSpec.facet,n={...e.scales,...t};if(_.every(i=>n[i]===e.scales[i]))throw new Error("editFacetScales requires at least one channel policy change.");return D(this,{scales:n,guides:e.guides})}),Ge=z({op:"editFacetGuides",description:"Edit facet guide ownership and rederive every cell.",scope:"composition"},function(t={}){v(this,"editFacetGuides"),w(t,V,"editFacetGuides",{allowEmpty:!1,emptyMessage:"editFacetGuides requires at least one guide policy."});const e=this.compositionSpec.facet;Object.hasOwn(t,"legend")&&b({legend:t.legend});const n=b({...e.guides,...t,...Object.hasOwn(t,"axes")?{axes:R(t.axes,e.guides.axes)}:{}},!0),i=k(this.semanticSpec).family;return x(n.axes,i,e.repeat!==void 0),D(this,{scales:e.scales,guides:n})});function Ie(t,e,n=!1){if(!(t instanceof e.constructor))throw new TypeError("editFacetSource program must be a ChartProgram.");if(t.compositionSpec!==void 0)throw new Error("editFacetSource program must be a complete unit ChartProgram.");if(t.actionStack.length!==0)throw new Error("editFacetSource program has an unfinished action stack.");const i=e.compositionSpec.children.find(a=>e.children[a]?.semanticSpec.layers.length>0)??e.compositionSpec.children[0],c=e.children[i]?.materializationConfigs??{},{canvas:o,theme:d,facets:s,...r}=c;return new e.constructor({semanticSpec:t.semanticSpec,graphicSpec:t.graphicSpec,resolvedScales:t.resolvedScales,materializationConfigs:A({...n?{...r,...t.materializationConfigs}:{...t.materializationConfigs,...r},...t.materializationConfigs.canvas===void 0?{}:{canvas:t.materializationConfigs.canvas},...t.materializationConfigs.theme===void 0?{}:{theme:t.materializationConfigs.theme}}),children:{},context:t.context,trace:e.trace,actionStack:e.actionStack,actionSequence:e._actionSequence})}const Ne=T({op:"editFacetSource",description:"Reapply one facet, grid, or repeat recipe to a revised complete unit program.",scope:"composition"},ke,function(t={}){v(this,"editFacetSource");const e=this.compositionSpec,n=this.materializationConfigs.facets?.[e.id];if(Object.hasOwn(t,"program")===Object.hasOwn(t,"action"))throw new Error("editFacetSource requires exactly one of program or action.");let i=t.program,c=this;if(t.action!==void 0){w(t.action,["method","options"],"editFacetSource action");const l=$(t.action.method,"editFacetSource action method");let f=E(this,!0);const u=typeof f[l]=="function"?ce(f[l]):void 0;if(!u||!$e.has(l)||u.scope==="composition"||/^(?:_|materialize|rematerialize|replay|editSemantic$|editGraphics$|createGraphics$)/.test(l))throw new Error("editFacetSource action requires a unit chart-authoring action.");f=de(f,fe({marks:f.semanticSpec.layers.map(h=>le(f,h))}));for(const h of ne(f)){const p=f.guideConfigs.axis?.[h.id]??{},g=ie(h.channel,h.id);for(const[F,y]of["line","ticks","labels","title"].entries()){if(!p[y]||f.graphicSpec.objects[g[F]])continue;const{mode:M,inferredValues:He,inferredText:Ue,inferredRotation:We,inferredOffset:Ke,...O}=p[y];M==="values"&&delete O.count,M==="count"&&delete O.values;const ee=y[0].toUpperCase()+y.slice(1);f=f[`create${h.channel.toUpperCase()}Axis${ee}`]({...O,...ae(h.id,h.channel)})}}const m=f[l](t.action.options??{});c=new this.constructor({...this,trace:m.trace,actionStack:m.actionStack,actionSequence:m._actionSequence}),i=new this.constructor({...m,actionStack:[],actionSequence:m._actionSequence})}let o=Ie(i,c,t.action!==void 0);n!==void 0&&(o=o._withMaterializationConfig(["facets",e.id],n));const d=S(e.facet.guides.legend),s=d?{...e.facet.guides,legend:!1}:e.facet.guides;let r;const a=C(o,C(this,e.facet.scales));if(e.facet.grid!==void 0?r=o.facetGrid({id:e.id,data:e.facet.data,rows:e.facet.grid.rows,columns:e.facet.grid.columns,combinations:e.facet.grid.combinations,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:s}):e.facet.repeat!==void 0?r=o.repeatCharts({id:e.id,...e.facet.repeat,columns:e.columns,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:s}):r=o.facet({id:e.id,data:e.facet.data,field:e.facet.field,values:e.facet.values,columns:e.columns,gap:e.gap,...e.spacing===void 0?{}:{spacing:e.spacing},...e.topLane===void 0?{}:{topLane:e.topLane},align:e.align,padding:e.padding,scales:a,guides:s}),d){const l=r.compositionSpec;r=r._withCompositionState({children:r.children,compositionSpec:{...l,facet:{...l.facet,guides:e.facet.guides}}})}return n!==void 0&&(r=r._withMaterializationConfig(["facets",e.id],n).materializeComposition()),r.semanticSpec.title.text!==void 0&&(r=r.removeTitle()),this.semanticSpec.title.text!==void 0&&(r=r.createTitle({...this.titleConfig,...this.semanticSpec.title})),ye(r,this.materializationConfigs.theme)});function Et(t){se((e,n)=>{const{program:i,plan:c}=re(E(e),n),o=e.compositionSpec,d=new e.constructor({...i,graphicSpec:e.graphicSpec,children:e.children,materializationConfigs:{...i.materializationConfigs,facets:e.materializationConfigs.facets,...e.titleConfig===void 0?{}:{title:e.titleConfig}},actionSequence:i._actionSequence,compositionSpec:{...o,facet:{...o.facet,data:c.replacements.get(o.facet.data)??o.facet.data}}});return D(d,o.facet)}),t.prototype.replayDerivedData=Se,t.prototype.composeFacetGuides=we,t.prototype.facet=je,t.prototype.facetGrid=Re,t.prototype.repeatCharts=Me,t.prototype.editFacetHeaders=Ae,t.prototype.editFacetScales=Pe,t.prototype.editFacetGuides=Ge,t.prototype.editFacetSource=Ne}export{Ge as editFacetGuides,Ae as editFacetHeaders,Pe as editFacetScales,Ne as editFacetSource,je as facet,Re as facetGrid,Et as registerFacetActions,Me as repeatCharts};
@@ -85,10 +85,7 @@ export const rematerializeLegendTitle = /* @__PURE__ */ action(
85
85
  .editGraphics({
86
86
  target: id,
87
87
  property: "textAlign",
88
- value: config.titleStyle.align ?? (["top", "bottom"].includes(config.position) &&
89
- config.titlePosition === "top"
90
- ? "center"
91
- : "left")
88
+ value: layout.title.align
92
89
  })
93
90
  .editGraphics({ target: id, property: "textBaseline", value: "middle" });
94
91
  return materializeLegendTitleLines(next, id, config.title, config.titleStyle);
@@ -1,3 +1,5 @@
1
+ import { reconcileRegressionPlacement } from "../../materialization/graphicHierarchy.js";
2
+ import { validateRegressionPlacement } from "../../grammar/regression/parameters.js";
1
3
  import { closedAction } from "../../core/action.js";
2
4
  import { validateKeys } from "../../core/validation.js";
3
5
  import { normalizeRegressionParameters, normalizeRegressionPredict } from "../../grammar/regression/index.js";
@@ -12,7 +14,7 @@ import {
12
14
  const REGRESSION_OPTIONS = Object.freeze([
13
15
  "target", "x", "y", "groupBy", "method", "degree", "span", "robustIterations",
14
16
  "confidenceMethod", "level", "confidence", "interval", "band", "line"
15
- , "predict", "sourceBinding", "missing"
17
+ , "predict", "sourceBinding", "missing", "placement"
16
18
  ]);
17
19
 
18
20
  export const createRegression = /* @__PURE__ */ closedAction(
@@ -21,6 +23,7 @@ export const createRegression = /* @__PURE__ */ closedAction(
21
23
  description: "Fit and layer regression lines with optional interval bands."
22
24
  }, REGRESSION_OPTIONS,
23
25
  function (args = {}) {
26
+ const placement = validateRegressionPlacement(args.placement);
24
27
  const sourceBinding = args.sourceBinding ?? "fixed";
25
28
  if (!["fixed", "follow"].includes(sourceBinding)) {
26
29
  throw new Error('Regression sourceBinding must be "fixed" or "follow".');
@@ -134,9 +137,11 @@ export const createRegression = /* @__PURE__ */ closedAction(
134
137
  dataId,
135
138
  bandId: band === false ? undefined : bandId,
136
139
  lineId,
140
+ ...(Object.hasOwn(args, "placement") ? { placement } : {}),
137
141
  parameters: regressionDefinition
138
142
  }
139
143
  });
144
+ if (placement === "plot-last") next = reconcileRegressionPlacement(next, point.id);
140
145
  return sourceBinding === "follow"
141
146
  ? next.editSemantic({
142
147
  property: `layer[${point.id}].derivedBindings.regression`,