ggaction 0.0.23 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +2 -2
- package/knowledge/action-cards.json +1 -1
- package/knowledge/intent-taxonomy.json +1 -1
- package/knowledge/mcp-resources.json +1 -1
- package/knowledge/task-resolver.js +1 -1
- package/package.json +1 -1
- package/src/accessibility.js +13 -0
- package/src/actions/canvas/actions.js +2 -1
- package/src/actions/canvas/fitting.js +68 -13
- package/src/actions/charts/beeswarm.js +2 -1
- package/src/actions/charts/ecdf.js +2 -1
- package/src/actions/charts/endpoints.js +25 -16
- package/src/actions/charts/heatmap.js +6 -4
- package/src/actions/charts/missing.js +17 -0
- package/src/actions/charts/radar.js +70 -33
- package/src/actions/charts/raincloud.js +18 -4
- package/src/actions/charts/rug-strip.js +2 -2
- package/src/actions/charts/shared.js +17 -0
- package/src/actions/composition/actions.js +24 -7
- package/src/actions/composition/adjacent.js +90 -0
- package/src/actions/composition/index.js +11 -1
- package/src/actions/composition/layer.js +42 -0
- package/src/actions/composition/layerPlan.js +176 -0
- package/src/actions/composition/targets.js +105 -0
- package/src/actions/data/basicBin2d.js +1 -1
- package/src/actions/data/bin2d.js +2 -2
- package/src/actions/data/derived.js +3 -0
- package/src/actions/data/filter.js +1 -1
- package/src/actions/data/raincloudFilter.js +3 -1
- package/src/actions/encodings/appearance.js +26 -7
- package/src/actions/encodings/channels.js +1 -0
- package/src/actions/encodings/color/continuous.js +37 -34
- package/src/actions/encodings/color/index.js +57 -43
- package/src/actions/encodings/color/policy.js +15 -0
- package/src/actions/encodings/density/resolve.js +3 -2
- package/src/actions/encodings/density.js +2 -2
- package/src/actions/encodings/offset.js +2 -0
- package/src/actions/encodings/pathOrder.js +2 -0
- package/src/actions/encodings/position/areaAlignment.js +42 -0
- package/src/actions/encodings/position/index.js +37 -3
- package/src/actions/encodings/position/policies/line.js +1 -1
- package/src/actions/encodings/ranged.js +4 -2
- package/src/actions/encodings/remove.js +13 -10
- package/src/actions/encodings/ruleAppearance.js +14 -2
- package/src/actions/facets/actions.js +1 -1
- package/src/actions/guides/axes/axes.js +2 -1
- package/src/actions/guides/axes/components.js +5 -0
- package/src/actions/guides/axes/edit.js +1 -188
- package/src/actions/guides/axes/labels.js +2 -537
- package/src/actions/guides/axes/parallel/lifecycle.js +11 -4
- package/src/actions/guides/axes/parallel/policy.js +5 -2
- package/src/actions/guides/axes/parallel/resolve.js +3 -1
- package/src/actions/guides/axes/parallel.js +9 -4
- package/src/actions/guides/axes/tickGroups.js +16 -1
- package/src/actions/guides/axes/ticks.js +33 -24
- package/src/actions/guides/axes/titles.js +1 -389
- package/src/actions/guides/facadeLegend.js +3 -2
- package/src/actions/guides/grids/grid.js +3 -2
- package/src/actions/guides/grids/resolve.js +2 -1
- package/src/actions/guides/guides.js +3 -2
- package/src/actions/guides/legends/automatic.js +28 -0
- package/src/actions/guides/legends/blocks.js +15 -21
- package/src/actions/guides/legends/categorical/actions.js +1 -1
- package/src/actions/guides/legends/categorical/components.js +4 -3
- package/src/actions/guides/legends/categorical/layout.js +5 -2
- package/src/actions/guides/legends/categorical/options.js +9 -14
- package/src/actions/guides/legends/categorical/recipes.js +3 -0
- package/src/actions/guides/legends/categorical/resolve.js +7 -5
- package/src/actions/guides/legends/colorSize.js +51 -14
- package/src/actions/guides/legends/continuous/common.js +1 -1
- package/src/actions/guides/legends/continuous/gradient.js +1 -1
- package/src/actions/guides/legends/continuous/opacity.js +2 -0
- package/src/actions/guides/legends/edit.js +1 -1
- package/src/actions/guides/legends/focused.js +2 -2
- package/src/actions/guides/legends/group.js +1 -1
- package/src/actions/guides/legends/lane.js +1 -1
- package/src/actions/guides/legends/lifecycle.js +2 -2
- package/src/actions/guides/legends/remove.js +18 -4
- package/src/actions/guides/legends/size.js +1 -1
- package/src/actions/guides/legends/transition.js +15 -6
- package/src/actions/guides/polar/axes/facade.js +4 -2
- package/src/actions/guides/polar/axes/labels.js +6 -1
- package/src/actions/guides/polar/axes/shared.js +4 -4
- package/src/actions/guides/polar/axes/titles.js +13 -2
- package/src/actions/guides/polar/grids.js +6 -3
- package/src/actions/guides/tickValues.js +7 -1
- package/src/actions/index.js +2 -0
- package/src/actions/marks/area/actions.js +9 -2
- package/src/actions/marks/area/materialize.js +1 -1
- package/src/actions/marks/bar/materialize.js +4 -4
- package/src/actions/marks/lifecycle.js +14 -0
- package/src/actions/marks/line/actions.js +3 -0
- package/src/actions/marks/line/materialize.js +4 -2
- package/src/actions/marks/point/edit.js +2 -0
- package/src/actions/marks/point/jitter.js +2 -0
- package/src/actions/marks/point/materialize.js +5 -4
- package/src/actions/marks/point/packing.js +2 -0
- package/src/actions/marks/references.js +5 -3
- package/src/actions/marks/remove.js +16 -0
- package/src/actions/marks/shared.js +2 -1
- package/src/actions/marks/text/actions.js +5 -2
- package/src/actions/overlays/index.js +168 -0
- package/src/actions/overlays/snapshot.js +45 -0
- package/src/actions/primitives/editGraphics.js +21 -27
- package/src/actions/primitives/semanticAction.js +4 -5
- package/src/actions/primitives/semanticValidation/guide.js +1 -0
- package/src/actions/primitives/semanticValidation/layer.js +7 -0
- package/src/actions/scales/consumers/common.js +10 -0
- package/src/actions/scales/consumers/families.js +1 -1
- package/src/actions/scales/preview.js +1 -1
- package/src/actions/selection/actions.js +63 -11
- package/src/actions/titles/actions.js +3 -14
- package/src/actions/titles/resolve.js +23 -10
- package/src/core/action.js +41 -25
- package/src/core/compositionScales.js +12 -0
- package/src/core/compositionState.js +20 -3
- package/src/core/facetGap.js +44 -0
- package/src/core/immutable.js +11 -6
- package/src/core/programState.js +16 -0
- package/src/core/resourceReferences.js +19 -3
- package/src/core/validation.js +7 -0
- package/src/core/vocabulary.js +8 -2
- package/src/grammar/actionTargets.js +24 -0
- package/src/grammar/axisTextPlacement.js +1 -1
- package/src/grammar/bin2d.js +41 -4
- package/src/grammar/colorSizeLegend.js +56 -5
- package/src/grammar/displayLabels.js +10 -0
- package/src/grammar/facetHeaders.js +1 -1
- package/src/grammar/facets/dependencies.js +10 -3
- package/src/grammar/facets/guides.js +2 -1
- package/src/grammar/facets/legendIntent.js +7 -5
- package/src/grammar/legendBlocks.js +1 -1
- package/src/grammar/legendCombinations.js +1 -1
- package/src/grammar/legendGroups.js +1 -1
- package/src/grammar/legendItemsOffset.js +12 -0
- package/src/grammar/legendOverflow.js +25 -0
- package/src/grammar/lineSeries.js +1 -1
- package/src/grammar/markSelection.js +23 -0
- package/src/grammar/overlay.js +51 -0
- package/src/grammar/parallelCoordinates.js +1 -208
- package/src/grammar/pathCommands.js +8 -2
- package/src/grammar/pathSeries.js +1 -1
- package/src/grammar/plotComposition.js +152 -0
- package/src/grammar/pointShapes.js +18 -0
- package/src/grammar/scales/transformed.js +1 -1
- package/src/grammar/schemas/concreteGraphic.js +8 -1
- package/src/grammar/schemas/graphicBounds.js +8 -1
- package/src/grammar/schemas/graphicTree.js +18 -2
- package/src/grammar/schemas/semanticPath.js +3 -0
- package/src/grammar/strokeStyle.js +14 -8
- package/src/grammar/text.js +72 -0
- package/src/inspection.js +1 -1
- package/src/inspectionDescriptors.js +1 -1
- package/src/layout/composition.js +32 -10
- package/src/layout/compositionLegend.js +91 -0
- package/src/layout/facetContentFlow.js +15 -7
- package/src/layout/facetHeaderTitles.js +1 -1
- package/src/layout/facets.js +1 -1
- package/src/layout/labels.js +55 -27
- package/src/layout/legend.js +3 -2
- package/src/layout/legendGroup.js +1 -1
- package/src/layout/legendItems.js +7 -6
- package/src/layout/legendLane.js +1 -1
- package/src/layout/legendText.js +1 -1
- package/src/layout/title.js +1 -1
- package/src/materialization/adjacentSource.js +27 -0
- package/src/materialization/composition.js +165 -52
- package/src/materialization/compositionLegends.js +120 -0
- package/src/materialization/compositionScales.js +125 -0
- package/src/materialization/compositionTitle.js +96 -0
- package/src/materialization/facetGuides/edit.js +22 -2
- package/src/materialization/facetGuides/layout.js +1 -1
- package/src/materialization/facetGuides/owner.js +4 -3
- package/src/materialization/facetGuides/ownerLayout.js +12 -6
- package/src/materialization/facetGuides/placement.js +19 -22
- package/src/materialization/facetGuides/preparation.js +17 -5
- package/src/materialization/facetHeaders.js +5 -1
- package/src/materialization/facets.js +1 -1
- package/src/materialization/guides/layout.js +1 -1
- package/src/materialization/guides/resources.js +1 -1
- package/src/materialization/guides/visibility.js +105 -0
- package/src/materialization/legendClip.js +1 -1
- package/src/materialization/legendGroups.js +1 -1
- package/src/materialization/legendItemsOffset.js +68 -0
- package/src/materialization/legendSuppression.js +22 -0
- package/src/materialization/legends.js +3 -2
- package/src/materialization/marks/capabilities.js +4 -0
- package/src/materialization/marks/index.js +5 -1
- package/src/materialization/marks/pathOrder.js +1 -1
- package/src/materialization/marks/policies.js +2 -1
- package/src/materialization/overlayItems.js +154 -0
- package/src/materialization/planner.js +19 -4
- package/src/materialization/scales/policies/binnedPosition.js +43 -5
- package/src/materialization/scales/policies/series.js +12 -4
- package/src/materialization/scales/resolve.js +2 -0
- package/src/materialization/selection/items/bar.js +21 -3
- package/src/materialization/selection/items/common.js +18 -5
- package/src/materialization/selection/items/overlay.js +15 -0
- package/src/materialization/selection/items/path.js +1 -0
- package/src/materialization/selection/items/point.js +2 -3
- package/src/materialization/selection/items/tick.js +3 -12
- package/src/materialization/selection/path.js +2 -2
- package/src/materialization/selection/policies/bar.js +2 -0
- package/src/materialization/selection/policies/index.js +35 -1
- package/src/materialization/selection/policies/point.js +2 -0
- package/src/materialization/selection/policies/text.js +17 -0
- package/src/materialization/selection/rows.js +103 -0
- package/src/materialization/selection/state.js +19 -3
- package/src/materialization/selection/styles.js +8 -0
- package/src/materialization/text.js +6 -489
- package/src/materialization/textGeometry.js +503 -0
- package/src/materialization/textLines.js +20 -0
- package/src/persistence/validation.js +116 -25
- package/src/renderers/canvas/index.js +12 -7
- package/src/renderers/canvas/text.js +5 -5
- package/src/renderers/nativeBackend.js +25 -0
- package/src/renderers/pdf.js +3 -3
- package/src/renderers/png.js +4 -3
- package/src/renderers/svgSerialization.js +1 -643
- package/src/scene.js +5 -3
- package/src/selectors/plotComposition.js +115 -0
- package/src/selectors/selectionTargets.js +19 -0
- package/src/version.js +1 -1
- package/types/basic.d.ts +4 -2
- package/types/index.d.ts +14 -0
- package/types/inspection.d.ts +34 -0
- package/types/program.d.ts +572 -372
|
@@ -1 +1 @@
|
|
|
1
|
-
var ze=Object.defineProperty;var p=(o,t)=>ze(o,"name",{value:t,configurable:!0});import{IMPUTE_REQUIRED_OPTIONS as Te}from"../src/core/optionRequirements.js";import{readFileSync as fe}from"node:fs";import he from"node:path";import{fileURLToPath as Me}from"node:url";const me=Me(new URL("../",import.meta.url)),te=JSON.parse(fe(he.join(me,"knowledge/action-cards.json"),"utf8")),T=JSON.parse(fe(he.join(me,"knowledge/intent-taxonomy.json"),"utf8")),A=new Map(te.cards.map(o=>[o.name,o])),oe=new Map(T.constraints.map(o=>[o.id,o])),ge=Object.freeze(["hconcat","vconcat","render"]),se=Object.freeze({renderToSVG:Object.freeze({entry:"ggaction/svg",output:"svg"}),renderToPNG:Object.freeze({entry:"ggaction/png",output:"png"}),renderToPDF:Object.freeze({entry:"ggaction/pdf",output:"pdf"})}),de=Object.freeze(["createCanvas","createData"]),Re=Object.freeze({width:"800",height:"600",margin:"{ top: 140, right: 220, bottom: 120, left: 260 }"}),ve=new Set(["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createBoxPlot","createGradientPlot","createViolinPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot","createRugPlot","createStripPlot"]),Be=new Set(["createAxes","createXAxis","createYAxis","createGrid","createLegend","createGuides"]),ye=Object.freeze({"chart.type":"ggaction://docs/choose-chart-type","renderer.format":"ggaction://docs/choose-renderer","layout.responsive":"ggaction://docs/responsive-layout","output.accessibility":"ggaction://docs/accessibility","renderer.svg.accessibleText":"ggaction://docs/accessibility","renderer.pixelRatio":"ggaction://docs/responsive-layout","query.intent":"ggaction://docs/getting-started"});class qe extends Error{static{p(this,"TaskPacketBudgetError")}constructor(t){super(`Compact task packet is ${t} bytes; the hard ceiling is 6144 bytes.`),this.name="TaskPacketBudgetError",this.bytes=t}}function D(o){return[...new Set(o)]}p(D,"unique");function Z(o){return o.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}p(Z,"normalize");const be=/\b(?:no|not|without|exclude|excluding|omit|omitting|avoid|avoiding|don['’]t|doesn['’]t|isn['’]t|aren['’]t|never|neither|nor)\b/i;function Ae(o){let t=o.normalize("NFKC").replace(/(^|[\s=:(,])("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g,(e,i,n)=>i+" ".repeat(n.length));for(const e of T.constraints)for(const i of e.phrases.filter(n=>be.test(n))){const n=Z(i).split(" ").join("\\s+");t=t.replace(new RegExp(`\\b${n}\\b`,"gi")," ")}return be.test(t)}p(Ae,"hasUnresolvedNegation");function le(o,t){const e=Z(t),i=` ${o} `,n=` ${e} `,r=[];let a=0;for(;a<i.length;){const d=i.indexOf(n,a);if(d===-1)break;r.push({start:d+1,end:d+n.length-1}),a=d+1}return r}p(le,"phraseOccurrences");function De(o){return te.cards.filter(t=>new RegExp(`(?:^|[^A-Za-z0-9])${t.name}(?:$|[^A-Za-z0-9])`,"i").test(o)).map(t=>t.name)}p(De,"exactActionNames");function Ee(o){const t=T.constraints.flatMap(r=>r.phrases.flatMap(a=>le(o,a).map(d=>({constraint:r,...d})))),e=t.filter(r=>!t.some(a=>a.constraint.shadows?.includes(r.constraint.id)&&a.start<=r.start&&a.end>=r.end)),i=T.constraints.filter(r=>e.some(a=>a.constraint.id===r.id)),n=new Map(i.map(r=>[r.id,Math.min(...e.filter(a=>a.constraint.id===r.id).map(a=>a.start))]));return{matched:i,positions:n}}p(Ee,"semanticMatchResult");function pe(o){return o.name==="createCanvas"?10:o.name==="createData"?20:o.name.endsWith("Data")?30:o.domain==="charts"||o.domain==="marks"&&o.name.startsWith("create")?40:o.domain==="encodings"?/^encode(X|Y|X2|Y2|XRange|YRange|Theta|R|Radius|ParallelCoordinates)/.test(o.name)?50:o.name==="encodeGroup"||o.name==="encodePathOrder"?52:55:o.domain==="statistics"?60:["axes","grid","legend_and_title"].includes(o.domain)?70:o.domain==="mark-selection"?75:o.domain==="composition"||/^(layout|jitter|order|replace)/.test(o.name)?80:65}p(pe,"orderForCard");function Le(o,t){const e=A.get(o),i=T.providers.filter(n=>n.kind==="action"&&n.name===o).map(n=>({provider:n,coverage:n.covers.filter(r=>t.has(r)).length})).filter(n=>n.coverage>0).sort((n,r)=>r.coverage-n.coverage||n.provider.order-r.provider.order||n.provider.id.localeCompare(r.provider.id))[0]?.provider;return i?{...i,id:`exact.${o}`,anchors:[`action.${o}`],covers:D([`action.${o}`,...i.covers.filter(n=>t.has(n))])}:{id:`exact.${o}`,kind:"action",name:o,order:pe(e),anchors:[`action.${o}`],covers:[`action.${o}`],exactCall:e.snippet,exactOptionNames:e.options.filter(n=>new RegExp(`\\b${n.name}\\s*:`).test(e.snippet)).map(n=>n.name)}}p(Le,"exactProvider");function Ne(o){const t=new Map;for(const n of o){if(!n.exclusiveGroup)continue;const r=t.get(n.exclusiveGroup)??[];r.push(n),t.set(n.exclusiveGroup,r)}const e=new Set,i=[];for(const[n,r]of t)if(!(r.length<2)){for(const a of r)e.add(a.id);for(const a of r)i.push({constraint:a.id,reason:`This conflicts within ${n}: ${r.map(d=>d.id).join(", ")}.`,resources:[n==="legend.position"?"ggaction://docs/legend-layout":"ggaction://docs/choose-chart-type"]})}return{blocked:e,unresolved:i}}p(Ne,"conflictResult");function We(o,t){const e=T.providers.filter(i=>i.anchors.some(n=>o.has(n)));for(const i of t)e.push(Le(i,o));return e}p(We,"candidateProviders");function je(o,t){const e=new Set(o),i=[];for(;e.size>0;){const n=t.filter(a=>!i.some(d=>d.provider.id===a.id)).map(a=>({provider:a,coverage:a.covers.filter(d=>e.has(d))})).filter(a=>a.coverage.length>0).sort((a,d)=>d.coverage.length-a.coverage.length||a.provider.order-d.provider.order||a.provider.id.localeCompare(d.provider.id));if(n.length===0)break;const r=n[0];i.push(r);for(const a of r.coverage)e.delete(a)}return{selected:i,uncovered:e}}p(je,"selectProviders");function _e(o){let t=o;o.some(a=>a.provider.name==="selectMarks")&&(t=t.map(a=>a.provider.name!=="highlightMarks"?a:{...a,provider:{...a.provider,baseOptions:{selection:'"selection-1"',color:'"#f28e2b"'}}}));const i=t.some(a=>a.provider.name==="createRegression"&&!a.provider.id.startsWith("exact.")),n=t.some(a=>["createPointMark","createScatterPlot","createPolarScatterPlot"].includes(a.provider.name));i&&!n&&(t=[ne("createPointMark",{}),...t]);const r=t.find(a=>a.provider.name==="editLegendLayout"&&a.coverage.some(d=>d.startsWith("layout.legend.")));if(r){const a=t.find(d=>d.coverage.includes("guide.legend")&&(d.provider.name==="createLegend"||d.provider.optionsByConstraint?.["guide.legend"]?.guides!==void 0));if(a){const d=r.provider.baseOptions?.position;if(d===void 0)throw new Error(`${r.provider.id} lacks a legend position.`);const w=r.coverage.filter(h=>h.startsWith("layout.legend."));t=t.filter(h=>h!==r).map(h=>{if(h!==a)return h;const $=d==='"left"'?"96":d==='"bottom"'?$e:void 0;return{provider:h.provider.name==="createLegend"?{...h.provider,baseOptions:{...h.provider.baseOptions??{},position:d,...$===void 0?{}:{offset:$}}}:{...h.provider,optionsByConstraint:{...h.provider.optionsByConstraint??{},"guide.legend":{...h.provider.optionsByConstraint?.["guide.legend"]??{},guides:`{ legend: { position: ${d}${$===void 0?"":`, offset: ${$}`} } }`}}},coverage:[...h.coverage,...w]}})}}return t}p(_e,"adaptProviderDependencies");function S(o,t){return{...o,provider:{...o.provider,baseOptions:{...o.provider.baseOptions??{},...t}}}}p(S,"withBaseOptions");function ne(o,t,e=[]){const i=A.get(o);if(!i)throw new Error(`Unknown runtime dependency action ${o}.`);return{provider:{id:`action.${o}`,kind:"action",name:o,order:pe(i),anchors:[],covers:[],baseOptions:t},coverage:e}}p(ne,"dependencyEntry");function Ge(o){const t=o.find(n=>!n.provider.id.startsWith("exact.")&&ve.has(n.provider.name));if(!t)return o;const e=o.filter(n=>!n.provider.id.startsWith("exact.")&&Be.has(n.provider.name));if(e.length===0)return o;const i=e.flatMap(n=>n.coverage);return o.filter(n=>!e.includes(n)).map(n=>n===t?{...n,coverage:D([...n.coverage,...i])}:n)}p(Ge,"absorbFacadeGuides");function we(o,t,e){const i=o.indexOf(t);return i===-1?o:[...o.slice(0,i),...e,...o.slice(i+1)]}p(we,"replaceEntry");function Ie(o){const t=p(v=>o.find(M=>M.provider.name===v&&!M.provider.id.startsWith("exact.")),"semantic"),e=t("createPointMark"),i=t("createTextMark"),n=t("encodeText"),r=new Set(["encodeX","encodeY","encodeColor","encodeSize","encodeShape","encodeAngle","encodeOpacity"]),a=o.filter(v=>!v.provider.id.startsWith("exact.")&&r.has(v.provider.name));if(!e||!i||!n||!a.some(v=>v.provider.name==="encodeX")||!a.some(v=>v.provider.name==="encodeY"))return o;const d=[e,...a,i,n],w=new Set(d),h=Math.min(...d.map(v=>o.indexOf(v))),$=o.slice(0,h).filter(v=>!w.has(v)).length,u=o.filter(v=>!w.has(v));return[...u.slice(0,$),...d,...u.slice($)]}p(Ie,"orderInheritedTextOverlay");function Ve(o){const t=o.find(u=>u.provider.name==="createBarMark"&&!u.provider.id.startsWith("exact."));if(!t)return o;const e=o.indexOf(t),i=o.findIndex((u,v)=>v>e&&!u.provider.id.startsWith("exact.")&&u.provider.name.startsWith("create")&&(u.provider.name.endsWith("Mark")||u.provider.name.endsWith("Plot"))),n=i===-1?o.length:i,r=o.slice(e+1,n).filter(u=>["encodeX","encodeY"].includes(u.provider.name)&&!u.provider.id.startsWith("exact.")),a=r.find(u=>['"nominal"','"ordinal"','"temporal"'].includes(u.provider.baseOptions?.fieldType)),d=r.find(u=>u.provider.baseOptions?.fieldType==='"quantitative"');if(!a||!d||o.indexOf(a)<o.indexOf(d))return o;const w=[...o],h=w.indexOf(a),$=w.indexOf(d);return w[$]=a,w[h]=d,w}p(Ve,"orderBarCategoryBeforeMeasure");function He(o){let t=Ge(o);const e=p(s=>t.find(x=>x.provider.name===s&&!x.provider.id.startsWith("exact.")),"semantic"),i=p(s=>t.find(x=>x.coverage.includes(s)),"chartOwner"),n=p((s,{before:x=[],after:b=[]})=>{if(!s)return;const C=t.indexOf(s);t=[...t.slice(0,C),...x,s,...b,...t.slice(C+1)]},"expandChartOwner"),r=p((s,x)=>{const b=t.find(C=>C.provider.name===s&&!C.provider.id.startsWith("exact."));return b?(t=t.filter(C=>C!==b),S(b,x)):ne(s,x)},"chartDependency"),a=p((s,x)=>{const b=i(s);b&&n(b,x())},"expandChartConstraint");a("chart.bar.horizontal",()=>({after:[r("encodeY",{field:'"category"',fieldType:'"nominal"'}),r("encodeX",{field:'"value"',fieldType:'"quantitative"'})]})),a("chart.radar",()=>({}));const d=e("createData");d&&(t=t.map(s=>s===d?S(s,{values:"values"}):s));const w=e("createCanvas");w&&(t=t.map(s=>s===w?S(s,Re):s));const h=e("createScatterPlot");h&&(t=t.map(s=>s===h?S(s,{x:'{ field: "x", fieldType: "quantitative" }',y:'{ field: "y", fieldType: "quantitative" }'}):s));const $=e("createLinePlot"),u=e("encodeOpacity");$&&u&&(t=t.filter(s=>s!==u).map(s=>s===$?{...S(s,{line:"{ opacity: 0.8 }"}),coverage:D([...s.coverage,...u.coverage])}:s));const v=e("createBarPlot");if(v){const s=e("createScale")?.provider.id==="action.createColorScale",x='{ field: "category", scale: { id: "color-scale" } }';t=t.map(b=>{if(b!==v)return b;const C=S(b,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }',...s?{color:x}:{}});return s?{...C,provider:{...C.provider,optionsByConstraint:{...C.provider.optionsByConstraint??{},"encoding.color":{color:x}}}}:C})}const M=e("createTimeUnitData"),G=e("createBarPlot");M&&G&&(t=t.map(s=>s===G?S(s,{data:'"monthly"',x:'{ field: "month", fieldType: "ordinal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const X=e("createBoxPlot");X&&(t=t.map(s=>s===X?S(s,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const E=e("createWindowData"),q=e("createLinePlot");if(E&&q){const s=e("createScale")?.provider.id==="action.createTimeScale";t=t.map(x=>x===q?S(x,{data:'"windowed"',x:s?'{ field: "date", fieldType: "temporal", scale: { id: "scale-1" } }':'{ field: "x", fieldType: "quantitative" }',y:'{ field: "movingMean", fieldType: "quantitative" }'}):x)}const H=e("createIntervalData"),L=e("createBoxPlot"),y=e("createErrorBar");H&&L&&y&&(t=t.map(s=>s===H?S(s,{source:'"data"',groupBy:'"category"'}):s===L?S(s,{data:'"data"',x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s===y?S(s,{data:'"interval"',x:'{ field: "category", fieldType: "nominal", scale: { id: "errorBarX" } }',y:'{ center: "__interval_center", lower: "__interval_lower", upper: "__interval_upper", scale: { id: "errorBarY" } }'}):s));const I=e("createDensityData"),V=e("createViolinPlot");I&&V&&(t=t.filter(s=>s!==I).map(s=>s===V?{...S(s,{data:'"data"',...s.coverage.includes("guide.legend")?{color:'"category"'}:{}}),coverage:D([...s.coverage,...I.coverage])}:s));const f=e("createGradientPlot"),O=e("createScale")?.provider.id==="action.createLogScale"?e("createScale"):void 0;f&&(t=t.map(s=>s===f?S(s,{data:'"data"',x:`{ field: "value", fieldType: "quantitative"${O?', scale: { id: "scale-1" }':""} }`,y:'{ field: "category", fieldType: "nominal" }'}):s));const j=e("encodeDensity"),J=e("createAreaMark");if(j&&!J){const s=ne("createAreaMark",{id:'"densityArea"'}),x=t.indexOf(j);t=[...t.slice(0,x),s,...t.slice(x)].map(b=>b===j?S(b,{target:'"densityArea"'}):b)}const N=e("createBin2DData"),F=e("createRectMark");if(N&&F){t=t.map(R=>R===N?S(R,{source:'"data"'}):R===F?S(R,{id:'"rect"',data:'"bins"'}):R.provider.id==="action.createColorScale"?S(R,{type:'"sequential"',range:'{ palette: "viridis" }'}):R);const s=e("encodeX"),x=e("encodeY");s&&(t=we(t,s,[S(s,{field:'"__bins_x0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeX2",{field:'"__bins_x1"',fieldType:'"quantitative"',target:'"rect"'})])),x&&(t=we(t,x,[S(x,{field:'"__bins_y0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeY2",{field:'"__bins_y1"',fieldType:'"quantitative"',target:'"rect"'})]));const b=e("encodeColor");b&&(t=t.map(R=>R===b?S(R,{field:'"__bins_count"',fieldType:'"quantitative"',target:'"rect"',scale:'{ id: "color-scale" }'}):R));const C=e("createLegend");C&&(t=t.map(R=>R===C?S(R,{target:'"rect"',channels:'["color"]'}):R))}let K,_,Y;const ie=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"scatterPlot",createLinePlot:"linePlot",createPolarScatterPlot:"polarScatterPlot",createPolarLinePlot:"polarLinePlot",createRadarPlot:"radarPlot",createRugPlot:"rugPlot",createStripPlot:"stripPlot",createAreaPlot:"areaPlot",createBarPlot:"barPlot",createBoxPlot:"boxPlot",createGradientPlot:"gradientPlot",createViolinPlot:"violinPlot",createPiePlot:"piePlot",createRosePlot:"rosePlot",createRadialBarPlot:"radialBarPlot",createDensityPlot:"densityPlot",createHorizonPlot:"horizonPlot"}),ee=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"point",createLinePlot:"line",createPolarScatterPlot:"point",createPolarLinePlot:"line",createRadarPlot:"line",createRugPlot:"tick",createStripPlot:"point",createAreaPlot:"area",createBarPlot:"bar",createBoxPlot:"bar",createGradientPlot:"rect",createViolinPlot:"area",createPiePlot:"arc",createRosePlot:"arc",createRadialBarPlot:"arc",createDensityPlot:"area",createHorizonPlot:"area"});return t=t.map(s=>{if(s.provider.id.startsWith("exact."))return s;if(s.provider.name==="createScale")return Y=s.provider.id==="action.createColorScale"?void 0:s.provider.baseOptions?.id,s;const x=ie[s.provider.name];if(x!==void 0)return K=s.provider.baseOptions?.id?.replaceAll('"',"")??x,_=s.coverage.includes("chart.bar.horizontal")?"bar-horizontal":ee[s.provider.name],s;if(!K||s.provider.name==="createErrorBar")return s;const b={};return["area","rule","arc"].includes(_)&&["encodeX","encodeY","encodeR"].includes(s.provider.name)&&(b.fieldType='"quantitative"'),s.provider.name==="encodeTheta"&&_==="arc"&&s.provider.baseOptions?.fieldType===void 0&&(b.fieldType='"ordinal"'),_==="bar"&&s.provider.name==="encodeX"&&(b.field='"category"',b.fieldType='"nominal"'),_==="bar"&&s.provider.name==="encodeY"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeX"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeY"&&(b.field='"category"',b.fieldType='"nominal"'),Y&&["encodeX","encodeY"].includes(s.provider.name)&&(b.scale=`{ id: ${Y} }`,Y=void 0),Object.keys(b).length===0?s:S(s,b)}),Ie(Ve(t))}p(He,"closeRuntimeDependencies");function xe(o,t){const e=o.coverage.map(i=>t.get(i)).filter(i=>i!==void 0);return e.length===0?Number.POSITIVE_INFINITY:Math.min(...e)}p(xe,"providerRequestPosition");function re(o,t){const e=new Map(Object.entries(o.baseOptions??{}));for(const i of t)for(const[n,r]of Object.entries(o.optionsByConstraint?.[i]??{})){const a=e.get(n);if(a!==void 0&&a!==r){if(n==="guides"&&(a==="{}"||r==="{}")){e.set(n,a==="{}"?r:a);continue}throw new Error(`${o.id} assigns conflicting values to option ${n}.`)}e.set(n,r)}return e}p(re,"mergeOptionValues");function ue(o,t){if(o.exactCall)return o.exactCall;if(A.get(o.name).options.length===0)return`program.${o.name}()`;const i=[...t].map(([n,r])=>`${n}: ${r}`).join(", ");return`program.${o.name}(${i.length===0?"{}":`{ ${i} }`})`}p(ue,"actionCall");function Ye(o){const t=new Map;return o.map(e=>{if(e.provider.kind!=="action")return e;const i=e.provider.name,n=ue(e.provider,re(e.provider,e.coverage));if(/^create.+Data$/.test(i)){const r=n.match(/\bid\s*:\s*"([A-Za-z0-9_-]+)"/)?.[1];r&&t.set(i,r)}if(/^edit.+Data$/.test(i)){const r=t.get(i.replace(/^edit/,"create"));if(r)return Pe(e,new Map([["target",B(r)]]))}return e})}p(Ye,"linkCreatedDataEditors");function Xe(o,t){const e=o.options.filter(i=>i.required).map(i=>i.name);if(o.name==="createImputedData"){const i=t.match(/\bmethod\s*:\s*["'](constant|forward|backward|linear|mean)["']/)?.[1];i&&i!=="mean"&&e.push("method"),e.push(...Te[i]??[])}return D(e)}p(Xe,"requiredOptionNames");function Fe(o,t){const{provider:e,coverage:i}=o,n=re(e,i);if(e.kind==="runtime")return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:[],signature:e.signature,route:e.route},call:e.call};const r=A.get(e.name),a=new Map(r.options.filter(d=>n.has(d.name)).map(d=>[d.name,n.get(d.name)]));return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:Xe(r,ue(e,a)),signature:r.signature,route:r.route},call:ue(e,a)}}p(Fe,"planEntry");function Ue(o){const t=new Set(o.filter(i=>i.plan.kind==="runtime").map(i=>i.plan.name));return[`import { ${["chart",...ge.filter(i=>t.has(i))].join(", ")} } from "ggaction";`,...Object.entries(se).filter(([i])=>t.has(i)).map(([i,n])=>`import { ${i} } from "${n.entry}";`)]}p(Ue,"authoringImports");function Ze(o){const t=o.filter(e=>se[e.plan.name]);return o.map(e=>{if(e.plan.kind==="action"||["hconcat","vconcat"].includes(e.plan.name))return`program = ${e.call}`;if(e.plan.name==="render")return e.call;const i=se[e.plan.name];if(!i)throw new Error(`Unknown authoring runtime ${e.plan.name}.`);return`const ${t.length===1?"output":`${i.output}Output`} = ${e.call}`})}p(Ze,"authoringSteps");function Je(o){const t=new Set(o.map(e=>e.plan.name).filter(e=>de.includes(e)));return{imports:Ue(o),initialize:"let program = chart()",prerequisites:de.filter(e=>!t.has(e)).map(e=>{const i=A.get(e);return{id:`action.${e}`,signature:i.signature,call:e==="createCanvas"?"program = program.createCanvas({ width: 800, height: 600, margin: { top: 140, right: 220, bottom: 120, left: 260 } })":"program = program.createData({ values })",bindings:e==="createData"?["values"]:[]}}),steps:Ze(o)}}p(Je,"authoringBlock");function B(o){return JSON.stringify(o)}p(B,"codeString");function Ke(o,t){if(!o||t.size===0)return o;const e=o.lastIndexOf("})"),i=o.indexOf("({");if(i===-1||e===-1||e<i)throw new Error(`Cannot apply requested options to exact call: ${o}`);let n=o.slice(i+2,e).trim();for(const[r,a]of t){const d=new RegExp(`(^|,\\s*)${r}\\s*:\\s*(?:"[^"]*"|'[^']*'|-?[0-9]+(?:\\.[0-9]+)?|true|false)(?=\\s*,|$)`);d.test(n)?n=n.replace(d,(w,h)=>`${h}${r}: ${a}`):n=`${n}${n.length===0?"":", "}${r}: ${a}`}return`${o.slice(0,i+2)}${n}${o.slice(e)}`}p(Ke,"mergeExactCallOptions");function Pe(o,t){if(o.provider.exactCall)return{...o,provider:{...o.provider,exactCall:Ke(o.provider.exactCall,t),exactOptionNames:D([...o.provider.exactOptionNames??[],...t.keys()])}};const e=Object.fromEntries(Object.entries(o.provider.optionsByConstraint??{}).map(([n,r])=>[n,Object.fromEntries(Object.entries(r).filter(([a])=>!t.has(a)))])),i=S(o,Object.fromEntries(t));return{...i,provider:{...i.provider,optionsByConstraint:e}}}p(Pe,"entryWithRequestedOptions");const $e="70";function W(o,...t){return t.map(e=>o?.[e]).find(e=>e!==void 0)?.trim()}p(W,"requestedText");const ce=new Set(["and","as","at","axes","axis","coordinate","coordinates","encoding","field","for","is","legend","on","option","options","palette","scale","then","to","using","with","without","no","not"]);function Qe(o,t){const e=o.match(new RegExp(`\\b${t}(?:(?:\\s+(?:field|encoding|by|is))|\\s*[:=]|\\s+)\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);return e[3]!==void 0&&ce.has(i.toLowerCase())?void 0:{value:i,source:e[0]}}p(Qe,"fieldRequest");function et(o,t){const e=o.match(new RegExp(`\\b${t}(?:\\s+(?:by|field|encoding))?\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);if(!(e[3]!==void 0&&ce.has(i.toLowerCase())))return{value:i,source:e[0]}}p(et,"appearanceFieldRequest");function tt(o,t){const e=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=t.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),n=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=o.match(new RegExp(`\\b(?:${e}|${n})\\b\\s*(?:=|:|\\bis\\b|\\bto\\b)\\s*[^,;]+`,"i"));if(r)return r[0].trim();if(t!==i)return o.match(new RegExp(`\\b${e}\\b`,"i"))?.[0]}p(tt,"explicitOptionMention");function ot(o,t){let e=o;const i=[],n=[],r=[],a=p((c,l,m)=>{const g=e.find(P=>c.includes(P.provider.name));if(!g||l.size===0)return!1;e=e.map(P=>P===g?Pe(P,l):P);for(const[P,z]of l)i.push({owner:g.provider.name,option:P,value:z,source:m});return!0},"apply"),d=p((c,l,m)=>{n.push(c),r.push(k(l,m))},"rejectRequirement"),w=p(c=>{const l=e.filter(g=>c.includes(g.provider.name)),m=e.filter(g=>g.provider.kind==="action"&&A.get(g.provider.name)?.domain==="charts");return l.length===1&&m.length===1?l[0]:void 0},"singleFacade"),h=p((c,l,m)=>{let g=e.find(P=>P.provider.name===c);if(!g){const P=A.get(c);g={provider:{id:`request.${c}`,kind:"action",name:c,order:pe(P),anchors:[],covers:[],baseOptions:Object.fromEntries(l)},coverage:[]};const z=e.findIndex(Q=>Q.provider.kind==="runtime");e=[...e],e.splice(z<0?e.length:z,0,g)}a([c],l,m)},"addEditor"),$=[...t.matchAll(/\b(red|blue|green|orange|purple|black|white|yellow|pink|gray|grey)\s+(?:points|markers)\b/gi)];if($.length){const c=D($.map(m=>m[1].toLowerCase())),l=w(["createScatterPlot","createPolarScatterPlot"]);if(c.length===1&&l)for(const m of $)a([l.provider.name],new Map([["point",`{ fill: ${B(c[0])} }`]]),m[0]);else for(const m of $)d(m[0],"request.pointColor","Point color requires one unambiguous point chart and one requested color.")}const u=["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap"],v=[...t.matchAll(/\b(?:rotate|tilt)\s+(?:the\s+)?([xy])[ -]+axis\s+labels?\s+(?:by|to)\s+(-?\d+(?:\.\d+)?)\s*(degrees?|radians?)\b/gi)];for(const c of v){const l=c[1].toUpperCase(),m=Number(c[2]),g=c[3].toLowerCase().startsWith("degree")?"degrees":"radians",P=v.filter(z=>z[1].toUpperCase()===l);w(u)&&Number.isFinite(m)&&D(P.map(z=>`${z[2]}:${z[3]}`)).length===1?h(`edit${l}AxisLabels`,new Map([["rotation",`{ value: ${m}, unit: "${g}" }`]]),c[0]):d(c[0],`request.${l.toLowerCase()}AxisRotation`,"Axis label rotation requires one Cartesian chart and an unambiguous angle with units.")}for(const c of t.matchAll(/\b(?:logarithmic|log)\s+([xy])\s+(?:axis|scale)\b/gi))w(u)?h(`edit${c[1].toUpperCase()}Scale`,new Map([["type",'"log"']]),c[0]):d(c[0],"request.logScale","A logarithmic scale requires one unambiguous Cartesian chart and compatible nonzero data.");const M=t.match(/\b(?:(one|two|three|four|five|six|seven|eight|nine|ten|\d+)\s+bands?|bands?\s*(?:of|=|:)?\s*(one|two|three|four|five|six|seven|eight|nine|ten|\d+))\b/i);if(M){const c=W(M,1,2),l=Number({one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10}[c.toLowerCase()]??c);Number.isInteger(l)&&l>0?a(["createHorizonPlot","encodeHorizon","editHorizon"],new Map([["bands",String(l)]]),M[0]):(n.push(M[0]),r.push(k("request.option.horizon.bands","Horizon bands must be a positive integer.")))}const G=/\b(?:legend|encoding key)\b/i.test(t),X=e.some(c=>c.provider.id.startsWith("exact.")&&/Legend/.test(c.provider.name)),E=e.some(c=>c.provider.name==="facet"),q=new Set(["encoding.color","encoding.opacity","encoding.shape","encoding.size","encoding.strokeDash","encoding.strokeWidth"]),H=e.some(c=>["createPiePlot","createRosePlot","createRadialBarPlot"].includes(c.provider.name)||c.coverage.some(l=>q.has(l)));if(G&&!H&&!X&&!E){const c=D(e.flatMap(l=>l.coverage).filter(l=>l==="guide.legend"||l.startsWith("layout.legend.")));e=e.map(l=>({...l,coverage:l.coverage.filter(m=>m!=="guide.legend"&&!m.startsWith("layout.legend."))})).filter(l=>l.coverage.length>0||l.provider.id.startsWith("exact.")),n.push("legend channel");for(const l of c)r.push(k(l,"A legend requires a concrete compatible encoding channel such as color, shape, size, opacity, stroke dash, or stroke width."))}const L=t.match(/\blegend\s+(?:at|on)\s+(top|bottom|left|right)\b/i),y=G?t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i):void 0,I=G?void 0:t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i),V=G?t.match(/\b(?:(horizontal|vertical)(?:\s+direction)?\s+legend|legend(?:\s+direction)?\s*(?:=|:|is)?\s*(horizontal|vertical)|direction\s*(?:=|:|is)?\s*(horizontal|vertical)|legend\b[^,;]{0,60}\b(horizontal|vertical)|(horizontal|vertical)\s+direction)\b/i):void 0,f=new Map;if(L&&f.set("position",B(L[1].toLowerCase())),y){const c=Number(W(y,1,2));Number.isInteger(c)&&c>0?f.set("columns",String(c)):(n.push(y[0]),r.push(k("request.option.legend.columns","Legend columns must be a positive integer.")))}if(V&&f.set("direction",B(W(V,1,2,3,4,5).toLowerCase())),L?.[1].toLowerCase()==="bottom"&&f.set("offset",$e),I&&(n.push(I[0]),r.push(k("request.option.columns","A column count requires a concrete owner such as a legend or composition layout."))),f.size>0&&(H||X||E)){const c=[L?.[0],y?.[0],V?.[0]].filter(Boolean).join(", ");if(!a(["editLegendLayout","createLegend"],f,c)){const l=[...f].map(([m,g])=>`${m}: ${g}`).join(", ");a([...ve],new Map([["guides",`{ legend: { ${l} } }`]]),c)}}const O=t.match(/\b(\d+)\s+x[ -]?bins?\b/i),j=t.match(/\b(\d+)\s+y[ -]?bins?\b/i),J=t.match(/\b(\d+)\s+(?:bins?|bins? per axis)\b/i),N=new Map,F=[];if(O||j)if(O&&j){const c=Number(O[1]),l=Number(j[1]);if(c>0&&l>0)N.set("bins",`{ x: ${c}, y: ${l} }`),F.push(O[0],j[0]);else{const m=`${O[0]}; ${j[0]}`;n.push(m),r.push(k("request.option.bin2d.bins","Two-dimensional x and y bin counts must be positive integers."))}}else{const c=O?"y":"x",l=(O??j)[0];n.push(l),r.push(k(`transform.bin2d.bins.${c}`,`Two-dimensional bin counts require both x and y; the request specifies only ${l}.`))}else if(J){const c=Number(J[1]);Number.isInteger(c)&&c>0?(N.set("bins",String(c)),F.push(J[0])):(n.push(J[0]),r.push(k("request.option.bin2d.bins","Two-dimensional bin counts must be positive integers.")))}const K=t.match(/\b(include|exclude|omit)\s+empty\s+(?:bins|cells)\b/i);if(K&&(N.set("includeEmpty",String(K[1].toLowerCase()==="include")),F.push(K[0])),N.size>0){const c=F.join("; ");if(!a(["createBin2DData","editBin2DData"],N,c)){const l=[...N].map(([z,Q])=>`${z}: ${Q}`).join(", "),m=a(["createHeatmap"],new Map([["bin",`{ ${l} }`]]),c),g=N.get("bins"),P=!m&&g!==void 0&&/^\d+$/.test(g)&&!N.has("includeEmpty")&&a(["createHistogram"],new Map([["maxBins",g]]),c);!m&&!P&&(n.push(c),r.push(k("request.option.bin2d","Two-dimensional bin options require a heatmap or a create/edit Bin2D data action.")))}}const _=t.match(/\b(?:titled\b|(?:chart\s+)?title\b(?:\s+(?:is|text))?)\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|subtitle|on\s+|as\s+)|$)/i),Y=W(_,1,2,3);Y&&!ce.has(Y.toLowerCase())&&a(["createTitle","editTitle"],new Map([["text",B(Y)]]),_[0]);const ie=t.match(/\bsubtitle(?:\s+(?:is|text))?\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|title|on\s+|as\s+)|$)/i),ee=W(ie,1,2,3);ee&&!ce.has(ee.toLowerCase())&&a(["createTitle","editTitle"],new Map([["subtitle",B(ee)]]),ie[0]);const s=t.match(/\bfont[ -]?size\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(s){const c=Number(s[1]);c>0&&a(["createTitle","editTitle"],new Map([["titleStyle",`{ fontSize: ${s[1]} }`]]),s[0])||(n.push(s[0]),r.push(k("request.option.fontSize",c>0?"A font size requires a concrete text owner such as a chart title, axis, legend, or text mark.":"Font size must be a positive finite number.")))}const x=Object.freeze({x:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"],y:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"]}),b=new Set;for(const c of["x","y"]){const l=Qe(t,c);if(!l||/^(?:bins?|axis|encoding|field)$/i.test(l.value))continue;(a(x[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c.toUpperCase()}`],new Map([["field",B(l.value)]]),l.source))&&b.add(c)}const C=t.match(/\b(?:plot|chart)\s+of\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))\s+(?:vs\.?|versus|against)\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))/i);if(C&&b.size===0){const c=W(C,1,2,3),l=W(C,4,5,6);for(const[m,g]of[["x",l],["y",c]])a(x[m],new Map([[m,B(g)]]),C[0])||a([`encode${m.toUpperCase()}`],new Map([["field",B(g)]]),C[0])}const R=Object.freeze({color:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createViolinPlot","createPiePlot","createRosePlot","createRadialBarPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot"],size:["createScatterPlot","createPolarScatterPlot"],shape:["createScatterPlot","createPolarScatterPlot"]});for(const c of["color","size","shape"]){const l=et(t,c);if(!l)continue;a(R[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c[0].toUpperCase()}${c.slice(1)}`],new Map([["field",B(l.value)]]),l.source)}const ae=e.find(c=>c.provider.name==="renderToSVG");if(ae){const c=t.match(/\bsvg\s+title\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),l=t.match(/\bdescription\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),m=new Map;if(c&&m.set("title",B(W(c,1,2))),l&&m.set("description",B(W(l,1,2))),m.size>0){const g=[...m].map(([P,z])=>`${P}: ${z}`).join(", ");e=e.map(P=>P===ae?{...P,provider:{...P.provider,call:`renderToSVG(program, { ${g} })`}}:P);for(const[P,z]of m)i.push({owner:"renderToSVG",option:P,value:z,source:P==="title"?c[0]:l[0]})}}const U=t.match(/\bpixel[ -]?ratio\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(U){const c=Number(U[1]),l=e.find(m=>["render","renderToPNG"].includes(m.provider.name));if(l&&c>0){const m=l.provider.name==="render"?`render(program, context, { pixelRatio: ${U[1]} })`:l.provider.call.replace(/\s*}\)$/,`, pixelRatio: ${U[1]} })`);e=e.map(g=>g===l?{...g,provider:{...g.provider,call:m}}:g),i.push({owner:l.provider.name,option:"pixelRatio",value:U[1],source:U[0]})}else n.push(U[0]),r.push(k("renderer.pixelRatio",c>0?"pixelRatio applies only to Browser Canvas or PNG output; choose one of those renderers or remove the requirement.":"pixelRatio must be a positive finite number."))}else if(/\b(?:high[ -]?dpi|retina)\b/i.test(t)){const c=t.match(/\b(?:high[ -]?dpi|retina)\b/i)[0];n.push(c),r.push(k("renderer.pixelRatio","High-density raster or Canvas output requires an explicit positive pixelRatio."))}/\bresponsive\b/i.test(t)&&(n.push("responsive"),r.push(k("layout.responsive","Responsive charts require host resize observation and immutable program rebuilding; no container size was supplied."))),/\b(?:accessible|accessibility|aria)\b/i.test(t)&&(i.some(l=>l.owner==="renderToSVG"&&l.option==="title")&&i.some(l=>l.owner==="renderToSVG"&&l.option==="description")||(n.push("accessible output"),r.push(k(ae?"renderer.svg.accessibleText":"output.accessibility",ae?"Accessible SVG output requires concrete title and description strings.":"Accessibility requires an output-specific accessible name, description, and host fallback strategy."))));const Se=new Set(i.map(c=>`${c.owner}.${Z(c.option)}`)),Oe=Z(t);for(const c of e.filter(l=>l.provider.kind==="action")){const l=A.get(c.provider.name),m=re(c.provider,c.coverage);for(const g of l?.options??[]){const P=Z(g.name);if(P.length<3||!le(Oe,P).length||Se.has(`${c.provider.name}.${P}`)||m.has(g.name)||g.name==="stroke"&&/\b(?:stroke[ -]?dash|dashed?\s+stroke)\b/i.test(t)||g.name==="bins"&&r.some(Ce=>Ce.constraint.startsWith("transform.bin2d.bins.")))continue;const z=tt(t,g.name);if(!z)continue;const Q=`${c.provider.name}.${g.name}: ${z}`;n.includes(Q)||(n.push(Q),r.push(k(`request.option.${c.provider.name}.${g.name}`,`The request mentions ${g.name}, but its value could not be parsed safely for ${c.provider.name}.`)))}}return{entries:e,appliedOptions:i,unmatchedRequirements:D(n),unresolved:r}}p(ot,"applyRequestedOptions");function nt(o,t=[]){const e=new Map,i=p((r,a,d,w)=>{const h=`${a}:${r}`,$=e.get(h)??{name:r,kind:a,required:!0,usedBy:[],reason:w};$.usedBy=D([...$.usedBy,d]),e.set(h,$)},"add"),n=o.find(r=>r.plan.name==="createData");(!n||/\bvalues\s*:\s*values\b/.test(n.call))&&i("values","binding","createData","Supply the caller-owned dataset rows before running the authoring block.");for(const r of o){r.plan.name==="render"&&i("context","runtime","render","Supply a CanvasRenderingContext2D from the host page."),["hconcat","vconcat"].includes(r.plan.name)&&i("programs","program",r.plan.name,"Replace the repeated sample program with two complete child ChartPrograms.");const a=r.call.matchAll(/\b(?:field|x|y|theta|radius|color|size|shape|groupBy|weight):\s*"(x|y|value|category|label|angle|distance|date|a|b|series)"/g);for(const d of a)i(d[1],"field",r.plan.name,"Replace this template name unless the input dataset declares the same field.");if(r.call.includes('"Chart title"')&&i("Chart title","text",r.plan.name,"Replace the sample title with user-approved chart text."),r.plan.id.startsWith("exact.")){const d=A.get(r.plan.name);for(const w of d?.resources.prerequisites??[])i(w,"resource",r.plan.name,"Provide or create this action-card prerequisite before applying the exact call.")}}for(const r of t){if(!new Set(["color","field","groupBy","shape","size","weight","x","y","theta","radius"]).has(r.option))continue;let a;try{a=JSON.parse(r.value)}catch{continue}typeof a!="string"||a.length===0||i(a,"field",r.owner,"Confirm that this request-supplied field exists in the caller-owned dataset.")}return[...e.values()]}p(nt,"placeholderBindings");function rt(o){let t=!1,e=new Set;const i=p(()=>t&&e.has("encodeX")&&e.has("encodeY")&&!e.has("encodeX2")&&!e.has("encodeY2"),"incomplete");for(const n of o){if(n.provider.id.startsWith("exact."))continue;const r=n.provider.name;if(r.startsWith("create")&&(r.endsWith("Mark")||r.endsWith("Plot"))){if(i())return!0;t=r==="createRuleMark",e=new Set;continue}t&&["encodeX","encodeY","encodeX2","encodeY2"].includes(r)&&e.add(r)}return i()}p(rt,"hasIncompleteRulePrimaryPair");function it(o){return o.filter(e=>e.provider.name==="createScale"&&!e.provider.id.startsWith("exact.")).filter(e=>{const i=e.provider.baseOptions?.id;if(i===void 0)return!1;const n=`id: ${i}`;return!o.some(r=>r!==e&&[...re(r.provider,r.coverage).values()].some(a=>a.includes(n)))}).map(e=>e.provider.baseOptions.id.replaceAll('"',""))}p(it,"unconsumedScaleIds");function at(o){const t=new Set(o.filter(d=>!d.provider.id.startsWith("exact.")).map(d=>d.provider.name)),e=[],i=[],n=new Set(o.flatMap(d=>d.coverage)),a=[...t].filter(d=>d.startsWith("create")&&(d.endsWith("Mark")||d.endsWith("Plot"))).length>0||[...t].some(d=>["createHistogram","createHeatmap","createParallelCoordinates"].includes(d));["selectMarks","filterMarks","highlightMarks","facet"].some(d=>t.has(d))&&!a&&e.push(k("chart.type","Selection and faceting require one explicit chart or mark owner before those actions can be addressed.")),["hconcat","vconcat"].some(d=>t.has(d))&&!a&&e.push(k("composition.children","Composition requires at least two complete child ChartPrograms; name or provide the child charts first.")),t.has("layoutLabels")&&t.has("createTextMark")&&!t.has("encodeX")&&!t.has("encodeY")&&e.push(k("encoding.position","Collision-aware labels require a positioned source layer or explicit x and y encodings.")),t.has("createLegend")&&!["encodeColor","encodeSize","encodeShape","encodeOpacity","encodeStrokeDash","encodeStrokeWidth"].some(d=>t.has(d))&&e.push(k("guide.legend.channel","A legend requires an explicit compatible visual encoding such as color, size, shape, opacity, dash, or width.")),rt(o)&&e.push(k("encoding.rule.endpoint","A rule with both x and y primary positions also requires x2 or y2; otherwise choose one primary position for a full-span rule."));for(const d of it(o))e.push(k("scale.consumer",`Scale "${d}" is not connected to a compatible encoding; choose the channel that should consume it.`));return(t.has("createAreaMark")||t.has("createAreaPlot"))&&t.has("encodeStrokeDash")&&i.push({constraint:"unsupported.areaStrokeDash",reason:"Field-driven stroke dash is not supported for area marks; use a line or rule mark for dash encoding."}),{unresolved:e,unsupported:i}}p(at,"runtimeClosureDecisions");function k(o,t){const e=ye[o]??(o.startsWith("layout.legend.")?"ggaction://docs/legend-layout":"ggaction://docs/action-reference");return{constraint:o,reason:t,resources:[e]}}p(k,"unresolvedDecision");function st(o,t){const e=[],i=["chart.pie","chart.donut"].some(a=>o.has(a)&&!t.has(a)),n=o.has("chart.horizon")&&!t.has("chart.horizon"),r=o.has("chart.density")&&!t.has("chart.density");for(const a of o){let d;i&&["encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid"].includes(a)&&(d="A pie has categorical sectors and a color legend. Cartesian positions, axes, and grids require a different chart or an explicit lower-level recipe."),n&&(a==="guide.yAxis"||a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Horizon's y scale and palette describe internal folded bands. Choose an explicit lower-level guide or a separate original-amplitude guide; the facade only creates original-x guides."),r&&(a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Density color requires an explicit groupBy field and matching color field. Its derived data does not retain arbitrary raw categories; choose that grouping before requesting a color legend."),d&&(t.add(a),e.push(k(a,d)))}return e}p(st,"completeChartBoundaries");function ct(o,t,e,i){const n=p(u=>u.normalize("NFKC").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").trim().replace(/\s+/g," "),"normalizeWords"),r=` ${n(o)} `,a=new Uint8Array(r.length),d=[...i.appliedOptions.map(u=>u.source),...i.unmatchedRequirements,...i.unresolved.some(u=>["renderer.svg.accessibleText","output.accessibility"].includes(u.constraint))||["title","description"].every(u=>i.appliedOptions.some(v=>v.owner==="renderToSVG"&&v.option===u))?["accessible","accessibility"]:[],...i.entries.some(u=>u.provider.name==="facet"&&/legend:\s*"shared"/.test(re(u.provider,u.coverage).get("guides")??""))?["shared legend"]:[],...t.flatMap(u=>u.phrases),...e].map(n).filter(Boolean).sort((u,v)=>v.length-u.length);for(const u of d){const v=` ${u} `;let M=r.indexOf(v);for(;M!==-1;)a.fill(1,M,M+v.length),M=r.indexOf(v,M+1)}const w=r.split("").map((u,v)=>a[v]?" ":u).join(""),h=new Set("a an the and then with using use as at on in to of for by from create draw make build show add apply set please chart plot output export render i want would like me can you it this that is be should must into also put charts".split(" "));return w.trim().split(/\s+/).filter(u=>u&&!h.has(u)).length===0?[]:o.trim().match(/[\s\S]{1,176}/g)??[]}p(ct,"unconsumedRequirements");function dt(o,t,e){const i=[],n=[...t].filter(r=>!r.startsWith("renderer.")&&!r.startsWith("unsupported."));return/\b(chart|plot)\b/.test(o)&&n.length===0&&![...t].some(r=>r.startsWith("unsupported."))&&e.length===0&&i.push(k("chart.type","A chart or mark type is required; for example scatter plot, line chart, bar chart, or tick mark.")),/\b(render|export|output)\b/.test(o)&&![...t].some(r=>r.startsWith("renderer."))&&i.push(k("renderer.format","A supported output format is required: Browser Canvas, SVG, PNG, or PDF.")),i}p(dt,"genericUnresolved");function ke(){if(te.schemaVersion!==3||T.schemaVersion!==2)throw new Error("Compact action cards must use schemaVersion 3 and the intent taxonomy must use schemaVersion 2.");if(T.packageVersion!==te.packageVersion)throw new Error("Compact action cards and the intent taxonomy must use one packageVersion.");if(oe.size!==T.constraints.length)throw new Error("Intent constraint IDs must be unique.");if(new Set(T.providers.map(n=>n.id)).size!==T.providers.length)throw new Error("Intent provider IDs must be unique.");const t=new Set;for(const n of T.constraints)for(const r of n.shadows??[])if(!oe.has(r)||r===n.id)throw new Error(`${n.id} shadows invalid constraint ${r}.`);for(const n of T.providers){for(const r of[...n.anchors,...n.covers])if(!oe.has(r))throw new Error(`${n.id} references unknown constraint ${r}.`);if(n.anchors.some(r=>!n.covers.includes(r)))throw new Error(`${n.id} does not cover every anchor.`);for(const r of n.anchors)t.add(r);if(n.kind==="action"){const r=A.get(n.name);if(!r)throw new Error(`${n.id} references unknown action ${n.name}.`);const a=new Set(r.options.map(w=>w.name)),d=[n.baseOptions??{},...Object.values(n.optionsByConstraint??{})];for(const w of d)for(const[h,$]of Object.entries(w)){if(!a.has(h))throw new Error(`${n.id} references undeclared option ${h}.`);if(typeof $!="string"||$.length===0)throw new Error(`${n.id}.${h} must be a JavaScript expression string.`)}}else{if(n.kind!=="runtime"||typeof n.signature!="string"||typeof n.call!="string"||!n.route.startsWith("/reference/"))throw new Error(`${n.id} has an invalid runtime contract.`);if(!ge.includes(n.name)&&se[n.name]===void 0)throw new Error(`${n.id} lacks an authoring runtime mapping.`)}}const e=T.constraints.filter(n=>n.unsupported===void 0&&!t.has(n.id));if(e.length>0)throw new Error(`Supported constraints lack providers: ${e.map(n=>n.id).join(", ")}.`);const i=T.constraints.filter(n=>n.unsupported!==void 0!==n.id.startsWith("unsupported.")||n.unsupported!==void 0&&t.has(n.id));if(i.length>0)throw new Error(`Terminal constraints must use unsupported.* IDs without providers: ${i.map(n=>n.id).join(", ")}.`);for(const n of de)if(!A.has(n))throw new Error(`Missing authoring prerequisite action card: ${n}.`);return{cards:A.size,constraints:oe.size,providers:T.providers.length,supported:T.constraints.filter(n=>n.unsupported===void 0).length,unsupported:T.constraints.filter(n=>n.unsupported!==void 0).length}}p(ke,"validateResolverKnowledge");function mt(o){if(typeof o!="string"||o.trim().length===0)throw new TypeError("searchGgaction query must be a non-empty string.");if(o.length>500)throw new RangeError("searchGgaction query must be at most 500 characters.");ke();const t=Ae(o),e=t?"":o,i=Z(e),n=De(e),{matched:r,positions:a}=Ee(i);for(const f of n){const[O]=le(i,Z(f));O&&a.set(`action.${f}`,O.start)}const d=new Set([...r.map(f=>f.id),...n.map(f=>`action.${f}`)]),w=r.filter(f=>f.unsupported!==void 0).map(f=>({constraint:f.id,reason:f.unsupported})),h=t?[k("request.negation","Negation or exclusion requires explicit interpretation. No authoring steps are proposed; preserve the restriction when choosing action options.")]:[],{blocked:$,unresolved:u}=Ne(r);h.push(...u),h.push(...st(d,$));const v=new Set([...d].filter(f=>{const O=oe.get(f);return!$.has(f)&&(O===void 0||O.unsupported===void 0)})),M=We(v,n),{selected:G,uncovered:X}=je(v,M);for(const f of X)h.push(k(f,"No current action or runtime operation covers this recognized constraint."));h.push(...dt(i,d,n)),d.size===0&&h.length===0&&h.push(k("query.intent","No current ggaction constraint was recognized; use an exact action name or a supported chart task."));let E=He(_e(G).sort((f,O)=>f.provider.order-O.provider.order||xe(f,a)-xe(O,a)||f.provider.id.localeCompare(O.provider.id)));const q=ot(Ye(E),e);E=q.entries,h.push(...q.unresolved);const H=t?[]:ct(e,r,n,q);H.length>0&&(q.unmatchedRequirements.push(...H),h.push(k("request.unconsumed","Part of the original request was not interpreted. Review unmatchedRequirements before claiming the requested chart is complete.")));const L=at(E);w.push(...L.unsupported),h.push(...L.unresolved),L.unsupported.some(f=>f.constraint==="unsupported.areaStrokeDash")&&(E=E.filter(f=>f.provider.name!=="encodeStrokeDash"));const y=E.map((f,O)=>Fe(f,O+1)),I={schemaVersion:5,packageVersion:te.packageVersion,query:o.trim(),matchedConstraints:[...d],actionPlan:y.map(f=>f.plan),exactCalls:y.map(f=>f.call),appliedOptions:q.appliedOptions,placeholderBindings:nt(y,q.appliedOptions),unmatchedRequirements:t?o.trim().length<=180?[o.trim()]:o.trim().match(/[\s\S]{1,176}/g).map((f,O)=>`${O+1}. ${f}`):q.unmatchedRequirements,authoring:Je(y),unsupported:w,unresolved:D(h.map(f=>JSON.stringify(f))).map(JSON.parse),candidates:y.slice(0,3).map(f=>({id:f.plan.id,kind:f.plan.kind,name:f.plan.name,route:f.plan.route}))},V=Buffer.byteLength(JSON.stringify(I),"utf8");if(V>6144)throw new qe(V);return I}p(mt,"searchGgaction");function gt(o){return Buffer.byteLength(JSON.stringify(o),"utf8")}p(gt,"taskPacketBytes"),ke();export{qe as TaskPacketBudgetError,mt as searchGgaction,gt as taskPacketBytes,ke as validateResolverKnowledge};
|
|
1
|
+
var ze=Object.defineProperty;var p=(o,t)=>ze(o,"name",{value:t,configurable:!0});import{IMPUTE_REQUIRED_OPTIONS as Me}from"../src/core/optionRequirements.js";import{readFileSync as fe}from"node:fs";import he from"node:path";import{fileURLToPath as Te}from"node:url";const me=Te(new URL("../",import.meta.url)),te=JSON.parse(fe(he.join(me,"knowledge/action-cards.json"),"utf8")),M=JSON.parse(fe(he.join(me,"knowledge/intent-taxonomy.json"),"utf8")),A=new Map(te.cards.map(o=>[o.name,o])),oe=new Map(M.constraints.map(o=>[o.id,o])),ge=Object.freeze(["hconcat","vconcat","render"]),se=Object.freeze({renderToSVG:Object.freeze({entry:"ggaction/svg",output:"svg"}),renderToPNG:Object.freeze({entry:"ggaction/png",output:"png"}),renderToPDF:Object.freeze({entry:"ggaction/pdf",output:"pdf"})}),de=Object.freeze(["createCanvas","createData"]),Re=Object.freeze({width:"800",height:"600",margin:"{ top: 140, right: 220, bottom: 120, left: 260 }"}),ve=new Set(["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createBoxPlot","createGradientPlot","createViolinPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot","createRugPlot","createStripPlot"]),Be=new Set(["createAxes","createXAxis","createYAxis","createGrid","createLegend","createGuides"]),ye=Object.freeze({"chart.type":"ggaction://docs/choose-chart-type","renderer.format":"ggaction://docs/choose-renderer","layout.responsive":"ggaction://docs/responsive-layout","output.accessibility":"ggaction://docs/accessibility","renderer.svg.accessibleText":"ggaction://docs/accessibility","renderer.pixelRatio":"ggaction://docs/responsive-layout","query.intent":"ggaction://docs/getting-started"});class qe extends Error{static{p(this,"TaskPacketBudgetError")}constructor(t){super(`Compact task packet is ${t} bytes; the hard ceiling is 6144 bytes.`),this.name="TaskPacketBudgetError",this.bytes=t}}function D(o){return[...new Set(o)]}p(D,"unique");function Z(o){return o.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}p(Z,"normalize");const be=/\b(?:no|not|without|exclude|excluding|omit|omitting|avoid|avoiding|don['’]t|doesn['’]t|isn['’]t|aren['’]t|never|neither|nor)\b/i;function Ae(o){let t=o.normalize("NFKC").replace(/(^|[\s=:(,])("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g,(e,i,n)=>i+" ".repeat(n.length));for(const e of M.constraints)for(const i of e.phrases.filter(n=>be.test(n))){const n=Z(i).split(" ").join("\\s+");t=t.replace(new RegExp(`\\b${n}\\b`,"gi")," ")}return be.test(t)}p(Ae,"hasUnresolvedNegation");function le(o,t){const e=Z(t),i=` ${o} `,n=` ${e} `,r=[];let a=0;for(;a<i.length;){const d=i.indexOf(n,a);if(d===-1)break;r.push({start:d+1,end:d+n.length-1}),a=d+1}return r}p(le,"phraseOccurrences");function De(o){return te.cards.filter(t=>new RegExp(`(?:^|[^A-Za-z0-9])${t.name}(?:$|[^A-Za-z0-9])`,"i").test(o)).map(t=>t.name)}p(De,"exactActionNames");function Ee(o){const t=M.constraints.flatMap(r=>r.phrases.flatMap(a=>le(o,a).map(d=>({constraint:r,...d})))),e=t.filter(r=>!t.some(a=>a.constraint.shadows?.includes(r.constraint.id)&&a.start<=r.start&&a.end>=r.end)),i=M.constraints.filter(r=>e.some(a=>a.constraint.id===r.id)),n=new Map(i.map(r=>[r.id,Math.min(...e.filter(a=>a.constraint.id===r.id).map(a=>a.start))]));return{matched:i,positions:n}}p(Ee,"semanticMatchResult");function pe(o){return o.name==="createCanvas"?10:o.name==="createData"?20:o.name.endsWith("Data")?30:o.domain==="charts"||o.domain==="marks"&&o.name.startsWith("create")?40:o.domain==="encodings"?/^encode(X|Y|X2|Y2|XRange|YRange|Theta|R|Radius|ParallelCoordinates)/.test(o.name)?50:o.name==="encodeGroup"||o.name==="encodePathOrder"?52:55:o.domain==="statistics"?60:["axes","grid","legend_and_title"].includes(o.domain)?70:o.domain==="mark-selection"?75:o.domain==="composition"||/^(layout|jitter|order|replace)/.test(o.name)?80:65}p(pe,"orderForCard");function Le(o,t){const e=A.get(o),i=M.providers.filter(n=>n.kind==="action"&&n.name===o).map(n=>({provider:n,coverage:n.covers.filter(r=>t.has(r)).length})).filter(n=>n.coverage>0).sort((n,r)=>r.coverage-n.coverage||n.provider.order-r.provider.order||n.provider.id.localeCompare(r.provider.id))[0]?.provider;return i?{...i,id:`exact.${o}`,anchors:[`action.${o}`],covers:D([`action.${o}`,...i.covers.filter(n=>t.has(n))])}:{id:`exact.${o}`,kind:"action",name:o,order:pe(e),anchors:[`action.${o}`],covers:[`action.${o}`],exactCall:e.snippet,exactOptionNames:e.options.filter(n=>new RegExp(`\\b${n.name}\\s*:`).test(e.snippet)).map(n=>n.name)}}p(Le,"exactProvider");function Ne(o){const t=new Map;for(const n of o){if(!n.exclusiveGroup)continue;const r=t.get(n.exclusiveGroup)??[];r.push(n),t.set(n.exclusiveGroup,r)}const e=new Set,i=[];for(const[n,r]of t)if(!(r.length<2)){for(const a of r)e.add(a.id);for(const a of r)i.push({constraint:a.id,reason:`This conflicts within ${n}: ${r.map(d=>d.id).join(", ")}.`,resources:[n==="legend.position"?"ggaction://docs/legend-layout":"ggaction://docs/choose-chart-type"]})}return{blocked:e,unresolved:i}}p(Ne,"conflictResult");function We(o,t){const e=M.providers.filter(i=>i.anchors.some(n=>o.has(n)));for(const i of t)e.push(Le(i,o));return e}p(We,"candidateProviders");function je(o,t){const e=new Set(o),i=[];for(;e.size>0;){const n=t.filter(a=>!i.some(d=>d.provider.id===a.id)).map(a=>({provider:a,coverage:a.covers.filter(d=>e.has(d))})).filter(a=>a.coverage.length>0).sort((a,d)=>d.coverage.length-a.coverage.length||a.provider.order-d.provider.order||a.provider.id.localeCompare(d.provider.id));if(n.length===0)break;const r=n[0];i.push(r);for(const a of r.coverage)e.delete(a)}return{selected:i,uncovered:e}}p(je,"selectProviders");function _e(o){let t=o;o.some(a=>a.provider.name==="selectMarks")&&(t=t.map(a=>a.provider.name!=="highlightMarks"?a:{...a,provider:{...a.provider,baseOptions:{selection:'"selection-1"',color:'"#f28e2b"'}}}));const i=t.some(a=>a.provider.name==="createRegression"&&!a.provider.id.startsWith("exact.")),n=t.some(a=>["createPointMark","createScatterPlot","createPolarScatterPlot"].includes(a.provider.name));i&&!n&&(t=[ne("createPointMark",{}),...t]);const r=t.find(a=>a.provider.name==="editLegendLayout"&&a.coverage.some(d=>d.startsWith("layout.legend.")));if(r){const a=t.find(d=>d.coverage.includes("guide.legend")&&(d.provider.name==="createLegend"||d.provider.optionsByConstraint?.["guide.legend"]?.guides!==void 0));if(a){const d=r.provider.baseOptions?.position;if(d===void 0)throw new Error(`${r.provider.id} lacks a legend position.`);const w=r.coverage.filter(h=>h.startsWith("layout.legend."));t=t.filter(h=>h!==r).map(h=>{if(h!==a)return h;const $=d==='"left"'?"96":d==='"bottom"'?$e:void 0;return{provider:h.provider.name==="createLegend"?{...h.provider,baseOptions:{...h.provider.baseOptions??{},position:d,...$===void 0?{}:{offset:$}}}:{...h.provider,optionsByConstraint:{...h.provider.optionsByConstraint??{},"guide.legend":{...h.provider.optionsByConstraint?.["guide.legend"]??{},guides:`{ legend: { position: ${d}${$===void 0?"":`, offset: ${$}`} } }`}}},coverage:[...h.coverage,...w]}})}}return t}p(_e,"adaptProviderDependencies");function S(o,t){return{...o,provider:{...o.provider,baseOptions:{...o.provider.baseOptions??{},...t}}}}p(S,"withBaseOptions");function ne(o,t,e=[]){const i=A.get(o);if(!i)throw new Error(`Unknown runtime dependency action ${o}.`);return{provider:{id:`action.${o}`,kind:"action",name:o,order:pe(i),anchors:[],covers:[],baseOptions:t},coverage:e}}p(ne,"dependencyEntry");function Ge(o){const t=o.find(n=>!n.provider.id.startsWith("exact.")&&ve.has(n.provider.name));if(!t)return o;const e=o.filter(n=>!n.provider.id.startsWith("exact.")&&Be.has(n.provider.name));if(e.length===0)return o;const i=e.flatMap(n=>n.coverage);return o.filter(n=>!e.includes(n)).map(n=>n===t?{...n,coverage:D([...n.coverage,...i])}:n)}p(Ge,"absorbFacadeGuides");function we(o,t,e){const i=o.indexOf(t);return i===-1?o:[...o.slice(0,i),...e,...o.slice(i+1)]}p(we,"replaceEntry");function Ie(o){const t=p(v=>o.find(T=>T.provider.name===v&&!T.provider.id.startsWith("exact.")),"semantic"),e=t("createPointMark"),i=t("createTextMark"),n=t("encodeText"),r=new Set(["encodeX","encodeY","encodeColor","encodeSize","encodeShape","encodeAngle","encodeOpacity"]),a=o.filter(v=>!v.provider.id.startsWith("exact.")&&r.has(v.provider.name));if(!e||!i||!n||!a.some(v=>v.provider.name==="encodeX")||!a.some(v=>v.provider.name==="encodeY"))return o;const d=[e,...a,i,n],w=new Set(d),h=Math.min(...d.map(v=>o.indexOf(v))),$=o.slice(0,h).filter(v=>!w.has(v)).length,u=o.filter(v=>!w.has(v));return[...u.slice(0,$),...d,...u.slice($)]}p(Ie,"orderInheritedTextOverlay");function Ve(o){const t=o.find(u=>u.provider.name==="createBarMark"&&!u.provider.id.startsWith("exact."));if(!t)return o;const e=o.indexOf(t),i=o.findIndex((u,v)=>v>e&&!u.provider.id.startsWith("exact.")&&u.provider.name.startsWith("create")&&(u.provider.name.endsWith("Mark")||u.provider.name.endsWith("Plot"))),n=i===-1?o.length:i,r=o.slice(e+1,n).filter(u=>["encodeX","encodeY"].includes(u.provider.name)&&!u.provider.id.startsWith("exact.")),a=r.find(u=>['"nominal"','"ordinal"','"temporal"'].includes(u.provider.baseOptions?.fieldType)),d=r.find(u=>u.provider.baseOptions?.fieldType==='"quantitative"');if(!a||!d||o.indexOf(a)<o.indexOf(d))return o;const w=[...o],h=w.indexOf(a),$=w.indexOf(d);return w[$]=a,w[h]=d,w}p(Ve,"orderBarCategoryBeforeMeasure");function He(o){let t=Ge(o);const e=p(s=>t.find(x=>x.provider.name===s&&!x.provider.id.startsWith("exact.")),"semantic"),i=p(s=>t.find(x=>x.coverage.includes(s)),"chartOwner"),n=p((s,{before:x=[],after:b=[]})=>{if(!s)return;const C=t.indexOf(s);t=[...t.slice(0,C),...x,s,...b,...t.slice(C+1)]},"expandChartOwner"),r=p((s,x)=>{const b=t.find(C=>C.provider.name===s&&!C.provider.id.startsWith("exact."));return b?(t=t.filter(C=>C!==b),S(b,x)):ne(s,x)},"chartDependency"),a=p((s,x)=>{const b=i(s);b&&n(b,x())},"expandChartConstraint");a("chart.bar.horizontal",()=>({after:[r("encodeY",{field:'"category"',fieldType:'"nominal"'}),r("encodeX",{field:'"value"',fieldType:'"quantitative"'})]})),a("chart.radar",()=>({}));const d=e("createData");d&&(t=t.map(s=>s===d?S(s,{values:"values"}):s));const w=e("createCanvas");w&&(t=t.map(s=>s===w?S(s,Re):s));const h=e("createScatterPlot");h&&(t=t.map(s=>s===h?S(s,{x:'{ field: "x", fieldType: "quantitative" }',y:'{ field: "y", fieldType: "quantitative" }'}):s));const $=e("createLinePlot"),u=e("encodeOpacity");$&&u&&(t=t.filter(s=>s!==u).map(s=>s===$?{...S(s,{line:"{ opacity: 0.8 }"}),coverage:D([...s.coverage,...u.coverage])}:s));const v=e("createBarPlot");if(v){const s=e("createScale")?.provider.id==="action.createColorScale",x='{ field: "category", scale: { id: "color-scale" } }';t=t.map(b=>{if(b!==v)return b;const C=S(b,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }',...s?{color:x}:{}});return s?{...C,provider:{...C.provider,optionsByConstraint:{...C.provider.optionsByConstraint??{},"encoding.color":{color:x}}}}:C})}const T=e("createTimeUnitData"),G=e("createBarPlot");T&&G&&(t=t.map(s=>s===G?S(s,{data:'"monthly"',x:'{ field: "month", fieldType: "ordinal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const X=e("createBoxPlot");X&&(t=t.map(s=>s===X?S(s,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const E=e("createWindowData"),q=e("createLinePlot");if(E&&q){const s=e("createScale")?.provider.id==="action.createTimeScale";t=t.map(x=>x===q?S(x,{data:'"windowed"',x:s?'{ field: "date", fieldType: "temporal", scale: { id: "scale-1" } }':'{ field: "x", fieldType: "quantitative" }',y:'{ field: "movingMean", fieldType: "quantitative" }'}):x)}const H=e("createIntervalData"),L=e("createBoxPlot"),y=e("createErrorBar");H&&L&&y&&(t=t.map(s=>s===H?S(s,{source:'"data"',groupBy:'"category"'}):s===L?S(s,{data:'"data"',x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s===y?S(s,{data:'"interval"',x:'{ field: "category", fieldType: "nominal", scale: { id: "errorBarX" } }',y:'{ center: "__interval_center", lower: "__interval_lower", upper: "__interval_upper", scale: { id: "errorBarY" } }'}):s));const I=e("createDensityData"),V=e("createViolinPlot");I&&V&&(t=t.filter(s=>s!==I).map(s=>s===V?{...S(s,{data:'"data"',...s.coverage.includes("guide.legend")?{color:'"category"'}:{}}),coverage:D([...s.coverage,...I.coverage])}:s));const f=e("createGradientPlot"),O=e("createScale")?.provider.id==="action.createLogScale"?e("createScale"):void 0;f&&(t=t.map(s=>s===f?S(s,{data:'"data"',x:`{ field: "value", fieldType: "quantitative"${O?', scale: { id: "scale-1" }':""} }`,y:'{ field: "category", fieldType: "nominal" }'}):s));const j=e("encodeDensity"),J=e("createAreaMark");if(j&&!J){const s=ne("createAreaMark",{id:'"densityArea"'}),x=t.indexOf(j);t=[...t.slice(0,x),s,...t.slice(x)].map(b=>b===j?S(b,{target:'"densityArea"'}):b)}const N=e("createBin2DData"),F=e("createRectMark");if(N&&F){t=t.map(R=>R===N?S(R,{source:'"data"'}):R===F?S(R,{id:'"rect"',data:'"bins"'}):R.provider.id==="action.createColorScale"?S(R,{type:'"sequential"',range:'{ palette: "viridis" }'}):R);const s=e("encodeX"),x=e("encodeY");s&&(t=we(t,s,[S(s,{field:'"__bins_x0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeX2",{field:'"__bins_x1"',fieldType:'"quantitative"',target:'"rect"'})])),x&&(t=we(t,x,[S(x,{field:'"__bins_y0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeY2",{field:'"__bins_y1"',fieldType:'"quantitative"',target:'"rect"'})]));const b=e("encodeColor");b&&(t=t.map(R=>R===b?S(R,{field:'"__bins_count"',fieldType:'"quantitative"',target:'"rect"',scale:'{ id: "color-scale" }'}):R));const C=e("createLegend");C&&(t=t.map(R=>R===C?S(R,{target:'"rect"',channels:'["color"]'}):R))}let K,_,Y;const ie=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"scatterPlot",createLinePlot:"linePlot",createPolarScatterPlot:"polarScatterPlot",createPolarLinePlot:"polarLinePlot",createRadarPlot:"radarPlot",createRugPlot:"rugPlot",createStripPlot:"stripPlot",createAreaPlot:"areaPlot",createBarPlot:"barPlot",createBoxPlot:"boxPlot",createGradientPlot:"gradientPlot",createViolinPlot:"violinPlot",createPiePlot:"piePlot",createRosePlot:"rosePlot",createRadialBarPlot:"radialBarPlot",createDensityPlot:"densityPlot",createHorizonPlot:"horizonPlot"}),ee=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"point",createLinePlot:"line",createPolarScatterPlot:"point",createPolarLinePlot:"line",createRadarPlot:"line",createRugPlot:"tick",createStripPlot:"point",createAreaPlot:"area",createBarPlot:"bar",createBoxPlot:"bar",createGradientPlot:"rect",createViolinPlot:"area",createPiePlot:"arc",createRosePlot:"arc",createRadialBarPlot:"arc",createDensityPlot:"area",createHorizonPlot:"area"});return t=t.map(s=>{if(s.provider.id.startsWith("exact."))return s;if(s.provider.name==="createScale")return Y=s.provider.id==="action.createColorScale"?void 0:s.provider.baseOptions?.id,s;const x=ie[s.provider.name];if(x!==void 0)return K=s.provider.baseOptions?.id?.replaceAll('"',"")??x,_=s.coverage.includes("chart.bar.horizontal")?"bar-horizontal":ee[s.provider.name],s;if(!K||s.provider.name==="createErrorBar")return s;const b={};return["area","rule","arc"].includes(_)&&["encodeX","encodeY","encodeR"].includes(s.provider.name)&&(b.fieldType='"quantitative"'),s.provider.name==="encodeTheta"&&_==="arc"&&s.provider.baseOptions?.fieldType===void 0&&(b.fieldType='"ordinal"'),_==="bar"&&s.provider.name==="encodeX"&&(b.field='"category"',b.fieldType='"nominal"'),_==="bar"&&s.provider.name==="encodeY"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeX"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeY"&&(b.field='"category"',b.fieldType='"nominal"'),Y&&["encodeX","encodeY"].includes(s.provider.name)&&(b.scale=`{ id: ${Y} }`,Y=void 0),Object.keys(b).length===0?s:S(s,b)}),Ie(Ve(t))}p(He,"closeRuntimeDependencies");function xe(o,t){const e=o.coverage.map(i=>t.get(i)).filter(i=>i!==void 0);return e.length===0?Number.POSITIVE_INFINITY:Math.min(...e)}p(xe,"providerRequestPosition");function re(o,t){const e=new Map(Object.entries(o.baseOptions??{}));for(const i of t)for(const[n,r]of Object.entries(o.optionsByConstraint?.[i]??{})){const a=e.get(n);if(a!==void 0&&a!==r){if(n==="guides"&&(a==="{}"||r==="{}")){e.set(n,a==="{}"?r:a);continue}throw new Error(`${o.id} assigns conflicting values to option ${n}.`)}e.set(n,r)}return e}p(re,"mergeOptionValues");function ue(o,t){if(o.exactCall)return o.exactCall;if(A.get(o.name).options.length===0)return`program.${o.name}()`;const i=[...t].map(([n,r])=>`${n}: ${r}`).join(", ");return`program.${o.name}(${i.length===0?"{}":`{ ${i} }`})`}p(ue,"actionCall");function Ye(o){const t=new Map;return o.map(e=>{if(e.provider.kind!=="action")return e;const i=e.provider.name,n=ue(e.provider,re(e.provider,e.coverage));if(/^create.+Data$/.test(i)){const r=n.match(/\bid\s*:\s*"([A-Za-z0-9_-]+)"/)?.[1];r&&t.set(i,r)}if(/^edit.+Data$/.test(i)){const r=t.get(i.replace(/^edit/,"create"));if(r)return Pe(e,new Map([["target",B(r)]]))}return e})}p(Ye,"linkCreatedDataEditors");function Xe(o,t){const e=o.options.filter(i=>i.required).map(i=>i.name);if(["selectMarks","editMarkSelection","filterMarks"].includes(o.name)&&!/\brows\s*:/.test(t)&&e.push("op"),o.name==="createImputedData"){const i=t.match(/\bmethod\s*:\s*["'](constant|forward|backward|linear|mean)["']/)?.[1];i&&i!=="mean"&&e.push("method"),e.push(...Me[i]??[])}return D(e)}p(Xe,"requiredOptionNames");function Fe(o,t){const{provider:e,coverage:i}=o,n=re(e,i);if(e.kind==="runtime")return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:[],signature:e.signature,route:e.route},call:e.call};const r=A.get(e.name),a=new Map(r.options.filter(d=>n.has(d.name)).map(d=>[d.name,n.get(d.name)]));return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:Xe(r,ue(e,a)),signature:r.signature,route:r.route},call:ue(e,a)}}p(Fe,"planEntry");function Ue(o){const t=new Set(o.filter(i=>i.plan.kind==="runtime").map(i=>i.plan.name));return[`import { ${["chart",...ge.filter(i=>t.has(i))].join(", ")} } from "ggaction";`,...Object.entries(se).filter(([i])=>t.has(i)).map(([i,n])=>`import { ${i} } from "${n.entry}";`)]}p(Ue,"authoringImports");function Ze(o){const t=o.filter(e=>se[e.plan.name]);return o.map(e=>{if(e.plan.kind==="action"||["hconcat","vconcat"].includes(e.plan.name))return`program = ${e.call}`;if(e.plan.name==="render")return e.call;const i=se[e.plan.name];if(!i)throw new Error(`Unknown authoring runtime ${e.plan.name}.`);return`const ${t.length===1?"output":`${i.output}Output`} = ${e.call}`})}p(Ze,"authoringSteps");function Je(o){const t=new Set(o.map(e=>e.plan.name).filter(e=>de.includes(e)));return{imports:Ue(o),initialize:"let program = chart()",prerequisites:de.filter(e=>!t.has(e)).map(e=>{const i=A.get(e);return{id:`action.${e}`,signature:i.signature,call:e==="createCanvas"?"program = program.createCanvas({ width: 800, height: 600, margin: { top: 140, right: 220, bottom: 120, left: 260 } })":"program = program.createData({ values })",bindings:e==="createData"?["values"]:[]}}),steps:Ze(o)}}p(Je,"authoringBlock");function B(o){return JSON.stringify(o)}p(B,"codeString");function Ke(o,t){if(!o||t.size===0)return o;const e=o.lastIndexOf("})"),i=o.indexOf("({");if(i===-1||e===-1||e<i)throw new Error(`Cannot apply requested options to exact call: ${o}`);let n=o.slice(i+2,e).trim();for(const[r,a]of t){const d=new RegExp(`(^|,\\s*)${r}\\s*:\\s*(?:"[^"]*"|'[^']*'|-?[0-9]+(?:\\.[0-9]+)?|true|false)(?=\\s*,|$)`);d.test(n)?n=n.replace(d,(w,h)=>`${h}${r}: ${a}`):n=`${n}${n.length===0?"":", "}${r}: ${a}`}return`${o.slice(0,i+2)}${n}${o.slice(e)}`}p(Ke,"mergeExactCallOptions");function Pe(o,t){if(o.provider.exactCall)return{...o,provider:{...o.provider,exactCall:Ke(o.provider.exactCall,t),exactOptionNames:D([...o.provider.exactOptionNames??[],...t.keys()])}};const e=Object.fromEntries(Object.entries(o.provider.optionsByConstraint??{}).map(([n,r])=>[n,Object.fromEntries(Object.entries(r).filter(([a])=>!t.has(a)))])),i=S(o,Object.fromEntries(t));return{...i,provider:{...i.provider,optionsByConstraint:e}}}p(Pe,"entryWithRequestedOptions");const $e="70";function W(o,...t){return t.map(e=>o?.[e]).find(e=>e!==void 0)?.trim()}p(W,"requestedText");const ce=new Set(["and","as","at","axes","axis","coordinate","coordinates","encoding","field","for","is","legend","on","option","options","palette","scale","then","to","using","with","without","no","not"]);function Qe(o,t){const e=o.match(new RegExp(`\\b${t}(?:(?:\\s+(?:field|encoding|by|is))|\\s*[:=]|\\s+)\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);return e[3]!==void 0&&ce.has(i.toLowerCase())?void 0:{value:i,source:e[0]}}p(Qe,"fieldRequest");function et(o,t){const e=o.match(new RegExp(`\\b${t}(?:\\s+(?:by|field|encoding))?\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);if(!(e[3]!==void 0&&ce.has(i.toLowerCase())))return{value:i,source:e[0]}}p(et,"appearanceFieldRequest");function tt(o,t){const e=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=t.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),n=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=o.match(new RegExp(`\\b(?:${e}|${n})\\b\\s*(?:=|:|\\bis\\b|\\bto\\b)\\s*[^,;]+`,"i"));if(r)return r[0].trim();if(t!==i)return o.match(new RegExp(`\\b${e}\\b`,"i"))?.[0]}p(tt,"explicitOptionMention");function ot(o,t){let e=o;const i=[],n=[],r=[],a=p((c,l,m)=>{const g=e.find(P=>c.includes(P.provider.name));if(!g||l.size===0)return!1;e=e.map(P=>P===g?Pe(P,l):P);for(const[P,z]of l)i.push({owner:g.provider.name,option:P,value:z,source:m});return!0},"apply"),d=p((c,l,m)=>{n.push(c),r.push(k(l,m))},"rejectRequirement"),w=p(c=>{const l=e.filter(g=>c.includes(g.provider.name)),m=e.filter(g=>g.provider.kind==="action"&&A.get(g.provider.name)?.domain==="charts");return l.length===1&&m.length===1?l[0]:void 0},"singleFacade"),h=p((c,l,m)=>{let g=e.find(P=>P.provider.name===c);if(!g){const P=A.get(c);g={provider:{id:`request.${c}`,kind:"action",name:c,order:pe(P),anchors:[],covers:[],baseOptions:Object.fromEntries(l)},coverage:[]};const z=e.findIndex(Q=>Q.provider.kind==="runtime");e=[...e],e.splice(z<0?e.length:z,0,g)}a([c],l,m)},"addEditor"),$=[...t.matchAll(/\b(red|blue|green|orange|purple|black|white|yellow|pink|gray|grey)\s+(?:points|markers)\b/gi)];if($.length){const c=D($.map(m=>m[1].toLowerCase())),l=w(["createScatterPlot","createPolarScatterPlot"]);if(c.length===1&&l)for(const m of $)a([l.provider.name],new Map([["point",`{ fill: ${B(c[0])} }`]]),m[0]);else for(const m of $)d(m[0],"request.pointColor","Point color requires one unambiguous point chart and one requested color.")}const u=["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap"],v=[...t.matchAll(/\b(?:rotate|tilt)\s+(?:the\s+)?([xy])[ -]+axis\s+labels?\s+(?:by|to)\s+(-?\d+(?:\.\d+)?)\s*(degrees?|radians?)\b/gi)];for(const c of v){const l=c[1].toUpperCase(),m=Number(c[2]),g=c[3].toLowerCase().startsWith("degree")?"degrees":"radians",P=v.filter(z=>z[1].toUpperCase()===l);w(u)&&Number.isFinite(m)&&D(P.map(z=>`${z[2]}:${z[3]}`)).length===1?h(`edit${l}AxisLabels`,new Map([["rotation",`{ value: ${m}, unit: "${g}" }`]]),c[0]):d(c[0],`request.${l.toLowerCase()}AxisRotation`,"Axis label rotation requires one Cartesian chart and an unambiguous angle with units.")}for(const c of t.matchAll(/\b(?:logarithmic|log)\s+([xy])\s+(?:axis|scale)\b/gi))w(u)?h(`edit${c[1].toUpperCase()}Scale`,new Map([["type",'"log"']]),c[0]):d(c[0],"request.logScale","A logarithmic scale requires one unambiguous Cartesian chart and compatible nonzero data.");const T=t.match(/\b(?:(one|two|three|four|five|six|seven|eight|nine|ten|\d+)\s+bands?|bands?\s*(?:of|=|:)?\s*(one|two|three|four|five|six|seven|eight|nine|ten|\d+))\b/i);if(T){const c=W(T,1,2),l=Number({one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10}[c.toLowerCase()]??c);Number.isInteger(l)&&l>0?a(["createHorizonPlot","encodeHorizon","editHorizon"],new Map([["bands",String(l)]]),T[0]):(n.push(T[0]),r.push(k("request.option.horizon.bands","Horizon bands must be a positive integer.")))}const G=/\b(?:legend|encoding key)\b/i.test(t),X=e.some(c=>c.provider.id.startsWith("exact.")&&/Legend/.test(c.provider.name)),E=e.some(c=>c.provider.name==="facet"),q=new Set(["encoding.color","encoding.opacity","encoding.shape","encoding.size","encoding.strokeDash","encoding.strokeWidth"]),H=e.some(c=>["createPiePlot","createRosePlot","createRadialBarPlot"].includes(c.provider.name)||c.coverage.some(l=>q.has(l)));if(G&&!H&&!X&&!E){const c=D(e.flatMap(l=>l.coverage).filter(l=>l==="guide.legend"||l.startsWith("layout.legend.")));e=e.map(l=>({...l,coverage:l.coverage.filter(m=>m!=="guide.legend"&&!m.startsWith("layout.legend."))})).filter(l=>l.coverage.length>0||l.provider.id.startsWith("exact.")),n.push("legend channel");for(const l of c)r.push(k(l,"A legend requires a concrete compatible encoding channel such as color, shape, size, opacity, stroke dash, or stroke width."))}const L=t.match(/\blegend\s+(?:at|on)\s+(top|bottom|left|right)\b/i),y=G?t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i):void 0,I=G?void 0:t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i),V=G?t.match(/\b(?:(horizontal|vertical)(?:\s+direction)?\s+legend|legend(?:\s+direction)?\s*(?:=|:|is)?\s*(horizontal|vertical)|direction\s*(?:=|:|is)?\s*(horizontal|vertical)|legend\b[^,;]{0,60}\b(horizontal|vertical)|(horizontal|vertical)\s+direction)\b/i):void 0,f=new Map;if(L&&f.set("position",B(L[1].toLowerCase())),y){const c=Number(W(y,1,2));Number.isInteger(c)&&c>0?f.set("columns",String(c)):(n.push(y[0]),r.push(k("request.option.legend.columns","Legend columns must be a positive integer.")))}if(V&&f.set("direction",B(W(V,1,2,3,4,5).toLowerCase())),L?.[1].toLowerCase()==="bottom"&&f.set("offset",$e),I&&(n.push(I[0]),r.push(k("request.option.columns","A column count requires a concrete owner such as a legend or composition layout."))),f.size>0&&(H||X||E)){const c=[L?.[0],y?.[0],V?.[0]].filter(Boolean).join(", ");if(!a(["editLegendLayout","createLegend"],f,c)){const l=[...f].map(([m,g])=>`${m}: ${g}`).join(", ");a([...ve],new Map([["guides",`{ legend: { ${l} } }`]]),c)}}const O=t.match(/\b(\d+)\s+x[ -]?bins?\b/i),j=t.match(/\b(\d+)\s+y[ -]?bins?\b/i),J=t.match(/\b(\d+)\s+(?:bins?|bins? per axis)\b/i),N=new Map,F=[];if(O||j)if(O&&j){const c=Number(O[1]),l=Number(j[1]);if(c>0&&l>0)N.set("bins",`{ x: ${c}, y: ${l} }`),F.push(O[0],j[0]);else{const m=`${O[0]}; ${j[0]}`;n.push(m),r.push(k("request.option.bin2d.bins","Two-dimensional x and y bin counts must be positive integers."))}}else{const c=O?"y":"x",l=(O??j)[0];n.push(l),r.push(k(`transform.bin2d.bins.${c}`,`Two-dimensional bin counts require both x and y; the request specifies only ${l}.`))}else if(J){const c=Number(J[1]);Number.isInteger(c)&&c>0?(N.set("bins",String(c)),F.push(J[0])):(n.push(J[0]),r.push(k("request.option.bin2d.bins","Two-dimensional bin counts must be positive integers.")))}const K=t.match(/\b(include|exclude|omit)\s+empty\s+(?:bins|cells)\b/i);if(K&&(N.set("includeEmpty",String(K[1].toLowerCase()==="include")),F.push(K[0])),N.size>0){const c=F.join("; ");if(!a(["createBin2DData","editBin2DData"],N,c)){const l=[...N].map(([z,Q])=>`${z}: ${Q}`).join(", "),m=a(["createHeatmap"],new Map([["bin",`{ ${l} }`]]),c),g=N.get("bins"),P=!m&&g!==void 0&&/^\d+$/.test(g)&&!N.has("includeEmpty")&&a(["createHistogram"],new Map([["maxBins",g]]),c);!m&&!P&&(n.push(c),r.push(k("request.option.bin2d","Two-dimensional bin options require a heatmap or a create/edit Bin2D data action.")))}}const _=t.match(/\b(?:titled\b|(?:chart\s+)?title\b(?:\s+(?:is|text))?)\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|subtitle|on\s+|as\s+)|$)/i),Y=W(_,1,2,3);Y&&!ce.has(Y.toLowerCase())&&a(["createTitle","editTitle"],new Map([["text",B(Y)]]),_[0]);const ie=t.match(/\bsubtitle(?:\s+(?:is|text))?\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|title|on\s+|as\s+)|$)/i),ee=W(ie,1,2,3);ee&&!ce.has(ee.toLowerCase())&&a(["createTitle","editTitle"],new Map([["subtitle",B(ee)]]),ie[0]);const s=t.match(/\bfont[ -]?size\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(s){const c=Number(s[1]);c>0&&a(["createTitle","editTitle"],new Map([["titleStyle",`{ fontSize: ${s[1]} }`]]),s[0])||(n.push(s[0]),r.push(k("request.option.fontSize",c>0?"A font size requires a concrete text owner such as a chart title, axis, legend, or text mark.":"Font size must be a positive finite number.")))}const x=Object.freeze({x:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"],y:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"]}),b=new Set;for(const c of["x","y"]){const l=Qe(t,c);if(!l||/^(?:bins?|axis|encoding|field)$/i.test(l.value))continue;(a(x[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c.toUpperCase()}`],new Map([["field",B(l.value)]]),l.source))&&b.add(c)}const C=t.match(/\b(?:plot|chart)\s+of\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))\s+(?:vs\.?|versus|against)\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))/i);if(C&&b.size===0){const c=W(C,1,2,3),l=W(C,4,5,6);for(const[m,g]of[["x",l],["y",c]])a(x[m],new Map([[m,B(g)]]),C[0])||a([`encode${m.toUpperCase()}`],new Map([["field",B(g)]]),C[0])}const R=Object.freeze({color:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createViolinPlot","createPiePlot","createRosePlot","createRadialBarPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot"],size:["createScatterPlot","createPolarScatterPlot"],shape:["createScatterPlot","createPolarScatterPlot"]});for(const c of["color","size","shape"]){const l=et(t,c);if(!l)continue;a(R[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c[0].toUpperCase()}${c.slice(1)}`],new Map([["field",B(l.value)]]),l.source)}const ae=e.find(c=>c.provider.name==="renderToSVG");if(ae){const c=t.match(/\bsvg\s+title\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),l=t.match(/\bdescription\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),m=new Map;if(c&&m.set("title",B(W(c,1,2))),l&&m.set("description",B(W(l,1,2))),m.size>0){const g=[...m].map(([P,z])=>`${P}: ${z}`).join(", ");e=e.map(P=>P===ae?{...P,provider:{...P.provider,call:`renderToSVG(program, { ${g} })`}}:P);for(const[P,z]of m)i.push({owner:"renderToSVG",option:P,value:z,source:P==="title"?c[0]:l[0]})}}const U=t.match(/\bpixel[ -]?ratio\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(U){const c=Number(U[1]),l=e.find(m=>["render","renderToPNG"].includes(m.provider.name));if(l&&c>0){const m=l.provider.name==="render"?`render(program, context, { pixelRatio: ${U[1]} })`:l.provider.call.replace(/\s*}\)$/,`, pixelRatio: ${U[1]} })`);e=e.map(g=>g===l?{...g,provider:{...g.provider,call:m}}:g),i.push({owner:l.provider.name,option:"pixelRatio",value:U[1],source:U[0]})}else n.push(U[0]),r.push(k("renderer.pixelRatio",c>0?"pixelRatio applies only to Browser Canvas or PNG output; choose one of those renderers or remove the requirement.":"pixelRatio must be a positive finite number."))}else if(/\b(?:high[ -]?dpi|retina)\b/i.test(t)){const c=t.match(/\b(?:high[ -]?dpi|retina)\b/i)[0];n.push(c),r.push(k("renderer.pixelRatio","High-density raster or Canvas output requires an explicit positive pixelRatio."))}/\bresponsive\b/i.test(t)&&(n.push("responsive"),r.push(k("layout.responsive","Responsive charts require host resize observation and immutable program rebuilding; no container size was supplied."))),/\b(?:accessible|accessibility|aria)\b/i.test(t)&&(i.some(l=>l.owner==="renderToSVG"&&l.option==="title")&&i.some(l=>l.owner==="renderToSVG"&&l.option==="description")||(n.push("accessible output"),r.push(k(ae?"renderer.svg.accessibleText":"output.accessibility",ae?"Accessible SVG output requires concrete title and description strings.":"Accessibility requires an output-specific accessible name, description, and host fallback strategy."))));const Se=new Set(i.map(c=>`${c.owner}.${Z(c.option)}`)),Oe=Z(t);for(const c of e.filter(l=>l.provider.kind==="action")){const l=A.get(c.provider.name),m=re(c.provider,c.coverage);for(const g of l?.options??[]){const P=Z(g.name);if(P.length<3||!le(Oe,P).length||Se.has(`${c.provider.name}.${P}`)||m.has(g.name)||g.name==="stroke"&&/\b(?:stroke[ -]?dash|dashed?\s+stroke)\b/i.test(t)||g.name==="bins"&&r.some(Ce=>Ce.constraint.startsWith("transform.bin2d.bins.")))continue;const z=tt(t,g.name);if(!z)continue;const Q=`${c.provider.name}.${g.name}: ${z}`;n.includes(Q)||(n.push(Q),r.push(k(`request.option.${c.provider.name}.${g.name}`,`The request mentions ${g.name}, but its value could not be parsed safely for ${c.provider.name}.`)))}}return{entries:e,appliedOptions:i,unmatchedRequirements:D(n),unresolved:r}}p(ot,"applyRequestedOptions");function nt(o,t=[]){const e=new Map,i=p((r,a,d,w)=>{const h=`${a}:${r}`,$=e.get(h)??{name:r,kind:a,required:!0,usedBy:[],reason:w};$.usedBy=D([...$.usedBy,d]),e.set(h,$)},"add"),n=o.find(r=>r.plan.name==="createData");(!n||/\bvalues\s*:\s*values\b/.test(n.call))&&i("values","binding","createData","Supply the caller-owned dataset rows before running the authoring block.");for(const r of o){r.plan.name==="render"&&i("context","runtime","render","Supply a CanvasRenderingContext2D from the host page."),["hconcat","vconcat"].includes(r.plan.name)&&i("programs","program",r.plan.name,"Replace the repeated sample program with two complete child ChartPrograms.");const a=r.call.matchAll(/\b(?:field|x|y|theta|radius|color|size|shape|groupBy|weight):\s*"(x|y|value|category|label|angle|distance|date|a|b|series)"/g);for(const d of a)i(d[1],"field",r.plan.name,"Replace this template name unless the input dataset declares the same field.");if(r.call.includes('"Chart title"')&&i("Chart title","text",r.plan.name,"Replace the sample title with user-approved chart text."),r.plan.id.startsWith("exact.")){const d=A.get(r.plan.name);for(const w of d?.resources.prerequisites??[])i(w,"resource",r.plan.name,"Provide or create this action-card prerequisite before applying the exact call.")}}for(const r of t){if(!new Set(["color","field","groupBy","shape","size","weight","x","y","theta","radius"]).has(r.option))continue;let a;try{a=JSON.parse(r.value)}catch{continue}typeof a!="string"||a.length===0||i(a,"field",r.owner,"Confirm that this request-supplied field exists in the caller-owned dataset.")}return[...e.values()]}p(nt,"placeholderBindings");function rt(o){let t=!1,e=new Set;const i=p(()=>t&&e.has("encodeX")&&e.has("encodeY")&&!e.has("encodeX2")&&!e.has("encodeY2"),"incomplete");for(const n of o){if(n.provider.id.startsWith("exact."))continue;const r=n.provider.name;if(r.startsWith("create")&&(r.endsWith("Mark")||r.endsWith("Plot"))){if(i())return!0;t=r==="createRuleMark",e=new Set;continue}t&&["encodeX","encodeY","encodeX2","encodeY2"].includes(r)&&e.add(r)}return i()}p(rt,"hasIncompleteRulePrimaryPair");function it(o){return o.filter(e=>e.provider.name==="createScale"&&!e.provider.id.startsWith("exact.")).filter(e=>{const i=e.provider.baseOptions?.id;if(i===void 0)return!1;const n=`id: ${i}`;return!o.some(r=>r!==e&&[...re(r.provider,r.coverage).values()].some(a=>a.includes(n)))}).map(e=>e.provider.baseOptions.id.replaceAll('"',""))}p(it,"unconsumedScaleIds");function at(o){const t=new Set(o.filter(d=>!d.provider.id.startsWith("exact.")).map(d=>d.provider.name)),e=[],i=[],n=new Set(o.flatMap(d=>d.coverage)),a=[...t].filter(d=>d.startsWith("create")&&(d.endsWith("Mark")||d.endsWith("Plot"))).length>0||[...t].some(d=>["createHistogram","createHeatmap","createParallelCoordinates"].includes(d));["selectMarks","filterMarks","highlightMarks","facet"].some(d=>t.has(d))&&!a&&e.push(k("chart.type","Selection and faceting require one explicit chart or mark owner before those actions can be addressed.")),["hconcat","vconcat"].some(d=>t.has(d))&&!a&&e.push(k("composition.children","Composition requires at least two complete child ChartPrograms; name or provide the child charts first.")),t.has("layoutLabels")&&t.has("createTextMark")&&!t.has("encodeX")&&!t.has("encodeY")&&e.push(k("encoding.position","Collision-aware labels require a positioned source layer or explicit x and y encodings.")),t.has("createLegend")&&!["encodeColor","encodeSize","encodeShape","encodeOpacity","encodeStrokeDash","encodeStrokeWidth"].some(d=>t.has(d))&&e.push(k("guide.legend.channel","A legend requires an explicit compatible visual encoding such as color, size, shape, opacity, dash, or width.")),rt(o)&&e.push(k("encoding.rule.endpoint","A rule with both x and y primary positions also requires x2 or y2; otherwise choose one primary position for a full-span rule."));for(const d of it(o))e.push(k("scale.consumer",`Scale "${d}" is not connected to a compatible encoding; choose the channel that should consume it.`));return(t.has("createAreaMark")||t.has("createAreaPlot"))&&t.has("encodeStrokeDash")&&i.push({constraint:"unsupported.areaStrokeDash",reason:"Field-driven stroke dash is not supported for area marks; use a line or rule mark for dash encoding."}),{unresolved:e,unsupported:i}}p(at,"runtimeClosureDecisions");function k(o,t){const e=ye[o]??(o.startsWith("layout.legend.")?"ggaction://docs/legend-layout":"ggaction://docs/action-reference");return{constraint:o,reason:t,resources:[e]}}p(k,"unresolvedDecision");function st(o,t){const e=[],i=["chart.pie","chart.donut"].some(a=>o.has(a)&&!t.has(a)),n=o.has("chart.horizon")&&!t.has("chart.horizon"),r=o.has("chart.density")&&!t.has("chart.density");for(const a of o){let d;i&&["encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid"].includes(a)&&(d="A pie has categorical sectors and a color legend. Cartesian positions, axes, and grids require a different chart or an explicit lower-level recipe."),n&&(a==="guide.yAxis"||a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Horizon's y scale and palette describe internal folded bands. Choose an explicit lower-level guide or a separate original-amplitude guide; the facade only creates original-x guides."),r&&(a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Density color requires an explicit groupBy field and matching color field. Its derived data does not retain arbitrary raw categories; choose that grouping before requesting a color legend."),d&&(t.add(a),e.push(k(a,d)))}return e}p(st,"completeChartBoundaries");function ct(o,t,e,i){const n=p(u=>u.normalize("NFKC").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").trim().replace(/\s+/g," "),"normalizeWords"),r=` ${n(o)} `,a=new Uint8Array(r.length),d=[...i.appliedOptions.map(u=>u.source),...i.unmatchedRequirements,...i.unresolved.some(u=>["renderer.svg.accessibleText","output.accessibility"].includes(u.constraint))||["title","description"].every(u=>i.appliedOptions.some(v=>v.owner==="renderToSVG"&&v.option===u))?["accessible","accessibility"]:[],...i.entries.some(u=>u.provider.name==="facet"&&/legend:\s*"shared"/.test(re(u.provider,u.coverage).get("guides")??""))?["shared legend"]:[],...t.flatMap(u=>u.phrases),...e].map(n).filter(Boolean).sort((u,v)=>v.length-u.length);for(const u of d){const v=` ${u} `;let T=r.indexOf(v);for(;T!==-1;)a.fill(1,T,T+v.length),T=r.indexOf(v,T+1)}const w=r.split("").map((u,v)=>a[v]?" ":u).join(""),h=new Set("a an the and then with using use as at on in to of for by from create draw make build show add apply set please chart plot output export render i want would like me can you it this that is be should must into also put charts".split(" "));return w.trim().split(/\s+/).filter(u=>u&&!h.has(u)).length===0?[]:o.trim().match(/[\s\S]{1,176}/g)??[]}p(ct,"unconsumedRequirements");function dt(o,t,e){const i=[],n=[...t].filter(r=>!r.startsWith("renderer.")&&!r.startsWith("unsupported."));return/\b(chart|plot)\b/.test(o)&&n.length===0&&![...t].some(r=>r.startsWith("unsupported."))&&e.length===0&&i.push(k("chart.type","A chart or mark type is required; for example scatter plot, line chart, bar chart, or tick mark.")),/\b(render|export|output)\b/.test(o)&&![...t].some(r=>r.startsWith("renderer."))&&i.push(k("renderer.format","A supported output format is required: Browser Canvas, SVG, PNG, or PDF.")),i}p(dt,"genericUnresolved");function ke(){if(te.schemaVersion!==3||M.schemaVersion!==2)throw new Error("Compact action cards must use schemaVersion 3 and the intent taxonomy must use schemaVersion 2.");if(M.packageVersion!==te.packageVersion)throw new Error("Compact action cards and the intent taxonomy must use one packageVersion.");if(oe.size!==M.constraints.length)throw new Error("Intent constraint IDs must be unique.");if(new Set(M.providers.map(n=>n.id)).size!==M.providers.length)throw new Error("Intent provider IDs must be unique.");const t=new Set;for(const n of M.constraints)for(const r of n.shadows??[])if(!oe.has(r)||r===n.id)throw new Error(`${n.id} shadows invalid constraint ${r}.`);for(const n of M.providers){for(const r of[...n.anchors,...n.covers])if(!oe.has(r))throw new Error(`${n.id} references unknown constraint ${r}.`);if(n.anchors.some(r=>!n.covers.includes(r)))throw new Error(`${n.id} does not cover every anchor.`);for(const r of n.anchors)t.add(r);if(n.kind==="action"){const r=A.get(n.name);if(!r)throw new Error(`${n.id} references unknown action ${n.name}.`);const a=new Set(r.options.map(w=>w.name)),d=[n.baseOptions??{},...Object.values(n.optionsByConstraint??{})];for(const w of d)for(const[h,$]of Object.entries(w)){if(!a.has(h))throw new Error(`${n.id} references undeclared option ${h}.`);if(typeof $!="string"||$.length===0)throw new Error(`${n.id}.${h} must be a JavaScript expression string.`)}}else{if(n.kind!=="runtime"||typeof n.signature!="string"||typeof n.call!="string"||!n.route.startsWith("/reference/"))throw new Error(`${n.id} has an invalid runtime contract.`);if(!ge.includes(n.name)&&se[n.name]===void 0)throw new Error(`${n.id} lacks an authoring runtime mapping.`)}}const e=M.constraints.filter(n=>n.unsupported===void 0&&!t.has(n.id));if(e.length>0)throw new Error(`Supported constraints lack providers: ${e.map(n=>n.id).join(", ")}.`);const i=M.constraints.filter(n=>n.unsupported!==void 0!==n.id.startsWith("unsupported.")||n.unsupported!==void 0&&t.has(n.id));if(i.length>0)throw new Error(`Terminal constraints must use unsupported.* IDs without providers: ${i.map(n=>n.id).join(", ")}.`);for(const n of de)if(!A.has(n))throw new Error(`Missing authoring prerequisite action card: ${n}.`);return{cards:A.size,constraints:oe.size,providers:M.providers.length,supported:M.constraints.filter(n=>n.unsupported===void 0).length,unsupported:M.constraints.filter(n=>n.unsupported!==void 0).length}}p(ke,"validateResolverKnowledge");function mt(o){if(typeof o!="string"||o.trim().length===0)throw new TypeError("searchGgaction query must be a non-empty string.");if(o.length>500)throw new RangeError("searchGgaction query must be at most 500 characters.");ke();const t=Ae(o),e=t?"":o,i=Z(e),n=De(e),{matched:r,positions:a}=Ee(i);for(const f of n){const[O]=le(i,Z(f));O&&a.set(`action.${f}`,O.start)}const d=new Set([...r.map(f=>f.id),...n.map(f=>`action.${f}`)]),w=r.filter(f=>f.unsupported!==void 0).map(f=>({constraint:f.id,reason:f.unsupported})),h=t?[k("request.negation","Negation or exclusion requires explicit interpretation. No authoring steps are proposed; preserve the restriction when choosing action options.")]:[],{blocked:$,unresolved:u}=Ne(r);h.push(...u),h.push(...st(d,$));const v=new Set([...d].filter(f=>{const O=oe.get(f);return!$.has(f)&&(O===void 0||O.unsupported===void 0)})),T=We(v,n),{selected:G,uncovered:X}=je(v,T);for(const f of X)h.push(k(f,"No current action or runtime operation covers this recognized constraint."));h.push(...dt(i,d,n)),d.size===0&&h.length===0&&h.push(k("query.intent","No current ggaction constraint was recognized; use an exact action name or a supported chart task."));let E=He(_e(G).sort((f,O)=>f.provider.order-O.provider.order||xe(f,a)-xe(O,a)||f.provider.id.localeCompare(O.provider.id)));const q=ot(Ye(E),e);E=q.entries,h.push(...q.unresolved);const H=t?[]:ct(e,r,n,q);H.length>0&&(q.unmatchedRequirements.push(...H),h.push(k("request.unconsumed","Part of the original request was not interpreted. Review unmatchedRequirements before claiming the requested chart is complete.")));const L=at(E);w.push(...L.unsupported),h.push(...L.unresolved),L.unsupported.some(f=>f.constraint==="unsupported.areaStrokeDash")&&(E=E.filter(f=>f.provider.name!=="encodeStrokeDash"));const y=E.map((f,O)=>Fe(f,O+1)),I={schemaVersion:5,packageVersion:te.packageVersion,query:o.trim(),matchedConstraints:[...d],actionPlan:y.map(f=>f.plan),exactCalls:y.map(f=>f.call),appliedOptions:q.appliedOptions,placeholderBindings:nt(y,q.appliedOptions),unmatchedRequirements:t?o.trim().length<=180?[o.trim()]:o.trim().match(/[\s\S]{1,176}/g).map((f,O)=>`${O+1}. ${f}`):q.unmatchedRequirements,authoring:Je(y),unsupported:w,unresolved:D(h.map(f=>JSON.stringify(f))).map(JSON.parse),candidates:y.slice(0,3).map(f=>({id:f.plan.id,kind:f.plan.kind,name:f.plan.name,route:f.plan.route}))},V=Buffer.byteLength(JSON.stringify(I),"utf8");if(V>6144)throw new qe(V);return I}p(mt,"searchGgaction");function gt(o){return Buffer.byteLength(JSON.stringify(o),"utf8")}p(gt,"taskPacketBytes"),ke();export{qe as TaskPacketBudgetError,mt as searchGgaction,gt as taskPacketBytes,ke as validateResolverKnowledge};
|
package/package.json
CHANGED
package/src/accessibility.js
CHANGED
|
@@ -10,6 +10,7 @@ import { resolveMarkItems } from "./materialization/selection/policies/index.js"
|
|
|
10
10
|
import { channelMapFromRow } from "./materialization/selection/items/common.js";
|
|
11
11
|
import { deriveLineSeries, resolveLineBins } from "./grammar/lineSeries.js";
|
|
12
12
|
import { deriveAreaSeries, deriveCenteredAreaSeries, deriveDensityAreaSeries, layoutDensityAreaSeries } from "./grammar/areaSeries.js";
|
|
13
|
+
import { resolveOverlaySeries } from "./materialization/overlayItems.js";
|
|
13
14
|
import { findUpstreamTransform } from "./materialization/dataProvenance.js";
|
|
14
15
|
|
|
15
16
|
function unsupported(id, message) {
|
|
@@ -33,6 +34,7 @@ function pathRows(program, layer) {
|
|
|
33
34
|
scales: program.semanticSpec.scales,
|
|
34
35
|
...(x?.bin === undefined ? {} : { xBinBoundaries: resolveLineBins(rows, layer, requireSemanticScale(program, x.scale)).boundaries }),
|
|
35
36
|
xDomain: program.resolvedScales[x?.scale]?.domain,
|
|
37
|
+
yDomain: program.resolvedScales[layer.encoding.y?.scale]?.domain,
|
|
36
38
|
thetaDomain: program.resolvedScales[layer.encoding.theta?.scale]?.domain
|
|
37
39
|
});
|
|
38
40
|
} else {
|
|
@@ -65,6 +67,17 @@ function finalRows(program, layer) {
|
|
|
65
67
|
if (program.graphicSpec.objects[layer.id] === undefined) {
|
|
66
68
|
unsupported(layer.id, "the owner is not materialized");
|
|
67
69
|
}
|
|
70
|
+
if (layer.derivedBindings?.overlay) {
|
|
71
|
+
return resolveOverlaySeries(program, layer.derivedBindings.overlay).flatMap(group =>
|
|
72
|
+
group.points.map(point => ({
|
|
73
|
+
series: Object.fromEntries(["group", "color", "stroke"].flatMap(channel => {
|
|
74
|
+
const encoding = layer.encoding[channel];
|
|
75
|
+
return encoding?.field !== undefined && ["nominal", "ordinal"].includes(encoding.fieldType)
|
|
76
|
+
? [[encoding.field, point.fields[encoding.field]]] : [];
|
|
77
|
+
})),
|
|
78
|
+
values: { ...channelMapFromRow(point.fields, layer), x: point.channels.x, y: point.channels.y }
|
|
79
|
+
})));
|
|
80
|
+
}
|
|
68
81
|
if (["line", "area"].includes(layer.mark.type)) return pathRows(program, layer);
|
|
69
82
|
if (!["point", "bar", "arc", "rule", "tick", "rect"].includes(layer.mark.type)) {
|
|
70
83
|
unsupported(layer.id, `unsupported ${layer.mark.type} owner`);
|
|
@@ -52,6 +52,7 @@ function resolveCanvasState(properties, args, config = {}) {
|
|
|
52
52
|
width: properties.width, height: properties.height, background: properties.background,
|
|
53
53
|
...args,
|
|
54
54
|
margin: Object.hasOwn(args, "margin") ? normalizeMargin(args.margin, baseMargin) : baseMargin,
|
|
55
|
+
requestedMargin: Object.hasOwn(args, "margin") ? normalizeMargin(args.margin, config.requestedMargin ?? baseMargin) : config.requestedMargin ?? baseMargin,
|
|
55
56
|
plotBorder: normalizePlotBorder(Object.hasOwn(args, "plotBorder") ? args.plotBorder : (config.plotBorder ?? false)),
|
|
56
57
|
size: {
|
|
57
58
|
width: Object.hasOwn(args, "width") ? "explicit" : baseSize.width,
|
|
@@ -78,7 +79,7 @@ function applyCanvasState(program, args, state) {
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
return next._withCanvasConfig({ margin: state.margin, size: state.size,
|
|
81
|
-
...(state.plot === undefined ? {} : { plot: state.plot }),
|
|
82
|
+
...(state.plot === undefined ? {} : { plot: state.plot, requestedMargin: state.requestedMargin }),
|
|
82
83
|
...(state.plotBorder === false ? {} : { plotBorder: state.plotBorder }) });
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -11,13 +11,15 @@ import { findCanvasGraphic } from
|
|
|
11
11
|
"../../materialization/graphicHierarchy.js";
|
|
12
12
|
import { resolveConcreteGraphicBounds } from "../../grammar/schemas/graphicBounds.js";
|
|
13
13
|
import { textBoundsFitCanvas } from "../../core/textMetrics.js";
|
|
14
|
+
import { isOwned } from "../../core/immutable.js";
|
|
14
15
|
|
|
15
16
|
const OPTIONS = Object.freeze([
|
|
16
17
|
"padding",
|
|
17
18
|
"minPlotWidth",
|
|
18
19
|
"minPlotHeight",
|
|
19
20
|
"iterationLimit",
|
|
20
|
-
"overflow"
|
|
21
|
+
"overflow",
|
|
22
|
+
"align"
|
|
21
23
|
]);
|
|
22
24
|
const SIDES = Object.freeze(["top", "right", "bottom", "left"]);
|
|
23
25
|
const DEFAULTS = Object.freeze({
|
|
@@ -25,9 +27,11 @@ const DEFAULTS = Object.freeze({
|
|
|
25
27
|
minPlotWidth: 160,
|
|
26
28
|
minPlotHeight: 120,
|
|
27
29
|
iterationLimit: 32,
|
|
28
|
-
overflow: "error"
|
|
30
|
+
overflow: "error",
|
|
31
|
+
align: "preserve"
|
|
29
32
|
});
|
|
30
33
|
const UNITS_PER_PIXEL = 4;
|
|
34
|
+
const signatures = new WeakMap();
|
|
31
35
|
|
|
32
36
|
function normalizeOptions(args) {
|
|
33
37
|
validateOptionObject(args, OPTIONS, "fitCanvas", { allowEmpty: true });
|
|
@@ -44,9 +48,46 @@ function normalizeOptions(args) {
|
|
|
44
48
|
if (!["error", "report"].includes(policy.overflow)) {
|
|
45
49
|
throw new Error(`Unsupported fitCanvas overflow policy "${policy.overflow}".`);
|
|
46
50
|
}
|
|
51
|
+
if (!["preserve", "center"].includes(policy.align)) throw new Error('fitCanvas align must be "preserve" or "center".');
|
|
47
52
|
return policy;
|
|
48
53
|
}
|
|
49
54
|
|
|
55
|
+
// In exact-plot mode only the outer space is fitted. User-authored margins
|
|
56
|
+
// are a minimum; temporary guide reservations may be reclaimed. Their origin
|
|
57
|
+
// survives persistence and repeated centering, unlike the resolved margins.
|
|
58
|
+
function fitExactPlot(program, policy) {
|
|
59
|
+
const config = program.materializationConfigs.canvas, plot = resolveGraphicBounds(program);
|
|
60
|
+
const floor = config.requestedMargin ?? config.margin;
|
|
61
|
+
const bounds = [];
|
|
62
|
+
const collect = id => {
|
|
63
|
+
const object = program.graphicSpec.objects[id];
|
|
64
|
+
if (object.type === "canvas") { for (const child of object.children ?? []) collect(child); return; }
|
|
65
|
+
const b = resolveConcreteGraphicBounds(program.graphicSpec, id, program.materializationConfigs.textMetrics);
|
|
66
|
+
if (b) bounds.push(b);
|
|
67
|
+
};
|
|
68
|
+
for (const id of program.graphicSpec.order) collect(id);
|
|
69
|
+
const content = { left: Math.min(...bounds.map(b=>b.left),plot.x), right: Math.max(...bounds.map(b=>b.right),plot.x+plot.width),
|
|
70
|
+
top: Math.min(...bounds.map(b=>b.top),plot.y), bottom: Math.max(...bounds.map(b=>b.bottom),plot.y+plot.height) };
|
|
71
|
+
const required = { left: Math.max(0,plot.x-content.left)+policy.padding, right: Math.max(0,content.right-plot.x-plot.width)+policy.padding,
|
|
72
|
+
top: Math.max(0,plot.y-content.top)+policy.padding, bottom: Math.max(0,content.bottom-plot.y-plot.height)+policy.padding };
|
|
73
|
+
const margin = Object.fromEntries(SIDES.map(side=>[side,Math.max(floor[side],required[side])]));
|
|
74
|
+
if (policy.align === "center") for (const [first,second] of [["left","right"],["top","bottom"]]) {
|
|
75
|
+
const slack = margin[first]+margin[second]-required[first]-required[second];
|
|
76
|
+
margin[first]=required[first]+slack/2; margin[second]=required[second]+slack/2;
|
|
77
|
+
}
|
|
78
|
+
let next = sameMargin(margin, config.margin) ? program : program.editCanvas({ plot: config.plot, margin });
|
|
79
|
+
next = next._withCanvasConfig({ ...next.materializationConfigs.canvas, requestedMargin: floor });
|
|
80
|
+
const issues = [];
|
|
81
|
+
if (plot.width < policy.minPlotWidth) issues.push(`plot width ${plot.width} is smaller than minPlotWidth ${policy.minPlotWidth}`);
|
|
82
|
+
if (plot.height < policy.minPlotHeight) issues.push(`plot height ${plot.height} is smaller than minPlotHeight ${policy.minPlotHeight}`);
|
|
83
|
+
if (issues.length && policy.overflow === "error") throw new Error(`fitCanvas overflow: ${issues.join("; ")}.`);
|
|
84
|
+
return next._withMaterializationConfig(["fitting"], { policy, result: {
|
|
85
|
+
status: issues.length ? "overflow" : "fit", margin: next.materializationConfigs.canvas.margin,
|
|
86
|
+
plot: { width: plot.width, height: plot.height }, iterations: 1, issues,
|
|
87
|
+
signature: layoutSignature(next)
|
|
88
|
+
} });
|
|
89
|
+
}
|
|
90
|
+
|
|
50
91
|
function probe(program, margin) {
|
|
51
92
|
try {
|
|
52
93
|
const next = program.editCanvas({ margin });
|
|
@@ -161,18 +202,33 @@ function samePolicy(first, second) {
|
|
|
161
202
|
}
|
|
162
203
|
|
|
163
204
|
function layoutSignature(program) {
|
|
205
|
+
const graphicSpec = program.graphicSpec, configs = program.materializationConfigs;
|
|
206
|
+
const cached = signatures.get(graphicSpec);
|
|
207
|
+
if (cached && cached.canvas === configs.canvas && cached.guides === configs.guides && cached.title === configs.title) {
|
|
208
|
+
return cached.signature;
|
|
209
|
+
}
|
|
164
210
|
const source = JSON.stringify({
|
|
165
|
-
graphicSpec
|
|
166
|
-
canvas:
|
|
167
|
-
guides:
|
|
168
|
-
title:
|
|
211
|
+
graphicSpec,
|
|
212
|
+
canvas: configs.canvas,
|
|
213
|
+
guides: configs.guides,
|
|
214
|
+
title: configs.title
|
|
169
215
|
});
|
|
170
|
-
|
|
216
|
+
// Two independent 32-bit lanes avoid a BigInt allocation for every byte of
|
|
217
|
+
// a large facet/mark scene. This is an invalidation fingerprint, not a digest.
|
|
218
|
+
let first = 0x811c9dc5, second = 0x9e3779b9;
|
|
171
219
|
for (let index = 0; index < source.length; index += 1) {
|
|
172
|
-
|
|
173
|
-
|
|
220
|
+
const code = source.charCodeAt(index);
|
|
221
|
+
first = Math.imul(first ^ code, 0x01000193);
|
|
222
|
+
second = Math.imul(second ^ code, 0x85ebca6b);
|
|
174
223
|
}
|
|
175
|
-
|
|
224
|
+
const signature = [first, second].map(value => (value >>> 0).toString(16).padStart(8, "0")).join("");
|
|
225
|
+
// Fitting itself only adds its result metadata, leaving these four immutable
|
|
226
|
+
// inputs unchanged. Preserve the persisted signature while avoiding another
|
|
227
|
+
// full-scene serialization/hash on subsequent no-op fits.
|
|
228
|
+
if (isOwned(graphicSpec)) signatures.set(graphicSpec, {
|
|
229
|
+
canvas: configs.canvas, guides: configs.guides, title: configs.title, signature
|
|
230
|
+
});
|
|
231
|
+
return signature;
|
|
176
232
|
}
|
|
177
233
|
|
|
178
234
|
export const fitCanvas = /* @__PURE__ */ action(
|
|
@@ -187,14 +243,13 @@ export const fitCanvas = /* @__PURE__ */ action(
|
|
|
187
243
|
this.materializationConfigs.canvas?.margin === undefined) {
|
|
188
244
|
throw new Error("fitCanvas requires an existing Canvas.");
|
|
189
245
|
}
|
|
190
|
-
if (this.materializationConfigs.canvas.plot !== undefined) {
|
|
191
|
-
throw new Error("fitCanvas requires fixed outer dimensions; disable Canvas plot sizing first.");
|
|
192
|
-
}
|
|
193
246
|
const previous = this.materializationConfigs.fitting;
|
|
194
247
|
if (samePolicy(previous?.policy, policy) &&
|
|
195
248
|
previous?.result?.signature === layoutSignature(this)) {
|
|
196
249
|
return this;
|
|
197
250
|
}
|
|
251
|
+
if (this.materializationConfigs.canvas.plot !== undefined) return fitExactPlot(this, policy);
|
|
252
|
+
if (policy.align !== "preserve") throw new Error('fitCanvas align:center requires exact inner plot sizing.');
|
|
198
253
|
const sourceMargin = this.materializationConfigs.canvas.margin;
|
|
199
254
|
const fitted = fitMargins(this, policy);
|
|
200
255
|
let next = sameMargin(sourceMargin, fitted.margin)
|
|
@@ -6,7 +6,7 @@ import { resolveFacadeId, validateFacadeOptions } from "./shared.js";
|
|
|
6
6
|
|
|
7
7
|
const OPTIONS = Object.freeze([
|
|
8
8
|
"id", "data", "coordinate", "x", "y", "color", "size", "shape",
|
|
9
|
-
"point", "packing", "guides"
|
|
9
|
+
"point", "packing", "guides", "missing"
|
|
10
10
|
]);
|
|
11
11
|
const PACKING_OPTIONS = Object.freeze(["maxOffset", "padding", "key", "overflow"]);
|
|
12
12
|
|
|
@@ -47,6 +47,7 @@ export const createBeeswarmPlot = /* @__PURE__ */ action(
|
|
|
47
47
|
const packing = normalizePacking(args.packing, operation);
|
|
48
48
|
let next = this.createStripPlot({
|
|
49
49
|
id,
|
|
50
|
+
...(args.missing === undefined ? {} : { missing: args.missing }),
|
|
50
51
|
...(args.data === undefined ? {} : { data: args.data }),
|
|
51
52
|
...(args.coordinate === undefined ? {} : { coordinate: args.coordinate }),
|
|
52
53
|
x: ownerScale(args.x, `${id}X`, `${operation} x`),
|
|
@@ -6,6 +6,7 @@ import { normalizeGroupFields } from "../../grammar/pathSeries.js";
|
|
|
6
6
|
import { STROKE_STYLE_PROPERTIES } from "../../grammar/strokeStyle.js";
|
|
7
7
|
import {
|
|
8
8
|
applyFacadeGuides,
|
|
9
|
+
retainFacadeAxisPresence,
|
|
9
10
|
normalizeAppearance,
|
|
10
11
|
normalizeCategoricalColor,
|
|
11
12
|
normalizeGuides,
|
|
@@ -157,7 +158,7 @@ export const editECDFPlot = /* @__PURE__ */ action(
|
|
|
157
158
|
}
|
|
158
159
|
const owner = resolveConfiguredOwner(this, args.target, { config: "ecdfPlot", operation: "editECDFPlot", kind: "ECDF", article: "an" }, validateUserId);
|
|
159
160
|
const current = this.markConfigs[owner.id].ecdfPlot;
|
|
160
|
-
const revised = { ...current.options };
|
|
161
|
+
const revised = { ...current.options, guides: retainFacadeAxisPresence(this, owner, current.options.guides) };
|
|
161
162
|
for (const key of changes) {
|
|
162
163
|
if (key === "groupBy" && args[key] === false) {
|
|
163
164
|
delete revised.groupBy;
|