{"version":3,"sources":["../src/core/types.ts","../src/core/encoding-overrides.ts","../src/core/chart-transitions.ts","../src/core/pivot.ts","../src/core/encoding-actions.ts","../src/core/axis-detection.ts","../src/core/band-dodge.ts","../src/core/type-registry.ts","../src/core/semantic-types.ts","../src/core/decisions.ts","../src/core/field-semantics.ts","../src/core/resolve-semantics.ts","../src/core/filter-overflow.ts","../src/core/compute-layout.ts","../src/core/static-series.ts","../src/core/recommendation.ts","../src/core/chart-type-recommendation.ts","../src/core/aggregate.ts","../src/vegalite/templates/utils.ts","../src/vegalite/templates/scatter.ts","../src/vegalite/templates/connected-scatter.ts","../src/vegalite/templates/bar.ts","../src/vegalite/templates/line.ts","../src/vegalite/format.ts","../src/vegalite/templates/sparkline.ts","../src/vegalite/templates/bump.ts","../src/vegalite/templates/slope.ts","../src/vegalite/templates/area.ts","../src/vegalite/templates/range-area.ts","../src/vegalite/templates/pie.ts","../src/vegalite/templates/lollipop.ts","../src/vegalite/templates/density.ts","../src/vegalite/templates/violin.ts","../src/vegalite/templates/ecdf.ts","../src/vegalite/templates/jitter.ts","../src/vegalite/templates/candlestick.ts","../src/chart-types/waterfall.ts","../src/vegalite/templates/waterfall.ts","../src/chart-types/gantt.ts","../src/vegalite/templates/gantt.ts","../src/vegalite/templates/bullet.ts","../src/vegalite/templates/bar-table.ts","../src/vegalite/templates/radar.ts","../src/vegalite/templates/rose.ts","../src/chart-types/geo.ts","../src/vegalite/templates/map.ts","../src/vegalite/templates/kpi-card.ts","../src/vegalite/templates/index.ts","../src/vegalite/instantiate-spec.ts","../src/core/normalize-properties.ts","../src/vegalite/assemble.ts","../src/vegalite/recommendation.ts","../src/echarts/templates/utils.ts","../src/echarts/colormap.ts","../src/echarts/templates/rose.ts","../src/echarts/instantiate-spec.ts","../src/echarts/templates/scatter.ts","../src/echarts/templates/connected-scatter.ts","../src/echarts/templates/bar.ts","../src/echarts/templates/line.ts","../src/echarts/templates/slope.ts","../src/echarts/templates/area.ts","../src/echarts/templates/range-area.ts","../src/echarts/templates/pie.ts","../src/echarts/templates/heatmap.ts","../src/echarts/templates/histogram.ts","../src/echarts/templates/boxplot.ts","../src/echarts/templates/radar.ts","../src/echarts/templates/candlestick.ts","../src/echarts/templates/streamgraph.ts","../src/echarts/templates/gauge.ts","../src/echarts/templates/funnel.ts","../src/echarts/templates/treemap.ts","../src/echarts/templates/sunburst.ts","../src/echarts/templates/sankey.ts","../src/echarts/templates/lollipop.ts","../src/echarts/templates/jitter.ts","../src/echarts/templates/waterfall.ts","../src/echarts/templates/pyramid.ts","../src/echarts/templates/ranged-dot.ts","../src/echarts/templates/density.ts","../src/echarts/templates/ecdf.ts","../src/echarts/templates/calendar.ts","../src/chartjs/colormap.ts","../src/chartjs/templates/utils.ts","../src/echarts/templates/parallel.ts","../src/echarts/templates/graph.ts","../src/echarts/templates/tree.ts","../src/echarts/templates/gantt.ts","../src/echarts/templates/bullet.ts","../src/echarts/templates/index.ts","../src/echarts/facet.ts","../src/core/color-decisions.ts","../src/echarts/assemble.ts","../src/echarts/recommendation.ts","../src/chartjs/templates/scatter.ts","../src/chartjs/templates/connected-scatter.ts","../src/chartjs/templates/bubble.ts","../src/chartjs/templates/jitter.ts","../src/chartjs/templates/bar.ts","../src/chartjs/templates/combo.ts","../src/chartjs/templates/line.ts","../src/chartjs/templates/bump.ts","../src/chartjs/templates/slope.ts","../src/chartjs/templates/area.ts","../src/chartjs/templates/range-area.ts","../src/chartjs/templates/pie.ts","../src/chartjs/templates/doughnut.ts","../src/chartjs/templates/histogram.ts","../src/chartjs/templates/ecdf.ts","../src/chartjs/templates/radar.ts","../src/chartjs/templates/rose.ts","../src/chartjs/templates/gantt.ts","../src/chartjs/templates/waterfall.ts","../src/chartjs/templates/index.ts","../src/chartjs/instantiate-spec.ts","../src/chartjs/assemble.ts","../src/chartjs/recommendation.ts","../src/plotly/colormap.ts","../src/plotly/templates/utils.ts","../src/plotly/templates/bar.ts","../src/plotly/templates/line.ts","../src/plotly/templates/area.ts","../src/plotly/templates/scatter.ts","../src/plotly/templates/histogram.ts","../src/plotly/templates/pie.ts","../src/plotly/templates/radar.ts","../src/plotly/templates/rose.ts","../src/plotly/templates/boxplot.ts","../src/plotly/templates/violin.ts","../src/plotly/templates/density.ts","../src/plotly/templates/ecdf.ts","../src/plotly/templates/jitter.ts","../src/plotly/templates/connected-scatter.ts","../src/plotly/templates/range-area.ts","../src/plotly/templates/streamgraph.ts","../src/plotly/templates/slope.ts","../src/plotly/templates/bump.ts","../src/plotly/templates/waterfall.ts","../src/plotly/templates/candlestick.ts","../src/plotly/templates/heatmap.ts","../src/plotly/templates/lollipop.ts","../src/plotly/templates/bullet.ts","../src/plotly/templates/gantt.ts","../src/plotly/templates/ranged-dot.ts","../src/plotly/templates/regression.ts","../src/plotly/templates/kpi-card.ts","../src/plotly/templates/funnel.ts","../src/plotly/templates/gauge.ts","../src/plotly/templates/map.ts","../src/plotly/templates/choropleth.ts","../src/plotly/templates/sparkline.ts","../src/plotly/templates/bar-table.ts","../src/plotly/templates/density-contour.ts","../src/plotly/templates/index.ts","../src/plotly/instantiate-spec.ts","../src/plotly/facet.ts","../src/plotly/assemble.ts","../src/excel/chart-types.ts","../src/excel/templates/area.ts","../src/excel/templates/bar.ts","../src/excel/templates/boxplot.ts","../src/excel/templates/candlestick.ts","../src/excel/templates/funnel.ts","../src/excel/templates/histogram.ts","../src/excel/templates/line.ts","../src/excel/templates/pie.ts","../src/excel/templates/pyramid.ts","../src/excel/templates/radar.ts","../src/excel/templates/types.ts","../src/excel/templates/scatter.ts","../src/excel/templates/sunburst.ts","../src/excel/templates/treemap.ts","../src/excel/templates/waterfall.ts","../src/excel/templates/index.ts","../src/excel/assemble.ts","../src/excel/artifact.ts","../src/excel/codegen.ts","../src/excel/runtime.ts"],"names":["channels","isDiscrete","distinct","isDiscreteType","uniqueValues","isTemporal","groupAxis","ar","median","nRows","channel","chosen","HEADER_H","INTER_GAP","interpolateConfigProperty","applyInterpolate","isMeasure","row","mean","v","maxGroupBandwidth","showPointsProperty","approxFormat","norm","finalSpec","fillColor","clamp","niceMax","LEGEND_GAP","CANVAS_BUFFER","hasYTitle","hasLegend","MONTH_FULL","parts","isContinuousColor","temporalFormat","reg","categories","option","isHorizontal","RANK_SEMANTIC_TYPES","areCategoriesNumeric","buildCategoryAlignedData","buildCategoryAlignedXYData","DEFAULT_HEATMAP_SCHEME","isDivergingHeatmapScheme","hexToRgb","COLOR","estimateBandwidth","SCHEME_COLORS","getMapById","getPaletteForScheme","fallback","extractCategories","resolveCategoryOrder","groupBy","t","DEFAULT_COLORS","detectAxes","value","ZONE_GRAYS","STATUS_COLORS","STATUS_BELOW","STATUS_MET","COL_HEADER_H","ROW_HEADER_W","semType","schemeType","sortByOrder","toPoints","jitter","isNumericField","orderPeriods","fmtDate","niceBounds","kde","ecdfPairs","lineShape","computeMA","STEM_COLOR","linearRegression","polyRegression","polyEval","regressionCurvePoints","mapProjections","projectionCenterPresets","wouldBeWorld","regionProperty","buildGeoLayout","DEFAULT_TREND_W","baselineProperty","trendWidthProperty","isCJK","textWidth","approxNum","CHAR_PX","SCHEME_COLORSCALES","DEFAULT_SCHEME","decimals","niceStep","niceMaximum"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ZeroDecision, ColorSchemeRecommendation } from './semantic-types';\nimport type { LabelSizingDecision } from './decisions';\nimport type { SemanticAnnotation, FormatSpec, DomainConstraint, TickConstraint } from './field-semantics';\nimport type { ColorDecisionResult } from './color-decisions';\n\n/**\n * Core types for the chart engine library.\n * No React or UI framework dependencies — pure TypeScript.\n */\n\n// ---------------------------------------------------------------------------\n// Data Types\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Channel & Encoding\n// ---------------------------------------------------------------------------\n\nexport const channels = [\n    \"x\", \"y\", \"x2\", \"y2\", \"id\", \"color\", \"opacity\", \"size\", \"shape\", \"strokeDash\", \"column\",\n    \"row\", \"latitude\", \"longitude\", \"radius\", \"detail\", \"group\",\n    \"open\", \"high\", \"low\", \"close\", \"angle\",\n    // Connected Scatter Plot: the sequence field that defines the line's\n    // connection order (the trajectory), independent of the x value.\n    \"order\",\n    // KPI Card: one row per tile, no chart axes.\n    \"metric\", \"value\", \"goal\",\n] as const;\n\nexport const channelGroups: Record<string, string[]> = {\n    \"\": [\"x\", \"x2\", \"y\", \"y2\", \"latitude\", \"longitude\", \"id\", \"radius\", \"detail\", \"order\"],\n    \"legends\": [\"color\", \"group\", \"size\", \"shape\", \"text\", \"opacity\", \"strokeDash\"],\n    \"price\": [\"open\", \"high\", \"low\", \"close\"],\n    \"facets\": [\"column\", \"row\"],\n    \"kpi\": [\"metric\", \"value\", \"goal\"],\n};\n\n/**\n * Encoding definition for a single channel, using field names directly.\n * This is the library-level encoding — no fieldID indirection.\n */\nexport interface ChartEncoding {\n    field?: string;\n    type?: \"quantitative\" | \"nominal\" | \"ordinal\" | \"temporal\";\n    aggregate?: 'count' | 'sum' | 'average' | 'mean';\n    sortOrder?: \"ascending\" | \"descending\";\n    sortBy?: string;\n    scheme?: string;\n}\n\n/**\n * An encoding value that allows either a single encoding or an array of\n * encodings (static series). Array form is only valid on measure channels\n * (y, x-as-measure) where all fields resolve to quantitative.\n *\n * When an array is provided, the assembler folds (unpivots) the specified\n * fields into a long-form representation with a synthesized key column\n * (for color/legend) and value column (for the measure axis).\n */\nexport type EncodingValue = ChartEncoding | ChartEncoding[];\n\n/**\n * Shorthand for a channel encoding: a bare field-name string is treated as\n * `{ field: <string> }`. This lets callers write `{ x: \"weight\" }` instead of\n * `{ x: { field: \"weight\" } }` to keep simple specs terse (e.g. for demos).\n *\n * Shorthands are also accepted inside static-series arrays, so\n * `{ y: [\"sales\", \"profit\"] }` expands to `[{ field: \"sales\" }, { field: \"profit\" }]`.\n */\nexport type EncodingShorthand = string;\n\n/**\n * Channel value as accepted in raw user input, before shorthand normalization.\n * Normalized to {@link EncodingValue} by `normalizeEncodingShorthand`.\n */\nexport type RawEncodingValue =\n    | ChartEncoding\n    | EncodingShorthand\n    | (ChartEncoding | EncodingShorthand)[];\n\n/**\n * Metadata produced by static series normalization.\n * Captures the original multi-field intent so backends can emit\n * appropriate legend labels and the pipeline can short-circuit\n * series counting.\n */\nexport interface StaticSeriesMetadata {\n    /** Which channel had the array encoding ('y' or 'x') */\n    channel: string;\n    /** Original field names from the array entries */\n    fields: string[];\n    /** Synthetic column name for the series discriminator */\n    keyColumn: string;\n    /** Synthetic column name for the measure values */\n    valueColumn: string;\n}\n\n// ============================================================================\n// Phase 0: Semantic Resolution Types\n// ============================================================================\n\n/**\n * Everything Phase 0 decides for a single channel.\n *\n * Combines the original ChartEncoding (user intent) with resolved\n * decisions derived from semantic type, data values, and channel context.\n * All downstream phases (layout, assembly, instantiation) read this —\n * no nested FieldSemantics reference needed.\n */\nexport interface ChannelSemantics {\n    // --- Identity ---\n    /** Field name bound to this channel */\n    field: string;\n    /** The semantic annotation for this field */\n    semanticAnnotation: SemanticAnnotation;\n\n    // --- Encoding type ---\n    /**\n     * Final encoding type for this channel.\n     * Resolved from semantic type + data characteristics + channel rules.\n     */\n    type: 'quantitative' | 'nominal' | 'ordinal' | 'temporal';\n\n    // --- Formatting ---\n    /** Axis/legend number format */\n    format?: FormatSpec;\n    /** Tooltip format (typically higher precision) */\n    tooltipFormat?: FormatSpec;\n    /**\n     * Temporal format string (temporal fields on any channel).\n     * E.g., \"%Y\", \"%b %d\", \"%H:%M\".\n     */\n    temporalFormat?: string;\n\n    // --- Aggregation ---\n    /** Default aggregate function when used as a measure */\n    aggregationDefault?: 'sum' | 'average';\n\n    // --- Scale ---\n    /**\n     * Zero-baseline decision (positional quantitative channels only).\n     * Present only on 'x' and 'y' channels with type 'quantitative'.\n     */\n    zero?: ZeroDecision;\n    /** Recommended scale type */\n    scaleType?: 'linear' | 'log' | 'sqrt' | 'symlog';\n    /** Whether to apply \"nice\" rounding to domain endpoints */\n    nice?: boolean;\n    /** Domain bounds constraint */\n    domainConstraint?: DomainConstraint;\n    /** Tick mark constraints */\n    tickConstraint?: TickConstraint;\n\n    // --- Ordering ---\n    /**\n     * Canonical ordinal sort order for this field's values.\n     * E.g., month names, day-of-week, quarters.\n     */\n    ordinalSortOrder?: string[];\n    /** Whether the canonical order is cyclic (wraps around) */\n    cyclic?: boolean;\n    /** Whether the axis should be reversed (e.g., Rank: 1 at top) */\n    reversed?: boolean;\n    /** Default sort direction */\n    sortDirection?: 'ascending' | 'descending';\n\n    // --- Color ---\n    /** Color scheme recommendation (color channel only) */\n    colorScheme?: ColorSchemeRecommendation;\n\n    // --- Histogram ---\n    /** Whether this field benefits from binning */\n    binningSuggested?: boolean;\n\n    // --- Stacking ---\n    /** Whether values can be stacked, and how */\n    stackable?: 'sum' | 'normalize' | false;\n}\n\n/** Phase 0 output: one entry per channel. */\nexport type SemanticResult = Record<string, ChannelSemantics>;\n\n// ============================================================================\n// Phase 1: Layout Types\n// ============================================================================\n\n/**\n * How the template's primary mark encodes its quantitative value\n * on the positional (value) axis.\n *\n * Grounded in perceptual accuracy ranking:\n *   1. Position along a common scale — most accurate\n *   2. Length from a shared baseline\n *   3. Area\n *   4. Color saturation / luminance\n *\n * Drives zero-baseline, scale tightness, and compression behavior.\n */\nexport type MarkCognitiveChannel = 'position' | 'length' | 'area' | 'color';\n\n/**\n * Template's layout intent — returned by declareLayoutMode().\n */\nexport interface LayoutDeclaration {\n    /**\n     * Which axes allocate fixed bands per data position.\n     * Banded axes use the spring model; non-banded use gas pressure.\n     */\n    axisFlags?: {\n        x?: { banded: boolean };\n        y?: { banded: boolean };\n    };\n\n    /**\n     * Resolved encoding types after any template-driven type conversion.\n     * E.g., detectBandedAxis may convert Q→O for a bar chart axis.\n     * These override the Phase 0 decisions for layout purposes.\n     */\n    resolvedTypes?: Record<string, 'nominal' | 'ordinal' | 'quantitative' | 'temporal'>;\n\n    /**\n     * Template-specific overrides to layout parameters.\n     */\n    paramOverrides?: Partial<AssembleOptions>;\n\n    /**\n     * Which axes use binned encoding (e.g. histogram).\n     * The assembler auto-detects this from template.encoding if not set.\n     */\n    binnedAxes?: Record<string, boolean | { maxbins?: number }>;\n\n    /**\n     * Treat a discrete `color` field as an axis-grouping field for sizing,\n     * even though the template uses the `color` channel rather than `group`.\n     * When set, computeLayout sizes the discrete axis per-band (xStepUnit\n     * 'group') and budgets the band step across categories, so the chart does\n     * not balloon and each sub-lane shrinks as the subgroup count grows.\n     * Used by charts (e.g. boxplot) that dodge by color via an explicit offset.\n     */\n    colorActsAsGroup?: boolean;\n\n    /**\n     * Override the number of sub-lanes the grouping field reserves per band.\n     * When unset, computeLayout uses the global distinct count of the group\n     * field. Templates that render `local` (compact) dodge set this to the\n     * per-band max cardinality (`maxPerBand`) so the band is budgeted for only\n     * as many lanes as the busiest band actually uses.\n     */\n    groupLaneCount?: number;\n\n    /**\n     * Custom overflow strategy for deciding which discrete values to keep\n     * when a channel overflows. If not provided, the default strategy is used.\n     *\n     * @param channel       The overflowing channel ('x', 'y', 'color', etc.)\n     * @param fieldName     The field on that channel\n     * @param uniqueValues  All unique values in the data for that field\n     * @param maxToKeep     Maximum number of values that fit\n     * @param context       Abstract context with data and channel info\n     * @returns             The values to keep (in display order)\n     */\n    overflowStrategy?: OverflowStrategy;\n}\n\n/**\n * Custom overflow strategy function type.\n * Returns the values to keep when a channel has too many discrete values.\n */\nexport type OverflowStrategy = (\n    channel: string,\n    fieldName: string,\n    uniqueValues: any[],\n    maxToKeep: number,\n    context: OverflowStrategyContext,\n) => any[];\n\n/** Context passed to overflow strategy functions. */\nexport interface OverflowStrategyContext {\n    /** Full data table */\n    data: any[];\n    /** Per-channel semantic info */\n    channelSemantics: Record<string, ChannelSemantics>;\n    /** Original user encodings (for sort info) */\n    encodings: Record<string, ChartEncoding>;\n    /** Mark types present in the template */\n    allMarkTypes: Set<string>;\n}\n\n/**\n * Per-channel maximum values that can fit on the canvas.\n *\n * Computed once by `computeChannelBudgets` using the most conservative\n * assumptions (minStep, minSubplotSize, maxStretch).  Passed to\n * `filterOverflow` so it only needs to decide *which* values to keep\n * and filter rows — no layout math.\n *\n * Pipeline:  computeChannelBudgets → filterOverflow → computeLayout\n */\nexport interface ChannelBudgets {\n    /** Maximum discrete values to keep per channel.\n     *  Channels not present here are uncapped (`Infinity`). */\n    maxValues: Record<string, number>;\n    /** Facet grid decision (if facet channels exist) */\n    facetGrid?: FacetGridResult;\n}\n\n/** Result of overflow filtering. */\nexport interface OverflowResult {\n    /** Data after removing overflow rows */\n    filteredData: any[];\n    /** Nominal value counts per channel (post-overflow) */\n    nominalCounts: Record<string, number>;\n    /** Detailed truncation info for overflow styling */\n    truncations: TruncationWarning[];\n    /** Warning messages for the UI */\n    warnings: ChartWarning[];\n}\n\n/**\n * Result of facet grid computation (from computeFacetGrid).\n *\n * Decides the visual grid layout (including column-only wrapping)\n * and the maximum number of unique values to keep per facet channel.\n *\n * Pipeline:  computeFacetGrid → filterOverflow (uses caps) → computeLayout (uses grid)\n */\nexport interface FacetGridResult {\n    /** Visual columns per row (after wrapping for column-only) */\n    columns: number;\n    /** Visual rows (after wrapping for column-only) */\n    rows: number;\n    /** Max unique values to keep for the column channel */\n    maxColumnValues: number;\n    /** Max unique values to keep for the row channel */\n    maxRowValues: number;\n}\n\n/**\n * Describes one axis that was truncated due to overflow.\n */\nexport interface TruncationWarning {\n    /** Severity level for UI display */\n    severity: 'warning';\n    /** Machine-readable code */\n    code: 'overflow';\n    /** Human-readable message */\n    message: string;\n    /** Which channel overflowed ('x', 'y', 'color', etc.) */\n    channel: string;\n    /** Field name on the overflowing axis */\n    field: string;\n    /** Values retained (in display order) */\n    keptValues: any[];\n    /** Number of items omitted */\n    omittedCount: number;\n    /** Placeholder string to append to the axis domain */\n    placeholder: string;\n}\n\n/**\n * Phase 1 output: all layout decisions.\n *\n * LayoutResult is **target-agnostic** — it describes abstract dimensions\n * and step sizes that any rendering backend can consume.  It is the\n * backend's responsibility to translate these values into its own\n * coordinate system:\n *\n *   subplotWidth / subplotHeight\n *     The intended data-area (plot area) size in pixels.  This does NOT\n *     include axis labels, titles, legends, or margins.  Each backend\n *     must add its own margins/padding around this area.\n *\n *   xStep / yStep\n *     Pixel distance per discrete position on each axis.  A backend\n *     rendering bars should derive bar width from step and stepPadding.\n *     VL uses `width: {step: N}` natively; ECharts must compute\n *     explicit barWidth / barCategoryGap.\n *\n *   stepPadding\n *     Fraction of each step reserved for inter-category spacing (0–1).\n *     Usable bar width = step × (1 − stepPadding).\n *\n *   facet (columns / rows / subplot sizes)\n *     When faceting is active, the subplot dimensions are already\n *     divided for the facet grid.  Each backend is responsible for\n *     facet wrapping (e.g. column-only → wrapped rows), panel\n *     positioning, header labels, and shared/per-panel axis titles.\n *\n * Backends should NOT modify LayoutResult.  They read it and translate\n * to their native format (VL encoding props, ECharts grid/axis config, etc.).\n */\nexport interface LayoutResult {\n    /** Final subplot width in px (after stretch) */\n    subplotWidth: number;\n    /** Final subplot height in px (after stretch) */\n    subplotHeight: number;\n\n    /** Computed step size for X axis (px per discrete position) */\n    xStep: number;\n    /** Computed step size for Y axis (px per discrete position) */\n    yStep: number;\n\n    /** Whether the step size is per-item or per-group. */\n    xStepUnit?: 'item' | 'group';\n    yStepUnit?: 'item' | 'group';\n\n    /** Number of banded continuous items on each axis (0 if not banded-continuous) */\n    xContinuousAsDiscrete: number;\n    yContinuousAsDiscrete: number;\n\n    /** Number of nominal/ordinal items on each axis */\n    xNominalCount: number;\n    yNominalCount: number;\n\n    /** Label sizing decisions per axis */\n    xLabel: LabelSizingDecision;\n    yLabel: LabelSizingDecision;\n\n    /**\n     * Canvas-adaptive header font size (px) for axis titles and chart title.\n     * Derived from the backend's `baseTitleFontSize`, scaled subtly with the\n     * (sub)plot size. Backends should use this instead of hardcoded constants.\n     */\n    titleFontSize: number;\n    /**\n     * Canvas-adaptive font size (px) for legend entries. Slightly smaller than\n     * {@link titleFontSize}. Backends should use this for legend text.\n     */\n    legendFontSize: number;\n\n    /** Facet layout (if applicable) */\n    facet?: {\n        columns: number;\n        rows: number;\n        subplotWidth: number;\n        subplotHeight: number;\n    };\n\n    /**\n     * Gap between facet panels in px, as set by the backend.\n     * Backends use this to configure their own spacing\n     * (VL config.facet.spacing, ECharts GAP, etc.).\n     */\n    effectiveFacetGap: number;\n\n    /**\n     * Inter-category padding fraction (0–1) used by the layout engine.\n     * Renderers (especially ECharts) should use this to size bars:\n     *   barWidth = step × (1 − stepPadding)\n     */\n    stepPadding: number;\n\n    /** Items truncated due to overflow */\n    truncations: TruncationWarning[];\n}\n\n// ============================================================================\n// Phase 2: Instantiation Types\n// ============================================================================\n\n/**\n * Context passed to template instantiate() and to the shared assembler's\n * Phase 2 logic. Combines semantic decisions, layout results, and original\n * inputs.\n */\nexport interface InstantiateContext {\n    /** Per-channel semantic decisions (Phase 0) */\n    channelSemantics: Record<string, ChannelSemantics>;\n\n    /** Layout decisions (Phase 1) */\n    layout: LayoutResult;\n\n    /** The data table (array of row objects, post-overflow filtering) */\n    table: any[];\n\n    /**\n     * The full data table (array of row objects, BEFORE overflow filtering).\n     *\n     * `table` may have categories silently dropped by `filterOverflow` to\n     * fit the canvas. Templates that need an honest view of the raw data\n     * — e.g. a \"top-N + Others\" rollup, an annotation that summarizes\n     * what wasn't shown, or a sparkline reference — should read from\n     * `fullTable` instead.\n     *\n     * Optional for backwards-compatibility; backends that don't set it\n     * fall back to `table`.\n     */\n    fullTable?: any[];\n\n    /** Resolved VL encoding objects (built by assembler from Phase 0 decisions) */\n    resolvedEncodings: Record<string, any>;\n\n    /** Original user-level encodings */\n    encodings: Record<string, ChartEncoding>;\n\n    /** User-configured chart properties */\n    chartProperties?: Record<string, any>;\n\n    /** Static series metadata (present when input used array-valued encoding) */\n    staticSeries?: StaticSeriesMetadata;\n\n    /**\n     * Base (target) chart dimensions — the size layout aims for before\n     * pressure-driven stretch. This is the resolved `chart_spec.baseSize`\n     * (NOT the hard ceiling). The ceiling is `baseSize × maxStretchX/Y`,\n     * available via `assembleOptions.maxStretchX` / `maxStretchY`.\n     */\n    canvasSize: { width: number; height: number };\n\n    /** Field name → semantic type (string or enriched annotation) */\n    semanticTypes: Record<string, string | SemanticAnnotation>;\n\n    /** Chart type name */\n    chartType: string;\n\n    /** Assembly options (layout tuning parameters from the caller) */\n    assembleOptions?: AssembleOptions;\n\n    /**\n     * Backend-agnostic color decisions.\n     * Computed once per chart from semantic + layout context and reused\n     * by all backends to map into their native color configuration.\n     */\n    colorDecisions?: ColorDecisionResult;\n}\n\n\n\n// ---------------------------------------------------------------------------\n// Chart Template\n// ---------------------------------------------------------------------------\n\n/**\n * The minimal, render-time context an option's applicability check reads.\n *\n * Shared by both option families so they use one predicate convention:\n *   - `ChartPropertyDef.check` (Category A, data-aware properties)\n *   - `EncodingActionDef.isApplicable` (Category B, encoding actions)\n *\n * `encodings` is always present (it's all a host needs to gate an encoding\n * action). The remaining fields are populated by the compiler during assembly\n * and let data-aware *properties* inspect the actual values + resolved\n * semantics; a predicate that only reads `encodings` (e.g. \"is color bound?\")\n * works with the bare `{ encodings }` a host can build on its own.\n */\nexport interface OptionEvalContext {\n    /** User-level encodings (channel → field binding). Always present. */\n    encodings: Record<string, ChartEncoding>;\n    /** Per-channel semantic decisions (Phase 0). Present during assembly. */\n    channelSemantics?: Record<string, ChannelSemantics>;\n    /** Full (pre-overflow) data rows, for data-aware preconditions. */\n    data?: any[];\n    /** Current user-set chart property overrides. */\n    chartProperties?: Record<string, any>;\n}\n\n/**\n * Defines a configurable property for a chart template.\n * Describes the value domain; the app decides how to render it.\n */\n\n/** The value-domain variants a property can take (the discriminated arm). */\nexport type ChartPropertyVariant =\n    | { type: 'continuous'; min: number; max: number; step?: number; defaultValue?: number }\n    | { type: 'discrete';  options: { value: any; label: string }[]; defaultValue?: any }\n    | { type: 'binary';    defaultValue?: boolean };\n\n/**\n * The renderable descriptor of a property: its identity, label, and value\n * domain. This is the part a host needs to draw a control, and it is shared\n * verbatim by both sides of the Flint↔host boundary:\n *\n *   - `ChartPropertyDef`  = `ChartProperty` + the applicability *rule* (`check`)\n *   - `ChartOption`       = `ChartProperty` + the resolved *answer* (`applicable`/`value`)\n *\n * Keeping the descriptor common means the template definition and the resolved\n * option never drift in shape; they differ only by rule-vs-answer.\n */\nexport type ChartProperty = {\n    key: string;\n    label: string;\n} & ChartPropertyVariant;\n\nexport type ChartPropertyDef = ChartProperty & {\n    /**\n     * The single applicability check for this property, co-located with it so a\n     * reader sees *why* an option is offered without digging into the compiler.\n     * Pure — reads only `OptionEvalContext` — and returns:\n     *   - `applicable`: is this property worth offering for the current spec +\n     *     data? It subsumes both structural gates (a channel is bound, e.g.\n     *     `!!ctx.encodings.color?.field`) and data-aware ones (a wide-range axis,\n     *     an additive single-sign measure, …). A property with no `check`\n     *     is always offered.\n     *   - `recommendedValue` (optional): the engine's suggested default, used to\n     *     seed the control when the host hasn't set an explicit value.\n     *\n     * Because it requires no live data to answer a structural check, a static\n     * host (the encoding-shelf popover) can call it with just `{ encodings }`;\n     * a data-aware property then reports `applicable: false` there — surfacing\n     * only in the data-aware quick-config bar — without needing a separate flag.\n     */\n    check?: (ctx: OptionEvalContext) => { applicable: boolean; recommendedValue?: any };\n};\n\n/**\n * A chart property descriptor annotated with its applicability and resolved\n * value for a *specific* spec + dataset. Produced by `getChartOptions` (and\n * carried on the assembled spec under `_options`).\n *\n * This is the contract between Flint and any host (Data Formulator, an AI agent,\n * another renderer):\n *\n *   - `applicable` — did this property pass its precondition for this render?\n *     Each property answers via its own `check`: structural ones (e.g. stack\n *     mode) are applicable when their channel is bound; data-aware ones (e.g.\n *     per-axis log scale, faceted independent y) only when the data warrants it\n *     (wide-range continuous axis, faceted quantitative y, …). A host should\n *     surface a control only when it is applicable; passing a non-applicable\n *     property to the compiler is accepted but silently ignored.\n *   - `value` — the value Flint will actually use: the host's explicit choice\n *     (from `chart_spec.chartProperties[key]`) when set, otherwise the engine's\n *     recommended default. Hosts seed their control from this so an \"auto\"\n *     recommendation (e.g. log on a 10⁶× axis) is reflected without the host\n *     having to recompute it.\n *\n * A `ChartOption` shares the renderable `ChartProperty` descriptor with the\n * template def but carries the *answer* (`applicable`/`value`) instead of the\n * *rule* (`check`). That keeps it a resolved, serializable view a host consumes\n * across the spec/JSON boundary (Python path included), where the rule function\n * wouldn't survive anyway.\n */\nexport type ChartOption = ChartProperty & {\n    /** Did this property pass its precondition for the current spec + data? */\n    applicable: boolean;\n    /** Explicit host choice if set, otherwise the engine's recommended default. */\n    value: any;\n};\n\n\n/**\n * Defines a \"quick action\" whose effect is an **encoding transform** (Category B):\n * sort, color scheme, aggregate, type, orientation (x↔y swap), etc.\n *\n * These operate at a different pipeline stage than ChartPropertyDef:\n *\n *   Category B (this type):  (encoding + override) ──► transformed encoding ──► assemble ──► spec\n *                                         └──── set() ────┘\n *   Category A (properties): encoding ──► assemble ──► spec ──► (props tweak spec in instantiate)\n *\n * An encoding action transforms the *input* to assembly, so the full pipeline\n * (semantic resolution → overflow → layout → assembly) re-runs on the result.\n * That is exactly why structural options must live here: sort changes which\n * categories survive overflow, aggregate changes the data values, orientation\n * changes which axis is banded — none of which can be faked by patching the\n * assembled spec afterwards. ChartPropertyDef, by contrast, only overrides the\n * already-assembled spec and is limited to visual decoration (cornerRadius,\n * opacity, curve, donut hole).\n *\n * Storage = override, not encoding state. The action's value is stored by the\n * host as a *configuration override* (exactly like a chart property), keyed by\n * `key` inside `chart_spec.chartProperties`. The encoding map (the encoding\n * shelf's state) is left untouched. The compiler — not the host — applies the\n * override at assemble time:\n *\n *   transformedEncodings = set(currentEncodings, chartProperties[key])\n *\n * So Flint always sees just \"override value + current encoding\" and composes\n * them; it never mutates persistent encoding state. (See applyEncodingOverrides.)\n *\n *   get(encodings)        → derive the control's displayed value from the base\n *                           encodings when no override is set\n *   set(encodings, value) → compose: return the encodings with the override applied\n *\n * `set` is declarative: it returns what the encodings should be after the\n * override, not a list of imperative operations. Any transform — changing one\n * property, swapping two channels, clearing a channel — is just \"produce a new\n * map\", so there is no operation taxonomy to grow.\n *\n * `dependencies` declares which encoding channels the override is computed\n * against. It is a pure declaration consumed by the *host*: when the user edits\n * one of these channels in the encoding shelf, the host clears (resets) the\n * override so a stale value can't linger. Flint never resets — reset is host\n * logic; Flint only ever composes override + current encoding.\n *\n * The control shape mirrors ChartPropertyDef so the host can reuse the same\n * renderers; only the pipeline stage differs (encoding transform vs spec tweak).\n */\nexport type EncodingActionDef = {\n    key: string;\n    label: string;\n    /**\n     * Channels this override is computed against. When the host detects an edit\n     * to any of these channels in the encoding shelf, it resets this override to\n     * default. Pure declaration — Flint itself never reads this for composition.\n     */\n    dependencies?: string[];\n    /** How to render the control (same value domains as ChartPropertyDef). */\n    control:\n        | { type: 'continuous'; min: number; max: number; step?: number }\n        | { type: 'discrete';  options: { value: any; label: string }[] }\n        | { type: 'binary' };\n    /**\n     * Optional applicability predicate — the single gate for whether this action\n     * is offered. It reads the shared `OptionEvalContext`; in practice an action\n     * only needs `ctx.encodings`, so it subsumes both channel-assignment checks\n     * (is a channel bound? e.g. `!!ctx.encodings.color?.field`) and type checks\n     * (e.g. Sort needs a discrete category axis, so it must not appear on a\n     * purely temporal/quantitative chart). Pure. Defaults to always-applicable.\n     */\n    isApplicable?: (ctx: OptionEvalContext) => boolean;\n    /** Derive the displayed control value from the base encodings map (pure). */\n    get: (encodings: Record<string, ChartEncoding>) => any;\n    /** Compose: return the encodings with this override value applied (pure). */\n    set: (encodings: Record<string, ChartEncoding>, value: any) => Record<string, ChartEncoding>;\n};\n\n/**\n * A chart-type transition: a pivot state that re-views the same data as a\n * *sibling* chart type. Unlike orientation/role/series moves (which stay within\n * one template), a transition changes `chartType` and, optionally, re-routes one\n * field across channels. It is the \"chart type as another group coordinate\"\n * generator (see design doc §4.6). Examples: Grouped Bar ↔ Stacked Bar (the\n * dodge series moves between `group` and `color`), Scatter ↔ Strip/Jitter (a\n * discrete `color` swaps onto the `x` category axis).\n */\nexport interface PivotTransition {\n    /** Target chart type to render as. Must be a registered sibling template. */\n    to: string;\n    /** State label shown in the pivot control (e.g. 'Stacked', 'Grouped', 'Jitter'). */\n    label: string;\n    /**\n     * Optional channel re-route applied before switching templates.\n     * - `move`: source field → target channel; source channel cleared (target must be empty).\n     * - `swap`: exchange the fields on the two channels (or spill the displaced\n     *   field to a third channel — see `spill`).\n     *\n     * `from` may be a literal channel name or the sentinel `'series'`, which\n     * resolves at runtime to whichever grouping channel (`color`/`column`/`row`/\n     * `group`) currently holds the discrete series field.\n     */\n    route?: { from: string; to: string; mode?: 'move' | 'swap'; spill?: string };\n    /** Only offer when the routed source field is discrete (nominal/ordinal). */\n    requireDiscreteSource?: boolean;\n    /** Only offer when the routed source field's distinct count is within this budget. */\n    maxSourceCardinality?: number;\n    /**\n     * Only offer when the *domain* position axis (the non-measure x/y) carries an\n     * ordered type — `temporal` or `ordinal`, never plain `nominal`. This is the\n     * hard gate for bar → line/area: you may not connect unordered categories.\n     * Per the design decision, order is taken from the resolved encoding type\n     * (derived from the semantic type), NOT inferred from sort state.\n     */\n    requireOrderedAxis?: boolean;\n    /**\n     * Only offer when every value on the *measure* position axis is ≥ 0. The gate\n     * for part-to-whole / filled siblings (pie, area) where a negative magnitude\n     * would misread.\n     */\n    requireNonNegative?: boolean;\n    /**\n     * Only offer when the *domain* axis distinct count is within this budget — the\n     * low-cardinality guard for pie/rose (few slices) and line → bar (few ticks).\n     */\n    maxCategoryCardinality?: number;\n    /**\n     * Only offer when NO discrete series channel (color/group/column/row) is bound\n     * — the single-series guard for a part-to-whole pie/donut.\n     */\n    requireNoSeries?: boolean;\n    /**\n     * Only offer when a discrete series channel (color/group/detail/column/row) IS\n     * bound — the multi-series guard for small-multiple siblings (e.g. Line →\n     * Sparkline needs a series to make one strip per category).\n     */\n    requireSeries?: boolean;\n    /**\n     * Only offer when BOTH position axes (x and y) are measures (quantitative or\n     * aggregated) — the guard for a fitted trend (Scatter → Regression): a\n     * regression line is meaningless over a nominal/category axis.\n     */\n    requireBiaxialMeasure?: boolean;\n    /**\n     * Only offer when the `size` channel is NOT bound — keeps a fitted-trend\n     * sibling (Regression) to a clean 2-variable scatter rather than layering it\n     * over a bubble chart.\n     */\n    requireNoSize?: boolean;\n    /**\n     * After routing, force the *domain* (non-measure) position axis onto this\n     * channel, swapping `x`/`y` wholesale if it currently sits on the other. Used\n     * for bar → line/area: a *horizontal* bar carries the ordered/temporal domain\n     * on `y`, but a line pins time to the horizontal, so the transition must\n     * re-orient to `x` (otherwise you get a nonsensical vertical line chart).\n     */\n    orientDomainAxis?: 'x' | 'y';\n}\n\n/**\n * Declarative pivot configuration carried by a chart template. Each generator\n * declares its *permissible transformation domain* compactly — the candidate\n * swap pairs, the shiftable channels, the sibling chart types — and the compiler\n * filters those candidates lazily against the actual encodings + data (type\n * compatibility, channel availability, cardinality budgets) when assembling. See\n * core/pivot.ts for the enumeration/composition semantics.\n */\nexport interface PivotDef {\n    /** Override key the host stores the chosen state id under. Default `'pivot'`. */\n    key?: string;\n    /** Human label for the control. Default `'View'`. */\n    label?: string;\n    /**\n     * τ (transpose): axis-slot pairs that may be exchanged *wholesale* — the\n     * orientation/flip generator. Each pair (typically `['x','y']`) swaps the two\n     * channels' full encodings, so it is profile-agnostic (a bar's category↔measure\n     * flip, a scatter's measure↔measure flip, a heatmap's dimension↔dimension flip\n     * all read the same). It is suppressed only when a continuous-temporal position\n     * axis must stay horizontal (line/area). Because both slots stay occupied, a\n     * transpose can never violate a must-present constraint. A template that should\n     * never flip (e.g. a line, to avoid a vertical line chart) simply omits this.\n     * Ids/labels: `flip:x-y` / `τ_x↔y`. Default none.\n     */\n    transpose?: string[][];\n    /**\n     * σ (permute): permutable *blocks* of channels whose *fields* may be reordered\n     * among themselves — distinct from {@link transpose}, this reassigns a field to\n     * a compatible channel rather than flipping two slots. The compiler enumerates\n     * the within-block pairings and admits an *axis ↔ auxiliary* swap only when the\n     * two ends share a profile (the Young-block rule of the design doc §3.6.1):\n     *   - measure ↔ measure, on position marks only — a quantitative field trades a\n     *     precise position axis for a demoted `color`/`size` channel (scatter);\n     *   - category ↔ discrete `color` — a banded axis dimension trades places with\n     *     the legend series (bars).\n     * `x↔y` is NOT a permute (it is a {@link transpose}); pure auxiliary↔auxiliary\n     * pairs (e.g. `color↔size`) are not offered. Order within a block is irrelevant;\n     * ids/labels canonicalize each pair (`swap:x-color` / `σ_x↔color`). Default none.\n     */\n    permute?: string[][];\n    /**\n     * γ (shift): grouping channels the single discrete *series* field may be\n     * routed across — typically `['color','group','column','row']`. The compiler\n     * filters to channels the template actually declares, that are empty, and\n     * within the per-channel cardinality budget. This is what unifies stacked /\n     * grouped / faceted presentations as states of one template. Default none.\n     */\n    shift?: string[];\n    /** Max distinct categories for a facet split to be offered. Default 12. */\n    facetBudget?: number;\n    /**\n     * θ (chart-type transition): sibling chart types to consider re-rendering the\n     * same data as (e.g. Grouped Bar ↔ Stacked Bar, Scatter ↔ Jitter). Each\n     * admitted transition becomes one extra state in the orbit. Default none.\n     */\n    transitions?: PivotTransition[];\n}\n\n/**\n * Chart template definition — pure data, no UI/icon dependencies.\n * This is the reusable core that defines chart structure, encoding channels,\n * and processing logic.\n *\n * Three-phase pipeline hooks:\n *   1. declareLayoutMode — declare axis flags, type overrides, param overrides\n *   2. instantiate — build final spec from resolved encodings + layout\n */\nexport interface ChartTemplateDef {\n    /** Display name of the chart type, e.g. \"Scatter Plot\" */\n    chart: string;\n    /** Vega-Lite spec skeleton (mark + encoding structure) */\n    template: any;\n    /** Which encoding channels are available for this chart */\n    channels: string[];\n\n    /**\n     * How the primary mark encodes its quantitative value.\n     * Determines zero-baseline, scale tightness, and compression behavior.\n     *\n     * Examples:\n     *   - Bar, Histogram, Lollipop, Waterfall, Pyramid: 'length'\n     *   - Area, Streamgraph, Density: 'area'\n     *   - Line, Scatter, Boxplot, Candlestick, Strip: 'position'\n     *   - Heatmap: 'color'\n     */\n    markCognitiveChannel: MarkCognitiveChannel;\n\n    /**\n     * Phase 1a: Declare layout intent.\n     * Runs BEFORE layout computation.\n     *\n     * Inspects channel semantics and data to decide:\n     * - Which axes are banded (need spring model)\n     * - Any type conversions (Q→O for banded axis)\n     * - Layout parameter overrides (σ, step multiplier, etc.)\n     * Grouping (from group channel + discrete axis detection)\n     */\n    declareLayoutMode?: (\n        channelSemantics: Record<string, ChannelSemantics>,\n        table: any[],\n        chartProperties?: Record<string, any>,\n    ) => LayoutDeclaration;\n\n    /**\n     * Optional encoding-normalization hook.\n     * Runs BEFORE semantics resolution and layout, after pivot / encoding-action\n     * overrides have been composed. Lets a template re-route the *authored*\n     * channel map so the WHOLE pipeline (semantics, faceting, overflow, layout)\n     * resolves against the normalized encodings — not just the final spec.\n     *\n     * Example: a sparkline \"table\" remaps its series field (`color`/`detail`)\n     * onto the `row` facet channel when no `row` is bound, so the layout engine\n     * allocates one stacked strip per series instead of overlaying them.\n     *\n     * Return the (possibly new) encoding map. Returning the input unchanged is a\n     * no-op. Pure — must not mutate the input.\n     *\n     * NOTE: currently honored by the Vega-Lite assembler only; ECharts / Chart.js\n     * wiring is a follow-up.\n     */\n    normalizeEncodings?: (\n        encodings: Record<string, ChartEncoding>,\n        table: any[],\n    ) => Record<string, ChartEncoding>;\n\n    /**\n     * Build the final spec from resolved encodings + layout.\n     * Runs AFTER layout computation.\n     *\n     * Receives the spec skeleton (deep clone of template),\n     * and a context with resolved encodings, semantic decisions,\n     * and layout result. Handles both encoding mapping and mark sizing.\n     *\n     * @param spec       The Vega-Lite spec skeleton (deep clone of template)\n     * @param context    Complete context with all phase outputs\n     */\n    instantiate: (\n        spec: any,\n        context: InstantiateContext,\n    ) => void;\n\n    /** Optional configurable properties for the chart type */\n    properties?: ChartPropertyDef[];\n\n    /**\n     * Opt out of a backend's *generic* column/row facet-splitting pass, even\n     * though the template declares `x`/`y` (so the axis-less `hasAxes` gate\n     * alone would not exempt it).\n     *\n     * Set by templates that build their own composite, self-contained figure\n     * — one that already spans multiple internal axis pairs / sub-panels\n     * (e.g. a Sparkline table's one-row-per-series strips, a Bar Table's\n     * bar+%+value columns) — and so handle `column`/`row` themselves inside\n     * `instantiate` rather than being pre-split into N single-facet calls\n     * whose per-panel output a generic single-axis-pair combiner (e.g. the\n     * Plotly backend's `facet.ts`) cannot correctly recombine.\n     *\n     * Currently honored by the Plotly assembler only.\n     */\n    selfManagesFacets?: boolean;\n\n    /**\n     * Optional encoding-level quick actions (Category B). Clicking one of these\n     * mutates the encodings map (the same state the encoding shelf edits),\n     * rather than chart-native config. See EncodingActionDef.\n     */\n    encodingActions?: EncodingActionDef[];\n\n    /**\n     * Optional pivot declaration — a derived Category-B operator that re-routes\n     * encoding fields across position/legend/facet channels to surface\n     * alternative views (orientation swap, series↔axis role swap, facet split).\n     * The host stores the chosen state id under `PivotDef.key` in\n     * chartProperties; the compiler enumerates + composes the permutation. See\n     * core/pivot.ts (computePivot / applyPivot).\n     */\n    pivot?: PivotDef;\n\n    /**\n     * Optional post-processing hook.\n     * Called after instantiation and layout application, before the final\n     * result is returned.  Receives the assembled spec/option and the\n     * effective canvas size so the template can adjust visual parameters\n     * (e.g. symbol size, line width) proportionally.\n     */\n    postProcess?: (\n        spec: any,\n        context: InstantiateContext,\n    ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Warnings\n// ---------------------------------------------------------------------------\n\n/** A warning produced during chart assembly */\nexport interface ChartWarning {\n    /** Warning severity */\n    severity: 'info' | 'warning' | 'error';\n    /** Short machine-readable warning code */\n    code: string;\n    /** Human-readable description */\n    message: string;\n    /** Optional: which channel(s) or field(s) triggered the warning */\n    channel?: string;\n    field?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Unified Assembly Input\n// ---------------------------------------------------------------------------\n\n/**\n * Unified input for all chart assembly functions (Vega-Lite, ECharts, Chart.js).\n *\n * Instead of passing multiple positional arguments, callers provide a single\n * JSON-serializable object with four top-level keys:\n *\n * ```ts\n * const result = assembleVegaLite({\n *   data: { values: myRows },\n *   semantic_types: { weight: 'Quantity', origin: 'Country' },\n *   chart_spec: {\n *     chartType: 'Scatter Plot',\n *     encodings: { x: { field: 'weight' }, y: { field: 'mpg' } },\n *     canvasSize: { width: 400, height: 300 },\n *   },\n *   options: { addTooltips: true },\n * });\n * ```\n */\nexport interface ChartAssemblyInput {\n    /**\n    * Data source — either inline rows or a reference the host can resolve.\n     *\n     * - `{ values: any[] }` — an array of row objects (like Vega-Lite `data.values`).\n    * - `{ url: string }`   — a URL or path reference to JSON/CSV data.\n    *   Hosts that need local semantic/layout decisions should resolve this to\n    *   rows before assembly. The MCP renderer reads local JSON/CSV/TSV\n    *   files referenced by path; it does not fetch remote URLs.\n     *\n     * At least one of `values` or `url` must be provided.\n     */\n    data: { values: any[]; url?: never } | { url: string; values?: never };\n\n    /**\n     * Per-column semantic type annotations.\n     *\n     * Maps field names to semantic type strings (e.g., `\"Quantity\"`, `\"Country\"`,\n     * `\"Year\"`, `\"Percentage\"`). These drive encoding type resolution, zero-baseline\n     * decisions, color schemes, formatting, and more.\n     *\n     * Fields not listed here fall back to `inferVisCategory()` which inspects\n     * raw data values.\n     */\n    semantic_types?: Record<string, string | SemanticAnnotation>;\n\n    /**\n     * Chart specification — describes *what* to draw.\n     */\n    chart_spec: {\n        /** Template name, e.g. `\"Scatter Plot\"`, `\"Bar Chart\"` */\n        chartType: string;\n        /** Channel → encoding map (e.g., `{ x: { field: 'weight' }, y: { field: 'mpg' } }`).\n         * A bare string is shorthand for `{ field: <string> }` (e.g. `{ x: 'weight' }`). */\n        encodings: Record<string, RawEncodingValue>;\n        /**\n         * Base (target) chart size in pixels — the size layout aims for when the\n         * data fits comfortably (default: `{ width: 400, height: 320 }`).\n         *\n         * For faceted charts this is the whole-chart target; panels divide it.\n         * The chart may grow beyond `baseSize` under pressure (dense axes, many\n         * facet panels), bounded by `canvasSize`.\n         */\n        baseSize?: { width: number; height: number };\n        /**\n         * Hard ceiling on the rendered size in pixels (optional).\n         *\n         * The final image — a single plot OR an entire facet grid — never exceeds\n         * this box. The per-dimension growth allowance is derived from the ratio\n         * to `baseSize`: `βx = canvasSize.width / baseSize.width`,\n         * `βy = canvasSize.height / baseSize.height` (each clamped to ≥ 1).\n         *\n         * When omitted, the ceiling defaults to `baseSize × options.maxStretch`\n         * (default 1.5×) in each dimension.\n         */\n        canvasSize?: { width: number; height: number };\n        /** Template-specific configurable properties (e.g., bar corner radius, show labels) */\n        chartProperties?: Record<string, any>;\n    };\n\n    /**\n     * Options for the assembler — layout tuning, tooltips, etc.\n     * All fields are optional and have sensible defaults.\n     */\n    options?: AssembleOptions;\n\n    /**\n     * Localized display names for fields (column name → display label).\n     * When present, used as axis titles and legend headers instead of raw field names.\n     */\n    field_display_names?: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Assembly Options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the chart assembly function.\n * Includes layout tuning parameters — all have sensible defaults.\n */\nexport interface AssembleOptions {\n    /** Whether to add tooltips to the chart (default: false) */\n    addTooltips?: boolean;\n    /**\n     * Fraction of each step reserved for inter-category padding (0–1).\n     * VL pads *inside* the step (band = step × (1 − padding)), so this\n     * value should match VL's paddingInner.  ECharts pads *outside* the\n     * band, so the layout engine passes this through so ECharts can\n     * compute barWidth = step × (1 − stepPadding) explicitly.\n     *\n     * Default: 0.1 (matching VL's default band paddingInner).\n     */\n    stepPadding?: number;\n    /** Power-law exponent for discrete axis stretch (default: 0.5) */\n    elasticity?: number;\n    /**\n     * Default maximum stretch multiplier used when the spec provides no\n     * explicit `canvasSize` ceiling (default: 2).\n     *\n     * This is a **unified** budget: the combined stretch from facet\n     * layout AND discrete/banded axis sizing must stay within this\n     * factor.  For example, with maxStretch=2 and a 400px base,\n     * the total chart width never exceeds 800px regardless of how\n     * many facet columns or discrete axis items there are.\n     *\n     * When `chart_spec.canvasSize` IS set, the per-dimension caps\n     * `maxStretchX`/`maxStretchY` are derived from `canvasSize / baseSize`\n     * instead and this scalar is ignored.\n     */\n    maxStretch?: number;\n    /**\n     * Resolved per-dimension stretch cap for the X (width) axis.\n     *\n     * Normally derived by the assembler from `canvasSize / baseSize`\n     * (or `maxStretch` when no ceiling is set). Callers rarely set this\n     * directly. Falls back to `maxStretch` when absent.\n     */\n    maxStretchX?: number;\n    /**\n     * Resolved per-dimension stretch cap for the Y (height) axis.\n     *\n     * Normally derived by the assembler from `canvasSize / baseSize`\n     * (or `maxStretch` when no ceiling is set). Callers rarely set this\n     * directly. Falls back to `maxStretch` when absent.\n     */\n    maxStretchY?: number;\n    /** Power-law exponent for facet subplot stretch — lower = more conservative (default: 0.3) */\n    facetElasticity?: number;\n    /** Minimum pixels per discrete axis item (default: 6) */\n    minStep?: number;\n    /** Maximum number of distinct color values before overflow truncation (default: 24) */\n    maxColorValues?: number;\n    /** Minimum facet subplot size in px (default: 60) */\n    minSubplotSize?: number;\n    /**\n     * Fixed overhead in px for axis labels, titles, legend, etc.\n     * Subtracted once from the total canvas budget (not per-panel).\n     * Each backend sets its own default; core uses { width: 0, height: 0 }.\n     */\n    facetFixedPadding?: { width: number; height: number };\n    /**\n     * Gap in px between adjacent facet panels (spacing, headers).\n     * Used directly by the core layout engine to compute subplot sizes\n     * and max canvas dimensions.\n     * Each backend sets its own value (VL ≈ 10, ECharts ≈ 14); core uses 0.\n     */\n    facetGap?: number;\n    /**\n     * Explicit number of facet COLUMNS for a column-wrapped facet, overriding\n     * the auto-computed wrap. When set (≥ 1) the layout uses this many columns\n     * (clamped to the distinct column count) and wraps the remaining panels\n     * into as many rows as needed. Surfaced to hosts as the `facetColumns`\n     * chart property so users can dial the wrap in interactively; undefined =\n     * auto (fill the width).\n     */\n    facetColumns?: number;\n    /**\n     * Base pixels per discrete category at a 300px baseline canvas.\n     * Scaled proportionally with canvas size by the core layout engine.\n     * The final default step size is:\n     *\n     *   defaultStepSize = defaultBandSize × max(1, canvasSize/300)\n     *\n     * Backends set this to match their native bar/band rendering:\n     *   - VL:  ~20 (VL uses width:{step:N} which auto-sizes the plot area)\n     *   - EC:  ~20 (ECharts adds generous grid margins)\n     *   - CJS: ~30 (Chart.js fills the canvas; wider bands look more native)\n     *\n     * Templates can override via paramOverrides for chart types that need\n     * more space per band (e.g. jitter: 40, funnel: 50, sankey: 60).\n     *\n     * Default: 20.\n     */\n    defaultBandSize?: number;\n    /**\n     * Maximum pixels per discrete category at a 300px baseline canvas,\n     * scaled proportionally with canvas size (like {@link defaultBandSize}).\n     *\n     * This is the **sparse-expansion ceiling**. When few categories share a\n     * wide plot, each band grows to fill the available width but never past\n     * `maxBandSize`, so one or two bars can't balloon to the whole canvas.\n     * The band is thus clamped to `[minStep, maxBandSize]`:\n     *\n     *   step = clamp(availableWidth / N, minStep, maxBandSize)\n     *\n     * Backends set this to match their native sparse-bar rendering:\n     *   - VL:  = defaultBandSize (VL's step-based sizing doesn't fill a container)\n     *   - EC / CJS / Plotly: much larger (these fill their plot area natively)\n     *\n     * Defaults to {@link defaultBandSize} (no expansion beyond the base band).\n     */\n    maxBandSize?: number;\n    /**\n     * Backend-native base font size (px) for axis **tick labels**, at a 300px\n     * reference canvas. The core scales it subtly with canvas size and uses it\n     * as the ceiling of the shrink→rotate→cap ladder, so a chart never renders\n     * ticks below its backend's native scale on a comfortable canvas.\n     *\n     * Learned from each renderer's defaults:\n     *   - Vega-Lite: 10   - ECharts: 12   - Chart.js: 12   - Plotly: 12\n     *\n     * Default: 10.\n     */\n    baseLabelFontSize?: number;\n    /**\n     * Backend-native base font size (px) for **headers** (axis titles, legend,\n     * chart title), at a 300px reference canvas. Scaled subtly with canvas size\n     * (grows up to +4 on large canvases, shrinks toward the base in small\n     * multiples) so headers stay proportionate to the chart.\n     *\n     * Learned from each renderer's defaults:\n     *   - Vega-Lite: 11   - ECharts: 12   - Chart.js: 12   - Plotly: 14\n     *\n     * Default: 11.\n     */\n    baseTitleFontSize?: number;\n    /**\n     * When true, continuous X and Y axes stretch together using the\n     * larger of the two per-axis stretch factors. This preserves the\n     * aspect ratio of the data space. (default: false — axes stretch\n     * independently based on their own density.)\n     */\n    maintainContinuousAxisRatio?: boolean;\n    /**\n     * Gas-pressure tuning for continuous axes (default: scatter-plot settings).\n     * - A single number overrides markCrossSection (σ) for both axes.\n     * - An object allows per-axis σ plus optional elasticity / maxStretch:\n     *   `{ x: 100, y: 0, elasticity: 0.7, maxStretch: 2 }`\n     *   x/y = 0 means \"don't stretch this axis\".\n     *   Useful for line/area charts where horizontal crowding matters\n     *   far more than vertical.\n     */\n    continuousMarkCrossSection?: number | {\n        x: number;\n        y: number;\n        /** Per-axis stretch elasticity (default: 0.3). Higher → more responsive. */\n        elasticity?: number;\n        /** Per-axis stretch cap (default: 1.5). */\n        maxStretch?: number;\n        /**\n         * Which axis uses series-count-based pressure instead of pixel counting.\n         * - 'x' or 'y': that axis uses nSeries × σ / dim for pressure.\n         * - 'auto': auto-detect — in 2D (both continuous), defaults to 'y';\n         *   in 1D (one continuous + one discrete), uses the continuous axis.\n         * The σ for the series axis is used directly (not sqrt'd) since series\n         * count is inherently 1D.\n         */\n        seriesCountAxis?: 'x' | 'y' | 'auto';\n    };\n    /**\n     * Resistance to aspect-ratio distortion when faceting.\n     *\n     * When faceting divides one dimension (e.g. width by column count),\n     * the subplot aspect ratio drifts away from the single-plot ratio.\n     * Line and area charts are very sensitive to this because their\n     * visual signal is encoded in slopes and curve shapes.\n     *\n     * This parameter partially compensates by shrinking the undivided\n     * dimension so the panel aspect ratio stays closer to the original:\n     *\n     *   arDrift = facetedAR / baseAR          (< 1 when panel is narrower)\n     *   correctedDim = dim × arDrift ^ resistance\n     *\n     * - 0 (default): no correction — current behavior.\n     * - 0.3–0.5: moderate resistance (recommended for line / area).\n     * - 1: fully preserve the single-plot aspect ratio.\n     */\n    facetAspectRatioResistance?: number;\n    /**\n     * Whether to auto-wrap column-only facets into a 2D grid.\n     *\n     * When `true` (default), `computeFacetGrid` considers wrapping N\n     * column facets into multiple rows, choosing the layout whose\n     * overall aspect ratio best matches the canvas AR.\n     *\n     * When `false`, column-only facets stay in a single row (capped\n     * at the maximum that fits the canvas budget). Useful for small\n     * multiples that should always be side-by-side.\n     */\n    autoFacetWrap?: boolean;\n    /**\n     * Target aspect ratio for a single band (step height ÷ step width).\n     *\n     * When a banded (discrete) axis is opposite a continuous axis, each\n     * band has a natural AR = continuousAxisSize / stepSize.  If that\n     * exceeds the target, the continuous axis is shrunk via a log-space\n     * blend so bands don't become excessively tall/wide.\n     *\n     * - `undefined` / 0: no band-AR correction.\n     * - Typical values: 8–15 (VL default ≈ 10, ECharts ≈ 12).\n     *\n     * Only affects charts with exactly one banded axis and one\n     * continuous axis (e.g. bar, lollipop).  Has no effect on\n     * scatter, line, or fully-banded charts.\n     */\n    targetBandAR?: number;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChartEncoding, ChartTemplateDef } from './types';\n\n/**\n * Compose a template's encoding-action overrides onto the base encodings.\n *\n * Category-B quick options (sort, color scheme, aggregate, orientation, …) are\n * stored by the host as *configuration overrides* keyed by the action's `key`\n * inside `chartProperties` — exactly like a chart property. They are NOT written\n * into the encoding map. This function is where the compiler composes them:\n * for each `encodingAction` whose override is present, it applies the action's\n * `set(encodings, value)` to produce the transformed encodings that feed the\n * rest of assembly.\n *\n * Backends call this once, at the very top of `assemble`, so every downstream\n * phase (semantic resolution → overflow → layout → instantiate) — and the\n * `InstantiateContext.encodings` handed to templates — sees the transformed\n * encodings. The base `encodings` argument is never mutated.\n *\n * An absent override (`undefined`) means \"no override\" and is skipped, so the\n * base encoding value (whatever the encoding shelf set, if anything) stands.\n * Because the override key matches the action key, charts saved before this\n * mechanism — which stored e.g. `chartProperties.colorScheme` directly — are\n * picked up automatically with no separate legacy fallback.\n */\nexport function applyEncodingOverrides(\n    template: ChartTemplateDef,\n    encodings: Record<string, ChartEncoding>,\n    chartProperties?: Record<string, any>,\n): Record<string, ChartEncoding> {\n    const actions = template.encodingActions;\n    if (!actions || actions.length === 0 || !chartProperties) return encodings;\n\n    let result = encodings;\n    for (const action of actions) {\n        const override = chartProperties[action.key];\n        if (override !== undefined) {\n            result = action.set(result, override);\n        }\n    }\n    return result;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Central chart-type **transition registry** — the θ graph.\n *\n * This is the single source of truth for which sibling chart types a given chart\n * can re-render as (Control B / `θ` in the two-control transform model). It\n * replaces the per-template, per-backend inline `transitions` arrays: a chart\n * template no longer declares what it can turn into — the compiler looks the\n * edges up here by chart-type display name.\n *\n * Design notes (design-docs/chart-transform-two-axes.md §4, and the \"registry\"\n * discussion):\n *   - Edges are keyed by the *authored* chart type's display name.\n *   - Each edge is a CANDIDATE. It is still gated at runtime against the live\n *     encoding + data (route feasibility + the declarative gates on\n *     `PivotTransition`: requireOrderedAxis / requireNonNegative /\n *     maxCategoryCardinality / requireNoSeries / requireDiscreteSource /\n *     maxSourceCardinality) AND against backend availability (an edge is hidden\n *     when the target template does not exist in the active backend's registry).\n *   - So \"not all mappings make sense\" is handled twice: only sensible edges are\n *     declared here (the §4 catalog), and even a declared edge is withheld when\n *     the data / backend does not support it.\n *   - Edges should be *reversible*: if A → B is declared, B → A generally should\n *     be too (verified by tests), so a transform round-trips home.\n *\n * Grouped by data-signature family (design doc §4).\n */\n\nimport { PivotTransition } from './types';\n\nexport const CHART_TRANSITIONS: Record<string, PivotTransition[]> = {\n    // ── Categorical comparison — D × M (§4.1) ──────────────────────────────\n    'Bar Chart': [\n        // Ordered-axis bridge into the trend family (§4.9). Only when the domain\n        // axis is temporal/ordinal — an unordered nominal bar never sprouts a line.\n        // orientDomainAxis:'x' re-orients a horizontal bar so time stays horizontal.\n        { to: 'Line Chart', label: 'Line', requireOrderedAxis: true, orientDomainAxis: 'x' },\n        { to: 'Area Chart', label: 'Area', requireOrderedAxis: true, requireNonNegative: true, orientDomainAxis: 'x' },\n        // Same D×M signature, lighter ink.\n        { to: 'Lollipop Chart', label: 'Lollipop' },\n    ],\n    'Lollipop Chart': [\n        { to: 'Bar Chart', label: 'Bar' },\n    ],\n    'Grouped Bar Chart': [\n        {\n            to: 'Stacked Bar Chart',\n            label: 'Stacked',\n            route: { from: 'group', to: 'color', mode: 'move' },\n            requireDiscreteSource: true,\n        },\n        // A 2-sided grouped bar reads as a population pyramid (mirrored).\n        {\n            to: 'Pyramid Chart',\n            label: 'Pyramid',\n            route: { from: 'group', to: 'color', mode: 'move' },\n            requireDiscreteSource: true,\n            maxSourceCardinality: 2,\n        },\n    ],\n    'Stacked Bar Chart': [\n        {\n            to: 'Grouped Bar Chart',\n            label: 'Grouped',\n            route: { from: 'color', to: 'group', mode: 'move' },\n            requireDiscreteSource: true,\n            maxSourceCardinality: 12,\n        },\n    ],\n    // Population pyramid = a 2-sided category × measure; its complement is the\n    // side-by-side grouped bar (the 2 sides dodged instead of mirrored).\n    'Pyramid Chart': [\n        {\n            to: 'Grouped Bar Chart',\n            label: 'Grouped',\n            route: { from: 'color', to: 'group', mode: 'move' },\n            requireDiscreteSource: true,\n        },\n    ],\n\n    // ── Trend over an ordered domain — T × M (§4.2) ────────────────────────\n    'Line Chart': [\n        { to: 'Area Chart', label: 'Area', requireNonNegative: true },\n        // Back to discrete-period comparison; only readable with few ticks.\n        { to: 'Bar Chart', label: 'Bar', maxCategoryCardinality: 30 },\n        // Small-multiple trend strips (one per series) — needs a series. Route\n        // the series onto `color` (from wherever it sits — color OR a column/row\n        // facet) so the Sparkline template picks it up as its row series.\n        { to: 'Sparkline', label: 'Sparklines', requireSeries: true, route: { from: 'series', to: 'color', mode: 'move' } },\n    ],\n    'Area Chart': [\n        { to: 'Line Chart', label: 'Line' },\n        { to: 'Bar Chart', label: 'Bar', maxCategoryCardinality: 30 },\n        { to: 'Streamgraph', label: 'Stream', requireSeries: true, requireNonNegative: true, route: { from: 'series', to: 'color', mode: 'move' } },\n    ],\n    // Small-multiple trend table → a single overlaid multi-series line.\n    'Sparkline': [\n        { to: 'Line Chart', label: 'Line' },\n    ],\n    // Flowing composition → back to baseline-anchored trend / area. Both reads\n    // are safe; note Streamgraph → Line is intentionally *one-directional* (there\n    // is no Line → Streamgraph — see the note above).\n    'Streamgraph': [\n        { to: 'Area Chart', label: 'Area' },\n        { to: 'Line Chart', label: 'Line' },\n    ],\n\n    // ── Two-measure relationship — M₁ × M₂ (§4.3) ──────────────────────────\n    'Scatter Plot': [\n        {\n            to: 'Strip Plot',\n            label: 'Jitter',\n            route: { from: 'series', to: 'x', mode: 'swap', spill: 'color' },\n        },\n        // Add a fitted trend layer over the same cloud — only a clean\n        // two-measure scatter (both axes quantitative, no size bubble).\n        { to: 'Regression', label: 'Trend', requireBiaxialMeasure: true, requireNoSize: true },\n    ],\n    'Regression': [\n        { to: 'Scatter Plot', label: 'Scatter' },\n    ],\n    'Strip Plot': [\n        {\n            to: 'Scatter Plot',\n            label: 'Scatter',\n            route: { from: 'color', to: 'x', mode: 'swap', spill: 'color' },\n        },\n        // A strip plot is a per-category distribution: box (summary) + violin\n        // (density) are the same {x:category, y:measure} layout, no route.\n        { to: 'Boxplot', label: 'Box' },\n        { to: 'Violin Plot', label: 'Violin' },\n    ],\n\n    // ── Univariate distribution — M (§4.4) ─────────────────────────────────\n    'Histogram': [\n        { to: 'Density Plot', label: 'Density' },\n        { to: 'ECDF Plot', label: 'ECDF' },\n    ],\n    'Density Plot': [\n        { to: 'Histogram', label: 'Histogram' },\n        { to: 'ECDF Plot', label: 'ECDF' },\n    ],\n    'ECDF Plot': [\n        { to: 'Histogram', label: 'Histogram' },\n        { to: 'Density Plot', label: 'Density' },\n    ],\n    'Boxplot': [\n        { to: 'Violin Plot', label: 'Violin' },\n        { to: 'Strip Plot', label: 'Strip' },\n    ],\n    'Violin Plot': [\n        { to: 'Boxplot', label: 'Box' },\n        { to: 'Strip Plot', label: 'Strip' },\n    ],\n};\n\n/**\n * Look up the candidate θ transitions for a chart type (by display name).\n * Returns an empty array when the chart declares none.\n */\nexport function getChartTransitions(chart: string | undefined): PivotTransition[] {\n    if (!chart) return [];\n    return CHART_TRANSITIONS[chart] ?? [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart pivot — a derived Category-B operator that re-routes encoding *fields*\n * across position/legend/facet *channels* to surface alternative views of the\n * same semantic spec (orientation swap, series↔axis role swap, facet split).\n *\n * The host stores the chosen pivot *state id* as a single override keyed by\n * `PivotDef.key` (default `'pivot'`) inside `chart_spec.chartProperties`, exactly\n * like any other encoding action. The compiler — not the host — owns the channel\n * permutation: at assemble time it enumerates the valid states for the current\n * encodings + data, picks the stored id (falling back to the identity state when\n * the id is stale or absent), and composes the resulting encoding map BEFORE the\n * rest of the pipeline runs (so sort/overflow/layout all resolve post-pivot).\n *\n * This module is intentionally backend-agnostic: it operates purely on the\n * abstract `ChartEncoding` map + the raw data table, so the same enumeration\n * drives Vega-Lite, ECharts and Chart.js.\n *\n * MVP linearization. The full design models the pivot states as the orbit of a\n * channel-permutation group, linearized by a Gray code so adjacent steps differ\n * by one generator. This first increment exposes a curated *star* of single-\n * generator views around the authored identity (identity → orientation → role →\n * facet), which is a valid finite cycle (Z/n over the ordered list) that always\n * returns to the authored view. Richer products land later.\n *\n * Role-swap has two type-preserving flavors: discrete↔color-hue (a category\n * moves between a banded axis and the legend — bars/lines) and, on position\n * marks only, measure↔(color-gradient | size) (a quantitative field moves\n * between a precise position axis and a demoted auxiliary channel — scatter).\n *\n * Two distinct group actions drive the channel moves, matching the design doc:\n *   - τ (transpose): flip two axis *slots* wholesale (`x↔y` orientation). Profile-\n *     agnostic, always occupancy-preserving — declared via `PivotDef.transpose`.\n *   - σ (permute): reassign a *field* to a same-profile channel (axis ↔ color/size)\n *     — declared via `PivotDef.permute`, admitted by the Young-block profile rule.\n * Keeping them separate is what lets the must-present guard drop out entirely.\n */\n\nimport { ChartEncoding, ChartTemplateDef, PivotDef, PivotTransition } from './types';\nimport { getChartTransitions } from './chart-transitions';\n\n/** Resolved pivot surface attached to the assembled spec as `_pivot`. */\nexport interface PivotSurface {\n    key: string;\n    label: string;\n    /** Number of states in the cycle (>= 2 when a control should show). */\n    length: number;\n    /** Index of the active state within `ids`. */\n    index: number;\n    /** Ordered state ids; `ids[0]` is always the identity (authored) view. */\n    ids: string[];\n    /** Parallel human labels for each state. */\n    labels: string[];\n}\n\n/** A redundant identity encoding added by a local Arrange operator. */\nexport interface EncodingAugmentation {\n    kind: 'facet-identity';\n    sourceChannel: 'color' | 'group';\n    facetChannel: 'column' | 'row';\n    colorEncoding: ChartEncoding;\n}\n\n/** Internal: a fully enumerated pivot for a given encoding map + data. */\nexport interface PivotComputation {\n    key: string;\n    label: string;\n    ids: string[];\n    labels: string[];\n    statesById: Record<string, Record<string, ChartEncoding>>;\n    augmentationById: Record<string, EncodingAugmentation | undefined>;\n    /**\n     * Chart-type override per state id, set only for chart-type *transition*\n     * states (§4.6). Absent/undefined entries render with the authored template.\n     */\n    chartTypeById: Record<string, string | undefined>;\n}\n\nconst DISCRETE_TYPES = new Set(['nominal', 'ordinal']);\n\nfunction isDiscrete(enc: ChartEncoding | undefined): boolean {\n    return !!enc?.field && !!enc.type && DISCRETE_TYPES.has(enc.type);\n}\n\nfunction isMeasure(enc: ChartEncoding | undefined): boolean {\n    return !!enc?.field && (enc.type === 'quantitative' || !!enc.aggregate);\n}\n\nfunction isTemporal(enc: ChartEncoding | undefined): boolean {\n    return enc?.type === 'temporal';\n}\n\n/**\n * Whether a temporal position axis is rendered as discrete *bands* (so it acts\n * as a category for pivot purposes) rather than a continuous time scale. Length\n * marks (bars/histograms) and color marks (heatmaps) band their categorical\n * axis; only position marks (line/area/scatter) lay time out continuously, where\n * \"time stays horizontal\" is the convention we preserve.\n */\nfunction temporalActsDiscrete(template: ChartTemplateDef): boolean {\n    return template.markCognitiveChannel !== 'position';\n}\n\nfunction clone(encodings: Record<string, ChartEncoding>): Record<string, ChartEncoding> {\n    const out: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(encodings)) {\n        out[ch] = { ...enc };\n    }\n    return out;\n}\n\nfunction distinctCount(data: any[], field: string | undefined): number {\n    if (!field || !Array.isArray(data)) return 0;\n    const seen = new Set<unknown>();\n    for (const row of data) {\n        if (row && row[field] != null) seen.add(row[field]);\n    }\n    return seen.size;\n}\n\n/** Build the standard cartesian pivot declaration from its permissible domains. */\nexport function makeCartesianPivot(opts: Partial<PivotDef> = {}): PivotDef {\n    return {\n        key: opts.key ?? 'pivot',\n        label: opts.label ?? 'View',\n        transpose: opts.transpose ?? [],\n        permute: opts.permute ?? [],\n        shift: opts.shift ?? [],\n        facetBudget: opts.facetBudget ?? 12,\n        transitions: opts.transitions,\n    };\n}\n\n/**\n * Canonical channel order so a swap pair has a stable id/label regardless of the\n * order it was declared in (e.g. `['color','x']` is normalized to `x ↔ color`).\n */\nconst CHANNEL_ORDER = ['x', 'y', 'color', 'size', 'group', 'column', 'row'];\nfunction orderPair(a: string, b: string): [string, string] {\n    const ia = CHANNEL_ORDER.indexOf(a);\n    const ib = CHANNEL_ORDER.indexOf(b);\n    return (ia <= ib ? [a, b] : [b, a]) as [string, string];\n}\n\n/**\n * Human-friendly channel names for the arrange labels shown in the UI (the\n * dropdown/switcher). Keeps the stored *ids* untouched — only the display text.\n */\nconst CHANNEL_DISPLAY: Record<string, string> = {\n    x: 'X',\n    y: 'Y',\n    color: 'Color',\n    size: 'Size',\n    group: 'Groups',\n    column: 'Columns',\n    row: 'Rows',\n    detail: 'Detail',\n    opacity: 'Opacity',\n};\nfunction chDisplay(ch: string): string {\n    return CHANNEL_DISPLAY[ch] ?? ch.charAt(0).toUpperCase() + ch.slice(1);\n}\n\n/** The set of channels whose bound field differs between two encodings. */\nfunction changedChannels(\n    a: Record<string, ChartEncoding>,\n    b: Record<string, ChartEncoding>,\n): Set<string> {\n    const out = new Set<string>();\n    for (const ch of new Set([...Object.keys(a), ...Object.keys(b)])) {\n        if (a[ch]?.field !== b[ch]?.field) out.add(ch);\n    }\n    return out;\n}\n\n/**\n * Transpose generator (τ): exchange two axis *slots* wholesale (`x↔y`). This is\n * the orientation/flip — it carries each channel's full encoding to the other,\n * so it is profile-agnostic (category↔measure on a bar, measure↔measure on a\n * scatter, dimension↔dimension on a heatmap). It is suppressed only when a\n * continuous-temporal position axis must stay horizontal (line/area keep time on\n * `x`). Because both slots stay occupied it can never drop a required channel.\n * Returns `null` when either slot is unbound or the temporal-horizontal rule\n * blocks the flip.\n */\nfunction transposeState(\n    base: Record<string, ChartEncoding>,\n    template: ChartTemplateDef,\n    pair: [string, string],\n): { id: string; label: string; enc: Record<string, ChartEncoding> } | null {\n    const [a, b] = orderPair(pair[0], pair[1]);\n    const ea = base[a];\n    const eb = base[b];\n    if (!ea?.field || !eb?.field) return null; // both slots must be bound\n    // Keep a continuous-temporal axis horizontal (no vertical time on position marks).\n    if (!temporalActsDiscrete(template) && (isTemporal(ea) || isTemporal(eb))) return null;\n    const next = clone(base);\n    next[a] = { ...eb };\n    next[b] = { ...ea };\n    return { id: `flip:${a}-${b}`, label: `${chDisplay(a)} ⇄ ${chDisplay(b)}`, enc: next };\n}\n\ntype ChannelProfile = 'measure' | 'category' | 'time';\n\n/**\n * The profile a bound field presents on a channel: `measure` (quantitative or\n * aggregated), `category` (discrete, or a temporal axis the chart bands), or\n * `time` (continuous temporal). Two channels may exchange fields under {@link\n * permuteSwapState} only when their profiles match — the Young-block rule.\n */\nfunction channelProfile(enc: ChartEncoding | undefined, template: ChartTemplateDef): ChannelProfile | null {\n    if (!enc?.field) return null;\n    if (isMeasure(enc)) return 'measure';\n    if (isDiscrete(enc) || (isTemporal(enc) && temporalActsDiscrete(template))) return 'category';\n    return 'time';\n}\n\n/**\n * Permute generator (σ): reassign a field between a position *axis* and an\n * *auxiliary* channel (`color`/`size`), admitting the swap only when both ends\n * share a {@link channelProfile} — the Young-block rule. This single predicate\n * subsumes the old measure↔measure and category↔color cases:\n *   - `measure` profile: position marks only (a bar's length-measure is privileged\n *     and never demotes to color/size); the peer quantities trade the precise axis.\n *   - `category` profile: the auxiliary must be `color` (only it carries a discrete\n *     series); the banded axis dimension and the legend series exchange places.\n * `x↔y` is handled by {@link transposeState}, not here, and pure auxiliary pairs\n * (`color↔size`) are never offered. No must-present guard is needed: both ends are\n * already bound, so the swap preserves occupancy by construction.\n * Returns `null` when no profile-preserving interpretation admits the pair.\n */\nfunction permuteSwapState(\n    base: Record<string, ChartEncoding>,\n    template: ChartTemplateDef,\n    pair: [string, string],\n): { id: string; label: string; enc: Record<string, ChartEncoding> } | null {\n    const [a, b] = orderPair(pair[0], pair[1]);\n    // Canonical ordering keeps a position axis as `a`; the auxiliary is `b`.\n    const posCh = a === 'x' || a === 'y' ? a : null;\n    const auxCh = b;\n    if (!posCh || (auxCh !== 'color' && auxCh !== 'size')) return null;\n    const posEnc = base[posCh];\n    const auxEnc = base[auxCh];\n    if (!posEnc?.field || !auxEnc?.field) return null; // both ends must be bound\n    if (posEnc.field === auxEnc.field) return null;\n\n    const profile = channelProfile(posEnc, template);\n    if (!profile || profile !== channelProfile(auxEnc, template)) return null; // different profile\n\n    const id = `swap:${a}-${b}`;\n    const label = `${chDisplay(a)} ⇄ ${chDisplay(b)}`;\n\n    if (profile === 'measure') {\n        // Demoting a measure to an aux channel only reads on position marks; on a\n        // length mark (bar) the value axis is privileged. Carry only the semantic\n        // core so downstream assembly re-derives scales/schemes per channel.\n        if (template.markCognitiveChannel !== 'position') return null;\n        const next = clone(base);\n        next[posCh] = measureCore(auxEnc);\n        next[auxCh] = measureCore(posEnc);\n        return { id, label, enc: next };\n    }\n\n    if (profile === 'category') {\n        // Only `color` carries a discrete series to exchange with a banded axis.\n        if (auxCh !== 'color') return null;\n        const next = clone(base);\n        next[posCh] = { ...auxEnc };\n        next.color = { ...posEnc };\n        return { id, label, enc: next };\n    }\n\n    return null; // continuous time does not demote to an auxiliary channel\n}\nfunction measureCore(enc: ChartEncoding): ChartEncoding {\n    const core: ChartEncoding = { field: enc.field, type: enc.type };\n    if (enc.aggregate) core.aggregate = enc.aggregate;\n    return core;\n}\n\n/**\n * Default grouping channels a discrete *series* field can occupy, used to locate\n * the current series when a transition references the `'series'` sentinel. The\n * shiftable domain offered to the user is the template's declared `shift` list\n * (filtered against these semantics); this constant is the resolution fallback.\n */\nconst GROUPING_CHANNELS = ['color', 'group', 'column', 'row'];\n\n/** Per-target budgets: facets allow more panels than a color/dodge legend. */\nfunction routeBudget(target: string, facetBudget: number): number {\n    if (target === 'column' || target === 'row') return facetBudget;\n    if (target === 'group') return 12; // dodged sub-bars get cramped past ~12\n    return 20; // color legend\n}\n\n/** Operator label for routing the series from its current channel onto another. */\nfunction routeLabel(from: string, to: string): string {\n    return `${chDisplay(from)} ⇄ ${chDisplay(to)}`;\n}\n\n/** Locate a discrete series for chart-type transition routing. */\nfunction findTransitionSeries(\n    base: Record<string, ChartEncoding>,\n    candidates: string[],\n    channels: string[],\n): { channel: string; enc: ChartEncoding } | null {\n    for (const channel of candidates) {\n        if (channels.includes(channel) && isDiscrete(base[channel])) {\n            return { channel, enc: base[channel]! };\n        }\n    }\n    return null;\n}\n\n/**\n * Identity channels augment onto empty facets; facet channels shift normally.\n * Keeping the sources independent avoids destructive color-to-facet moves and\n * lets a chart with both color and column offer two distinct row alternatives.\n */\nfunction seriesRoutingStates(\n    base: Record<string, ChartEncoding>,\n    template: ChartTemplateDef,\n    data: any[],\n    shiftChannels: string[],\n    facetBudget: number,\n    preferredFacet?: 'column' | 'row',\n): { id: string; enc: Record<string, ChartEncoding>; label: string; augmentation?: EncodingAugmentation }[] {\n    const channels = template.channels ?? [];\n    const out: { id: string; enc: Record<string, ChartEncoding>; label: string; augmentation?: EncodingAugmentation }[] = [];\n\n    const identitySource: 'color' | 'group' | undefined = isDiscrete(base.color)\n        ? 'color'\n        : (!base.color?.field && isDiscrete(base.group) ? 'group' : undefined);\n    if (identitySource && shiftChannels.includes(identitySource) && channels.includes(identitySource)) {\n        const identityEncoding = base[identitySource]!;\n        const card = distinctCount(data, identityEncoding.field);\n        const facetTargets = preferredFacet ? [preferredFacet] : ['column', 'row'] as const;\n        for (const target of facetTargets) {\n            if (!shiftChannels.includes(target) || !channels.includes(target)) continue;\n            if (base[target]?.field || card > routeBudget(target, facetBudget)) continue;\n            const next = clone(base);\n            delete next[identitySource];\n            next[target] = { ...identityEncoding };\n            out.push({\n                id: `augment:${target}`,\n                enc: next,\n                label: `Color + ${chDisplay(target)}`,\n                augmentation: {\n                    kind: 'facet-identity',\n                    sourceChannel: identitySource,\n                    facetChannel: target,\n                    colorEncoding: { ...identityEncoding },\n                },\n            });\n        }\n    }\n\n    const facetSource = (['column', 'row'] as const).find(channel =>\n        shiftChannels.includes(channel) && channels.includes(channel) && isDiscrete(base[channel]),\n    );\n    if (facetSource) {\n        const facetEncoding = base[facetSource]!;\n        const card = distinctCount(data, facetEncoding.field);\n        for (const target of shiftChannels) {\n            if (target === facetSource || target === 'group') continue;\n            if ((target === 'column' || target === 'row') && preferredFacet && target !== preferredFacet) continue;\n            if (!channels.includes(target) || base[target]?.field) continue;\n            if (card > routeBudget(target, facetBudget)) continue;\n            const next = clone(base);\n            delete next[facetSource];\n            next[target] = { ...facetEncoding };\n            out.push({ id: `series:${target}`, enc: next, label: routeLabel(facetSource, target) });\n        }\n    }\n    return out;\n}\n\n/** Preferred small-multiple direction for the compact dynamic Arrange surface. */\nfunction preferredFacetTarget(base: Record<string, ChartEncoding>): 'column' | 'row' {\n    const domain = domainAxisEnc(base);\n    return domain === base.y ? 'row' : 'column';\n}\n\n/** Facet channel newly targeted by a composed transformation, if any. */\nfunction changedFacetTarget(\n    authored: Record<string, ChartEncoding>,\n    transformed: Record<string, ChartEncoding>,\n): 'column' | 'row' | undefined {\n    for (const channel of ['column', 'row'] as const) {\n        if (transformed[channel]?.field && transformed[channel]?.field !== authored[channel]?.field) {\n            return channel;\n        }\n    }\n    return undefined;\n}\n\n/**\n * The *domain* position axis encoding — the non-measure x/y (a category/time\n * axis). Prefers whichever position channel is not a measure.\n */\nfunction domainAxisEnc(base: Record<string, ChartEncoding>): ChartEncoding | undefined {\n    if (base.x?.field && !isMeasure(base.x)) return base.x;\n    if (base.y?.field && !isMeasure(base.y)) return base.y;\n    return undefined;\n}\n\n/** The *measure* position axis encoding — the quantitative/aggregated x/y. */\nfunction measureAxisEnc(base: Record<string, ChartEncoding>): ChartEncoding | undefined {\n    if (base.x?.field && isMeasure(base.x)) return base.x;\n    if (base.y?.field && isMeasure(base.y)) return base.y;\n    return undefined;\n}\n\n/**\n * Evaluate a transition's declarative *data-characteristic* gates against the\n * authored encoding + data (design-docs/chart-transform-two-axes.md §4.9.3).\n * These are the \"not all mappings make sense\" guards: a candidate edge is only\n * offered when the shared fields actually support the sibling's reading.\n */\nfunction transitionGatesPass(\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    t: PivotTransition,\n): boolean {\n    if (t.requireOrderedAxis) {\n        const domain = domainAxisEnc(base);\n        // Ordered = temporal or ordinal; plain nominal never qualifies.\n        if (!domain || !(domain.type === 'temporal' || domain.type === 'ordinal')) return false;\n    }\n    if (t.requireNonNegative) {\n        const measure = measureAxisEnc(base);\n        if (measure?.field) {\n            for (const row of data) {\n                const v = row?.[measure.field];\n                if (typeof v === 'number' && v < 0) return false;\n            }\n        }\n    }\n    if (t.maxCategoryCardinality != null) {\n        const domain = domainAxisEnc(base);\n        if (domain?.field && distinctCount(data, domain.field) > t.maxCategoryCardinality) return false;\n    }\n    if (t.requireNoSeries) {\n        for (const ch of GROUPING_CHANNELS) {\n            if (isDiscrete(base[ch])) return false;\n        }\n    }\n    if (t.requireSeries) {\n        const seriesChannels = ['color', 'group', 'detail', 'column', 'row'];\n        if (!seriesChannels.some((ch) => isDiscrete(base[ch]))) return false;\n    }\n    if (t.requireBiaxialMeasure) {\n        if (!isMeasure(base.x) || !isMeasure(base.y)) return false;\n    }\n    if (t.requireNoSize) {\n        if (base.size?.field) return false;\n    }\n    return true;\n}\n\n/**\n * Build the encoding map for a chart-type *transition* (§4.6). A transition\n * re-views the same data as a sibling chart type, optionally re-routing one\n * field across channels first. Returns `null` when the transition's constraints\n * (source presence, discreteness, cardinality budget, target occupancy) are not\n * met. The `chartType` it returns tells the compiler to re-select the sibling\n * template for rendering while the authored chartType / encodings stay intact.\n */\nfunction transitionState(\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    template: ChartTemplateDef,\n    t: PivotTransition,\n): { enc: Record<string, ChartEncoding>; chartType: string; label: string } | null {\n    if (!transitionGatesPass(base, data, t)) return null;\n    const enc = clone(base);\n    const route = t.route;\n    if (route) {\n        // Resolve the source channel. `'series'` finds the discrete grouping\n        // field wherever it sits (color/column/row); a literal name is used as-is.\n        const fromCh = route.from === 'series'\n            ? findTransitionSeries(base, GROUPING_CHANNELS, template.channels ?? [])?.channel\n            : route.from;\n        if (!fromCh) return null;\n        const srcEnc = base[fromCh];\n        if (!srcEnc?.field) return null; // nothing to re-route\n        if (t.requireDiscreteSource && !isDiscrete(srcEnc)) return null;\n        if (t.maxSourceCardinality != null &&\n            distinctCount(data, srcEnc.field) > t.maxSourceCardinality) return null;\n        const mode = route.mode ?? 'move';\n        const dstEnc = base[route.to];\n        if (mode === 'swap') {\n            // The source field takes the target channel; the field displaced from\n            // the target spills to `spill` (default: the vacated source channel).\n            const spillCh = route.spill ?? fromCh;\n            // Don't clobber an unrelated field already sitting on the spill slot.\n            if (spillCh !== fromCh && base[spillCh]?.field) return null;\n            enc[route.to] = { ...srcEnc };\n            delete enc[fromCh];\n            if (dstEnc?.field) enc[spillCh] = { ...dstEnc };\n            else delete enc[spillCh];\n        } else {\n            // move: bring the source field onto the target channel. If it is\n            // already there (from === to, e.g. `series` resolved to the target),\n            // it's a no-op; otherwise the target must be empty so we don't clobber.\n            if (fromCh !== route.to) {\n                if (dstEnc?.field) return null;\n                delete enc[fromCh];\n                enc[route.to] = { ...srcEnc };\n            }\n        }\n    }\n    // Re-orient the domain axis for the sibling if requested (bar → line/area):\n    // a horizontal bar carries the ordered/temporal domain on `y`, but a line\n    // pins it to the horizontal — swap x/y wholesale so we never render a\n    // vertical line chart.\n    if (t.orientDomainAxis) {\n        const target = t.orientDomainAxis;\n        const other = target === 'x' ? 'y' : 'x';\n        const domainOnOther = !!enc[other]?.field && !isMeasure(enc[other]);\n        const targetFreeForDomain = !enc[target]?.field || isMeasure(enc[target]);\n        if (domainOnOther && targetFreeForDomain) {\n            const a = enc[target];\n            const b = enc[other];\n            if (b) enc[target] = { ...b }; else delete enc[target];\n            if (a) enc[other] = { ...a }; else delete enc[other];\n        }\n    }\n    return { enc, chartType: t.to, label: t.label };\n}\n\n/**\n * A single applied generator (one step / one \"delta\"): the abstract operator\n * δ ∈ {σ, γ, θ} re-expressed as a concrete neighbor of a given encoding under a\n * given template. `id` is the step token used to build composite path ids,\n * `label` is its operator notation, and `chartType` is set only for θ steps.\n */\ninterface PivotStep {\n    id: string;\n    label: string;\n    enc: Record<string, ChartEncoding>;\n    chartType?: string;\n    augmentation?: EncodingAugmentation;\n}\n\n/**\n * Enumerate the *one-step* neighbors of an encoding under a template's pivot\n * def — the generators δ applicable to `enc` right now. This is the building\n * block of the runtime orbit walk: the same enumerator runs on every reachable\n * state, so composing transforms is just \"apply one more δ\". The generators are\n * pure functions of the passed encoding (not the authored base), which is what\n * lets γ∘σ, σ∘θ, … fall out without any special-casing.\n */\nfunction pivotSteps(\n    template: ChartTemplateDef,\n    enc: Record<string, ChartEncoding>,\n    data: any[],\n    opts?: { local?: boolean; transitions?: boolean; preferFacetTarget?: boolean },\n    resolveTemplate?: (chartType: string) => ChartTemplateDef | undefined,\n): PivotStep[] {\n    const def = template.pivot;\n    if (!def) return [];\n    const includeLocal = opts?.local !== false;\n    const includeTransitions = opts?.transitions !== false;\n    const steps: PivotStep[] = [];\n    // τ: each declared axis-slot pair contributes its wholesale flip (orientation).\n    if (includeLocal) for (const pair of def.transpose ?? []) {\n        if (pair.length !== 2) continue;\n        const s = transposeState(enc, template, [pair[0], pair[1]]);\n        if (s) steps.push({ id: s.id, label: s.label, enc: s.enc });\n    }\n    // σ: each permutable block contributes its within-block axis↔aux field swaps as\n    // candidate one-step moves; the orbit BFS composes them to close the block's\n    // symmetric group. Profile-mismatched pairs return null and are dropped.\n    if (includeLocal) for (const block of def.permute ?? []) {\n        for (let i = 0; i < block.length; i++) {\n            for (let j = i + 1; j < block.length; j++) {\n                const s = permuteSwapState(enc, template, [block[i], block[j]]);\n                if (s) steps.push({ id: s.id, label: s.label, enc: s.enc });\n            }\n        }\n    }\n    if (includeLocal && def.shift && def.shift.length) {\n        const preferredFacet = opts?.preferFacetTarget ? preferredFacetTarget(enc) : undefined;\n        for (const s of seriesRoutingStates(enc, template, data, def.shift, def.facetBudget ?? 12, preferredFacet)) {\n            steps.push({ id: s.id, label: s.label, enc: s.enc, augmentation: s.augmentation });\n        }\n    }\n    // θ: chart-type transitions are sourced from the CENTRAL registry (keyed by\n    // the template's chart name), not the template itself — a template no longer\n    // declares what it can turn into. A candidate edge is emitted only when its\n    // target template exists in the active backend (via `resolveTemplate`, when\n    // supplied); the per-edge data gates run inside transitionState.\n    if (includeTransitions) {\n        for (const t of getChartTransitions(template.chart)) {\n            if (resolveTemplate && !resolveTemplate(t.to)) continue; // backend can't render it\n            const st = transitionState(enc, data, template, t);\n            // Operator notation: θ = chart-type transition, subscripted by the target view.\n            if (st) steps.push({ id: `type:${t.to}`, label: `θ_→${t.label.toLowerCase()}`, enc: st.enc, chartType: st.chartType });\n        }\n    }\n    return steps;\n}\n\n/**\n * Canonical fingerprint of an encoding map (+ effective chart type) used to\n * dedup orbit states. Two paths that land on the same channel→field assignment\n * collapse to one state — this is the group *stabilizer* quotient (e.g. σ∘σ = id\n * folds back onto `default`; faceting then jittering reaches the same strip plot\n * as jittering directly). Only the semantic core (field/type/aggregate) and the\n * occupied channel set matter; cosmetic encoding props are ignored.\n */\nfunction encodingKey(enc: Record<string, ChartEncoding>, chartType: string | undefined): string {\n    const cells = Object.keys(enc)\n        .filter((ch) => enc[ch]?.field)\n        .sort()\n        .map((ch) => {\n            const e = enc[ch];\n            return `${ch}=${e.field}/${e.type ?? ''}/${e.aggregate ?? ''}`;\n        });\n    return `${chartType ?? ''}::${cells.join(',')}`;\n}\n\n/**\n * Reject orbit states that would be structurally invalid for their (effective)\n * template — primarily the cartesian invariant that a chart with both `x` and\n * `y` channels must keep *both* position axes bound (a scatter/line/bar with a\n * missing x or y is not a renderable view). This guards composed paths from\n * walking into degenerate encodings even if an individual generator is locally\n * type-preserving.\n */\nfunction isRenderableState(template: ChartTemplateDef, enc: Record<string, ChartEncoding>): boolean {\n    const channels = template.channels ?? [];\n    if (channels.includes('x') && channels.includes('y')) {\n        if (!enc.x?.field || !enc.y?.field) return false;\n    }\n    return true;\n}\n\n/** Hard cap on orbit size so a rich generator set can't produce an unwieldy control. */\nconst MAX_PIVOT_STATES = 12;\n\n/**\n * Enumerate the pivot states for an encoding map + data under a template's\n * `PivotDef` by walking the *orbit* of the generators at runtime: start from the\n * authored identity and repeatedly apply one more δ (breadth-first), deduping by\n * {@link encodingKey} (the stabilizer quotient) and rejecting non-renderable\n * states (see {@link isRenderableState}). State ids are operator *paths* (e.g.\n * `orient|series:row`, `type:Strip Plot`); labels compose the per-step operator\n * notation with `·`. Returns `null` when no template pivot is declared. The\n * identity (authored) view is always state 0; a control should only render when\n * `ids.length > 1`.\n *\n * `resolveTemplate` lets the walk cross θ (chart-type) edges: after a transition\n * switches `chartType`, subsequent generators come from the *target* template's\n * pivot def. Backends that omit it leave θ states as leaves (no composition past\n * a chart-type change).\n */\nexport function computePivot(\n    template: ChartTemplateDef,\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    resolveTemplate?: (chartType: string) => ChartTemplateDef | undefined,\n    opts?: { includeTransitions?: boolean; key?: string; label?: string; preferFacetTarget?: boolean },\n): PivotComputation | null {\n    const def = template.pivot;\n    if (!def) return null;\n    const key = opts?.key ?? def.key ?? 'pivot';\n    const label = opts?.label ?? def.label ?? 'View';\n    const includeTransitions = opts?.includeTransitions !== false;\n\n    const ids: string[] = ['default'];\n    const labels: string[] = ['Default'];\n    const statesById: Record<string, Record<string, ChartEncoding>> = {\n        default: clone(base),\n    };\n    const augmentationById: Record<string, EncodingAugmentation | undefined> = {\n        default: undefined,\n    };\n    const chartTypeById: Record<string, string | undefined> = {\n        default: undefined,\n    };\n\n    interface OrbitNode {\n        id: string;\n        label: string;\n        enc: Record<string, ChartEncoding>;\n        chartType: string | undefined;\n        template: ChartTemplateDef;\n        augmentation: EncodingAugmentation | undefined;\n    }\n\n    const seen = new Set<string>([encodingKey(base, undefined)]);\n    const queue: OrbitNode[] = [{ id: 'default', label: 'Default', enc: clone(base), chartType: undefined, template, augmentation: undefined }];\n    // The authored chart type *is* home: a θ path that lands back on it (e.g.\n    // Stacked → Grouped → Stacked) is not a new view, so we normalize its\n    // effective chartType to `undefined`. This lets the stabilizer dedup fold\n    // such round-trips onto the identity instead of showing them as extra states.\n    const authoredChart = template.chart;\n\n    while (queue.length > 0 && ids.length < MAX_PIVOT_STATES) {\n        const cur = queue.shift()!;\n        for (const step of pivotSteps(cur.template, cur.enc, data, {\n            local: true,\n            transitions: includeTransitions,\n            preferFacetTarget: opts?.preferFacetTarget,\n        }, resolveTemplate)) {\n            // A θ step switches the effective chart type (and thus the template\n            // whose generators apply next); σ/γ steps stay on the current one.\n            let nextChartType = step.chartType ?? cur.chartType;\n            if (nextChartType === authoredChart) nextChartType = undefined; // back home\n            // A θ step switches the effective template (and thus the generators\n            // that apply next). When no resolver is supplied — or it can't resolve\n            // the target — the θ state becomes a *leaf*: we strip its pivot so no\n            // further (wrong-template) generators compose past the chart-type\n            // change. σ/γ/τ steps stay on the current template.\n            const resolved = step.chartType ? resolveTemplate?.(step.chartType) : undefined;\n            const nextTemplate: ChartTemplateDef = step.chartType\n                ? (resolved ?? { ...cur.template, pivot: undefined })\n                : cur.template;\n            if (!isRenderableState(nextTemplate, step.enc)) continue; // avoid invalid combos\n            if (opts?.preferFacetTarget) {\n                const facetTarget = changedFacetTarget(base, step.enc);\n                if (facetTarget && facetTarget !== preferredFacetTarget(step.enc)) continue;\n            }\n            // Drop OVERLAPPING arrangement compositions. Composing two generators\n            // that touch a shared channel yields a confusing 3-cycle (flip X⇄Y then\n            // swap Y⇄Color rotates all three axes, not a clean pairwise swap). We\n            // only compose steps whose moved channels are DISJOINT from what the\n            // path already moved — so every state is a single generator or an\n            // INDEPENDENT combo. The generators themselves are unchanged (the\n            // overlapping states still exist in theory), we just don't enumerate them.\n            if (step.chartType === undefined && cur.id !== 'default') {\n                const already = changedChannels(base, cur.enc);\n                const now = changedChannels(cur.enc, step.enc);\n                let overlaps = false;\n                for (const ch of now) {\n                    if (already.has(ch)) { overlaps = true; break; }\n                }\n                if (overlaps) continue;\n            }\n            const fp = encodingKey(step.enc, nextChartType);\n            if (seen.has(fp)) continue; // dedup (stabilizer)\n            seen.add(fp);\n            const id = cur.id === 'default' ? step.id : `${cur.id}|${step.id}`;\n            // Compositions are now always DISJOINT (see the overlap guard above),\n            // so a plain operator join reads cleanly with no double-counted channel\n            // (e.g. `X ⇄ Y · Color ⇄ Columns`). θ states join the same way.\n            const stepLabel = cur.id === 'default' ? step.label : `${cur.label} · ${step.label}`;\n            ids.push(id);\n            labels.push(stepLabel);\n            statesById[id] = step.enc;\n            chartTypeById[id] = nextChartType;\n            const augmentation = step.chartType\n                ? undefined\n                : (step.augmentation ?? cur.augmentation);\n            augmentationById[id] = augmentation;\n            queue.push({ id, label: stepLabel, enc: step.enc, chartType: nextChartType, template: nextTemplate, augmentation });\n            if (ids.length >= MAX_PIVOT_STATES) break;\n        }\n    }\n\n    return { key, label, ids, labels, statesById, augmentationById, chartTypeById };\n}\n\n/**\n * Resolve the active pivot state for the stored override and return both the\n * transformed encodings and the serializable surface (or the untouched base\n * encodings + `undefined` surface when no multi-state pivot applies).\n */\nexport function applyPivot(\n    template: ChartTemplateDef,\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    chartProperties: Record<string, any> | undefined,\n    resolveTemplate?: (chartType: string) => ChartTemplateDef | undefined,\n): { encodings: Record<string, ChartEncoding>; augmentation: EncodingAugmentation | undefined; chartType: string | undefined; surface: PivotSurface | undefined } {\n    const comp = computePivot(template, base, data, resolveTemplate);\n    if (!comp || comp.ids.length <= 1) {\n        return { encodings: base, augmentation: undefined, chartType: undefined, surface: undefined };\n    }\n    const stored = chartProperties?.[comp.key];\n    const id = typeof stored === 'string' && comp.ids.includes(stored) ? stored : comp.ids[0];\n    const index = comp.ids.indexOf(id);\n    return {\n        encodings: comp.statesById[id],\n        augmentation: comp.augmentationById[id],\n        chartType: comp.chartTypeById[id],\n        surface: {\n            key: comp.key,\n            label: comp.label,\n            length: comp.ids.length,\n            index,\n            ids: comp.ids,\n            labels: comp.labels,\n        },\n    };\n}\n\n// ─── Factored two-control model (design-docs/chart-transform-two-axes.md) ─────\n//\n// The single composed orbit above is re-exposed as TWO independent controls:\n//   - Control B (chart type, θ): a one-hop transition menu enumerated from the\n//     object's *identity* — no composition, independent of Control A.\n//   - Control A (arrange, τ/σ/γ): the local group of the *effective* chart type\n//     (authored, or the θ-selected sibling), BFS-composed and deduped.\n// The two are stored as separate override keys (`chartType`, `arrange`). A θ\n// switch resets `arrange` to identity and rebuilds Control A on the new object.\n\n/** Both control surfaces resolved for the current input. */\nexport interface TransformSurface {\n    /** Control B — chart-type transitions (dropdown). Absent when no siblings. */\n    chartType?: PivotSurface;\n    /** Control A — local rearrangement group (stepper). Absent when trivial. */\n    arrange?: PivotSurface;\n}\n\n/** Override keys the two controls read/write under `chartProperties`. */\nexport const TRANSFORM_CHART_TYPE_KEY = 'chartType';\nexport const TRANSFORM_ARRANGE_KEY = 'arrange';\n\n/** Build a PivotSurface for a chosen state id within a computation. */\nfunction buildSurface(comp: PivotComputation, id: string): PivotSurface {\n    const index = Math.max(0, comp.ids.indexOf(id));\n    return {\n        key: comp.key,\n        label: comp.label,\n        length: comp.ids.length,\n        index,\n        ids: comp.ids,\n        labels: comp.labels,\n    };\n}\n\n/**\n * Control A enumeration: the local rearrangement group (τ/σ/γ only, no θ) of a\n * template, BFS-composed and deduped exactly like {@link computePivot} but with\n * chart-type transitions excluded. Runs on the *effective* object's identity\n * encoding (post-θ), so it offers exactly the moves that make sense there.\n */\nexport function computeArrangeStates(\n    template: ChartTemplateDef,\n    base: Record<string, ChartEncoding>,\n    data: any[],\n): PivotComputation | null {\n    return computePivot(template, base, data, undefined, {\n        includeTransitions: false,\n        key: TRANSFORM_ARRANGE_KEY,\n        label: 'Arrange',\n        preferFacetTarget: true,\n    });\n}\n\n/**\n * Control B enumeration: the one-hop chart-type transitions (θ only) of a\n * template, enumerated from the object's *identity* encoding — no composition,\n * no τ/σ/γ. Each state re-routes fields for a sibling chart type and carries a\n * `chartType` override the compiler re-dispatches on. State 0 is the authored\n * type (`default`, no override); labels are the sibling chart-type display\n * names so the dropdown reads \"Bar Chart · Line Chart · …\". Returns `null` when\n * the template declares no transitions.\n */\nexport function computeChartTypeStates(\n    template: ChartTemplateDef,\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    resolveTemplate?: (chartType: string) => ChartTemplateDef | undefined,\n): PivotComputation | null {\n    // Transitions come from the central registry (keyed by chart name), NOT from\n    // the template's pivot def — so a template with no local τ/σ/γ group (e.g. a\n    // Pyramid) can still offer chart-type siblings.\n    const transitions = getChartTransitions(template.chart);\n    if (transitions.length === 0) return null;\n\n    const ids: string[] = ['default'];\n    const labels: string[] = [template.chart];\n    const statesById: Record<string, Record<string, ChartEncoding>> = { default: clone(base) };\n    const augmentationById: Record<string, EncodingAugmentation | undefined> = { default: undefined };\n    const chartTypeById: Record<string, string | undefined> = { default: undefined };\n    const seenChartTypes = new Set<string>([template.chart]);\n\n    for (const t of transitions) {\n        // Backend gate: skip a target the active backend can't render.\n        if (resolveTemplate && !resolveTemplate(t.to)) continue;\n        const st = transitionState(base, data, template, t);\n        if (!st) continue;\n        // One sibling per target chart type; skip a hop back to the authored type.\n        if (seenChartTypes.has(st.chartType)) continue;\n        seenChartTypes.add(st.chartType);\n        const id = `type:${t.to}`;\n        ids.push(id);\n        labels.push(st.chartType);\n        statesById[id] = st.enc;\n        chartTypeById[id] = st.chartType;\n    }\n\n    if (ids.length <= 1) return null;\n    return { key: TRANSFORM_CHART_TYPE_KEY, label: 'Chart type', ids, labels, statesById, augmentationById, chartTypeById };\n}\n\n/**\n * Resolve the two transform override ids from `chartProperties`, with a\n * backward-compatible shim for the legacy single composed `pivot` id: a\n * `type:*` token routes to the chart-type override and the remaining τ/σ/γ\n * tokens (before it) route to arrange. Because a θ resets arrange in the new\n * model, tokens *after* a `type:*` token are dropped (best-effort migration).\n */\nfunction resolveTransformOverrides(\n    chartProperties: Record<string, any> | undefined,\n): { chartTypeId: string | undefined; arrangeId: string | undefined } {\n    let chartTypeId = chartProperties?.[TRANSFORM_CHART_TYPE_KEY];\n    let arrangeId = chartProperties?.[TRANSFORM_ARRANGE_KEY];\n    if (typeof chartTypeId !== 'string') chartTypeId = undefined;\n    if (typeof arrangeId !== 'string') arrangeId = undefined;\n\n    if (chartTypeId === undefined && arrangeId === undefined) {\n        const legacy = chartProperties?.pivot;\n        if (typeof legacy === 'string' && legacy.length > 0 && legacy !== 'default') {\n            const tokens = legacy.split('|');\n            const typeIdx = tokens.findIndex((t) => t.startsWith('type:'));\n            if (typeIdx >= 0) {\n                chartTypeId = tokens[typeIdx];\n                const local = tokens.slice(0, typeIdx);\n                arrangeId = local.length ? local.join('|') : undefined;\n            } else {\n                arrangeId = legacy;\n            }\n        }\n    }\n    return { chartTypeId, arrangeId };\n}\n\n/**\n * Resolve the active state for the two independent controls and return the\n * transformed encodings + both surfaces. Order (design §4.10.1): apply the\n * chart-type transition (Control B) from the authored identity FIRST, re-select\n * the sibling template, THEN enumerate + apply that object's local arrange group\n * (Control A). A stale/absent `arrange` id falls back to identity — which is the\n * reset-on-θ behavior for free (design §4.10.2).\n */\nexport function applyTransform(\n    template: ChartTemplateDef,\n    base: Record<string, ChartEncoding>,\n    data: any[],\n    chartProperties: Record<string, any> | undefined,\n    resolveTemplate?: (chartType: string) => ChartTemplateDef | undefined,\n): {\n    encodings: Record<string, ChartEncoding>;\n    augmentation: EncodingAugmentation | undefined;\n    chartType: string | undefined;\n    surface: TransformSurface;\n} {\n    const { chartTypeId, arrangeId } = resolveTransformOverrides(chartProperties);\n\n    // Control B — chart type (θ), from the authored identity.\n    let effectiveTemplate = template;\n    let effectiveEnc = base;\n    let chartType: string | undefined;\n    let chartTypeSurface: PivotSurface | undefined;\n    const ctComp = computeChartTypeStates(template, base, data, resolveTemplate);\n    if (ctComp && ctComp.ids.length > 1) {\n        const id = chartTypeId && ctComp.ids.includes(chartTypeId) ? chartTypeId : 'default';\n        effectiveEnc = ctComp.statesById[id];\n        chartType = ctComp.chartTypeById[id];\n        if (chartType) {\n            const resolved = resolveTemplate?.(chartType);\n            if (resolved) effectiveTemplate = resolved;\n        }\n        chartTypeSurface = buildSurface(ctComp, id);\n    }\n\n    // Control A — arrange (τ/σ/γ), on the effective object.\n    let encodings = effectiveEnc;\n    let augmentation: EncodingAugmentation | undefined;\n    let arrangeSurface: PivotSurface | undefined;\n    const arrComp = computeArrangeStates(effectiveTemplate, effectiveEnc, data);\n    if (arrComp && arrComp.ids.length > 1) {\n        const id = arrangeId && arrComp.ids.includes(arrangeId) ? arrangeId : arrComp.ids[0];\n        encodings = arrComp.statesById[id];\n        augmentation = arrComp.augmentationById[id];\n        arrangeSurface = buildSurface(arrComp, id);\n    }\n\n    return {\n        encodings,\n        augmentation,\n        chartType,\n        surface: { chartType: chartTypeSurface, arrange: arrangeSurface },\n    };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChartEncoding, EncodingActionDef } from './types';\n\n/**\n * Reusable factories for Category-B encoding actions (see EncodingActionDef).\n *\n * These are authored once and attached to many templates, so the per-chart\n * knowledge (which channel is the category axis, which carries the measure)\n * lives in one place instead of being re-implemented per template.\n */\n\n/** The semantic sort choices the Sort control exposes. */\nexport type SortChoice = 'value-asc' | 'value-desc';\n\n// A measure is a quantitative channel or any aggregated channel.\nconst isMeasureEnc = (e?: ChartEncoding): boolean =>\n    !!e?.field && (!!e.aggregate || e.type === 'quantitative');\n\n// A sortable category axis is discrete (nominal/ordinal). Temporal axes are\n// deliberately excluded: reordering a time axis by value scrambles the\n// chronology, so Sort should not apply to them.\nconst isDiscreteCategoryEnc = (e?: ChartEncoding): boolean =>\n    !!e?.field && !e.aggregate && e.type !== 'quantitative' && e.type !== 'temporal';\n\n/**\n * Identify the discrete category axis and the measure axis among a pair of\n * position channels, so Sort works under either orientation (vertical or\n * horizontal) and only when a discrete axis actually exists.\n *\n * Returns `null` when there is no discrete category + measure pair to sort —\n * e.g. a temporal-x time series, or two quantitative axes (scatter). Callers\n * use this both to gate visibility and to no-op safely.\n */\nfunction resolveSortChannels(\n    encodings: Record<string, ChartEncoding>,\n    candidates: [string, string],\n): { category: string; measure: string } | null {\n    const category = candidates.find(c => isDiscreteCategoryEnc(encodings[c]));\n    const measure = candidates.find(c => isMeasureEnc(encodings[c]));\n    if (!category || !measure || category === measure) return null;\n    return { category, measure };\n}\n\n/**\n * Sort the category axis of a bar-like chart by the measure value.\n *\n * Encoding model: a value sort writes `sortBy = <measure channel>` (one of\n * 'x' | 'y', which the assembler understands) on the category channel.\n * \"Default\" clears the sort so the field's canonical ordering wins — the\n * natural order for ordinal/temporal-like categories, or alphabetic otherwise,\n * as decided by semantic resolution. The action is only applicable — and only\n * visible — when one position channel is a discrete category and the other is\n * a measure.\n *\n * @param channels Position-channel pair (default ['x', 'y']); the orientation\n *                 (which one is the category) is resolved per-encoding at runtime.\n */\nexport function makeSortAction(options?: {\n    key?: string;\n    label?: string;\n    channels?: [string, string];\n}): EncodingActionDef {\n    const candidates = options?.channels ?? ['x', 'y'];\n    return {\n        key: options?.key ?? 'sort',\n        label: options?.label ?? 'Sort',\n        dependencies: candidates,\n        isApplicable: (ctx) => resolveSortChannels(ctx.encodings, candidates) !== null,\n        control: {\n            type: 'discrete',\n            options: [\n                { value: undefined, label: 'Default' },\n                { value: 'value-desc', label: 'Value ↓' },\n                { value: 'value-asc', label: 'Value ↑' },\n            ],\n        },\n        get: (encodings) => {\n            const resolved = resolveSortChannels(encodings, candidates);\n            if (!resolved) return undefined;\n            const { category, measure } = resolved;\n            const enc = encodings[category];\n            if (enc.sortBy === measure) {\n                return enc.sortOrder === 'descending' ? 'value-desc' : 'value-asc';\n            }\n            // Any other sort (label order, custom value order, sort-by-color)\n            // isn't representable by this control → show as Default.\n            return undefined;\n        },\n        set: (encodings, value: SortChoice | undefined) => {\n            const resolved = resolveSortChannels(encodings, candidates);\n            if (!resolved) return encodings;\n            const { category, measure } = resolved;\n            const base = encodings[category];\n            let next: ChartEncoding;\n            switch (value) {\n                case 'value-asc':\n                    next = { ...base, sortBy: measure, sortOrder: 'ascending' };\n                    break;\n                case 'value-desc':\n                    next = { ...base, sortBy: measure, sortOrder: 'descending' };\n                    break;\n                default:\n                    next = { ...base, sortBy: undefined, sortOrder: undefined };\n            }\n            return { ...encodings, [category]: next };\n        },\n    };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChannelSemantics } from './types';\n\ntype EncodingType = 'nominal' | 'ordinal' | 'quantitative' | 'temporal';\n\ntype BandedAxisResult = {\n    axis: 'x' | 'y';\n    resolvedTypes?: Record<string, EncodingType>;\n};\n\nconst isDiscrete = (type: string | undefined): boolean =>\n    type === 'nominal' || type === 'ordinal';\n\nconst getFieldCardinality = (field: string, table: any[]): number =>\n    new Set(table.map((row: any) => row[field]).filter((value: any) => value != null)).size;\n\n/** Resolve a backend-neutral discrete encoding type for a field. */\nexport function resolveDiscreteType(\n    currentType: string,\n    field: string | undefined,\n    table: any[],\n): 'nominal' | 'ordinal' {\n    if (currentType === 'nominal') return 'nominal';\n    if (currentType === 'ordinal') return 'ordinal';\n    if (currentType === 'temporal') return 'ordinal';\n    if (currentType === 'quantitative' && field && table.length > 0) {\n        return getFieldCardinality(field, table) <= 20 ? 'ordinal' : 'nominal';\n    }\n    return 'nominal';\n}\n\n/** Choose the position axis that should use banded layout. */\nexport function detectBandedAxisFromSemantics(\n    channelSemantics: Record<string, ChannelSemantics>,\n    table: any[],\n    options: { preferAxis?: 'x' | 'y' } = {},\n): BandedAxisResult | null {\n    const xType = channelSemantics.x?.type;\n    const yType = channelSemantics.y?.type;\n\n    if (xType && isDiscrete(xType)) return { axis: 'x' };\n    if (yType && isDiscrete(yType)) return { axis: 'y' };\n\n    if (xType && yType) {\n        if (xType === 'quantitative' && yType !== 'quantitative') {\n            return { axis: 'y' };\n        }\n        if (yType === 'quantitative' && xType !== 'quantitative') {\n            return { axis: 'x' };\n        }\n        return { axis: options.preferAxis || 'x' };\n    }\n\n    if (xType) {\n        const newType = resolveDiscreteType(xType, channelSemantics.x?.field, table);\n        return { axis: 'x', resolvedTypes: { x: newType } };\n    }\n    if (yType) {\n        const newType = resolveDiscreteType(yType, channelSemantics.y?.field, table);\n        return { axis: 'y', resolvedTypes: { y: newType } };\n    }\n\n    return null;\n}\n\n/** Choose a banded axis and force its encoding type to be discrete. */\nexport function detectBandedAxisForceDiscrete(\n    channelSemantics: Record<string, ChannelSemantics>,\n    table: any[],\n    options: { preferAxis?: 'x' | 'y' } = {},\n): BandedAxisResult | null {\n    const result = detectBandedAxisFromSemantics(channelSemantics, table, options);\n    if (!result) return null;\n\n    const axis = result.axis;\n    const semantics = channelSemantics[axis];\n    if (!semantics) return result;\n\n    if (!isDiscrete(semantics.type)) {\n        const newType = resolveDiscreteType(semantics.type, semantics.field, table);\n        return {\n            axis,\n            resolvedTypes: { ...result.resolvedTypes, [axis]: newType },\n        };\n    }\n\n    return result;\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Band-dodge decision: does a secondary discrete channel (`color`, or an explicit\n * `group` field) subdivide a categorical axis band into side-by-side sub-lanes\n * (\"dodge\"), or is it redundant/nested with the axis (render one full-width glyph\n * per band, \"nested\")?\n *\n * This is the single source of truth shared by the layout engine\n * (`compute-layout.ts`) and every backend template that dodges by color/group\n * (VL boxplot/violin/grouped-bar, ECharts, Chart.js). Keeping the decision here\n * prevents the layout and the templates from drifting apart (the class of bug\n * where the band is budgeted for a different lane count than the glyph is sized\n * for). See `design-docs/boxplot-color-dodge-heuristic.md`.\n *\n * Two independent quantities, deliberately NOT the same number:\n *   - the **gate** (`dodge`): keyed off the max per-band sub-cardinality — \"does\n *     any single band actually contain more than one sub-value?\"\n *   - the **lane count** (`laneCount`): the *global* distinct sub-value count,\n *     because that is what a global band-offset scale (VL `xOffset`, an ECharts\n *     series-per-group, a Chart.js dataset-per-group) physically reserves per\n *     band. Sizing a glyph by the max-per-band instead would overlap in sparse\n *     cross-products.\n */\n\n/** Default fraction of single-valued bands above which `auto` snaps to `none`\n *  (mostly-1:1 / dirty near-1:1 data). Tunable via `planBandDodge` options. */\nexport const DEFAULT_NESTED_SNAP_THRESHOLD = 0.9;\n\n/** Resolved dodge mode (what actually renders). */\nexport type DodgeMode = 'none' | 'local' | 'global';\n\n/** User-facing `dodge` chart-property values (`auto` defers to the compiler). */\nexport type DodgeOption = 'auto' | DodgeMode;\n\nexport interface BandDodgePlan {\n    /** Compiler's recommended default mode. */\n    mode: DodgeMode;\n    /** Back-compat: does the recommendation subdivide the band? (`mode !== 'none'`). */\n    dodge: boolean;\n    /** Lanes a *global* offset scale reserves per band = global distinct\n     *  sub-values (the `global` mode lane count). */\n    laneCount: number;\n    /** True when local and global dodge can produce different layouts. */\n    ambiguous: boolean;\n    /** Most distinct sub-values co-occurring within any single band. */\n    maxPerBand: number;\n    /** Global distinct sub-values. */\n    global: number;\n    /** Number of distinct axis bands. */\n    bandCount: number;\n}\n\nexport interface PlanBandDodgeOptions {\n    /** Fraction of single-valued bands above which `auto` snaps to `none`.\n     *  Defaults to {@link DEFAULT_NESTED_SNAP_THRESHOLD}. */\n    nestedSnapThreshold?: number;\n}\n\n/** Pure recommendation from the per-band statistics. */\nfunction recommendMode(\n    maxPerBand: number,\n    globalCount: number,\n    nestedFraction: number,\n    threshold: number,\n): DodgeMode {\n    // Nothing subdivides any band → full-width.\n    if (maxPerBand <= 1) return 'none';\n    // Mostly single-valued (a few dirty/outlier multi-color bands) → snap to\n    // full-width rather than dodge the whole chart for a couple of rows.\n    if (nestedFraction >= threshold) return 'none';\n    // Every occupied band spans the full sub-domain → uniform global grid.\n    if (maxPerBand >= globalCount) return 'global';\n    // Sparse / spiky → compact, centered per-band lanes.\n    return 'local';\n}\n\n/**\n * Decide whether `subField` dodges `axisField` for the given data.\n *\n * Confident zones (never ambiguous):\n *   - `maxPerBand <= 1`  → nested (redundant/nested with the axis; `color == x`\n *     or a 1:1 different-field pair).\n *   - `maxPerBand === global` → dodge (clean full cross-product).\n * Ambiguous zone (`1 < maxPerBand < global`, e.g. sparse cross-products or dirty\n * near-1:1 data): the `auto` lean is resolved by a configurable threshold on the\n * fraction of single-valued bands, and `ambiguous` is set so a host can surface\n * the toggle.\n */\nexport function planBandDodge(\n    table: ReadonlyArray<Record<string, unknown>>,\n    axisField: string,\n    subField: string,\n    options?: PlanBandDodgeOptions,\n): BandDodgePlan {\n    const perBand = new Map<unknown, Set<unknown>>();\n    const global = new Set<unknown>();\n    for (const row of table) {\n        global.add(row[subField]);\n        const key = row[axisField];\n        let bandSet = perBand.get(key);\n        if (!bandSet) perBand.set(key, (bandSet = new Set()));\n        bandSet.add(row[subField]);\n    }\n\n    const globalCount = Math.max(1, global.size);\n    const bandCount = perBand.size;\n    let maxPerBand = 0;\n    let singleValuedBands = 0;\n    let completeBands = 0;\n    for (const bandSet of perBand.values()) {\n        if (bandSet.size > maxPerBand) maxPerBand = bandSet.size;\n        if (bandSet.size <= 1) singleValuedBands++;\n        if (bandSet.size === globalCount) completeBands++;\n    }\n\n    const threshold = options?.nestedSnapThreshold ?? DEFAULT_NESTED_SNAP_THRESHOLD;\n    const nestedFraction = bandCount > 0 ? singleValuedBands / bandCount : 1;\n    const mode = recommendMode(maxPerBand, globalCount, nestedFraction, threshold);\n\n    return {\n        mode,\n        dodge: mode !== 'none',\n        laneCount: globalCount,\n        ambiguous: maxPerBand > 1 && completeBands < bandCount,\n        maxPerBand,\n        global: globalCount,\n        bandCount,\n    };\n}\n\n/** Number of sub-lanes a resolved mode reserves per band. */\nexport function laneCountForMode(plan: BandDodgePlan, mode: DodgeMode): number {\n    if (mode === 'global') return plan.global;\n    if (mode === 'local') return Math.max(1, plan.maxPerBand);\n    return 1;\n}\n\n/**\n * Apply a user `dodge` override on top of a plan. `none`/`local`/`global` are\n * hard overrides; `auto` (or unset) follows the compiler recommendation. A dodge\n * mode is downgraded to `none` when nothing actually subdivides a band\n * (`maxPerBand <= 1`), so forcing dodge on redundant color can't collapse it.\n */\nexport function resolveDodge(\n    plan: BandDodgePlan,\n    override?: string,\n): { mode: DodgeMode; laneCount: number } {\n    let mode: DodgeMode =\n        override === 'none' || override === 'local' || override === 'global'\n            ? override\n            : plan.mode;\n    if (mode !== 'none' && plan.maxPerBand <= 1) mode = 'none';\n    return { mode, laneCount: laneCountForMode(plan, mode) };\n}\n\n// ---------------------------------------------------------------------------\n// Back-compat shim (pre-`local` callers that only need a dodge boolean).\n// `local` currently renders via the global offset path, so its lane count is\n// the global one until the per-backend `local` renderer lands (Stage 2).\n// ---------------------------------------------------------------------------\n\n/** @deprecated user-facing values; prefer {@link DodgeOption}. */\nexport type ColorLayoutMode = DodgeOption;\n\n/** @deprecated prefer {@link resolveDodge}. Maps the mode to a dodge boolean and\n *  the global lane count (the only lane count the current renderers support). */\nexport function resolveBandDodge(\n    plan: BandDodgePlan,\n    override?: string,\n): { dodge: boolean; laneCount: number } {\n    // Legacy override spellings → new modes.\n    const normalized = override === 'dodge' ? 'global' : override === 'nested' ? 'none' : override;\n    const { mode } = resolveDodge(plan, normalized);\n    return { dodge: mode !== 'none', laneCount: plan.laneCount };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * TYPE REGISTRY — Single Source of Truth\n * =============================================================================\n *\n * Every recognized semantic type is registered here with its orthogonal\n * compilation dimensions. This is the ONLY place where per-type properties\n * are defined. All other files (field-semantics.ts, semantic-types.ts)\n * derive helper functions by querying this registry.\n *\n * To add a new semantic type: add an entry here.\n * To query a type's properties: use `getRegistryEntry()`.\n * =============================================================================\n */\n\n// ---------------------------------------------------------------------------\n// Visualization Categories\n// ---------------------------------------------------------------------------\n\nexport type VisCategory = 'quantitative' | 'ordinal' | 'nominal' | 'temporal' | 'geographic';\n\n// ---------------------------------------------------------------------------\n// Registry Dimension Types\n// ---------------------------------------------------------------------------\n\n/** Top-level type family */\nexport type T0Family = 'Temporal' | 'Measure' | 'Discrete' | 'Geographic' | 'Categorical' | 'Identifier';\n\n/** Mid-level category within a family */\nexport type T1Category =\n    | 'DateTime' | 'DateGranule' | 'Duration'\n    | 'Amount' | 'Physical' | 'Proportion' | 'SignedMeasure' | 'GenericMeasure'\n    | 'Rank' | 'Score'\n    | 'GeoCoordinate' | 'GeoPlace'\n    | 'Entity' | 'Coded' | 'Binned'\n    | 'ID';\n\nexport type DomainShape = 'open' | 'bounded' | 'fixed' | 'cyclic';\nexport type AggRole = 'additive' | 'intensive' | 'signed-additive' | 'dimension' | 'identifier';\nexport type DivergingClass = 'none' | 'inherent' | 'conditional';\nexport type FormatClass = 'currency' | 'percent'\n    | 'unit-suffix' | 'integer' | 'decimal' | 'plain';\n\n/**\n * Zero-baseline classification for quantitative axes.\n *\n * - `meaningful`: 0 = absence of the measured thing; axis should include 0 (Count, Revenue).\n * - `arbitrary`:  0 is arbitrary or nonexistent; data-fit the axis (Temperature, Year, Rank).\n * - `contextual`: 0 is meaningful but data-fitting may be better when data is far from 0 (Percentage, Score).\n * - `none`:       Not a quantitative type; zero question is irrelevant (all categorical/temporal types).\n */\nexport type ZeroBaseline = 'meaningful' | 'arbitrary' | 'contextual' | 'none';\n\nexport interface TypeRegistryEntry {\n    t0: T0Family;\n    t1: T1Category;\n    visEncodings: VisCategory[];\n    aggRole: AggRole;\n    domainShape: DomainShape;\n    diverging: DivergingClass;\n    formatClass: FormatClass;\n    /** Zero-baseline classification for quantitative axes */\n    zeroBaseline: ZeroBaseline;\n    /** Domain padding fraction for non-zero axes (0 = no padding) */\n    zeroPad: number;\n}\n\n// ---------------------------------------------------------------------------\n// The Registry\n// ---------------------------------------------------------------------------\n\n/**\n * Static registry mapping every recognized semantic type to its\n * tier membership and orthogonal compilation dimensions.\n *\n * Types not in this registry are treated as 'Unknown' → nominal/plain.\n */\nconst TYPE_REGISTRY: Record<string, TypeRegistryEntry> = {\n    // --- Temporal: DateTime ---\n    DateTime:      { t0: 'Temporal', t1: 'DateTime', visEncodings: ['temporal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none', formatClass: 'plain',           zeroBaseline: 'none', zeroPad: 0 },\n    Date:          { t0: 'Temporal', t1: 'DateTime', visEncodings: ['temporal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none', formatClass: 'plain',           zeroBaseline: 'none', zeroPad: 0 },\n    Time:          { t0: 'Temporal', t1: 'DateTime', visEncodings: ['temporal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none', formatClass: 'plain',           zeroBaseline: 'none', zeroPad: 0 },\n    Timestamp:     { t0: 'Temporal', t1: 'DateTime', visEncodings: ['temporal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none', formatClass: 'plain',           zeroBaseline: 'none', zeroPad: 0 },\n\n    // --- Temporal: DateGranule ---\n    Year:          { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['temporal', 'ordinal'], aggRole: 'dimension', domainShape: 'open',    diverging: 'none', formatClass: 'integer',        zeroBaseline: 'arbitrary', zeroPad: 0.03 },\n    Quarter:       { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['ordinal'],            aggRole: 'dimension', domainShape: 'cyclic',  diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    Month:         { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['ordinal'],            aggRole: 'dimension', domainShape: 'cyclic',  diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    Week:          { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['ordinal'],            aggRole: 'dimension', domainShape: 'cyclic',  diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    Day:           { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['ordinal'],            aggRole: 'dimension', domainShape: 'cyclic',  diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    Hour:          { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['ordinal'],            aggRole: 'dimension', domainShape: 'cyclic',  diverging: 'none', formatClass: 'integer',        zeroBaseline: 'arbitrary', zeroPad: 0 },\n    YearMonth:     { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['temporal', 'ordinal'], aggRole: 'dimension', domainShape: 'open',   diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    YearQuarter:   { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['temporal', 'ordinal'], aggRole: 'dimension', domainShape: 'open',   diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    YearWeek:      { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['temporal', 'ordinal'], aggRole: 'dimension', domainShape: 'open',   diverging: 'none', formatClass: 'plain',          zeroBaseline: 'none', zeroPad: 0 },\n    Decade:        { t0: 'Temporal', t1: 'DateGranule', visEncodings: ['temporal', 'ordinal'], aggRole: 'dimension', domainShape: 'open',   diverging: 'none', formatClass: 'integer',        zeroBaseline: 'arbitrary', zeroPad: 0.03 },\n\n    // --- Temporal: Duration ---\n    Duration:      { t0: 'Temporal', t1: 'Duration', visEncodings: ['quantitative'],       aggRole: 'additive',   domainShape: 'open',    diverging: 'none', formatClass: 'unit-suffix',     zeroBaseline: 'meaningful', zeroPad: 0 },\n\n    // --- Measure: Amount ---\n    Amount:        { t0: 'Measure', t1: 'Amount', visEncodings: ['quantitative'],          aggRole: 'additive',   domainShape: 'open',    diverging: 'none',        formatClass: 'currency',   zeroBaseline: 'meaningful', zeroPad: 0 },\n    Price:         { t0: 'Measure', t1: 'Amount', visEncodings: ['quantitative'],          aggRole: 'intensive',  domainShape: 'open',    diverging: 'none',        formatClass: 'currency',   zeroBaseline: 'meaningful', zeroPad: 0 },\n\n    // --- Measure: Physical ---\n    Quantity:      { t0: 'Measure', t1: 'Physical', visEncodings: ['quantitative'],        aggRole: 'additive',   domainShape: 'open',    diverging: 'none',        formatClass: 'unit-suffix', zeroBaseline: 'meaningful', zeroPad: 0 },\n    Temperature:   { t0: 'Measure', t1: 'Physical', visEncodings: ['quantitative'],        aggRole: 'intensive',  domainShape: 'open',    diverging: 'conditional', formatClass: 'unit-suffix', zeroBaseline: 'arbitrary', zeroPad: 0.05 },\n\n    // --- Measure: Proportion ---\n    Percentage:    { t0: 'Measure', t1: 'Proportion', visEncodings: ['quantitative'],      aggRole: 'intensive',  domainShape: 'bounded', diverging: 'none',        formatClass: 'percent',    zeroBaseline: 'contextual', zeroPad: 0 },\n\n    // --- Measure: SignedMeasure ---\n    Profit:             { t0: 'Measure', t1: 'SignedMeasure', visEncodings: ['quantitative'], aggRole: 'signed-additive', domainShape: 'open', diverging: 'conditional', formatClass: 'decimal',          zeroBaseline: 'meaningful', zeroPad: 0 },\n    PercentageChange:   { t0: 'Measure', t1: 'SignedMeasure', visEncodings: ['quantitative'], aggRole: 'intensive',       domainShape: 'open', diverging: 'conditional', formatClass: 'percent',          zeroBaseline: 'contextual', zeroPad: 0.05 },\n    Sentiment:          { t0: 'Measure', t1: 'SignedMeasure', visEncodings: ['quantitative'], aggRole: 'intensive',       domainShape: 'open', diverging: 'inherent',    formatClass: 'decimal',          zeroBaseline: 'meaningful', zeroPad: 0 },\n    Correlation:        { t0: 'Measure', t1: 'SignedMeasure', visEncodings: ['quantitative'], aggRole: 'intensive',       domainShape: 'bounded', diverging: 'inherent', formatClass: 'decimal',          zeroBaseline: 'meaningful', zeroPad: 0 },\n\n    // --- Measure: GenericMeasure ---\n    Count:         { t0: 'Measure', t1: 'GenericMeasure', visEncodings: ['quantitative'],  aggRole: 'additive',   domainShape: 'open',    diverging: 'none',        formatClass: 'integer',    zeroBaseline: 'meaningful', zeroPad: 0 },\n    Number:        { t0: 'Measure', t1: 'GenericMeasure', visEncodings: ['quantitative'],  aggRole: 'additive',   domainShape: 'open',    diverging: 'none',        formatClass: 'decimal',    zeroBaseline: 'meaningful', zeroPad: 0 },\n\n    // --- Discrete ---\n    Rank:          { t0: 'Discrete', t1: 'Rank',  visEncodings: ['ordinal'],               aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'integer',    zeroBaseline: 'arbitrary', zeroPad: 0.08 },\n    Score:         { t0: 'Discrete', t1: 'Score', visEncodings: ['quantitative', 'ordinal'], aggRole: 'intensive', domainShape: 'bounded', diverging: 'conditional', formatClass: 'decimal',    zeroBaseline: 'contextual', zeroPad: 0.05 },\n    ID:            { t0: 'Identifier', t1: 'ID',  visEncodings: ['nominal'],               aggRole: 'identifier', domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'arbitrary', zeroPad: 0 },\n\n    // --- Geographic ---\n    Latitude:      { t0: 'Geographic', t1: 'GeoCoordinate', visEncodings: ['quantitative', 'geographic'], aggRole: 'dimension', domainShape: 'fixed', diverging: 'none', formatClass: 'decimal',    zeroBaseline: 'arbitrary', zeroPad: 0.02 },\n    Longitude:     { t0: 'Geographic', t1: 'GeoCoordinate', visEncodings: ['quantitative', 'geographic'], aggRole: 'dimension', domainShape: 'fixed', diverging: 'none', formatClass: 'decimal',    zeroBaseline: 'arbitrary', zeroPad: 0.02 },\n    Country:       { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    State:         { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    City:          { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    Region:        { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    Address:       { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    ZipCode:       { t0: 'Geographic', t1: 'GeoPlace', visEncodings: ['nominal'],         aggRole: 'identifier', domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    // --- Categorical: Entity ---\n    Category:      { t0: 'Categorical', t1: 'Entity', visEncodings: ['nominal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    Name:          { t0: 'Categorical', t1: 'Entity', visEncodings: ['nominal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n\n    // --- Categorical: Coded ---\n    Status:        { t0: 'Categorical', t1: 'Coded', visEncodings: ['nominal'],            aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    Boolean:       { t0: 'Categorical', t1: 'Coded', visEncodings: ['nominal'],            aggRole: 'dimension',  domainShape: 'fixed',   diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n    Direction:     { t0: 'Categorical', t1: 'Coded', visEncodings: ['ordinal', 'nominal'], aggRole: 'dimension',  domainShape: 'cyclic',  diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n\n    // --- Categorical: Binned ---\n    Range:         { t0: 'Categorical', t1: 'Binned', visEncodings: ['ordinal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n\n    // --- Fallbacks ---\n    Unknown:       { t0: 'Categorical', t1: 'Entity', visEncodings: ['nominal'],           aggRole: 'dimension',  domainShape: 'open',    diverging: 'none',        formatClass: 'plain',      zeroBaseline: 'none', zeroPad: 0 },\n};\n\n/** Default entry for unrecognized types */\nconst UNKNOWN_ENTRY: TypeRegistryEntry = {\n    t0: 'Categorical', t1: 'Entity',\n    visEncodings: ['nominal'],\n    aggRole: 'dimension',\n    domainShape: 'open',\n    diverging: 'none',\n    formatClass: 'plain',\n    zeroBaseline: 'none',\n    zeroPad: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Look up a semantic type in the registry. Falls back to UNKNOWN_ENTRY. */\nexport function getRegistryEntry(semanticType: string): TypeRegistryEntry {\n    return TYPE_REGISTRY[semanticType] ?? UNKNOWN_ENTRY;\n}\n\n/** Check whether a semantic type string is explicitly registered. */\nexport function isRegistered(semanticType: string): boolean {\n    return semanticType in TYPE_REGISTRY;\n}\n\n/**\n * Get all registered type names.\n * Useful for validation or iterating over the type system.\n */\nexport function getRegisteredTypes(): string[] {\n    return Object.keys(TYPE_REGISTRY);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { getRegistryEntry, getRegisteredTypes, isRegistered, type VisCategory } from './type-registry';\nexport type { VisCategory } from './type-registry';\n\n/**\n * =============================================================================\n * SEMANTIC TYPE SYSTEM\n * =============================================================================\n * \n * Semantic types classify data fields for intelligent chart recommendations.\n * Uses strings for flexibility and easy JSON serialization.\n * \n * DESIGN GOALS:\n * 1. Comprehensive: Cover common data types seen in real-world datasets\n * 2. Visualization-aware: Map to Vega-Lite encoding types (Q, O, N, T)\n * 3. Hierarchical: Support generalization via lattice structure\n * 4. Simple: Use strings with helper functions, no complex enums\n * \n * =============================================================================\n * SEMANTIC TYPE LATTICE\n * =============================================================================\n * \n *                           ┌─────────────┐\n *                           │   AnyType   │\n *                           └──────┬──────┘\n *            ┌────────────────────┼────────────────────┐\n *            ▼                    ▼                    ▼\n *     ┌──────────┐         ┌──────────┐         ┌───────-───┐\n *     │ Temporal │         │ Numeric  │         │Categorical│\n *     └────┬─────┘         └────┬─────┘         └─────┬────┘\n *          │                    │                     │\n *    ┌─────┴─────┐        ┌─────┴─────┐         ┌─────┴─────┐\n *    │           │        │           │         │           │\n *  DateTime     Granule    Measure   Discrete    Entity     Coded\n *    │           │        │           │         │           │\n * DateTime    Year     Quantity    Rank      Category   Status\n * Date        Month    Count       Score     Name       Boolean\n * Time        Day      Price       ID                   Direction\n *             Quarter  Percentage\n *             Decade   Amount\n *                      Temperature\n * \n * =============================================================================\n */\n\n// ---------------------------------------------------------------------------\n// All Semantic Types (as string constants)\n// ---------------------------------------------------------------------------\n\n/**\n * All recognized semantic types.\n * Use these constants when comparing or assigning types.\n */\nexport const SemanticTypes = {\n    // =========================================================================\n    // TEMPORAL TYPES - Time-related concepts\n    // =========================================================================\n    \n    // Point-in-time (full timestamp precision)\n    DateTime: 'DateTime',       // Full date and time: \"2024-01-15T14:30:00\"\n    Date: 'Date',               // Date only: \"2024-01-15\"\n    Time: 'Time',               // Time only: \"14:30:00\"\n    Timestamp: 'Timestamp',     // Unix timestamp (seconds or milliseconds since epoch)\n    \n    // Temporal granules (discrete time units, inherently ordered)\n    Year: 'Year',               // \"2024\" (as a time unit, not a measure)\n    Quarter: 'Quarter',         // \"Q1\", \"Q2\", \"2024-Q1\"\n    Month: 'Month',             // \"January\", \"Jan\", 1-12\n    Week: 'Week',               // \"Week 1\", 1-52\n    Day: 'Day',                 // \"Monday\", \"Mon\", 1-31\n    Hour: 'Hour',               // 0-23\n    \n    // Combined temporal\n    YearMonth: 'YearMonth',     // \"2024-01\", \"Jan 2024\"\n    YearQuarter: 'YearQuarter', // \"2024-Q1\"\n    YearWeek: 'YearWeek',       // \"2024-W01\"\n    Decade: 'Decade',           // \"1990s\", \"2000s\"\n    \n    // Temporal duration/span\n    Duration: 'Duration',       // Time span: \"2 hours\", \"3 days\", milliseconds\n    \n    // =========================================================================\n    // NUMERIC MEASURE TYPES - Continuous values for aggregation\n    // =========================================================================\n    \n    Quantity: 'Quantity',       // Generic continuous measure\n    Count: 'Count',             // Discrete count of items\n    Amount: 'Amount',           // Monetary or general amounts\n    Price: 'Price',             // Unit price\n    Percentage: 'Percentage',   // 0-100% or 0-1 ratio\n    Temperature: 'Temperature', // Degrees\n    \n    // Signed measures (can be positive or negative, zero has meaning)\n    Profit: 'Profit',             // Gain/loss, profit/deficit\n    PercentageChange: 'PercentageChange', // Growth rate, change %\n    Sentiment: 'Sentiment',       // Positive/negative sentiment score\n    Correlation: 'Correlation',   // Positive/negative correlation coefficient\n    \n    // =========================================================================\n    // NUMERIC DISCRETE TYPES - Numbers with ordinal/identifier meaning\n    // =========================================================================\n    \n    Rank: 'Rank',               // Position in ordered list: 1st, 2nd, 3rd\n    ID: 'ID',                   // Unique identifier (not for aggregation!)\n    Score: 'Score',             // Rating score: 1-5, 1-10, 0-100\n    \n    // =========================================================================\n    // GEOGRAPHIC TYPES - Location-based data\n    // =========================================================================\n    \n    Latitude: 'Latitude',       // -90 to 90\n    Longitude: 'Longitude',     // -180 to 180\n    Country: 'Country',         // Country name or code\n    State: 'State',             // State/Province\n    City: 'City',               // City name\n    Region: 'Region',           // Geographic region\n    Address: 'Address',         // Street address (geo lookup)\n    ZipCode: 'ZipCode',         // Postal code (geo lookup)\n    \n    // =========================================================================\n    // CATEGORICAL ENTITY TYPES - Named entities\n    // =========================================================================\n    \n    Category: 'Category',       // Discrete category / product / entity class\n    Name: 'Name',               // Generic named entity (person, company, product, etc.)\n    \n    // =========================================================================\n    // CATEGORICAL CODED TYPES - Discrete categories/statuses\n    // =========================================================================\n    \n    Status: 'Status',           // State: \"Active\", \"Pending\", \"Closed\"\n    Boolean: 'Boolean',         // True/False, Yes/No\n    Direction: 'Direction',     // Compass direction: \"N\", \"NE\", \"East\", etc.\n    \n    // =========================================================================\n    // BINNED/RANGE TYPES - Discretized continuous values\n    // =========================================================================\n    \n    Range: 'Range',             // Numeric range, age group, binned values\n    \n    // =========================================================================\n    // FALLBACK TYPES\n    // =========================================================================\n    \n    Number: 'Number',           // Generic number (measure fallback)\n    Unknown: 'Unknown',         // Cannot determine type\n} as const;\n\n// Type for any semantic type string\nexport type SemanticType = typeof SemanticTypes[keyof typeof SemanticTypes];\n\n// ---------------------------------------------------------------------------\n// Visualization Categories  →  defined in type-registry.ts (single source of truth)\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Type Sets for Classification — derived from type-registry.ts\n// ---------------------------------------------------------------------------\n\n// timeseriesXTypes: REMOVED — derived from type-registry.ts via isTimeSeriesType()\n\n/**\n * Types suitable for quantitative encoding (true continuous measures).\n *\n * Derived from the registry: aggRole ∈ {additive, intensive, signed-additive},\n * excluding Score/Rating (t1='Score') which behave as bounded ordinal scales\n * for vis purposes (e.g., 1–5 star rating). This is an intentional vis-level\n * distinction, not a mathematical one.\n */\nexport const measureTypes = new Set<string>(\n    getRegisteredTypes().filter(t => {\n        const e = getRegistryEntry(t);\n        return ['additive', 'intensive', 'signed-additive'].includes(e.aggRole) && e.t1 !== 'Score';\n    })\n);\n\n/** Numeric types that should NOT be used as measures (don't aggregate) */\nexport const nonMeasureNumericTypes = new Set<string>([\n    'Rank', 'ID', 'Score',\n    'Year', 'Month', 'Day', 'Hour',\n    'Latitude', 'Longitude',\n]);\n\n/**\n * Types suitable for categorical color/grouping encoding.\n *\n * Derived from the registry: types that include 'nominal' in visEncodings\n * (at any position — Direction has ['ordinal','nominal']),\n * plus binned types (Range, AgeGroup) which also work as categorical for\n * color/grouping despite having 'ordinal' as their primary encoding.\n * Excludes identifiers (ID) which are nominal but not useful for grouping.\n */\nexport const categoricalTypes = new Set<string>(\n    getRegisteredTypes().filter(t => {\n        const e = getRegistryEntry(t);\n        return (e.visEncodings.includes('nominal') && e.aggRole !== 'identifier') || e.t1 === 'Binned';\n    })\n);\n\n/**\n * Types suitable for ordinal encoding (have inherent order).\n *\n * Derived from the registry: types whose visEncodings include 'ordinal'.\n */\nexport const ordinalTypes = new Set<string>(\n    getRegisteredTypes().filter(t => {\n        const e = getRegistryEntry(t);\n        return e.visEncodings.includes('ordinal');\n    })\n);\n\n// geoTypes, geoCoordinateTypes, geoLocationTypes: REMOVED — derived from type-registry.ts\n// via isGeoType(), isGeoCoordinateType(), isGeoLocationString()\n\n// ---------------------------------------------------------------------------\n// Type Hierarchy — REMOVED\n// ---------------------------------------------------------------------------\n// The typeHierarchy map and its helper functions (getParentType,\n// getAncestorTypes, isSubtypeOf) have been removed. They were unused\n// externally — no consumer ever imported them.\n//\n// The registry's t0/t1 dimensions capture family grouping (e.g., all\n// Amount types share t1='Amount'). If fine-grained parent-child lattice\n// traversal is ever needed in the future, it can be rebuilt from\n// type-registry.ts with an explicit `parent` field per entry.\n// ---------------------------------------------------------------------------\n\n// visCategoryMap: REMOVED — derived from type-registry.ts via getRegistryEntry().visEncodings[0]\n\n// ---------------------------------------------------------------------------\n// Helper Functions\n// ---------------------------------------------------------------------------\n\n/**\n * Get the Vega-Lite visualization category for a semantic type.\n * Derived from the registry's visEncodings[0] (primary encoding).\n * Returns null for unrecognised types so callers can fall back\n * to data-driven inference.\n */\nexport function getVisCategory(semanticType: string): VisCategory | null {\n    // Return null for empty, 'Unknown', or any unregistered type string\n    // so callers fall back to data-driven inference (inferVisCategory).\n    if (!semanticType || !isRegistered(semanticType)) return null;\n    return getRegistryEntry(semanticType).visEncodings[0] ?? null;\n}\n\n\n/**\n * Infer a VisCategory from raw data values when no semantic type is available.\n * Mirrors the DataType → VL encoding type mapping:\n *   number/integer → quantitative, boolean → nominal, date → temporal, string → nominal.\n */\nexport function inferVisCategory(values: any[]): VisCategory {\n    if (values.length === 0) return 'nominal';\n    const isBoolean = (v: any) => v === true || v === false || Object.prototype.toString.call(v) === '[object Boolean]';\n    const isNumber = (v: any) => !isNaN(+v) && !(Object.prototype.toString.call(v) === '[object Date]');\n    // Date.parse is too permissive in V8 — \"FY 2018\", \"hello world 2018\" all parse.\n    // Require the string to start with a digit or a known month-name prefix.\n    const looksLikeDate = (s: string) => /^\\d|^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i.test(s.trim());\n    const isDate = (v: any) => {\n        if (v instanceof Date) return !isNaN(v.getTime());\n        if (typeof v === 'string') return looksLikeDate(v) && !isNaN(Date.parse(v));\n        return !isNaN(Date.parse(v));\n    };\n    const nonNull = values.filter(v => v != null);\n    if (nonNull.length === 0) return 'nominal';\n    if (nonNull.every(isBoolean)) return 'nominal';\n    if (nonNull.every(isNumber)) return 'quantitative';\n    if (nonNull.every(isDate)) return 'temporal';\n    return 'nominal';\n}\n\n/**\n * Check if a semantic type is a true measure (suitable for quantitative encoding).\n */\nexport function isMeasureType(semanticType: string): boolean {\n    return measureTypes.has(semanticType);\n}\n\n/**\n * Check if a semantic type is suitable for time-series X axis.\n * Derived from type-registry: t0 === 'Temporal' but not Duration.\n */\nexport function isTimeSeriesType(semanticType: string): boolean {\n    const entry = getRegistryEntry(semanticType);\n    return entry.t0 === 'Temporal' && entry.t1 !== 'Duration';\n}\n\n/**\n * Check if a semantic type is categorical (suitable for color/grouping).\n */\nexport function isCategoricalType(semanticType: string): boolean {\n    return categoricalTypes.has(semanticType);\n}\n\n/**\n * Check if a semantic type is ordinal (has inherent order).\n */\nexport function isOrdinalType(semanticType: string): boolean {\n    return ordinalTypes.has(semanticType);\n}\n\n/**\n * Check if a semantic type is geographic.\n * Derived from type-registry: t0 === 'Geographic'.\n */\nexport function isGeoType(semanticType: string): boolean {\n    return getRegistryEntry(semanticType).t0 === 'Geographic';\n}\n\n/**\n * Check if a semantic type is a geographic coordinate (lat/lon).\n * Derived from type-registry: t1 === 'GeoCoordinate'.\n */\nexport function isGeoCoordinateType(semanticType: string): boolean {\n    return getRegistryEntry(semanticType).t1 === 'GeoCoordinate';\n}\n\n/**\n * Check if a semantic type is a named geographic location.\n * Derived from type-registry: t1 === 'GeoPlace'.\n */\nexport function isGeoLocationString(semanticType: string): boolean {\n    return getRegistryEntry(semanticType).t1 === 'GeoPlace';\n}\n\n/**\n * Check if a semantic type is numeric but should not be aggregated.\n */\nexport function isNonMeasureNumeric(semanticType: string): boolean {\n    return nonMeasureNumericTypes.has(semanticType);\n}\n\n// ---------------------------------------------------------------------------\n// Zero-Baseline Classification  →  data lives in type-registry.ts (zeroBaseline, zeroPad)\n// ---------------------------------------------------------------------------\n\n/**\n * Classification of whether zero is a meaningful baseline for a semantic type.\n *\n * - `meaningful`: 0 has a real-world interpretation (absence of the measured thing).\n *   Comparisons to zero and ratios between values are meaningful.\n *   Examples: Count, Revenue, Distance, Weight.\n *\n * - `arbitrary`: 0 is either meaningless, doesn't exist, or is an arbitrary\n *   reference point. The data's range is what matters.\n *   Examples: Temperature (0°F is arbitrary), Year (year 0 doesn't exist),\n *   Rank (0th place doesn't exist).\n *\n * - `contextual`: 0 is meaningful but data-fitting may be better when data\n *   is concentrated far from zero and the mark is not bar/area.\n *   Examples: Percentage (0–100% natural, but 48–52% benefits from zoom),\n *   Score (1–5 scale, but 4.2–4.8 benefits from zoom).\n */\nexport type ZeroClass = 'meaningful' | 'arbitrary' | 'contextual';\n\n/**\n * Result of the zero-baseline decision.\n * Encapsulates both the boolean decision and domain padding for non-zero axes.\n */\nexport interface ZeroDecision {\n    /** Whether the axis should include zero */\n    zero: boolean;\n    /**\n     * For non-zero axes: fraction of data range to pad on each side\n     * so edge values aren't crushed against the axis boundary.\n     * e.g. 0.05 = 5% padding on each side.\n     */\n    domainPadFraction: number;\n    /** The zero class that drove this decision */\n    zeroClass: ZeroClass | 'unknown';\n    /**\n     * Whether this is a *forced* (non-debatable) decision:\n     *   - `true`  → mandatory: a length/area mark, data that crosses zero, or a\n     *     zero-meaningful type on a length mark. Including zero is structural.\n     *   - `false` → the engine still has a recommended `zero`, but anchoring at\n     *     zero is at least conceptually a choice.\n     * `forced` records the structural side of the decision; it is NOT the gate\n     * for the UI toggle — see `uncertain` below.\n     */\n    forced: boolean;\n    /**\n     * Whether the zero-vs-fit choice is a *genuine toss-up worth surfacing* to\n     * the user. Hosts read this (via the property `check`) to decide whether to\n     * show the \"Zero X/Y\" toggle at all.\n     *\n     * We deliberately keep this narrow to avoid UI clutter: it is `true` ONLY\n     * for a zero-meaningful field on a position mark whose data sits far enough\n     * from zero that anchoring at zero would noticeably compress the view (a\n     * real zoom-in-vs-anchor tradeoff). Every other case — arbitrary types\n     * (zero is meaningless, just fit the data), contextual types (the engine's\n     * data-range call is confident enough), meaningful types whose data already\n     * spans most of the way to zero (the choice barely changes anything), and\n     * all forced/unknown cases — is `false`, so no toggle is shown and the\n     * engine's `zero` value simply applies. The engine's `zero` remains the\n     * recommended default when the toggle is shown.\n     */\n    uncertain: boolean;\n}\n\n// zeroMeaningfulTypes, zeroArbitraryTypes, zeroContextualTypes, zeroPadMap:\n// REMOVED — now stored as zeroBaseline/zeroPad in type-registry.ts\n\n/**\n * Classify a semantic type's relationship to zero.\n * Derived from the registry's zeroBaseline dimension.\n */\nexport function getZeroClass(semanticType: string): ZeroClass | 'unknown' {\n    const baseline = getRegistryEntry(semanticType).zeroBaseline;\n    if (baseline === 'none') return 'unknown';\n    return baseline;\n}\n\n/**\n * Compute whether a quantitative axis should start at zero, based on\n * semantic type, mark type, channel, and data values.\n *\n * Priority: semantic type > mark type > data range > VL default.\n *\n * This is a pure decision function — it returns a ZeroDecision object\n * without modifying any spec. The caller applies the decision to VL.\n *\n * @param semanticType  The semantic type of the field (e.g. 'Amount', 'Temperature')\n * @param channel       The VL channel ('x', 'y', 'size', etc.)\n * @param markType      The mark type ('bar', 'line', 'point', etc.)\n * @param values        Optional numeric data values for data-range analysis\n */\n/**\n * Above this ratio of dataMin/dataMax, the data band sits far enough above\n * zero that anchoring the axis at zero would leave at least half the axis\n * empty — a big enough gap that \"zoom into the data\" vs \"keep the zero\n * reference\" is a genuine toss-up worth offering as a toggle. Below it, the\n * data already spans most of the way to zero, so including zero barely changes\n * the view and we keep it on silently.\n */\nconst ZERO_BASELINE_GAP_THRESHOLD = 0.5;\n\n/**\n * True when strictly-positive data sits far enough from zero that anchoring at\n * zero would noticeably compress the view (see ZERO_BASELINE_GAP_THRESHOLD).\n * Returns false for empty data or any data that touches/crosses zero (there the\n * baseline is inside the data range, so it is not a debatable gap).\n */\nfunction dataFarFromZero(values?: number[]): boolean {\n    if (!values || values.length === 0) return false;\n    const dataMin = Math.min(...values);\n    const dataMax = Math.max(...values);\n    if (dataMin <= 0 || dataMax <= 0) return false;\n    return dataMin / dataMax >= ZERO_BASELINE_GAP_THRESHOLD;\n}\n\nexport function computeZeroDecision(\n    semanticType: string,\n    channel: string,\n    markType: string,\n    values?: number[],\n): ZeroDecision {\n    const isBarLike = ['bar', 'area', 'rect'].includes(markType);\n    const isScatterMark = markType === 'circle' || markType === 'point';\n    const isPositional = ['x', 'y'].includes(channel);\n    const entry = getRegistryEntry(semanticType);\n    const zeroClass = getZeroClass(semanticType);\n\n    // --- Zero-meaningful types: zero is the conventional baseline ---\n    if (zeroClass === 'meaningful') {\n        // Length marks (bar/area/rect): the baseline is structurally required —\n        // a bar's length is meaningless without zero. Not debatable.\n        if (isBarLike) {\n            return { zero: true, domainPadFraction: 0, zeroClass, forced: true, uncertain: false };\n        }\n        // Scatter (circle/point position): the read is correlation / cloud shape,\n        // not distance from zero — data-fit is the conventional default. Offer\n        // Zero X/Y as an opt-in toggle when the user wants a zero reference.\n        if (isPositional && isScatterMark) {\n            if (values && values.length > 0 && Math.min(...values) <= 0) {\n                return { zero: true, domainPadFraction: 0, zeroClass, forced: true, uncertain: false };\n            }\n            return {\n                zero: false,\n                domainPadFraction: entry.zeroPad || 0.05,\n                zeroClass,\n                forced: false,\n                uncertain: true,\n            };\n        }\n        // Position marks (line/strip): zero is the conventional reference,\n        // so the recommended default is ON. We only *offer* the toggle when the\n        // data sits far enough from zero that anchoring at zero would noticeably\n        // compress the view — a genuine zoom-in-vs-keep-the-reference toss-up.\n        // When the data already spans most of the way to zero, the choice barely\n        // changes anything, so we keep zero on silently and hide the toggle.\n        return {\n            zero: true,\n            domainPadFraction: 0,\n            zeroClass,\n            forced: false,\n            uncertain: dataFarFromZero(values),\n        };\n    }\n\n    // --- Zero-arbitrary types: never zero, apply padding ---\n    if (zeroClass === 'arbitrary') {\n        // Exception: bar/area marks with data that touches/crosses zero —\n        // the baseline is structurally required, so this is forced.\n        if (isBarLike && values && values.length > 0) {\n            const dataMin = Math.min(...values);\n            if (dataMin <= 0) {\n                return { zero: true, domainPadFraction: 0, zeroClass, forced: true, uncertain: false };\n            }\n        }\n        // Strictly away from zero on an arbitrary scale: zero is meaningless\n        // here, so data-fit is simply the right answer — there is nothing to\n        // debate and no toggle is offered.\n        return {\n            zero: false,\n            domainPadFraction: entry.zeroPad || 0.05,\n            zeroClass,\n            forced: false,\n            uncertain: false,\n        };\n    }\n\n    // --- Contextual types: use data range + mark to decide ---\n    if (zeroClass === 'contextual' && values && values.length > 0) {\n        const dataMin = Math.min(...values);\n        const dataMax = Math.max(...values);\n\n        // Data touches/crosses zero → include it (forced: the baseline is\n        // inside the data range).\n        if (dataMin <= 0) {\n            return { zero: true, domainPadFraction: 0, zeroClass, forced: true, uncertain: false };\n        }\n\n        // How far is data from zero?\n        const proximity = dataMax > 0 ? dataMin / dataMax : 0;\n\n        // Close to zero → include it. The engine's data-range call is confident\n        // enough here, so no toggle is offered.\n        if (proximity < 0.3) {\n            return { zero: true, domainPadFraction: 0, zeroClass, forced: false, uncertain: false };\n        }\n\n        // Far from zero + bar/area → still include (bar length integrity, forced).\n        if (isBarLike) {\n            return { zero: true, domainPadFraction: 0, zeroClass, forced: true, uncertain: false };\n        }\n\n        // Far from zero + non-bar → data-fit with padding (engine's call, no toggle).\n        return { zero: false, domainPadFraction: 0.05, zeroClass, forced: false, uncertain: false };\n    }\n\n    // --- No semantic type or unrecognized → no opinion, let VL decide ---\n    // Unknown class is never debatable: we have no basis for a toggle.\n    if (isBarLike && isPositional) {\n        return { zero: true, domainPadFraction: 0, zeroClass: 'unknown', forced: true, uncertain: false };\n    }\n    return { zero: false, domainPadFraction: 0.05, zeroClass: 'unknown', forced: true, uncertain: false };\n}\n\n/**\n * Compute padded domain bounds for a non-zero axis.\n * Pure computation — returns [paddedMin, paddedMax] without modifying any spec.\n *\n * @param values         Numeric data values\n * @param padFraction    Fraction of data range to pad on each side\n * @returns              [paddedMin, paddedMax] or null if padding is not applicable\n */\nexport function computePaddedDomain(\n    values: number[],\n    padFraction: number,\n): [number, number] | null {\n    if (padFraction <= 0 || values.length < 2) return null;\n\n    const dataMin = Math.min(...values);\n    const dataMax = Math.max(...values);\n    const span = dataMax - dataMin;\n    if (span <= 0) return null;\n\n    const padding = span * padFraction;\n    return [dataMin - padding, dataMax + padding];\n}\n\n// ---------------------------------------------------------------------------\n// Color Scheme Recommendations\n// ---------------------------------------------------------------------------\n\nexport type ColorSchemeType = 'categorical' | 'sequential' | 'diverging';\n\nexport interface ColorSchemeRecommendation {\n    scheme: string;\n    type: ColorSchemeType;\n    reason: string;\n    /** For diverging schemes, the recommended midpoint value */\n    domainMid?: number;\n}\n\n// getDivergingMidpoint: REMOVED — superseded by resolveDivergingInfo() in field-semantics.ts\n// which uses a priority chain (unit → type-intrinsic → domain → data) and\n// distinguishes inherent vs conditional diverging.\n\n/**\n * Vega-Lite color schemes organized by use case\n * See: https://vega.github.io/vega/docs/schemes/\n */\nconst colorSchemes = {\n    // Categorical (nominal) - good for distinct categories\n    categorical: {\n        default: 'category10',\n        large: 'category20',\n        pastel: 'pastel1',\n        accent: 'accent',\n        paired: 'paired',      // Good for paired comparisons\n        set1: 'set1',          // Distinct, saturated\n        set2: 'set2',          // Pastel\n        set3: 'set3',          // Larger set\n        tableau10: 'tableau10',\n        tableau20: 'tableau20',\n    },\n    // Sequential - good for ordered/quantitative data\n    sequential: {\n        blues: 'blues',\n        greens: 'greens',\n        oranges: 'oranges',\n        reds: 'reds',\n        purples: 'purples',\n        greys: 'greys',\n        // Multi-hue sequential\n        viridis: 'viridis',\n        inferno: 'inferno',\n        magma: 'magma',\n        plasma: 'plasma',\n        turbo: 'turbo',\n        // Domain-specific\n        yellowGreen: 'yellowgreen',\n        yellowOrangeBrown: 'yelloworangebrown',\n        goldGreen: 'goldgreen',\n        goldOrange: 'goldorange',\n        goldRed: 'goldred',\n    },\n    // Diverging - good for data with meaningful center point\n    diverging: {\n        redBlue: 'redblue',\n        redGrey: 'redgrey',\n        redYellowBlue: 'redyellowblue',\n        redYellowGreen: 'redyellowgreen',\n        pinkYellowGreen: 'pinkyellowgreen',\n        purpleGreen: 'purplegreen',\n        purpleOrange: 'purpleorange',\n        brownBlueGreen: 'brownbluegreen',\n    },\n};\n\n/**\n * Get recommended color scheme based on semantic type and encoding context.\n * \n * @param semanticType - The semantic type of the field\n * @param encodingType - The Vega-Lite encoding type ('nominal', 'ordinal', 'quantitative')\n * @param uniqueValueCount - Number of unique values (for categorical sizing)\n * @param fieldName - Field name (for consistent hashing)\n * @param values - Optional actual data values (for inspecting data range)\n * @param colorHint - Optional classification from resolveColorSchemeHint().\n *        When provided, the hint's type ('diverging'|'sequential'|'categorical')\n *        overrides inline detection, avoiding duplicate diverging logic.\n */\nexport function getRecommendedColorScheme(\n    semanticType: string | undefined,\n    encodingType: 'nominal' | 'ordinal' | 'quantitative' | 'temporal',\n    uniqueValueCount: number = 10,\n    fieldName: string = '',\n    values: any[] = [],\n    colorHint?: { type: 'categorical' | 'sequential' | 'diverging' },\n): ColorSchemeRecommendation {\n    \n    // Helper for consistent scheme selection from array\n    const pickScheme = (schemes: string[], name: string): string => {\n        let hash = 0;\n        for (let i = 0; i < name.length; i++) {\n            hash = ((hash << 5) - hash) + name.charCodeAt(i);\n            hash = hash & hash;\n        }\n        return schemes[Math.abs(hash) % schemes.length];\n    };\n\n    // If no semantic type, use defaults based on encoding type\n    if (!semanticType) {\n        if (encodingType === 'quantitative') {\n            return { scheme: 'viridis', type: 'sequential', reason: 'default for quantitative' };\n        }\n        if (encodingType === 'ordinal') {\n            return { scheme: 'blues', type: 'sequential', reason: 'default for ordinal' };\n        }\n        // nominal/temporal default to categorical — use saturated schemes for readability\n        return { \n            scheme: uniqueValueCount > 10 ? 'tableau20' : 'tableau10', \n            type: 'categorical', \n            reason: 'default for categorical' \n        };\n    }\n\n    // --- Diverging-capable types ---\n    // When a colorHint is provided (from resolveColorSchemeHint), it drives the\n    // diverging/sequential decision. Without a hint, fall back to sequential.\n    // This avoids duplicating the diverging detection logic from field-semantics.ts.\n\n    // Temperature\n    if (semanticType === 'Temperature') {\n        if (colorHint?.type === 'diverging') {\n            return { scheme: 'redblue', type: 'diverging', reason: 'temperature diverging around freezing point' };\n        }\n        return { scheme: 'reds', type: 'sequential', reason: 'temperature single-direction uses sequential' };\n    }\n\n    // Percentage\n    if (semanticType === 'Percentage') {\n        if (colorHint?.type === 'diverging') {\n            return { scheme: 'redblue', type: 'diverging', reason: 'percentage spans positive and negative' };\n        }\n        return { scheme: 'oranges', type: 'sequential', reason: 'percentage all same sign uses sequential' };\n    }\n\n    // Price/Amount\n    if (['Price', 'Amount'].includes(semanticType)) {\n        if (colorHint?.type === 'diverging') {\n            return { scheme: 'redblue', type: 'diverging', reason: 'financial data spans positive and negative' };\n        }\n        return { scheme: 'goldgreen', type: 'sequential', reason: 'financial data uses gold-green' };\n    }\n\n    // Score - evaluation metrics; diverging when hint says so (e.g., domain midpoint)\n    if (semanticType === 'Score') {\n        if (colorHint?.type === 'diverging') {\n            return { scheme: 'redblue', type: 'diverging', reason: 'score/rating diverging around midpoint' };\n        }\n        return { scheme: 'yelloworangebrown', type: 'sequential', reason: 'scores use warm sequential' };\n    }\n\n    // Rank - use single-hue sequential\n    if (semanticType === 'Rank') {\n        return { scheme: 'purples', type: 'sequential', reason: 'ranks use single-hue sequential' };\n    }\n\n    // Ranges - use sequential\n    if (semanticType === 'Range') {\n        return { scheme: 'blues', type: 'sequential', reason: 'range groups use sequential' };\n    }\n\n    // Temporal granules (Year, Month, Quarter, etc.) - sequential for continuity\n    if (ordinalTypes.has(semanticType) && ['Year', 'Quarter', 'Month', 'Week', 'Day', 'Hour', 'Decade'].includes(semanticType)) {\n        return { scheme: 'viridis', type: 'sequential', reason: 'temporal granules use perceptually uniform' };\n    }\n\n    // Geographic locations - use geographic-friendly palettes\n    if (getRegistryEntry(semanticType ?? '').t1 === 'GeoPlace') {\n        if (uniqueValueCount <= 10) {\n            return { scheme: 'set2', type: 'categorical', reason: 'geographic regions use distinct pastels' };\n        }\n        return { scheme: 'tableau20', type: 'categorical', reason: 'many regions use large categorical' };\n    }\n\n    // Status/Boolean - use accent colors for clear distinction\n    if (['Status', 'Boolean'].includes(semanticType)) {\n        return { scheme: 'set1', type: 'categorical', reason: 'status uses high-contrast categorical' };\n    }\n\n    // Categories - use standard categorical\n    if (semanticType === 'Category') {\n        return { \n            scheme: uniqueValueCount > 10 ? 'tableau20' : 'tableau10', \n            type: 'categorical', \n            reason: 'categories use standard categorical' \n        };\n    }\n\n    // Names (persons, companies, products) - use saturated schemes for readability\n    if (semanticType === 'Name') {\n        return { \n            scheme: uniqueValueCount > 8 ? 'tableau20' : 'set2', \n            type: 'categorical', \n            reason: 'names use readable categorical' \n        };\n    }\n\n    // Duration - use sequential (longer = more intense)\n    if (semanticType === 'Duration') {\n        return { scheme: 'oranges', type: 'sequential', reason: 'duration uses intensity-based sequential' };\n    }\n\n    // Quantity/Count/Distance/etc. - general measures\n    // Check colorHint first — signed measures (Profit, Sentiment, Correlation,\n    // PercentageChange) pass through here and should honor their diverging hint.\n    if (measureTypes.has(semanticType)) {\n        if (colorHint?.type === 'diverging') {\n            return { scheme: 'redblue', type: 'diverging', reason: 'measure with diverging nature' };\n        }\n        const sequentialSchemes = ['viridis', 'blues', 'greens', 'reds', 'yelloworangebrown', 'goldgreen'];\n        return { \n            scheme: pickScheme(sequentialSchemes, fieldName), \n            type: 'sequential', \n            reason: 'measures use perceptually uniform sequential' \n        };\n    }\n\n    // Ordinal types not already handled\n    if (ordinalTypes.has(semanticType) || encodingType === 'ordinal') {\n        const ordinalSchemes = ['blues', 'greens', 'purples', 'oranges'];\n        return { \n            scheme: pickScheme(ordinalSchemes, fieldName), \n            type: 'sequential', \n            reason: 'ordinal data uses sequential scheme' \n        };\n    }\n\n    // Default categorical for nominal\n    if (encodingType === 'nominal' || encodingType === 'temporal') {\n        return { \n            scheme: uniqueValueCount > 10 ? 'tableau20' : 'tableau10', \n            type: 'categorical', \n            reason: 'default categorical palette' \n        };\n    }\n\n    // Fallback\n    return { scheme: 'viridis', type: 'sequential', reason: 'universal fallback' };\n}\n\n// getRecommendedColorSchemeWithMidpoint: REMOVED — diverging midpoint is now\n// resolved via resolveDivergingInfo() in field-semantics.ts and applied directly\n// by the caller in resolve-semantics.ts. See resolveChannelSemantics().\n\n// ===========================================================================\n// Canonical Ordinal Sort Orders\n// ===========================================================================\n\n/**\n * Well-known canonical ordinal sequences.\n *\n * Used to detect when data values belong to a known ordinal domain\n * (months, days of the week, quarters, etc.) and sort them in their\n * natural order instead of alphabetically or by a quantitative axis.\n */\n\n/** Full and abbreviated English month names (case-insensitive lookup). */\nconst MONTH_FULL = ['January','February','March','April','May','June','July','August','September','October','November','December'];\nconst MONTH_ABBR3 = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\nconst MONTH_NUM = ['1','2','3','4','5','6','7','8','9','10','11','12'];\n\n/** Full and abbreviated English day-of-week names. */\nconst DOW_FULL = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];\nconst DOW_ABBR3 = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];\nconst DOW_ABBR2 = ['Mo','Tu','We','Th','Fr','Sa','Su'];\n\n/** Sunday-first variant (US convention). */\nconst DOW_FULL_SUN = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\nconst DOW_ABBR3_SUN = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];\n\n/** Quarter labels. */\nconst QUARTER_LABELS = ['Q1','Q2','Q3','Q4'];\n\n/** Compass directions — clockwise from North (top of chart). */\nconst COMPASS_8 = ['N','NE','E','SE','S','SW','W','NW'];\nconst COMPASS_8_FULL = ['North','Northeast','East','Southeast','South','Southwest','West','Northwest'];\nconst COMPASS_4 = ['N','E','S','W'];\nconst COMPASS_4_FULL = ['North','East','South','West'];\n\ninterface OrdinalSequence {\n    /** Canonical labels in order */\n    labels: string[];\n    /** Case-insensitive matching */\n    caseInsensitive: boolean;\n}\n\n/** All known ordinal sequences, keyed by semantic type. */\nconst ORDINAL_SEQUENCES: Record<string, OrdinalSequence[]> = {\n    Month: [\n        { labels: MONTH_FULL, caseInsensitive: true },\n        { labels: MONTH_ABBR3, caseInsensitive: true },\n        { labels: MONTH_NUM, caseInsensitive: false },\n    ],\n    Day: [\n        { labels: DOW_FULL, caseInsensitive: true },\n        { labels: DOW_ABBR3, caseInsensitive: true },\n        { labels: DOW_ABBR2, caseInsensitive: true },\n        { labels: DOW_FULL_SUN, caseInsensitive: true },\n        { labels: DOW_ABBR3_SUN, caseInsensitive: true },\n    ],\n    Quarter: [\n        { labels: QUARTER_LABELS, caseInsensitive: true },\n    ],\n    Direction: [\n        { labels: COMPASS_8, caseInsensitive: true },\n        { labels: COMPASS_8_FULL, caseInsensitive: true },\n        { labels: COMPASS_4, caseInsensitive: true },\n        { labels: COMPASS_4_FULL, caseInsensitive: true },\n    ],\n};\n\n/**\n * Build a case-insensitive lookup map from a sequence's labels.\n * Returns map: lowercased label → index.\n */\nfunction buildLookup(seq: OrdinalSequence): Map<string, number> {\n    const m = new Map<string, number>();\n    for (let i = 0; i < seq.labels.length; i++) {\n        const key = seq.caseInsensitive ? seq.labels[i].toLowerCase() : seq.labels[i];\n        m.set(key, i);\n    }\n    return m;\n}\n\n/**\n * Try to match a set of data values against a well-known ordinal sequence.\n *\n * Returns the canonical sort order (subset of the sequence, in order) if\n * enough values match, or `undefined` if no match.\n *\n * Matching rules:\n * - At least 60% of unique data values must be found in the sequence\n * - All matched values are returned in canonical order\n * - Unmatched values are appended at the end (preserving data order)\n *\n * @param values     The data values (strings or numbers) on this channel\n * @param sequences  The candidate sequences for the semantic type\n */\nfunction matchSequence(values: any[], sequences: OrdinalSequence[]): string[] | undefined {\n    const uniqueValues = [...new Set(values.map(v => v != null ? String(v) : ''))].filter(v => v !== '');\n    if (uniqueValues.length === 0) return undefined;\n\n    for (const seq of sequences) {\n        const lookup = buildLookup(seq);\n        const matched: { value: string; index: number }[] = [];\n        const unmatched: string[] = [];\n\n        for (const val of uniqueValues) {\n            const key = seq.caseInsensitive ? val.toLowerCase() : val;\n            const idx = lookup.get(key);\n            if (idx !== undefined) {\n                matched.push({ value: val, index: idx });\n            } else {\n                unmatched.push(val);\n            }\n        }\n\n        // Require at least 60% match rate\n        if (matched.length >= uniqueValues.length * 0.6 && matched.length >= 2) {\n            // Sort matched values by canonical index\n            matched.sort((a, b) => a.index - b.index);\n            const result = matched.map(m => m.value);\n            // Append unmatched at the end\n            result.push(...unmatched);\n            return result;\n        }\n    }\n    return undefined;\n}\n\n/**\n * Infer a canonical ordinal sort order for a field based on its semantic type\n * and data values.\n *\n * Works for:\n * - Month names (full/abbreviated/numeric): Jan, Feb, ... or January, February, ...\n * - Day-of-week names (full/abbreviated): Mon, Tue, ... or Monday, Tuesday, ...\n * - Quarter labels: Q1, Q2, Q3, Q4\n *\n * Falls back to `undefined` if no known sequence is detected, letting the\n * caller use its own default sort logic.\n *\n * @param semanticType  The semantic type of the field (e.g. 'Month', 'Day')\n * @param values        The data values on this channel\n * @returns Sorted unique values in canonical order, or undefined\n */\nexport function inferOrdinalSortOrder(\n    semanticType: string,\n    values: any[],\n): string[] | undefined {\n    // 1. Check by explicit semantic type\n    const sequences = ORDINAL_SEQUENCES[semanticType];\n    if (sequences) {\n        return matchSequence(values, sequences);\n    }\n\n    // 2. Auto-detect: try all sequences if semantic type is generic\n    if (!semanticType || semanticType === 'Category' || semanticType === 'Unknown') {\n        for (const seqs of Object.values(ORDINAL_SEQUENCES)) {\n            const result = matchSequence(values, seqs);\n            if (result) return result;\n        }\n    }\n\n    return undefined;\n}\n\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * REUSABLE DECISION LOGIC\n * =============================================================================\n *\n * Pure decision functions that determine chart layout behavior.\n * These functions take data/config inputs and return decision objects —\n * NO Vega-Lite spec mutation happens here.\n *\n * The separation ensures:\n * 1. Decision logic is testable in isolation\n * 2. Same decisions can drive different output formats (VL, SVG, etc.)\n * 3. Templates can call decision functions without coupling to VL\n *\n * Naming conventions:\n *   - `compute*()` — returns a decision/value from inputs\n *   - `resolve*()` — picks from alternatives (type resolution, etc.)\n *   - `classify*()` — categorizes an input\n * =============================================================================\n */\n\nimport {\n    inferVisCategory,\n    type VisCategory,\n} from './semantic-types';\nimport { getRegistryEntry, isRegistered } from './type-registry';\n\n// ---------------------------------------------------------------------------\n// Encoding Type Resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Result of encoding type resolution.\n * Separates the decision from what gets written into VL.\n */\nexport interface EncodingTypeDecision {\n    /** The resolved VL encoding type */\n    vlType: 'quantitative' | 'ordinal' | 'nominal' | 'temporal';\n    /** The VisCategory that drove the decision */\n    visCategory: VisCategory;\n    /** Whether the type was overridden by channel rules */\n    channelOverride: boolean;\n    /** Whether the type was overridden by cardinality/fraction guard */\n    cardinalityGuard: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for encoding type resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Map a VisCategory to the corresponding VL encoding type string.\n * Geographic maps to quantitative since VL uses quantitative for coordinates.\n */\nfunction visCategoryToVLType(vc: VisCategory): 'quantitative' | 'ordinal' | 'nominal' | 'temporal' {\n    switch (vc) {\n        case 'quantitative': return 'quantitative';\n        case 'ordinal': return 'ordinal';\n        case 'temporal': return 'temporal';\n        case 'geographic': return 'quantitative';\n        case 'nominal':\n        default: return 'nominal';\n    }\n}\n\n/**\n * Validate that field values actually parse as dates.\n *\n * @param fromRegistry  If true, uses a looser threshold (≥30%) since the\n *                      semantic type explicitly identified the field as temporal.\n *                      If false (data-inferred), requires ≥50%.\n */\nfunction validateTemporalParsing(\n    data: any[],\n    fieldName: string,\n    fromRegistry: boolean,\n): boolean {\n    const sampleValues = data.map(r => r[fieldName]).slice(0, 15).filter((v: any) => v != null);\n    if (sampleValues.length === 0) return false;\n\n    // Single unique value → not useful as temporal axis (would show a single point)\n    const uniqueValues = new Set(sampleValues.map(String));\n    if (uniqueValues.size <= 1) return false;\n\n    const looksTemporalValue = (val: any): boolean => {\n        if (val instanceof Date) return true;\n        if (typeof val === 'number') {\n            // Year-like integers (1500–2200)\n            if (val >= 1500 && val <= 2200 && val % 1 === 0) return true;\n            // Unix-ms timestamps: 86_400_000 (Jan 2, 1970) to ~year 2103\n            if (val > 86400000 && val < 4200000000000) return true;\n            return false;\n        }\n        if (typeof val === 'string') {\n            const trimmed = val.trim();\n            if (!trimmed) return false;\n            if (/^\\d{4}$/.test(trimmed)) return true;\n            return !Number.isNaN(Date.parse(trimmed));\n        }\n        return false;\n    };\n\n    const passingCount = sampleValues.filter(looksTemporalValue).length;\n    const minFraction = fromRegistry ? 0.3 : 0.5;\n    return passingCount / sampleValues.length >= minFraction;\n}\n\n/**\n * Apply temporal channel-compatibility adjustments, shared by both\n * registry-driven and data-inferred temporal paths.\n */\nfunction resolveTemporalEncoding(\n    visCategory: VisCategory,\n    channel: string,\n    data: any[],\n    fieldName: string,\n    fromRegistry: boolean,\n): EncodingTypeDecision {\n    // Temporal on facet/size channels → ordinal (VL limitation)\n    if (['size', 'column', 'row'].includes(channel)) {\n        return { vlType: 'ordinal', visCategory, channelOverride: true, cardinalityGuard: false };\n    }\n    // Temporal on color with low cardinality → ordinal for distinct colors\n    if (channel === 'color') {\n        const uniqueCount = new Set(data.map(r => r[fieldName])).size;\n        if (uniqueCount <= 12) {\n            return { vlType: 'ordinal', visCategory, channelOverride: true, cardinalityGuard: false };\n        }\n    }\n    // Validate temporal parsing\n    if (!validateTemporalParsing(data, fieldName, fromRegistry)) {\n        return { vlType: 'ordinal', visCategory, channelOverride: false, cardinalityGuard: false };\n    }\n    return { vlType: 'temporal', visCategory, channelOverride: false, cardinalityGuard: false };\n}\n\n/**\n * Apply channel-context guards to an ordinal encoding.\n *\n * Even when the registry says a field is ordinal, channel context may\n * require promoting to quantitative:\n *   - High cardinality on color/group → unreadable legend\n *   - High cardinality on x/y        → bars/lollipops need proportional\n *     spacing and baseline anchoring (y2/x2)\n *   - Fractional values + high cardinality → mis-classified continuous measure\n *\n * @param fromRegistry  Whether the ordinal type came from the registry\n *        (true) or was data-inferred (false). Data-inferred additionally\n *        checks for fractional values (Guard 1).\n */\nfunction applyOrdinalGuards(\n    visCategory: VisCategory,\n    channel: string,\n    data: any[],\n    fieldName: string,\n    fieldValues: any[],\n    fromRegistry: boolean,\n): EncodingTypeDecision {\n    const numericVals = fieldValues.filter(v => v != null && !isNaN(+v)).map(Number);\n    if (numericVals.length > 0) {\n        const uniqueCount = new Set(numericVals).size;\n        const hasFractions = numericVals.some(v => v % 1 !== 0);\n\n        // Guard 1 (data-inferred only): fractional + high-cardinality →\n        // mis-classified continuous measure. Registry types are explicit,\n        // so this guard only applies when the type was inferred from data.\n        if (!fromRegistry && hasFractions && uniqueCount > 20) {\n            return { vlType: 'quantitative', visCategory, channelOverride: false, cardinalityGuard: true };\n        }\n\n        // Guard 2: integer ordinal with high cardinality on color/group →\n        // a discrete legend with 12+ entries is unreadable; promote to\n        // quantitative so VL renders a continuous gradient instead.\n        if (!hasFractions && uniqueCount > 12 && ['color', 'group'].includes(channel)) {\n            return { vlType: 'quantitative', visCategory, channelOverride: true, cardinalityGuard: true };\n        }\n\n        // Guard 3: integer ordinal with high cardinality on position\n        // axes (x, y) → charts like bar/lollipop need a quantitative\n        // axis for proportional length; treating 12+ unique integers\n        // as discrete categories produces an unreadable axis and\n        // prevents baseline anchoring (y2/x2).\n        if (!hasFractions && uniqueCount > 12 && ['x', 'y'].includes(channel)) {\n            return { vlType: 'quantitative', visCategory, channelOverride: true, cardinalityGuard: true };\n        }\n    }\n    return { vlType: 'ordinal', visCategory, channelOverride: false, cardinalityGuard: false };\n}\n\n/**\n * Disambiguate when the registry lists multiple visEncodings for a type.\n *\n * Uses channel context and data characteristics to select the most\n * appropriate encoding from the candidates. Each combination of\n * candidate encodings has dedicated logic:\n *\n *   temporal + ordinal  (Year, YearMonth, Decade, …)\n *   quantitative + ordinal  (Score, Rating)\n *   quantitative + geographic  (Latitude, Longitude)\n *   ordinal + nominal  (Direction)\n */\nfunction disambiguateMultiEncoding(\n    candidates: VisCategory[],\n    channel: string,\n    data: any[],\n    fieldName: string,\n    fieldValues: any[],\n): EncodingTypeDecision {\n    const has = (vc: VisCategory) => candidates.includes(vc);\n\n    // ── Temporal + Ordinal (Year, YearMonth, Decade, etc.) ────────\n    // Time-unit granules. Temporal for continuous time axes (x/y);\n    // ordinal for grouping channels (color, facet, size).\n    if (has('temporal') && has('ordinal')) {\n        return resolveTemporalEncoding('temporal', channel, data, fieldName, true);\n    }\n\n    // ── Quantitative + Ordinal (Score, Rating) ────────────────────\n    // Bounded discrete numerics. Use ordinal for grouping channels\n    // with low cardinality (distinct colors/symbols); quantitative\n    // for position axes (proportional spacing, zero-baseline).\n    if (has('quantitative') && has('ordinal')) {\n        if (['color', 'group'].includes(channel)) {\n            const uniqueCount = new Set(data.map(r => r[fieldName])).size;\n            if (uniqueCount <= 12) {\n                return { vlType: 'ordinal', visCategory: 'ordinal', channelOverride: false, cardinalityGuard: false };\n            }\n            // High-cardinality Score/Rating on color → quantitative gradient\n            return { vlType: 'quantitative', visCategory: 'quantitative', channelOverride: false, cardinalityGuard: true };\n        }\n        if (['column', 'row'].includes(channel)) {\n            return { vlType: 'ordinal', visCategory: 'ordinal', channelOverride: false, cardinalityGuard: false };\n        }\n        // x, y, size → quantitative (proportional axis)\n        return { vlType: 'quantitative', visCategory: 'quantitative', channelOverride: false, cardinalityGuard: false };\n    }\n\n    // ── Quantitative + Geographic (Latitude, Longitude) ───────────\n    // Geographic is for map projections; standard encodings use quantitative.\n    if (has('quantitative') && has('geographic')) {\n        return { vlType: 'quantitative', visCategory: 'quantitative', channelOverride: false, cardinalityGuard: false };\n    }\n\n    // ── Ordinal + Nominal (Direction) ─────────────────────────────\n    // Inherently ordered, but nominal for grouping channels to get\n    // distinct (unordered) colors rather than a sequential scale.\n    if (has('ordinal') && has('nominal')) {\n        if (['color', 'group'].includes(channel)) {\n            return { vlType: 'nominal', visCategory: 'nominal', channelOverride: false, cardinalityGuard: false };\n        }\n        return { vlType: 'ordinal', visCategory: 'ordinal', channelOverride: false, cardinalityGuard: false };\n    }\n\n    // ── Fallback: first candidate ─────────────────────────────────\n    const fallback = candidates[0];\n    return { vlType: visCategoryToVLType(fallback), visCategory: fallback, channelOverride: false, cardinalityGuard: false };\n}\n\n// ---------------------------------------------------------------------------\n// Main API\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the VL encoding type for a field.\n *\n * Two-stage pipeline:\n *\n * **Stage 1 — Registry-driven** (when semanticType is registered):\n *   - Single visEncoding  → use it directly (with channel adjustments)\n *   - Multiple visEncodings → `disambiguateMultiEncoding()` selects best\n *     option using channel context + data characteristics\n *\n * **Stage 2 — Data-inferred fallback** (no registered semantic type):\n *   - `inferVisCategory()` inspects raw values → VisCategory\n *   - Heuristic guards catch common mis-classifications (e.g., dense\n *     fractional data inferred as ordinal)\n *\n * This is a pure decision — it does NOT mutate any spec.\n *\n * @param semanticType   Semantic type string (e.g. 'Quantity', 'Country')\n * @param fieldValues    Sampled values from the field\n * @param channel        VL channel name (e.g. 'x', 'y', 'color')\n * @param data           Full data table (for computing unique value counts)\n * @param fieldName      Field name (for data lookups)\n */\nexport function resolveEncodingType(\n    semanticType: string,\n    fieldValues: any[],\n    channel: string,\n    data: any[],\n    fieldName: string,\n): EncodingTypeDecision {\n    // ═══════════════════════════════════════════════════════════════════\n    // Stage 1: Registry-driven resolution\n    // ═══════════════════════════════════════════════════════════════════\n    // The registry's visEncodings array is the source of truth.\n    //   - Single encoding  → resolved directly\n    //   - Multiple encodings → disambiguated by channel + data\n    if (semanticType && isRegistered(semanticType)) {\n        const entry = getRegistryEntry(semanticType);\n        const candidates = entry.visEncodings;\n\n        if (candidates.length > 1) {\n            // Multiple encodings listed — disambiguate semantically\n            return disambiguateMultiEncoding(candidates, channel, data, fieldName, fieldValues);\n        }\n\n        // Single encoding — use it directly with channel adjustments\n        const baseType = candidates[0];\n\n        // Guard: if the registry says quantitative but the actual values\n        // are strings (e.g. semantic \"Quantity\" on a binned field like\n        // \"91-95\"), fall back to data-inferred type.  Numeric strings\n        // that parse as numbers (e.g. \"42\") still count as numeric.\n        if (baseType === 'quantitative') {\n            const nonNull = fieldValues.filter(v => v != null);\n            const allNumeric = nonNull.length > 0 &&\n                nonNull.every(v => typeof v === 'number' || (typeof v === 'string' && !isNaN(+v) && v.trim() !== ''));\n            if (!allNumeric) {\n                // Values aren't actually numeric — infer from data instead\n                const inferred = inferVisCategory(fieldValues);\n                return {\n                    vlType: visCategoryToVLType(inferred),\n                    visCategory: inferred,\n                    channelOverride: false,\n                    cardinalityGuard: false,\n                };\n            }\n        }\n\n        if (baseType === 'temporal') {\n            return resolveTemporalEncoding(baseType, channel, data, fieldName, true);\n        }\n        if (baseType === 'ordinal') {\n            return applyOrdinalGuards(baseType, channel, data, fieldName, fieldValues, true);\n        }\n        return {\n            vlType: visCategoryToVLType(baseType),\n            visCategory: baseType,\n            channelOverride: false,\n            cardinalityGuard: false,\n        };\n    }\n\n    // ═══════════════════════════════════════════════════════════════════\n    // Stage 2: Data-inferred fallback\n    // ═══════════════════════════════════════════════════════════════════\n    // No registered semantic type — infer from raw data values, then\n    // apply heuristic guards for common data-inference mis-classifications.\n    const visCategory: VisCategory = inferVisCategory(fieldValues);\n    const channelOverride = false;\n    const cardinalityGuard = false;\n\n    switch (visCategory) {\n        case 'temporal':\n            return resolveTemporalEncoding(visCategory, channel, data, fieldName, false);\n\n        case 'ordinal':\n            return applyOrdinalGuards(visCategory, channel, data, fieldName, fieldValues, false);\n\n        case 'quantitative':\n            return { vlType: 'quantitative', visCategory, channelOverride, cardinalityGuard };\n\n        case 'geographic':\n            return { vlType: 'quantitative', visCategory, channelOverride, cardinalityGuard };\n\n        case 'nominal':\n        default:\n            return { vlType: 'nominal', visCategory, channelOverride, cardinalityGuard };\n    }\n}\n\n// ---------------------------------------------------------------------------\n// Continuous Axis Gas Pressure Model (docs/design-stretch-model.md §2)\n// ---------------------------------------------------------------------------\n\n/**\n * Parameters for the per-axis stretch model (docs/design-stretch-model.md §2).\n *\n * Each axis is stretched independently based on how many distinguishable\n * positions (or series) compete for pixel space along that axis.\n */\nexport interface GasPressureParams {\n    /** Mark cross-section in px² — used as default σ for both axes (default: 30) */\n    markCrossSection: number;\n    /** Per-axis cross-section overrides. When set, the per-axis stretch\n     *  uses these instead of `markCrossSection`.\n     *  Useful for line charts where X needs more stretch than Y. */\n    markCrossSectionX?: number;\n    markCrossSectionY?: number;\n    /** Override X item count for stretch.\n     *  When set, X stretch uses this count (e.g. number of series)\n     *  instead of counting unique X pixel positions. */\n    xItemCountOverride?: number;\n    /** Override Y item count for stretch.\n     *  When set, Y stretch uses this count (e.g. number of series)\n     *  instead of counting unique Y pixel positions. */\n    yItemCountOverride?: number;\n    /** Power-law exponent for continuous stretch (default: 0.3) */\n    elasticity: number;\n    /** Maximum stretch multiplier cap (default: 1.5) */\n    maxStretch: number;\n}\n\n/** Default gas pressure parameters (§2 recommendations). */\nexport const DEFAULT_GAS_PRESSURE_PARAMS: GasPressureParams = {\n    markCrossSection: 30,\n    elasticity: 0.3,\n    maxStretch: 1.5,\n};\n\n/**\n * Result of the per-axis stretch decision.\n */\nexport interface GasPressureDecision {\n    /** Per-axis stretch: X axis (1 = no stretch, capped by maxStretch) */\n    stretchX: number;\n    /** Per-axis stretch: Y axis (1 = no stretch, capped by maxStretch) */\n    stretchY: number;\n    /** Uncapped stretch for X (raw pressure^elasticity, not clipped to maxStretch).\n     *  Used by the layout engine to compute ideal aspect ratio before squeezing. */\n    rawStretchX: number;\n    /** Uncapped stretch for Y (raw pressure^elasticity, not clipped to maxStretch). */\n    rawStretchY: number;\n}\n\n/**\n * Compute per-axis stretch for a continuous 2D axis region.\n *\n * Implements docs/design-stretch-model.md §2: each axis is stretched independently based\n * on how many distinguishable positions (or series) compete for pixel\n * space along that axis.\n *\n * Two modes per axis:\n *   - Positional: count unique pixel positions, σ_1d = √σ.\n *   - Series-count: when xItemCountOverride / yItemCountOverride is set,\n *     use that count directly with σ (not sqrt'd) since it's already 1D.\n *\n * @param xValues      Numeric x-coordinates of data points\n * @param yValues      Numeric y-coordinates of data points\n * @param xDomain      Scale domain [min, max] for x-axis\n * @param yDomain      Scale domain [min, max] for y-axis\n * @param canvasWidth  Base canvas width W₀\n * @param canvasHeight Base canvas height H₀\n * @param params       Gas pressure parameters (optional, uses defaults)\n */\nexport function computeGasPressure(\n    xValues: number[],\n    yValues: number[],\n    xDomain: [number, number],\n    yDomain: [number, number],\n    canvasWidth: number,\n    canvasHeight: number,\n    params: GasPressureParams = DEFAULT_GAS_PRESSURE_PARAMS,\n): GasPressureDecision {\n    const N = xValues.length;\n\n    if (N <= 1 || canvasWidth <= 0 || canvasHeight <= 0) {\n        return { stretchX: 1, stretchY: 1, rawStretchX: 1, rawStretchY: 1 };\n    }\n\n    // Per-axis stretch via unique-position linear packing.\n    // The question for each axis is: \"how many distinguishable positions\n    // compete for pixel space along this axis?\"\n    //\n    // Count unique positions (bucketed to ~1px resolution) along each\n    // axis. Each unique position needs σ_1d ≈ √σ pixels of space.\n    // 1D pressure = uniquePositions × σ_1d / axisDimension.\n    const sigma1dDefault = Math.sqrt(params.markCrossSection); // ~5 px\n\n    /** Returns [cappedStretch, rawStretch] for one axis. */\n    const computeAxisStretch = (values: number[], domain: [number, number], baseDim: number, sigma1d: number): [number, number] => {\n        if (baseDim <= 0 || values.length <= 1) return [1, 1];\n\n        const range = domain[1] - domain[0];\n        if (range <= 0) return [1, 1];\n\n        // Bucket values to ~1px resolution in pixel space\n        const pxPerUnit = baseDim / range;\n        const seen = new Set<number>();\n        for (const v of values) {\n            seen.add(Math.round((v - domain[0]) * pxPerUnit));\n        }\n        const uniquePositions = seen.size;\n\n        // 1D pressure: how many sigma-sized marks fight for baseDim pixels\n        const pressure = (uniquePositions * sigma1d) / baseDim;\n        if (pressure <= 1) return [1, 1];\n        const raw = Math.pow(pressure, params.elasticity);\n        return [Math.min(params.maxStretch, raw), raw];\n    };\n\n    const sigma1dX = params.markCrossSectionX != null ? Math.sqrt(params.markCrossSectionX) : sigma1dDefault;\n    const sigma1dY = params.markCrossSectionY != null ? Math.sqrt(params.markCrossSectionY) : sigma1dDefault;\n\n    // Helper: compute stretch for one axis, using series-count override if set.\n    // When a series override is provided, σ is used directly (not sqrt'd)\n    // because series count is already a 1D concept.\n    /** Returns [cappedStretch, rawStretch] for one axis, with series-count override support. */\n    const computeStretchForAxis = (\n        values: number[], domain: [number, number], baseDim: number,\n        sigma1d: number, sigmaRaw: number, itemCountOverride?: number,\n    ): [number, number] => {\n        if (itemCountOverride != null && sigmaRaw > 0) {\n            const pressure = (itemCountOverride * sigmaRaw) / baseDim;\n            if (pressure <= 1) return [1, 1];\n            const raw = Math.pow(pressure, params.elasticity);\n            return [Math.min(params.maxStretch, raw), raw];\n        }\n        return sigma1d > 0 ? computeAxisStretch(values, domain, baseDim, sigma1d) : [1, 1];\n    };\n\n    const sigmaRawX = params.markCrossSectionX ?? params.markCrossSection;\n    const sigmaRawY = params.markCrossSectionY ?? params.markCrossSection;\n    const [stretchX, rawStretchX] = computeStretchForAxis(xValues, xDomain, canvasWidth, sigma1dX, sigmaRawX, params.xItemCountOverride);\n    const [stretchY, rawStretchY] = computeStretchForAxis(yValues, yDomain, canvasHeight, sigma1dY, sigmaRawY, params.yItemCountOverride);\n\n    return { stretchX, stretchY, rawStretchX, rawStretchY };\n}\n\n// ---------------------------------------------------------------------------\n// Elastic Stretch Computation\n// ---------------------------------------------------------------------------\n\n/**\n * Parameters for elastic axis stretch computation.\n * These control the spring-model behavior from docs/design-stretch-model.md §1.\n */\nexport interface ElasticStretchParams {\n    /** Power-law exponent for stretch (default: 0.5) */\n    elasticity: number;\n    /** Maximum stretch multiplier cap (default: 2) */\n    maxStretch: number;\n    /** Default step size in px per discrete item */\n    defaultStepSize: number;\n    /** Minimum pixels per discrete item (default: 6) */\n    minStep: number;\n}\n\n/**\n * Result of elastic budget computation for a single axis.\n */\nexport interface ElasticBudget {\n    /** Elastic-stretched canvas budget in px */\n    budget: number;\n    /** Stretch multiplier applied (1 = no stretch) */\n    stretchFactor: number;\n}\n\n/**\n * Compute the elastic canvas budget for an axis with N discrete items.\n *\n * When N items at defaultStepSize exceed the base dimension, the axis\n * stretches using a power-law: stretch = min(maxStretch, pressure^elasticity).\n *\n * @param itemCount       Number of discrete items on the axis\n * @param baseDimension   Base canvas size (width or height) in px\n * @param params          Elastic stretch parameters\n */\nexport function computeElasticBudget(\n    itemCount: number,\n    baseDimension: number,\n    params: ElasticStretchParams,\n): ElasticBudget {\n    if (itemCount <= 0) {\n        return { budget: baseDimension, stretchFactor: 1 };\n    }\n    const pressure = (itemCount * params.defaultStepSize) / baseDimension;\n    if (pressure <= 1) {\n        return { budget: baseDimension, stretchFactor: 1 };\n    }\n    const stretchFactor = Math.min(params.maxStretch, Math.pow(pressure, params.elasticity));\n    return {\n        budget: baseDimension * stretchFactor,\n        stretchFactor,\n    };\n}\n\n/**\n * Result of per-axis step computation.\n */\nexport interface AxisStepDecision {\n    /** Computed step size in px per item */\n    step: number;\n    /** Total canvas budget in px */\n    budget: number;\n    /** Number of items this step was computed for */\n    itemCount: number;\n}\n\n/**\n * Compute the step size for a single axis, covering both discrete\n * and continuous-as-discrete (banded) cases.\n *\n * @param nominalCount       Number of discrete (nominal/ordinal) items\n * @param continuousCount    Number of continuous-as-discrete items (banded Q/T)\n * @param baseDimension      Base canvas size (width or height) in px\n * @param params             Elastic stretch parameters\n */\nexport function computeAxisStep(\n    nominalCount: number,\n    continuousCount: number,\n    baseDimension: number,\n    params: ElasticStretchParams,\n): AxisStepDecision {\n    if (nominalCount > 0) {\n        const { budget } = computeElasticBudget(nominalCount, baseDimension, params);\n        return { step: Math.floor(budget / nominalCount), budget, itemCount: nominalCount };\n    }\n    if (continuousCount > 0) {\n        const { budget } = computeElasticBudget(continuousCount, baseDimension, params);\n        return { step: Math.floor(budget / continuousCount), budget, itemCount: continuousCount };\n    }\n    return { step: params.defaultStepSize, budget: baseDimension, itemCount: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// Facet Layout Decisions\n// ---------------------------------------------------------------------------\n\n/**\n * Result of facet layout computation.\n */\nexport interface FacetLayoutDecision {\n    /** Number of facet columns */\n    columns: number;\n    /** Number of facet rows */\n    rows: number;\n    /** Per-subplot width in px */\n    subplotWidth: number;\n    /** Per-subplot height in px */\n    subplotHeight: number;\n}\n\n/**\n * Parameters for facet layout computation.\n */\nexport interface FacetLayoutParams {\n    /** Power-law exponent for facet stretch (default: 0.3) */\n    facetElasticity: number;\n    /** Maximum total stretch multiplier cap (default: 2) */\n    maxStretch: number;\n    /** Minimum subplot size in px (default: 60) */\n    minSubplotSize: number;\n}\n\n/**\n * Compute facet subplot dimensions.\n *\n * @param facetCols       Number of facet columns\n * @param facetRows       Number of facet rows\n * @param baseWidth       Base canvas width in px\n * @param baseHeight      Base canvas height in px\n * @param params          Facet layout parameters\n */\nexport function computeFacetLayout(\n    facetCols: number,\n    facetRows: number,\n    baseWidth: number,\n    baseHeight: number,\n    params: FacetLayoutParams,\n): FacetLayoutDecision {\n    // Minimum subplot dimension — use the caller-supplied parameter\n    // (default 60px) so subplots remain readable.\n    const minContinuousSize = params.minSubplotSize;\n\n    let subplotWidth: number;\n    if (facetCols > 1) {\n        const stretch = Math.min(params.maxStretch, Math.pow(facetCols, params.facetElasticity));\n        subplotWidth = Math.round(Math.max(minContinuousSize, baseWidth * stretch / facetCols));\n    } else {\n        subplotWidth = baseWidth;\n    }\n\n    let subplotHeight: number;\n    if (facetRows > 1) {\n        const stretch = Math.min(params.maxStretch, Math.pow(facetRows, params.facetElasticity));\n        subplotHeight = Math.round(Math.max(minContinuousSize, baseHeight * stretch / facetRows));\n    } else {\n        subplotHeight = baseHeight;\n    }\n\n    return { columns: facetCols, rows: facetRows, subplotWidth, subplotHeight };\n}\n\n// ---------------------------------------------------------------------------\n// Label Sizing Decisions\n// ---------------------------------------------------------------------------\n\n/**\n * Result of label sizing computation for a discrete axis.\n */\nexport interface LabelSizingDecision {\n    /** Font size in px */\n    fontSize: number;\n    /** Max label width in px */\n    labelLimit: number;\n    /** Label rotation angle (undefined = no rotation) */\n    labelAngle?: number;\n    /** Label alignment (for rotated labels) */\n    labelAlign?: string;\n    /** Label baseline (for rotated labels) */\n    labelBaseline?: string;\n}\n\n/**\n * Compute label sizing for a discrete axis based on the effective step size.\n * Pure decision — returns sizing params without modifying any spec.\n *\n * The font descends the **shrink → rotate → cap** ladder from a backend-native\n * base font (`baseFont`), never exceeding it and never dropping below `minFont`:\n *   1. Wide band  → horizontal label at (up to) `baseFont`.\n *   2. Medium band → shrink a little and rotate -45°.\n *   3. Narrow band → shrink more and rotate -90°.\n * `labelLimit` caps the label width so long text is truncated (…) rather than\n * overflowing arbitrarily.\n *\n * @param effectiveStep      Pixels per discrete item\n * @param hasDiscreteItems   Whether the axis has discrete items\n * @param opts               `baseFont` (native ceiling) and `minFont` (floor)\n */\nexport function computeLabelSizing(\n    effectiveStep: number,\n    hasDiscreteItems: boolean,\n    opts?: { baseFont?: number; minFont?: number },\n): LabelSizingDecision {\n    const baseFont = opts?.baseFont ?? 10;\n    const minFont = opts?.minFont ?? 6;\n    const defaultLimit = 100;\n\n    if (!hasDiscreteItems) {\n        return { fontSize: baseFont, labelLimit: defaultLimit };\n    }\n\n    // Shrink lever: font tracks the band step but is bounded by [minFont, baseFont].\n    let fontSize = Math.max(minFont, Math.min(baseFont, effectiveStep - 1));\n    let labelLimit = Math.max(30, Math.min(100, effectiveStep * 8));\n    let labelAngle: number | undefined;\n    let labelAlign: string | undefined;\n    let labelBaseline: string | undefined;\n\n    if (effectiveStep < 10) {\n        // Narrow band → rotate vertical, shrink harder (but keep the ceiling\n        // one notch below base so a 12-native backend still reads ~10 here).\n        labelAngle = -90;\n        fontSize = Math.max(minFont, Math.min(baseFont - 2, effectiveStep));\n        labelLimit = 40;\n        labelAlign = 'right';\n        labelBaseline = 'middle';\n    } else if (effectiveStep < 16) {\n        // Medium band → rotate 45°, shrink slightly.\n        labelAngle = -45;\n        fontSize = Math.max(minFont, Math.min(baseFont - 1, effectiveStep));\n        labelLimit = 60;\n        labelAlign = 'right';\n        labelBaseline = 'top';\n    }\n\n    return { fontSize, labelLimit, labelAngle, labelAlign, labelBaseline };\n}\n\n/**\n * Canvas-adaptive font sizes for headers (axis titles, legend, chart title) and\n * the base for axis tick labels.\n *\n * The per-backend base fonts are the preferred (native) sizes. Fonts render at\n * that base and only **shrink** for genuinely small small-multiple subplots\n * (so dense facets don't overflow); they are never grown above native, matching\n * how the underlying renderers keep fonts constant across canvas sizes.\n *\n * @param minPlotDimension  The smaller of the (sub)plot width/height in px\n * @param opts              Backend-native base font sizes\n */\nexport interface FontSizingDecision {\n    /** Ceiling for axis tick labels (feeds computeLabelSizing `baseFont`). */\n    tickBase: number;\n    /** Header font for axis titles and chart title. */\n    titleFontSize: number;\n    /** Legend entry font (one notch below the title). */\n    legendFontSize: number;\n}\n\nexport function computeFontSizing(\n    minPlotDimension: number,\n    opts?: { baseLabelFontSize?: number; baseTitleFontSize?: number },\n): FontSizingDecision {\n    const baseLabel = opts?.baseLabelFontSize ?? 10;\n    const baseTitle = opts?.baseTitleFontSize ?? 11;\n    // The per-backend base fonts ARE the preferred (native) sizes: native\n    // renderers (Plotly/VL/ECharts) keep tick/title/legend fonts CONSTANT at\n    // every canvas size. So we do NOT grow above base — growth made large\n    // charts render heavy, oversized text. Fonts only SHRINK for genuinely\n    // small small-multiple subplots (minDim < 220) so dense facets don't\n    // overflow; otherwise they render at native base.\n    const minDim = minPlotDimension || 320;\n    const ratio = minDim >= 220 ? 1 : Math.max(0.7, minDim / 220);\n    const atMostNative = (base: number) =>\n        Math.round(Math.max(base - 2, Math.min(base, base * ratio)));\n    const tickBase = atMostNative(baseLabel);\n    const titleFontSize = atMostNative(baseTitle);\n    const legendFontSize = Math.max(baseTitle - 2, titleFontSize - 1);\n    return { tickBase, titleFontSize, legendFontSize };\n}\n\n// ---------------------------------------------------------------------------\n// Overflow Decision\n// ---------------------------------------------------------------------------\n\n/**\n * Result of overflow analysis for a discrete axis.\n */\nexport interface OverflowDecision {\n    /** Whether overflow occurred (more items than can fit) */\n    overflowed: boolean;\n    /** Maximum items to keep */\n    maxToKeep: number;\n    /** Number of items omitted */\n    omittedCount: number;\n}\n\n/**\n * Compute whether a discrete axis overflows and how many items to keep.\n *\n * @param uniqueCount    Number of unique values on the axis\n * @param maxDimension   Maximum canvas dimension (with stretch) in px\n * @param minStepSize    Minimum px per item\n */\nexport function computeOverflow(\n    uniqueCount: number,\n    maxDimension: number,\n    minStepSize: number,\n): OverflowDecision {\n    const maxToKeep = Math.floor(maxDimension / minStepSize);\n    const overflowed = uniqueCount > maxToKeep;\n    return {\n        overflowed,\n        maxToKeep,\n        omittedCount: overflowed ? uniqueCount - maxToKeep : 0,\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Circumference-pressure model for radial charts (§3)\n// ---------------------------------------------------------------------------\n\n/**\n * Parameters for circumference-pressure scaling (spring model on polar axis).\n */\nexport interface CircumferencePressureParams {\n    /** Minimum arc-length (px) each \"effective bar\" needs on the\n     *  circumference — analogous to defaultStepSize in the spring model.\n     *  Default: 45 */\n    minArcPx?: number;\n    /** Minimum chart radius in px. Default: 60 */\n    minRadius?: number;\n    /** Maximum chart radius in px. Caps runaway growth. Default: 400 */\n    maxRadius?: number;\n    /** Power-law exponent for pressure → stretch (same as spring model).\n     *  0.5 = square-root growth. Default: 0.5 */\n    elasticity?: number;\n    /** Per-dimension maximum stretch multiplier cap (matches bar-chart\n     *  default of 2.0).  The effective max stretch on the radius is\n     *  derived from min(baseW, baseH) × maxStretch so that the chart\n     *  never exceeds the cap in either dimension.  Default: 2.0 */\n    maxStretch?: number;\n    /** Per-dimension cap for the width axis. Defaults to `maxStretch`.\n     *  Lets the radius ceiling honor an asymmetric canvas (canvasW/baseW). */\n    maxStretchX?: number;\n    /** Per-dimension cap for the height axis. Defaults to `maxStretch`.\n     *  Lets the radius ceiling honor an asymmetric canvas (canvasH/baseH). */\n    maxStretchY?: number;\n    /** Extra margin outside the chart circle (px) for labels, legend, etc.\n     *  Added to each side when computing canvas dimensions. Default: 20 */\n    margin?: number;\n}\n\n/**\n * Result of circumference pressure computation.\n */\nexport interface CircumferencePressureResult {\n    /** Computed chart radius in px */\n    radius: number;\n    /** Recommended canvas width (px) */\n    canvasW: number;\n    /** Recommended canvas height (px) */\n    canvasH: number;\n}\n\n/**\n * Compute radial chart sizing using the spring model mapped to a polar axis.\n *\n * Treats the circumference as a linear \"bar axis\":\n *   baseCircumference = 2π × baseRadius\n *   pressure = effectiveItemCount × minArcPx / baseCircumference\n *   if pressure > 1:  stretch = min(maxStretch, pressure ^ elasticity)\n *   radius = baseRadius × stretch\n *\n * **effectiveItemCount** varies by chart type:\n *   - Rose / Radar: N categories (uniform slices/spokes)\n *   - Pie: total / minValue — how many of the smallest slice fit in the\n *     full circle.  This captures the worst-case thin slice that needs\n *     minimum arc width.\n *   - Sunburst: same as pie but computed on the outer ring leaves only.\n *\n * Both canvas dimensions grow equally (maintains 1:1 circular aspect).\n *\n * @param effectiveItemCount  Effective number of uniform \"bars\" around\n *                            the circle (see above)\n * @param canvasSize          Base canvas dimensions (from context)\n * @param params              Optional tuning parameters\n */\nexport function computeCircumferencePressure(\n    effectiveItemCount: number,\n    canvasSize: { width: number; height: number },\n    params: CircumferencePressureParams = {},\n): CircumferencePressureResult {\n    const {\n        minArcPx = 45,\n        minRadius = 60,\n        maxRadius = 400,\n        elasticity = 0.5,\n        maxStretch = 2.0,\n        margin = 20,\n    } = params;\n\n    // Per-dimension caps default to the scalar maxStretch (symmetric canvas).\n    const maxStretchX = Math.max(1, params.maxStretchX ?? maxStretch);\n    const maxStretchY = Math.max(1, params.maxStretchY ?? maxStretch);\n\n    const baseW = canvasSize.width;\n    const baseH = canvasSize.height;\n\n    // Base radius: largest circle that fits in the base canvas\n    const baseRadius = Math.max(minRadius,\n        (Math.min(baseW, baseH) / 2) - margin);\n\n    // ── Effective max-stretch on the radius ──────────────────────────\n    // The radius stretch expands the canvas in BOTH x and y equally.\n    // Cap so that neither dimension exceeds its per-dimension budget.\n    const maxCanvasW = baseW * maxStretchX;\n    const maxCanvasH = baseH * maxStretchY;\n    const maxDiameter = Math.min(maxCanvasW, maxCanvasH);\n    const effectiveMaxRadius = Math.min(maxRadius,\n        (maxDiameter - 2 * margin) / 2);\n    const effectiveMaxStretch = Math.max(1, effectiveMaxRadius / baseRadius);\n\n    // Spring model: pressure = items × step / baseDimension\n    const baseCircumference = 2 * Math.PI * baseRadius;\n    const pressure = (effectiveItemCount * minArcPx) / baseCircumference;\n\n    let radius: number;\n    if (pressure <= 1) {\n        // No pressure — base radius is sufficient\n        radius = baseRadius;\n    } else {\n        // Elastic stretch (same power law as bar-chart spring model)\n        const stretch = Math.min(effectiveMaxStretch, Math.pow(pressure, elasticity));\n        radius = Math.round(baseRadius * stretch);\n    }\n\n    // Clamp\n    radius = Math.min(maxRadius, Math.max(minRadius, radius));\n\n    // Canvas = diameter + margins\n    const diameter = 2 * radius + 2 * margin;\n    const canvasW = Math.max(baseW, diameter);\n    const canvasH = Math.max(baseH, diameter);\n\n    return { radius, canvasW, canvasH };\n}\n\n/**\n * Compute effective bar count for variable-width slices (pie / sunburst).\n *\n * If all slices are equal, this returns N (number of slices).\n * If slices vary, this returns `total / minValue` — i.e., how many of the\n * thinnest slice would fill the whole circle.  This is the worst-case\n * pressure that determines whether the chart needs to grow.\n *\n * Capped at 100 to prevent degenerate cases (near-zero slices) from\n * blowing up the radius.\n *\n * @param values  Array of slice values (must be > 0)\n */\nexport function computeEffectiveBarCount(values: number[]): number {\n    if (values.length === 0) return 0;\n    const positiveValues = values.filter(v => v > 0);\n    if (positiveValues.length === 0) return values.length;\n\n    const total = positiveValues.reduce((s, v) => s + v, 0);\n    const minVal = Math.min(...positiveValues);\n\n    // effectiveCount = total / minVal → how many of the smallest slice fill the circle\n    const effective = total / minVal;\n\n    // Cap at 100 to prevent degenerate cases\n    return Math.min(100, effective);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * FIELD SEMANTICS\n * =============================================================================\n *\n * Resolves what a data field *is* by combining its semantic annotation\n * (from LLM or user) with the actual data values. This resolves the\n * one-to-many ambiguities in the type registry (e.g., Score can be\n * quantitative or ordinal depending on cardinality).\n *\n * The entry point is `resolveFieldSemantics()`. It produces a\n * `FieldSemantics` object that captures the field's identity, format,\n * aggregation role, domain, scale hint, and ordering — everything\n * about *what the data represents*, independent of how it will be\n * visualized on any particular channel.\n *\n * Design doc: docs/design-compilation-context.md\n *\n * VL dependency: **None** — pure TypeScript, no rendering library imports.\n * =============================================================================\n */\n\nimport {\n    type VisCategory,\n    getRegistryEntry,\n    isRegistered,\n} from './type-registry';\n\nimport {\n    getZeroClass,\n    inferOrdinalSortOrder,\n    inferVisCategory,\n    type ZeroClass,\n} from './semantic-types';\n\n// Re-export for backward compatibility — consumers can import from here or type-registry\nexport { getRegistryEntry } from './type-registry';\nexport type { TypeRegistryEntry } from './type-registry';\n\n// =============================================================================\n// §1  PUBLIC TYPES\n// =============================================================================\n\n/**\n * Enriched semantic annotation from LLM or user.\n */\nexport interface SemanticAnnotation {\n    /** The T2 semantic type string (e.g., \"Amount\", \"Score\", \"Month\") */\n    semanticType: string;\n\n    /**\n     * Intrinsic domain (value range) of this field's scale.\n     * Only for bounded/scaled types — NOT for open-ended measures.\n     * E.g., [1, 5] for 5-star rating, [0, 100] for score, [-90, 90] for latitude.\n     */\n    intrinsicDomain?: [number, number];\n\n    /** Unit or currency code. E.g., \"USD\", \"°C\", \"kg\" */\n    unit?: string;\n\n    /** Explicit ordinal ordering. E.g., [\"Low\", \"Medium\", \"High\"] */\n    sortOrder?: string[];\n}\n\n/** d3-compatible format specification */\nexport interface FormatSpec {\n    /** d3-format pattern: \",.2f\", \".1%\", \"+.2f\", etc. */\n    pattern?: string;\n    /** Prefix before the number: \"$\", \"€\", \"£\" */\n    prefix?: string;\n    /** Suffix after the number: \"°C\", \"%\", \" kg\" */\n    suffix?: string;\n    /** Whether large values should be abbreviated (1K, 1M, 1B) */\n    abbreviate?: boolean;\n}\n\n/** Domain bounds constraint */\nexport interface DomainConstraint {\n    min?: number;\n    max?: number;\n    /** Whether to hard-clamp values outside the domain */\n    clamp?: boolean;\n}\n\n/** Tick mark constraint */\nexport interface TickConstraint {\n    /** Only show integer tick values */\n    integersOnly?: boolean;\n    /** Exact tick values to show (for small domains like 1–5 rating) */\n    exactTicks?: number[];\n    /** Minimum step between ticks */\n    minStep?: number;\n}\n\n/** Color scheme recommendation from semantic analysis */\nexport interface ColorSchemeHint {\n    /** Whether the field is best shown with sequential, diverging, or categorical colors */\n    type: 'sequential' | 'diverging' | 'categorical';\n    /** For diverging: the midpoint value */\n    divergingMidpoint?: number;\n    /** Whether the field is inherently diverging (always show diverging) vs conditional */\n    inherentlyDiverging?: boolean;\n}\n\n/** Result of diverging midpoint analysis */\nexport interface DivergingInfo {\n    /** The midpoint value where the diverging center sits */\n    midpoint: number;\n    /** Whether this type is always diverging or only when data spans both sides */\n    inherent: boolean;\n    /** Source of the midpoint determination */\n    source: 'unit' | 'type-intrinsic' | 'domain' | 'data';\n}\n\n/**\n * Resolved field semantics — what the data field *is*.\n *\n * Derived from a `SemanticAnnotation` (semantic type + optional metadata)\n * plus actual data values. Resolves the one-to-many ambiguities in the\n * type registry by inspecting the concrete data representation.\n *\n * This is purely about the field’s identity and intrinsic properties —\n * NOT about how it will be visualized on a particular channel.\n * Channel-specific decisions (color scheme, axis reversal, interpolation,\n * tick strategy, stacking, etc.) belong in `ChannelSemantics`.\n *\n * Built once per field per dataset by `resolveFieldSemantics()`.\n */\nexport interface FieldSemantics {\n    // --- Identity ---\n    /** The semantic annotation (normalized from string or object input) */\n    semanticAnnotation: SemanticAnnotation;\n\n    // --- Encoding ---\n    /** Preferred encoding type, disambiguated from registry using data */\n    defaultVisType: VisCategory;\n\n    // --- Formatting ---\n    /** Number format derived from data type and unit (only set when confident) */\n    format?: FormatSpec;\n    /** Tooltip format (typically higher precision than axis format) */\n    tooltipFormat?: FormatSpec;\n\n    // --- Aggregation ---\n    /** Default aggregate function — intrinsic to the field (additive vs intensive) */\n    aggregationDefault?: 'sum' | 'average';\n\n    // --- Scale ---\n    /** Zero-baseline classification (meaningful / arbitrary / bipolar) */\n    zeroClass: ZeroClass | 'unknown';\n    /** Recommended scale type based on data distribution */\n    scaleType?: 'linear' | 'log' | 'sqrt' | 'symlog';\n\n    // --- Domain ---\n    /** Intrinsic domain bounds (from annotation, type-intrinsic, or data-inferred) */\n    domainConstraint?: DomainConstraint;\n\n    // --- Ordering ---\n    /** Canonical ordinal sort order (months, days, etc.) */\n    canonicalOrder?: string[];\n    /** Whether the canonical order is cyclic (wraps around) */\n    cyclic: boolean;\n    /** Default sort direction */\n    sortDirection: 'ascending' | 'descending';\n\n    // --- Histogram ---\n    /** Whether this field’s data distribution benefits from binning */\n    binningSuggested: boolean;\n}\n\n// =============================================================================\n// §2  TYPE REGISTRY  →  see ./type-registry.ts (single source of truth)\n// =============================================================================\n\n/**\n * Extract the semantic type string from a bare string or annotation object.\n * Used when downstream code only needs the type string, not the full annotation.\n */\nexport function toTypeString(input: string | SemanticAnnotation | undefined): string {\n    if (!input) return '';\n    if (typeof input === 'string') return input;\n    return input.semanticType || '';\n}\n\n// =============================================================================\n// §3  ANNOTATION NORMALIZATION\n// =============================================================================\n\n/**\n * Normalize a bare string or enriched annotation object into a\n * consistent SemanticAnnotation.\n *\n * Accepts:\n *   \"Amount\"                                          → { semanticType: \"Amount\" }\n *   { semanticType: \"Score\", intrinsicDomain: [1,5] }  → as-is\n *   undefined / \"\"                                     → { semanticType: \"Unknown\" }\n */\nexport function normalizeAnnotation(\n    input: string | SemanticAnnotation | undefined,\n): SemanticAnnotation {\n    if (!input) return { semanticType: 'Unknown' };\n    if (typeof input === 'string') return { semanticType: input || 'Unknown' };\n    return { ...input, semanticType: input.semanticType || 'Unknown' };\n}\n\n// =============================================================================\n// §4  FORMAT RESOLUTION\n// =============================================================================\n\n/** Map currency codes to display symbols */\nconst CURRENCY_MAP: Record<string, string> = {\n    USD: '$', EUR: '€', GBP: '£', JPY: '¥', CNY: '¥',\n    KRW: '₩', INR: '₹', BRL: 'R$', CAD: 'CA$', AUD: 'A$',\n    CHF: 'CHF', SEK: 'kr', NOK: 'kr', DKK: 'kr',\n};\n\n/**\n * Map common unit strings to suffix display.\n *\n * Limited to a small set of well-known, universally understood units.\n * Unknown/arbitrary annotation.unit values are intentionally excluded\n * to keep axis labels clean and avoid displaying obscure or verbose\n * unit strings on tick marks.\n */\nconst UNIT_SUFFIX_MAP: Record<string, string> = {\n    // Temperature\n    '°C': '°C', '°F': '°F', C: '°C', F: '°F',\n    // Mass\n    kg: ' kg', lb: ' lb',\n    // Distance\n    km: ' km', mi: ' mi', m: ' m', ft: ' ft',\n    // Speed\n    'km/h': ' km/h', mph: ' mph',\n    // Time\n    sec: ' s', min: ' min', hr: ' hr',\n    seconds: ' s', minutes: ' min', hours: ' hr',\n    // Percentage (handled by formatClass, but allow explicit suffix)\n    '%': '%',\n};\n\n/**\n * Detect whether percentage data uses 0–1 (fractional) or 0–100 (whole-number)\n * representation.\n *\n * Values can exceed the intrinsic range (e.g., 155 % growth), so we look at\n * the *majority* of absolute values rather than just the max.\n */\nfunction detectPercentageRepresentation(values: number[]): '0-1' | '0-100' {\n    if (values.length === 0) return '0-100';\n    const abs = values.map(Math.abs);\n    // If the majority of values are ≤ 1, treat as fractional 0–1 representation\n    const countBelow1 = abs.filter(v => v <= 1).length;\n    if (countBelow1 / abs.length >= 0.8) return '0-1';\n    return '0-100';\n}\n\n/**\n * Detect the maximum number of meaningful decimal places in a set of values.\n *\n * Returns 0 for all-integer data, 1 for data like [3.7, 4.2], 2 for [1.25, 3.50], etc.\n * Caps at 4 to avoid floating-point noise (e.g., 0.1 + 0.2 = 0.30000000000000004).\n */\nfunction detectPrecision(values: number[]): number {\n    let maxDecimals = 0;\n    for (const v of values) {\n        if (!Number.isFinite(v)) continue;\n        // Convert to string, trim trailing zeros, count decimal places\n        const s = v.toFixed(10);  // enough digits to detect real precision\n        const dot = s.indexOf('.');\n        if (dot === -1) continue;\n        // Trim trailing zeros\n        let end = s.length - 1;\n        while (end > dot && s[end] === '0') end--;\n        const decimals = end > dot ? end - dot : 0;\n        if (decimals > maxDecimals) maxDecimals = decimals;\n    }\n    return Math.min(maxDecimals, 4);\n}\n\n/**\n * Build a d3-format pattern that matches the detected data precision.\n *\n * @param values  Numeric data values\n * @param useGrouping  Whether to include thousands separator (,)\n * @param signMode  '' = default, '+' = always show sign\n * @returns  Format pattern string like ',d', ',.1f', ',.2f'\n */\nfunction precisionFormat(values: number[], useGrouping = true, signMode: '' | '+' = ''): string {\n    const p = detectPrecision(values);\n    const group = useGrouping ? ',' : '';\n    if (p === 0) return `${signMode}${group}d`;\n    return `${signMode}${group}.${p}f`;\n}\n\n/**\n * Resolve the format specification for a field based on its semantic type,\n * annotation metadata, and data values.\n *\n * Priority: annotation.unit > type-specific defaults\n */\nexport function resolveFormat(\n    semanticType: string,\n    annotation: SemanticAnnotation,\n    values: any[],\n): { format?: FormatSpec; tooltipFormat?: FormatSpec } {\n    const entry = getRegistryEntry(semanticType);\n    const unit = annotation.unit;\n\n    // Resolve currency prefix from annotation.unit\n    const currencyPrefix = unit ? CURRENCY_MAP[unit.toUpperCase()] ?? CURRENCY_MAP[unit] : undefined;\n    // Resolve unit suffix from annotation.unit — only use known units;\n    // unknown units are dropped to avoid polluting tick labels with\n    // obscure or verbose strings.\n    const unitSuffix = unit ? UNIT_SUFFIX_MAP[unit] : undefined;\n\n    const nums = values.filter((v: any) => typeof v === 'number' && !isNaN(v));\n\n    // ─── Policy: only override axis format when the raw number would be\n    // genuinely misleading.  Two cases qualify:\n    //   1. Percent with 0–1 data + intrinsicDomain → representation transform\n    //   2. Currency with a known unit → add currency symbol\n    // Everything else: let VL handle axis formatting natively.\n    // Tooltip format is lower-stakes (transient hover) so we're more liberal.\n\n    switch (entry.formatClass) {\n        case 'currency': {\n            const pfx = currencyPrefix;\n            // Only override axis when we have a known currency symbol;\n            // without it the axis is better left to VL defaults.\n            if (pfx) {\n                const axisPattern = semanticType === 'Price' ? ',.2f' : precisionFormat(nums);\n                return {\n                    format: { pattern: axisPattern, prefix: pfx },\n                    tooltipFormat: { pattern: ',.2f', prefix: pfx },\n                };\n            }\n            return { tooltipFormat: { pattern: ',.2f' } };\n        }\n\n        case 'percent': {\n            // Without intrinsicDomain we can't reliably distinguish 0–1\n            // from 0–100, so defer to VL.\n            if (!annotation.intrinsicDomain) {\n                return { tooltipFormat: { pattern: precisionFormat(nums) } };\n            }\n            const rep = detectPercentageRepresentation(nums);\n            if (rep === '0-1') {\n                // 0–1 fractional → axis must transform (0.45 → \"45%\")\n                const p = detectPrecision(nums);\n                const axisP = Math.max(0, p - 2);\n                const tipP  = Math.min(axisP + 1, 4);\n                return {\n                    format: { pattern: `.${axisP}~%` },\n                    tooltipFormat: { pattern: `.${tipP}%` },\n                };\n            }\n            // Whole-number 0–100: raw numbers are readable as-is.\n            // Axis title conveys \"percentage\"; tooltip adds suffix for clarity.\n            return {\n                tooltipFormat: { pattern: precisionFormat(nums, false), suffix: '%' },\n            };\n        }\n\n        case 'unit-suffix':\n            return {\n                tooltipFormat: unitSuffix\n                    ? { pattern: precisionFormat(nums), suffix: unitSuffix }\n                    : { pattern: precisionFormat(nums) },\n            };\n\n        case 'integer':\n            // Year/Decade: no comma — '2,024' is wrong for a year.\n            // Other integers (Count, Rank, Hour): comma separator aids readability.\n            if (semanticType === 'Year' || semanticType === 'Decade') {\n                return {};\n            }\n            return { tooltipFormat: { pattern: ',d' } };\n\n        case 'decimal':\n            return { tooltipFormat: { pattern: precisionFormat(nums) } };\n\n        case 'plain':\n        default:\n            return {};\n    }\n}\n\n// =============================================================================\n// §5  DEFAULT VIS TYPE\n// =============================================================================\n\n/**\n * Resolve the default Vega-Lite encoding type for a field.\n *\n * When the registry lists multiple candidates (e.g., Score → ['quantitative', 'ordinal']),\n * disambiguate using data statistics (distinct value count).\n */\nexport function resolveDefaultVisType(\n    semanticType: string,\n    values: any[],\n): VisCategory {\n    // For unregistered types, defer entirely to data characteristics\n    if (!isRegistered(semanticType)) {\n        return inferVisCategory(values);\n    }\n\n    const entry = getRegistryEntry(semanticType);\n    const candidates = entry.visEncodings;\n    if (candidates.length === 1) {\n        // Guard: if registry says quantitative but actual values are\n        // strings (e.g. binned ranges like \"91-95\"), defer to data inference.\n        if (candidates[0] === 'quantitative') {\n            const nonNull = values.filter(v => v != null);\n            const allNumeric = nonNull.length > 0 &&\n                nonNull.every(v => typeof v === 'number' || (typeof v === 'string' && !isNaN(+v) && v.trim() !== ''));\n            if (!allNumeric) {\n                return inferVisCategory(values);\n            }\n        }\n        return candidates[0];\n    }\n\n    // Disambiguate between quantitative and ordinal based on distinct count\n    if (candidates.includes('quantitative') && candidates.includes('ordinal')) {\n        const distinct = new Set(values.filter(v => v != null)).size;\n        // Small number of distinct values → ordinal feels more natural\n        return distinct <= 12 ? 'ordinal' : 'quantitative';\n    }\n\n    // Disambiguate between temporal and ordinal\n    if (candidates.includes('temporal') && candidates.includes('ordinal')) {\n        const distinct = new Set(values.filter(v => v != null)).size;\n        // Few values → ordinal (e.g., only 3 years: 2022, 2023, 2024)\n        return distinct <= 6 ? 'ordinal' : 'temporal';\n    }\n\n    // If geographic + quantitative (lat/lon), prefer quantitative for standard charts\n    if (candidates.includes('geographic') && candidates.includes('quantitative')) {\n        return 'quantitative';\n    }\n\n    return candidates[0];\n}\n\n// =============================================================================\n// §6  AGGREGATION DEFAULT\n// =============================================================================\n\n/**\n * Resolve the default aggregation function based on the field's role.\n *\n * - Additive measures → sum (parts sum to a meaningful total)\n * - Intensive measures → average (rates/averages shouldn't be summed)\n * - Signed-additive    → sum (preserves sign semantics)\n * - Dimensions/IDs     → undefined (aggregation not meaningful)\n */\nexport function resolveAggregationDefault(\n    semanticType: string,\n): 'sum' | 'average' | undefined {\n    const entry = getRegistryEntry(semanticType);\n    switch (entry.aggRole) {\n        case 'additive':        return 'sum';\n        case 'signed-additive': return 'sum';\n        case 'intensive':       return 'average';\n        case 'dimension':       return undefined;\n        case 'identifier':      return undefined;\n        default:                return undefined;\n    }\n}\n\n// =============================================================================\n// §7  ZERO-BASELINE CLASSIFICATION\n// =============================================================================\n\n/**\n * Resolve zero-baseline class, enhanced with annotation domain.\n *\n * If annotation provides a domain starting above 0 (e.g., Rating [1, 5]),\n * zero is arbitrary regardless of what the base type says.\n */\nexport function resolveZeroClassFromAnnotation(\n    semanticType: string,\n    domain?: [number, number],\n): ZeroClass | 'unknown' {\n    // If domain starts above zero (e.g., Rating [1,5]), zero is arbitrary\n    if (domain && domain[0] > 0) return 'arbitrary';\n\n    // Delegate to existing classification\n    return getZeroClass(semanticType);\n}\n\n// =============================================================================\n// §8  SCALE TYPE\n// =============================================================================\n\n/**\n * Recommend a scale type based on semantic type and data distribution.\n *\n * Conservative policy — only triggers when ALL of these hold:\n *   1. The semantic type is an additive measure with an open domain and is\n *      not a generic fallback (i.e. Amount, Quantity, Duration — types whose\n *      magnitude is meaningful and can legitimately span many decades).\n *   2. Data spans ≥ 6 orders of magnitude (1,000,000×).\n *   3. At least 10 data points, all non-negative.\n *\n * This intentionally almost never fires on everyday data; it only helps with\n * genuinely wide-range additive measures. When it does not fire the axis stays\n * linear, and the user can still opt into log via the per-axis quick control.\n */\nexport function resolveScaleType(\n    semanticType: string,\n    values: number[],\n): 'linear' | 'log' | 'sqrt' | 'symlog' | undefined {\n    // Only consider log for additive measures with open domains —\n    // these are the types that can legitimately span many orders of magnitude.\n    // (E.g., revenue, population, quantities across different scales.)\n    // Exclude generic fallback types (Number, Unknown) — they just mean\n    // \"we know it's numeric but not what it measures\", so applying\n    // log/symlog would be presumptuous.\n    const entry = getRegistryEntry(semanticType);\n    const eligible = entry.aggRole === 'additive' && entry.domainShape === 'open'\n        && entry.t1 !== 'GenericMeasure';\n    if (!eligible) return undefined;\n\n    if (values.length < 10) return undefined;\n\n    const filtered = values.filter(v => typeof v === 'number' && !isNaN(v) && isFinite(v));\n    if (filtered.length < 10) return undefined;\n\n    const min = Math.min(...filtered);\n    const max = Math.max(...filtered);\n    if (max <= 0 || min === max) return undefined;\n\n    // Only all-positive data — don't auto-log mixed-sign\n    if (min < 0) return undefined;\n\n    // Require ≥ 6 orders of magnitude (1000 000×) — very conservative\n    const positiveMin = Math.min(...filtered.filter(v => v > 0));\n    if (positiveMin > 0 && max / positiveMin >= 1000000) {\n        // If data contains zeros, log(0) = -∞ breaks the scale.\n        // Use symlog (linear near zero, logarithmic for large values)\n        // so zeros remain representable.\n        const hasZeros = filtered.some(v => v === 0);\n        return hasZeros ? 'symlog' : 'log';\n    }\n\n    return undefined;\n}\n\n// =============================================================================\n// §9  DOMAIN CONSTRAINTS\n// =============================================================================\n\n/**\n * Merge an intrinsic (semantic) domain with the actual data range.\n *\n * For **hard** domains (Latitude, Correlation) the intrinsic bounds are\n * physically absolute — data cannot exceed them, so we clamp.\n *\n * For **soft** domains (Percentage, Score, Rating, annotation-supplied)\n * the intrinsic bounds describe the *typical* range but real data can\n * legitimately exceed them (e.g., 155 % growth).  The effective domain\n * is the union: min(intrinsic[0], dataMin) … max(intrinsic[1], dataMax).\n */\nfunction mergeIntrinsicWithData(\n    intrinsic: [number, number],\n    values: any[],\n    hard: boolean,\n): DomainConstraint {\n    if (hard) {\n        return { min: intrinsic[0], max: intrinsic[1], clamp: true };\n    }\n    const nums = values.filter((v: any) => typeof v === 'number' && !isNaN(v));\n    if (nums.length === 0) {\n        return { min: intrinsic[0], max: intrinsic[1], clamp: false };\n    }\n    const dataMin = Math.min(...nums);\n    const dataMax = Math.max(...nums);\n    return {\n        min: Math.min(intrinsic[0], dataMin),\n        max: Math.max(intrinsic[1], dataMax),\n        clamp: false,\n    };\n}\n\n/**\n * Snap-to-bound heuristic for bounded types like Percentage / PercentageChange.\n *\n * Each bound is snapped independently:\n * - If data approaches the intrinsic lower bound → snap min\n * - If data approaches the intrinsic upper bound → snap max\n * - If data exceeds a bound → don't snap that side (let VL auto-extend)\n *\n * Threshold: 25% of the *effective side range*.\n *\n * We err on the side of snapping, because:\n * - Semantic types are opt-in — the bound carries meaning by definition.\n * - A wrong snap (extra white space) is less harmful than a wrong\n *   no-snap (viewer loses semantic reference, differences are\n *   exaggerated and proximity to the bound is hidden).\n * - Only when data is clearly in the interior (> 25% away from each\n *   bound) does the bound stop being a useful reference.\n *\n * When the intrinsic domain straddles zero (lo < 0 < hi), zero acts as a\n * visual baseline (bar charts, contextual zero).  Each bound's threshold\n * is computed relative to its distance from zero — not the full range —\n * so that snapping one side doesn't make values on the other side of zero\n * invisible (e.g., snapping to -100% when data has a tiny +0.2% bar).\n *\n * When the domain doesn't straddle zero (e.g., [0, 100]), the full range\n * is used as the reference.\n *\n * Examples for Percentage [0, 100] (threshold = 25, full range):\n *   20–45%   → snap min=0 only     (20 within 25 of 0; 45 far from 100)\n *   35–65%   → no snap             (both far from edges, in interior)\n *   55–82%   → snap max=100 only   (82 within 25 of 100; 55 far from 0)\n *   15–80%   → snap both [0, 100]  (15 near 0, 80 near 100)\n *   30–130%  → no snap             (130 exceeds 100 → no snap; 30 far from 0)\n *\n * Examples for PercentageChange [-1, 1] (threshold = 0.25 per side):\n *   -0.03 to +0.05 → no snap       (both far from ±0.75)\n *   -0.70 to +0.30 → no snap       (-0.70 > -0.75, not close enough)\n *   -0.80 to +0.30 → snap min=-1   (-0.80 ≤ -0.75; +0.30 < 0.75)\n *   -0.80 to +0.78 → snap both     (both within 0.25 of edges)\n */\nexport function snapToBoundHeuristic(\n    intrinsic: [number, number],\n    values: any[],\n): DomainConstraint | undefined {\n    const nums = values.filter((v: any) => typeof v === 'number' && !isNaN(v));\n    if (nums.length === 0) return undefined;\n\n    const [lo, hi] = intrinsic;\n    const range = hi - lo;\n    if (range <= 0) return undefined;\n\n    const dataMin = Math.min(...nums);\n    const dataMax = Math.max(...nums);\n\n    // When the domain straddles zero, compute each side's threshold relative\n    // to its distance from zero.  This prevents snapping one side from\n    // stretching the axis so wide that values near zero on the other side\n    // become invisible (sub-pixel bars).\n    const zeroInside = lo < 0 && hi > 0;\n    const thresholdLo = 0.25 * (zeroInside ? (0 - lo) : range);\n    const thresholdHi = 0.25 * (zeroInside ? hi       : range);\n\n    let snapMin: number | undefined;\n    let snapMax: number | undefined;\n\n    // Snap lower bound: data min is close to intrinsic lower bound\n    // AND data doesn't go below it (if it does, VL auto-extends)\n    if (dataMin >= lo && dataMin <= lo + thresholdLo) {\n        snapMin = lo;\n    }\n\n    // Snap upper bound: data max is close to intrinsic upper bound\n    // AND data doesn't exceed it\n    if (dataMax <= hi && dataMax >= hi - thresholdHi) {\n        snapMax = hi;\n    }\n\n    if (snapMin === undefined && snapMax === undefined) return undefined;\n\n    return { min: snapMin, max: snapMax, clamp: false };\n}\n\n/**\n * Resolve domain constraints from annotation, type-intrinsic rules, or data.\n *\n * Only truly fixed physical domains (Latitude, Longitude, Correlation)\n * use hard clamping. Bounded types like Percentage use a snap-to-bound\n * heuristic: the axis extends to the theoretical endpoint (e.g., 100%)\n * only when data is close to it, avoiding wasted space when data is\n * concentrated in a small region.\n *\n * Priority: annotation.intrinsicDomain > type-intrinsic > data-inferred\n */\nexport function resolveDomainConstraint(\n    semanticType: string,\n    annotation: SemanticAnnotation,\n    values: any[],\n): DomainConstraint | undefined {\n    const entry = getRegistryEntry(semanticType);\n\n    // 1. Explicit annotation intrinsicDomain\n    if (annotation.intrinsicDomain) {\n        // Proportion (Percentage) and SignedMeasure (PercentageChange, Profit):\n        // use snap-to-bound heuristic on both ends independently.\n        // Don't force the full theoretical range — only snap to a bound\n        // when data approaches it (e.g., 97% → snap to 100%, -0.95 → snap to -1).\n        if (entry.t1 === 'Proportion' || entry.t1 === 'SignedMeasure') {\n            return snapToBoundHeuristic(annotation.intrinsicDomain, values);\n        }\n        // All other types: soft merge (union of intrinsic + data)\n        return mergeIntrinsicWithData(annotation.intrinsicDomain, values, false);\n    }\n\n    // 2. Type-intrinsic hard domains (physically impossible to exceed)\n    if (semanticType === 'Latitude')    return mergeIntrinsicWithData([-90, 90], values, true);\n    if (semanticType === 'Longitude')   return mergeIntrinsicWithData([-180, 180], values, true);\n    if (semanticType === 'Correlation') return mergeIntrinsicWithData([-1, 1], values, true);\n\n    // 3. Percentage without explicit annotation — detect scale and apply snap\n    if (semanticType === 'Percentage') {\n        const nums = values.filter((v: any) => typeof v === 'number' && !isNaN(v));\n        if (nums.length > 0) {\n            const rep = detectPercentageRepresentation(nums);\n            const M = rep === '0-1' ? 1 : 100;\n            return snapToBoundHeuristic([0, M], values);\n        }\n    }\n\n    return undefined;\n}\n\n// =============================================================================\n// §10  TICK CONSTRAINTS\n// =============================================================================\n\n/**\n * Resolve tick constraints based on semantic type and domain.\n *\n * For bounded integer domains (e.g., Rating [1, 5]), generates exact ticks.\n * For integer types (Count, Rank, Year), enforces integer-only ticks.\n */\nexport function resolveTickConstraint(\n    semanticType: string,\n    domain?: [number, number],\n): TickConstraint | undefined {\n    const entry = getRegistryEntry(semanticType);\n\n    if (entry.formatClass === 'integer') {\n        const tc: TickConstraint = { integersOnly: true, minStep: 1 };\n        // If domain provided and span is small, generate exact ticks\n        if (domain) {\n            const span = domain[1] - domain[0];\n            if (span <= 20 && span > 0) {\n                tc.exactTicks = [];\n                for (let i = domain[0]; i <= domain[1]; i++) {\n                    tc.exactTicks.push(i);\n                }\n            }\n        }\n        return tc;\n    }\n\n    // Score with bounded domain → integer ticks ONLY when domain span\n    // indicates meaningful integer steps.  For small spans like [0, 1],\n    // the values are continuous (e.g., outlier_score 0–1) and forcing\n    // integer ticks would remove all intermediate tick marks.\n    if (semanticType === 'Score' && domain) {\n        const span = domain[1] - domain[0];\n        if (span >= 2) {\n            const tc: TickConstraint = { integersOnly: true, minStep: 1 };\n            if (span <= 20) {\n                tc.exactTicks = [];\n                for (let i = domain[0]; i <= domain[1]; i++) {\n                    tc.exactTicks.push(i);\n                }\n            }\n            return tc;\n        }\n    }\n\n    return undefined;\n}\n\n// =============================================================================\n// §11  CANONICAL ORDERING & CYCLIC\n// =============================================================================\n\n/**\n * Resolve the canonical sort order for a field.\n *\n * Priority: annotation.sortOrder > well-known type sequence > auto-detect from data\n */\nexport function resolveCanonicalOrder(\n    semanticType: string,\n    annotation: SemanticAnnotation,\n    values: any[],\n): string[] | undefined {\n    // 1. Explicit annotation sortOrder\n    if (annotation.sortOrder && annotation.sortOrder.length > 0) {\n        return annotation.sortOrder;\n    }\n\n    // 2. Delegate to existing well-known sequence detection\n    return inferOrdinalSortOrder(semanticType, values);\n}\n\n/**\n * Determine whether a field's values form a cyclic (wrap-around) sequence.\n *\n * Derived purely from semantic type — NOT an LLM annotation.\n * Types with domainShape='cyclic' in the registry are cyclic.\n */\nexport function resolveCyclic(semanticType: string): boolean {\n    const entry = getRegistryEntry(semanticType);\n    return entry.domainShape === 'cyclic';\n}\n\n// =============================================================================\n// §12  REVERSED AXIS\n// =============================================================================\n\n/**\n * Whether the axis should be reversed for this field.\n *\n * Rank is the primary case: 1st place should appear at the top of the\n * y-axis.  On the x-axis, rank 1 should stay on the left (no reversal).\n */\nexport function resolveReversed(semanticType: string, channel?: string): boolean {\n    if (semanticType === 'Rank') {\n        // Only reverse on the y-axis (rank 1 at top).\n        // On x-axis, natural left-to-right order is correct.\n        return channel !== 'x';\n    }\n    return false;\n}\n\n// =============================================================================\n// §13  NICE (domain rounding)\n// =============================================================================\n\n/**\n * Whether to apply \"nice\" rounding to scale domain endpoints.\n *\n * Nice is false when:\n * - There's a fixed domain constraint (Rating [1, 5] → axis should show exactly 1–5)\n * - The type has a fixed domain shape (Latitude, Correlation)\n */\nexport function resolveNice(\n    semanticType: string,\n    domainConstraint?: DomainConstraint,\n): boolean {\n    if (domainConstraint?.clamp) return false;\n    if (domainConstraint && domainConstraint.min !== undefined && domainConstraint.max !== undefined) {\n        return false;\n    }\n    const entry = getRegistryEntry(semanticType);\n    if (entry.domainShape === 'fixed') return false;\n    return true;\n}\n\n// =============================================================================\n// §14  DIVERGING & COLOR SCHEME HINT\n// =============================================================================\n\n/**\n * Resolve diverging midpoint information for a field.\n *\n * Priority chain:\n *   1. annotation.unit → type lookup (°C → 0, °F → 32)\n *   2. type-intrinsic midpoint (Sentiment → 0, Correlation → 0)\n *   3. annotation.intrinsicDomain midpoint (Rating [1,5] → 3)\n *   4. data-driven: data spans 0 → midpoint 0\n *\n * Returns undefined if no diverging treatment applies.\n */\nexport function resolveDivergingInfo(\n    semanticType: string,\n    annotation: SemanticAnnotation,\n    values: number[],\n): DivergingInfo | undefined {\n    const entry = getRegistryEntry(semanticType);\n    // Types with diverging='none' don't get diverging treatment\n\n    // 1. Unit-derived (Temperature)\n    if (semanticType === 'Temperature' && annotation.unit) {\n        const unitMidpoints: Record<string, number> = {\n            '°C': 0, '°F': 32, 'K': 273.15, C: 0, F: 32,\n        };\n        const mid = unitMidpoints[annotation.unit];\n        if (mid !== undefined) {\n            return { midpoint: mid, inherent: false, source: 'unit' };\n        }\n    }\n\n    // 3. Type-intrinsic\n    if (entry.diverging === 'inherent') {\n        return { midpoint: 0, inherent: true, source: 'type-intrinsic' };\n    }\n    if (entry.diverging === 'conditional') {\n        return { midpoint: 0, inherent: false, source: 'type-intrinsic' };\n    }\n\n    // 3. Domain-derived midpoint (e.g., Rating [1,5] → 3)\n    if (annotation.intrinsicDomain) {\n        return {\n            midpoint: (annotation.intrinsicDomain[0] + annotation.intrinsicDomain[1]) / 2,\n            inherent: false,\n            source: 'domain',\n        };\n    }\n\n    // 4. Data-driven: if data spans 0, use 0 as midpoint\n    if (values.length > 0) {\n        const min = Math.min(...values);\n        const max = Math.max(...values);\n        if (min < 0 && max > 0) {\n            return { midpoint: 0, inherent: false, source: 'data' };\n        }\n    }\n\n    return undefined;\n}\n\n/**\n * Resolve color scheme hint based on semantic type, diverging analysis,\n * and data values.\n */\nexport function resolveColorSchemeHint(\n    semanticType: string,\n    annotation: SemanticAnnotation,\n    values: any[],\n): ColorSchemeHint {\n    const entry = getRegistryEntry(semanticType);\n    const nums = values.filter((v: any) => typeof v === 'number' && !isNaN(v));\n\n    // Try diverging analysis\n    const divInfo = resolveDivergingInfo(semanticType, annotation, nums);\n    if (divInfo) {\n        const min = nums.length > 0 ? Math.min(...nums) : 0;\n        const max = nums.length > 0 ? Math.max(...nums) : 0;\n        const spansBothSides = min < divInfo.midpoint && max > divInfo.midpoint;\n\n        if (divInfo.inherent || spansBothSides) {\n            return {\n                type: 'diverging',\n                divergingMidpoint: divInfo.midpoint,\n                inherentlyDiverging: divInfo.inherent,\n            };\n        }\n    }\n\n    // Sequential for quantitative, categorical for nominal/ordinal\n    if (entry.visEncodings.includes('quantitative')) {\n        return { type: 'sequential' };\n    }\n    return { type: 'categorical' };\n}\n\n// =============================================================================\n// §15  BINNING SUITABILITY\n// =============================================================================\n\n/**\n * Whether this field benefits from histogram-style binning.\n *\n * False for small bounded domains (Rating 1–5), non-numeric types,\n * and identifiers.\n */\nexport function resolveBinningSuggested(\n    semanticType: string,\n    domain?: [number, number],\n): boolean {\n    const entry = getRegistryEntry(semanticType);\n\n    // Non-quantitative types don't get binned\n    if (!entry.visEncodings.includes('quantitative')) return false;\n\n    // Identifiers/dimensions don't get binned\n    if (entry.aggRole === 'identifier' || entry.aggRole === 'dimension') return false;\n\n    // Year should use temporal axis, not bins\n    if (semanticType === 'Year' || semanticType === 'Decade') return false;\n\n    // Small bounded domains have too few values to bin\n    if (domain && (domain[1] - domain[0]) <= 20) return false;\n\n    // Score with known small range\n    if (semanticType === 'Score' && !domain) return false;\n\n    return true;\n}\n\n// =============================================================================\n// §17  STACKING COMPATIBILITY\n// =============================================================================\n\n/**\n * Whether values of this type can be stacked in a bar/area chart, and how.\n *\n * - 'sum':       Additive measures (parts sum to whole)\n * - 'normalize': Proportions (show 100% breakdown)\n * - false:       Stacking is meaningless (rates, scores, identifiers)\n */\nexport function resolveStackable(\n    semanticType: string,\n): 'sum' | 'normalize' | false {\n    const entry = getRegistryEntry(semanticType);\n\n    switch (entry.aggRole) {\n        case 'additive':        return 'sum';\n        case 'signed-additive': return 'sum';\n        case 'intensive':\n            // Percentage is the exception — normalizable\n            if (semanticType === 'Percentage') return 'normalize';\n            return false;\n        case 'dimension':       return false;\n        case 'identifier':      return false;\n        default:                return false;\n    }\n}\n\n// =============================================================================\n// §18  SORT DIRECTION\n// =============================================================================\n\n/**\n * Default sort direction for this field when used on an axis.\n */\nexport function resolveSortDirection(\n    semanticType: string,\n): 'ascending' | 'descending' {\n    // Rank: show best first\n    if (semanticType === 'Rank') return 'descending';\n    return 'ascending';\n}\n\n// =============================================================================\n// §19  BUILDER: resolveFieldSemantics()\n// =============================================================================\n\n/**\n * Resolve field semantics from annotation + data.\n *\n * This is the sole entry point for data-identity decisions. It resolves\n * the one-to-many ambiguities in the type registry by inspecting the\n * concrete data representation.\n *\n * Visualization-specific decisions (color scheme, axis reversal,\n * interpolation, tick strategy, nice rounding, stacking) are NOT\n * computed here — those belong in `resolveChannelSemantics()`.\n *\n * @param input       The semantic type annotation (string or enriched object)\n * @param fieldName   Column name (used for unit detection heuristics)\n * @param values      Sampled data values from this field\n * @returns           Resolved field semantics\n */\nexport function resolveFieldSemantics(\n    input: string | SemanticAnnotation | undefined,\n    fieldName: string,\n    values: any[],\n): FieldSemantics {\n    // 1. Normalize annotation\n    const annotation = normalizeAnnotation(input);\n    const semanticType = annotation.semanticType;\n\n    // 2. Numeric values (filtered once, reused across resolvers)\n    const numericValues = values\n        .filter((v: any) => typeof v === 'number' && !isNaN(v) && isFinite(v));\n\n    // 3. Resolve field-intrinsic properties\n    const defaultVisType = resolveDefaultVisType(semanticType, values);\n    const { format, tooltipFormat } = resolveFormat(semanticType, annotation, values);\n    let aggregationDefault = resolveAggregationDefault(semanticType);\n    let zeroClass = resolveZeroClassFromAnnotation(semanticType, annotation.intrinsicDomain);\n    const scaleType = resolveScaleType(semanticType, numericValues);\n    const domainConstraint = resolveDomainConstraint(semanticType, annotation, values);\n    const canonicalOrder = resolveCanonicalOrder(semanticType, annotation, values);\n    const cyclic = resolveCyclic(semanticType);\n    let binningSuggested = resolveBinningSuggested(semanticType, annotation.intrinsicDomain);\n    const sortDirection = resolveSortDirection(semanticType);\n\n    // 4. For unregistered types, provide data-driven fallbacks.\n    //    The registry treats unknown types as categorical, but if the data\n    //    is actually numeric, we should behave like a generic measure.\n    if (!isRegistered(semanticType) && defaultVisType === 'quantitative') {\n        // Data looks numeric → treat like Number (GenericMeasure)\n        if (!aggregationDefault) aggregationDefault = 'sum';\n        if (zeroClass === 'unknown') zeroClass = 'meaningful';\n        binningSuggested = true;\n    }\n\n    return {\n        semanticAnnotation: annotation,\n        defaultVisType,\n        format,\n        tooltipFormat,\n        aggregationDefault,\n        zeroClass,\n        scaleType: scaleType ?? undefined,\n        domainConstraint,\n        canonicalOrder,\n        cyclic,\n        sortDirection,\n        binningSuggested,\n    };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * CHANNEL SEMANTICS RESOLVER\n * =============================================================================\n *\n * Stage 2 of the semantic pipeline:\n *   SemanticAnnotation + data → FieldSemantics → **ChannelSemantics**\n *\n * Takes each channel’s field, builds FieldSemantics (stage 1), then adds\n * channel-specific visualization decisions: encoding type, color scheme,\n * temporal format, ordinal sort, tick constraints, axis reversal, nice\n * rounding, interpolation, and stacking.\n *\n * Zero-baseline is NOT resolved here — it requires template mark knowledge\n * and is finalized by the assembler after this function returns.\n *\n * VL dependency: **None**\n * =============================================================================\n */\n\nimport type {\n    ChartEncoding,\n    ChannelSemantics,\n    SemanticResult,\n} from './types';\nimport {\n    getVisCategory,\n    inferVisCategory,\n    getRecommendedColorScheme,\n    inferOrdinalSortOrder,\n} from './semantic-types';\nimport {\n    resolveEncodingType as resolveEncodingTypeDecision,\n} from './decisions';\nimport {\n    resolveFieldSemantics,\n    toTypeString,\n    resolveNice,\n    resolveTickConstraint,\n    resolveReversed,\n    resolveStackable,\n    resolveColorSchemeHint,\n    resolveDivergingInfo,\n    type SemanticAnnotation,\n} from './field-semantics';\n\n// ---------------------------------------------------------------------------\n// Internal helpers (moved from assemble.ts)\n// ---------------------------------------------------------------------------\n\n/** Upper bounds for plausible timestamps (~2099-12-31). */\nconst MAX_TIMESTAMP_SEC = 4102444800;\nconst MAX_TIMESTAMP_MS = 4102444800000;\n\nfunction isLikelyTimestamp(val: number): boolean {\n    if (val >= 1e9 && val <= MAX_TIMESTAMP_SEC) return true;\n    if (val > MAX_TIMESTAMP_SEC && val <= MAX_TIMESTAMP_MS) return true;\n    return false;\n}\n\nfunction timestampToMs(val: number): number {\n    return val <= MAX_TIMESTAMP_SEC ? val * 1000 : val;\n}\n\nfunction looksLikeDateString(s: string): boolean {\n    const t = s.trim();\n    return /^\\d|^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i.test(t);\n}\n\n// ---------------------------------------------------------------------------\n// Temporal field analysis\n// ---------------------------------------------------------------------------\n\ninterface TemporalAnalysis {\n    dates: Date[];\n    same: {\n        month: boolean;\n        day: boolean;\n        hour: boolean;\n        minute: boolean;\n        second: boolean;\n    };\n    sameYear: boolean;\n    sameMonth: boolean;\n    sameDay: boolean;\n}\n\nfunction analyzeTemporalField(fieldValues: any[]): TemporalAnalysis | null {\n    const dates: Date[] = [];\n    let nonNull = 0;\n    for (const v of fieldValues.slice(0, 100)) {\n        if (v == null) continue;\n        nonNull++;\n        const d = v instanceof Date ? v : new Date(v);\n        if (!isNaN(d.getTime())) dates.push(d);\n    }\n    if (dates.length < 2 || dates.length < nonNull * 0.5) return null;\n\n    const monthSet  = new Set(dates.map(d => d.getUTCMonth()));\n    const daySet    = new Set(dates.map(d => d.getUTCDate()));\n    const hourSet   = new Set(dates.map(d => d.getUTCHours()));\n    const minuteSet = new Set(dates.map(d => d.getUTCMinutes()));\n    const secondSet = new Set(dates.map(d => d.getUTCSeconds()));\n    const yearSet   = new Set(dates.map(d => d.getUTCFullYear()));\n\n    const isSmallSpread = (s: Set<number>, maxSpread: number = 1) => {\n        if (s.size <= 1) return true;\n        const arr = [...s];\n        return Math.max(...arr) - Math.min(...arr) <= maxSpread;\n    };\n\n    const same = {\n        month:  monthSet.size  === 1,\n        day:    daySet.size    === 1,\n        hour:   isSmallSpread(hourSet, 1),\n        minute: minuteSet.size === 1,\n        second: secondSet.size === 1,\n    };\n\n    const sameYear  = yearSet.size === 1;\n    const sameMonth = sameYear && same.month;\n    const sameDay   = sameMonth && same.day;\n\n    return { dates, same, sameYear, sameMonth, sameDay };\n}\n\nfunction computeDataVotes(same: TemporalAnalysis['same']): number[] {\n    const votes = [0, 0, 0, 0, 0, 0];\n\n    if (same.second)                                                           votes[5] += 1;\n    if (same.minute && same.second)                                            votes[5] += 1;\n    if (same.hour   && same.minute && same.second)                             votes[5] += 1;\n    if (same.day    && same.hour   && same.minute && same.second)              votes[5] += 2;\n    if (same.month  && same.day    && same.hour   && same.minute && same.second) votes[5] += 3;\n\n    if (same.second)                                                           votes[4] += 1;\n    if (same.minute && same.second)                                            votes[4] += 1;\n    if (same.hour   && same.minute && same.second)                             votes[4] += 1;\n    if (same.day    && same.hour   && same.minute && same.second)              votes[4] += 2;\n    if (!same.month && same.day && same.hour && same.minute && same.second)    votes[4] += 3;\n\n    if (same.second)                                                           votes[3] += 1;\n    if (same.minute && same.second)                                            votes[3] += 1;\n    if (same.hour   && same.minute && same.second)                             votes[3] += 1;\n    if (!same.day && same.hour && same.minute && same.second)                  votes[3] += 3;\n\n    if (same.second)                               votes[2] += 1;\n    if (same.minute && same.second)                votes[2] += 1;\n    if (!same.hour && same.minute && same.second)  votes[2] += 3;\n\n    if (same.second)                    votes[1] += 1;\n    if (!same.minute && same.second)    votes[1] += 3;\n\n    if (!same.second) votes[0] += 4;\n\n    return votes;\n}\n\nconst SEMANTIC_LEVEL: Record<string, number> = {\n    Year:        5, Decade:      5,\n    YearMonth:   4, Month:       4, YearQuarter: 4, Quarter: 4,\n    Date:        3, Day:         3,\n    Hour:        2,\n    DateTime:    1,\n    Timestamp:   0,\n};\n\nfunction pickBestLevel(votes: number[]): { level: number; score: number } {\n    let bestLevel = 0;\n    let bestScore = votes[0];\n    for (let i = 1; i <= 5; i++) {\n        if (votes[i] >= bestScore) {\n            bestScore = votes[i];\n            bestLevel = i;\n        }\n    }\n    return { level: bestLevel, score: bestScore };\n}\n\nfunction levelToFormat(level: number, analysis: TemporalAnalysis): string | null {\n    switch (level) {\n        case 5: return '%Y';\n        case 4: return analysis.sameYear ? '%b' : '%b %Y';\n        case 3: return analysis.sameYear ? '%b %d' : '%b %d, %Y';\n        case 2: return analysis.sameDay  ? '%H:00' : '%b %d %H:00';\n        case 1: return analysis.sameDay  ? '%H:%M' : '%b %d %H:%M';\n        case 0: return analysis.sameDay  ? '%H:%M:%S' : '%b %d %H:%M:%S';\n        default: return null;\n    }\n}\n\n/**\n * Resolve temporal format for a field.\n * Used for both temporal and ordinal-temporal fields.\n */\nfunction resolveTemporalFormat(\n    fieldValues: any[],\n    semanticType: string,\n): string | null {\n    const analysis = analyzeTemporalField(fieldValues);\n    if (!analysis) return null;\n\n    const votes = computeDataVotes(analysis.same);\n    const semLevel = SEMANTIC_LEVEL[semanticType];\n    if (semLevel !== undefined) votes[semLevel] += 3;\n    const { level } = pickBestLevel(votes);\n    return levelToFormat(level, analysis);\n}\n\n// ---------------------------------------------------------------------------\n// Temporal data conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Expand a year string to an unambiguous 4-digit representation.\n *\n * - \"98\" → \"1998\",  \"07\" → \"2007\",  \"00\" → \"2000\"\n * - \"1998\" → \"1998\" (already 4+ digits, pass through)\n * - \"FY 2018\" → \"FY 2018\" (non-numeric, pass through)\n *\n * Two-digit cutoff: 0–49 → 2000s, 50–99 → 1900s (same heuristic JS Date uses).\n */\nfunction expandToFullYear(val: string): string {\n    const trimmed = val.trim();\n    if (/^\\d{2}$/.test(trimmed)) {\n        const n = parseInt(trimmed, 10);\n        return String(n <= 49 ? 2000 + n : 1900 + n);\n    }\n    return val;\n}\n\n/**\n * Convert temporal field values in the data table to canonical string\n * representations for Vega-Lite consumption.\n *\n * This is a data-level concern (not VL-specific) — it ensures consistent\n * date parsing across backends.\n */\nexport function convertTemporalData(\n    data: any[],\n    semanticTypes: Record<string, string | SemanticAnnotation>,\n): any[] {\n    if (data.length === 0) return data;\n\n    const keys = Object.keys(data[0]);\n    const temporalKeys = keys.filter((k: string) => {\n        const st = toTypeString(semanticTypes[k]);\n        const vc = inferVisCategory(data.map(r => r[k]));\n        const stCategory = st ? getVisCategory(st) : null;\n        return vc === 'temporal' || stCategory === 'temporal' || st === 'Decade';\n    });\n\n    if (temporalKeys.length === 0) return data;\n\n    const values = structuredClone(data);\n    return values.map((r: any) => {\n        for (const temporalKey of temporalKeys) {\n            const val = r[temporalKey];\n            const st = toTypeString(semanticTypes[temporalKey]);\n\n            if (typeof val === 'number') {\n                if (st === 'Year' || st === 'Decade') {\n                    r[temporalKey] = `${Math.floor(val)}`;\n                } else if (isLikelyTimestamp(val)) {\n                    r[temporalKey] = new Date(timestampToMs(val)).toISOString();\n                } else {\n                    r[temporalKey] = String(val);\n                }\n            } else if (val instanceof Date) {\n                r[temporalKey] = val.toISOString();\n            } else {\n                // For Year/Decade strings, normalise to 4-digit years so\n                // Vega-Lite parses them unambiguously and doesn't auto-tick\n                // at sub-year intervals (e.g. \"98\" → \"1998\").\n                if ((st === 'Year' || st === 'Decade') && typeof val === 'string') {\n                    r[temporalKey] = expandToFullYear(val);\n                } else {\n                    r[temporalKey] = String(val);\n                }\n            }\n        }\n        return r;\n    });\n}\n\n// ---------------------------------------------------------------------------\n// Public API: resolveChannelSemantics\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve all channel-level semantic decisions.\n *\n * For each channel, builds FieldSemantics (data identity) then layers on\n * channel-specific visualization decisions (color scheme, temporal format,\n * tick constraints, axis reversal, interpolation, etc.).\n *\n * Zero-baseline (cs.zero) is NOT resolved here -- it requires template\n * mark knowledge (bar vs point) that belongs to the assembler.\n * The assembler finalizes zero after calling this function.\n *\n * @param encodings       Channel -> ChartEncoding from user / AI agent\n * @param data            Array of data rows (original, unconverted)\n * @param semanticTypes   Field name -> semantic type string\n * @param convertedData   Pre-converted temporal data (from convertTemporalData).\n *                        If omitted, falls back to data for temporal format detection.\n */\nexport function resolveChannelSemantics(\n    encodings: Record<string, ChartEncoding>,\n    data: any[],\n    semanticTypes: Record<string, string | SemanticAnnotation>,\n    convertedData?: any[],\n): SemanticResult {\n    const result: SemanticResult = {};\n\n    // Use pre-converted temporal data for format detection, or fall back to raw data\n    const temporalData = convertedData ?? data;\n\n    for (const [channel, encoding] of Object.entries(encodings)) {\n        const fieldName = encoding.field;\n        if (!fieldName && encoding.aggregate !== 'count') continue;\n\n        // Handle count aggregate without a field\n        if (!fieldName && encoding.aggregate === 'count') {\n            result[channel] = {\n                field: '_count',\n                semanticAnnotation: { semanticType: 'Count' },\n                type: 'quantitative',\n                aggregationDefault: 'sum',\n            };\n            continue;\n        }\n\n        if (!fieldName) continue;\n\n        const rawAnnotation = semanticTypes[fieldName];\n        const semanticType = typeof rawAnnotation === 'string'\n            ? (rawAnnotation || '')\n            : (rawAnnotation?.semanticType ?? '');\n        const fieldValues = data.map(r => r[fieldName]);\n\n        // Resolve encoding type\n        const typeDecision = resolveEncodingTypeDecision(\n            semanticType, fieldValues, channel, data, fieldName,\n        );\n\n        // Apply explicit type override\n        let resolvedType = typeDecision.vlType;\n        if (encoding.type) {\n            resolvedType = encoding.type;\n        } else if (channel === 'column' || channel === 'row') {\n            if (resolvedType !== 'nominal' && resolvedType !== 'ordinal') {\n                resolvedType = 'nominal';\n            }\n        }\n\n        // ISO date hack\n        if (resolvedType === 'quantitative') {\n            const sampleValues = data.slice(0, 15).filter(r => r[fieldName] != undefined).map(r => r[fieldName]);\n            const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/;\n            if (sampleValues.length > 0 && sampleValues.every((val: any) => isoDateRegex.test(`${val}`.trim()))) {\n                resolvedType = 'temporal';\n            }\n        }\n\n        // Build ChannelSemantics entry\n        // Stage 1: resolve field-level semantics (data identity)\n        const fc = resolveFieldSemantics(rawAnnotation, fieldName, fieldValues);\n        const annotation = fc.semanticAnnotation;\n\n        // Stage 2: layer on channel-specific visualization decisions\n        const tickConstraint = resolveTickConstraint(annotation.semanticType, annotation.intrinsicDomain);\n        const reversed = resolveReversed(annotation.semanticType, channel);\n        const nice = resolveNice(annotation.semanticType, fc.domainConstraint);\n        const stackable = resolveStackable(annotation.semanticType);\n\n        const cs: ChannelSemantics = {\n            field: fieldName,\n            semanticAnnotation: annotation,\n            type: resolvedType,\n\n            // From FieldSemantics (data identity)\n            format: fc.format,\n            tooltipFormat: fc.tooltipFormat,\n            aggregationDefault: fc.aggregationDefault,\n            scaleType: fc.scaleType,\n            domainConstraint: fc.domainConstraint,\n            cyclic: fc.cyclic || undefined,\n            sortDirection: fc.sortDirection,\n            binningSuggested: fc.binningSuggested || undefined,\n\n            // Channel-specific visualization decisions\n            nice,\n            tickConstraint,\n            reversed: reversed || undefined,\n            stackable,\n        };\n\n        // Adjust field name for aggregated fields (the derived column is either\n        // computed by applyAggregation or supplied pre-aggregated by the caller)\n        if (encoding.aggregate) {\n            if (encoding.aggregate === 'count') {\n                cs.field = '_count';\n                cs.type = 'quantitative';\n            } else {\n                cs.field = `${fieldName}_${encoding.aggregate}`;\n                cs.type = 'quantitative';\n            }\n        }\n\n        // --- Channel-specific semantic decisions ---\n\n        // Color scheme (color and group channels)\n        if ((channel === 'color' || channel === 'group') && fieldName) {\n            if (encoding.scheme && encoding.scheme !== 'default') {\n                cs.colorScheme = {\n                    scheme: encoding.scheme,\n                    type: 'categorical',\n                    reason: 'explicit user scheme',\n                };\n            } else {\n                const encodingVLType = cs.type as 'nominal' | 'ordinal' | 'quantitative' | 'temporal';\n                // Use design-aligned classification from field-semantics.ts\n                const colorHint = resolveColorSchemeHint(semanticType, annotation, fieldValues);\n                const uniqueValues = [...new Set(fieldValues)];\n                cs.colorScheme = getRecommendedColorScheme(\n                    semanticType, encodingVLType, uniqueValues.length, fieldName,\n                    fieldValues, { type: colorHint.type },\n                );\n                // Apply midpoint from design-aligned diverging analysis\n                if (cs.colorScheme.type === 'diverging' && encodingVLType === 'quantitative') {\n                    const nums = fieldValues.filter((v: any) => typeof v === 'number' && !isNaN(v));\n                    const divInfo = resolveDivergingInfo(semanticType, annotation, nums);\n                    if (divInfo) {\n                        cs.colorScheme.domainMid = divInfo.midpoint;\n                    }\n                }\n            }\n        }\n\n        // Temporal format\n        if (cs.type === 'temporal' || (semanticType && getVisCategory(semanticType) === 'temporal')) {\n            const convertedFieldValues = temporalData.map(r => r[fieldName]);\n            const fmt = resolveTemporalFormat(convertedFieldValues, semanticType);\n            if (fmt) cs.temporalFormat = fmt;\n        }\n\n        // Ordinal sort order (canonical ordering for months, days, quarters, etc.)\n        if (cs.type === 'ordinal' || cs.type === 'nominal') {\n            if (!encoding.sortOrder && !encoding.sortBy) {\n                const ordinalSort = inferOrdinalSortOrder(semanticType, fieldValues);\n                if (ordinalSort) {\n                    cs.ordinalSortOrder = ordinalSort;\n                }\n            }\n        }\n\n        result[channel] = cs;\n    }\n\n    return result;\n}\n\n// Re-export helpers needed by other modules\nexport {\n    analyzeTemporalField,\n    computeDataVotes,\n    pickBestLevel,\n    levelToFormat,\n    looksLikeDateString,\n    SEMANTIC_LEVEL,\n    type TemporalAnalysis,\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * OVERFLOW FILTERING\n * =============================================================================\n *\n * Decides *which* discrete values to keep when there are too many for\n * the available canvas space, then filters the data accordingly.\n *\n * This module does **no layout math**.  Per-channel capacity budgets\n * are computed upstream by `computeChannelBudgets` and passed in as\n * a `ChannelBudgets` object.  This module focuses on:\n *   1. Iterating each discrete channel\n *   2. Applying the overflow strategy (which values to keep)\n *   3. Filtering data rows\n *   4. Producing truncation warnings\n *\n * Runs AFTER computeChannelBudgets and BEFORE computeLayout.\n *\n * VL dependency: **None**\n * =============================================================================\n */\n\nimport type {\n    ChannelSemantics,\n    ChartEncoding,\n    LayoutDeclaration,\n    TruncationWarning,\n    OverflowResult,\n    OverflowStrategy,\n    OverflowStrategyContext,\n    ChannelBudgets,\n} from './types';\nimport type { ChartWarning } from './types';\nimport { inferVisCategory } from './semantic-types';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Filter data to keep only the values that fit within the canvas.\n *\n * @param channelSemantics  Phase 0 output (field, type per channel)\n * @param declaration       Template layout declaration (resolvedTypes, overflowStrategy)\n * @param encodings         Original user-level encodings (for sort info)\n * @param data              Full data table\n * @param budgets           Per-channel capacity budgets from computeChannelBudgets\n * @param allMarkTypes      Set of all mark types in the template (for connected-mark detection)\n * @returns                 OverflowResult with filtered data, nominal counts, truncations, and warnings\n */\nexport function filterOverflow(\n    channelSemantics: Record<string, ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    encodings: Record<string, ChartEncoding>,\n    data: any[],\n    budgets: ChannelBudgets,\n    allMarkTypes: Set<string>,\n): OverflowResult {\n\n    // --- Build effective channel info from semantics + declaration ---\n\n    const effectiveType = (ch: string): string | undefined =>\n        declaration.resolvedTypes?.[ch] ?? channelSemantics[ch]?.type;\n\n    const effectiveField = (ch: string): string | undefined => {\n        if (channelSemantics[ch]?.field) return channelSemantics[ch].field;\n        return undefined;\n    };\n\n    const isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n\n    // --- Filter data ---\n\n    const nominalCounts: Record<string, number> = {\n        x: 0, y: 0, column: 0, row: 0, group: 0,\n    };\n    const truncations: TruncationWarning[] = [];\n    const warnings: ChartWarning[] = [];\n    let filteredData = data;\n\n    // Compute group nominal count\n    const groupField = channelSemantics.group?.field;\n    if (groupField) {\n        nominalCounts.group = new Set(data.map(r => r[groupField])).size;\n    }\n\n    // Strategy context for custom or default overflow\n    const strategyContext: OverflowStrategyContext = {\n        data,\n        channelSemantics,\n        encodings,\n        allMarkTypes,\n    };\n\n    const strategy = declaration.overflowStrategy ?? defaultOverflowStrategy;\n\n    for (const channel of ['x', 'y', 'column', 'row', 'color'] as const) {\n        const fieldName = effectiveField(channel);\n        const type = effectiveType(channel);\n        if (!fieldName) continue;\n\n        // Budget for this channel (Infinity if uncapped)\n        const maxToKeep = budgets.maxValues[channel] ?? Infinity;\n\n        // For non-discrete types on column/row, apply overflow cap —\n        // every unique value becomes a facet panel.\n        if (!isDiscreteType(type)) {\n            if (channel === 'column' || channel === 'row') {\n                const uniqueValues = [...new Set(filteredData.map(r => r[fieldName]))];\n                nominalCounts[channel] = Math.min(uniqueValues.length, maxToKeep);\n\n                if (uniqueValues.length > maxToKeep) {\n                    // For non-discrete facets, keep the first N values (sorted)\n                    const sorted = [...uniqueValues].sort();\n                    const valuesToKeep = sorted.slice(0, maxToKeep);\n\n                    const omittedCount = uniqueValues.length - valuesToKeep.length;\n                    warnings.push({\n                        severity: 'warning',\n                        code: 'overflow',\n                        message: `${omittedCount} of ${uniqueValues.length} values in '${fieldName}' were omitted (showing first ${valuesToKeep.length}).`,\n                        channel,\n                        field: fieldName,\n                    });\n\n                    const keepSet = new Set(valuesToKeep);\n                    filteredData = filteredData.filter(row => keepSet.has(row[fieldName]));\n                }\n            }\n            continue;\n        }\n\n        const uniqueValues = [...new Set(filteredData.map(r => r[fieldName]))];\n        nominalCounts[channel] = Math.min(uniqueValues.length, maxToKeep);\n\n        if (uniqueValues.length > maxToKeep) {\n            const valuesToKeep = strategy(channel, fieldName, uniqueValues, maxToKeep, strategyContext);\n\n            const omittedCount = uniqueValues.length - valuesToKeep.length;\n            const placeholder = `...${omittedCount} items omitted`;\n\n            warnings.push({\n                severity: 'warning',\n                code: 'overflow',\n                message: `${omittedCount} of ${uniqueValues.length} values in '${fieldName}' were omitted (showing first ${valuesToKeep.length} in sort order).`,\n                channel,\n                field: fieldName,\n            });\n\n            truncations.push({\n                severity: 'warning',\n                code: 'overflow',\n                message: `${omittedCount} of ${uniqueValues.length} values in '${fieldName}' were omitted (showing first ${valuesToKeep.length} in sort order).`,\n                channel,\n                field: fieldName,\n                keptValues: valuesToKeep,\n                omittedCount,\n                placeholder,\n            });\n\n            // Filter data rows (except for color — we keep all rows but style the legend)\n            if (channel !== 'color') {\n                filteredData = filteredData.filter(row => valuesToKeep.includes(row[fieldName]));\n            }\n        }\n    }\n\n    return { filteredData, nominalCounts, truncations, warnings };\n}\n\n// ---------------------------------------------------------------------------\n// Default overflow strategy\n// ---------------------------------------------------------------------------\n\n/**\n * Default overflow strategy: decides which discrete values to keep.\n *\n * - User-specified sort: respect it\n * - Canonical semantic order (months, ranks, etc.): keep the first N\n * - Numeric categories: keep the first N numerically\n * - Otherwise preserve data encounter order\n */\nconst defaultOverflowStrategy: OverflowStrategy = (\n    channel, fieldName, uniqueValues, maxToKeep, context,\n) => {\n    const { data, channelSemantics, encodings, allMarkTypes } = context;\n\n    // Determine sort intent from user encodings\n    const encoding = encodings[channel];\n    const sortBy = encoding?.sortBy;\n    const sortOrder = encoding?.sortOrder;\n\n    // Infer sort field and direction\n    let sortField: string | undefined;\n    let sortFieldType: string | undefined;\n    let isDescending = false;\n\n    if (sortBy) {\n        // User explicitly specified sort\n        if (sortBy === 'x' || sortBy === 'y' || sortBy === 'color') {\n            const sortCS = channelSemantics[sortBy];\n            sortField = sortCS?.field;\n            sortFieldType = sortCS?.type;\n            isDescending = sortOrder === 'descending' || (sortOrder !== 'ascending' && sortBy !== channel);\n        } else {\n            // Custom sort list — respect insertion order\n            try {\n                const sortedList = JSON.parse(sortBy);\n                if (Array.isArray(sortedList)) {\n                    const orderedValues = (sortOrder === 'descending') ? sortedList.reverse() : sortedList;\n                    return orderedValues.filter((v: any) => uniqueValues.includes(v)).slice(0, maxToKeep);\n                }\n            } catch {\n                // not a JSON list, fall through\n            }\n            isDescending = sortOrder === 'descending';\n        }\n    }\n\n    // Explicit value sort takes precedence over the category field's own type.\n    if (sortField && sortFieldType === 'quantitative') {\n        let aggregateOp = Math.max;\n        let initialValue = -Infinity;\n        if (allMarkTypes.has('bar') && sortField !== channelSemantics.color?.field) {\n            aggregateOp = (x: number, y: number) => x + y;\n            initialValue = 0;\n        }\n\n        const valueAggregates = new Map<any, number>();\n        for (const row of data) {\n            const fieldValue = row[fieldName];\n            const sortValue = Number(row[sortField] ?? 0);\n            if (valueAggregates.has(fieldValue)) {\n                valueAggregates.set(fieldValue, aggregateOp(valueAggregates.get(fieldValue)!, sortValue));\n            } else {\n                valueAggregates.set(fieldValue, aggregateOp(initialValue, sortValue));\n            }\n        }\n\n        return Array.from(valueAggregates.entries())\n            .map(([value, agg]) => ({ value, agg }))\n            .sort((a, b) => isDescending ? b.agg - a.agg : a.agg - b.agg)\n            .slice(0, maxToKeep)\n            .map(v => v.value);\n    }\n\n    const canonicalOrder = channelSemantics[channel]?.ordinalSortOrder;\n    if (!sortBy && !sortOrder && canonicalOrder?.length) {\n        const present = new Set(uniqueValues);\n        const ordered = canonicalOrder.filter(value => present.has(value));\n        const canonicalValues = new Set(ordered);\n        ordered.push(...uniqueValues.filter(value => !canonicalValues.has(value)));\n        return ordered.slice(0, maxToKeep);\n    }\n\n    // Match the display default for quantitative values treated as discrete.\n    const fieldOriginalType = inferVisCategory(data.map(r => r[fieldName]));\n    if (fieldOriginalType === 'quantitative' || channel === 'color') {\n        return [...uniqueValues].sort((a, b) => Number(a) - Number(b))\n            .slice(0, maxToKeep);\n    }\n\n    // Facet channels: first N\n    if (channel === 'column' || channel === 'row') {\n        return uniqueValues.slice(0, maxToKeep);\n    }\n\n    // Explicit field-order sort follows the displayed label order.\n    if (sortOrder === 'descending') {\n        return [...uniqueValues].sort((a, b) => String(b).localeCompare(String(a), undefined, { numeric: true })).slice(0, maxToKeep);\n    }\n    if (sortOrder === 'ascending') {\n        return [...uniqueValues].sort((a, b) => String(a).localeCompare(String(b), undefined, { numeric: true })).slice(0, maxToKeep);\n    }\n\n    // Default: first N values\n    return uniqueValues.slice(0, maxToKeep);\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * PHASE 1: COMPUTE LAYOUT\n * =============================================================================\n *\n * Determine how big things should be — axis lengths, step sizes,\n * subplot dimensions, label sizing, and overflow truncation — from data\n * density, axis classification, and template-provided tuning knobs.\n *\n * VL dependency: **None**\n *\n * This module reads abstract axis descriptors (AxisLayoutInput) and\n * produces abstract layout numbers (LayoutResult). The same layout\n * engine works regardless of output format.\n *\n * ── Backend Responsibility ──────────────────────────────────────────\n * The LayoutResult is a target-agnostic description of \"how big things\n * should be\".  Each rendering backend (Vega-Lite, ECharts, etc.) MUST:\n *\n *   1. Call computeLayout() once per chart (facet-aware — it already\n *      divides subplot sizes for the facet grid).\n *\n *   2. Translate the LayoutResult into its own rendering format:\n *      - subplotWidth / subplotHeight → plot area size (before margins)\n *      - xStep / yStep → bar widths, band sizes, category spacing\n *      - stepPadding → inter-category gap (barCategoryGap, paddingInner)\n *      - label sizing → font size, rotation, truncation\n *\n *   3. Add its own margins, padding, and chrome (axis labels, titles,\n *      legends, CANVAS_BUFFER) around the subplot area.\n *\n *   4. Handle facet-specific concerns itself:\n *      - Column wrapping (when user specifies column-only, the backend\n *        decides how many columns per visual row and restructures the\n *        panel grid accordingly).\n *      - Per-panel vs shared axis titles.\n *      - Panel positioning and header labels.\n *\n * The layout engine does NOT know about VL encodings, ECharts grid\n * objects, or any rendering-specific structure.\n * =============================================================================\n */\n\nimport type {\n    ChannelSemantics,\n    LayoutDeclaration,\n    LayoutResult,\n    AssembleOptions,\n    ChannelBudgets,\n} from './types';\nimport {\n    computeAxisStep,\n    computeGasPressure,\n    computeLabelSizing,\n    computeFontSizing,\n    DEFAULT_GAS_PRESSURE_PARAMS,\n    type ElasticStretchParams,\n    type GasPressureParams,\n} from './decisions';\nimport { planBandDodge } from './band-dodge';\n\n// ---------------------------------------------------------------------------\n// Short discrete axis labels (align with echarts/templates/bar.ts)\n// ---------------------------------------------------------------------------\n\nconst VL_SHORT_DISCRETE_CATEGORY_COUNT = 4;\nconst VL_SHORT_DISCRETE_LABEL_MAX_LEN = 8;\n\n/** Approximate width (px) of one label character at the given font size. */\nconst APPROX_CHAR_WIDTH_RATIO = 0.62;\n\n/** Distinct label strings for a discrete axis field, plus derived stats. */\ninterface DiscreteLabelStats {\n    count: number;\n    maxLen: number;\n    /** True when every label parses as a finite number (e.g. years, bins, IDs). */\n    allNumeric: boolean;\n}\n\nfunction computeDiscreteLabelStats(\n    field: string | undefined,\n    table: any[],\n): DiscreteLabelStats | null {\n    if (!field) return null;\n    const uniques = new Set<string>();\n    for (const row of table) {\n        const v = row[field];\n        if (v == null || v === '') continue;\n        uniques.add(String(v));\n    }\n    if (uniques.size === 0) return null;\n    const labels = [...uniques];\n    return {\n        count: labels.length,\n        maxLen: Math.max(...labels.map(s => s.length)),\n        allNumeric: labels.every(s => s.trim() !== '' && isFinite(Number(s))),\n    };\n}\n\n/**\n * Few, short category strings → keep axis labels horizontal in Vega-Lite. Used\n * for the Y axis, where banded labels read horizontally in the left margin\n * regardless of band height (so quantitative/numeric labels stay horizontal).\n */\nfunction discreteYAxisShouldUseHorizontalLabels(\n    field: string | undefined,\n    channelType: string | undefined,\n    table: any[],\n): boolean {\n    if (!field) return false;\n    if (channelType === 'quantitative') return true;\n    const stats = computeDiscreteLabelStats(field, table);\n    if (!stats) return false;\n    if (stats.count > VL_SHORT_DISCRETE_CATEGORY_COUNT) return false;\n    return stats.maxLen <= VL_SHORT_DISCRETE_LABEL_MAX_LEN;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface AxisLayoutInput {\n    /** Spring model (banded) or gas pressure (non-banded) */\n    mode: 'banded' | 'non-banded';\n    /** Number of discrete positions (for banded) */\n    itemCount: number;\n    /** Number of sub-items per group (for grouped bars) */\n    subItemsPerGroup?: number;\n    /** Numeric values along this axis (for gas pressure) */\n    values?: number[];\n    /** Data extent [min, max] */\n    domain?: [number, number];\n    /** Number of distinct series (for series-based pressure) */\n    seriesCount?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Stretch caps\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the per-dimension maximum stretch caps (βx, βy) from options.\n *\n * The assembler derives `maxStretchX`/`maxStretchY` from the spec's\n * `canvasSize / baseSize` ratio (the hard ceiling). When neither is set,\n * both fall back to the scalar `maxStretch` (default {@link DEFAULT_MAX_STRETCH})\n * — the symmetric budget used when the spec pins no `canvasSize`. Each cap is\n * clamped to ≥ 1 (a chart never shrinks below its base under \"stretch\").\n */\nexport function resolveStretchCaps(options: AssembleOptions): { x: number; y: number } {\n    const def = options.maxStretch ?? DEFAULT_MAX_STRETCH;\n    return {\n        x: Math.max(1, options.maxStretchX ?? def),\n        y: Math.max(1, options.maxStretchY ?? def),\n    };\n}\n\n/** Default base (target) chart size in pixels when the spec omits `baseSize`. */\nexport const DEFAULT_BASE_SIZE = { width: 400, height: 320 } as const;\n\n/**\n * Default axis stretch cap used when the spec pins no `canvasSize` ceiling.\n *\n * Bounds how far a chart may grow past its base size (per dimension) under\n * layout pressure. 1.5 keeps growth modest; 2× was found to over-stretch\n * charts in the general (no-ceiling) case.\n */\nexport const DEFAULT_MAX_STRETCH = 1.5;\n\n/**\n * Resolve the effective base (target) size the layout pipeline aims for.\n *\n * Defaults to {@link DEFAULT_BASE_SIZE} when the spec omits `baseSize`, then\n * clamps each dimension to the optional `canvasSize` ceiling. This guarantees\n * the target never exceeds the hard maximum: when a user sets only a (small)\n * `canvasSize` and leaves `baseSize` defaulted — or sets a `baseSize` larger\n * than the ceiling — the chart shrinks to fit the box instead of overflowing\n * it. After clamping, `deriveStretchCaps` yields βx/βy = 1 in any clamped\n * dimension (pure fit-to-box, no growth past the ceiling).\n */\nexport function resolveBaseSize(\n    specBaseSize: { width: number; height: number } | undefined,\n    ceiling: { width: number; height: number } | undefined,\n): { width: number; height: number } {\n    const base = specBaseSize ?? { ...DEFAULT_BASE_SIZE };\n    if (!ceiling) return { width: base.width, height: base.height };\n    return {\n        width: Math.min(base.width, ceiling.width),\n        height: Math.min(base.height, ceiling.height),\n    };\n}\n\n/**\n * Read the user's `facetColumns` chart property (the interactive facet-wrap\n * control) off the RAW chart_spec.chartProperties, returning a clamped integer\n * column count or undefined for auto. Read raw (pre-normalization) because\n * `facetColumns` is a layout-level option, not a per-template mark property, so\n * `normalizeChartProperties` would otherwise drop it as an unknown key.\n */\nexport function resolveFacetColumnsOption(\n    chartProperties: Record<string, any> | undefined,\n): number | undefined {\n    const raw = chartProperties?.facetColumns;\n    if (raw == null) return undefined;\n    const n = Number(raw);\n    return Number.isFinite(n) && n >= 1 ? Math.floor(n) : undefined;\n}\n\n/**\n * Derive per-dimension stretch ceilings (βx, βy) for an assembler.\n *\n * When the spec supplies a hard `canvasSize` ceiling, the caps are the ratio\n * of ceiling to base in each dimension (clamped to ≥ 1). The base passed here\n * is expected to already be clamped to the ceiling (see {@link resolveBaseSize}),\n * so a ceiling smaller than the spec's base resolves to β = 1 (fit-to-box)\n * rather than an overflow. When no ceiling is given, both caps fall back to\n * `options.maxStretch` (or {@link DEFAULT_MAX_STRETCH} when that is unset too),\n * which already reflects any template `paramOverrides`.\n *\n * Assemblers inject the result into `effectiveOptions.maxStretchX/Y` so the\n * whole layout pipeline shares one budget — including faceted grids, whose\n * total size is bounded by the same ceiling.\n */\nexport function deriveStretchCaps(\n    baseSize: { width: number; height: number },\n    ceiling: { width: number; height: number } | undefined,\n    options: AssembleOptions,\n): { maxStretchX: number; maxStretchY: number } {\n    const def = options.maxStretch ?? DEFAULT_MAX_STRETCH;\n    return {\n        maxStretchX: ceiling ? Math.max(1, ceiling.width / baseSize.width) : def,\n        maxStretchY: ceiling ? Math.max(1, ceiling.height / baseSize.height) : def,\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Public API: computeLayout\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 1: Compute layout decisions.\n *\n * Takes channel semantics, template layout declaration, data, canvas size,\n * and assembly options to produce a LayoutResult with step sizes, subplot\n * dimensions, label sizing, and truncation warnings.\n *\n * VL dependency: **None**\n *\n * @param channelSemantics   Phase 0 output\n * @param declaration        Template's layout declaration (axisFlags, resolvedTypes,\n *                           grouping, binnedAxes)\n * @param table              Data rows (post-overflow filtered)\n * @param canvasSize         Target canvas dimensions\n * @param options            Assembly options (merged with template overrides)\n * @param facetGrid          Optional pre-decided facet grid from computeFacetGrid.\n *                           When provided, computeLayout uses these column/row\n *                           counts instead of counting from data — this\n *                           eliminates the circularity between wrapping and\n *                           banded axis sizing.\n */\nexport function computeLayout(\n    channelSemantics: Record<string, ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    table: any[],\n    canvasSize: { width: number; height: number },\n    options: AssembleOptions = {},\n    facetGrid?: { columns: number; rows: number },\n): LayoutResult {\n    const {\n        elasticity: elasticityVal = 0.5,\n        facetElasticity: facetElasticityVal = 0.3,\n        minStep: minStepVal = 6,\n        minSubplotSize: minSubplotVal = 60,\n        stepPadding: stepPaddingVal = 0.1,\n        maintainContinuousAxisRatio = false,\n        continuousMarkCrossSection,\n        facetAspectRatioResistance = 0,\n    } = options;\n\n    // Per-dimension stretch ceilings: βx bounds width-related growth,\n    // βy bounds height-related growth. Both reduce to `maxStretch`\n    // (default 1.5) when the spec sets no explicit `canvasSize` ceiling.\n    const { x: maxStretchX, y: maxStretchY } = resolveStretchCaps(options);\n\n    const defaultChartWidth = canvasSize.width;\n    const defaultChartHeight = canvasSize.height;\n\n    // Facet overhead: fixed (axis labels, titles) + per-panel gap (spacing).\n    const fixW = options.facetFixedPadding?.width ?? 0;\n    const fixH = options.facetFixedPadding?.height ?? 0;\n    const gap = options.facetGap ?? 0;\n\n    const baseRefSize = 300;\n    const sizeRatio = Math.max(defaultChartWidth, defaultChartHeight) / baseRefSize;\n    const baseBandSize = options.defaultBandSize ?? 20;\n    const defaultStepSize = Math.round(baseBandSize * Math.max(1, sizeRatio));\n    // Sparse-expansion ceiling: a band may grow past its base size to fill a\n    // wide plot, but never past maxStepSize. Defaults to the base band, so a\n    // backend that doesn't opt in keeps the old \"cap at base\" behavior.\n    const maxBandSize = Math.max(baseBandSize, options.maxBandSize ?? baseBandSize);\n    const maxStepSize = Math.round(maxBandSize * Math.max(1, sizeRatio));\n\n    const isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n\n    // Apply resolved types from template declaration\n    const effectiveTypes: Record<string, string> = {};\n    for (const [ch, cs] of Object.entries(channelSemantics)) {\n        effectiveTypes[ch] = declaration.resolvedTypes?.[ch] || cs.type;\n    }\n\n    // --- Classify axes and count items ---\n    const axisFlags = declaration.axisFlags || {};\n    const xBanded = axisFlags.x?.banded ?? false;\n    const yBanded = axisFlags.y?.banded ?? false;\n\n    const nominalCount: Record<string, number> = {\n        x: 0, y: 0, column: 0, row: 0, group: 0,\n    };\n\n    // Count discrete values per channel\n    for (const channel of ['x', 'y', 'column', 'row', 'color'] as const) {\n        const cs = channelSemantics[channel];\n        if (!cs?.field) continue;\n        const effectiveType = effectiveTypes[channel] || cs.type;\n        if (!isDiscreteType(effectiveType)) continue;\n        const uniqueValues = [...new Set(table.map((r: any) => r[cs.field]))];\n        nominalCount[channel] = uniqueValues.length;\n    }\n\n    // Detect grouping from 'group' channel + discrete axis\n    let groupField: string | undefined = channelSemantics.group?.field;\n    // Some templates (e.g. boxplot) subdivide a band by the COLOR field via an\n    // explicit offset rather than a dedicated 'group' channel. When they opt in,\n    // size the band as a group so total width is budgeted across categories and\n    // each sub-lane shrinks as the subgroup count grows.\n    if (!groupField && declaration.colorActsAsGroup) {\n        const colorCS = channelSemantics.color;\n        const colorType = effectiveTypes.color ?? colorCS?.type;\n        const axisField = isDiscreteType(effectiveTypes.x ?? channelSemantics.x?.type)\n            ? channelSemantics.x?.field\n            : channelSemantics.y?.field;\n        if (colorCS?.field && isDiscreteType(colorType) && colorCS.field !== axisField) {\n            groupField = colorCS.field;\n        }\n    }\n    // Guard: a grouping field that is redundant/nested with the categorical axis\n    // (group == x, or a 1:1 field pair) doesn't actually subdivide any band, so\n    // grouping it would collapse each bar/box to ~1/N of its band. When no band\n    // holds more than one distinct group value (confident-nested; threshold-\n    // independent), suppress grouping so glyphs fill their whole band. Genuine\n    // grouped charts (any band with >1 group value) are untouched.\n    if (groupField) {\n        const groupAxisField = isDiscreteType(effectiveTypes.x ?? channelSemantics.x?.type)\n            ? channelSemantics.x?.field\n            : channelSemantics.y?.field;\n        if (groupAxisField === groupField) {\n            groupField = undefined;  // group == axis: nothing to dodge\n        } else if (groupAxisField && planBandDodge(table, groupAxisField, groupField).maxPerBand <= 1) {\n            groupField = undefined;  // 1:1 / nested with the axis\n        }\n    }\n    let groupAxis: 'x' | 'y' | undefined;\n    if (groupField) {\n        // `local` dodge budgets only `maxPerBand` lanes (declaration.groupLaneCount);\n        // otherwise reserve one lane per global distinct group value.\n        nominalCount.group = declaration.groupLaneCount\n            ?? new Set(table.map((r: any) => r[groupField])).size;\n        if (isDiscreteType(effectiveTypes.x ?? channelSemantics.x?.type)) groupAxis = 'x';\n        else if (isDiscreteType(effectiveTypes.y ?? channelSemantics.y?.type)) groupAxis = 'y';\n    }\n\n    // Total discrete items per axis (grouping multiplies the grouped axis)\n    const xGroupMultiplier = (groupAxis === 'x' && nominalCount.group > 1) ? nominalCount.group : 1;\n    const yGroupMultiplier = (groupAxis === 'y' && nominalCount.group > 1) ? nominalCount.group : 1;\n    const xTotalNominalCount = nominalCount.x * xGroupMultiplier;\n    const yTotalNominalCount = nominalCount.y * yGroupMultiplier;\n\n    // --- Step size hints ---\n    // Minimum group step: the inter-group gap (stepPadding × step) must be\n    // at least MIN_GROUP_GAP_PX pixels so groups are visually separated.\n    const MIN_GROUP_GAP_PX = 3;\n    const xMinGroupStep = xGroupMultiplier > 1 ? Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * xGroupMultiplier) : minStepVal;\n    const yMinGroupStep = yGroupMultiplier > 1 ? Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * yGroupMultiplier) : minStepVal;\n\n    // (Overflow filtering is now handled by filterOverflow() before\n    //  computeLayout is called. The data passed here is already filtered.)\n\n    // --- Count banded continuous axes ---\n    let xContinuousAsDiscrete = 0;\n    let yContinuousAsDiscrete = 0;\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field) continue;\n        const effectiveType = effectiveTypes[axis] || cs.type;\n        if (isDiscreteType(effectiveType)) continue;\n\n        const isBanded = (axis === 'x' ? xBanded : yBanded);\n        // Check for binned from declaration\n        const isBinned = declaration.binnedAxes?.[axis];\n        if (!isBanded && !isBinned) continue;\n\n        let count: number;\n        if (isBinned) {\n            const binDef = declaration.binnedAxes![axis];\n            // Default to 10 bins (Vega-Lite's default maxbins)\n            count = typeof binDef === 'object' && binDef.maxbins\n                ? binDef.maxbins : 10;\n        } else {\n            count = new Set(table.map((r: any) => r[cs.field])).size;\n        }\n        if (count <= 1) continue;\n\n        if (axis === 'x') {\n            xContinuousAsDiscrete = count;\n        } else {\n            yContinuousAsDiscrete = count;\n        }\n    }\n\n    // --- Facet layout ---\n    // Use pre-decided grid from filterOverflow when available.\n    // This avoids the circularity where wrapping depends on subplot\n    // width which depends on facet count which depends on wrapping.\n    let facetCols = 1;\n    let facetRows = 1;\n    if (facetGrid) {\n        facetCols = facetGrid.columns;\n        facetRows = facetGrid.rows;\n    } else {\n        if (nominalCount.column > 0) facetCols = nominalCount.column;\n        if (nominalCount.row > 0) facetRows = nominalCount.row;\n    }\n\n    // --- Facet subplot sizing ---\n    // Log-scale axes need more room so the minor grid lines (1,2,3…9 per\n    // decade) remain legible and act as the visual cue that it's log scale.\n    // Compute the number of orders of magnitude each axis spans; each\n    // decade needs ~40px minimum to avoid a dense wall of grid lines.\n    const LOG_PX_PER_DECADE = 40;\n    let logBoostX = 0;\n    let logBoostY = 0;\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field || !cs.scaleType) continue;\n        if (cs.scaleType !== 'log' && cs.scaleType !== 'symlog') continue;\n        const vals = table\n            .map((r: any) => r[cs.field])\n            .filter((v: any) => typeof v === 'number' && v > 0 && isFinite(v));\n        if (vals.length < 2) continue;\n        const decades = Math.log10(Math.max(...vals)) - Math.log10(Math.min(...vals));\n        const needed = Math.ceil(Math.max(1, decades)) * LOG_PX_PER_DECADE;\n        if (axis === 'x') logBoostX = needed;\n        else logBoostY = needed;\n    }\n    const minContinuousSize = Math.max(10, minStepVal);\n    const minContinuousSizeX = Math.max(minContinuousSize, logBoostX);\n    const minContinuousSizeY = Math.max(minContinuousSize, logBoostY);\n\n    let subplotWidth: number;\n    if (facetCols > 1) {\n        const stretch = Math.min(maxStretchX, Math.pow(facetCols, facetElasticityVal));\n        subplotWidth = Math.round(Math.max(minContinuousSizeX,\n            (defaultChartWidth * stretch - fixW) / facetCols - gap));\n    } else {\n        subplotWidth = defaultChartWidth;\n    }\n\n    let subplotHeight: number;\n    if (facetRows > 1) {\n        const stretch = Math.min(maxStretchY, Math.pow(facetRows, facetElasticityVal));\n        subplotHeight = Math.round(Math.max(minContinuousSizeY,\n            (defaultChartHeight * stretch - fixH) / facetRows - gap));\n    } else {\n        subplotHeight = defaultChartHeight;\n    }\n\n    // --- Facet aspect-ratio resistance (non-gas-pressure charts) ---\n    // When faceting compresses one dimension (e.g. width ÷ columns), the\n    // aspect ratio drifts.  Line/area charts are very sensitive to this.\n    // For charts entering the 2D gas pressure path, AR resistance is\n    // handled inside the ideal-then-squeeze logic below. This block\n    // only applies when both axes are NOT continuous-non-banded.\n    const xIsContinuousNonBanded = xTotalNominalCount === 0 && xContinuousAsDiscrete === 0;\n    const yIsContinuousNonBanded = yTotalNominalCount === 0 && yContinuousAsDiscrete === 0;\n    const bothContinuousNonBanded = xIsContinuousNonBanded && yIsContinuousNonBanded;\n\n    if (facetAspectRatioResistance > 0 && !bothContinuousNonBanded\n        && (facetCols > 1 || facetRows > 1)) {\n        const baseAR = defaultChartWidth / defaultChartHeight;\n        const facetAR = subplotWidth / subplotHeight;\n        const arDrift = facetAR / baseAR; // <1 when panel got relatively narrower\n\n        if (arDrift < 1) {\n            // Panel is narrower than base → shrink height to compensate\n            subplotHeight = Math.round(\n                Math.max(minContinuousSizeY, subplotHeight * Math.pow(arDrift, facetAspectRatioResistance)),\n            );\n        } else if (arDrift > 1) {\n            // Panel is wider than base → shrink width to compensate\n            subplotWidth = Math.round(\n                Math.max(minContinuousSizeX, subplotWidth * Math.pow(1 / arDrift, facetAspectRatioResistance)),\n            );\n        }\n    }\n\n    // --- Gas pressure stretch for continuous non-banded axes ---\n    //\n    // Design: per-subplot baseline → pressure → AR blend → fit.\n    //\n    //   Baseline: each subplot gets a fair share of the canvas with\n    //             facet elasticity applied (cols^e / cols).\n    //   Step 1 — Gas pressure measures crowding against the per-subplot\n    //            baseline and produces per-axis raw stretches.\n    //   Step 2 — Decide AR: blend gas-pressure AR (density asymmetry)\n    //            with banking AR (perceptual slope optimization) in\n    //            log space.  Distribute gas-pressure area into the\n    //            blended AR.\n    //   Step 3 — Fit into budget: uniform scale-down so neither axis\n    //            exceeds maxStretch, preserving the AR.\n\n    if (bothContinuousNonBanded) {\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n\n        if (xCS?.field && yCS?.field) {\n            const isTempX = (effectiveTypes.x || xCS.type) === 'temporal';\n            const isTempY = (effectiveTypes.y || yCS.type) === 'temporal';\n\n            const xNumeric: number[] = [];\n            const yNumeric: number[] = [];\n            for (const row of table) {\n                let xv = row[xCS.field];\n                let yv = row[yCS.field];\n                if (xv == null || yv == null) continue;\n                if (isTempX) xv = +new Date(xv);\n                else xv = +xv;\n                if (isTempY) yv = +new Date(yv);\n                else yv = +yv;\n                if (isNaN(xv) || isNaN(yv)) continue;\n                xNumeric.push(xv);\n                yNumeric.push(yv);\n            }\n\n            if (xNumeric.length > 1) {\n                const xMin = Math.min(...xNumeric);\n                const xMax = Math.max(...xNumeric);\n                const yMin = Math.min(...yNumeric);\n                const yMax = Math.max(...yNumeric);\n\n                // Expand to visual domain (include zero when axis starts at zero).\n                const xDomain: [number, number] = [xMin, xMax];\n                const yDomain: [number, number] = [yMin, yMax];\n                if (xCS.zero?.zero) {\n                    if (xDomain[0] > 0) xDomain[0] = 0;\n                    if (xDomain[1] < 0) xDomain[1] = 0;\n                }\n                if (yCS.zero?.zero) {\n                    if (yDomain[0] > 0) yDomain[0] = 0;\n                    if (yDomain[1] < 0) yDomain[1] = 0;\n                }\n\n                // Data-coverage guard: skip banking when zero dominates.\n                const xDataCoverage = (xDomain[1] - xDomain[0]) > 0\n                    ? (xMax - xMin) / (xDomain[1] - xDomain[0]) : 1;\n                const yDataCoverage = (yDomain[1] - yDomain[0]) > 0\n                    ? (yMax - yMin) / (yDomain[1] - yDomain[0]) : 1;\n                const BANKING_COVERAGE_THRESHOLD = 0.2;\n\n                // --- Gas pressure params ---\n                let gasPressureParams: GasPressureParams = DEFAULT_GAS_PRESSURE_PARAMS;\n                if (continuousMarkCrossSection != null) {\n                    if (typeof continuousMarkCrossSection === 'number') {\n                        gasPressureParams = { ...DEFAULT_GAS_PRESSURE_PARAMS, markCrossSection: continuousMarkCrossSection };\n                    } else {\n                        const maxCS = Math.max(continuousMarkCrossSection.x, continuousMarkCrossSection.y);\n                        gasPressureParams = {\n                            ...DEFAULT_GAS_PRESSURE_PARAMS,\n                            markCrossSection: maxCS,\n                            markCrossSectionX: continuousMarkCrossSection.x,\n                            markCrossSectionY: continuousMarkCrossSection.y,\n                            ...(continuousMarkCrossSection.elasticity != null && { elasticity: continuousMarkCrossSection.elasticity }),\n                            ...(continuousMarkCrossSection.maxStretch != null && { maxStretch: continuousMarkCrossSection.maxStretch }),\n                        };\n\n                        if (continuousMarkCrossSection.seriesCountAxis) {\n                            const resolvedAxis = continuousMarkCrossSection.seriesCountAxis === 'auto'\n                                ? 'y' : continuousMarkCrossSection.seriesCountAxis;\n                            const nSeries = countDistinctSeries(channelSemantics, table);\n                            if (resolvedAxis === 'y') {\n                                gasPressureParams.yItemCountOverride = nSeries;\n                            } else {\n                                gasPressureParams.xItemCountOverride = nSeries;\n                            }\n                        }\n                    }\n                }\n\n                // --- Per-subplot baseline canvas ---\n                // Gas pressure must measure crowding against the actual\n                // per-subplot space, not the full canvas.  When faceted,\n                // each subplot gets a share of the canvas that includes\n                // facet elasticity (the same formula used for discrete\n                // axes): `canvas × cols^elasticity / cols`.  This way\n                // 2 columns don't naively halve the space — some stretch\n                // is assumed before gas pressure even kicks in.\n                const perSubplotCanvasW = facetCols > 1\n                    ? Math.max(minContinuousSizeX,\n                        (defaultChartWidth * Math.min(maxStretchX, Math.pow(facetCols, facetElasticityVal)) - fixW)\n                        / facetCols - gap)\n                    : defaultChartWidth;\n                const perSubplotCanvasH = facetRows > 1\n                    ? Math.max(minContinuousSizeY,\n                        (defaultChartHeight * Math.min(maxStretchY, Math.pow(facetRows, facetElasticityVal)) - fixH)\n                        / facetRows - gap)\n                    : defaultChartHeight;\n\n                // --- Gas pressure: per-axis raw stretches ---\n                const idealResult = computeGasPressure(\n                    xNumeric, yNumeric, xDomain, yDomain,\n                    perSubplotCanvasW, perSubplotCanvasH, gasPressureParams,\n                );\n\n                const isConnected = typeof continuousMarkCrossSection === 'object'\n                    && !!continuousMarkCrossSection.seriesCountAxis;\n                const useBanking = xDataCoverage >= BANKING_COVERAGE_THRESHOLD\n                    && yDataCoverage >= BANKING_COVERAGE_THRESHOLD;\n\n                let idealW: number;\n                let idealH: number;\n\n                // Gas pressure's native per-axis dimensions (uncapped).\n                const rawW = perSubplotCanvasW * idealResult.rawStretchX;\n                const rawH = perSubplotCanvasH * idealResult.rawStretchY;\n\n                if (useBanking) {\n                    // ── Step 1: Decide AR ──────────────────────────────\n                    // Blend gas-pressure AR (which axis is more crowded)\n                    // with banking AR (perceptual slope optimization).\n                    const seriesFields: string[] = [];\n                    const colorField = channelSemantics.color?.field;\n                    const detailField = channelSemantics.detail?.field;\n                    if (colorField) seriesFields.push(colorField);\n                    if (detailField && detailField !== colorField) seriesFields.push(detailField);\n\n                    const perPointSeriesKeys: string[] = new Array(xNumeric.length);\n                    if (seriesFields.length === 0) {\n                        perPointSeriesKeys.fill('');\n                    } else {\n                        let idx = 0;\n                        for (const row of table) {\n                            const xv = xCS?.field ? row[xCS.field] : undefined;\n                            const yv = yCS?.field ? row[yCS.field] : undefined;\n                            if (xv == null || yv == null) continue;\n                            const xn = isTempX ? +new Date(xv) : +xv;\n                            const yn = isTempY ? +new Date(yv) : +yv;\n                            if (isNaN(xn) || isNaN(yn)) continue;\n                            perPointSeriesKeys[idx++] = seriesFields\n                                .map(f => String(row[f] ?? '')).join('\\x00');\n                        }\n                    }\n\n                    const bankingAR = computeBankingAR(\n                        xNumeric, yNumeric, xDomain, yDomain,\n                        perPointSeriesKeys, isConnected,\n                    );\n\n                    // ── Step 2: Blend AR + distribute area ────────────\n                    // Gas pressure knows which axis is crowded (per-axis\n                    // stretch).  Banking knows the perceptual ideal AR.\n                    // Blend in log space so both signals contribute:\n                    //   gasAR reflects density asymmetry (X crowded → landscape)\n                    //   bankingAR reflects slope perception\n                    const BANKING_BLEND = 0.5;\n                    const gasAR = rawW / rawH;\n                    const blendedAR = gasAR > 0 && bankingAR > 0\n                        ? Math.exp((1 - BANKING_BLEND) * Math.log(gasAR)\n                            + BANKING_BLEND * Math.log(bankingAR))\n                        : bankingAR;\n\n                    // Total area from gas pressure (capped so subplot\n                    // doesn't blow past per-subplot budget before fit).\n                    const rawArea = rawW * rawH;\n                    const maxArea = perSubplotCanvasW * perSubplotCanvasH * Math.max(maxStretchX, maxStretchY);\n                    const area = Math.min(rawArea, maxArea);\n\n                    idealW = Math.sqrt(area * blendedAR);\n                    idealH = Math.sqrt(area / blendedAR);\n                } else {\n                    // Banking skipped (zero dominates): gas pressure shape.\n                    idealW = rawW;\n                    idealH = rawH;\n                }\n\n                // ── Step 3: Fit into budget, preserving AR ───────────\n                // Hard ceiling per subplot: canvas × maxStretch shared\n                // across facet panels.\n                const availW = facetCols > 1\n                    ? Math.max(minContinuousSizeX, (defaultChartWidth * maxStretchX - fixW) / facetCols - gap)\n                    : defaultChartWidth * maxStretchX;\n                const availH = facetRows > 1\n                    ? Math.max(minContinuousSizeY, (defaultChartHeight * maxStretchY - fixH) / facetRows - gap)\n                    : defaultChartHeight * maxStretchY;\n\n                // Scale down to fit: if either axis exceeds its budget,\n                // shrink both axes by the tighter ratio so neither\n                // exceeds AND the AR is preserved.\n                const scaleX = idealW > availW ? availW / idealW : 1;\n                const scaleY = idealH > availH ? availH / idealH : 1;\n                const fitScale = Math.min(scaleX, scaleY);\n\n                let finalW = idealW * fitScale;\n                let finalH = idealH * fitScale;\n\n                // Enforce minimums (may slightly distort AR at extremes).\n                finalW = Math.max(finalW, minContinuousSizeX);\n                finalH = Math.max(finalH, minContinuousSizeY);\n\n                subplotWidth = Math.round(finalW);\n                subplotHeight = Math.round(finalH);\n            }\n        }\n    } else if (xIsContinuousNonBanded || yIsContinuousNonBanded) {\n        const contAxis = xIsContinuousNonBanded ? 'x' : 'y';\n        const otherAxisHasDiscreteItems = contAxis === 'x'\n            ? (yTotalNominalCount > 0 || yContinuousAsDiscrete > 0)\n            : (xTotalNominalCount > 0 || xContinuousAsDiscrete > 0);\n\n        let seriesStretchApplied = false;\n        if (typeof continuousMarkCrossSection === 'object' && continuousMarkCrossSection.seriesCountAxis) {\n            const resolvedAxis = continuousMarkCrossSection.seriesCountAxis === 'auto'\n                ? contAxis : continuousMarkCrossSection.seriesCountAxis;\n\n            if (resolvedAxis === contAxis) {\n                const sigmaPerSeries = contAxis === 'x'\n                    ? continuousMarkCrossSection.x\n                    : continuousMarkCrossSection.y;\n                const baseDim = contAxis === 'x' ? subplotWidth : subplotHeight;\n                const nSeries = countDistinctSeries(channelSemantics, table);\n                const pressure = (nSeries * sigmaPerSeries) / baseDim;\n\n                const elast = continuousMarkCrossSection.elasticity ?? DEFAULT_GAS_PRESSURE_PARAMS.elasticity;\n                const maxS = continuousMarkCrossSection.maxStretch ?? DEFAULT_GAS_PRESSURE_PARAMS.maxStretch;\n\n                if (pressure > 1) {\n                    const stretch = Math.min(maxS, Math.pow(pressure, elast));\n                    if (contAxis === 'x') {\n                        subplotWidth = Math.round(subplotWidth * stretch);\n                    } else {\n                        subplotHeight = Math.round(subplotHeight * stretch);\n                    }\n                }\n                seriesStretchApplied = true;\n            }\n        }\n\n        if (!seriesStretchApplied && !otherAxisHasDiscreteItems) {\n            const contCS = channelSemantics[contAxis];\n            if (contCS?.field) {\n                const isTemporal = (effectiveTypes[contAxis] || contCS.type) === 'temporal';\n                const contValues: number[] = [];\n                for (const row of table) {\n                    let v = row[contCS.field];\n                    if (v == null) continue;\n                    if (isTemporal) v = +new Date(v);\n                    else v = +v;\n                    if (!isNaN(v)) contValues.push(v);\n                }\n                const sigma1d = Math.sqrt(DEFAULT_GAS_PRESSURE_PARAMS.markCrossSection);\n                const baseDim = contAxis === 'x' ? subplotWidth : subplotHeight;\n                const pressure1d = (contValues.length * sigma1d) / baseDim;\n                if (pressure1d > 1) {\n                    const stretch1d = Math.min(\n                        DEFAULT_GAS_PRESSURE_PARAMS.maxStretch,\n                        Math.pow(pressure1d, DEFAULT_GAS_PRESSURE_PARAMS.elasticity),\n                    );\n                    if (contAxis === 'x') {\n                        subplotWidth = Math.round(subplotWidth * stretch1d);\n                    } else {\n                        subplotHeight = Math.round(subplotHeight * stretch1d);\n                    }\n                }\n            }\n        }\n    }\n\n    // --- Elastic stretch for discrete axes ---\n    // X axis grows under its width budget (βx); Y under its height budget (βy).\n    const elasticParamsX: ElasticStretchParams = {\n        elasticity: elasticityVal,\n        maxStretch: maxStretchX,\n        defaultStepSize,\n        minStep: minStepVal,\n    };\n    const elasticParamsY: ElasticStretchParams = {\n        elasticity: elasticityVal,\n        maxStretch: maxStretchY,\n        defaultStepSize,\n        minStep: minStepVal,\n    };\n\n    const xAxis = computeAxisStep(xTotalNominalCount, xContinuousAsDiscrete, subplotWidth, elasticParamsX);\n    const yAxis = computeAxisStep(yTotalNominalCount, yContinuousAsDiscrete, subplotHeight, elasticParamsY);\n\n    const xIsDiscrete = xTotalNominalCount > 0;\n    const yIsDiscrete = yTotalNominalCount > 0;\n\n    const xHasGrouping = groupAxis === 'x' && nominalCount.group > 0;\n    const yHasGrouping = groupAxis === 'y' && nominalCount.group > 0;\n\n    let xStepSize: number;\n    let yStepSize: number;\n    let xStepUnit: 'item' | 'group' | undefined;\n    let yStepUnit: 'item' | 'group' | undefined;\n\n    if (xIsDiscrete && xHasGrouping) {\n        const itemsPerGroup = nominalCount.group;\n        const defaultGroupStep = itemsPerGroup * maxStepSize;\n        const minGroupStep = Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * itemsPerGroup);\n        const groupAxis = computeAxisStep(nominalCount.x, 0, subplotWidth, elasticParamsX);\n        const groupStep = Math.max(minGroupStep, Math.min(defaultGroupStep, groupAxis.step));\n        xStepSize = groupStep;\n        xStepUnit = 'group';\n    } else if (xIsDiscrete) {\n        xStepSize = Math.max(minStepVal, Math.min(maxStepSize, xAxis.step));\n    } else if (xContinuousAsDiscrete > 0) {\n        xStepSize = Math.max(minStepVal, Math.min(maxStepSize, xAxis.step));\n    } else {\n        xStepSize = defaultStepSize;\n    }\n\n    if (yIsDiscrete && yHasGrouping) {\n        const itemsPerGroup = nominalCount.group;\n        const defaultGroupStep = itemsPerGroup * maxStepSize;\n        const minGroupStep = Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * itemsPerGroup);\n        const groupAxis = computeAxisStep(nominalCount.y, 0, subplotHeight, elasticParamsY);\n        const groupStep = Math.max(minGroupStep, Math.min(defaultGroupStep, groupAxis.step));\n        yStepSize = groupStep;\n        yStepUnit = 'group';\n    } else if (yIsDiscrete) {\n        yStepSize = Math.max(minStepVal, Math.min(maxStepSize, yAxis.step));\n    } else if (yContinuousAsDiscrete > 0) {\n        yStepSize = Math.max(minStepVal, Math.min(maxStepSize, yAxis.step));\n    } else {\n        yStepSize = defaultStepSize;\n    }\n\n    // --- Banded continuous canvas size ---\n    for (const axis of ['x', 'y'] as const) {\n        const count = axis === 'x' ? xContinuousAsDiscrete : yContinuousAsDiscrete;\n        if (count <= 0) continue;\n        const stepSize = axis === 'x' ? xStepSize : yStepSize;\n        const continuousSize = Math.round(stepSize * (count + 1));\n        if (axis === 'x') {\n            subplotWidth = continuousSize;\n        } else {\n            subplotHeight = continuousSize;\n        }\n    }\n\n    // --- Unified stretch budget ------------------------------------------------\n    // Cap the per-subplot dimensions so total canvas never exceeds\n    // canvasWidth × maxStretch (and canvasHeight × maxStretch).\n    // Formula: effectiveW = W × maxStretch − fixedPad; each panel costs subplot + gap.\n    const maxSubplotW = (defaultChartWidth * maxStretchX - fixW) / facetCols - gap;\n    const maxSubplotH = (defaultChartHeight * maxStretchY - fixH) / facetRows - gap;\n\n    // Clamp step sizes for discrete/banded axes so VL step-based\n    // sizing respects the same budget.\n    // When step unit is 'group', divide by the number of groups (nominalCount)\n    // rather than the total item count (groups × items-per-group).\n    if (xTotalNominalCount > 0) {\n        const divisor = xStepUnit === 'group' ? nominalCount.x : xTotalNominalCount;\n        const cap = Math.max(minStepVal, Math.floor(maxSubplotW / divisor));\n        if (xStepSize > cap) xStepSize = cap;\n    }\n    if (xContinuousAsDiscrete > 0) {\n        const cap = Math.max(minStepVal, Math.floor(maxSubplotW / (xContinuousAsDiscrete + 1)));\n        if (xStepSize > cap) xStepSize = cap;\n    }\n    if (yTotalNominalCount > 0) {\n        const divisor = yStepUnit === 'group' ? nominalCount.y : yTotalNominalCount;\n        const cap = Math.max(minStepVal, Math.floor(maxSubplotH / divisor));\n        if (yStepSize > cap) yStepSize = cap;\n    }\n    if (yContinuousAsDiscrete > 0) {\n        const cap = Math.max(minStepVal, Math.floor(maxSubplotH / (yContinuousAsDiscrete + 1)));\n        if (yStepSize > cap) yStepSize = cap;\n    }\n\n    // Recompute banded subplot size after step clamping.\n    for (const axis of ['x', 'y'] as const) {\n        const count = axis === 'x' ? xContinuousAsDiscrete : yContinuousAsDiscrete;\n        if (count <= 0) continue;\n        const stepSize = axis === 'x' ? xStepSize : yStepSize;\n        if (axis === 'x') subplotWidth = Math.round(stepSize * (count + 1));\n        else subplotHeight = Math.round(stepSize * (count + 1));\n    }\n\n    // --- Nominal discrete subplot sizing ---\n    // For nominal discrete axes, one backend (VL) overrides subplotWidth\n    // with step-based sizing (width:{step:N}), so the subplot dimension\n    // doesn't matter.  Other backends (Chart.js, ECharts) fill the canvas\n    // and divide evenly among categories — for them, the subplot dimension\n    // IS the canvas width.\n    //\n    // Ensure the subplot is at least as wide as canvasSize (the user's\n    // requested chart size) so backends that fill the canvas get generous\n    // bars when there are few categories.  The subplot only exceeds\n    // canvasSize when faceting shrinks it, which is already handled above.\n\n    // Clamp continuous subplot dimensions.\n    subplotWidth = Math.min(subplotWidth, Math.round(maxSubplotW));\n    subplotHeight = Math.min(subplotHeight, Math.round(maxSubplotH));\n\n    // --- Band AR blending ---\n    // When one axis is banded (discrete) and the other is continuous,\n    // each band has a natural AR = continuousSize / stepSize.  If the\n    // actual band AR exceeds the target, blend the subplot AR toward\n    // the target (in log space) to avoid excessively tall/wide bands.\n    const targetBandAR = options.targetBandAR;\n    if (targetBandAR && targetBandAR > 0) {\n        const xIsBanded = xTotalNominalCount > 0 || xContinuousAsDiscrete > 0;\n        const yIsBanded = yTotalNominalCount > 0 || yContinuousAsDiscrete > 0;\n\n        if (xIsBanded && !yIsBanded) {\n            // X is banded, Y is continuous → band AR = subplotHeight / xStepSize\n            const actualBandAR = subplotHeight / xStepSize;\n            if (actualBandAR > targetBandAR) {\n                const idealH = xStepSize * targetBandAR;\n                // Blend: 50/50 between actual and target in log space.\n                const blendedH = Math.exp(\n                    0.5 * Math.log(subplotHeight) + 0.5 * Math.log(idealH));\n                subplotHeight = Math.round(\n                    Math.max(minContinuousSizeY, Math.min(blendedH, subplotHeight)));\n            }\n        } else if (yIsBanded && !xIsBanded) {\n            // Y is banded, X is continuous → band AR = subplotWidth / yStepSize\n            const actualBandAR = subplotWidth / yStepSize;\n            if (actualBandAR > targetBandAR) {\n                const idealW = yStepSize * targetBandAR;\n                const blendedW = Math.exp(\n                    0.5 * Math.log(subplotWidth) + 0.5 * Math.log(idealW));\n                subplotWidth = Math.round(\n                    Math.max(minContinuousSizeX, Math.min(blendedW, subplotWidth)));\n            }\n        }\n    }\n\n    // --- Label sizing ---\n    // A temporal/numeric field used as a BANDED axis (one bar per value) is\n    // \"continuous-as-discrete\": its tick labels sit one-per-band exactly like a\n    // nominal axis, so they must follow the same discrete sizing ladder (shrink\n    // — and rotate when bands are narrow) rather than staying at the full\n    // continuous base font. Otherwise dense date/number bands render oversized\n    // labels that feel too large for their band and crowd together.\n    const xHasDiscreteItems = xTotalNominalCount > 0 || xContinuousAsDiscrete > 0;\n    const yHasDiscreteItems = yTotalNominalCount > 0 || yContinuousAsDiscrete > 0;\n    // Canvas-adaptive fonts: descend the tick ladder from the backend's native\n    // base, and derive header/legend sizes. Scaled by the (sub)plot's smaller\n    // dimension so small multiples shrink and large single views grow subtly.\n    const fontSizing = computeFontSizing(Math.min(subplotWidth, subplotHeight), {\n        baseLabelFontSize: options.baseLabelFontSize,\n        baseTitleFontSize: options.baseTitleFontSize,\n    });\n    const labelOpts = { baseFont: fontSizing.tickBase, minFont: 6 };\n    let xLabel = computeLabelSizing(xStepSize, xHasDiscreteItems, labelOpts);\n    let yLabel = computeLabelSizing(yStepSize, yHasDiscreteItems, labelOpts);\n\n    if (xHasDiscreteItems) {\n        const xf = channelSemantics.x?.field;\n        const xt = effectiveTypes.x || channelSemantics.x?.type;\n        const stats = computeDiscreteLabelStats(xf, table);\n        if (stats) {\n            // Numeric-like labels (declared quantitative, or all values parse as\n            // numbers — years, bins, IDs) compete for the band's width when laid\n            // out horizontally. A continuous field split into many narrow bands\n            // yields many/wide numbers that crowd. Decide horizontal vs. angled\n            // by whether the widest label fits within one band.\n            const numericLike = xt === 'quantitative' || stats.allNumeric;\n            let labelPx = stats.maxLen * xLabel.fontSize * APPROX_CHAR_WIDTH_RATIO;\n            const fewShortStrings = !numericLike\n                && stats.count <= VL_SHORT_DISCRETE_CATEGORY_COUNT\n                && stats.maxLen <= VL_SHORT_DISCRETE_LABEL_MAX_LEN;\n\n            if (fewShortStrings || (numericLike && labelPx <= xStepSize)) {\n                // We want horizontal labels here. But a small number of short\n                // string categories can still collide when the band step is\n                // narrower than the widest label (e.g. box marks declare a tiny\n                // defaultBandSize). Before committing to horizontal, make sure\n                // the label actually fits — widen the band within the stretch\n                // budget if it can, otherwise angle the labels instead of\n                // letting them overlap. (xStepSize is the per-label band width:\n                // the item step when ungrouped, the group step when grouped.)\n                if (labelPx > xStepSize) {\n                    const desiredStep = Math.ceil(labelPx) + 6; // label width + inter-label gap\n                    const cap = Math.max(minStepVal, Math.floor(maxSubplotW / stats.count));\n                    if (desiredStep <= cap) {\n                        xStepSize = Math.max(xStepSize, desiredStep);\n                        xLabel = computeLabelSizing(xStepSize, xHasDiscreteItems, labelOpts);\n                        labelPx = stats.maxLen * xLabel.fontSize * APPROX_CHAR_WIDTH_RATIO;\n                    }\n                }\n\n                if (labelPx <= xStepSize) {\n                    // Fits horizontally (already, or after widening the band).\n                    // Must be explicit: omitting labelAngle leaves VL defaults (e.g. -45° on ordinal).\n                    xLabel = {\n                        ...xLabel,\n                        labelAngle: 0,\n                        labelAlign: 'center',\n                        labelBaseline: 'top',\n                    };\n                } else {\n                    // Even the stretch budget can't fit a wide-enough band →\n                    // angle the labels rather than let them run together.\n                    xLabel = {\n                        ...xLabel,\n                        labelAngle: -45,\n                        labelAlign: 'right',\n                        labelBaseline: 'top',\n                    };\n                }\n            } else if (numericLike && labelPx > xStepSize && xLabel.labelAngle === undefined) {\n                // Numeric labels that don't fit horizontally and weren't already\n                // rotated by step-based sizing (which only rotates at narrow\n                // steps). Without this, VL keeps them horizontal and the numbers\n                // overlap. Rotate to -45°.\n                xLabel = {\n                    ...xLabel,\n                    labelAngle: -45,\n                    labelAlign: 'right',\n                    labelBaseline: 'top',\n                };\n            }\n        }\n    }\n    if (yHasDiscreteItems) {\n        const yf = channelSemantics.y?.field;\n        const yt = effectiveTypes.y || channelSemantics.y?.type;\n        if (discreteYAxisShouldUseHorizontalLabels(yf, yt, table)) {\n            yLabel = {\n                ...yLabel,\n                labelAngle: 0,\n                labelAlign: 'right',\n                labelBaseline: 'middle',\n            };\n        }\n    }\n\n    // Keep tick labels consistent across axes. A continuous value axis stays at\n    // the base font, but a banded axis shrinks its labels as bands tighten — so\n    // the value \"numbers\" can end up visibly larger than the category \"text\".\n    // Unify both tick fonts to the smaller of the two so they read as one size.\n    const unifiedTickFont = Math.min(xLabel.fontSize, yLabel.fontSize);\n    if (xLabel.fontSize !== unifiedTickFont) xLabel = { ...xLabel, fontSize: unifiedTickFont };\n    if (yLabel.fontSize !== unifiedTickFont) yLabel = { ...yLabel, fontSize: unifiedTickFont };\n\n    return {\n        subplotWidth,\n        subplotHeight,\n        xStep: xStepSize,\n        yStep: yStepSize,\n        xStepUnit,\n        yStepUnit,\n        xContinuousAsDiscrete,\n        yContinuousAsDiscrete,\n        xNominalCount: xTotalNominalCount,\n        yNominalCount: yTotalNominalCount,\n        xLabel,\n        yLabel,\n        titleFontSize: fontSizing.titleFontSize,\n        legendFontSize: fontSizing.legendFontSize,\n        stepPadding: stepPaddingVal,\n        facet: (facetCols > 1 || facetRows > 1) ? {\n            columns: facetCols,\n            rows: facetRows,\n            subplotWidth,\n            subplotHeight,\n        } : undefined,\n        effectiveFacetGap: gap,\n        truncations: [],  // Overflow truncations are handled by filterOverflow\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Count distinct series (color/detail categories) from channel semantics.\n */\nfunction countDistinctSeries(\n    channelSemantics: Record<string, ChannelSemantics>,\n    data: any[],\n): number {\n    const seriesFields: string[] = [];\n    const colorField = channelSemantics.color?.field;\n    const detailField = channelSemantics.detail?.field;\n    if (colorField) seriesFields.push(colorField);\n    if (detailField && detailField !== colorField) seriesFields.push(detailField);\n\n    if (seriesFields.length === 0) return 1;\n\n    const seriesKeys = new Set<string>();\n    for (const row of data) {\n        const key = seriesFields.map(f => String(row[f] ?? '')).join('\\x00');\n        seriesKeys.add(key);\n    }\n    return seriesKeys.size;\n}\n\n/**\n * Compute the ideal aspect ratio for a both-continuous chart.\n *\n * Dispatches to two strategies depending on mark type:\n *\n * - **Scatter / point** (`isConnected = false`): Uses the normalized\n *   standard-deviation ratio of the point cloud — a unit-independent\n *   shape measure.  Dampened 0.3× toward 1.0 so scatter stays near\n *   square.\n *\n * - **Connected marks** (line/area/bump, `isConnected = true`): Uses\n *   multi-scale banking to 45° (Heer & Agrawala 2006).  Slopes are\n *   computed at multiple octave-band smoothing levels and combined via\n *   geometric mean so that trend, periodicity, and noise each\n *   contribute proportionally — avoiding the dense-data failure mode\n *   of Cleveland's single-scale median.\n *\n * @param xValues     Numeric X values\n * @param yValues     Numeric Y values (parallel array)\n * @param xDomain     [min, max] of the visual X axis\n * @param yDomain     [min, max] of the visual Y axis\n * @param seriesKeys  Per-point series key ('' if no series)\n * @param isConnected Whether the mark connects points (line/area vs scatter)\n * @returns Ideal AR (width/height). Clamped to [0.5, 3.0].\n */\nfunction computeBankingAR(\n    xValues: number[],\n    yValues: number[],\n    xDomain: [number, number],\n    yDomain: [number, number],\n    seriesKeys: string[],\n    isConnected: boolean,\n): number {\n    const MIN_AR = 0.5;\n    const MAX_AR = 3.0;\n\n    const xRange = xDomain[1] - xDomain[0];\n    const yRange = yDomain[1] - yDomain[0];\n    if (xRange <= 0 || yRange <= 0) return 1;\n\n    // ── Scatter: σ-ratio ──────────────────────────────────────────────\n    if (!isConnected) {\n        const n = xValues.length;\n        let sumX = 0, sumY = 0;\n        for (let i = 0; i < n; i++) {\n            sumX += (xValues[i] - xDomain[0]) / xRange;\n            sumY += (yValues[i] - yDomain[0]) / yRange;\n        }\n        const meanX = sumX / n;\n        const meanY = sumY / n;\n        let varX = 0, varY = 0;\n        for (let i = 0; i < n; i++) {\n            const dx = (xValues[i] - xDomain[0]) / xRange - meanX;\n            const dy = (yValues[i] - yDomain[0]) / yRange - meanY;\n            varX += dx * dx;\n            varY += dy * dy;\n        }\n        const sdX = Math.sqrt(varX / n);\n        const sdY = Math.sqrt(varY / n);\n        if (sdY <= 0) return MAX_AR;\n        if (sdX <= 0) return MIN_AR;\n\n        const sdRatio = sdX / sdY;\n        const ar = sdRatio > 1\n            ? 1 + (sdRatio - 1) * 0.3\n            : 1 - (1 - sdRatio) * 0.3;\n        return Math.min(MAX_AR, Math.max(MIN_AR, ar));\n    }\n\n    // ── Connected marks: multi-scale banking (Heer & Agrawala 2006) ──\n\n    // Group by series and sort by X.\n    const seriesMap = new Map<string, { x: number; y: number }[]>();\n    for (let i = 0; i < xValues.length; i++) {\n        const key = seriesKeys[i];\n        let arr = seriesMap.get(key);\n        if (!arr) { arr = []; seriesMap.set(key, arr); }\n        arr.push({ x: xValues[i], y: yValues[i] });\n    }\n    for (const pts of seriesMap.values()) {\n        pts.sort((a, b) => a.x - b.x);\n    }\n\n    // Collect per-scale median absolute slopes, then combine with\n    // geometric mean across scales.  Each scale is a box-filter\n    // smoothing at window width 2^k (k = 0, 1, 2, …).\n    // Scale 0 = raw data (Cleveland's original).\n    const scaleMedians: number[] = [];\n\n    // Determine max scale: largest power of 2 that still leaves ≥ 3\n    // points in the longest series after smoothing.\n    let maxSeriesLen = 0;\n    for (const pts of seriesMap.values()) {\n        if (pts.length > maxSeriesLen) maxSeriesLen = pts.length;\n    }\n    const maxScale = Math.max(0, Math.floor(Math.log2(maxSeriesLen)) - 1);\n\n    for (let scale = 0; scale <= maxScale; scale++) {\n        const windowSize = 1 << scale;  // 1, 2, 4, 8, …\n        const absSlopes: number[] = [];\n\n        for (const pts of seriesMap.values()) {\n            // Smooth: non-overlapping bucket averages of `windowSize` points.\n            // The last bucket may be smaller — included as-is.\n            const n = pts.length;\n            if (n < 2) continue;\n\n            const smoothed: { x: number; y: number }[] = [];\n            for (let i = 0; i < n; i += windowSize) {\n                const end = Math.min(i + windowSize, n);\n                let sx = 0, sy = 0;\n                for (let j = i; j < end; j++) {\n                    sx += pts[j].x;\n                    sy += pts[j].y;\n                }\n                const cnt = end - i;\n                smoothed.push({ x: sx / cnt, y: sy / cnt });\n            }\n\n            // Compute slopes between consecutive smoothed points.\n            for (let i = 1; i < smoothed.length; i++) {\n                const dx = (smoothed[i].x - smoothed[i - 1].x) / xRange;\n                const dy = (smoothed[i].y - smoothed[i - 1].y) / yRange;\n                if (dx === 0) continue;\n                absSlopes.push(Math.abs(dy / dx));\n            }\n        }\n\n        if (absSlopes.length === 0) continue;\n\n        // Median absolute slope at this scale.\n        absSlopes.sort((a, b) => a - b);\n        const mid = absSlopes.length >> 1;\n        const median = absSlopes.length % 2 === 1\n            ? absSlopes[mid]\n            : (absSlopes[mid - 1] + absSlopes[mid]) / 2;\n        if (median > 0) {\n            scaleMedians.push(median);\n        }\n    }\n\n    if (scaleMedians.length === 0) return 1;\n\n    // Geometric mean of per-scale median slopes.\n    // This gives equal weight to each octave band: trend (coarse),\n    // periodicity (middle), and noise (fine) all contribute.\n    let logSum = 0;\n    for (const m of scaleMedians) {\n        logSum += Math.log(m);\n    }\n    const combinedSlope = Math.exp(logSum / scaleMedians.length);\n\n    if (combinedSlope <= 0) return MAX_AR;\n\n    // Banking to 45°: display_slope = s_norm × (H/W).\n    // For median |display_slope| = 1:  H/W = 1/median(|s_norm|),\n    // so W/H = median(|s_norm|) = combinedSlope.\n    //\n    // No dampening here — the caller (computeLayout) blends banking AR\n    // with gas-pressure AR at 50/50, which already moderates it.\n    // Applying dampening on top of the blend would double-moderate.\n\n    // Landscape floor for connected marks: time series, line charts,\n    // and area charts are conventionally landscape.  Banking can push\n    // wider (when slopes are steep) but never portrait — the gentle-\n    // slope majority in typical time series would otherwise dominate\n    // the median and produce portrait, compressing the time axis.\n    const ar = Math.max(1.0, combinedSlope);\n    return Math.min(MAX_AR, Math.max(MIN_AR, ar));\n}\n\n// ---------------------------------------------------------------------------\n// Public: computeChannelBudgets\n// ---------------------------------------------------------------------------\n\n/**\n * Compute per-channel maximum values that can fit on the canvas.\n *\n * Uses the **most conservative** assumptions:\n *   - minStep  (smallest px per discrete item)\n *   - minSubplotSize (smallest subplot for continuous axes)\n *   - maxStretch (maximum canvas stretching)\n *\n * This is Step 0c-a in the pipeline — it runs before filterOverflow\n * and produces the budgets that filterOverflow consumes.\n *\n * Pipeline:  computeChannelBudgets → filterOverflow → computeLayout\n *\n * @param channelSemantics  Phase 0 output (field, type per channel)\n * @param declaration       Template layout declaration\n * @param data              Full data table (pre-overflow)\n * @param canvasSize        Target canvas dimensions\n * @param options           Assembly options\n * @returns                 ChannelBudgets with per-channel max-to-keep\n */\nexport function computeChannelBudgets(\n    channelSemantics: Record<string, ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    data: any[],\n    canvasSize: { width: number; height: number },\n    options: AssembleOptions,\n): ChannelBudgets {\n    const {\n        minStep: minStepVal = 6,\n        stepPadding: stepPaddingVal = 0.1,\n        maxColorValues: maxColorVal = 24,\n    } = options;\n\n    const { x: maxStretchX, y: maxStretchY } = resolveStretchCaps(options);\n\n    const fixW = options.facetFixedPadding?.width ?? 0;\n    const fixH = options.facetFixedPadding?.height ?? 0;\n    const gap = options.facetGap ?? 0;\n\n    const isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n    const effectiveType = (ch: string): string | undefined =>\n        declaration.resolvedTypes?.[ch] ?? channelSemantics[ch]?.type;\n\n    // --- 1. Facet grid (delegates to computeFacetGrid) ---\n    const facetGrid = computeFacetGrid(\n        channelSemantics, declaration, data, canvasSize, options,\n    );\n    const facetCols = facetGrid?.columns ?? 1;\n    const facetRows = facetGrid?.rows ?? 1;\n\n    // --- 2. Per-subplot budget at maximum stretch ---\n    const maxSubplotW = Math.max(\n        options.minSubplotSize ?? 60,\n        (canvasSize.width * maxStretchX - fixW) / facetCols - gap,\n    );\n    const maxSubplotH = Math.max(\n        options.minSubplotSize ?? 60,\n        (canvasSize.height * maxStretchY - fixH) / facetRows - gap,\n    );\n\n    // --- 3. Grouping detection ---\n    const groupField = channelSemantics.group?.field;\n    let groupCount = 0;\n    let groupAxis: 'x' | 'y' | undefined;\n    if (groupField) {\n        groupCount = new Set(data.map(r => r[groupField])).size;\n        if (isDiscreteType(effectiveType('x'))) groupAxis = 'x';\n        else if (isDiscreteType(effectiveType('y'))) groupAxis = 'y';\n    }\n\n    const xGroupMultiplier = (groupAxis === 'x' && groupCount > 1) ? groupCount : 1;\n    const yGroupMultiplier = (groupAxis === 'y' && groupCount > 1) ? groupCount : 1;\n\n    const MIN_GROUP_GAP_PX = 3;\n    const xMinGroupStep = xGroupMultiplier > 1\n        ? Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * xGroupMultiplier)\n        : minStepVal;\n    const yMinGroupStep = yGroupMultiplier > 1\n        ? Math.max(Math.ceil(MIN_GROUP_GAP_PX / stepPaddingVal), 2 * yGroupMultiplier)\n        : minStepVal;\n\n    // --- 4. Per-channel budgets ---\n    let maxXToKeep = Math.floor(maxSubplotW / xMinGroupStep);\n    let maxYToKeep = Math.floor(maxSubplotH / yMinGroupStep);\n\n    // --- 5. Faceted-chart canvas cap ---\n    // When a busy discrete axis makes each subplot wider than the\n    // un-stretched canvas, cap axis items to fit within one canvas\n    // width/height.  This lets subplots be narrower, potentially fitting\n    // more facet columns — reducing overall chart height.\n    //\n    // Example: 70 counties on X × 20 states on column.  Without the cap,\n    // minSubplotWidth = 70 × 6 = 420 → only 1 facet column fits → each\n    // state stacks vertically → excessively tall chart.  With the cap,\n    // X is truncated to floor(400/6) = 66 items, and the facet grid is\n    // re-derived with narrower subplots so more columns fit.\n    if (facetGrid) {\n        const canvasXCap = Math.max(1, Math.floor(canvasSize.width / xMinGroupStep));\n        const canvasYCap = Math.max(1, Math.floor(canvasSize.height / yMinGroupStep));\n\n        if (maxXToKeep > canvasXCap || maxYToKeep > canvasYCap) {\n            maxXToKeep = Math.min(maxXToKeep, canvasXCap);\n            maxYToKeep = Math.min(maxYToKeep, canvasYCap);\n\n            // With tighter axis items, subplots can be narrower, so more\n            // facet columns may fit.  Re-derive the grid for column-only\n            // wrapping (the most affected case).\n            const colField = channelSemantics.column?.field;\n            const rowField = channelSemantics.row?.field;\n            const colCount = colField\n                ? new Set(data.map(r => r[colField])).size : 0;\n\n            if (colCount > 1 && !rowField) {\n                const tighterW = Math.max(\n                    options.minSubplotSize ?? 60,\n                    maxXToKeep * xMinGroupStep,\n                );\n                const totalW = canvasSize.width * maxStretchX - fixW;\n                const totalH = canvasSize.height * maxStretchY - fixH;\n                const revisedMaxCols = Math.max(1, Math.floor(\n                    totalW / (tighterW + gap),\n                ));\n                const revisedMaxRows = Math.max(1, Math.floor(\n                    totalH / ((options.minSubplotSize ?? 60) + gap),\n                ));\n                const maxTotal = revisedMaxCols * revisedMaxRows;\n                const effectiveCount = Math.min(colCount, maxTotal);\n                const visRows = Math.ceil(effectiveCount / revisedMaxCols);\n                const visCols = Math.ceil(effectiveCount / visRows);\n\n                facetGrid.columns = visCols;\n                facetGrid.rows = visRows;\n                facetGrid.maxColumnValues = maxTotal;\n            }\n        }\n    }\n\n    // maxColumnValues already carries the correct semantics for both\n    // column+row (per-dimension cap) and column-only wrapping (total\n    // panel count = grid cols × grid rows).  No multiplication needed.\n    const maxValues: Record<string, number> = {\n        x: maxXToKeep,\n        y: maxYToKeep,\n        column: facetGrid?.maxColumnValues ?? Infinity,\n        row: facetGrid?.maxRowValues ?? Infinity,\n        color: maxColorVal,\n    };\n\n    return { maxValues, facetGrid };\n}\n\n// ---------------------------------------------------------------------------\n// Public: computeFacetGrid\n// ---------------------------------------------------------------------------\n\n/**\n * Decide the facet grid layout (including column-only wrapping).\n *\n * This runs BEFORE filterOverflow and computeLayout.  It:\n *   1. Counts unique column/row values from data.\n *   2. Computes banded-aware minimum subplot dimensions.\n *   3. Computes max columns/rows that fit in the canvas budget.\n *   4. For column-only: wraps into a 2D grid (total panels = cols × rows).\n *   5. For column+row: caps each dimension independently.\n *\n * Returns `undefined` when there are no facet channels.\n *\n * @param channelSemantics  Phase 0 output\n * @param declaration       Template layout declaration\n * @param data              Data rows (pre-overflow — possibly after temporal conversion)\n * @param canvasSize        Target canvas dimensions\n * @param options           Assembly options\n */\nexport function computeFacetGrid(\n    channelSemantics: Record<string, ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    data: any[],\n    canvasSize: { width: number; height: number },\n    options: AssembleOptions,\n): import('./types').FacetGridResult | undefined {\n    const { x: msX, y: msY } = resolveStretchCaps(options);\n    const fixW = options.facetFixedPadding?.width ?? 0;\n    const fixH = options.facetFixedPadding?.height ?? 0;\n    const gap = options.facetGap ?? 0;\n    const minStep = options.minStep ?? 6;\n    const stepPadding = options.stepPadding ?? 0.1;\n    const baseMinSubplot = options.minSubplotSize ?? 60;\n\n    const isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n\n    // --- Compute min subplot size per axis ---\n    //\n    // Continuous:  baseMinSubplot (e.g. 60px).\n    //\n    // Discrete (not grouped):\n    //   min(minStep × valueCount, maxDim)\n    //\n    // Discrete (grouped):\n    //   perCategoryStep = max(minStep × groupCount, minGroupStep)\n    //   min(perCategoryStep × valueCount, maxDim)\n    //\n    //   where minGroupStep accounts for the inter-group gap:\n    //     the gap = stepPadding × step, which must be ≥ MIN_GROUP_GAP_PX.\n    //\n    // Always capped at maxDim (full stretched canvas minus fixed overhead)\n    // to guarantee at least 1 facet column/row.\n\n    const maxW = canvasSize.width * msX - fixW;\n    const maxH = canvasSize.height * msY - fixH;\n    const MIN_GROUP_GAP_PX = 3;\n\n    // Grouping detection\n    const groupField = channelSemantics.group?.field;\n    let groupCount = 0;\n    let groupAxis: 'x' | 'y' | undefined;\n    if (groupField) {\n        groupCount = new Set(data.map((r: any) => r[groupField])).size;\n        const xType = declaration.resolvedTypes?.x ?? channelSemantics.x?.type;\n        const yType = declaration.resolvedTypes?.y ?? channelSemantics.y?.type;\n        if (isDiscreteType(xType)) groupAxis = 'x';\n        else if (isDiscreteType(yType)) groupAxis = 'y';\n    }\n\n    let minSubplotWidth = baseMinSubplot;\n    let minSubplotHeight = baseMinSubplot;\n\n    // Log-scale axes need more space for minor grid lines to be legible.\n    const LOG_PX_PER_DECADE_FACET = 40;\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field || !cs.scaleType) continue;\n        if (cs.scaleType !== 'log' && cs.scaleType !== 'symlog') continue;\n        const vals = data\n            .map((r: any) => r[cs.field])\n            .filter((v: any) => typeof v === 'number' && v > 0 && isFinite(v));\n        if (vals.length < 2) continue;\n        const decades = Math.log10(Math.max(...vals)) - Math.log10(Math.min(...vals));\n        const needed = Math.ceil(Math.max(1, decades)) * LOG_PX_PER_DECADE_FACET;\n        if (axis === 'x') minSubplotWidth = Math.max(minSubplotWidth, needed);\n        else minSubplotHeight = Math.max(minSubplotHeight, needed);\n    }\n\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field) continue;\n\n        const effectiveType = declaration.resolvedTypes?.[axis] ?? cs.type;\n        const isBanded = declaration.axisFlags?.[axis]?.banded === true;\n        if (!isDiscreteType(effectiveType) && !isBanded) continue;\n\n        const valueCount = new Set(data.map((r: any) => r[cs.field])).size;\n        const axisGroupCount = (groupAxis === axis && groupCount > 1) ? groupCount : 1;\n        const maxDim = axis === 'x' ? maxW : maxH;\n\n        let perCategoryStep: number;\n        if (axisGroupCount > 1) {\n            // Grouped: each category needs room for groupCount sub-items\n            // PLUS enough inter-group gap (stepPadding × step ≥ MIN_GROUP_GAP_PX).\n            const minGroupStep = Math.max(\n                Math.ceil(MIN_GROUP_GAP_PX / stepPadding),\n                2 * axisGroupCount,\n            );\n            perCategoryStep = Math.max(minStep * axisGroupCount, minGroupStep);\n        } else {\n            // Ungrouped: one item per category\n            perCategoryStep = minStep;\n        }\n\n        const dataDrivenMin = Math.min(perCategoryStep * valueCount, maxDim);\n        const minDim = Math.max(baseMinSubplot, dataDrivenMin);\n\n        if (axis === 'x') {\n            minSubplotWidth = minDim;\n        } else {\n            minSubplotHeight = minDim;\n        }\n    }\n\n    // --- Continuous axes: AR-based min subplot size ---\n    // When both axes are continuous (non-banded), the expected aspect\n    // ratio tells us which axis needs more room.  The shorter dimension\n    // stays at baseMinSubplot; the longer gets up to ms× (maxStretch)\n    // of the base.  This ensures line charts (landscape AR) get wider\n    // min subplots, so maxFacetColumns is lower → fewer, wider panels.\n    const xIsCont = (() => {\n        const cs = channelSemantics.x;\n        if (!cs?.field) return false;\n        const t = declaration.resolvedTypes?.x ?? cs.type;\n        return !isDiscreteType(t) && !(declaration.axisFlags?.x?.banded === true);\n    })();\n    const yIsCont = (() => {\n        const cs = channelSemantics.y;\n        if (!cs?.field) return false;\n        const t = declaration.resolvedTypes?.y ?? cs.type;\n        return !isDiscreteType(t) && !(declaration.axisFlags?.y?.banded === true);\n    })();\n\n    if (xIsCont && yIsCont) {\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        if (xCS?.field && yCS?.field) {\n            const isTempX = (declaration.resolvedTypes?.x ?? xCS.type) === 'temporal';\n            const isTempY = (declaration.resolvedTypes?.y ?? yCS.type) === 'temporal';\n            const cmcs = options.continuousMarkCrossSection;\n            const isConn = typeof cmcs === 'object' && !!cmcs.seriesCountAxis;\n\n            const xNum: number[] = [];\n            const yNum: number[] = [];\n            const sKeys: string[] = [];\n            const sFields: string[] = [];\n            // Include facet fields in series keys so banking computes\n            // slopes within each panel, not across panel boundaries.\n            const colF = channelSemantics.column?.field;\n            const rowF = channelSemantics.row?.field;\n            if (colF) sFields.push(colF);\n            if (rowF) sFields.push(rowF);\n            const cf = channelSemantics.color?.field;\n            const df = channelSemantics.detail?.field;\n            if (cf) sFields.push(cf);\n            if (df && df !== cf) sFields.push(df);\n\n            for (const row of data) {\n                const xv = row[xCS.field];\n                const yv = row[yCS.field];\n                if (xv == null || yv == null) continue;\n                const xn = isTempX ? +new Date(xv) : +xv;\n                const yn = isTempY ? +new Date(yv) : +yv;\n                if (isNaN(xn) || isNaN(yn)) continue;\n                xNum.push(xn);\n                yNum.push(yn);\n                sKeys.push(sFields.length > 0\n                    ? sFields.map(f => String(row[f] ?? '')).join('\\x00')\n                    : '');\n            }\n\n            if (xNum.length > 1) {\n                const xMin = Math.min(...xNum);\n                const xMax = Math.max(...xNum);\n                const yMin = Math.min(...yNum);\n                const yMax = Math.max(...yNum);\n                const xDom: [number, number] = [xMin, xMax];\n                const yDom: [number, number] = [yMin, yMax];\n                if (xCS.zero?.zero) {\n                    if (xDom[0] > 0) xDom[0] = 0;\n                    if (xDom[1] < 0) xDom[1] = 0;\n                }\n                if (yCS.zero?.zero) {\n                    if (yDom[0] > 0) yDom[0] = 0;\n                    if (yDom[1] < 0) yDom[1] = 0;\n                }\n\n                const ar = computeBankingAR(xNum, yNum, xDom, yDom, sKeys, isConn);\n\n                // Distribute: shorter side = base, longer side = base × min(ar, ms).\n                if (ar >= 1) {\n                    minSubplotWidth = Math.max(minSubplotWidth,\n                        Math.round(baseMinSubplot * Math.min(ar, msX)));\n                    minSubplotHeight = Math.max(minSubplotHeight, baseMinSubplot);\n                } else {\n                    minSubplotWidth = Math.max(minSubplotWidth, baseMinSubplot);\n                    minSubplotHeight = Math.max(minSubplotHeight,\n                        Math.round(baseMinSubplot * Math.min(1 / ar, msY)));\n                }\n            }\n        }\n    }\n\n    // effectiveW = totalBudget - fixedOverhead; each panel costs (subplot + gap).\n    const effectiveW = maxW;\n    const effectiveH = maxH;\n    const maxFacetColumns = Math.max(1, Math.floor(\n        effectiveW / (minSubplotWidth + gap),\n    ));\n    const maxFacetRows = Math.max(1, Math.floor(\n        effectiveH / (minSubplotHeight + gap),\n    ));\n\n    // Identify column/row fields\n    const colField = channelSemantics.column?.field;\n    const rowField = channelSemantics.row?.field;\n    if (!colField && !rowField) return undefined;\n\n    const colCount = colField\n        ? new Set(data.map((r: any) => r[colField])).size : 0;\n    const rowCount = rowField\n        ? new Set(data.map((r: any) => r[rowField])).size : 0;\n\n    if (colCount === 0 && rowCount === 0) return undefined;\n\n    // Explicit user override: force a specific column count for a column-wrapped\n    // facet (the `facetColumns` chart property). Clamped to [1, colCount]; the\n    // remaining panels wrap into as many rows as needed (all kept, canvas grows).\n    const forcedCols = options.facetColumns != null && options.facetColumns >= 1\n        ? Math.min(Math.max(1, Math.floor(options.facetColumns)), Math.max(1, colCount))\n        : undefined;\n\n    if (colCount > 0 && rowCount === 0) {\n        if (forcedCols != null) {\n            const nRows = Math.ceil(colCount / forcedCols);\n            return {\n                columns: forcedCols,\n                rows: nRows,\n                maxColumnValues: forcedCols * nRows,\n                maxRowValues: Math.max(maxFacetRows, nRows),\n            };\n        }\n        // Column-only.  If all panels fit in one row, use a single row.\n        // Otherwise wrap into a balanced grid: pick the number of rows\n        // that makes the grid as square as possible (cols ≈ rows) while\n        // staying within the max budget per dimension.\n        if (colCount <= maxFacetColumns) {\n            return {\n                columns: colCount,\n                rows: 1,\n                maxColumnValues: colCount,\n                maxRowValues: maxFacetRows,\n            };\n        }\n\n        // Need to wrap.  Use maxFacetColumns as the column count\n        // (fill the width), but reduce columns slightly if it would\n        // produce a widow row (a single orphan panel on the last row).\n        let nCols = maxFacetColumns;\n        let nRows = Math.ceil(colCount / nCols);\n\n        // Check for widow: if last row has only 1 panel, try nCols-1\n        // to redistribute more evenly.  Keep reducing while widow\n        // exists and nCols > 2.\n        while (nCols > 2 && (colCount % nCols) === 1) {\n            nCols--;\n            nRows = Math.ceil(colCount / nCols);\n        }\n\n        const visRows = Math.min(nRows, maxFacetRows);\n        const maxTotal = nCols * visRows;\n\n        return {\n            columns: nCols,\n            rows: visRows,\n            maxColumnValues: maxTotal,\n            maxRowValues: maxFacetRows,\n        };\n    }\n\n    // Column+row or row-only: cap each dimension independently.\n    return {\n        columns: Math.max(1, Math.min(colCount, maxFacetColumns)),\n        rows: Math.max(1, Math.min(rowCount, maxFacetRows)),\n        maxColumnValues: maxFacetColumns,\n        maxRowValues: maxFacetRows,\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Public: computeMinSubplotDimensions\n// ---------------------------------------------------------------------------\n\n/**\n * Compute minimum subplot dimensions considering banded and discrete axes.\n *\n * For banded axes (e.g. temporal x on candlestick), each data point needs\n * `minStep` px, so the subplot minimum can be much larger than the generic\n * `minSubplotSize` (60px).  For discrete axes, the count of unique values\n * drives the minimum similarly.\n *\n * This is used by both filterOverflow (pre-layout) and the assemblers\n * (post-layout) to consistently compute facet column/row caps.\n *\n * @param channelSemantics  Phase 0 output (field, type per channel)\n * @param declaration       Template layout declaration (axisFlags, resolvedTypes)\n * @param data              Data rows\n * @param options           Assembly options ({ minStep, minSubplotSize })\n * @returns                 { minSubplotWidth, minSubplotHeight }\n */\nexport function computeMinSubplotDimensions(\n    channelSemantics: Record<string, ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    data: any[],\n    options: { minStep?: number; minSubplotSize?: number },\n): { minSubplotWidth: number; minSubplotHeight: number } {\n    const minStep = options.minStep ?? 6;\n    const minSubplot = options.minSubplotSize ?? 60;\n\n    let minSubplotWidth = minSubplot;\n    let minSubplotHeight = minSubplot;\n\n    // Log-scale axes need more space so minor grid lines stay legible.\n    const LOG_PX_PER_DECADE_MIN = 40;\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field || !cs.scaleType) continue;\n        if (cs.scaleType !== 'log' && cs.scaleType !== 'symlog') continue;\n        const vals = data\n            .map((r: any) => r[cs.field])\n            .filter((v: any) => typeof v === 'number' && v > 0 && isFinite(v));\n        if (vals.length < 2) continue;\n        const decades = Math.log10(Math.max(...vals)) - Math.log10(Math.min(...vals));\n        const needed = Math.ceil(Math.max(1, decades)) * LOG_PX_PER_DECADE_MIN;\n        if (axis === 'x') minSubplotWidth = Math.max(minSubplotWidth, needed);\n        else minSubplotHeight = Math.max(minSubplotHeight, needed);\n    }\n\n    const isDiscreteType = (t: string | undefined) =>\n        t === 'nominal' || t === 'ordinal';\n\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field) continue;\n\n        const effectiveType = declaration.resolvedTypes?.[axis] ?? cs.type;\n        const isBanded = declaration.axisFlags?.[axis]?.banded === true;\n        const isDiscrete = isDiscreteType(effectiveType);\n\n        let itemCount = 0;\n        if (isBanded || isDiscrete) {\n            itemCount = new Set(data.map((r: any) => r[cs.field])).size;\n        }\n\n        if (itemCount > 0) {\n            const minDim = Math.max(minSubplot, itemCount * minStep);\n            if (axis === 'x') {\n                minSubplotWidth = Math.max(minSubplotWidth, minDim);\n            } else {\n                minSubplotHeight = Math.max(minSubplotHeight, minDim);\n            }\n        }\n    }\n\n    return { minSubplotWidth, minSubplotHeight };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Static Series Normalization\n *\n * Detects array-valued encodings (static series) in the input spec,\n * validates them, and folds (unpivots) the data into long form so\n * the rest of the pipeline can process it as a standard single-field\n * encoding with a color discriminator.\n *\n * This runs BEFORE Phase 0 (resolveChannelSemantics).\n */\n\nimport type { ChartEncoding, EncodingValue, RawEncodingValue, StaticSeriesMetadata } from './types';\nimport type { SemanticAnnotation } from './field-semantics';\nimport { getVisCategory, inferVisCategory } from './semantic-types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Synthetic column names injected by the fold transform */\nexport const STATIC_SERIES_KEY_COLUMN = '__flint_series_key';\nexport const STATIC_SERIES_VALUE_COLUMN = '__flint_series_value';\n\n/** Channels that may accept array-valued (multi-field) encodings */\nconst MEASURE_CHANNELS = new Set(['x', 'y']);\n\n// ---------------------------------------------------------------------------\n// Shorthand normalization\n// ---------------------------------------------------------------------------\n\n/**\n * Expand the bare-string channel shorthand into a full encoding object.\n *\n * `\"weight\"` → `{ field: \"weight\" }`. Array entries (static series) are\n * expanded element-by-element, so `[\"a\", \"b\"]` → `[{ field: \"a\" }, { field: \"b\" }]`.\n * Non-string values pass through unchanged.\n */\nexport function coerceEncodingValue(value: RawEncodingValue): EncodingValue {\n    if (typeof value === 'string') {\n        return { field: value };\n    }\n    if (Array.isArray(value)) {\n        return value.map((entry) => (typeof entry === 'string' ? { field: entry } : entry));\n    }\n    return value;\n}\n\n/** Normalize a raw channel→value map, expanding any bare-string shorthands. */\nexport function normalizeEncodingShorthand(\n    encodings: Record<string, RawEncodingValue>,\n): Record<string, EncodingValue> {\n    const out: Record<string, EncodingValue> = {};\n    for (const [channel, value] of Object.entries(encodings)) {\n        out[channel] = coerceEncodingValue(value);\n    }\n    return out;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Result of normalizing static series from the input spec.\n */\nexport interface NormalizeStaticSeriesResult {\n    /** Normalized encodings (all single-valued) */\n    encodings: Record<string, ChartEncoding>;\n    /** Folded data (or original if no static series detected) */\n    data: any[];\n    /** Static series metadata (present only when fold was applied) */\n    staticSeries?: StaticSeriesMetadata;\n}\n\n/**\n * Detect, validate, and normalize static series (array-valued encodings).\n *\n * If no array-valued encodings are present, returns the input unchanged.\n * If one is found, validates constraints and returns folded data +\n * rewritten encodings.\n *\n * @throws Error if validation fails (non-quantitative field, conflicting\n *         color binding, multiple array channels, etc.)\n */\nexport function normalizeStaticSeries(\n    rawEncodings: Record<string, RawEncodingValue>,\n    data: any[],\n    semanticTypes: Record<string, string | SemanticAnnotation>,\n): NormalizeStaticSeriesResult {\n    // Expand bare-string channel shorthands (e.g. `{ x: \"weight\" }`) first so\n    // the rest of the pipeline only ever sees full encoding objects.\n    const encodings = normalizeEncodingShorthand(rawEncodings);\n\n    // Find array-valued channels\n    const arrayChannels: { channel: string; entries: ChartEncoding[] }[] = [];\n    for (const [channel, enc] of Object.entries(encodings)) {\n        if (Array.isArray(enc)) {\n            arrayChannels.push({ channel, entries: enc });\n        }\n    }\n\n    // No static series — pass through unchanged\n    if (arrayChannels.length === 0) {\n        return {\n            encodings: encodings as Record<string, ChartEncoding>,\n            data,\n        };\n    }\n\n    // --- Validation ---\n\n    // Only one channel may have an array encoding\n    if (arrayChannels.length > 1) {\n        const channelNames = arrayChannels.map(c => c.channel).join(', ');\n        throw new Error(\n            `Static series (array encoding) found on multiple channels: ${channelNames}. ` +\n            `Only one channel may use array encoding at a time.`\n        );\n    }\n\n    const { channel, entries } = arrayChannels[0];\n\n    // Must be a measure channel\n    if (!MEASURE_CHANNELS.has(channel)) {\n        throw new Error(\n            `Static series (array encoding) is only allowed on measure channels (${[...MEASURE_CHANNELS].join(', ')}), ` +\n            `not \"${channel}\".`\n        );\n    }\n\n    // Must have at least 2 entries\n    if (entries.length < 2) {\n        throw new Error(\n            `Static series requires at least 2 fields, got ${entries.length} on channel \"${channel}\".`\n        );\n    }\n\n    // Each entry must specify a field\n    const fields: string[] = [];\n    for (const entry of entries) {\n        if (!entry.field) {\n            throw new Error(\n                `Each static series entry must have a \"field\" property.`\n            );\n        }\n        fields.push(entry.field);\n    }\n\n    // Duplicate field check\n    const fieldSet = new Set(fields);\n    if (fieldSet.size !== fields.length) {\n        throw new Error(\n            `Static series contains duplicate fields. Each field must be unique.`\n        );\n    }\n\n    // Fields must exist in data columns (if data is available)\n    if (data.length > 0) {\n        const dataColumns = new Set(Object.keys(data[0]));\n        for (const field of fields) {\n            if (!dataColumns.has(field)) {\n                throw new Error(\n                    `Static series field \"${field}\" not found in data columns. ` +\n                    `Available columns: ${[...dataColumns].join(', ')}`\n                );\n            }\n        }\n    }\n\n    // Fields must resolve to quantitative (not nominal/ordinal)\n    for (const entry of entries) {\n        const field = entry.field!;\n        const explicitType = entry.type;\n        if (explicitType === 'nominal' || explicitType === 'ordinal') {\n            throw new Error(\n                `Static series field \"${field}\" has type \"${explicitType}\" — ` +\n                `only quantitative or temporal fields are allowed in static series.`\n            );\n        }\n        // Infer if no explicit type\n        if (!explicitType && data.length > 0) {\n            const semType = semanticTypes[field];\n            const semTypeStr = typeof semType === 'string' ? semType : semType?.semanticType || '';\n            // Try semantic type registry first, then infer from data values\n            const fromRegistry = semTypeStr ? getVisCategory(semTypeStr) : null;\n            const inferred = fromRegistry ?? inferVisCategory(data.map(r => r[field]));\n            if (inferred === 'nominal' || inferred === 'ordinal') {\n                throw new Error(\n                    `Static series field \"${field}\" infers as \"${inferred}\" from data — ` +\n                    `only quantitative or temporal fields are allowed in static series.`\n                );\n            }\n        }\n    }\n\n    // Cannot combine with explicit color field binding\n    const colorEnc = encodings.color;\n    if (colorEnc && !Array.isArray(colorEnc) && colorEnc.field) {\n        throw new Error(\n            `Cannot use static series on \"${channel}\" when the color channel is already bound to ` +\n            `field \"${colorEnc.field}\". Static series implicitly uses the color channel for ` +\n            `series discrimination.`\n        );\n    }\n\n    // --- Fold (unpivot) the data ---\n    const foldedData = foldData(data, fields);\n\n    // --- Rewrite encodings ---\n    const normalizedEncodings: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(encodings)) {\n        if (ch === channel) {\n            // Replace array with single encoding on the synthetic value column\n            normalizedEncodings[ch] = { field: STATIC_SERIES_VALUE_COLUMN, type: 'quantitative' };\n        } else if (Array.isArray(enc)) {\n            // Shouldn't reach here (validated above), but handle gracefully\n            normalizedEncodings[ch] = enc[0];\n        } else {\n            normalizedEncodings[ch] = enc;\n        }\n    }\n\n    // Add color encoding for the synthetic key column (preserving any user-specified scheme)\n    const colorScheme = (!Array.isArray(colorEnc) && colorEnc?.scheme) ? colorEnc.scheme : undefined;\n    normalizedEncodings.color = {\n        field: STATIC_SERIES_KEY_COLUMN,\n        type: 'nominal',\n        ...(colorScheme ? { scheme: colorScheme } : {}),\n    };\n\n    const metadata: StaticSeriesMetadata = {\n        channel,\n        fields,\n        keyColumn: STATIC_SERIES_KEY_COLUMN,\n        valueColumn: STATIC_SERIES_VALUE_COLUMN,\n    };\n\n    return {\n        encodings: normalizedEncodings,\n        data: foldedData,\n        staticSeries: metadata,\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: fold/unpivot\n// ---------------------------------------------------------------------------\n\n/**\n * Unpivot (fold) wide-format data into long form.\n *\n * Each input row produces N output rows (one per field in `fields`).\n * Non-measure columns are preserved. Two synthetic columns are added:\n * - `__flint_series_key`: the field name (series identifier)\n * - `__flint_series_value`: the value from that field\n *\n * Rows where all fold values are null/undefined are skipped.\n */\nfunction foldData(data: any[], fields: string[]): any[] {\n    const fieldSet = new Set(fields);\n    const result: any[] = [];\n\n    for (const row of data) {\n        // Collect non-fold columns\n        const baseRow: Record<string, any> = {};\n        for (const [key, value] of Object.entries(row)) {\n            if (!fieldSet.has(key)) {\n                baseRow[key] = value;\n            }\n        }\n\n        // Create one row per fold field\n        for (const field of fields) {\n            const value = row[field];\n            // Skip null/undefined values to avoid phantom data points\n            if (value == null) continue;\n            result.push({\n                ...baseRow,\n                [STATIC_SERIES_KEY_COLUMN]: field,\n                [STATIC_SERIES_VALUE_COLUMN]: value,\n            });\n        }\n    }\n\n    return result;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * CHART RECOMMENDATION & ADAPTATION ENGINE\n * =============================================================================\n *\n * Backend-agnostic logic for two chart operations:\n *\n *   1. **Adaptation** — remapping encoding channels when switching chart types\n *      (e.g. Bar→Pie: x→color, y→size because the semantic roles differ).\n *\n *   2. **Recommendation** — suggesting which data fields best fit each\n *      encoding channel for a given chart type, using semantic types,\n *      cardinality constraints, and data-fitness tests.\n *\n * Both functions operate on plain field names (string→string maps) with no\n * UI-layer dependencies.  Backend-specific wrappers (vegalite/recommendation.ts\n * etc.) filter results to channels that actually exist in that backend's\n * template registry.\n *\n * =============================================================================\n */\n\nimport {\n    inferVisCategory,\n    getVisCategory,\n    isMeasureType,\n    isTimeSeriesType,\n    isCategoricalType,\n    isOrdinalType,\n    isGeoType,\n    isGeoCoordinateType,\n    isNonMeasureNumeric,\n} from './semantic-types';\n\n// ============================================================================\n// 1. Semantic Role System (used by adaptation)\n// ============================================================================\n\n/**\n * Semantic role of a channel within a specific chart type.\n */\nexport type SemanticRole =\n    | 'category'\n    | 'measure'\n    | 'measure2'\n    | 'series'\n    | 'facetCol'\n    | 'facetRow'\n    | 'auxiliary'\n    | 'geo'\n    | 'price';\n\ntype ChannelRoleMap = Partial<Record<string, SemanticRole>>;\n\n// ── Chart Families ──────────────────────────────────────────────────────\n\n/** Standard x/y charts: x=category, y=measure, color=series */\nconst FAMILY_XY_STANDARD: ChannelRoleMap = {\n    x: 'category', y: 'measure', color: 'series',\n    opacity: 'auxiliary', size: 'auxiliary', shape: 'auxiliary',\n    detail: 'auxiliary', group: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Horizontal x/y charts (Bar Table, etc.): y=category, x=measure. Same channel\n *  names as standard x/y, but axes are swapped — keeping them as x/y means we\n *  inherit shelf/color/facet plumbing for free, while adaptation knows the\n *  category lives on `y` so switching to/from a vertical bar chart auto-swaps. */\nconst FAMILY_XY_HORIZONTAL: ChannelRoleMap = {\n    y: 'category', x: 'measure', color: 'series',\n    opacity: 'auxiliary', size: 'auxiliary', shape: 'auxiliary',\n    detail: 'auxiliary', group: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Pie-like charts: color=category, size=measure */\nconst FAMILY_PIE: ChannelRoleMap = {\n    color: 'category', size: 'measure',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Rose chart: polar radial bar — x=category, y=measure, color=series */\nconst FAMILY_ROSE: ChannelRoleMap = {\n    x: 'category', y: 'measure', color: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Radar chart */\nconst FAMILY_RADAR: ChannelRoleMap = {\n    x: 'category', y: 'measure', color: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Map charts: latitude/longitude = geo */\nconst FAMILY_MAP: ChannelRoleMap = {\n    latitude: 'geo', longitude: 'geo',\n    color: 'series', size: 'auxiliary', opacity: 'auxiliary',\n};\n\n/** Choropleth: id=region (geo), color=measure */\nconst FAMILY_CHOROPLETH: ChannelRoleMap = {\n    id: 'geo', color: 'measure', detail: 'auxiliary',\n};\n\n/** Candlestick: x=category, open/high/low/close=price */\nconst FAMILY_CANDLESTICK: ChannelRoleMap = {\n    x: 'category',\n    open: 'price', high: 'price', low: 'price', close: 'price',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Histogram: x=measure (binned) */\nconst FAMILY_HISTOGRAM: ChannelRoleMap = {\n    x: 'measure', color: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Density */\nconst FAMILY_DENSITY: ChannelRoleMap = {\n    x: 'measure', color: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** 2-D density (Density Contour): both axes are measures, binned into a joint\n *  distribution — no series channel (colour encodes count). */\nconst FAMILY_DENSITY_2D: ChannelRoleMap = {\n    x: 'measure', y: 'measure2',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Heatmap: x=category, y=category, color=measure */\nconst FAMILY_HEATMAP: ChannelRoleMap = {\n    x: 'category', y: 'category', color: 'measure',\n    column: 'facetCol', row: 'facetRow',\n};\n\n/** Gauge: size=measure */\nconst FAMILY_GAUGE: ChannelRoleMap = {\n    size: 'measure', column: 'facetCol',\n};\n\n/** Funnel: y=category, size=measure */\nconst FAMILY_FUNNEL: ChannelRoleMap = {\n    y: 'category', size: 'measure',\n};\n\n/** Treemap / Sunburst */\nconst FAMILY_TREEMAP: ChannelRoleMap = {\n    color: 'category', size: 'measure', detail: 'auxiliary', group: 'auxiliary',\n};\n\n/** Sankey */\nconst FAMILY_SANKEY: ChannelRoleMap = {\n    x: 'category', y: 'category', size: 'measure',\n};\n\n/** Gantt: horizontal interval bar — y=task, x=start, x2=end, color=series */\nconst FAMILY_GANTT: ChannelRoleMap = {\n    y: 'category', x: 'measure', x2: 'measure2', color: 'series',\n    detail: 'auxiliary', column: 'facetCol', row: 'facetRow',\n};\n\n/** Bullet: y=label, x=value (measure), goal=target (measure2) */\nconst FAMILY_BULLET: ChannelRoleMap = {\n    y: 'category', x: 'measure', goal: 'measure2', color: 'series',\n    column: 'facetCol', row: 'facetRow',\n};\n\n// ── Chart → Family lookup ───────────────────────────────────────────────\n\nconst CHART_ROLE_MAP: Record<string, ChannelRoleMap> = {\n    // Axis-based (x/y standard)\n    'Bar Chart': FAMILY_XY_STANDARD,\n    'Pyramid Chart': FAMILY_XY_HORIZONTAL,\n    'Grouped Bar Chart': FAMILY_XY_STANDARD,\n    'Stacked Bar Chart': FAMILY_XY_STANDARD,\n    'Lollipop Chart': FAMILY_XY_STANDARD,\n    'Waterfall Chart': FAMILY_XY_STANDARD,\n    'Gantt Chart': FAMILY_GANTT,\n    'Bullet Chart': FAMILY_BULLET,\n    'Bar Table': FAMILY_XY_HORIZONTAL,\n    'Line Chart': FAMILY_XY_STANDARD,\n    'Bump Chart': FAMILY_XY_STANDARD,\n    'Area Chart': FAMILY_XY_STANDARD,\n    'Streamgraph': FAMILY_XY_STANDARD,\n    'Scatter Plot': FAMILY_XY_STANDARD,\n    'Connected Scatter Plot': FAMILY_XY_STANDARD,\n    'Regression': FAMILY_XY_STANDARD,\n    'Ranged Dot Plot': FAMILY_XY_STANDARD,\n    'Boxplot': FAMILY_XY_STANDARD,\n    'Strip Plot': FAMILY_XY_STANDARD,\n    // Pie-like\n    'Pie Chart': FAMILY_PIE,\n    // Polar\n    'Rose Chart': FAMILY_ROSE,\n    'Radar Chart': FAMILY_RADAR,\n    // Heatmap\n    'Heatmap': FAMILY_HEATMAP,\n    // Histogram / Density\n    'Histogram': FAMILY_HISTOGRAM,\n    'Density Plot': FAMILY_DENSITY,\n    'Density Contour': FAMILY_DENSITY_2D,\n    // Geographic\n    'Map': FAMILY_MAP,\n    'Choropleth': FAMILY_CHOROPLETH,\n    // Financial\n    'Candlestick Chart': FAMILY_CANDLESTICK,\n    // ECharts-only\n    'Gauge Chart': FAMILY_GAUGE,\n    'Funnel Chart': FAMILY_FUNNEL,\n    'Treemap': FAMILY_TREEMAP,\n    'Sunburst Chart': FAMILY_TREEMAP,\n    'Sankey Diagram': FAMILY_SANKEY,\n};\n\n// ── Role helpers ────────────────────────────────────────────────────────\n\nfunction getChannelRole(chartType: string, channel: string): SemanticRole {\n    const roleMap = CHART_ROLE_MAP[chartType];\n    if (roleMap && channel in roleMap) return roleMap[channel]!;\n    if (channel === 'column') return 'facetCol';\n    if (channel === 'row') return 'facetRow';\n    return 'auxiliary';\n}\n\nfunction findChannelsByRole(chartType: string, templateChannels: string[], role: SemanticRole): string[] {\n    return templateChannels.filter(ch => getChannelRole(chartType, ch) === role);\n}\n\n/** Fallback chain when target has no channel with the exact source role. */\nconst FALLBACK_CHAIN: Partial<Record<SemanticRole, SemanticRole[]>> = {\n    measure2: ['measure', 'auxiliary'],\n    series: ['auxiliary'],\n    category: ['series', 'auxiliary'],\n    measure: ['auxiliary'],\n    geo: ['category'],\n    price: ['measure', 'auxiliary'],\n};\n\nconst ROLE_PRIORITY: Record<SemanticRole, number> = {\n    category: 0, measure: 1, series: 2, facetCol: 3, facetRow: 4,\n    measure2: 5, auxiliary: 6, geo: 7, price: 8,\n};\n\n// ============================================================================\n// 2. Adaptation — adapt channel encodings across chart types\n// ============================================================================\n\n/**\n * Adapt encoding channels from one chart type to another.\n *\n * When `data` is provided, uses **recommendation-based adaptation**: re-runs\n * the recommendation engine with a strong preference for the currently-assigned\n * fields, letting the target chart's field-type preferences take effect\n * (e.g. Line Chart prefers temporal on x).  Remaining empty channels are\n * optionally filled from all available fields.\n *\n * When no data is provided, falls back to **structural role-based** adaptation\n * (pure channel remapping by semantic role).\n *\n * @param sourceType      The current chart type name (e.g. \"Bar Chart\")\n * @param targetType      The target chart type name (e.g. \"Pie Chart\")\n * @param targetChannels  Available channels on the target template\n * @param encodings       Current channel→fieldName map (only filled channels)\n * @param data            (optional) Array of data row objects\n * @param semanticTypes   (optional) Field→semantic-type map\n * @returns               New channel→fieldName map for the target\n */\nexport function adaptChannels(\n    sourceType: string,\n    targetType: string,\n    targetChannels: string[],\n    encodings: Record<string, string>,\n    data?: any[],\n    semanticTypes?: Record<string, string>,\n    recommendFn?: RecommendFn,\n): Record<string, string> {\n    // Recommendation-based adaptation when data is available\n    if (data && data.length > 0) {\n        return adaptViaRecommendation(sourceType, targetType, targetChannels, encodings, data, semanticTypes ?? {}, recommendFn ?? getRecommendation);\n    }\n\n    // Fallback: structural role-based adaptation\n    return adaptViaRoles(sourceType, targetType, targetChannels, encodings);\n}\n\n/**\n * Edit-distance-based adaptation: find the minimum-cost mapping from existing\n * field→channel assignments to target chart channels.\n *\n * Cost model (see `assignCost` below):\n *   0    — same channel name AND same semantic role\n *   0.5  — different channel name, same semantic role\n *   1    — same channel name but different role, OR different name + role\n *   1.5  — field is dropped\n *   ∞    — field type is incompatible with target channel\n *\n * No autofill: the result contains at most as many fields as the source had.\n * Empty target channels are left for the user to fill explicitly.\n */\nfunction adaptViaRecommendation(\n    sourceType: string,\n    targetType: string,\n    targetChannels: string[],\n    encodings: Record<string, string>,\n    data: any[],\n    semanticTypes: Record<string, string>,\n    _recommendFn: RecommendFn,\n): Record<string, string> {\n    // --- Pre-process: handle facet channels and filter data ---\n    const FACET_CHANNELS = ['column', 'row'];\n    let facetedData = data;\n    const prePinned: Record<string, string> = {};\n    const prePinnedFields = new Set<string>();\n\n    for (const ch of FACET_CHANNELS) {\n        const field = encodings[ch];\n        if (field && targetChannels.includes(ch)) {\n            prePinned[ch] = field;\n            prePinnedFields.add(field);\n            if (facetedData.length > 0) {\n                const firstVal = facetedData[0][field];\n                facetedData = facetedData.filter(row => row[field] === firstVal);\n            }\n        }\n    }\n\n    const tv = buildTableView(facetedData, semanticTypes);\n\n    // --- Type compatibility check ---\n    const isFieldCompatibleWithRole = (role: SemanticRole, field: string): boolean => {\n        const ft = tv.fieldType[field] ?? 'nominal';\n        const st = tv.fieldSemanticType[field] ?? '';\n        const card = tv.fieldLevels[field]?.length ?? 0;\n        switch (role) {\n            // 'category' is for true discrete axes (nominal/ordinal/temporal).\n            // Quantitative fields — even low-cardinality ones — must NOT\n            // satisfy this role, otherwise a measure can land on the\n            // category axis (e.g. Bar Table y) and push the real discrete\n            // field onto color.\n            case 'category':  return !isQuantitativeField(ft, st) && isDiscreteLike(ft, st, card);\n            case 'measure':   return isQuantitativeField(ft, st);\n            case 'series':    return isDiscreteLike(ft, st, card);\n            case 'geo':       return isGeoCoordinateType(st) || ft === 'quantitative';\n            case 'facetCol':  case 'facetRow': return isDiscreteLike(ft, st, card);\n            case 'auxiliary':  return true;\n            default:          return true;\n        }\n    };\n\n    // --- Cost function for assigning field (from srcCh) to targetCh ---\n    //\n    // Role match is the dominant signal: a field whose role matches the target\n    // channel's role is preferred over a field that merely happens to share the\n    // same channel name.  This is important when swapping between strict\n    // \"category × quantitative\" chart types (Bar, Pie, Heatmap, …) where the\n    // semantic axis assignment of the target should win over channel-name\n    // preservation from the source.\n    const assignCost = (srcCh: string, field: string, targetCh: string): number => {\n        const targetRole = getChannelRole(targetType, targetCh);\n        if (!isFieldCompatibleWithRole(targetRole, field)) return Infinity;\n\n        const srcRole = getChannelRole(sourceType, srcCh);\n\n        // Same channel AND same role → free preservation (e.g. Bar→Stacked Bar x→x)\n        if (srcCh === targetCh && srcRole === targetRole) return 0;\n\n        // Same semantic role, different channel name → small cost\n        //   (e.g. Heatmap.color (measure) → Bar.y (measure))\n        if (srcRole === targetRole) return 0.5;\n\n        // Same channel name but different role → role mismatch is more costly\n        //   than a role-match move; prevents e.g. src.color (series) clobbering\n        //   tgt.color (category) in Pie.\n        if (srcCh === targetCh) return 1;\n\n        // Different role and different name, type-compatible → highest move cost\n        return 1;\n    };\n\n    const COST_DROP = 1.5;  // slightly above move cost to prefer keeping fields\n\n    // --- Collect source entries (excluding pre-pinned facets) ---\n    const entries = Object.entries(encodings)\n        .filter(([ch, f]) => f && !FACET_CHANNELS.includes(ch) && !prePinnedFields.has(f));\n\n    // Available target channels (exclude pre-pinned ones)\n    const availableTargets = targetChannels.filter(ch => !(ch in prePinned));\n\n    // --- Solve minimum-cost assignment via branch-and-bound ---\n    // With typically ≤5 fields and ≤8 channels, this is instant.\n    let bestCost = Infinity;\n    let bestAssignment: Record<string, string> = {};\n\n    const usedTargets = new Set<string>();\n\n    function solve(\n        idx: number,\n        currentCost: number,\n        assignment: Record<string, string>,\n    ): void {\n        if (currentCost >= bestCost) return;  // prune\n\n        if (idx === entries.length) {\n            bestCost = currentCost;\n            bestAssignment = { ...assignment };\n            return;\n        }\n\n        const [srcCh, field] = entries[idx];\n\n        // Option A: assign to each available target channel\n        for (const tch of availableTargets) {\n            if (usedTargets.has(tch)) continue;\n            const cost = assignCost(srcCh, field, tch);\n            if (cost === Infinity) continue;\n\n            usedTargets.add(tch);\n            assignment[tch] = field;\n            solve(idx + 1, currentCost + cost, assignment);\n            delete assignment[tch];\n            usedTargets.delete(tch);\n        }\n\n        // Option B: drop the field\n        solve(idx + 1, currentCost + COST_DROP, assignment);\n    }\n\n    solve(0, 0, {});\n\n    // --- Merge pre-pinned facets + solver result ---\n    //\n    // Intentionally do NOT auto-fill remaining empty target channels via the\n    // recommendation engine: when the user already configured a chart with N\n    // fields and switches type, the adapted chart should also have at most N\n    // fields.  Adding extra fields the user never picked is surprising (e.g.\n    // a 2-encoding Bar Chart turning into a 5-encoding Scatter Plot on type\n    // switch).  Empty channels are left for the user to fill explicitly.\n    const result: Record<string, string> = { ...prePinned, ...bestAssignment };\n\n    return result;\n}\n\n/**\n * Structural role-based adaptation: remap channels by semantic role when no\n * data is available.  Each field keeps its role (category, measure, series…)\n * and is placed into the target channel that has the same role.\n */\nfunction adaptViaRoles(\n    sourceType: string,\n    targetType: string,\n    targetChannels: string[],\n    encodings: Record<string, string>,\n): Record<string, string> {\n    const result: Record<string, string> = {};\n\n    // Collect filled encodings with their semantic roles\n    const filledEncodings: { channel: string; role: SemanticRole; field: string }[] = [];\n    for (const [ch, field] of Object.entries(encodings)) {\n        if (field) {\n            filledEncodings.push({ channel: ch, role: getChannelRole(sourceType, ch), field });\n        }\n    }\n\n    // Sort by priority: category > measure > series > …\n    filledEncodings.sort((a, b) => ROLE_PRIORITY[a.role] - ROLE_PRIORITY[b.role]);\n\n    const assigned = new Set<string>();\n\n    for (const { channel: srcCh, role: srcRole, field } of filledEncodings) {\n        let placed = false;\n\n        // (a) Direct match: same channel name with same role\n        if (targetChannels.includes(srcCh) && !assigned.has(srcCh)) {\n            if (getChannelRole(targetType, srcCh) === srcRole) {\n                result[srcCh] = field;\n                assigned.add(srcCh);\n                placed = true;\n            }\n        }\n\n        if (!placed) {\n            // (b) Role match: find empty target channel with same role\n            placed = tryAssign(srcRole, field, targetType, targetChannels, result, assigned, srcCh);\n        }\n\n        if (!placed) {\n            // (c) Fallback chain\n            const chain = FALLBACK_CHAIN[srcRole];\n            if (chain) {\n                for (const fallbackRole of chain) {\n                    placed = tryAssign(fallbackRole, field, targetType, targetChannels, result, assigned, srcCh);\n                    if (placed) break;\n                }\n            }\n        }\n        // (d) If not placed, encoding is dropped\n    }\n\n    return result;\n}\n\nfunction tryAssign(\n    role: SemanticRole,\n    field: string,\n    targetType: string,\n    targetChannels: string[],\n    result: Record<string, string>,\n    assigned: Set<string>,\n    preferredName?: string,\n): boolean {\n    const candidates = findChannelsByRole(targetType, targetChannels, role)\n        .filter(ch => !assigned.has(ch));\n    if (candidates.length === 0) return false;\n    const best = preferredName && candidates.includes(preferredName)\n        ? preferredName : candidates[0];\n    result[best] = field;\n    assigned.add(best);\n    return true;\n}\n\n// ============================================================================\n// 3. Internal Table View — field classification from data + semantic types\n// ============================================================================\n\nexport interface InternalTableView {\n    names: string[];\n    fieldType: Record<string, string>;\n    fieldSemanticType: Record<string, string>;\n    fieldLevels: Record<string, any[]>;\n    rows: any[];\n    /** Fields the user has already assigned — preferred during pick(). */\n    preferredFields?: Set<string>;\n}\n\n/**\n * Recommendation function signature — used to inject backend-specific\n * chart type handlers into adaptViaRecommendation.\n */\nexport type RecommendFn = (chartType: string, tv: InternalTableView) => Record<string, string>;\n\nexport function buildTableView(data: any[], semanticTypes: Record<string, string>): InternalTableView {\n    const names = data.length > 0 ? Object.keys(data[0]) : [];\n    const fieldType: Record<string, string> = {};\n    const fieldSemanticType: Record<string, string> = {};\n    const fieldLevels: Record<string, any[]> = {};\n\n    for (const name of names) {\n        const values = data.map(r => r[name]);\n        const semanticType = semanticTypes[name] || '';\n        fieldType[name] = (semanticType && getVisCategory(semanticType)) || inferVisCategory(values);\n        fieldSemanticType[name] = semanticType;\n        fieldLevels[name] = [...new Set(data.map(r => r[name]).filter(v => v != null))];\n    }\n\n    return { names, fieldType, fieldSemanticType, fieldLevels, rows: data };\n}\n\n// ============================================================================\n// 4. Preference-Based Assignment Solver\n// ============================================================================\n\n/** Preference tiers for a (channel, field) pair. */\nexport const Pref = { STRONG: 3, OK: 2, WEAK: 1, EXCLUDE: -Infinity } as const;\nexport type PrefScore = number;\n\n/**\n * A scoring function that returns a preference score for a field being\n * assigned to a particular channel.  Return Pref.EXCLUDE to forbid the\n * assignment.\n */\nexport type ChannelPrefFn = (\n    name: string, type: string, semanticType: string,\n    cardinality: number, hasLevels: boolean,\n) => PrefScore;\n\n/**\n * Solve the assignment problem: given N channels each with a preference\n * scoring function, and a set of candidate fields, find the assignment of\n * distinct fields to channels that maximises total score.\n *\n * Returns the best assignment as a Record<channel, fieldName>, or {} if\n * no valid (all-channels-filled) assignment exists.\n *\n * Complexity: O(C! · F^C) where C = number of channels, F = number of\n * fields.  Fine for C ≤ 5 and typical field counts.\n */\nexport function resolveAssignment(\n    tv: InternalTableView,\n    used: Set<string>,\n    channelPrefs: { channel: string; pref: ChannelPrefFn }[],\n): Record<string, string> {\n    // Build the score matrix: scores[channelIdx][fieldIdx]\n    const candidates: string[] = tv.names.filter(n => !used.has(n) && (!isLikelyIdentifierOrRank(n) || tv.preferredFields?.has(n)));\n    const C = channelPrefs.length;\n    const F = candidates.length;\n    if (F < C) return {};\n\n    // Pre-compute all scores\n    const scores: number[][] = [];\n    for (let ci = 0; ci < C; ci++) {\n        scores[ci] = [];\n        for (let fi = 0; fi < F; fi++) {\n            const name = candidates[fi];\n            const type = tv.fieldType[name] ?? 'nominal';\n            const st = tv.fieldSemanticType[name] ?? '';\n            const card = tv.fieldLevels[name]?.length ?? 0;\n            scores[ci][fi] = channelPrefs[ci].pref(name, type, st, card, card > 0);\n        }\n    }\n\n    // Brute-force search over all C-permutations of F fields\n    let bestScore = -Infinity;\n    let bestAssign: number[] | undefined;\n\n    const perm = new Array<number>(C);\n    const usedF = new Uint8Array(F);\n\n    function search(depth: number, totalScore: number) {\n        if (depth === C) {\n            if (totalScore > bestScore) {\n                bestScore = totalScore;\n                bestAssign = [...perm];\n            }\n            return;\n        }\n        for (let fi = 0; fi < F; fi++) {\n            if (usedF[fi]) continue;\n            const s = scores[depth][fi];\n            if (s === -Infinity) continue;            // excluded\n            if (totalScore + s <= bestScore - (C - depth - 1) * Pref.STRONG) continue; // prune\n            perm[depth] = fi;\n            usedF[fi] = 1;\n            search(depth + 1, totalScore + s);\n            usedF[fi] = 0;\n        }\n    }\n\n    search(0, 0);\n\n    if (!bestAssign) return {};\n\n    const result: Record<string, string> = {};\n    for (let ci = 0; ci < C; ci++) {\n        const fieldName = candidates[bestAssign[ci]];\n        result[channelPrefs[ci].channel] = fieldName;\n        used.add(fieldName);\n    }\n    return result;\n}\n\n// ============================================================================\n// 5. Field Classification Utilities (renumbered)\n// ============================================================================\n\nfunction isTemporalField(type: string, semanticType: string): boolean {\n    return type === 'temporal' || isTimeSeriesType(semanticType);\n}\n\nfunction isQuantitativeField(type: string, semanticType: string): boolean {\n    if (isTemporalField(type, semanticType)) return false;\n    if (type !== 'quantitative') return false;\n    if (isNonMeasureNumeric(semanticType)) return false;\n    return isMeasureType(semanticType) || semanticType === '';\n}\n\nfunction isOrdinalField(type: string, semanticType: string, hasLevels: boolean): boolean {\n    if (hasLevels) return true;\n    return isOrdinalType(semanticType);\n}\n\nfunction isCategoricalFieldCheck(type: string, semanticType: string): boolean {\n    if (isTemporalField(type, semanticType)) return false;\n    if (isQuantitativeField(type, semanticType)) return false;\n    return type === 'nominal' || isCategoricalType(semanticType);\n}\n\nfunction isDiscreteLike(type: string, semanticType: string, cardinality: number, maxCard = 50): boolean {\n    if (isCategoricalFieldCheck(type, semanticType)) return true;\n    if (isTemporalField(type, semanticType)) return true;\n    if (isOrdinalType(semanticType)) return true;\n    if (type === 'quantitative' && cardinality > 0 && cardinality <= maxCard) return true;\n    return false;\n}\n\nexport function nameMatches(name: string, patterns: string[]): boolean {\n    const lower = name.toLowerCase();\n    return patterns.some(p => lower === p) || patterns.some(p => lower.includes(p));\n}\n\nfunction isLikelyIdentifierOrRank(name: string): boolean {\n    const lower = name.toLowerCase();\n    const idPatterns = ['rank', 'id', 'index', 'idx', 'row', 'order', 'position', 'pos'];\n    return idPatterns.some(p => lower === p || lower.endsWith('_' + p) || lower.endsWith(p));\n}\n\n// ============================================================================\n// 6. Field Picker Utilities\n// ============================================================================\n\nexport function pick(\n    tv: InternalTableView,\n    used: Set<string>,\n    predicate: (name: string, type: string, semanticType: string, cardinality: number, hasLevels: boolean) => boolean,\n): string | undefined {\n    const candidates: string[] = [];\n    for (const name of tv.names) {\n        if (used.has(name)) continue;\n        const type = tv.fieldType[name] ?? 'nominal';\n        const semanticType = tv.fieldSemanticType[name] ?? '';\n        const cardinality = tv.fieldLevels[name]?.length ?? 0;\n        const hasLevels = cardinality > 0;\n        if (predicate(name, type, semanticType, cardinality, hasLevels)) {\n            candidates.push(name);\n        }\n    }\n    if (candidates.length === 0) return undefined;\n    // Deterministic selection: prefer a field the user already uses, otherwise\n    // the first candidate in table order. Stable, so a given dataset always\n    // yields the same suggestion (no random tie-break).\n    if (tv.preferredFields) {\n        const preferred = candidates.filter(n => tv.preferredFields!.has(n));\n        if (preferred.length > 0) {\n            const chosen = preferred[0];\n            used.add(chosen);\n            return chosen;\n        }\n    }\n    const chosen = candidates[0];\n    used.add(chosen);\n    return chosen;\n}\n\nexport const pickQuantitative = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (name, ty, st) => isQuantitativeField(ty, st) && (!isLikelyIdentifierOrRank(name) || !!tv.preferredFields?.has(name)));\n\nexport const pickTemporal = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (_n, ty, st) => isTemporalField(ty, st));\n\nexport const pickNominal = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (_n, ty, st) => isCategoricalFieldCheck(ty, st));\n\nexport const pickLowCardNominal = (tv: InternalTableView, u: Set<string>, maxCard = 30) =>\n    pick(tv, u, (_n, ty, st, card) => isCategoricalFieldCheck(ty, st) && card > 0 && card <= maxCard);\n\nexport const pickOrdinal = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (_n, ty, st, _card, hasLevels) => isOrdinalField(ty, st, hasLevels));\n\nexport const pickGeo = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (_n, _ty, st) => isGeoType(st));\n\nexport const pickDiscrete = (tv: InternalTableView, u: Set<string>) =>\n    pick(tv, u, (name, ty, st, card) => isDiscreteLike(ty, st, card) && (!isLikelyIdentifierOrRank(name) || !!tv.preferredFields?.has(name)));\n\nexport const pickLowCardDiscrete = (tv: InternalTableView, u: Set<string>, maxCard = 30) =>\n    pick(tv, u, (name, ty, st, card) =>\n        isDiscreteLike(ty, st, card, maxCard) && card > 0 && card <= maxCard\n        && (!isLikelyIdentifierOrRank(name) || !!tv.preferredFields?.has(name))\n    );\n\nexport const pickSeriesAxis = (tv: InternalTableView, u: Set<string>) =>\n    pickTemporal(tv, u) ?? pickOrdinal(tv, u) ?? pickNominal(tv, u);\n\nexport const pickQuantitativeByName = (tv: InternalTableView, u: Set<string>, patterns: string[]) =>\n    pick(tv, u, (name, ty, st) => isQuantitativeField(ty, st) && nameMatches(name, patterns));\n\nexport function pickAllQuantitative(tv: InternalTableView, used: Set<string>): string[] {\n    const result: string[] = [];\n    for (const name of tv.names) {\n        if (used.has(name)) continue;\n        const type = tv.fieldType[name] ?? 'nominal';\n        const semanticType = tv.fieldSemanticType[name] ?? '';\n        if (isQuantitativeField(type, semanticType) && (!isLikelyIdentifierOrRank(name) || tv.preferredFields?.has(name))) {\n            result.push(name);\n        }\n    }\n    for (const name of result) used.add(name);\n    return result;\n}\n\n// ============================================================================\n// 7. Data Fitness Tests\n// ============================================================================\n\nexport function hasMultipleValuesPerField(tv: InternalTableView, fieldName: string): boolean {\n    if (!fieldName || !tv.rows || tv.rows.length === 0) return false;\n    const seen = new Set<any>();\n    for (const row of tv.rows) {\n        const val = row[fieldName];\n        if (seen.has(val)) return true;\n        seen.add(val);\n    }\n    return false;\n}\n\nfunction isValidGroupingField(tv: InternalTableView, xField: string, colorField: string): boolean {\n    if (!xField || !colorField || !tv.rows || tv.rows.length === 0) return false;\n    const seen = new Set<string>();\n    for (const row of tv.rows) {\n        const key = `${row[xField]}|||${row[colorField]}`;\n        if (seen.has(key)) return false;\n        seen.add(key);\n    }\n    return true;\n}\n\n/**\n * Deterministic grouping/series selection: choose the lowest-cardinality\n * candidate (fewest distinct values → the most readable legend), breaking ties\n * by table order. Replaces an earlier random tie-break so recommendations are\n * stable and prefer compact color/series encodings.\n */\nfunction lowestCardinality(tv: InternalTableView, candidates: string[]): string {\n    let best = candidates[0];\n    let bestCard = tv.fieldLevels[best]?.length ?? Infinity;\n    for (let i = 1; i < candidates.length; i++) {\n        const card = tv.fieldLevels[candidates[i]]?.length ?? Infinity;\n        if (card < bestCard) { best = candidates[i]; bestCard = card; }\n    }\n    return best;\n}\n\nexport function pickValidGroupingField(\n    tv: InternalTableView, used: Set<string>, xField: string, maxCard = 20,\n): string | undefined {\n    const candidates: string[] = [];\n    for (const name of tv.names) {\n        if (used.has(name)) continue;\n        const type = tv.fieldType[name] ?? 'nominal';\n        const semanticType = tv.fieldSemanticType[name] ?? '';\n        const cardinality = tv.fieldLevels[name]?.length ?? 0;\n        if (!isDiscreteLike(type, semanticType, cardinality, maxCard)) continue;\n        if (cardinality <= 0 || cardinality > maxCard) continue;\n        if (isLikelyIdentifierOrRank(name) && !tv.preferredFields?.has(name)) continue;\n        if (isValidGroupingField(tv, xField, name)) candidates.push(name);\n    }\n    if (candidates.length === 0) return undefined;\n    // Prefer a field the user already uses; otherwise the lowest-cardinality\n    // valid grouping field (fewest colors). Deterministic — no random pick.\n    if (tv.preferredFields) {\n        const preferred = candidates.filter(n => tv.preferredFields!.has(n));\n        if (preferred.length > 0) {\n            const chosen = lowestCardinality(tv, preferred);\n            used.add(chosen);\n            return chosen;\n        }\n    }\n    const chosen = lowestCardinality(tv, candidates);\n    used.add(chosen);\n    return chosen;\n}\n\nexport function isValidLineSeriesData(tv: InternalTableView, xField: string, colorField?: string): boolean {\n    if (!tv.rows || tv.rows.length === 0) return false;\n    const xColorCombinations = new Set<string>();\n    const colorGroupCounts = new Map<string, number>();\n\n    for (const row of tv.rows) {\n        const xVal = row[xField];\n        const colorVal = colorField ? row[colorField] : '__single__';\n        const xColorKey = `${xVal}|||${colorVal}`;\n        if (xColorCombinations.has(xColorKey)) return false;\n        xColorCombinations.add(xColorKey);\n        colorGroupCounts.set(colorVal, (colorGroupCounts.get(colorVal) ?? 0) + 1);\n    }\n\n    let validGroups = 0;\n    let totalGroups = 0;\n    for (const count of colorGroupCounts.values()) {\n        totalGroups++;\n        if (count >= 2) validGroups++;\n    }\n    return totalGroups > 0 && (validGroups / totalGroups) > 0.5;\n}\n\nexport function pickLineChartColorField(\n    tv: InternalTableView, used: Set<string>, xField: string, maxCard = 20,\n): string | undefined {\n    const candidates: string[] = [];\n    for (const name of tv.names) {\n        if (used.has(name)) continue;\n        const type = tv.fieldType[name] ?? 'nominal';\n        const semanticType = tv.fieldSemanticType[name] ?? '';\n        const cardinality = tv.fieldLevels[name]?.length ?? 0;\n        if (!isDiscreteLike(type, semanticType, cardinality, maxCard)) continue;\n        if (cardinality <= 0 || cardinality > maxCard) continue;\n        if (isLikelyIdentifierOrRank(name) && !tv.preferredFields?.has(name)) continue;\n        if (isValidLineSeriesData(tv, xField, name)) candidates.push(name);\n    }\n    if (candidates.length === 0) return undefined;\n    // Prefer a field the user already uses; otherwise the lowest-cardinality\n    // valid series field (fewest lines/colors). Deterministic — no random pick.\n    if (tv.preferredFields) {\n        const preferred = candidates.filter(n => tv.preferredFields!.has(n));\n        if (preferred.length > 0) {\n            const chosen = lowestCardinality(tv, preferred);\n            used.add(chosen);\n            return chosen;\n        }\n    }\n    const chosen = lowestCardinality(tv, candidates);\n    used.add(chosen);\n    return chosen;\n}\n\nfunction calculateMultiplicity(tv: InternalTableView, xField: string, colorField?: string): number {\n    if (!tv.rows || tv.rows.length === 0) return 1;\n    const groups = new Set<string>();\n    for (const row of tv.rows) {\n        const key = colorField ? `${row[xField]}|||${row[colorField]}` : `${row[xField]}`;\n        groups.add(key);\n    }\n    return tv.rows.length / groups.size;\n}\n\nexport function pickBestGroupingField(\n    tv: InternalTableView, used: Set<string>, xField: string, maxMultiplicity = 5,\n): string | undefined {\n    const baseMultiplicity = calculateMultiplicity(tv, xField);\n    if (baseMultiplicity <= 1.0) return undefined;\n\n    let bestField: string | undefined;\n    let bestMultiplicity = baseMultiplicity;\n\n    for (const name of tv.names) {\n        if (used.has(name)) continue;\n        const type = tv.fieldType[name] ?? 'nominal';\n        const semanticType = tv.fieldSemanticType[name] ?? '';\n        const cardinality = tv.fieldLevels[name]?.length ?? 0;\n        if (!isDiscreteLike(type, semanticType, cardinality)) continue;\n        if (isLikelyIdentifierOrRank(name) && !tv.preferredFields?.has(name)) continue;\n\n        const multiplicity = calculateMultiplicity(tv, xField, name);\n        if (multiplicity < bestMultiplicity) {\n            bestMultiplicity = multiplicity;\n            bestField = name;\n            if (multiplicity <= 1.0) break;\n        }\n    }\n\n    if (bestField && bestMultiplicity < baseMultiplicity && bestMultiplicity <= maxMultiplicity) {\n        used.add(bestField);\n        return bestField;\n    }\n    return undefined;\n}\n\n// ============================================================================\n// 8. Per-Chart-Type Recommendation Heuristics\n// ============================================================================\n\n/**\n * Recommend channel→fieldName assignments for a given chart type.\n *\n * Pure logic: takes raw data rows + semantic type annotations, returns\n * a channel→fieldName map.  Backend wrappers filter to valid channels.\n *\n * @param chartType      Chart template name (e.g. \"Bar Chart\")\n * @param data           Array of row objects\n * @param semanticTypes  Field→semantic-type map (e.g. { weight: \"Quantity\" })\n * @returns              channel→fieldName map\n */\nexport function recommendChannels(\n    chartType: string,\n    data: any[],\n    semanticTypes: Record<string, string>,\n    recommendFn?: RecommendFn,\n): Record<string, string> {\n    const fn = recommendFn ?? getRecommendation;\n    return fn(chartType, buildTableView(data, semanticTypes));\n}\n\n/**\n * Core recommendation engine — handles chart types shared across 2+ backends.\n * Backend-specific chart types should be handled in their own recommendation files\n * by extending this function.\n *\n * Exported so that backend wrappers can call it as a fallback in their own\n * extended `getRecommendation` implementations.\n */\nexport function getRecommendation(chartType: string, tv: InternalTableView): Record<string, string> {\n    const used = new Set<string>();\n    const rec: Record<string, string> = {};\n\n    const assign = (channel: string, fieldName: string | undefined) => {\n        if (fieldName) rec[channel] = fieldName;\n    };\n\n    switch (chartType) {\n        case 'Scatter Plot': {\n            const yField = pickQuantitative(tv, used) ?? pickTemporal(tv, used) ?? pickNominal(tv, used);\n            const xField = pickQuantitative(tv, used) ?? pickTemporal(tv, used) ?? pickNominal(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            assign('color', pickLowCardNominal(tv, used));\n            break;\n        }\n\n        case 'Bar Chart':\n        case 'Stacked Bar Chart': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            if (hasMultipleValuesPerField(tv, xField)) {\n                assign('color', pickBestGroupingField(tv, used, xField));\n            }\n            break;\n        }\n\n        case 'Grouped Bar Chart': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            const seriesField = pickValidGroupingField(tv, used, xField, 20);\n            if (!seriesField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            // A grouped bar dodges by the `group` channel (not `color`) across\n            // all three backends — assigning `color` here would be dropped by\n            // the Vega-Lite template, leaving an ungrouped bar.\n            assign('group', seriesField);\n            break;\n        }\n\n        case 'Histogram': {\n            const xField = pickQuantitative(tv, used);\n            if (!xField) return {};\n            assign('x', xField);\n            break;\n        }\n\n        case 'Heatmap': {\n            // Semantic-first preference scoring.\n            // 1. Semantic type determines preference (temporal, categorical, measure)\n            // 2. Data type (ty) is a safeguard for compatibility\n            const heatmapResult = resolveAssignment(tv, used, [\n                {\n                    channel: 'x',\n                    pref: (_n, ty, st, card) => {\n                        // Semantic preference\n                        if (isTimeSeriesType(st))                         return Pref.STRONG;\n                        if (isCategoricalType(st))                        return Pref.OK;\n                        if (isOrdinalType(st))                            return Pref.OK;\n                        if (isNonMeasureNumeric(st))                      return Pref.OK;\n                        // Data type safeguard: allow nominal or low-card continuous\n                        if (ty === 'nominal')                             return Pref.OK;\n                        if (ty === 'temporal')                            return Pref.STRONG;\n                        if (ty === 'quantitative' && card > 0 && card <= 50) return Pref.WEAK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n                {\n                    channel: 'y',\n                    pref: (_n, ty, st, card) => {\n                        // Semantic preference\n                        if (isCategoricalType(st))                        return Pref.STRONG;\n                        if (isTimeSeriesType(st))                         return Pref.OK;\n                        if (isOrdinalType(st))                            return Pref.OK;\n                        if (isNonMeasureNumeric(st))                      return Pref.OK;\n                        // Data type safeguard\n                        if (ty === 'nominal')                             return Pref.STRONG;\n                        if (ty === 'temporal')                            return Pref.OK;\n                        if (ty === 'quantitative' && card > 0 && card <= 50) return Pref.WEAK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n                {\n                    channel: 'color',\n                    pref: (_n, ty, st) => {\n                        // Semantic preference: measures are ideal for heatmap color\n                        if (isMeasureType(st))                            return Pref.STRONG;\n                        if (isOrdinalType(st))                            return Pref.OK;\n                        // Data type safeguard: quantitative with no semantic type\n                        if (ty === 'quantitative' && !st)                 return Pref.STRONG;\n                        if (ty === 'temporal')                            return Pref.WEAK;\n                        if (ty === 'nominal')                             return Pref.WEAK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n            ]);\n            if (!heatmapResult['x'] || !heatmapResult['y'] || !heatmapResult['color']) return {};\n            assign('x', heatmapResult['x']);\n            assign('y', heatmapResult['y']);\n            assign('color', heatmapResult['color']);\n            break;\n        }\n\n        case 'Line Chart': {\n            const xField = pickSeriesAxis(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            if (!isValidLineSeriesData(tv, xField, undefined)) {\n                const colorField = pickLineChartColorField(tv, used, xField, 20)\n                    ?? pickLineChartColorField(tv, used, xField, 200);\n                if (!colorField) return {};\n                assign('color', colorField);\n            }\n            break;\n        }\n\n        case 'Boxplot': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            break;\n        }\n\n        case 'Pie Chart': {\n            const sizeField = pickQuantitative(tv, used);\n            const colorField = pickLowCardDiscrete(tv, used, 12);\n            if (!sizeField || !colorField) return {};\n            assign('size', sizeField);\n            assign('color', colorField);\n            break;\n        }\n\n        case 'Area Chart': {\n            const xField = pickSeriesAxis(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            assign('color', pickLineChartColorField(tv, used, xField, 20));\n            break;\n        }\n\n        case 'Streamgraph': {\n            // Semantic-first preference scoring.\n            // 1. Semantic type determines preference (temporal→x, measure→y, categorical→color)\n            // 2. Data type (ty) is a safeguard for compatibility\n            const streamResult = resolveAssignment(tv, used, [\n                {\n                    channel: 'x',\n                    pref: (_n, ty, st, card) => {\n                        // Semantic preference: temporal types are ideal series axes\n                        if (isTimeSeriesType(st))                            return Pref.STRONG;\n                        if (isOrdinalType(st))                               return Pref.OK;\n                        if (isCategoricalType(st))                           return Pref.OK;\n                        if (isNonMeasureNumeric(st))                         return Pref.OK;\n                        // Data type safeguard\n                        if (ty === 'temporal')                               return Pref.STRONG;\n                        if (ty === 'nominal')                                return Pref.OK;\n                        if (ty === 'quantitative' && card > 0 && card <= 50) return Pref.OK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n                {\n                    channel: 'y',\n                    pref: (_n, ty, st, card) => {\n                        // Semantic preference: true measures are ideal\n                        if (isMeasureType(st))                               return Pref.STRONG;\n                        // Semantic exclusion: temporal / categorical / non-measure\n                        // numeric types should not be used as y-axis measures\n                        if (isTimeSeriesType(st))                            return Pref.EXCLUDE;\n                        if (isCategoricalType(st))                           return Pref.EXCLUDE;\n                        if (isNonMeasureNumeric(st))                         return Pref.EXCLUDE;\n                        // Data type safeguard: quantitative with no semantic type\n                        if (ty === 'quantitative' && !st)\n                            return card > 20 ? Pref.STRONG : Pref.OK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n                {\n                    channel: 'color',\n                    pref: (_n, ty, st, card) => {\n                        // Semantic preference\n                        if (isCategoricalType(st))                           return Pref.STRONG;\n                        if (isOrdinalType(st))                               return Pref.OK;\n                        if (isTimeSeriesType(st))                            return Pref.OK;\n                        // Data type safeguard\n                        if (ty === 'nominal')                                return Pref.STRONG;\n                        if (ty === 'temporal' || ty === 'ordinal')           return Pref.OK;\n                        if (isDiscreteLike(ty, st, card, 20))                return Pref.WEAK;\n                        return Pref.EXCLUDE;\n                    },\n                },\n            ]);\n            if (!streamResult['x'] || !streamResult['y'] || !streamResult['color']) return {};\n            assign('x', streamResult['x']);\n            assign('y', streamResult['y']);\n            assign('color', streamResult['color']);\n            break;\n        }\n\n        case 'Radar Chart': {\n            const xField = pickDiscrete(tv, used) ?? pickLowCardDiscrete(tv, used, 20);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            assign('color', pickLowCardDiscrete(tv, used, 20));\n            break;\n        }\n\n        case 'Candlestick Chart': {\n            const xField = pickTemporal(tv, used)\n                ?? pick(tv, used, (name) => nameMatches(name, ['date', 'time', 'day', 'datetime', 'timestamp', 'period']))\n                ?? pickQuantitativeByName(tv, used, ['date', 'time', 'day'])\n                ?? pickDiscrete(tv, used);\n            if (!xField) return {};\n            assign('x', xField);\n            const openField = pickQuantitativeByName(tv, used, ['open']);\n            const highField = pickQuantitativeByName(tv, used, ['high']);\n            const lowField = pickQuantitativeByName(tv, used, ['low']);\n            const closeField = pickQuantitativeByName(tv, used, ['close']);\n            if (openField && highField && lowField && closeField) {\n                assign('open', openField);\n                assign('high', highField);\n                assign('low', lowField);\n                assign('close', closeField);\n            } else {\n                const quants = pickAllQuantitative(tv, used);\n                if (quants.length >= 4) {\n                    assign('open', quants[0]);\n                    assign('high', quants[1]);\n                    assign('low', quants[2]);\n                    assign('close', quants[3]);\n                }\n            }\n            break;\n        }\n\n        default:\n            break;\n    }\n\n    return rec;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * DATA-DRIVEN CHART *TYPE* RECOMMENDATION\n * =============================================================================\n *\n * `recommendChannels` / `getRecommendation` answer \"which fields go on which\n * channels **for a chart type I already picked**\". They do not answer the step\n * that sits *in front* of them: **which chart type should I use at all?**\n *\n * This module fills that gap. Given raw rows + semantic-type annotations it\n * builds a deterministic {@link DataProfile} (how many measures / temporals /\n * categoricals / geographic fields the table has, and their cardinalities) and\n * scores a ranked list of candidate chart types.\n *\n * It reuses the same semantic-type classification the encoders use\n * (`isMeasureType`, `isTimeSeriesType`, `isGeoType`, …) so the two stages agree\n * on what a field *is*; it only adds the type-selection heuristic on top.\n *\n * Typical use (e.g. Data Formulator surfacing suggestions without a model call):\n *\n * ```ts\n * const types = recommendChartTypes(rows, semanticTypes); // [\"Choropleth\", \"Line Chart\", …]\n * const encodings = vlRecommendEncodings(types[0], rows, semanticTypes);\n * ```\n *\n * Backend wrappers (`vlRecommendChartTypes`, …) pass `supportedTypes` so only\n * chart types that backend can actually render are returned, and pair it with\n * their `…RecommendEncodings` to emit type + channels in one step\n * (`…RecommendCharts`).\n *\n * =============================================================================\n */\n\nimport {\n    isMeasureType,\n    isTimeSeriesType,\n    isCategoricalType,\n    isOrdinalType,\n    isGeoCoordinateType,\n    isGeoLocationString,\n    isNonMeasureNumeric,\n} from './semantic-types';\nimport { buildTableView, nameMatches, type InternalTableView } from './recommendation';\n\n// ── Field roles ─────────────────────────────────────────────────────────\n\n/**\n * The role a field plays when choosing a chart type. Mutually exclusive:\n * every field is classified into exactly one role (the most specific one).\n */\nexport type ChartFieldRole =\n    | 'measure'      // true quantitative measure (aggregatable)\n    | 'temporal'     // date / time-granule — a time axis\n    | 'categorical'  // nominal category / entity\n    | 'ordinal'      // ordered discrete (Rank, Range, Score, …)\n    | 'geoPlace'     // named place: Country, State, City, Region …\n    | 'latitude'     // geographic latitude coordinate\n    | 'longitude'    // geographic longitude coordinate\n    | 'identifier'   // row id / index — not useful as a category or measure\n    | 'other';       // unclassified\n\n/** A single field annotated with its data/semantic type, cardinality, and role. */\nexport interface ProfiledField {\n    name: string;\n    /** Vega-Lite-style vis category: 'quantitative' | 'temporal' | 'nominal' | 'ordinal'. */\n    type: string;\n    /** Semantic type annotation (e.g. \"Country\", \"Amount\"), or '' if none. */\n    semanticType: string;\n    /** Number of distinct non-null values. */\n    cardinality: number;\n    role: ChartFieldRole;\n}\n\n/**\n * A deterministic summary of a table's shape, used to rank chart types.\n * The bucketed arrays are views over {@link fields} grouped by role, plus\n * `dimensions` (all category-axis-capable fields: categorical ∪ ordinal ∪\n * geoPlace ∪ temporal).\n */\nexport interface DataProfile {\n    fields: ProfiledField[];\n    measures: ProfiledField[];\n    temporals: ProfiledField[];\n    categoricals: ProfiledField[];\n    ordinals: ProfiledField[];\n    geoPlaces: ProfiledField[];\n    latitudes: ProfiledField[];\n    longitudes: ProfiledField[];\n    identifiers: ProfiledField[];\n    /** Fields usable on a category/discrete axis (categorical ∪ ordinal ∪ geoPlace ∪ temporal). */\n    dimensions: ProfiledField[];\n    rowCount: number;\n}\n\n// Identifier name patterns — strict (exact or `_suffix`) to avoid false hits\n// like \"grid\" / \"valid\" / \"android\". `rank` is intentionally excluded so a\n// Rank field classifies as ordinal (a usable axis) rather than an identifier.\nconst ID_NAME_PATTERNS = ['id', 'index', 'idx', 'row', 'order', 'position', 'pos'];\n\nfunction looksLikeIdentifier(name: string): boolean {\n    const lower = name.toLowerCase();\n    return ID_NAME_PATTERNS.some(p => lower === p || lower.endsWith('_' + p));\n}\n\n/**\n * Classify one field into a single {@link ChartFieldRole}. The order of checks\n * is significant: the most *specific* interpretation wins (geo coordinate →\n * geo place → temporal → identifier → measure → ordinal → categorical).\n */\nfunction classifyRole(name: string, type: string, semanticType: string): ChartFieldRole {\n    const st = semanticType;\n    // Geographic coordinates (Latitude / Longitude): numeric but not measures.\n    if (isGeoCoordinateType(st)) {\n        if (st === 'Latitude' || nameMatches(name, ['latitude', 'lat'])) return 'latitude';\n        if (st === 'Longitude' || nameMatches(name, ['longitude', 'lon', 'lng', 'long'])) return 'longitude';\n        return 'other';\n    }\n    // Named geographic places (Country / State / City / Region / …).\n    if (isGeoLocationString(st)) return 'geoPlace';\n    // Time axis.\n    if (type === 'temporal' || isTimeSeriesType(st)) return 'temporal';\n    // Row identifiers — demoted so they never become a category or measure.\n    if (st === 'ID' || looksLikeIdentifier(name)) return 'identifier';\n    // True quantitative measure (mirrors isQuantitativeField in the encoders).\n    if (type === 'quantitative' && !isNonMeasureNumeric(st) && (isMeasureType(st) || st === '')) {\n        return 'measure';\n    }\n    // Ordered discrete (Rank, Range, Score-as-ordinal, Direction, …).\n    if (isOrdinalType(st)) return 'ordinal';\n    // Plain category.\n    if (type === 'nominal' || isCategoricalType(st)) return 'categorical';\n    return 'other';\n}\n\n/**\n * Build a {@link DataProfile} from raw rows + semantic-type annotations.\n * Deterministic — no random sampling; classification is per-field and\n * order-independent.\n *\n * @param data           Array of row objects.\n * @param semanticTypes  Field → semantic-type map (e.g. `{ Entity: \"Country\" }`).\n */\nexport function profileData(data: any[], semanticTypes: Record<string, string>): DataProfile {\n    const tv: InternalTableView = buildTableView(data, semanticTypes);\n    const fields: ProfiledField[] = tv.names.map(name => ({\n        name,\n        type: tv.fieldType[name] ?? 'nominal',\n        semanticType: tv.fieldSemanticType[name] ?? '',\n        cardinality: tv.fieldLevels[name]?.length ?? 0,\n        role: classifyRole(name, tv.fieldType[name] ?? 'nominal', tv.fieldSemanticType[name] ?? ''),\n    }));\n\n    const by = (r: ChartFieldRole) => fields.filter(f => f.role === r);\n    const categoricals = by('categorical');\n    const ordinals = by('ordinal');\n    const geoPlaces = by('geoPlace');\n    const temporals = by('temporal');\n\n    return {\n        fields,\n        measures: by('measure'),\n        temporals,\n        categoricals,\n        ordinals,\n        geoPlaces,\n        latitudes: by('latitude'),\n        longitudes: by('longitude'),\n        identifiers: by('identifier'),\n        dimensions: [...categoricals, ...ordinals, ...geoPlaces, ...temporals],\n        rowCount: tv.rows.length,\n    };\n}\n\n// ── Scoring ─────────────────────────────────────────────────────────────\n\n/** A ranked chart-type candidate with its score and human-readable reasons. */\nexport interface ChartTypeSuggestion {\n    chartType: string;\n    /** Higher is a better fit. Scores are relative; only the ordering is meaningful. */\n    score: number;\n    reasons: string[];\n}\n\n/** Options for {@link recommendChartTypes} / {@link recommendChartTypesDetailed}. */\nexport interface RecommendChartTypesOptions {\n    /**\n     * Restrict results to these chart-type names (e.g. a backend's template\n     * catalog). Types not in the list are dropped. Omit for all shared types.\n     */\n    supportedTypes?: string[];\n    /** Cap the number of suggestions returned (after ranking). */\n    max?: number;\n}\n\n/**\n * A recommended chart type paired with its recommended channel → field\n * encodings. Returned by the backend one-step recommenders\n * (`vlRecommendCharts`, …) that chain type selection with encoding selection.\n */\nexport interface RecommendedChart {\n    chartType: string;\n    encodings: Record<string, string>;\n}\n\n// Cardinality thresholds for readability gates.\nconst LOW_CARD_SERIES = 12;   // a legend/series stays readable up to ~12 colors\nconst LOW_CARD_AXIS = 25;     // a discrete heatmap axis stays readable up to ~25 bands\nconst PIE_MAX_SLICES = 8;     // a pie is legible only with a handful of slices\n\n/** Semantic types the choropleth base maps can actually render (see map.ts). */\nconst CHOROPLETH_SEMANTIC = new Set(['Country', 'State']);\nconst CHOROPLETH_NAME_HINTS = ['country', 'state', 'province', 'nation'];\n\n/**\n * Score candidate chart types for a data profile. Returns suggestions sorted by\n * descending score; ties keep a stable, priority-ordered arrangement.\n *\n * The rules are curated design heuristics: more *specific* chart types\n * (maps, time series) outrank generic ones (bar) when the data supports them,\n * so a table with a geographic place + a measure surfaces \"Choropleth\" ahead of\n * \"Bar Chart\" without a model call.\n */\nexport function rankChartTypes(profile: DataProfile): ChartTypeSuggestion[] {\n    const {\n        measures, temporals, categoricals, ordinals, geoPlaces,\n        latitudes, longitudes, rowCount,\n    } = profile;\n\n    const catLike = [...categoricals, ...ordinals, ...geoPlaces]; // discrete, non-temporal\n    const dims = profile.dimensions;\n    const lowCardCatLike = catLike.filter(f => f.cardinality >= 2 && f.cardinality <= LOW_CARD_SERIES);\n    const lowCardDims = dims.filter(f => f.cardinality >= 2 && f.cardinality <= LOW_CARD_AXIS);\n    const hasMeasure = measures.length >= 1;\n\n    // Preserve insertion order for stable tie-breaking; keep the max score per type.\n    const order: string[] = [];\n    const acc = new Map<string, { score: number; reasons: string[] }>();\n    const add = (chartType: string, score: number, reason: string) => {\n        const cur = acc.get(chartType);\n        if (!cur) {\n            order.push(chartType);\n            acc.set(chartType, { score, reasons: [reason] });\n        } else {\n            if (score > cur.score) cur.score = score;\n            if (!cur.reasons.includes(reason)) cur.reasons.push(reason);\n        }\n    };\n\n    // ── Geographic (most specific) ──────────────────────────────────────\n    if (latitudes.length >= 1 && longitudes.length >= 1) {\n        add('Map', 96, 'has latitude + longitude coordinates');\n    }\n    const choroGeo = geoPlaces.filter(\n        f => CHOROPLETH_SEMANTIC.has(f.semanticType) || nameMatches(f.name, CHOROPLETH_NAME_HINTS),\n    );\n    if (choroGeo.length >= 1 && hasMeasure) {\n        add('Choropleth', 92, 'has a geographic region field + a measure');\n    }\n\n    // ── Time series ─────────────────────────────────────────────────────\n    if (temporals.length >= 1 && hasMeasure) {\n        add('Line Chart', 88, 'has a time field + a measure (trend over time)');\n        add('Area Chart', 66, 'has a time field + a measure');\n    }\n\n    // ── Correlation (two measures) ──────────────────────────────────────\n    if (measures.length >= 2) {\n        add('Scatter Plot', 84, 'has two or more measures (relationship)');\n    }\n\n    // ── Category + measure (bar) ────────────────────────────────────────\n    if (dims.length >= 1 && hasMeasure) {\n        add('Bar Chart', 80, 'has a category axis + a measure');\n    }\n\n    // ── Single-measure distribution (histogram) ─────────────────────────\n    if (hasMeasure && dims.length === 0) {\n        add('Histogram', 82, 'has a measure with no category (distribution)');\n    }\n\n    // ── Two-category comparison (grouped / stacked / heatmap) ───────────\n    if (catLike.length >= 2 && lowCardCatLike.length >= 1 && hasMeasure) {\n        add('Grouped Bar Chart', 72, 'has two categories + a measure');\n        add('Stacked Bar Chart', 70, 'has two categories + a measure');\n    }\n    if (lowCardDims.length >= 2 && hasMeasure) {\n        add('Heatmap', 74, 'has two discrete fields + a measure (matrix)');\n    }\n\n    // ── Part-to-whole (pie) ─────────────────────────────────────────────\n    if (catLike.length === 1 && temporals.length === 0 && hasMeasure) {\n        const c = catLike[0];\n        const oneRowPerCategory = rowCount <= c.cardinality * 1.5;\n        if (c.cardinality >= 2 && c.cardinality <= PIE_MAX_SLICES && oneRowPerCategory) {\n            add('Pie Chart', 64, 'a few categories that sum to a whole');\n        }\n    }\n\n    // ── Distribution across groups (box / strip) ────────────────────────\n    if (catLike.length >= 1 && hasMeasure && temporals.length === 0) {\n        const smallest = catLike.reduce((a, b) => (b.cardinality < a.cardinality ? b : a));\n        if (smallest.cardinality >= 1 && rowCount >= smallest.cardinality * 2) {\n            add('Boxplot', 58, 'multiple measure values per group (spread)');\n            add('Strip Plot', 52, 'multiple measure values per group');\n        }\n    }\n\n    // ── Count-only fallbacks (dimensions but no measure) ────────────────\n    if (!hasMeasure && dims.length >= 1) {\n        add('Bar Chart', 60, 'categories without a measure (counts)');\n        if (lowCardDims.length >= 2) add('Heatmap', 55, 'two discrete fields (cross-tab counts)');\n    }\n\n    // ── Last-resort fallback ────────────────────────────────────────────\n    if (order.length === 0) {\n        if (measures.length >= 2) add('Scatter Plot', 20, 'fallback for numeric data');\n        else add('Bar Chart', 15, 'fallback');\n    }\n\n    return order\n        .map(chartType => ({ chartType, score: acc.get(chartType)!.score, reasons: acc.get(chartType)!.reasons }))\n        // Stable sort (ES2019+) — equal scores keep priority insertion order.\n        .sort((a, b) => b.score - a.score);\n}\n\n// ── Public API ──────────────────────────────────────────────────────────\n\n/**\n * Recommend candidate chart types for a dataset, with scores and reasons.\n *\n * @param data           Array of row objects.\n * @param semanticTypes  Field → semantic-type map (e.g. `{ Entity: \"Country\" }`).\n * @param options        Optional `supportedTypes` filter and `max` cap.\n * @returns              Ranked {@link ChartTypeSuggestion}s (best first).\n */\nexport function recommendChartTypesDetailed(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: RecommendChartTypesOptions = {},\n): ChartTypeSuggestion[] {\n    const profile = profileData(data, semanticTypes);\n    let ranked = rankChartTypes(profile);\n    if (options.supportedTypes) {\n        const allowed = new Set(options.supportedTypes);\n        ranked = ranked.filter(s => allowed.has(s.chartType));\n    }\n    if (options.max != null) ranked = ranked.slice(0, options.max);\n    return ranked;\n}\n\n/**\n * Recommend a ranked list of chart-type names for a dataset (best first).\n *\n * A convenience wrapper over {@link recommendChartTypesDetailed} that drops the\n * scores/reasons. This is the \"type-selection step that sits in front of\"\n * `recommendChannels` — call it first, then feed the chosen type to\n * `…RecommendEncodings` to populate channels.\n *\n * @param data           Array of row objects.\n * @param semanticTypes  Field → semantic-type map.\n * @param options        Optional `supportedTypes` filter and `max` cap.\n * @returns              Ranked chart-type names (best first).\n */\nexport function recommendChartTypes(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: RecommendChartTypesOptions = {},\n): string[] {\n    return recommendChartTypesDetailed(data, semanticTypes, options).map(s => s.chartType);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Optional data aggregation transform.\n *\n * Flint's default contract is \"callers own the data\" — the host passes in rows\n * that are already shaped for the chart. As a convenience, an encoding may set\n * `aggregate` to ask Flint to collapse the rows itself, mirroring the way\n * Vega-Lite derives an aggregated field:\n *\n *   - Rows are grouped by every channel that has a `field` and no `aggregate`\n *     (the dimensions).\n *   - For each group, each aggregated channel produces a derived column named\n *     `${field}_${op}` (`count` produces `_count`), which the backend assemblers\n *     already reference once `aggregate` is set.\n *\n * The derived column name IS the contract: if a caller has already\n * pre-aggregated, they simply reference that column by name (e.g. `revenue_sum`)\n * and omit `aggregate`, and this transform is a no-op. `average` and `mean` are\n * synonyms (both arithmetic mean) and keep distinct suffixes by design.\n *\n * This is a deliberate, opt-in exception to the no-transform principle — most\n * callers should still aggregate upstream.\n */\n\nimport { ChartEncoding } from './types';\n\ninterface AggSpec {\n    field?: string;\n    op: string;\n    /** Derived column name the assemblers expect (`${field}_${op}` or `_count`). */\n    target: string;\n}\n\n/**\n * Apply requested `aggregate` operations to the data, returning grouped rows.\n *\n * Returns the input unchanged when no encoding requests aggregation, or when the\n * derived columns are already present (caller pre-aggregated).\n */\nexport function applyAggregation(\n    encodings: Record<string, ChartEncoding>,\n    data: any[],\n): any[] {\n    if (!data || data.length === 0) return data;\n\n    // Collect aggregate requests from the input encodings.\n    const specs: AggSpec[] = [];\n    for (const enc of Object.values(encodings)) {\n        if (!enc || !enc.aggregate) continue;\n        const op = enc.aggregate;\n        if (op !== 'count' && !enc.field) continue; // nothing to reduce\n        const target = op === 'count' ? '_count' : `${enc.field}_${op}`;\n        specs.push({ field: enc.field, op, target });\n    }\n    if (specs.length === 0) return data;\n\n    // If every derived column already exists, the caller pre-aggregated — trust\n    // the supplied data and do nothing.\n    const firstRow = data[0];\n    const allPresent = specs.every(s =>\n        Object.prototype.hasOwnProperty.call(firstRow, s.target),\n    );\n    if (allPresent) return data;\n\n    // Group-by dimensions: every channel with a field and no aggregate.\n    const groupFields: string[] = [];\n    const seen = new Set<string>();\n    for (const enc of Object.values(encodings)) {\n        if (!enc || enc.aggregate || !enc.field) continue;\n        if (seen.has(enc.field)) continue;\n        seen.add(enc.field);\n        groupFields.push(enc.field);\n    }\n\n    // Bucket rows by the tuple of group-field values (insertion order preserved).\n    const groups = new Map<string, any[]>();\n    for (const row of data) {\n        const key = JSON.stringify(groupFields.map(f => row[f] ?? null));\n        let bucket = groups.get(key);\n        if (!bucket) {\n            bucket = [];\n            groups.set(key, bucket);\n        }\n        bucket.push(row);\n    }\n\n    const toNum = (v: any): number => (typeof v === 'number' ? v : Number(v));\n    const reduceOp = (rows: any[], spec: AggSpec): number => {\n        if (spec.op === 'count') return rows.length;\n        const nums = rows\n            .map(r => toNum(r[spec.field as string]))\n            .filter(v => Number.isFinite(v));\n        if (nums.length === 0) return 0;\n        const sum = nums.reduce((a, b) => a + b, 0);\n        // 'average' and 'mean' are synonyms (arithmetic mean); 'sum' totals.\n        return spec.op === 'sum' ? sum : sum / nums.length;\n    };\n\n    const out: any[] = [];\n    for (const rows of groups.values()) {\n        const head = rows[0];\n        const aggregated: Record<string, any> = {};\n        for (const f of groupFields) aggregated[f] = head[f];\n        for (const spec of specs) {\n            const val = reduceOp(rows, spec);\n            aggregated[spec.target] = val;\n            // Keep the source column populated so semantic/format inference for\n            // the measure channel still sees representative numeric values.\n            if (spec.op !== 'count' && spec.field) aggregated[spec.field] = val;\n        }\n        out.push(aggregated);\n    }\n    return out;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Shared helper functions for chart template hooks (v2 pipeline).\n * Pure logic — no UI dependencies.\n */\n\nimport type { ChannelSemantics, InstantiateContext } from '../../core/types';\nimport { resolveDiscreteType } from '../../core/axis-detection';\n\n// ---------------------------------------------------------------------------\n// Discrete-dimension helpers\n// ---------------------------------------------------------------------------\n\nconst isDiscrete = (type: string | undefined) => type === \"nominal\" || type === \"ordinal\";\n\n/**\n * Check whether a numeric field's values are equally strided (uniform spacing).\n */\nexport function isEquallyStrided(field: string, table: any[]): boolean {\n    const vals = [...new Set(table.map(r => r[field]).filter((v: any) => v != null && typeof v === 'number'))];\n    if (vals.length <= 1) return true;\n    vals.sort((a, b) => a - b);\n\n    const diffs = [];\n    for (let i = 1; i < vals.length; i++) {\n        diffs.push(vals[i] - vals[i - 1]);\n    }\n    const medianDiff = diffs.slice().sort((a, b) => a - b)[Math.floor(diffs.length / 2)];\n    if (medianDiff === 0) return false;\n\n    const tolerance = 0.01 * Math.abs(medianDiff);\n    return diffs.every(d => Math.abs(d - medianDiff) <= tolerance);\n}\n\n/**\n * Convert a single encoding to a discrete VL type in-place.\n */\nexport function resolveAsDiscrete(\n    encodingObj: any,\n    table: any[],\n): 'nominal' | 'ordinal' {\n    if (!encodingObj) return 'nominal';\n    const result = resolveDiscreteType(encodingObj.type, encodingObj.field, table);\n    encodingObj.type = result;\n    return result;\n}\n\n/**\n * Default instantiate implementation for simple templates.\n * Maps each resolved encoding channel directly to spec.encoding[channel].\n */\nexport const defaultBuildEncodings = (spec: any, encodings: Record<string, any>): void => {\n    if (!spec.encoding) spec.encoding = {};\n    for (const [channel, encodingObj] of Object.entries(encodings)) {\n        if (Object.keys(encodingObj).length > 0) {\n            const existing = spec.encoding[channel];\n            if (existing && typeof existing === 'object') {\n                spec.encoding[channel] = { ...existing, ...encodingObj };\n            } else {\n                spec.encoding[channel] = encodingObj;\n            }\n        }\n    }\n};\n\n// ---------------------------------------------------------------------------\n// Mark sizing helpers (used by v2 instantiate hooks)\n// ---------------------------------------------------------------------------\n\n/**\n * Set a property on a mark object (handles both string and object forms).\n */\nexport function setMarkProp(mark: any, key: string, value: any): any {\n    if (typeof mark === 'string') {\n        return { type: mark, [key]: value };\n    }\n    return { ...mark, [key]: value };\n}\n\n/**\n * Coverage-based point sizing.\n */\nexport const applyPointSizeScaling = (\n    vgSpec: any,\n    table: any[],\n    plotWidth: number = 400,\n    plotHeight: number = 300,\n    targetCoverage: number = 0.15,\n    defaultSize: number = 30,\n    minSize: number = 4,\n): any => {\n    if (!table || table.length === 0) return vgSpec;\n\n    const markType = typeof vgSpec.mark === 'string' ? vgSpec.mark : vgSpec.mark?.type;\n    if (!['circle', 'point', 'square'].includes(markType)) return vgSpec;\n\n    if (vgSpec.encoding?.size?.field) return vgSpec;\n    if (typeof vgSpec.mark === 'object' && vgSpec.mark.size != null) return vgSpec;\n\n    const n = table.length;\n    const plotArea = plotWidth * plotHeight;\n    const currentCoverage = (n * defaultSize) / plotArea;\n\n    if (currentCoverage <= targetCoverage) return vgSpec;\n\n    const size = Math.round(Math.max(minSize, (targetCoverage * plotArea) / n));\n    vgSpec.mark = setMarkProp(vgSpec.mark, 'size', size);\n    return vgSpec;\n};\n\n/**\n * Compute the maximum non-overlapping mark size (in pixels) for a continuous\n * banded axis.\n */\nfunction maxNonOverlapSize(\n    field: string,\n    table: any[],\n    isTemporal: boolean,\n    subplotDim: number,\n    count: number,\n    minSize: number = 2,\n): number {\n    const nums = [...new Set(\n        table.map((r: any) => {\n            const v = r[field];\n            if (v == null) return NaN;\n            return isTemporal ? +new Date(v) : +v;\n        }).filter((v: number) => !isNaN(v)),\n    )];\n    if (nums.length < 2) return Infinity;\n\n    nums.sort((a, b) => a - b);\n\n    let minGap = Infinity;\n    for (let i = 1; i < nums.length; i++) {\n        const gap = nums[i] - nums[i - 1];\n        if (gap > 0 && gap < minGap) minGap = gap;\n    }\n    if (!isFinite(minGap)) return Infinity;\n\n    const dataRange = nums[nums.length - 1] - nums[0];\n    if (dataRange <= 0) return Infinity;\n\n    const pixelsPerUnit = subplotDim * (count - 1) / (dataRange * count);\n    const maxWidth = Math.floor(minGap * pixelsPerUnit);\n    return Math.max(minSize, maxWidth);\n}\n\n/**\n * Adjust bar/rect marks for continuous-as-discrete axes.\n * v2 version: reads layout info from InstantiateContext.\n */\nexport function adjustBarMarks(spec: any, ctx: InstantiateContext): void {\n    const layout = ctx.layout;\n    for (const axis of ['x', 'y'] as const) {\n        const count = axis === 'x' ? layout.xContinuousAsDiscrete : layout.yContinuousAsDiscrete;\n        if (count <= 0) continue;\n        const enc = spec.encoding?.[axis];\n        if (enc?.bin) continue;\n\n        const effStep = axis === 'x' ? layout.xStep : layout.yStep;\n\n        const allMarkTypes = new Set<string>();\n        const mt = typeof spec.mark === 'string' ? spec.mark : spec.mark?.type;\n        if (mt) allMarkTypes.add(mt);\n        if (Array.isArray(spec.layer)) {\n            for (const layer of spec.layer) {\n                const lm = typeof layer.mark === 'string' ? layer.mark : layer.mark?.type;\n                if (lm) allMarkTypes.add(lm);\n            }\n        }\n        const sizeKey = allMarkTypes.has('rect')\n            ? (axis === 'x' ? 'width' : 'height')\n            : 'size';\n\n        const subplotDim = axis === 'x' ? layout.subplotWidth : layout.subplotHeight;\n        const isTemporal = enc?.type === 'temporal';\n        const maxSize = enc?.field\n            ? maxNonOverlapSize(enc.field, ctx.table, isTemporal, subplotDim, count)\n            : Infinity;\n        const cellSize = Math.max(2, Math.min(Math.round(effStep * 0.9), maxSize));\n\n        if (Array.isArray(spec.layer)) {\n            for (const layer of spec.layer) {\n                const lm = typeof layer.mark === 'string' ? layer.mark : layer.mark?.type;\n                if (lm === 'bar' || lm === 'rect') {\n                    layer.mark = setMarkProp(layer.mark, sizeKey, cellSize);\n                }\n            }\n        } else if (spec.mark) {\n            const markType = typeof spec.mark === 'string' ? spec.mark : spec.mark?.type;\n            if (markType === 'bar' || markType === 'rect') {\n                spec.mark = setMarkProp(spec.mark, sizeKey, cellSize);\n            }\n        }\n    }\n}\n\n/**\n * Adjust rect marks for edge-to-edge tiling on continuous axes.\n * v2 version: reads layout info from InstantiateContext.\n */\nexport function adjustRectTiling(spec: any, ctx: InstantiateContext): void {\n    const layout = ctx.layout;\n\n    for (const axis of ['x', 'y'] as const) {\n        const enc = spec.encoding?.[axis];\n        if (!enc?.field) continue;\n        const t = enc.type;\n        if (t === 'nominal' || t === 'ordinal') continue;\n        if (enc.aggregate) continue;\n\n        const uniqueVals = [...new Set(ctx.table.map((r: any) => r[enc.field]))];\n        const cardinality = uniqueVals.length;\n        if (cardinality <= 1) continue;\n\n        const count = axis === 'x' ? layout.xContinuousAsDiscrete : layout.yContinuousAsDiscrete;\n        const effStep = axis === 'x' ? layout.xStep : layout.yStep;\n        const pixelSpacing = count > 0 ? effStep * (count + 1) / count : effStep;\n\n        const subplotDim = axis === 'x' ? layout.subplotWidth : layout.subplotHeight;\n        const isTemporal = t === 'temporal';\n        const maxSize = maxNonOverlapSize(enc.field, ctx.table, isTemporal, subplotDim, count);\n        const cellSize = Math.max(1, Math.min(Math.floor(pixelSpacing * 0.98), maxSize));\n\n        const sizeKey = axis === 'x' ? 'width' : 'height';\n        spec.mark = setMarkProp(spec.mark, sizeKey, cellSize);\n    }\n}\n\n/**\n * Convert both positional axes to discrete types if they aren't already.\n * Returns resolvedTypes for layout declaration.\n */\nexport function ensureDiscreteTypes(\n    channelSemantics: Record<string, ChannelSemantics>,\n    table: any[],\n): Record<string, 'nominal' | 'ordinal' | 'quantitative' | 'temporal'> {\n    const resolvedTypes: Record<string, 'nominal' | 'ordinal' | 'quantitative' | 'temporal'> = {};\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (!cs?.field || isDiscrete(cs.type)) continue;\n        resolvedTypes[axis] = resolveDiscreteType(cs.type, cs.field, table);\n    }\n    return resolvedTypes;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { detectBandedAxisForceDiscrete } from '../../core/axis-detection';\nimport { planBandDodge, resolveDodge } from '../../core/band-dodge';\nimport {\n    defaultBuildEncodings, applyPointSizeScaling, setMarkProp,\n} from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n\n// Fraction of the band/lane step a boxplot box should occupy. An ungrouped box\n// fills most of its category band; a grouped (dodged) box fills most of its\n// per-subgroup lane. The remainder becomes the gap between adjacent boxes.\nconst BOXPLOT_BAND_FILL = 0.7;\nconst GROUPED_BOXPLOT_LANE_FILL = 0.85;\n// Vega-Lite's default discrete position band scale reserves ~20% of each step as\n// inter-band padding, so only ~80% of the step is usable drawing width. Grouped\n// box sizing must use this usable width when splitting a band into sub-lanes,\n// otherwise the boxes overshoot their lane pitch and overlap within a group.\nconst USABLE_BAND_FRACTION = 0.8;\n\nexport const scatterPlotDef: ChartTemplateDef = {\n    chart: \"Scatter Plot\",\n    template: { mark: \"circle\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"size\", \"shape\", \"opacity\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        // A `shape` encoding only renders distinct glyphs on the `point` mark;\n        // `circle` ignores it. Promote the mark when shape is in play.\n        if (spec.encoding?.shape?.field) {\n            spec.mark = setMarkProp(spec.mark, 'type', 'point');\n        }\n        applyPointSizeScaling(spec, ctx.table, ctx.canvasSize?.width, ctx.canvasSize?.height);\n        const config = ctx.chartProperties;\n        if (config?.opacity !== undefined && config.opacity < 1) {\n            spec.mark = setMarkProp(spec.mark, 'opacity', config.opacity);\n        }\n    },\n    properties: [\n        { key: \"opacity\", label: \"Opacity\", type: \"continuous\", min: 0.1, max: 1, step: 0.1, defaultValue: 1 },\n    ] as ChartPropertyDef[],\n    pivot: makeCartesianPivot({\n        // Flip the axes (orientation) as its own generator.\n        transpose: [['x', 'y']],\n        // x/y/color/size are peer measure channels: reassign a measure field\n        // between a precise axis and a demoted color/size channel. Profile typing\n        // prunes anything touching a discrete series; aux↔aux (color↔size) and\n        // x↔y (a transpose) are not offered here.\n        permute: [['x', 'y', 'color', 'size']],\n        // Route the discrete grouping field across color / facet channels so a\n        // grouped scatter and a faceted scatter are states of one another.\n        shift: ['color', 'group', 'column', 'row'],\n        // θ chart-type transitions (Scatter → Strip / Regression) are declared\n        // centrally in core/chart-transitions.ts, not on the template.\n    }),\n};\n\nexport const regressionDef: ChartTemplateDef = {\n    chart: \"Regression\",\n    template: {\n        layer: [\n            {\n                mark: \"circle\",\n                encoding: { x: {}, y: {}, color: {}, size: {} },\n            },\n            {\n                mark: { type: \"line\", color: \"red\" },\n                transform: [{ regression: \"field1\", on: \"field2\" }],\n                encoding: { x: {}, y: {} },\n            },\n        ],\n    },\n    channels: [\"x\", \"y\", \"size\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { x, y, color, size, column, row } = ctx.resolvedEncodings;\n        const config = ctx.chartProperties;\n        // x & y → both layers + transform field names\n        if (x) {\n            spec.layer[0].encoding.x = { ...spec.layer[0].encoding.x, ...x };\n            spec.layer[1].encoding.x = { ...spec.layer[1].encoding.x, ...x };\n            if (x.field) spec.layer[1].transform[0].on = x.field;\n        }\n        if (y) {\n            spec.layer[0].encoding.y = { ...spec.layer[0].encoding.y, ...y };\n            spec.layer[1].encoding.y = { ...spec.layer[1].encoding.y, ...y };\n            if (y.field) spec.layer[1].transform[0].regression = y.field;\n        }\n        // Regression method (default: linear)\n        const method = config?.regressionMethod;\n        if (method && method !== 'linear') {\n            spec.layer[1].transform[0].method = method;\n            // For polynomial, allow configurable order\n            if (method === 'poly') {\n                const order = config?.polyOrder ?? 3;\n                spec.layer[1].transform[0].order = order;\n            }\n        }\n        // color → scatter layer always; if present, also group regression by color field\n        if (color) {\n            spec.layer[0].encoding.color = { ...spec.layer[0].encoding.color, ...color };\n            if (color.field) {\n                // Group regression by color field so each class gets its own trend line\n                spec.layer[1].transform[0].groupby = [color.field];\n                // Pass color encoding to regression layer so lines match scatter colors\n                spec.layer[1].encoding.color = { ...color };\n                // Remove the hardcoded red so Vega-Lite uses the shared color scale\n                spec.layer[1].mark = { type: \"line\" };\n            }\n        }\n        if (size) spec.layer[0].encoding.size = { ...spec.layer[0].encoding.size, ...size };\n        // facets → top-level encoding\n        if (!spec.encoding) spec.encoding = {};\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n    },\n    properties: [\n        {\n            key: \"regressionMethod\", label: \"Method\", type: \"discrete\",\n            options: [\n                { value: \"linear\", label: \"Linear\" },\n                { value: \"log\",    label: \"Logarithmic\" },\n                { value: \"exp\",    label: \"Exponential\" },\n                { value: \"pow\",    label: \"Power\" },\n                { value: \"quad\",   label: \"Quadratic\" },\n                { value: \"poly\",   label: \"Polynomial\" },\n            ],\n            defaultValue: \"linear\",\n        },\n        {\n            key: \"polyOrder\", label: \"Poly Order\", type: \"continuous\",\n            min: 2, max: 10, step: 1, defaultValue: 3,\n        },\n    ] as ChartPropertyDef[],\n    // A regression is a scatter with a fitted trend, so it shares the scatter's\n    // local rearrangement group: flip the axes, demote a measure to color/size,\n    // and route a discrete series across color / facet channels. (θ chart-type\n    // transitions are declared centrally in core/chart-transitions.ts.)\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color', 'size']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n\nexport const rangedDotPlotDef: ChartTemplateDef = {\n    chart: \"Ranged Dot Plot\",\n    template: {\n        encoding: {},\n        layer: [\n            { mark: \"line\", encoding: { detail: {} } },\n            { mark: { type: \"point\", filled: true }, encoding: { color: {} } },\n        ],\n    },\n    channels: [\"x\", \"y\", \"color\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { color, ...rest } = ctx.resolvedEncodings;\n        if (!spec.encoding) spec.encoding = {};\n        for (const [ch, enc] of Object.entries(rest)) {\n            spec.encoding[ch] = { ...(spec.encoding[ch] || {}), ...enc };\n        }\n        if (color) {\n            spec.layer[1].encoding.color = { ...(spec.layer[1].encoding.color || {}), ...color };\n        }\n\n        // Copy nominal axis into detail encoding for line layer\n        if (spec.encoding.y?.type === \"nominal\") {\n            spec.layer[0].encoding.detail = JSON.parse(JSON.stringify(spec.encoding.y));\n        } else if (spec.encoding.x?.type === \"nominal\") {\n            spec.layer[0].encoding.detail = JSON.parse(JSON.stringify(spec.encoding.x));\n        }\n    },\n};\n\nexport const boxplotDef: ChartTemplateDef = {\n    chart: \"Boxplot\",\n    template: { mark: \"boxplot\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"opacity\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        if (!cs.x?.field || !cs.y?.field) return {};\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        if (!result) return {};\n        // Decide whether `color` dodges the banded axis into side-by-side\n        // sub-lanes, or is redundant/nested with it (one full-width box per\n        // band). Shared with `instantiate` via `planBandDodge` so the band\n        // budget and the box size agree. Honors the `dodge` override.\n        let colorActsAsGroup = false;\n        let groupLaneCount: number | undefined;\n        const colorField = cs.color?.field;\n        const axisField = cs[result.axis]?.field;\n        if (colorField && axisField && isDiscreteType(cs.color?.type)) {\n            const plan = planBandDodge(table, axisField, colorField, {\n                nestedSnapThreshold: chartProperties?.nestedSnapThreshold,\n            });\n            const { mode } = resolveDodge(plan, chartProperties?.dodge);\n            colorActsAsGroup = mode !== 'none';\n            // `local` budgets only maxPerBand lanes per band (compact).\n            if (mode === 'local') groupLaneCount = Math.max(1, plan.maxPerBand);\n        }\n        return {\n            axisFlags: { [result.axis]: { banded: true } },\n            resolvedTypes: result.resolvedTypes,\n            paramOverrides: { defaultBandSize: 28 },  // box+whisker needs wider bands\n            colorActsAsGroup,  // dodge-by-color → budget band per category, shrink lanes\n            ...(groupLaneCount ? { groupLaneCount } : {}),\n        };\n    },\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        // Whisker convention + outlier visibility (design choices, not styling).\n        //   whiskerMethod 'minmax' → whiskers span the full data range; VL draws\n        //     no outlier points (they are inside the whiskers by definition).\n        //   whiskerMethod 'iqr' (default) → Tukey 1.5×IQR whiskers; points beyond\n        //     the fences render as outliers unless suppressed.\n        const props = ctx.chartProperties;\n        const useMinMax = props?.whiskerMethod === 'minmax';\n        if (useMinMax) {\n            spec.mark = setMarkProp(spec.mark, 'extent', 'min-max');\n        }\n        // `showOutliers` defaults to true. With min-max whiskers there are no\n        // outliers anyway, so hiding them is implicit.\n        if (useMinMax || props?.showOutliers === false) {\n            spec.mark = setMarkProp(spec.mark, 'outliers', false);\n        }\n\n        const layout = ctx.layout;\n        const hasDiscreteX = layout.xNominalCount > 0;\n        const hasDiscreteAxis = hasDiscreteX || layout.yNominalCount > 0;\n\n        // Grouped boxplots: a color field subdividing a categorical axis must\n        // dodge the boxes side-by-side (xOffset/yOffset), not overlay them at the\n        // same position — overlaid boxes hide whichever is drawn underneath.\n        // Vega-Lite needs an explicit offset encoding to lay grouped boxes out.\n        // But only dodge when color actually subdivides a band: when it's\n        // redundant/nested with the axis (`color == x`, or a 1:1 field pair),\n        // `planBandDodge` returns `dodge:false` and we fall through to the\n        // single-band branch below (one full-width box per category).\n        const colorEnc = spec.encoding?.color;\n        let subgroups = 1;\n        let localSeparatorAxis: 'x' | 'y' | undefined;\n        let localSeparatorValues: Record<string, unknown>[] = [];\n        const colorField = ctx.channelSemantics?.color?.field;\n        const axisField = hasDiscreteX\n            ? ctx.channelSemantics?.x?.field\n            : ctx.channelSemantics?.y?.field;\n        if (\n            colorEnc?.field && colorField && axisField\n            && isDiscreteType(ctx.channelSemantics?.color?.type)\n            && hasDiscreteAxis && !spec.encoding.xOffset && !spec.encoding.yOffset\n        ) {\n            const plan = planBandDodge(ctx.fullTable ?? ctx.table, axisField, colorField, {\n                nestedSnapThreshold: ctx.chartProperties?.nestedSnapThreshold,\n            });\n            const resolved = resolveDodge(plan, ctx.chartProperties?.dodge);\n            if (resolved.mode !== 'none') {\n                const offsetChannel = hasDiscreteX ? 'xOffset' : 'yOffset';\n                subgroups = Math.max(1, resolved.laneCount);\n                if (resolved.mode === 'local') {\n                    // Compact + centered: a quantitative offset over the band's\n                    // [-0.5, 0.5] range places each band's boxes centered, using\n                    // only maxPerBand lanes. Native axis labels stay centered.\n                    const maxPB = Math.max(1, plan.maxPerBand);\n                    spec.encoding[offsetChannel] = {\n                        field: '__off', type: 'quantitative',\n                        scale: { domain: [-0.5, 0.5] }, axis: null,\n                    };\n                    spec.transform = [\n                        ...(spec.transform ?? []),\n                        { window: [{ op: 'dense_rank', as: '__laneIdx' }], groupby: [axisField], sort: [{ field: colorField, order: 'ascending' }] },\n                        { joinaggregate: [{ op: 'distinct', field: colorField, as: '__localCount' }], groupby: [axisField] },\n                        { calculate: `((datum.__laneIdx - 1) - (datum.__localCount - 1) / 2) / ${maxPB}`, as: '__off' },\n                    ];\n                    localSeparatorAxis = hasDiscreteX ? 'x' : 'y';\n                    const categories = [...new Set((ctx.fullTable ?? ctx.table).map((row) => row[axisField]))];\n                    localSeparatorValues = categories.slice(0, -1).map((category) => ({ [axisField]: category }));\n                } else {\n                    // Global: a fixed lane per distinct color across all bands.\n                    const offsetEnc: Record<string, unknown> = { field: colorEnc.field, type: 'nominal' };\n                    if (colorEnc.sort !== undefined) offsetEnc.sort = colorEnc.sort;\n                    spec.encoding[offsetChannel] = offsetEnc;\n                }\n            }\n        }\n\n        // Scale box width to the step size of the discrete axis. Each band is\n        // subdivided into `subgroups` sub-lanes. VL's position band reserves ~20%\n        // of the step as inter-band padding (both the nominal `global` offset and\n        // the quantitative `local` offset map into that ~80% usable width), so the\n        // per-lane pitch is `step * USABLE_BAND_FRACTION / subgroups`.\n        if (hasDiscreteAxis) {\n            const boxStep = hasDiscreteX ? layout.xStep : layout.yStep;\n            if (subgroups > 1) {\n                const lanePitch = (boxStep * USABLE_BAND_FRACTION) / subgroups;\n                const boxSize = Math.max(2, Math.round(lanePitch * GROUPED_BOXPLOT_LANE_FILL));\n                spec.mark = setMarkProp(spec.mark, 'size', boxSize);\n            } else {\n                const boxSize = Math.max(4, Math.round(boxStep * BOXPLOT_BAND_FILL));\n                spec.mark = setMarkProp(spec.mark, 'size', boxSize);\n            }\n        }\n\n        if (localSeparatorAxis && localSeparatorValues.length > 0) {\n            const boxLayer = { mark: spec.mark, encoding: spec.encoding, transform: spec.transform };\n            const axisEncoding = spec.encoding[localSeparatorAxis];\n            spec.layer = [\n                {\n                    data: { values: localSeparatorValues },\n                    mark: { type: 'rule', stroke: '#c9ced6', strokeDash: [4, 4], strokeWidth: 1, opacity: 0.75 },\n                    encoding: {\n                        [localSeparatorAxis]: {\n                            field: axisField,\n                            type: 'nominal',\n                            sort: axisEncoding.sort,\n                            bandPosition: 1,\n                        },\n                    },\n                },\n                boxLayer,\n            ];\n            delete spec.mark;\n            delete spec.encoding;\n            delete spec.transform;\n        }\n    },\n    properties: [\n        {\n            key: 'whiskerMethod', label: 'Whiskers', type: 'discrete',\n            options: [\n                { value: 'iqr', label: 'Tukey (1.5 × IQR)' },\n                { value: 'minmax', label: 'Min–Max' },\n            ],\n            defaultValue: 'iqr',\n        },\n        {\n            key: 'showOutliers', label: 'Outliers', type: 'binary', defaultValue: true,\n            // Outliers exist only with Tukey whiskers; min–max whiskers absorb\n            // every point, so the toggle is irrelevant there.\n            check: (ctx) => ({ applicable: ctx.chartProperties?.whiskerMethod !== 'minmax' }),\n        },\n        {\n            key: 'dodge', label: 'Dodge', type: 'discrete',\n            options: [\n                { value: 'auto',   label: 'Auto' },\n                { value: 'local',  label: 'Local (compact)' },\n                { value: 'global', label: 'Global (aligned)' },\n            ],\n            defaultValue: 'auto',\n            // Surface whenever color genuinely subdivides a band (maxPerBand > 1),\n            // so the user can pick none / local / global; the compiler default is\n            // reported as `recommendedValue`.\n            check: (ctx) => {\n                const colorField = ctx.channelSemantics?.color?.field;\n                const xType = ctx.channelSemantics?.x?.type;\n                const axisField = isDiscreteType(xType)\n                    ? ctx.channelSemantics?.x?.field\n                    : ctx.channelSemantics?.y?.field;\n                const rows = ctx.data;\n                if (!colorField || !axisField || !isDiscreteType(ctx.channelSemantics?.color?.type) || !rows) {\n                    return { applicable: false };\n                }\n                const plan = planBandDodge(rows, axisField, colorField, {\n                    nestedSnapThreshold: ctx.chartProperties?.nestedSnapThreshold,\n                });\n                return {\n                    applicable: plan.ambiguous,\n                    recommendedValue: plan.mode === 'none' ? 'auto' : plan.mode,\n                };\n            },\n        },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite Connected Scatter Plot template.\n *\n * Points are plotted in 2-D (x, y both quantitative) and **connected by a\n * straight line in a defined order** (usually time / sequence), tracing a\n * trajectory through the space. It shows the x↔y correlation AND the ordered\n * path at once — distinct from a plain Scatter Plot (no order, no line) and from\n * Regression (a fitted trend, not the observed path).\n *\n * This mirrors scatter.ts for the points and line.ts / bump.ts for the\n * connecting line + order handling.\n *\n * Contract:\n *   x      — quantitative position.\n *   y      — quantitative position.\n *   order  — the sequence field (temporal or numeric/index) that defines the\n *            connection order. The line follows THIS field, never the x value,\n *            so a looping / back-tracking path renders as a self-crossing\n *            trajectory.\n *   color  — optional series → one trajectory (line) per value (legend).\n *   detail — optional series → one trajectory per value without a color legend.\n *\n * The line is always straight (interpolate: linear — never monotone/smooth) and\n * shows a point marker at every observation.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { defaultBuildEncodings } from './utils';\n\n/**\n * Pick a *sortable* Vega-Lite type for the order encoding. The order channel\n * drives the line's connection order, so it must sort meaningfully:\n *   - temporal fields sort chronologically;\n *   - numeric fields (years, step indices, …) sort numerically — even when the\n *     resolver classified them as ordinal/nominal, we coerce to quantitative so\n *     VL orders 1,2,3,…10 rather than by an arbitrary domain order;\n *   - anything else keeps its resolved discrete type.\n */\nfunction resolveOrderType(\n    csType: string | undefined,\n    field: string,\n    table: any[],\n): 'temporal' | 'quantitative' | 'ordinal' | 'nominal' {\n    const values = table.map(r => r[field]).filter(v => v != null && v !== '');\n    const allNumeric = values.length > 0 &&\n        values.every(v => typeof v === 'number' ||\n            (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))));\n    // Numeric sequence fields (years, step indices, …) sort numerically — even\n    // when the resolver classified them as temporal/ordinal — so the line walks\n    // 1,2,3,…10 rather than by an epoch-ms or arbitrary domain order.\n    if (allNumeric) return 'quantitative';\n    if (csType === 'temporal') return 'temporal';\n    return (csType === 'ordinal' || csType === 'nominal') ? csType : 'nominal';\n}\n\nexport const connectedScatterDef: ChartTemplateDef = {\n    chart: \"Connected Scatter Plot\",\n    template: {\n        mark: { type: \"line\", point: true, interpolate: \"linear\", strokeWidth: 2 },\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"order\", \"color\", \"detail\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        const xEnc = spec.encoding?.x;\n        const yEnc = spec.encoding?.y;\n        if (!xEnc || !yEnc) return;\n\n        // The connecting line must follow the sequence field, NOT the x value.\n        // Build the order encoding explicitly so it sorts meaningfully and is\n        // never polluted by the generic discrete-axis `sort: null` machinery.\n        const orderCS = ctx.channelSemantics.order;\n        if (orderCS?.field) {\n            spec.encoding.order = {\n                field: orderCS.field,\n                type: resolveOrderType(orderCS.type, orderCS.field, ctx.table),\n            };\n        } else {\n            // Fallback: no explicit order field → connect in data (row) order.\n            // VL has no row-index primitive, so we leave the line unordered and\n            // let VL connect by x; the order channel is the documented way to\n            // get a true trajectory, and every bundled example provides it.\n            delete spec.encoding.order;\n        }\n\n        // Clean, data-fitting bounds via Vega-Lite's native `nice`. The\n        // zero-baseline is left to the engine (computeZeroDecision), same as any\n        // other position chart. IMPORTANT: no pixel `scale.padding` here —\n        // padding expands the domain symmetrically and, combined with `nice`,\n        // can round a zero-anchored axis *below* zero on strictly-positive data\n        // (e.g. gas price rounding to -0.5). `nice` alone gives clean,\n        // non-negative bounds.\n        xEnc.scale = { ...xEnc.scale, nice: true };\n        yEnc.scale = { ...yEnc.scale, nice: true };\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport { makeSortAction } from '../../core/encoding-actions';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { planBandDodge, resolveDodge } from '../../core/band-dodge';\nimport { snapToBoundHeuristic } from '../../core/field-semantics';\nimport {\n    detectBandedAxisFromSemantics, detectBandedAxisForceDiscrete,\n} from '../../core/axis-detection';\nimport {\n    defaultBuildEncodings, setMarkProp, adjustBarMarks, adjustRectTiling,\n    resolveAsDiscrete,\n} from './utils';\n\nconst HEATMAP_SCHEME_COLORS: Record<string, [string, string]> = {\n    viridis: ['#440154', '#fde725'],\n    inferno: ['#000004', '#fcffa4'],\n    magma: ['#000004', '#fcfdbf'],\n    plasma: ['#0d0887', '#f0f921'],\n    turbo: ['#30123b', '#7a0403'],\n    blues: ['#f7fbff', '#08519c'],\n    reds: ['#fff5f0', '#a50f15'],\n    greens: ['#f7fcf5', '#00441b'],\n    oranges: ['#fff5eb', '#7f2704'],\n    purples: ['#fcfbfd', '#3f007d'],\n    greys: ['#ffffff', '#252525'],\n};\n\nconst DEFAULT_HEATMAP_SCHEME = 'blues';\n\nfunction isDivergingHeatmapScheme(scheme: string | undefined): boolean {\n    return scheme === 'blueorange' || scheme === 'redblue';\n}\n\nfunction hexLuma(hex: string): number {\n    const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n    if (!m) return 0;\n    const n = parseInt(m[1], 16);\n    const r = (n >> 16) & 255;\n    const g = (n >> 8) & 255;\n    const b = n & 255;\n    return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n}\n\nfunction getSafeHeatmapIntrinsicDomain(ctx: any, colorField: string | undefined): [number, number] | undefined {\n    if (!colorField) return undefined;\n\n    const colorChannel = ctx.channelSemantics?.color;\n    const annotation = colorChannel?.semanticAnnotation;\n\n    if (annotation?.intrinsicDomain) {\n        return annotation.intrinsicDomain;\n    }\n\n    const semanticType = annotation?.semanticType;\n    if (semanticType === 'Correlation') return [-1, 1];\n    if (semanticType === 'Latitude') return [-90, 90];\n    if (semanticType === 'Longitude') return [-180, 180];\n\n    return undefined;\n}\n\n// ─── Bar Chart ──────────────────────────────────────────────────────────────\n\nexport const barChartDef: ChartTemplateDef = {\n    chart: \"Bar Chart\",\n    template: { mark: \"bar\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"opacity\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        const config = ctx.chartProperties;\n        if (config && config.cornerRadius > 0) {\n            spec.mark = setMarkProp(spec.mark, 'cornerRadius', config.cornerRadius);\n        }\n        adjustBarMarks(spec, ctx);\n    },\n    properties: [\n        { key: \"cornerRadius\", label: \"Corners\", type: \"continuous\", min: 0, max: 15, step: 1, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n\n// ─── Pyramid Chart ──────────────────────────────────────────────────────────\n\nexport const pyramidChartDef: ChartTemplateDef = {\n    chart: \"Pyramid Chart\",\n    template: {\n        spacing: 0,\n        resolve: { scale: { y: \"shared\" } },\n        hconcat: [\n            {\n                mark: \"bar\",\n                encoding: {\n                    y: {},\n                    x: { scale: { reverse: true }, stack: null },\n                    opacity: { value: 0.9 },\n                    color: { value: \"#4e79a7\" },\n                },\n            },\n            {\n                mark: \"bar\",\n                encoding: {\n                    y: { axis: null },\n                    x: { stack: null },\n                    opacity: { value: 0.9 },\n                    color: { value: \"#e15759\" },\n                },\n            },\n        ],\n        config: { view: { stroke: null }, axis: { grid: false } },\n    },\n    channels: [\"x\", \"y\", \"color\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({\n        axisFlags: { y: { banded: true } },\n    }),\n    instantiate: (spec, ctx) => {\n        let { y, x } = ctx.resolvedEncodings;\n        const { color } = ctx.resolvedEncodings;\n\n        // Auto-detect flipped axes\n        const isDiscreteType = (enc: any) => enc && (enc.type === 'nominal' || enc.type === 'ordinal');\n        const isQuant = (enc: any) => enc && (enc.type === 'quantitative' || enc.type === 'temporal');\n        if (isDiscreteType(x) && isQuant(y)) {\n            [x, y] = [y, x];\n        }\n\n        // y → both panels (shared category axis, always discrete)\n        if (y) {\n            const yEnc = { ...y };\n            resolveAsDiscrete(yEnc, ctx.table);\n            spec.hconcat[0].encoding.y = { ...spec.hconcat[0].encoding.y, ...yEnc };\n            spec.hconcat[1].encoding.y = { ...spec.hconcat[1].encoding.y, ...yEnc };\n        }\n        // x → both panels\n        if (x) {\n            spec.hconcat[0].encoding.x = { ...spec.hconcat[0].encoding.x, ...x };\n            spec.hconcat[1].encoding.x = { ...spec.hconcat[1].encoding.x, ...x };\n        }\n\n        // --- Pyramid-specific configuration ---\n        const colorField = color?.field;\n        const table = ctx.table;\n        const canvasSize = ctx.canvasSize;\n\n        try {\n            if (table && colorField) {\n                const groups = [...new Set(table.map(r => r[colorField]))] as string[];\n                const leftGroup = groups[0];\n                const rightGroup = groups.length > 1 ? groups[1] : groups[0];\n\n                spec.hconcat[0].transform = [{ filter: { field: colorField, equal: leftGroup } }];\n                spec.hconcat[1].transform = [{ filter: { field: colorField, equal: rightGroup } }];\n                spec.hconcat[0].title = String(leftGroup);\n                spec.hconcat[1].title = String(rightGroup);\n\n                if (groups.length > 2) {\n                    if (!spec._warnings) spec._warnings = [];\n                    spec._warnings.push({\n                        severity: 'warning',\n                        code: 'too-many-groups-pyramid',\n                        message: `Pyramid chart works best with exactly 2 groups, but found ${groups.length} (${groups.map((g: string) => `'${g}'`).join(', ')}). Only the first two are shown.`,\n                        channel: 'color',\n                        field: colorField,\n                    });\n                }\n            }\n\n            if (table) {\n                const xField = spec.hconcat[0].encoding.x?.field;\n                if (xField) {\n                    const allVals = table.map(r => r[xField]).filter((v: any) => typeof v === 'number');\n                    if (allVals.length > 0) {\n                        const domain = [Math.min(0, ...allVals), Math.max(...allVals)];\n                        spec.hconcat[0].encoding.x.scale = { ...spec.hconcat[0].encoding.x.scale, domain };\n                        spec.hconcat[1].encoding.x.scale = { ...spec.hconcat[1].encoding.x.scale, domain };\n                    }\n                    if (allVals.some((v: number) => v < 0)) {\n                        if (!spec._warnings) spec._warnings = [];\n                        spec._warnings.push({\n                            severity: 'warning',\n                            code: 'negative-values-pyramid',\n                            message: `Negative values detected in '${xField}'. Pyramid charts work best with non-negative values.`,\n                            channel: 'x',\n                            field: xField,\n                        });\n                    }\n                }\n\n                const baseWidth = canvasSize?.width ?? 400;\n                const baseHeight = canvasSize?.height ?? 320;\n\n                const facetCols = 2;\n                const facetStretch = Math.min(1.5, Math.pow(facetCols, 0.3));\n                const panelWidth = Math.round(Math.max(40, baseWidth * facetStretch / facetCols));\n\n                const yField = spec.hconcat[0].encoding.y?.field;\n                let panelHeight = baseHeight;\n                if (yField) {\n                    const yCardinality = new Set(table.map(r => r[yField])).size;\n                    const baseRefSize = 300;\n                    const sizeRatio = Math.max(baseWidth, baseHeight) / baseRefSize;\n                    const defaultStep = Math.round(20 * Math.max(1, sizeRatio));\n                    if (yCardinality > 0) {\n                        const pressure = (yCardinality * defaultStep) / baseHeight;\n                        if (pressure > 1) {\n                            const stretch = Math.min(2, Math.pow(pressure, 0.5));\n                            panelHeight = Math.round(baseHeight * stretch);\n                        }\n                    }\n                }\n\n                for (const panel of spec.hconcat) {\n                    panel.width = panelWidth;\n                    panel.height = panelHeight;\n                }\n            }\n        } catch {\n            // ignore errors\n        }\n    },\n};\n\n// ─── Grouped Bar Chart ──────────────────────────────────────────────────────\n\nexport const groupedBarChartDef: ChartTemplateDef = {\n    chart: \"Grouped Bar Chart\",\n    template: { mark: \"bar\", encoding: {} },\n    channels: [\"x\", \"y\", \"group\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        const axis = result?.axis || 'x';\n\n        const decl: import('../../core/types').LayoutDeclaration = {\n            axisFlags: { [axis]: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n        // `local` dodge budgets only maxPerBand lanes per band (compact), so the\n        // band isn't sized for the full global group domain.\n        const groupField = cs.group?.field;\n        const axisField = cs[axis]?.field;\n        if (groupField && axisField) {\n            const plan = planBandDodge(table, axisField, groupField);\n            const { mode } = resolveDodge(plan, chartProperties?.dodge);\n            if (mode === 'local') decl.groupLaneCount = Math.max(1, plan.maxPerBand);\n        }\n        return decl;\n    },\n    instantiate: (spec, ctx) => {\n        // resolvedEncodings already includes color + xOffset/yOffset from group channel\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        adjustBarMarks(spec, ctx);\n\n        // `local` dodge: replace the global group offset with a per-band lane\n        // index so each band is subdivided into only maxPerBand lanes (compact),\n        // rather than the full global grid. Native x labels stay centered.\n        const offsetCh = spec.encoding?.xOffset ? 'xOffset' : spec.encoding?.yOffset ? 'yOffset' : undefined;\n        const groupField = ctx.channelSemantics?.group?.field;\n        const xDisc = ctx.channelSemantics?.x?.type === 'nominal' || ctx.channelSemantics?.x?.type === 'ordinal';\n        const axisField = xDisc ? ctx.channelSemantics?.x?.field : ctx.channelSemantics?.y?.field;\n        if (offsetCh && groupField && axisField) {\n            const plan = planBandDodge(ctx.fullTable ?? ctx.table, axisField, groupField);\n            const { mode } = resolveDodge(plan, ctx.chartProperties?.dodge);\n            if (mode === 'local') {\n                const maxPB = Math.max(1, plan.maxPerBand);\n                // Center each band's items with a QUANTITATIVE offset in the\n                // band's [-0.5, 0.5] range: a single-item band sits at the band\n                // centre, a partial cluster is centred (not left-anchored). The\n                // native band x-axis is kept, so group labels stay centred.\n                spec.encoding[offsetCh] = {\n                    field: '__off', type: 'quantitative',\n                    scale: { domain: [-0.5, 0.5] }, axis: null, title: null,\n                };\n                spec.transform = [\n                    ...(spec.transform ?? []),\n                    { window: [{ op: 'dense_rank', as: '__laneIdx' }], groupby: [axisField], sort: [{ field: groupField, order: 'ascending' }] },\n                    { joinaggregate: [{ op: 'distinct', field: groupField, as: '__localCount' }], groupby: [axisField] },\n                    { calculate: `((datum.__laneIdx - 1) - (datum.__localCount - 1) / 2) / ${maxPB}`, as: '__off' },\n                ];\n                // Constant bar width ≈ 85% of a lane. VL's band reserves ~20%\n                // padding, so the usable per-lane pitch is (band·0.8 / maxPerBand).\n                const band = offsetCh === 'xOffset' ? ctx.layout?.xStep : ctx.layout?.yStep;\n                if (band) {\n                    spec.mark = setMarkProp(spec.mark, 'size', Math.max(2, Math.round((band * 0.8 / maxPB) * 0.85)));\n                }\n            }\n        }\n    },\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    properties: [\n        {\n            key: 'dodge', label: 'Dodge', type: 'discrete',\n            options: [\n                { value: 'auto',   label: 'Auto' },\n                { value: 'local',  label: 'Local (compact)' },\n                { value: 'global', label: 'Global (aligned)' },\n            ],\n            defaultValue: 'auto',\n            // The `group` field is what subdivides each category band.\n            check: (ctx) => {\n                const isDisc = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n                const groupField = ctx.channelSemantics?.group?.field ?? ctx.encodings?.group?.field;\n                const axisField = isDisc(ctx.channelSemantics?.x?.type)\n                    ? ctx.channelSemantics?.x?.field\n                    : ctx.channelSemantics?.y?.field;\n                const rows = ctx.data;\n                if (!groupField || !axisField || !rows) return { applicable: false };\n                const plan = planBandDodge(rows, axisField, groupField);\n                return { applicable: plan.ambiguous, recommendedValue: plan.mode === 'none' ? 'auto' : plan.mode };\n            },\n        },\n    ] as ChartPropertyDef[],\n    // Chart-type transition: the dodge series (`group`) becomes a stacked series\n    // (`color`), re-rendering as a Stacked Bar Chart. Plus the orientation flip,\n    // role swap (banded axis ↔ series), and series routing to column/row facets.\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Stacked Bar) is declared centrally in core/chart-transitions.ts.\n    }),\n};\n\n// ─── Stacked Bar Chart ──────────────────────────────────────────────────────\n\nexport const stackedBarChartDef: ChartTemplateDef = {\n    chart: \"Stacked Bar Chart\",\n    template: { mark: \"bar\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        // Apply stack mode\n        const config = ctx.chartProperties;\n        const hasStackSeries = !!ctx.channelSemantics.color?.field;\n        if (config?.stackMode && hasStackSeries) {\n            for (const axis of ['x', 'y'] as const) {\n                if (spec.encoding?.[axis]?.type === 'quantitative' ||\n                    spec.encoding?.[axis]?.aggregate) {\n                    spec.encoding[axis].stack = config.stackMode === 'layered' ? null : config.stackMode;\n                    break;\n                }\n            }\n        }\n        adjustBarMarks(spec, ctx);\n    },\n    properties: [\n        { key: \"stackMode\", label: \"Stack\", type: \"discrete\",\n          // A stack mode only does something when a series dimension (color) is\n          // present to stack; without it there is a single bar per category.\n          check: (ctx) => ({ applicable: !!ctx.encodings.color?.field }),\n          options: [\n            { value: undefined, label: \"Stacked (default)\" },\n            { value: \"normalize\", label: \"Normalize (100%)\" },\n            { value: \"center\", label: \"Center\" },\n        ] },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    // Chart-type transition: the stacked series (`color`) becomes a dodge series\n    // (`group`), re-rendering as a Grouped Bar Chart. Offered only when the series\n    // cardinality is small enough to dodge readably. Plus the orientation flip,\n    // role swap (banded axis ↔ series), and series routing to column/row facets.\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Grouped Bar) is declared centrally in core/chart-transitions.ts.\n    }),\n};\n\n// ─── Histogram ──────────────────────────────────────────────────────────────\n\nexport const histogramDef: ChartTemplateDef = {\n    chart: \"Histogram\",\n    template: {\n        mark: \"bar\",\n        encoding: {\n            x: { bin: true },\n            y: { aggregate: \"count\" },\n        },\n    },\n    channels: [\"x\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        // `binCount` is the maxbins cap; 0 (auto) leaves the template's `bin: true`\n        // so Vega chooses. maxbins is only an upper bound — Vega snaps to \"nice\"\n        // boundaries, so the rendered count is usually a bit below the cap.\n        const binCount = ctx.chartProperties?.binCount;\n        if (binCount && spec.encoding?.x) {\n            spec.encoding.x.bin = { maxbins: binCount };\n        }\n        adjustBarMarks(spec, ctx);\n    },\n    properties: [\n        // 0 == auto (let the engine choose); 5–50 caps the bins (maxbins).\n        { key: \"binCount\", label: \"Max Bins\", type: \"continuous\", min: 5, max: 50, step: 1, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    // A histogram has a single bound field (x); its y is a computed count, so\n    // there is no τ transpose or σ permute. `shift` routes a discrete series to\n    // the legend/facets, and the θ transition re-renders the same field as a\n    // smooth kernel Density Plot.\n    pivot: makeCartesianPivot({\n        shift: ['color', 'column', 'row'],\n        // θ (→ Density Plot / ECDF) is declared centrally in core/chart-transitions.ts.\n    }),\n};\n\n// ─── Heatmap ────────────────────────────────────────────────────────────────\n\nexport const heatmapDef: ChartTemplateDef = {\n    chart: \"Heatmap\",\n    template: { mark: \"rect\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'color',\n    declareLayoutMode: (_cs, _table, chartProperties) => {\n        const showTextLabels = !!chartProperties?.showTextLabels;\n        return {\n            axisFlags: { x: { banded: true }, y: { banded: true } },\n            // Labels need slightly larger cells so the value text isn't crushed,\n            // but we keep this close to the unlabeled defaults (minStep 6 /\n            // defaultBandSize 20) so a labeled heatmap doesn't balloon. The small\n            // label font (see instantiate) is what lets these stay compact.\n            paramOverrides: showTextLabels\n                ? { minStep: 9, defaultBandSize: 22 }\n                : undefined,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        // Apply color scheme from chart properties\n        const config = ctx.chartProperties;\n        const showTextLabels = !!config?.showTextLabels;\n        const colorField = spec.encoding?.color?.field;\n        const colorVals = colorField\n            ? ctx.table\n                .map((r: any) => Number(r[colorField]))\n                .filter((v: number) => Number.isFinite(v))\n            : [];\n        const observedMin = colorVals.length > 0 ? Math.min(...colorVals) : 0;\n        const observedMax = colorVals.length > 0 ? Math.max(...colorVals) : 1;\n        const existingScheme = spec.encoding?.color?.scale?.scheme;\n        // Color scheme is a Category-B encoding override: the compiler already\n        // composed chartProperties.colorScheme onto encoding.color.scheme before\n        // assembly (see applyEncodingOverrides), so we just read it here. This\n        // also transparently covers charts saved before the migration, whose\n        // value lived in chartProperties.colorScheme.\n        const encScheme = ctx.encodings?.color?.scheme;\n        const userScheme = (encScheme && encScheme !== 'default') ? encScheme : undefined;\n        const semanticScheme = ctx.channelSemantics?.color?.colorScheme;\n        const semanticIsDiverging = semanticScheme?.type === 'diverging';\n        const colorEncodingType = spec.encoding?.color?.type;\n        const shouldUseHeatmapDefault = !userScheme\n            && !semanticIsDiverging\n            && !isDivergingHeatmapScheme(existingScheme)\n            && colorEncodingType !== 'nominal';\n        const schemeName = userScheme\n            || (semanticIsDiverging ? (existingScheme || 'redblue') : undefined)\n            || (shouldUseHeatmapDefault ? DEFAULT_HEATMAP_SCHEME : existingScheme);\n        const isDiverging = isDivergingHeatmapScheme(schemeName);\n        const intrinsicDomain = getSafeHeatmapIntrinsicDomain(ctx, colorField);\n\n        let effectiveMin = intrinsicDomain?.[0] ?? observedMin;\n        let effectiveMax = intrinsicDomain?.[1] ?? observedMax;\n\n        if (spec.encoding?.color) {\n            if (!spec.encoding.color.scale) spec.encoding.color.scale = {};\n            if (schemeName) {\n                spec.encoding.color.scale.scheme = schemeName;\n            }\n            if (isDiverging && effectiveMin < 0 && effectiveMax > 0) {\n                const sym = Math.max(Math.abs(effectiveMin), Math.abs(effectiveMax));\n                effectiveMin = -sym;\n                effectiveMax = sym;\n                spec.encoding.color.scale.domain = [-sym, sym];\n                spec.encoding.color.scale.domainMid = 0;\n            } else if (intrinsicDomain) {\n                // Sequential color with a known intrinsic domain (e.g. a\n                // Percentage field with [0, 100]). Don't force the full\n                // theoretical range — that washes out the scale when every\n                // value is concentrated low (all cells look pale because the\n                // legend stretches to 100%). Snap to an intrinsic bound only\n                // when the data actually approaches it; otherwise fit the\n                // color domain to the observed data range. Mirrors the\n                // snap-to-bound behaviour already used on the x/y axes.\n                const snapped = snapToBoundHeuristic(intrinsicDomain, colorVals);\n                effectiveMin = snapped?.min ?? observedMin;\n                effectiveMax = snapped?.max ?? observedMax;\n                spec.encoding.color.scale.domain = [effectiveMin, effectiveMax];\n            }\n        }\n        adjustBarMarks(spec, ctx);\n        adjustRectTiling(spec, ctx);\n\n        if (showTextLabels && spec.encoding?.color?.field) {\n            const baseEncoding = spec.encoding || {};\n            const xEncoding = baseEncoding.x;\n            const yEncoding = baseEncoding.y;\n            const span = effectiveMax - effectiveMin;\n\n            const cellMinDim = Math.min(ctx.layout.xStep || 50, ctx.layout.yStep || 50);\n            // Keep the in-cell value text small so cells can stay compact (close\n            // to the unlabeled heatmap). Cap at 9px and step down for tighter\n            // cells rather than growing the font/cells to fit it.\n            const labelFontSize = cellMinDim >= 40 ? 9 : cellMinDim >= 28 ? 8 : 7;\n            const labelFormat = cellMinDim >= 44 ? '.2f' : '.1f';\n\n            const sequentialPalette = HEATMAP_SCHEME_COLORS[schemeName || DEFAULT_HEATMAP_SCHEME] || HEATMAP_SCHEME_COLORS[DEFAULT_HEATMAP_SCHEME];\n            const highIsLight = hexLuma(sequentialPalette[1]) >= hexLuma(sequentialPalette[0]);\n            const strongThreshold = span > 0\n                ? (isDiverging\n                    ? Math.max(Math.abs(effectiveMin), Math.abs(effectiveMax)) * 0.5\n                    : effectiveMin + span * 0.6)\n                : undefined;\n\n            spec.layer = [\n                {\n                    mark: spec.mark,\n                    encoding: {\n                        ...(xEncoding ? { x: xEncoding } : {}),\n                        ...(yEncoding ? { y: yEncoding } : {}),\n                        ...(baseEncoding.color ? { color: baseEncoding.color } : {}),\n                    },\n                },\n                {\n                    mark: {\n                        type: 'text',\n                        align: 'center',\n                        baseline: 'middle',\n                        fontSize: labelFontSize,\n                    },\n                    encoding: {\n                        ...(xEncoding ? { x: xEncoding } : {}),\n                        ...(yEncoding ? { y: yEncoding } : {}),\n                        text: {\n                            field: colorField,\n                            type: 'quantitative',\n                            format: labelFormat,\n                        },\n                        color: strongThreshold == null\n                            ? { value: 'black' }\n                            : {\n                                condition: {\n                                    test: isDiverging\n                                        ? `datum.${colorField} > ${strongThreshold} || datum.${colorField} < ${-strongThreshold}`\n                                        : `datum.${colorField} >= ${strongThreshold}`,\n                                    value: isDiverging\n                                        ? 'white'\n                                        : (highIsLight ? 'black' : 'white'),\n                                },\n                                value: isDiverging\n                                    ? 'black'\n                                    : (highIsLight ? 'white' : 'black'),\n                            },\n                    },\n                },\n            ];\n            delete spec.mark;\n        }\n    },\n    properties: [\n        { key: 'showTextLabels', label: 'Labels', type: 'binary', defaultValue: false },\n    ] as ChartPropertyDef[],\n    // Color scheme is an encoding-level edit (writes encoding.scheme on the\n    // color channel), so it is exposed as a Category-B encoding action rather\n    // than a chart-native property. The host stores the chosen value as an\n    // override in chartProperties.colorScheme; the compiler composes it onto the\n    // encoding (see applyEncodingOverrides). `dependencies` tells the host to\n    // reset the override when the color channel's binding changes in the shelf.\n    encodingActions: [\n        {\n            key: 'colorScheme',\n            label: 'Scheme',\n            isApplicable: (ctx) => !!ctx.encodings.color?.field,\n            dependencies: ['color'],\n            control: {\n                type: 'discrete', options: [\n                    { value: undefined, label: \"Default (Blues)\" },\n                    { value: \"viridis\", label: \"Viridis\" },\n                    { value: \"inferno\", label: \"Inferno\" },\n                    { value: \"magma\", label: \"Magma\" },\n                    { value: \"plasma\", label: \"Plasma\" },\n                    { value: \"turbo\", label: \"Turbo\" },\n                    { value: \"blues\", label: \"Blues\" },\n                    { value: \"reds\", label: \"Reds\" },\n                    { value: \"greens\", label: \"Greens\" },\n                    { value: \"oranges\", label: \"Oranges\" },\n                    { value: \"purples\", label: \"Purples\" },\n                    { value: \"greys\", label: \"Greys\" },\n                    { value: \"blueorange\", label: \"Blue-Orange (diverging)\" },\n                    { value: \"redblue\", label: \"Red-Blue (diverging)\" },\n                ],\n            },\n            get: (encodings) => encodings.color?.scheme,\n            set: (encodings, value) => ({ ...encodings, color: { ...encodings.color, scheme: value } }),\n        },\n    ] as EncodingActionDef[],\n    pivot: makeCartesianPivot({ transpose: [['x', 'y']] }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, type InstantiateContext } from '../../core/types';\nimport { defaultBuildEncodings, setMarkProp } from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nexport const interpolateConfigProperty: ChartPropertyDef = {\n    key: \"interpolate\", label: \"Curve\", type: \"discrete\", options: [\n        { value: undefined, label: \"Default (linear)\" },\n        { value: \"linear\", label: \"Linear\" },\n        { value: \"monotone\", label: \"Monotone (smooth)\" },\n        { value: \"step\", label: \"Step\" },\n        { value: \"step-before\", label: \"Step Before\" },\n        { value: \"step-after\", label: \"Step After\" },\n        { value: \"basis\", label: \"Basis (smooth)\" },\n        { value: \"cardinal\", label: \"Cardinal\" },\n        { value: \"catmull-rom\", label: \"Catmull-Rom\" },\n    ],\n};\n\nconst showPointsProperty: ChartPropertyDef = {\n    key: \"showPoints\", label: \"Points\", type: \"binary\", defaultValue: false,\n};\n\nexport function applyInterpolate(mark: any, config?: Record<string, any>): any {\n    if (!config?.interpolate) return mark;\n    return setMarkProp(mark, 'interpolate', config.interpolate);\n}\n\nfunction applyShowPoints(mark: any, config?: Record<string, any>): any {\n    if (!config?.showPoints) return mark;\n    return setMarkProp(mark, 'point', true);\n}\n\nfunction isContinuousColor(ctx: InstantiateContext): boolean {\n    const color = ctx.resolvedEncodings.color;\n    if (!color?.field) return false;\n    const type = color.type ?? ctx.channelSemantics.color?.type;\n    return type === 'quantitative' || type === 'temporal';\n}\n\n/**\n * Vega-Lite splits a line into one segment per datum when color is quantitative,\n * so nothing visible connects. Mirror ECharts: a neutral line + colored points.\n */\nfunction buildContinuousColorLayers(\n    spec: any,\n    resolvedEncodings: Record<string, any>,\n    chartProperties?: Record<string, any>,\n): void {\n    const { color, column, row, x, y, strokeDash, detail, opacity, order, ...rest } = resolvedEncodings;\n\n    const lineEncoding: Record<string, any> = {};\n    for (const [ch, enc] of Object.entries({ x, y, strokeDash, detail, opacity, order, ...rest })) {\n        if (enc && typeof enc === 'object' && Object.keys(enc).length > 0) {\n            lineEncoding[ch] = enc;\n        }\n    }\n\n    const pointEncoding: Record<string, any> = {};\n    if (x) pointEncoding.x = x;\n    if (y) pointEncoding.y = y;\n    if (color) pointEncoding.color = color;\n    if (detail) pointEncoding.detail = detail;\n    if (opacity) pointEncoding.opacity = opacity;\n\n    spec.layer = [\n        {\n            mark: applyInterpolate({ type: 'line', color: '#cccccc' }, chartProperties),\n            encoding: lineEncoding,\n        },\n        {\n            mark: { type: 'point', filled: true, size: 80 },\n            encoding: pointEncoding,\n        },\n    ];\n    delete spec.mark;\n\n    if (column || row) {\n        if (!spec.encoding) spec.encoding = {};\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n    } else {\n        delete spec.encoding;\n    }\n}\n\nexport const lineChartDef: ChartTemplateDef = {\n    chart: \"Line Chart\",\n    template: { mark: \"line\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"strokeDash\", \"detail\", \"opacity\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        if (isContinuousColor(ctx)) {\n            buildContinuousColorLayers(spec, ctx.resolvedEncodings, ctx.chartProperties);\n            return;\n        }\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        spec.mark = applyInterpolate(spec.mark, ctx.chartProperties);\n        spec.mark = applyShowPoints(spec.mark, ctx.chartProperties);\n    },\n    properties: [interpolateConfigProperty, showPointsProperty],\n    // No `transpose`: a line pins its domain to `x` (never a vertical line, for any\n    // x type). `permute` excludes `x`, so only a genuine dual-measure line offers a\n    // y↔color swap; the series dimension is explored via `shift` (facets/legend).\n    pivot: makeCartesianPivot({ permute: [['y', 'color']], shift: ['color', 'group', 'column', 'row'] }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { FormatSpec } from '../core/field-semantics';\n\nconst quoteVegaString = (value: string): string =>\n    `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n\n/** Compile a semantic FormatSpec into a Vega expression for any numeric value. */\nexport function formatSpecToVegaExpr(\n    fmt: FormatSpec,\n    valueExpr: string = 'datum.value',\n): string | null {\n    const prefix = fmt.prefix ? `${quoteVegaString(fmt.prefix)} + ` : '';\n    const suffix = fmt.suffix ? ` + ${quoteVegaString(fmt.suffix)}` : '';\n\n    if (fmt.abbreviate) {\n        return (\n            `${prefix}(abs(${valueExpr}) >= 1e12 ? format(${valueExpr} / 1e12, '~g') + 'T' : ` +\n            `abs(${valueExpr}) >= 1e9 ? format(${valueExpr} / 1e9, '~g') + 'B' : ` +\n            `abs(${valueExpr}) >= 1e6 ? format(${valueExpr} / 1e6, '~g') + 'M' : ` +\n            `abs(${valueExpr}) >= 1e3 ? format(${valueExpr} / 1e3, '~g') + 'K' : ` +\n            `format(${valueExpr}, ','))${suffix}`\n        );\n    }\n\n    if (!fmt.pattern) return prefix || suffix ? `${prefix}${valueExpr}${suffix}` : null;\n    return `${prefix}format(${valueExpr}, ${quoteVegaString(fmt.pattern)})${suffix}`;\n}\n\n/**\n * Compile a FormatSpec for an axis/legend labelExpr. A pattern without affixes\n * returns null because Vega-Lite can apply it directly through `format`.\n */\nexport function formatSpecToLabelExpr(fmt: FormatSpec): string | null {\n    if (!fmt.abbreviate && fmt.pattern && !fmt.prefix && !fmt.suffix) return null;\n    return formatSpecToVegaExpr(fmt);\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, ChartEncoding } from '../../core/types';\nimport type { FormatSpec } from '../../core/field-semantics';\nimport { formatSpecToVegaExpr } from '../format';\nimport { interpolateConfigProperty, applyInterpolate } from './line';\n\n/**\n * Sparkline — a \"sparkline table\" / small-multiples strip layout.\n *\n * Renders a compact 3-column data table, modeled on the Bar Table:\n *\n *     ┌──────────┬─────────────────────┬──────────┐\n *     │ Category │  Trend              │ Average  │   ← aligned column headers\n *     ├──────────┼─────────────────────┼──────────┤\n *     │ US       │  ╴╴╴/\\╴╴╴╴╴_╴╴╴╴    │     66.2 │   ← one row per series\n *     │ China    │  ╴╴╴╴╴___/‾‾‾‾‾╴╴    │     48.8 │\n *     │ India    │  ╴╴╴╴___─────────    │     31.4 │\n *     └──────────┴─────────────────────┴──────────┘\n *\n * Each row is one series: its name (left), a sparkline with a dashed reference\n * line (middle), and a value label (right). This is Tufte's \"dataword\" idea —\n * the precise quantitative scale is dropped in favor of shape-at-a-glance, so\n * dozens of series fit in the space a single Line Chart would use.\n *\n * Structure (`instantiate`): the table is an `hconcat` of three FACETED panels\n * sharing one row order and a shared y scale, exactly like the Bar Table's\n * three columns. The trends genuinely need faceting (each series has its own\n * continuous mini-axis, so they can't be flattened into one banded panel), and\n * splitting Category / Trend / Average into separate `hconcat` panels lets each\n * carry its own top-level title — so the column headers align on one row (a\n * single faceted view can only put a header on the side, not the top).\n *\n * The series field (`color`, or `detail` when no color is bound) is remapped\n * onto the `row` facet channel by `normalizeEncodings`. When it came from\n * `color`, the lines AND value labels are hued by series (line-chart color\n * semantics, e.g. US vs China); a `detail` series stays monochrome.\n */\n\n/**\n * Per-row reference line. Like a bar table's gridline anchor, each strip can\n * carry a faint dashed rule the trace is read against:\n *   - `mean`   (default) the series average — \"is today above or below normal?\"\n *   - `zero`   a true zero baseline — for signed / change series\n *   - `median` a robust center, less swayed by spikes\n *   - `none`   no reference line\n *\n * The right-hand value column follows the reference: it shows the median when\n * the reference is the median, otherwise the mean (for mean / zero / none).\n */\nconst baselineProperty: ChartPropertyDef = {\n    key: 'baseline', label: 'Reference line', type: 'discrete',\n    defaultValue: 'mean',\n    options: [\n        { value: 'mean', label: 'Average' },\n        { value: 'zero', label: 'Zero' },\n        { value: 'median', label: 'Median' },\n        { value: 'none', label: 'None' },\n    ],\n};\n\n/**\n * Width (px) of the Trend (sparkline) column. Defaults to a compact base width\n * so the strip stays small (Tufte's \"dataword\") and the Average column sits\n * right beside it rather than floating off to the canvas edge. The value is\n * clamped to whatever base width is actually available, and users can raise it\n * (up to a near-full strip) to give the trend more room.\n */\nconst DEFAULT_TREND_W = 240;\nconst trendWidthProperty: ChartPropertyDef = {\n    key: 'trendWidth', label: 'Sparkline width', type: 'continuous',\n    min: 80, max: 600, step: 10, defaultValue: DEFAULT_TREND_W,\n};\n\nconst HEADER_STYLE = { fontSize: 11, fontWeight: 'normal' as const, color: '#999', offset: 6 };\nconst CHAR_PX = 6.6;          // approx advance width at fontSize 11\nconst MONO_LINE = '#555';     // line color when no color field is bound\nconst MONO_VALUE = '#333';    // value-label color when monochrome\n\nconst isCJK = (ch: string): boolean =>\n    /[\\u3000-\\u303F\\u3400-\\u9FFF\\uF900-\\uFAFF\\uFF00-\\uFFEF]/.test(ch);\nconst textWidth = (s: unknown): number =>\n    [...String(s ?? '')].reduce((a, ch) => a + (isCJK(ch) ? 2 : 1), 0);\nconst mean = (a: number[]): number => (a.length ? a.reduce((s, x) => s + x, 0) / a.length : NaN);\nconst median = (a: number[]): number => {\n    if (!a.length) return NaN;\n    const s = [...a].sort((x, y) => x - y);\n    const n = s.length;\n    return n % 2 ? s[(n - 1) / 2] : (s[n / 2 - 1] + s[n / 2]) / 2;\n};\n// Compact stringification used ONLY to budget the value column's width; the\n// actual on-canvas formatting is d3's `.3~s` (set on the text encoding).\nconst approxNum = (v: number): string => {\n    if (!Number.isFinite(v)) return '';\n    const a = Math.abs(v);\n    if (a >= 1e9) return (v / 1e9).toFixed(1) + 'B';\n    if (a >= 1e6) return (v / 1e6).toFixed(1) + 'M';\n    if (a >= 1e3) return (v / 1e3).toFixed(1) + 'k';\n    return String(Math.round(v * 10) / 10);\n};\nconst approxFormattedNum = (v: number, fmt?: FormatSpec): string =>\n    `${fmt?.prefix ?? ''}${approxNum(v)}${fmt?.suffix ?? ''}${fmt?.pattern ? '0' : ''}`;\n\nexport const sparklineDef: ChartTemplateDef = {\n    chart: 'Sparkline',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'row', 'column'],\n    markCognitiveChannel: 'position',\n\n    // Remap the series field onto `row` so each series becomes its own table\n    // row. The series is the bound `color` field if present, else `detail`.\n    // When it came from `color` we KEEP the color encoding (same field) so each\n    // row's line/value is hued by its series — matching line-chart color\n    // semantics (e.g. US vs China). `detail` series stay monochrome. An\n    // explicit `row` binding wins.\n    normalizeEncodings: (encodings: Record<string, ChartEncoding>) => {\n        if (encodings.row?.field) return encodings;\n        const fromColor = !!encodings.color?.field;\n        const seriesEnc = fromColor\n            ? encodings.color\n            : (encodings.detail?.field ? encodings.detail : undefined);\n        if (!seriesEnc) return encodings;\n        const next: Record<string, ChartEncoding> = { ...encodings, row: { ...seriesEnc } };\n        // Keep `color` (it doubles as the hue); drop `detail` (monochrome).\n        if (!fromColor) delete next.detail;\n        return next;\n    },\n\n    // The grid lays itself out manually (see `instantiate`), but the shared\n    // pipeline still runs its facet-budget pass over the `row` channel. A low\n    // `minSubplotSize` floor raises the row capacity so a normal sparkline\n    // table (many short strips) doesn't trip a spurious \"rows omitted\" overflow\n    // warning. The other knobs keep strips short and wide.\n    declareLayoutMode: () => ({\n        paramOverrides: {\n            minSubplotSize: 24,\n            continuousMarkCrossSection: { x: 100, y: 0, seriesCountAxis: 'auto' },\n            facetAspectRatioResistance: 0.3,\n        },\n    }),\n\n    instantiate: (spec, ctx) => {\n        const enc = ctx.resolvedEncodings;\n        const regionField = enc.row?.field as string | undefined;\n        const xField = enc.x?.field as string | undefined;\n        const yField = enc.y?.field as string | undefined;\n        const hasColor = !!enc.color?.field;\n        const baseline = (ctx.chartProperties?.baseline as string) ?? 'mean';\n        const useMedian = baseline === 'median';\n\n        // Guard: without both position fields there is no trend to draw; leave\n        // a valid single-line spec so assembly still succeeds.\n        if (!xField || !yField) {\n            spec.encoding = {\n                ...(xField ? { x: { ...enc.x } } : {}),\n                ...(yField ? { y: { ...enc.y } } : {}),\n            };\n            return;\n        }\n\n        const table = (ctx.fullTable ?? ctx.table ?? []) as Array<Record<string, any>>;\n\n        // A synthetic single-row facet when there is no series field, so the\n        // grid machinery below is uniform (one table row, blank category cell).\n        const facetField = regionField ?? 'flintSparkSeries';\n        const trendData = regionField ? table : table.map(r => ({ ...r, [facetField]: '' }));\n\n        // Row order = first appearance, kept stable across all three panels.\n        const regions: any[] = [];\n        const seen = new Set<any>();\n        for (const r of trendData) {\n            const v = r[facetField];\n            if (!seen.has(v)) { seen.add(v); regions.push(v); }\n        }\n\n        // Per-series central tendency for the value column (and width budget).\n        const groups = new Map<any, number[]>();\n        for (const r of trendData) {\n            const v = Number(r[yField]);\n            if (!Number.isFinite(v)) continue;\n            const k = r[facetField];\n            const arr = groups.get(k);\n            if (arr) arr.push(v); else groups.set(k, [v]);\n        }\n        const aggOf = (k: any): number => {\n            const a = groups.get(k) ?? [];\n            return useMedian ? median(a) : mean(a);\n        };\n\n        const categoryTitle = String(enc.row?.title ?? regionField ?? '');\n        const trendTitle = String(enc.y?.title ?? yField ?? '');\n        const avgTitle = useMedian ? 'Median' : 'Average';\n\n        const catData = regions.map(r => ({ [facetField]: r }));\n        const avgData = regions.map(r => ({ [facetField]: r, flintSparkAvg: aggOf(r) }));\n        const valueFmt = ctx.channelSemantics?.y?.format;\n        const avgTransforms: any[] = [];\n        let avgTextEncoding: any = { field: 'flintSparkAvg', type: 'quantitative', format: '.3~s' };\n        const valueExpr = valueFmt\n            ? formatSpecToVegaExpr(valueFmt, 'datum.flintSparkAvg')\n            : null;\n        if (valueExpr) {\n            avgTransforms.push({\n                calculate: valueExpr,\n                as: 'flintSparkAvgFormatted',\n            });\n            avgTextEncoding = { field: 'flintSparkAvgFormatted', type: 'nominal' };\n        }\n\n        // ── Sizing (manual, like the Bar Table — the layout engine's faceted\n        // sizing doesn't apply to a hand-built hconcat). Column widths follow\n        // their longest text; the trend takes the rest. Strips divide the\n        // height and pack tighter as the series count grows.\n        const canvas = ctx.canvasSize ?? { width: 480, height: 320 };\n        const N = Math.max(1, regions.length);\n        const HEADER_H = 18;\n        const STRIP_GAP = 6;\n        const INTER_GAP = 8;\n        const stripH = Math.min(64, Math.max(16,\n            Math.floor((canvas.height - HEADER_H - (N - 1) * STRIP_GAP) / N)));\n        const maxCatChars = Math.max(textWidth(categoryTitle), 4,\n            ...regions.map(r => textWidth(r)));\n        const maxAvgChars = Math.max(textWidth(avgTitle), 4,\n            ...avgData.map(d => textWidth(approxFormattedNum(d.flintSparkAvg, valueFmt))));\n        const catW = Math.min(200, Math.max(40, Math.round(maxCatChars * CHAR_PX) + 10));\n        const avgW = Math.min(96, Math.max(34, Math.round(maxAvgChars * CHAR_PX) + 8));\n        // Compact by default (DEFAULT_TREND_W), tunable via `trendWidth`, and\n        // always clamped to the base width left after the two text columns.\n        const avail = canvas.width - catW - avgW - 2 * INTER_GAP;\n        const tunedTrendW = Number(ctx.chartProperties?.trendWidth) || DEFAULT_TREND_W;\n        const trendW = Math.max(90, Math.min(tunedTrendW, avail));\n\n        const facetRow = { field: facetField, type: 'nominal', sort: regions, header: null };\n        const lineMark = applyInterpolate({ type: 'line', strokeWidth: 1.5 }, ctx.chartProperties);\n\n        // Inset the trace's y range a couple px inside the strip. A faceted\n        // cell uses Vega `bounds: full`, so a line touching the top/bottom edge\n        // (plus its stroke) makes the cell render ~4px taller than its declared\n        // `height`. The text columns have no such overflow, so over many rows\n        // the trend column would drift out of step with its labels. Keeping the\n        // trace off the edges holds every column on the same row pitch.\n        const Y_INSET = 2;\n        const trendYScale = { range: [stripH - Y_INSET, Y_INSET] };\n\n        // ── Trend panel layers: the line plus an optional dashed reference.\n        const layers: any[] = [{\n            mark: lineMark,\n            encoding: {\n                x: { ...enc.x, axis: null },\n                y: { ...enc.y, axis: null, scale: { ...(enc.y as any).scale, ...trendYScale } },\n                ...(hasColor\n                    ? { color: { field: facetField, type: 'nominal', legend: null } }\n                    : { color: { value: MONO_LINE } }),\n            },\n        }];\n        if (baseline !== 'none') {\n            // `zero` pins a true 0 datum; `mean`/`median` aggregate per row.\n            const ruleY = baseline === 'zero'\n                ? { datum: 0, type: 'quantitative', axis: null }\n                : { field: yField, aggregate: baseline, type: 'quantitative', axis: null };\n            layers.push({\n                mark: { type: 'rule', strokeDash: [3, 2], stroke: '#9a9a9a', strokeWidth: 1, opacity: 0.7 },\n                encoding: { y: ruleY },\n            });\n        }\n\n        // ── Three faceted columns. Category/Average are single-mark text\n        // panels (one row each, vertically centered at the strip midpoint);\n        // the Trend is the layered line. All share the row order, strip height,\n        // and y scale, so their rows line up; each panel's own `title` gives\n        // the aligned column header.\n        const catPanel = {\n            data: { values: catData },\n            facet: { row: facetRow },\n            spec: {\n                width: catW, height: stripH,\n                mark: { type: 'text', align: 'left', baseline: 'middle', fontSize: 11 },\n                encoding: {\n                    y: { value: stripH / 2 },\n                    x: { value: 0 },\n                    text: { field: facetField, type: 'nominal' },\n                },\n            },\n            title: { text: categoryTitle, anchor: 'start', ...HEADER_STYLE },\n        };\n        const trendPanel = {\n            data: { values: trendData },\n            facet: { row: facetRow },\n            spec: { width: trendW, height: stripH, layer: layers },\n            resolve: { scale: { y: 'independent' } },\n            title: { text: trendTitle, anchor: 'middle', ...HEADER_STYLE },\n        };\n        const avgPanel = {\n            data: { values: avgData },\n            facet: { row: facetRow },\n            spec: {\n                width: avgW, height: stripH,\n                ...(avgTransforms.length ? { transform: avgTransforms } : {}),\n                mark: { type: 'text', align: 'right', baseline: 'middle', fontSize: 11, fontWeight: 600 },\n                encoding: {\n                    y: { value: stripH / 2 },\n                    x: { value: avgW },\n                    text: avgTextEncoding,\n                    ...(hasColor\n                        ? { color: { field: facetField, type: 'nominal', legend: null } }\n                        : { color: { value: MONO_VALUE } }),\n                },\n            },\n            title: { text: avgTitle, anchor: 'end', ...HEADER_STYLE },\n        };\n\n        delete spec.mark;\n        delete spec.encoding;\n        spec.hconcat = [catPanel, trendPanel, avgPanel];\n        spec.spacing = INTER_GAP;\n        // Trend owns the only real y scale; its per-row resolution is set on the\n        // panel above. At the hconcat level keep y independent so VL never tries\n        // to unify the trend's faceted scale with the text columns' value-y.\n        spec.resolve = { scale: { y: 'independent', color: 'shared' } };\n        spec.config = {\n            view: { stroke: null },\n            axis: { grid: false, domain: false, ticks: false },\n            facet: { spacing: STRIP_GAP },\n        };\n    },\n\n    properties: [interpolateConfigProperty, baselineProperty, trendWidthProperty],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { defaultBuildEncodings } from './utils';\n\n/** Semantic types that indicate a rank-like field */\nconst RANK_SEMANTIC_TYPES = new Set(['Rank', 'Score', 'Level']);\n\nconst isDiscrete = (type: string | undefined) =>\n    type === 'nominal' || type === 'ordinal';\n\nexport const bumpChartDef: ChartTemplateDef = {\n    chart: \"Bump Chart\",\n    template: {\n        mark: { type: \"line\", point: true, interpolate: \"monotone\", strokeWidth: 2 },\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"color\", \"detail\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 80, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.4 },\n    }),\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        const xEnc = spec.encoding?.x;\n        const yEnc = spec.encoding?.y;\n        if (!xEnc || !yEnc) return;\n\n        const semanticTypes = ctx.semanticTypes;\n\n        // --- Decide which axis is rank ---\n        let rankAxis: 'x' | 'y';\n\n        const xSemType = (xEnc.field && semanticTypes?.[xEnc.field]) || '';\n        const ySemType = (yEnc.field && semanticTypes?.[yEnc.field]) || '';\n        const xIsRank = RANK_SEMANTIC_TYPES.has(xSemType);\n        const yIsRank = RANK_SEMANTIC_TYPES.has(ySemType);\n\n        if (yIsRank && !xIsRank) {\n            rankAxis = 'y';\n        } else if (xIsRank && !yIsRank) {\n            rankAxis = 'x';\n        } else if (isDiscrete(xEnc.type) && !isDiscrete(yEnc.type)) {\n            rankAxis = 'y';\n        } else if (isDiscrete(yEnc.type) && !isDiscrete(xEnc.type)) {\n            rankAxis = 'x';\n        } else {\n            rankAxis = 'y';\n        }\n\n        // Y is rank → reverse Y so rank 1 is at top\n        if (rankAxis === 'y') {\n            yEnc.scale = { ...yEnc.scale, reverse: true };\n        }\n\n        // X is rank → fix line connection order\n        if (rankAxis === 'x' && yEnc.field) {\n            spec.encoding.order = {\n                field: yEnc.field,\n                type: yEnc.type || \"quantitative\",\n            };\n        }\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite Slope Chart (slopegraph) template.\n *\n * A slopegraph draws one straight line **per category** connecting that\n * category's value at exactly **two periods** (e.g. \"2019\" → \"2024\"), with a\n * point marker at each end. The read is the slope/direction of change and the\n * crossovers between categories — it is the 2-point value-change cousin of the\n * Bump Chart (multi-period ranking), so this template mirrors bump.ts wherever\n * practical.\n *\n * Contract:\n *   x      — period, rendered as a *discrete band* axis with exactly two\n *            positions. Temporal / numeric period fields are converted to\n *            ordered ordinal categories so the two periods always sit at two\n *            equally-spaced columns (the slope, not the gap, carries meaning).\n *   y      — value (quantitative position).\n *   color  — category → one line per value (legend).\n *   detail — category → one line per value (no legend); used when the lines\n *            should not be color-coded.\n *\n * The line is always straight (interpolate: linear — never monotone/smooth) and\n * shows points at both ends.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { resolveDiscreteType } from '../../core/axis-detection';\nimport { defaultBuildEncodings } from './utils';\n\nconst isDiscrete = (type: string | undefined) =>\n    type === 'nominal' || type === 'ordinal';\n\n/**\n * Distinct values of `field` in `table`, ordered naturally: numerically when\n * every value parses as a number, chronologically when every value parses as a\n * date, otherwise in data-encounter order. Used to order the two period bands.\n */\nfunction orderedDistinct(table: any[], field: string): any[] {\n    const seen = new Map<string, any>();\n    for (const row of table) {\n        const v = row[field];\n        if (v == null) continue;\n        const key = String(v);\n        if (!seen.has(key)) seen.set(key, v);\n    }\n    const values = [...seen.values()];\n    if (values.length <= 1) return values;\n\n    const allNumeric = values.every(v => typeof v === 'number' ||\n        (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))));\n    if (allNumeric) {\n        return [...values].sort((a, b) => Number(a) - Number(b));\n    }\n    const allDates = values.every(v => !isNaN(Date.parse(String(v))));\n    if (allDates) {\n        return [...values].sort((a, b) => Date.parse(String(a)) - Date.parse(String(b)));\n    }\n    return values;\n}\n\nexport const slopeChartDef: ChartTemplateDef = {\n    chart: \"Slope Chart\",\n    template: {\n        mark: { type: \"line\", point: true, interpolate: \"linear\", strokeWidth: 2 },\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"color\", \"detail\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: (cs, table) => {\n        // Force the period axis to a discrete band so the two periods sit at two\n        // equally-spaced positions regardless of the field's native type.\n        const resolvedTypes: Record<string, 'nominal' | 'ordinal' | 'quantitative' | 'temporal'> = {};\n        const xcs = cs.x;\n        if (xcs?.field && !isDiscrete(xcs.type)) {\n            resolvedTypes.x = resolveDiscreteType(xcs.type, xcs.field, table);\n        }\n        return {\n            axisFlags: { x: { banded: true } },\n            ...(Object.keys(resolvedTypes).length ? { resolvedTypes } : {}),\n            paramOverrides: {\n                // Spread the two periods well apart and keep the plot from being\n                // squeezed tall: a wide band step + no series-count vertical\n                // stretch yields the classic balanced slopegraph framing.\n                defaultBandSize: 120,\n                continuousMarkCrossSection: { x: 0, y: 0, seriesCountAxis: 'auto' },\n                facetAspectRatioResistance: 0.4,\n            },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        const xEnc = spec.encoding?.x;\n        const yEnc = spec.encoding?.y;\n        if (!xEnc || !yEnc) return;\n\n        // Defensive: the period axis must be discrete (declareLayoutMode already\n        // converts it, but a caller could pass an explicit type override).\n        if (!isDiscrete(xEnc.type)) {\n            xEnc.type = resolveDiscreteType(xEnc.type, xEnc.field, ctx.table);\n        }\n\n        // Order the two period bands. The auto-sort in buildVLEncodings only\n        // fires for fields that were *already* discrete in Phase 0, so a\n        // temporal/numeric period converted here arrives without a sort —\n        // give it an explicit natural order so the periods read left→right.\n        if ((xEnc.type === 'ordinal' || xEnc.type === 'nominal') &&\n            xEnc.sort == null && xEnc.field) {\n            const order = orderedDistinct(ctx.table, xEnc.field);\n            if (order.length > 1) xEnc.sort = order;\n        }\n\n        // Inset the two period bands from the plot edges so the end points and\n        // their value labels are not clipped (classic slopegraph framing).\n        xEnc.scale = { ...xEnc.scale, padding: 0.4 };\n\n        // Give the value axis a little breathing room (in pixels) so the\n        // extreme top / bottom end-point markers — common with zero-crossing\n        // data — are not flush against the plot edges. Slopegraphs read the\n        // *slope* (change), not the absolute level, so the value axis fits the\n        // data rather than anchoring at zero — matching the ECharts / Chart.js\n        // slope templates and classic slopegraph convention.\n        yEnc.scale = { ...yEnc.scale, zero: false, nice: true, padding: 12 };\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { defaultBuildEncodings, setMarkProp } from './utils';\n\nconst interpolateConfigProperty: ChartPropertyDef = {\n    key: \"interpolate\", label: \"Curve\", type: \"discrete\", options: [\n        { value: undefined, label: \"Default (linear)\" },\n        { value: \"linear\", label: \"Linear\" },\n        { value: \"monotone\", label: \"Monotone (smooth)\" },\n        { value: \"step\", label: \"Step\" },\n        { value: \"step-before\", label: \"Step Before\" },\n        { value: \"step-after\", label: \"Step After\" },\n        { value: \"basis\", label: \"Basis (smooth)\" },\n        { value: \"cardinal\", label: \"Cardinal\" },\n        { value: \"catmull-rom\", label: \"Catmull-Rom\" },\n    ],\n};\n\nfunction applyInterpolate(vgSpec: any, config?: Record<string, any>): void {\n    if (!config?.interpolate) return;\n    vgSpec.mark = setMarkProp(vgSpec.mark, 'interpolate', config.interpolate);\n}\n\n/**\n * A single-series area (no `color` to stack) still gets an implicit zero-offset\n * stack from Vega-Lite. When such an area is FACETED (`column`/`row`, sharing the\n * domain scale), that stack makes VL auto-inject an `impute {value: 0}` for every\n * missing `(domain × facet)` cell — which spikes each gap down to the baseline.\n * Disabling the stack on the measure axis removes the impute, so the area simply\n * connects its *measured* points across gaps (a trend line between real data —\n * NOT a fabricated data row), exactly like a standalone single-series area.\n */\nfunction disableImplicitStack(spec: any): void {\n    for (const axis of ['x', 'y'] as const) {\n        const e = spec.encoding?.[axis];\n        if (e && (e.type === 'quantitative' || e.aggregate)) { e.stack = null; break; }\n    }\n}\n\n/**\n * Align a sparse STACKED area/stream. Stacking is only defined when every series\n * has a value at every domain point — with holes, Vega-Lite fills them with 0\n * (spiking each gap to the baseline). A stack fundamentally *must* decide each\n * hole's value; the standard, defensible choice is to **linearly interpolate**\n * between a series' real neighbours (a trend estimate, not a flat 0). We compute\n * it in JS (VL's `impute` has no linear method) and inject the aligned rows as\n * the spec's data. Grouped by every discrete series/facet channel; only over a\n * CONTINUOUS domain (temporal/quantitative). A no-op when already dense.\n *\n * NOTE: this only runs when a series is *stacked* (a `color` split). A single\n * series is handled by {@link disableImplicitStack} with no fabricated data.\n */\nfunction interpolateSparseStack(spec: any, ctx: any): void {\n    const enc = ctx.resolvedEncodings;\n    const { x, y } = enc;\n    if (!x?.field || !y?.field) return;\n    const xMeasure = x.type === 'quantitative' || !!x.aggregate;\n    const yMeasure = y.type === 'quantitative' || !!y.aggregate;\n    let measureF: string;\n    let domain: any;\n    if (yMeasure && !xMeasure) { measureF = y.field; domain = x; }\n    else if (xMeasure && !yMeasure) { measureF = x.field; domain = y; }\n    else return;\n    if (domain.type !== 'temporal' && domain.type !== 'quantitative') return;\n    const domainF = domain.field;\n\n    const groupFields: string[] = [];\n    for (const ch of ['color', 'group', 'column', 'row']) {\n        const e = enc[ch];\n        if (e?.field && (e.type === 'nominal' || e.type === 'ordinal')) groupFields.push(e.field);\n    }\n    if (groupFields.length === 0) return;\n\n    const table = ctx.table;\n    if (!Array.isArray(table) || table.length === 0) return;\n\n    const num = (v: any): number =>\n        v instanceof Date ? v.getTime() : (typeof v === 'number' ? v : Date.parse(v));\n    const domainSorted = [...new Set(table.map((r: any) => r[domainF]))].sort((a, b) => num(a) - num(b));\n\n    const groups = new Map<string, any[]>();\n    for (const r of table) {\n        const k = groupFields.map((f) => r[f]).join('\\u0001');\n        (groups.get(k) ?? groups.set(k, []).get(k)!).push(r);\n    }\n    if (table.length >= domainSorted.length * groups.size) return; // already dense\n\n    const out: any[] = [];\n    for (const pts0 of groups.values()) {\n        const pts = pts0.sort((a: any, b: any) => num(a[domainF]) - num(b[domainF]));\n        const have = new Map(pts.map((p: any) => [p[domainF], p]));\n        for (const d of domainSorted) {\n            const existing = have.get(d);\n            if (existing) { out.push(existing); continue; }\n            const p = num(d);\n            let prev: any = null;\n            let next: any = null;\n            for (const pt of pts) {\n                const pv = num(pt[domainF]);\n                if (pv < p) prev = pt;\n                else if (pv > p) { next = pt; break; }\n            }\n            const val = (prev && next)\n                ? prev[measureF] + ((p - num(prev[domainF])) / (num(next[domainF]) - num(prev[domainF]))) * (next[measureF] - prev[measureF])\n                : (prev ?? next)[measureF];\n            out.push({ ...(prev ?? next), [domainF]: d, [measureF]: val });\n        }\n    }\n    spec.data = { values: out };\n}\n\nexport const areaChartDef: ChartTemplateDef = {\n    chart: \"Area Chart\",\n    template: { mark: \"area\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"opacity\", \"column\", \"row\"],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        const config = ctx.chartProperties;\n        applyInterpolate(spec, config);\n        if (config) {\n            if (config.opacity !== undefined && config.opacity < 1) {\n                spec.mark = setMarkProp(spec.mark, 'opacity', config.opacity);\n            }\n            if (config.stackMode) {\n                for (const axis of ['x', 'y'] as const) {\n                    if (spec.encoding?.[axis]?.type === 'quantitative' ||\n                        spec.encoding?.[axis]?.aggregate) {\n                        spec.encoding[axis].stack = config.stackMode === 'layered' ? null : config.stackMode;\n                        break;\n                    }\n                }\n            }\n        }\n        // Sparse-gap handling. A SINGLE series just connects its measured points\n        // (disable VL's phantom stack — no fabricated data). A STACKED series\n        // (colour) can't stack over holes, so interpolate them (unavoidable fill,\n        // a trend estimate instead of VL's spiky 0) — unless it's layered.\n        if (!ctx.resolvedEncodings.color?.field) {\n            disableImplicitStack(spec);\n        } else if (config?.stackMode !== 'layered') {\n            interpolateSparseStack(spec, ctx);\n        }\n    },\n    properties: [\n        interpolateConfigProperty,\n        { key: \"opacity\", label: \"Opacity\", type: \"continuous\", min: 0.1, max: 1, step: 0.1, defaultValue: 0.7,\n          check: (ctx) => ({\n              applicable: !!ctx.encodings.color?.field && ctx.chartProperties?.stackMode === 'layered',\n          }) },\n        { key: \"stackMode\", label: \"Stack\", type: \"discrete\",\n          // A stack mode only does something when a series dimension (color) is\n          // present to stack; without it there is a single area band.\n          check: (ctx) => ({ applicable: !!ctx.encodings.color?.field }),\n          options: [\n            { value: undefined, label: \"Stacked (default)\" },\n            { value: \"normalize\", label: \"Normalize (100%)\" },\n            { value: \"center\", label: \"Center\" },\n            { value: \"layered\", label: \"Layered (overlap)\" },\n        ] },\n    ] as ChartPropertyDef[],\n    // Like a line, an area pins its domain to `x` (no τ transpose). `permute`\n    // exposes the y↔color swap only for a genuine dual-measure area; the series\n    // dimension is explored via `shift` (legend/facets).\n    pivot: makeCartesianPivot({\n        permute: [['y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n\nexport const streamgraphDef: ChartTemplateDef = {\n    chart: \"Streamgraph\",\n    template: { mark: \"area\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n        // Force center stacking on the measure axis\n        if (spec.encoding?.y && !spec.encoding.y.stack) {\n            spec.encoding.y.stack = \"center\";\n            spec.encoding.y.axis = null;\n        } else if (spec.encoding?.x && !spec.encoding.x.stack) {\n            spec.encoding.x.stack = \"center\";\n            spec.encoding.x.axis = null;\n        }\n        applyInterpolate(spec, ctx.chartProperties);\n        // A streamgraph is always centre-stacked → interpolate sparse gaps so the\n        // stack stays continuous (see interpolateSparseStack).\n        interpolateSparseStack(spec, ctx);\n    },\n    properties: [interpolateConfigProperty] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite Range Area Chart (band / high–low / area-range) template.\n *\n * A filled band over a continuum showing a **low–high range** at each x (daily\n * min/max temperature, a forecast/confidence band, a 52-week stock range). The\n * read is the *extent* of the band (its width) and how it moves over x — NOT a\n * length measured from a zero baseline, so the value axis fits the two bounds.\n *\n * Vega-Lite renders this natively: `mark: \"area\"` with BOTH `encoding.y` (the\n * lower bound) and `encoding.y2` (the upper bound). The fill spans y..y2; it is\n * never anchored at zero.\n *\n * Contract:\n *   x      — position (temporal / quantitative / ordinal).\n *   y      — lower bound (quantitative).\n *   y2     — upper bound (quantitative, shares y's scale).\n *   color  — optional series → one OVERLAPPING band per value (legend). Ranged\n *            areas must never stack, so VL's automatic area stacking is disabled.\n *\n * Mirrors area.ts for structure (mark \"area\", 'area' cognitive channel, the\n * continuous-mark cross-section), but wires y2 and forbids the zero baseline.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { defaultBuildEncodings, setMarkProp } from './utils';\n\nconst interpolateConfigProperty: ChartPropertyDef = {\n    key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n        { value: undefined, label: 'Default (linear)' },\n        { value: 'linear', label: 'Linear' },\n        { value: 'monotone', label: 'Monotone (smooth)' },\n        { value: 'step', label: 'Step' },\n        { value: 'step-before', label: 'Step Before' },\n        { value: 'step-after', label: 'Step After' },\n        { value: 'basis', label: 'Basis (smooth)' },\n    ],\n};\n\nexport const rangeAreaChartDef: ChartTemplateDef = {\n    chart: 'Range Area Chart',\n    template: { mark: { type: 'area', opacity: 0.5, line: { strokeWidth: 1 } }, encoding: {} },\n    channels: ['x', 'y', 'y2', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: {\n            continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' },\n            facetAspectRatioResistance: 0.5,\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        const yEnc = spec.encoding?.y;\n        const y2Enc = spec.encoding?.y2;\n        if (!yEnc || !y2Enc?.field) return;\n\n        // y2 (upper bound) shares y's scale — only the field reference is needed.\n        // Strip any type/scale/sort the generic resolver may have attached so it\n        // behaves as a pure second positional bound (matches candlestick/gantt).\n        spec.encoding.y2 = { field: y2Enc.field };\n\n        // The band spans y..y2; it is NOT measured from a zero baseline, so the\n        // value axis fits the two bounds rather than anchoring at zero. Setting\n        // scale.zero explicitly also makes vlApplyLayoutToSpec skip its\n        // zero-baseline override for this axis.\n        yEnc.scale = { ...yEnc.scale, zero: false, nice: true };\n\n        // Multiple bands (a color series) must OVERLAP, never stack — a ranged\n        // area cannot be stacked. Disable Vega-Lite's automatic area stacking.\n        if (spec.encoding.color) {\n            yEnc.stack = null;\n        }\n\n        const config = ctx.chartProperties;\n        if (config?.interpolate) {\n            spec.mark = setMarkProp(spec.mark, 'interpolate', config.interpolate);\n        }\n        if (config?.opacity !== undefined && config.opacity < 1) {\n            spec.mark = setMarkProp(spec.mark, 'opacity', config.opacity);\n        }\n    },\n    properties: [\n        interpolateConfigProperty,\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.1, defaultValue: 0.5 },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { computeCircumferencePressure, computeEffectiveBarCount } from '../../core/decisions';\nimport { setMarkProp } from './utils';\n\nexport const pieChartDef: ChartTemplateDef = {\n    chart: \"Pie Chart\",\n    template: { mark: \"arc\", encoding: {} },\n    channels: [\"size\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        // Remap abstract channels to VL channels:\n        //   \"size\" → VL \"theta\" (angular extent of each slice)\n        if (!spec.encoding) spec.encoding = {};\n        for (const [ch, enc] of Object.entries(ctx.resolvedEncodings)) {\n            if (ch === 'size') {\n                // Strip the sqrt/range scale that the assembler adds for generic\n                // \"size\" channels — theta handles its own proportional scaling.\n                const { scale: _scale, ...thetaEnc } = enc;\n                spec.encoding.theta = thetaEnc;\n            } else {\n                spec.encoding[ch] = enc;\n            }\n        }\n\n        // Fallback: when the user only maps color (no size/theta), use count\n        // so every colour group gets a proportional slice.\n        if (!spec.encoding.theta) {\n            spec.encoding.theta = { aggregate: 'count', type: 'quantitative' };\n        }\n\n        const config = ctx.chartProperties;\n        if (config && config.innerRadius > 0) {\n            spec.mark = setMarkProp(spec.mark, 'innerRadius', config.innerRadius);\n        }\n\n        // ── Circumference-pressure sizing (spring model) ──────────────\n        // Compute effective bar count from slice values to determine\n        // whether the pie needs to grow beyond the base canvas.\n        const thetaField = spec.encoding.theta?.field;\n        const colorField = spec.encoding.color?.field;\n\n        // Slice ordering (design choice): default keeps the data/category order;\n        // sorting by value leads with the largest or smallest slice. Arc slice\n        // order follows the `order` channel; `color.sort` keeps the legend in\n        // step with the wedges.\n        const sortSlices = config?.sortSlices;\n        if (sortSlices === 'descending' || sortSlices === 'ascending') {\n            spec.encoding.order = thetaField\n                ? { field: thetaField, type: 'quantitative', sort: sortSlices }\n                : { aggregate: 'count', type: 'quantitative', sort: sortSlices };\n            if (spec.encoding.color) {\n                spec.encoding.color = {\n                    ...spec.encoding.color,\n                    sort: thetaField\n                        ? { field: thetaField, op: 'sum', order: sortSlices }\n                        : { op: 'count', order: sortSlices },\n                };\n            }\n        }\n\n        let effectiveCount: number;\n\n        if (thetaField && colorField) {\n            // Aggregate values per color category\n            const agg = new Map<string, number>();\n            for (const row of ctx.table) {\n                const cat = String(row[colorField] ?? '');\n                const val = Number(row[thetaField]) || 0;\n                agg.set(cat, (agg.get(cat) ?? 0) + val);\n            }\n            effectiveCount = computeEffectiveBarCount([...agg.values()]);\n        } else if (colorField) {\n            // Count-based: each category gets equal slice\n            const cats = new Set(ctx.table.map((r: any) => String(r[colorField] ?? '')));\n            effectiveCount = cats.size;\n        } else {\n            effectiveCount = ctx.table.length;\n        }\n\n        const { radius, canvasW, canvasH } = computeCircumferencePressure(\n            effectiveCount, ctx.canvasSize, {\n                minArcPx: 45,\n                minRadius: 60,\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n                margin: 50,   // room for labels around pie\n            });\n\n        // Set explicit width/height — overrides config.view defaults\n        spec.width = canvasW;\n        spec.height = canvasH;\n    },\n    properties: [\n        { key: \"innerRadius\", label: \"Donut\", type: \"continuous\", min: 0, max: 100, step: 5, defaultValue: 0 },\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n            options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        },\n    ] as ChartPropertyDef[],\n};\n\nexport const donutChartDef: ChartTemplateDef = {\n    ...pieChartDef,\n    chart: \"Donut Chart\",\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport { makeSortAction } from '../../core/encoding-actions';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { detectBandedAxisFromSemantics } from '../../core/axis-detection';\nimport { setMarkProp } from './utils';\n\nexport const lollipopChartDef: ChartTemplateDef = {\n    chart: \"Lollipop Chart\",\n    template: {\n        encoding: {},\n        layer: [\n            { mark: { type: \"rule\", strokeWidth: 1.5 }, encoding: {} },\n            { mark: { type: \"circle\", size: 80, opacity: 1 }, encoding: {} },\n        ],\n    },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            // Lollipops use the same base band size as bars but tolerate\n            // more compression (minStep: 4 vs bar's 6, maxStretch: 3 vs 2)\n            // since thin rules + small dots need less room than full-width bars.\n            paramOverrides: { defaultBandSize: 20, minStep: 4, maxStretch: 3, targetBandAR: 240 },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { color, column, row, ...positional } = ctx.resolvedEncodings;\n        for (const [ch, enc] of Object.entries(positional)) {\n            for (const layer of spec.layer) {\n                layer.encoding[ch] = { ...(layer.encoding[ch] || {}), ...enc };\n            }\n        }\n        if (color) {\n            spec.layer[1].encoding.color = { ...(spec.layer[1].encoding.color || {}), ...color };\n        }\n        if (!spec.encoding) spec.encoding = {};\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        // --- Lollipop-specific configuration ---\n        const table = ctx.table;\n        const config = ctx.chartProperties;\n        const layout = ctx.layout;\n\n        // Anchor rule from 0 on the measure axis\n        const xEnc = spec.layer[0]?.encoding?.x;\n        const yEnc = spec.layer[0]?.encoding?.y;\n        const xType = xEnc?.type;\n        const yType = yEnc?.type;\n\n        const isMeasure = (t: string | undefined) =>\n            t != null && t !== 'nominal' && t !== 'ordinal' && t !== 'temporal';\n\n        if (isMeasure(yType)) {\n            spec.layer[0].encoding.y2 = { datum: 0 };\n        } else if (isMeasure(xType)) {\n            spec.layer[0].encoding.x2 = { datum: 0 };\n        }\n\n        // --- Adaptive sizing for crowded lollipops ---\n        const n = table?.length ?? 0;\n        const plotWidth = layout?.subplotWidth ?? ctx.canvasSize?.width ?? 400;\n        const plotHeight = layout?.subplotHeight ?? ctx.canvasSize?.height ?? 300;\n\n        // 1. Coverage-based point size scaling (like scatter plot)\n        const defaultDotSize = config?.dotSize ?? 80;\n        const plotArea = plotWidth * plotHeight;\n        const targetCoverage = 0.15;\n        const currentCoverage = (n * defaultDotSize) / plotArea;\n        let dotSize = defaultDotSize;\n        if (n > 0 && currentCoverage > targetCoverage) {\n            dotSize = Math.round(Math.max(4, (targetCoverage * plotArea) / n));\n        }\n        spec.layer[1].mark = { ...spec.layer[1].mark, size: dotSize };\n\n        // 2. Aggressive rule strokeWidth reduction — use ratio directly\n        //    (not sqrt) so strokes thin out fast with dense data\n        const baseStroke = 1.5;\n        if (dotSize < defaultDotSize) {\n            const ratio = dotSize / defaultDotSize;\n            const stroke = Math.max(0.15, baseStroke * ratio);\n            spec.layer[0].mark = { ...spec.layer[0].mark, strokeWidth: stroke };\n        }\n\n        // 3. Per-group overlap-based stroke thinning\n        const discreteAxis = !isMeasure(xType) ? 'x' : !isMeasure(yType) ? 'y' : null;\n        const discreteField = discreteAxis === 'x' ? xEnc?.field : discreteAxis === 'y' ? yEnc?.field : null;\n        if (discreteField && table && table.length > 0) {\n            const counts: Record<string, number> = {};\n            for (const row of table) {\n                const key = String(row[discreteField] ?? '');\n                counts[key] = (counts[key] || 0) + 1;\n            }\n            const maxOverlap = Math.max(...Object.values(counts));\n            if (maxOverlap > 1) {\n                const currentStroke = (spec.layer[0].mark as any).strokeWidth ?? baseStroke;\n                const stroke = Math.max(0.15, currentStroke / maxOverlap);\n                spec.layer[0].mark = { ...spec.layer[0].mark, strokeWidth: stroke };\n            }\n        }\n\n        // 4. Step sizing for dense lollipops.\n        //    Lollipops sit between fully-discrete (bar) and fully-continuous\n        //    (scatter): dots are small so steps can be tighter than bars.\n        for (const axis of ['x', 'y'] as const) {\n            const count = axis === 'x' ? layout.xContinuousAsDiscrete : layout.yContinuousAsDiscrete;\n            if (count <= 0) continue;\n            const effStep = axis === 'x' ? layout.xStep : layout.yStep;\n            // Tighter rule width: cap at 40% step but floor very low\n            const maxRuleWidth = Math.max(0.15, Math.min(effStep * 0.4, 2));\n            // Dot area budget: ~60% of step² (smaller than bar's full step)\n            const maxDotSize = Math.max(4, Math.round(effStep * effStep * 0.6));\n            spec.layer[0].mark = setMarkProp(spec.layer[0].mark, 'strokeWidth',\n                Math.min((spec.layer[0].mark as any).strokeWidth ?? baseStroke, maxRuleWidth));\n            const currentDotSize = (spec.layer[1].mark as any).size ?? dotSize;\n            spec.layer[1].mark = setMarkProp(spec.layer[1].mark, 'size',\n                Math.min(currentDotSize, maxDotSize));\n        }\n\n        // Apply explicit dot size from config (user override wins)\n        if (config?.dotSize) {\n            spec.layer[1].mark = { ...spec.layer[1].mark, size: config.dotSize };\n        }\n    },\n    properties: [\n        { key: \"dotSize\", label: \"Dot Size\", type: \"continuous\", min: 20, max: 300, step: 10, defaultValue: 80 },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    // Mirrors the bar pivot (a lollipop is bar's thin-mark sibling): orientation\n    // flip, banded-axis ↔ series role swap, and series routing to legend/facets.\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { makeCartesianPivot } from '../../core/pivot';\n\n/**\n * Silverman/Scott rule-of-thumb bandwidth, matching vega-statistics' bandwidth.js\n * (and the ECharts density template's `estimateBandwidth`): 1.06 · v · n^(-0.2)\n * with v = min(std, IQR/1.34). Used as the *base* that the user's `bandwidth`\n * property scales, so the slider behaves as a relative smoothing factor instead\n * of an absolute width in data units (a 0.05 absolute bandwidth is invisible\n * smoothing on a 0–100 score scale but enormous on a 0–1 ratio).\n */\nfunction estimateBandwidth(values: number[]): number {\n    const n = values.length;\n    if (n < 2) return 1;\n    const sorted = [...values].sort((a, b) => a - b);\n    const mean = values.reduce((a, b) => a + b, 0) / n;\n    const variance = values.reduce((s, v) => s + (v - mean) ** 2, 0) / n;\n    const d = Math.sqrt(variance); // standard deviation\n    const q1 = sorted[Math.floor((n - 1) * 0.25)];\n    const q3 = sorted[Math.floor((n - 1) * 0.75)];\n    const iqr = (q3 != null && q1 != null) ? q3 - q1 : 0;\n    const h = iqr / 1.34;\n    const v = Math.min(d, h || d) || d || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n}\n\n/**\n * Widest per-group Silverman bandwidth across the groups Vega's density\n * transform will form (one KDE per `groupby` combination). Mirrors the Violin\n * template's `_max_group_bandwidth`: a single shared `bandwidth` must cover the\n * group that needs the most smoothing, and pooling all groups would over-smooth\n * well-separated distributions.\n */\nfunction maxGroupBandwidth(table: any[], field: string, groupby: string[]): number {\n    const groups = new Map<string, number[]>();\n    for (const row of table) {\n        const v = Number(row[field]);\n        if (!Number.isFinite(v)) continue;\n        const key = groupby.length ? groupby.map(f => String(row[f])).join('\\u0000') : '';\n        const arr = groups.get(key);\n        if (arr) arr.push(v);\n        else groups.set(key, [v]);\n    }\n    let mx = 0;\n    for (const arr of groups.values()) {\n        const bw = estimateBandwidth(arr);\n        if (bw > mx) mx = bw;\n    }\n    return mx;\n}\n\nexport const densityPlotDef: ChartTemplateDef = {\n    chart: \"Density Plot\",\n    template: {\n        mark: \"area\",\n        transform: [{ density: \"__field__\" }],\n        encoding: {\n            x: { field: \"value\", type: \"quantitative\" },\n            y: { field: \"density\", type: \"quantitative\" },\n        },\n    },\n    channels: [\"x\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { x, color, column, row } = ctx.resolvedEncodings;\n        if (x?.field) {\n            spec.transform[0].density = x.field;\n            spec.encoding.x.title = x.field;\n        }\n\n        // The density transform only emits its `value`/`density` columns plus the\n        // fields named in `groupby`. Every field that partitions the chart — the\n        // color series AND any column/row facet — must therefore be in `groupby`,\n        // otherwise that field vanishes from the transformed data and its\n        // encoding silently collapses (e.g. a column facet renders a single\n        // \"undefined\" panel with all sites pooled together).\n        const groupby: string[] = [];\n        if (color?.field) {\n            spec.encoding.color = { ...(spec.encoding.color || {}), ...color };\n            groupby.push(color.field);\n        }\n        if (column) {\n            spec.encoding.column = column;\n            if (column.field) groupby.push(column.field);\n        }\n        if (row) {\n            spec.encoding.row = row;\n            if (row.field) groupby.push(row.field);\n        }\n        if (groupby.length > 0) {\n            spec.transform[0].groupby = groupby;\n        }\n\n        const config = ctx.chartProperties;\n        // `bandwidth` is a *relative* smoothing multiplier (1 ≈ the data-derived\n        // default per group), not an absolute width — see estimateBandwidth above.\n        // We scale the widest per-group Silverman base by it so the same slider\n        // reads consistently across fields of any scale and matches the ECharts\n        // backend and Violin template. 0 / unset leaves Vega to pick its own\n        // (auto) bandwidth per group.\n        if (config?.bandwidth && config.bandwidth > 0 && x?.field) {\n            const base = maxGroupBandwidth(ctx.table, x.field, groupby);\n            if (base > 0) spec.transform[0].bandwidth = base * config.bandwidth;\n        }\n    },\n    properties: [\n        { key: \"bandwidth\", label: \"Bandwidth\", type: \"continuous\", min: 0.05, max: 2, step: 0.05, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    // Mirrors the histogram: a single bound field (x) with a computed density, so\n    // only `shift` (series → legend/facets) applies, plus the reciprocal θ edge\n    // back to a binned Histogram.\n    pivot: makeCartesianPivot({\n        shift: ['color', 'column', 'row'],\n        // θ (→ Histogram / ECDF) is declared centrally in core/chart-transitions.ts.\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite Violin Plot template.\n *\n * A violin plot shows the **full smoothed distribution shape** of a quantitative\n * measure, one mirrored kernel-density curve per category. It is the\n * density-plot cousin of the Boxplot: where the boxplot draws quartiles, the\n * violin draws the whole KDE, symmetric about a center line so the *width*\n * encodes how many observations fall near each value. The read is the density\n * area/width (bimodality, skew, spread), not a position — hence the 'area'\n * cognitive channel (mirrors density.ts).\n *\n * Contract (mirrors Boxplot's channel mapping):\n *   x      — the category (discrete grouping). One violin per x value.\n *   y      — the quantitative measure whose distribution is drawn (the shared\n *            continuous \"value\" axis).\n *   color  — optional; defaults to the category so each violin gets its own hue.\n *   row    — optional OUTER facet (small multiples of the whole violin panel).\n *\n * Vega-Lite native idiom (no plugins): VL's `density` transform per category\n * plus a mirrored area (`x = density, stack: \"center\"`). The canonical VL violin\n * places each category in its own **column facet** with the measure on `y` and\n * the mirrored density on `x`. This template therefore CONSUMES the column-facet\n * slot for the per-category panels (the category supplied on `x` is moved into a\n * VL column/wrap facet). `column` is consequently NOT a user-available channel —\n * an additional outer facet is offered through `row` only. The measure stays on\n * the shared `y` (value) axis so all violins are directly comparable.\n *\n * Reuses density.ts's bandwidth wiring and the boxplot's discrete-axis handling.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { detectBandedAxisForceDiscrete } from '../../core/axis-detection';\nimport { planBandDodge } from '../../core/band-dodge';\n\nconst isDiscrete = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n\n/** Distinct non-null values of a field, in data-encounter order. */\nfunction distinctValues(table: any[], field: string): any[] {\n    const seen = new Set<string>();\n    const out: any[] = [];\n    for (const row of table) {\n        const v = row[field];\n        if (v == null) continue;\n        const key = String(v);\n        if (!seen.has(key)) { seen.add(key); out.push(v); }\n    }\n    return out;\n}\n\n/** [min, max] of a numeric field across the table (ignoring non-numbers). */\nfunction numericExtent(table: any[], field: string): [number, number] | null {\n    let min = Infinity, max = -Infinity;\n    for (const row of table) {\n        const v = row[field];\n        if (typeof v !== 'number' || !isFinite(v)) continue;\n        if (v < min) min = v;\n        if (v > max) max = v;\n    }\n    if (min === Infinity || max === -Infinity) return null;\n    if (min === max) { min -= 0.5; max += 0.5; }\n    return [min, max];\n}\n\n/** Linear-interpolated quantile of an already-sorted ascending array. */\nfunction quantileSorted(sorted: number[], p: number): number {\n    const n = sorted.length;\n    if (n === 0) return NaN;\n    const idx = (n - 1) * p;\n    const lo = Math.floor(idx), hi = Math.ceil(idx);\n    if (lo === hi) return sorted[lo];\n    return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);\n}\n\n/** Sample standard deviation (n-1) of a numeric array. */\nfunction stdev(values: number[]): number {\n    const n = values.length;\n    if (n < 2) return 0;\n    const mean = values.reduce((s, x) => s + x, 0) / n;\n    const v = values.reduce((s, x) => s + (x - mean) * (x - mean), 0) / (n - 1);\n    return Math.sqrt(v);\n}\n\n/**\n * Normal-reference (Scott/Silverman) KDE bandwidth — the same rule Vega's\n * `density` transform uses when no bandwidth is given. Lets us pad the shared\n * density `extent` by a multiple of the *actual* kernel width so every violin\n * tapers to ~zero at its ends instead of being clipped flat (see instantiate).\n */\nfunction bandwidthNRD(values: number[]): number {\n    const n = values.length;\n    if (n < 2) return 0;\n    const s = [...values].sort((a, b) => a - b);\n    const lo = quantileSorted(s, 0.25);\n    const hi = quantileSorted(s, 0.75);\n    const sd = stdev(s);\n    let h = Math.min(sd, (hi - lo) / 1.34);\n    if (!(h > 0)) h = sd || Math.abs(lo) || 1;\n    return 1.06 * h * Math.pow(n, -0.2);\n}\n\n/**\n * Largest per-group KDE bandwidth across the groups Vega will form (one per\n * distinct `groupby` tuple). Vega computes the auto bandwidth per group, so the\n * widest-spread group dictates how far the shared extent must reach to taper.\n */\nfunction maxGroupBandwidth(table: any[], measure: string, groupby: string[]): number {\n    const groups = new Map<string, number[]>();\n    for (const row of table) {\n        const v = row[measure];\n        if (typeof v !== 'number' || !isFinite(v)) continue;\n        const key = groupby.map((f) => String(row[f])).join('\\u0000');\n        let arr = groups.get(key);\n        if (!arr) { arr = []; groups.set(key, arr); }\n        arr.push(v);\n    }\n    let max = 0;\n    for (const arr of groups.values()) {\n        const bw = bandwidthNRD(arr);\n        if (bw > max) max = bw;\n    }\n    return max;\n}\n\nexport const violinPlotDef: ChartTemplateDef = {\n    chart: 'Violin Plot',\n    template: {\n        mark: { type: 'area', orient: 'horizontal' },\n        transform: [{ density: '__measure__', groupby: [], as: ['value', 'density'] }],\n        encoding: {\n            // Measure → shared continuous value axis (vertical).\n            y: { field: 'value', type: 'quantitative' },\n            // Mirrored kernel density → horizontal width, centered (the violin).\n            x: {\n                field: 'density', type: 'quantitative', stack: 'center',\n                impute: null, title: null,\n                axis: { labels: false, ticks: false, grid: false },\n            },\n        },\n    },\n    // `column` is consumed internally for the per-category panels; only `row`\n    // is exposed as an additional outer facet.\n    channels: ['x', 'y', 'color', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: (cs, table) => {\n        // The category lives on `x`; force it discrete (boxplot-style) so a\n        // numeric/temporal category still resolves to clean bands/panels.\n        if (!cs.x?.field || !cs.y?.field) return {};\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        if (!result) return {};\n        return { resolvedTypes: result.resolvedTypes };\n    },\n    instantiate: (spec, ctx) => {\n        const { x, y, color, row } = ctx.resolvedEncodings;\n        const catField = x?.field;\n        const measureField = y?.field;\n        if (!catField || !measureField) return;\n\n        // --- Density transform (per category, retaining every facet field) ---\n        // The density transform only keeps its `groupby` fields on the output\n        // rows, so EVERY field used for faceting/coloring must be grouped — else\n        // VL drops it (an outer row facet would collapse to \"undefined\").\n        const colorField = color?.field;\n        const rowField = row?.field;\n        const groupby = [catField];\n        if (rowField && rowField !== catField) groupby.push(rowField);\n        if (colorField && colorField !== catField && colorField !== rowField) groupby.push(colorField);\n        spec.transform[0].density = measureField;\n        spec.transform[0].groupby = groupby;\n\n        // --- Bandwidth (mirrors density.ts) ---\n        // `bandwidth` is a *relative* smoothing multiplier (1 ≈ the data-derived\n        // default per group), NOT an absolute width in data units — an absolute\n        // 0.05 bandwidth would be invisible on a measure that spans thousands.\n        // Scale the widest per-group normal-reference base by the slider so it\n        // reads consistently across measures of any scale and matches density.ts.\n        // 0 / unset leaves Vega to pick its own (auto) bandwidth per group.\n        // Resolve the effective bandwidth FIRST so the extent padding below can\n        // match the actual kernel width Vega will use.\n        const config = ctx.chartProperties;\n        const baseBandwidth = maxGroupBandwidth(ctx.table, measureField, groupby);\n        const bwMultiplier = config?.bandwidth && config.bandwidth > 0 ? config.bandwidth : 0;\n        const effectiveBw = bwMultiplier > 0 ? baseBandwidth * bwMultiplier : baseBandwidth;\n        if (bwMultiplier > 0 && baseBandwidth > 0) {\n            spec.transform[0].bandwidth = effectiveBw;\n        }\n\n        // Evaluate every violin over the SAME measure range so they share the\n        // value axis and stay directly comparable. The shared `extent` is what\n        // Vega clips the KDE to, so it must reach far enough past the data that\n        // the kernel tails decay to ~zero — otherwise the widest-spread group\n        // (whose data fills the extent) ends in a flat clipped slab instead of a\n        // tapered point. Pad by ~1.5 bandwidths past the data on each side\n        // (seaborn-style \"cut\"), using the effective kernel width Vega will use.\n        const extent = numericExtent(ctx.table, measureField);\n        if (extent) {\n            const range = extent[1] - extent[0];\n            const pad = Math.max(range * 0.05, 1.5 * effectiveBw, 1e-6);\n            spec.transform[0].extent = [extent[0] - pad, extent[1] + pad];\n        }\n\n        // --- Value axis (the measure) ---\n        spec.encoding.y.title = measureField;\n\n        // --- Color: default to the category so each violin has its own hue ---\n        const catType = isDiscrete(x?.type) ? x.type : 'nominal';\n        const colorType = (color?.type as string) || 'nominal';\n        if (colorField) {\n            spec.encoding.color = { ...color };\n        } else {\n            spec.encoding.color = { field: catField, type: catType };\n        }\n        // The facet headers already label each category, so the color legend is\n        // redundant when color mirrors the category.\n        if (!colorField || colorField === catField) {\n            spec.encoding.color.legend = null;\n        }\n\n        // --- Grouped sub-distributions (a genuine colour sub-group) ---\n        // A violin cannot dodge full shapes side-by-side inside one panel — the\n        // KDE owns the continuous axis and VL drops an `xOffset` on a continuous\n        // x. So a genuine sub-group is laid out by count:\n        //   • 2 sub-groups  → SPLIT violin (the `stack:'center'` mirror below\n        //     seats one sub-group on each half — the standard split violin).\n        //   • ≥3 sub-groups → a per-(category × sub-group) small-multiples GRID\n        //     so every sub-group keeps its own independent, un-stacked shape (a\n        //     3-way centre stack misreads each layer's width).\n        // `planBandDodge` gates this so a redundant/1:1 colour (maxPerBand ≤ 1)\n        // stays a plain one-violin-per-category chart rather than dodging.\n        const genuineSubgroup =\n            !!colorField && colorField !== catField && !rowField &&\n            planBandDodge(ctx.table, catField, colorField).maxPerBand > 1;\n        const subgroupCount = genuineSubgroup\n            ? new Set(ctx.table.map((r: any) => String(r[colorField]))).size\n            : 0;\n        const useGrid = genuineSubgroup && subgroupCount >= 3;\n\n        // --- Per-category panels ---\n        const cats = distinctValues(ctx.table, catField);\n        const catCount = Math.max(1, cats.length);\n\n        // Size each violin panel from the canvas + category count (single row,\n        // wrapping only when the row would get too cramped).\n        const canvasW = ctx.canvasSize?.width ?? 560;\n        const canvasH = ctx.canvasSize?.height ?? 360;\n        const spacing = 0;\n        const reservedW = 60;   // value axis + its title\n        const reservedH = 70;   // facet headers + breathing room\n        const minPanelW = 44;\n\n        const facetDef: any = {\n            field: catField,\n            type: catType,\n            ...(x?.sort !== undefined ? { sort: x.sort } : {}),\n            spacing,\n            header: { titleOrient: 'bottom', labelOrient: 'bottom', labelPadding: 2 },\n        };\n\n        if (useGrid) {\n            // 2-D grid: category across columns, sub-group down rows. Each cell is\n            // one clean full violin; the row headers label the sub-group, so the\n            // colour legend is redundant.\n            let panelW = Math.round((canvasW - reservedW) / catCount);\n            panelW = Math.max(minPanelW, Math.min(panelW, 220));\n            const panelH = Math.max(70, Math.round((canvasH - reservedH) / subgroupCount) - 10);\n            spec.encoding.column = facetDef;\n            spec.encoding.row = {\n                field: colorField,\n                type: colorType,\n                ...(color?.sort !== undefined ? { sort: color.sort } : {}),\n                header: { labelAngle: 0 },\n            };\n            if (spec.encoding.color) spec.encoding.color.legend = null;\n            spec.width = panelW;\n            spec.height = panelH;\n        } else {\n            const maxPerRow = Math.max(1, Math.floor((canvasW - reservedW) / (minPanelW + spacing)));\n            const columns = Math.min(catCount, maxPerRow);\n            const gridRows = Math.ceil(catCount / columns);\n            let panelW = Math.round((canvasW - reservedW - (columns - 1) * spacing) / columns);\n            panelW = Math.max(minPanelW, Math.min(panelW, 220));\n            const panelH = Math.max(120, Math.round((canvasH - reservedH) / gridRows) - (gridRows > 1 ? 24 : 0));\n\n            if (row) {\n                // An additional OUTER facet → 2-D grid: category in columns, the\n                // outer field in rows (VL cannot combine a wrap `facet` with `row`).\n                // A non-wrap `column` + `row` pair is left intact by restructureFacets.\n                spec.encoding.column = facetDef;\n                spec.encoding.row = row;\n            } else {\n                // The per-category panels occupy a wrap facet with an EXPLICIT column\n                // count. We set `encoding.facet` directly (not `encoding.column`) so\n                // the assembler's restructureFacets leaves the grid untouched — it\n                // would otherwise collapse an un-tracked column facet to `columns: 1`.\n                spec.encoding.facet = { ...facetDef, columns };\n            }\n\n            // Explicit per-panel size (numbers) so vlApplyLayoutToSpec keeps them and\n            // the grid is the per-category strip, not a single oversized plot.\n            spec.width = panelW;\n            spec.height = panelH;\n        }\n    },\n    properties: [\n        { key: 'bandwidth', label: 'Bandwidth', type: 'continuous', min: 0.05, max: 2, step: 0.05, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite ECDF Plot (Empirical Cumulative Distribution Function) template.\n *\n * An ECDF plots each distinct value `x` of a quantitative measure against the\n * **proportion of observations ≤ x** — a non-decreasing step that rises from ~0\n * to 1. It is the cumulative cousin of the histogram/density (same distribution\n * family): instead of \"how many observations fall in this bucket\" the read is\n * \"what fraction of the data is below this value\", so medians/percentiles can be\n * read directly off the curve. Multiple groups → one monotonic step curve each,\n * for comparing distributions (a right-shifted curve = larger values).\n *\n * Contract (mirrors density.ts — there is NO user `y`; the cumulative\n * proportion is computed on the value axis):\n *   x      — the quantitative measure whose distribution is shown (rises along x).\n *   color  — optional grouping → one ECDF curve per group (legend).\n *   detail — optional grouping → one curve per group WITHOUT a color legend.\n *   column — optional facet (small multiples).\n *   row    — optional facet (small multiples).\n *\n * Vega-Lite native idiom (no plugins, no precompute): window-transform the raw\n * rows. Sort by the measure and compute a running count (the count of rows ≤ the\n * current value), normalize by the per-group total, then draw a `step-after`\n * line of (measure, proportion). The running count + total are grouped by EVERY\n * grouping/facet field so each curve (and each facet panel) normalizes to its\n * own n and ends at 1.0. The value axis is pinned to [0, 1].\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { setMarkProp } from './utils';\n\nconst showPointsProperty: ChartPropertyDef = {\n    key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false,\n};\n\n/**\n * Pick an internal field name that does not collide with any real data column.\n * The window/joinaggregate/calculate transforms write helper columns (running\n * count, group total, the ECDF proportion); if the user's data already has a\n * column of that name we prefix underscores until it is unique.\n */\nfunction uniqueName(base: string, taken: Set<string>): string {\n    let name = base;\n    while (taken.has(name)) name = `_${name}`;\n    return name;\n}\n\nexport const ecdfPlotDef: ChartTemplateDef = {\n    chart: 'ECDF Plot',\n    template: {\n        mark: { type: 'line', interpolate: 'step-after' },\n        transform: [],\n        encoding: {},\n    },\n    channels: ['x', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: {\n            continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' },\n            facetAspectRatioResistance: 0.5,\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { x, color, detail, column, row } = ctx.resolvedEncodings;\n        const measure = x?.field;\n        if (!measure) return;\n\n        // Internal column names that must not clash with real data columns.\n        const taken = new Set<string>();\n        for (const r of ctx.table ?? []) {\n            for (const k of Object.keys(r)) taken.add(k);\n        }\n        const cntName = uniqueName('__ecdf_count', taken);\n        const totalName = uniqueName('__ecdf_total', taken);\n        const ecdfName = uniqueName('__ecdf', taken);\n\n        // Group the running count + total by every grouping/facet field so each\n        // curve (and each facet panel) is normalized to its own n — otherwise a\n        // grouped/faceted ECDF would share one global count and never reach 1.0\n        // within a group/panel.\n        const groupby: string[] = [];\n        const pushGroup = (f?: string) => {\n            if (f && f !== measure && !groupby.includes(f)) groupby.push(f);\n        };\n        pushGroup(color?.field);\n        pushGroup(detail?.field);\n        pushGroup(column?.field);\n        pushGroup(row?.field);\n\n        spec.transform = [\n            {\n                // Running count of rows ≤ the current value (sorted ascending),\n                // i.e. frame [unbounded-preceding, current-row].\n                window: [{ op: 'count', field: measure, as: cntName }],\n                sort: [{ field: measure, order: 'ascending' }],\n                ...(groupby.length ? { groupby } : {}),\n                frame: [null, 0],\n            },\n            {\n                // Per-group total (n) → the denominator.\n                joinaggregate: [{ op: 'count', field: measure, as: totalName }],\n                ...(groupby.length ? { groupby } : {}),\n            },\n            { calculate: `datum['${cntName}'] / datum['${totalName}']`, as: ecdfName },\n        ];\n\n        // The measure on x (quantitative, titled by its field). An ECDF is read\n        // by locating percentiles across the data's actual range, so suppress the\n        // engine's zero-baseline (which would waste horizontal space on an empty\n        // 0→min gap and make VL's x-range inconsistent with the ECharts/Chart.js\n        // value axes, which already fit the data).\n        spec.encoding.x = {\n            ...x,\n            type: 'quantitative',\n            title: measure,\n            scale: { ...((x as { scale?: Record<string, unknown> })?.scale ?? {}), zero: false },\n        };\n        // The cumulative proportion on y, pinned to [0, 1].\n        spec.encoding.y = {\n            field: ecdfName,\n            type: 'quantitative',\n            scale: { domain: [0, 1] },\n            title: 'Cumulative proportion',\n        };\n\n        if (color?.field) spec.encoding.color = { ...color };\n        if (detail?.field) spec.encoding.detail = { ...detail };\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        if (ctx.chartProperties?.showPoints) {\n            spec.mark = setMarkProp(spec.mark, 'point', true);\n        }\n    },\n    properties: [showPointsProperty],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { defaultBuildEncodings } from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nexport const stripPlotDef: ChartTemplateDef = {\n    chart: \"Strip Plot\",\n    template: {\n        mark: { type: \"circle\", opacity: 0.7 },\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"color\", \"size\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { defaultBandSize: 50, minStep: 16 },\n    }),\n    instantiate: (spec, ctx) => {\n        defaultBuildEncodings(spec, ctx.resolvedEncodings);\n\n        const table = ctx.table;\n        const canvasSize = ctx.canvasSize;\n        const config = ctx.chartProperties;\n\n        const stepWidth = config?.stepWidth ?? 20;\n        let pointSize = config?.pointSize ?? 0;\n        let opacity = config?.opacity ?? 0;\n\n        // Determine which axis is categorical\n        const xType = spec.encoding?.x?.type;\n        const yType = spec.encoding?.y?.type;\n\n        const catAxis = (xType === 'nominal' || xType === 'ordinal') ? 'x'\n            : (yType === 'nominal' || yType === 'ordinal') ? 'y'\n            : null;\n\n        // Count points in the largest categorical group\n        let maxGroupCount = table?.length ?? 0;\n        if (catAxis && spec.encoding?.[catAxis]?.field && table) {\n            const catField = spec.encoding[catAxis].field;\n            const groupCounts: Record<string, number> = {};\n            for (const row of table) {\n                const key = String(row[catField] ?? '');\n                groupCounts[key] = (groupCounts[key] || 0) + 1;\n            }\n            maxGroupCount = Math.max(1, ...Object.values(groupCounts));\n        }\n\n        // Continuous axis length\n        const contLen = catAxis === 'x'\n            ? (canvasSize?.height || 400)\n            : (canvasSize?.width || 400);\n\n        const areaBudget = stepWidth * contLen;\n        const targetCoverage = 0.35;\n\n        // Auto-compute size\n        if (pointSize === 0) {\n            const idealSize = (targetCoverage * areaBudget) / maxGroupCount;\n            pointSize = Math.max(5, Math.min(100, Math.round(idealSize)));\n        }\n\n        // Auto-compute opacity\n        if (opacity === 0) {\n            const density = (maxGroupCount * pointSize) / areaBudget;\n            if (density < 0.2) {\n                opacity = 0.8;\n            } else if (density < 0.5) {\n                opacity = 0.6;\n            } else if (density < 1) {\n                opacity = 0.4;\n            } else {\n                opacity = Math.max(0.1, 0.3 / density);\n            }\n            opacity = Math.round(opacity * 20) / 20;\n        }\n\n        // Apply mark properties\n        if (typeof spec.mark === 'string') {\n            spec.mark = { type: spec.mark };\n        }\n        spec.mark.size = pointSize;\n        spec.mark.opacity = opacity;\n\n        // Set step width and derive jitter\n        const jitterWidth = stepWidth * 0.6;\n        if (catAxis === 'x') {\n            spec.width = { step: stepWidth };\n        } else if (catAxis === 'y') {\n            spec.height = { step: stepWidth };\n        }\n\n        if (jitterWidth > 0) {\n            if (!spec.transform) spec.transform = [];\n            spec.transform.push({\n                calculate: `${-jitterWidth / 2} + random() * ${jitterWidth}`,\n                as: \"__jitter\",\n            });\n\n            const offsetEnc = {\n                field: \"__jitter\",\n                type: \"quantitative\",\n                axis: null,\n                scale: { domain: [-stepWidth / 2, stepWidth / 2] },\n            };\n\n            if (catAxis === 'x') {\n                spec.encoding.xOffset = offsetEnc;\n            } else if (catAxis === 'y') {\n                spec.encoding.yOffset = offsetEnc;\n            } else {\n                spec.encoding.xOffset = offsetEnc;\n            }\n        }\n    },\n    properties: [\n        { key: \"stepWidth\", label: \"Jitter\", type: \"continuous\", min: 10, max: 100, step: 5, defaultValue: 20 },\n        { key: \"pointSize\", label: \"Size\", type: \"continuous\", min: 0, max: 150, step: 5, defaultValue: 0 },\n        { key: \"opacity\", label: \"Opacity\", type: \"continuous\", min: 0, max: 1, step: 0.1, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    // θ chart-type transition (Strip → Scatter) is declared centrally in\n    // core/chart-transitions.ts; the strip plot has no local τ/σ/γ group.\n    pivot: makeCartesianPivot({}),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef } from '../../core/types';\n\nexport const candlestickChartDef: ChartTemplateDef = {\n    chart: \"Candlestick Chart\",\n    template: {\n        encoding: {},\n        layer: [\n            { mark: \"rule\", encoding: {} },\n            { mark: { type: \"bar\", size: 14 }, encoding: {} },\n        ],\n    },\n    channels: [\"x\", \"open\", \"high\", \"low\", \"close\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { x, open, high, low, close, column, row } = ctx.resolvedEncodings;\n\n        if (!spec.encoding) spec.encoding = {};\n        if (x) {\n            spec.encoding.x = x;\n            if (x.type === 'nominal' || x.type === 'ordinal') {\n                spec.encoding.x.sort = null;\n            }\n        }\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        spec.encoding.y = {\n            type: \"quantitative\",\n            scale: { zero: false },\n            axis: { title: null },\n        };\n\n        spec.title = { text: \"Price\", anchor: \"start\", fontSize: 11, fontWeight: \"normal\", color: \"#666\" };\n\n        if (low) spec.layer[0].encoding.y = { field: low.field };\n        if (high) spec.layer[0].encoding.y2 = { field: high.field };\n        if (open) spec.layer[1].encoding.y = { field: open.field };\n        if (close) spec.layer[1].encoding.y2 = { field: close.field };\n\n        if (open?.field && close?.field) {\n            spec.encoding.color = {\n                condition: {\n                    test: `datum['${open.field}'] < datum['${close.field}']`,\n                    value: \"#06982d\",\n                },\n                value: \"#ae1325\",\n            };\n        }\n\n        // Compute bar width from x-axis cardinality\n        const table = ctx.table;\n        const plotWidth = ctx.canvasSize?.width || 400;\n        const xField = spec.encoding?.x?.field;\n        let barSize: number;\n\n        if (xField && table?.length > 0) {\n            const cardinality = new Set(table.map((r: any) => r[xField])).size;\n            barSize = Math.max(2, Math.min(20, Math.round(plotWidth * 0.6 / cardinality)));\n        } else {\n            barSize = 14;\n        }\n\n        spec.layer[1].mark = { ...spec.layer[1].mark, size: barSize };\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Shared waterfall \"totals\" semantics, used by every backend template\n * (Vega-Lite / ECharts / Chart.js) and by the `totals` property `check` so the\n * options UI and the rendered chart never disagree on the default.\n *\n * A waterfall bar is either a *delta* (floats off the running cumulative) or a\n * *total* (anchored at zero, \"touches down\" to the running cumulative). When\n * the data has no explicit type column, Flint infers which ends are totals.\n * The user's `totals` property is purely an *override* of that inference.\n */\n\nexport type WaterfallTotalsMode = 'none' | 'first' | 'last' | 'both';\n\n/**\n * True when the final value reconciles with the running cumulative of every\n * prior row — i.e. the last row reads like a genuine grand-total restatement\n * (`last ≈ Σ prior`). Tolerance is relative (0.5% of the cumulative) with a\n * tiny absolute floor for near-zero totals. Non-finite values never reconcile.\n */\nexport function waterfallLastReconciles(values: number[]): boolean {\n    if (values.length < 2) return false;\n    let cumPrev = 0;\n    for (let i = 0; i < values.length - 1; i++) {\n        if (!Number.isFinite(values[i])) return false;\n        cumPrev += values[i];\n    }\n    const last = values[values.length - 1];\n    if (!Number.isFinite(last)) return false;\n    const tol = Math.max(1e-6, 0.005 * Math.abs(cumPrev));\n    return Math.abs(last - cumPrev) <= tol;\n}\n\n/**\n * The compiler's inferred default when the user hasn't set `totals` and there\n * is no explicit type column. The first bar is always a reasonable start total;\n * the last bar is only treated as a total when it reconciles with the prior\n * cumulative — otherwise it stays a floating delta.\n */\nexport function recommendedTotalsMode(values: number[]): 'first' | 'both' {\n    return waterfallLastReconciles(values) ? 'both' : 'first';\n}\n\n/**\n * Resolve the effective totals mode: a valid explicit user value wins;\n * anything else (undefined, or the UI default 'auto') falls back to the\n * data-aware recommendation.\n */\nexport function resolveTotalsMode(values: number[], explicit?: unknown): WaterfallTotalsMode {\n    if (explicit === 'none' || explicit === 'first' || explicit === 'last' || explicit === 'both') {\n        return explicit;\n    }\n    return recommendedTotalsMode(values);\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { resolveTotalsMode } from '../../chart-types/waterfall';\n\n/**\n * Waterfall Chart template.\n *\n * Expects data with:\n *   - x (nominal): step labels in display order\n *   - y (quantitative): the delta/amount for each step\n *   - color (nominal, optional): a \"Type\" column with values like\n *     \"start\", \"delta\", \"end\"\n *\n * Uses a layered spec: bars + connector rules.\n */\nexport const waterfallChartDef: ChartTemplateDef = {\n    chart: \"Waterfall Chart\",\n    template: { mark: \"bar\", encoding: {} },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { x, y, color, column, row } = ctx.resolvedEncodings;\n        const config = ctx.chartProperties;\n\n        const xField: string = x?.field || 'Category';\n        const yField: string = y?.field || 'Amount';\n        const colorField: string | undefined = color?.field;\n\n        if (!spec.encoding) spec.encoding = {};\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        const hasTypeCol = !!colorField;\n        const typeField = colorField || '__wf_type';\n\n        // ── Transforms ───────────────────────────────────────────────\n        const transforms: any[] = [];\n\n        if (!hasTypeCol) {\n            // Which bars (if any) are drawn as full \"total\" bars that touch down to\n            // zero. The default is data-aware (see chart-types/waterfall.ts): the first bar\n            // is a start total and the last bar is a total only when its value\n            // reconciles with the running cumulative of the prior rows; otherwise it\n            // stays a floating delta. The user's `totals` property overrides this.\n            // When an explicit Type column is present it is authoritative and this\n            // is skipped entirely.\n            const wfValues = ((ctx.fullTable ?? ctx.table) ?? []).map((r: any) => Number(r[yField]));\n            const totalsMode = resolveTotalsMode(wfValues, config?.totals);\n            const wantFirst = totalsMode === 'first' || totalsMode === 'both';\n            const wantLast = totalsMode === 'last' || totalsMode === 'both';\n\n            if (wantFirst || wantLast) {\n                transforms.push(\n                    { window: [{ op: \"row_number\", as: \"__wf_row\" }] },\n                    { joinaggregate: [{ op: \"count\", as: \"__wf_total\" }] },\n                );\n                const branches: string[] = [];\n                if (wantFirst) branches.push(`datum.__wf_row === 1 ? 'start'`);\n                if (wantLast) branches.push(`datum.__wf_row === datum.__wf_total ? 'end'`);\n                transforms.push({\n                    calculate: `${branches.join(' : ')} : 'delta'`,\n                    as: typeField,\n                });\n            } else {\n                transforms.push({ calculate: `'delta'`, as: typeField });\n            }\n        }\n\n        transforms.push({\n            window: [{ op: \"sum\", field: yField, as: \"__wf_sum_raw\" }],\n        });\n\n        transforms.push({\n            calculate: `datum['${typeField}'] === 'end' ? datum.__wf_sum_raw - datum['${yField}'] : datum.__wf_sum_raw`,\n            as: \"__wf_sum\",\n        });\n\n        transforms.push({\n            calculate: `datum['${typeField}'] === 'end' ? 0 : datum.__wf_sum - datum['${yField}']`,\n            as: \"__wf_prev_sum\",\n        });\n\n        // A bar is a beige \"total\" only when its Type value is a recognized anchor\n        // keyword (start/end) — matching the ECharts/Chart.js templates, which key\n        // their color off `start`/`end` too. Any other value, including an\n        // agent-supplied increase/decrease category, is a floating delta colored by\n        // sign, so an unrecognized color vocabulary degrades to sign-based coloring\n        // instead of collapsing every bar to the single \"total\" hue.\n        transforms.push({\n            calculate: `(datum['${typeField}'] === 'start' || datum['${typeField}'] === 'end') ? 'total' : datum['${yField}'] >= 0 ? 'increase' : 'decrease'`,\n            as: \"__wf_color\",\n        });\n\n        // Connector lookahead: the next bar's x label, used to draw a thin rule\n        // bridging the gap between adjacent bars at the running-cumulative level.\n        // On the last row lead() is null, so we point it back at the current label\n        // and null out the connector level so no stray rule is drawn.\n        transforms.push({\n            window: [{ op: \"lead\", field: xField, as: \"__wf_lead\" }],\n        });\n        transforms.push({\n            calculate: `datum.__wf_lead === null ? datum['${xField}'] : datum.__wf_lead`,\n            as: \"__wf_lead\",\n        });\n        transforms.push({\n            calculate: `datum.__wf_lead === datum['${xField}'] ? null : datum.__wf_sum`,\n            as: \"__wf_connector_y\",\n        });\n\n        spec.transform = transforms;\n\n        // ── Shared x encoding ────────────────────────────────────────\n        const xEnc = {\n            field: xField,\n            type: \"ordinal\" as const,\n            sort: null,\n            axis: { labelAngle: -45 },\n        };\n\n        // ── Preserve facet encodings ─────────────────────────────────\n        const facetEncodings: any = {};\n        if (spec.encoding?.column) facetEncodings.column = spec.encoding.column;\n        if (spec.encoding?.row) facetEncodings.row = spec.encoding.row;\n\n        const cornerRadius = (config?.cornerRadius && config.cornerRadius > 0) ? config.cornerRadius : 0;\n\n        const xStep = ctx.layout?.xStep ?? 0;\n\n        // Value labels: keep the text small and only show it when bars are wide\n        // enough that adjacent labels won't collide (safe labeling, like the\n        // heatmap). Font steps down with the band; very narrow bands skip labels.\n        const showLabels = !!config?.showTextLabels;\n        const labelStep = xStep || 40;\n        const labelFits = labelStep >= 18;\n        const labelFontSize = labelStep >= 40 ? 10 : labelStep >= 26 ? 9 : 8;\n        const labelFormat = labelStep >= 36 ? ',' : '~s';\n\n        // Minimum bar height (in data units) needed to hold the inner delta text.\n        // Derived from the running-cumulative span vs the plot height so the gate\n        // is resolution-aware; short bars skip the inner label (outer total stays).\n        const wfLevels = (() => {\n            const vals = ((ctx.fullTable ?? ctx.table) ?? []).map((r: any) => Number(r[yField]) || 0);\n            const lv = [0];\n            let racc = 0;\n            for (const v of vals) { racc += v; lv.push(racc); }\n            return lv;\n        })();\n        const yMin = Math.min(...wfLevels);\n        const yMax = Math.max(...wfLevels);\n        const ySpan = (yMax - yMin) || 1;\n        const plotH = ctx.layout?.subplotHeight || 300;\n        const minDataHeight = ((labelFontSize + 4) / plotH) * ySpan;\n\n        // When outer labels are on, pad the domain so the running-total text at the\n        // extreme top/bottom bar tips isn't clipped by the plot edge.\n        const labelPad = showLabels && labelFits ? ((labelFontSize + 8) / plotH) * ySpan : 0;\n        const yDomain = labelPad > 0 ? [yMin - labelPad, yMax + labelPad] : null;\n\n        spec.encoding = {\n            x: xEnc,\n            ...facetEncodings,\n        };\n\n        spec.layer = [\n            {\n                mark: {\n                    type: \"bar\",\n                    ...(cornerRadius > 0 ? { cornerRadius: cornerRadius } : {}),\n                },\n                encoding: {\n                    y: {\n                        field: \"__wf_prev_sum\",\n                        type: \"quantitative\",\n                        title: yField,\n                        ...(yDomain ? { scale: { domain: yDomain } } : {}),\n                    },\n                    y2: { field: \"__wf_sum\" },\n                    color: {\n                        field: \"__wf_color\",\n                        type: \"nominal\",\n                        scale: {\n                            domain: [\"total\", \"increase\", \"decrease\"],\n                            range: [\"#f7e0b6\", \"#93c4aa\", \"#f78a64\"],\n                        },\n                        legend: { title: \"Type\" },\n                    },\n                },\n            },\n            // Thin connector lines bridging each bar to the next at the running\n            // cumulative level, tracing the bar tops from the current bar's left\n            // edge to the next bar's right edge. `bandPosition` (0 = band left\n            // edge, 1 = band right edge) tracks the actual rendered band width, so\n            // the connector shrinks/grows with the bars automatically rather than\n            // relying on a pixel offset derived from the abstract layout step.\n            {\n                mark: {\n                    type: \"rule\",\n                    color: \"#6b7280\",\n                    opacity: 0.7,\n                    strokeWidth: 1,\n                },\n                encoding: {\n                    x: { field: xField, type: \"ordinal\", sort: null, bandPosition: 0 },\n                    x2: { field: \"__wf_lead\", bandPosition: 1 },\n                    y: { field: \"__wf_connector_y\", type: \"quantitative\" },\n                },\n            },\n        ];\n\n        if (showLabels && labelFits) {\n            // Inner delta needs a vertical center and a signed string (\"+1707\" /\n            // \"-1425\"); the running total is shown outside the bar.\n            spec.transform.push(\n                { calculate: \"(datum.__wf_sum + datum.__wf_prev_sum) / 2\", as: \"__wf_center\" },\n                {\n                    calculate: `datum.__wf_color === 'increase' ? '+' + format(datum['${yField}'], '${labelFormat}') : format(datum['${yField}'], '${labelFormat}')`,\n                    as: \"__wf_delta_text\",\n                },\n            );\n\n            spec.layer.push(\n                // Running total outside the bar (above increases / below decreases).\n                {\n                    mark: {\n                        type: \"text\",\n                        align: \"center\",\n                        baseline: { expr: \"datum.__wf_sum >= datum.__wf_prev_sum ? 'bottom' : 'top'\" },\n                        dy: { expr: \"datum.__wf_sum >= datum.__wf_prev_sum ? -4 : 4\" },\n                        fontSize: labelFontSize,\n                        fill: \"#374151\",\n                    },\n                    encoding: {\n                        y: { field: \"__wf_sum\", type: \"quantitative\" },\n                        text: { field: \"__wf_sum\", type: \"quantitative\", format: labelFormat },\n                    },\n                },\n                // Delta inside the bar, muted in the bar's own hue. Skipped when the\n                // bar is too short to hold the text.\n                {\n                    transform: [{ filter: `abs(datum.__wf_sum - datum.__wf_prev_sum) >= ${minDataHeight}` }],\n                    mark: {\n                        type: \"text\",\n                        align: \"center\",\n                        baseline: \"middle\",\n                        fontSize: labelFontSize,\n                    },\n                    encoding: {\n                        y: { field: \"__wf_center\", type: \"quantitative\" },\n                        text: { field: \"__wf_delta_text\", type: \"nominal\" },\n                        color: {\n                            condition: { test: \"datum.__wf_color === 'total'\", value: \"#725a30\" },\n                            value: \"white\",\n                        },\n                    },\n                },\n            );\n        }\n\n        delete spec.mark;\n    },\n    properties: [\n        { key: \"cornerRadius\", label: \"Corners\", type: \"continuous\", min: 0, max: 8, step: 1, defaultValue: 0 },\n        {\n            key: \"totals\", label: \"Totals\", type: \"discrete\",\n            options: [\n                { value: \"auto\", label: \"Auto\" },\n                { value: \"none\", label: \"None\" },\n                { value: \"first\", label: \"First\" },\n                { value: \"last\", label: \"Last\" },\n                { value: \"both\", label: \"Both\" },\n            ],\n            defaultValue: \"auto\",\n            // Only meaningful when Flint must infer the totals — i.e. there is no\n            // explicit Type column. When the user binds a color/Type field their\n            // start/delta/end is authoritative, so the toggle is not offered. The\n            // default \"auto\" resolves to the data-aware recommendation inside the\n            // template (see chart-types/waterfall.ts resolveTotalsMode).\n            check: (ctx) => ({ applicable: !ctx.encodings?.color?.field }),\n        },\n        { key: 'showTextLabels', label: 'Labels', type: 'binary', defaultValue: false },\n    ] as ChartPropertyDef[],\n};\n","import { SemanticAnnotation, toTypeString } from '../core/field-semantics';\nimport { isTimeSeriesType } from '../core/semantic-types';\nimport { ChartPropertyDef } from '../core/types';\n\nexport interface GanttRow {\n    task: string;\n    start: number;\n    end: number;\n    inputIndex: number;\n}\n\nexport const GANTT_PROPERTIES: ChartPropertyDef[] = [\n    { key: 'taskHeight', label: 'Task height', type: 'continuous', min: 40, max: 90, step: 5, defaultValue: 70 },\n    { key: 'cornerRadius', label: 'Corners', type: 'continuous', min: 0, max: 8, step: 1, defaultValue: 2 },\n    { key: 'intervalLabels', label: 'Labels', type: 'binary', defaultValue: false },\n];\n\nexport function sortGanttRows<T extends GanttRow>(rows: T[]): T[] {\n    return [...rows].sort((a, b) => (a.start - b.start) || (a.inputIndex - b.inputIndex));\n}\n\nexport function coerceGanttEndpoint(value: unknown, temporal: boolean): number {\n    if (value == null) return NaN;\n    if (!temporal) return Number(value);\n    if (value instanceof Date) return value.getTime();\n    if (typeof value === 'number') return Math.abs(value) < 1e11 ? value * 1000 : value;\n    return Date.parse(String(value));\n}\n\nexport function isGanttTemporal(\n    resolvedType: unknown,\n    semanticType: string | SemanticAnnotation | undefined,\n): boolean {\n    if (resolvedType === 'temporal') return true;\n    const typeName = toTypeString(semanticType);\n    return typeName ? isTimeSeriesType(typeName) : false;\n}\n\nfunction compactNumber(value: number): string {\n    return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(2)));\n}\n\nconst GANTT_DURATION_UNITS = [\n    { minimumMs: 86_400_000, divisorMs: 86_400_000, suffix: 'd' },\n    { minimumMs: 3_600_000, divisorMs: 3_600_000, suffix: 'h' },\n    { minimumMs: 60_000, divisorMs: 60_000, suffix: 'min' },\n    { minimumMs: 1_000, divisorMs: 1_000, suffix: 's' },\n    { minimumMs: 0, divisorMs: 1, suffix: 'ms' },\n] as const;\n\nexport function formatGanttDuration(durationMs: number): string {\n    const unit = GANTT_DURATION_UNITS.find(({ minimumMs }) => Math.abs(durationMs) >= minimumMs)!;\n    return `${compactNumber(durationMs / unit.divisorMs)}${unit.suffix}`;\n}\n\nexport function ganttDurationLabelExpression(start: string, end: string, temporal: boolean): string {\n    const startValue = `datum[${JSON.stringify(start)}]`;\n    const endValue = `datum[${JSON.stringify(end)}]`;\n    if (!temporal) return `format(${endValue} - ${startValue}, ',.2~f')`;\n\n    const duration = `(toDate(${endValue}) - toDate(${startValue}))`;\n    return GANTT_DURATION_UNITS.reduceRight((fallback, unit, index) => {\n        const label = `format(${duration} / ${unit.divisorMs}, '.2~f') + '${unit.suffix}'`;\n        return index === GANTT_DURATION_UNITS.length - 1\n            ? label\n            : `(abs(${duration}) >= ${unit.minimumMs} ? ${label} : ${fallback})`;\n    }, '');\n}\n\nexport function formatGanttLabel(\n    start: number,\n    end: number,\n    temporal: boolean,\n): string {\n    const duration = end - start;\n    if (!temporal) return compactNumber(duration);\n    return formatGanttDuration(duration);\n}\n\nexport function ganttLabelReservePx(rows: Pick<GanttRow, 'start' | 'end'>[], temporal: boolean): number {\n    const maxCharacters = rows.reduce((max, row) => (\n        Math.max(max, formatGanttLabel(row.start, row.end, temporal).length)\n    ), 0);\n    return Math.max(40, maxCharacters * 7 + 10);\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    coerceGanttEndpoint,\n    ganttDurationLabelExpression,\n    ganttLabelReservePx,\n    GANTT_PROPERTIES,\n    isGanttTemporal,\n} from '../../chart-types/gantt';\n\n/**\n * Gantt chart — one horizontal bar per task, spanning [start, end].\n *\n * Channels:\n *   - y      task / activity label (the banded category axis)\n *   - x      start of the interval (temporal or quantitative)\n *   - x2     end of the interval (shares x's scale)\n *   - color  optional grouping (phase, owner, resource)\n *\n * The interval lives on x/x2 so the bar is positioned by where it starts and\n * ends rather than measured from a zero baseline — hence markCognitiveChannel\n * 'position' and an explicit non-zero x scale. Tasks are sorted by their start\n * so the timeline reads top-to-bottom in chronological order.\n */\nexport const ganttChartDef: ChartTemplateDef = {\n    chart: \"Gantt Chart\",\n    template: {\n        mark: { type: \"bar\", cornerRadius: 2, height: { band: 0.7 } },\n        encoding: {},\n    },\n    channels: [\"y\", \"x\", \"x2\", \"color\", \"detail\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        axisFlags: { y: { banded: true } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { x, x2, y, color, detail, column, row } = ctx.resolvedEncodings;\n        const taskHeight = (ctx.chartProperties?.taskHeight ?? 70) / 100;\n        const cornerRadius = ctx.chartProperties?.cornerRadius ?? 2;\n        const intervalLabels = ctx.chartProperties?.intervalLabels === true;\n        const temporal = isGanttTemporal(x?.type, x?.field ? ctx.semanticTypes[x.field] : undefined);\n\n        spec.mark = { type: 'bar', cornerRadius, height: { band: taskHeight } };\n\n        if (!spec.encoding) spec.encoding = {};\n\n        if (y) {\n            spec.encoding.y = { ...y };\n            spec.encoding.y.axis = { ...(spec.encoding.y.axis ?? {}), title: null };\n            if (x?.field) {\n                spec.encoding.y.sort = { field: x.field, op: 'min', order: 'ascending' };\n            }\n        }\n\n        if (x) {\n            spec.encoding.x = { ...x, ...(temporal ? { type: 'temporal' } : {}) };\n            spec.encoding.x.axis = { ...(spec.encoding.x.axis ?? {}), title: null };\n            // A non-zero baseline only matters for a quantitative interval; on a\n            // time scale Vega-Lite ignores (and warns about) scale.zero.\n            if (!temporal && x.type === 'quantitative') {\n                spec.encoding.x.scale = { ...(spec.encoding.x.scale ?? {}), zero: false };\n            }\n        }\n        // x2 shares x's scale; it only needs the field reference.\n        if (x2) spec.encoding.x2 = { field: x2.field };\n\n        if (color) spec.encoding.color = color;\n        if (detail) spec.encoding.detail = detail;\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        if (intervalLabels && x?.field && x2?.field && y) {\n            const labelField = '__gantt_label';\n            spec.transform = [\n                ...(spec.transform ?? []),\n                { calculate: ganttDurationLabelExpression(x.field, x2.field, temporal), as: labelField },\n            ];\n            const intervals = ctx.table\n                .map((row: any, inputIndex: number) => ({\n                    task: '',\n                    start: coerceGanttEndpoint(row[x.field], temporal),\n                    end: coerceGanttEndpoint(row[x2.field], temporal),\n                    inputIndex,\n                }))\n                .filter((row) => Number.isFinite(row.start) && Number.isFinite(row.end));\n            const reservePx = ganttLabelReservePx(intervals, temporal);\n            const existingPadding = Number(spec.encoding.x.scale?.padding) || 0;\n            spec.encoding.x.scale = {\n                ...(spec.encoding.x.scale ?? {}),\n                padding: Math.max(existingPadding, reservePx),\n            };\n            const barEncoding = { ...spec.encoding };\n            const facetEncoding: Record<string, any> = {};\n            if (column) facetEncoding.column = column;\n            if (row) facetEncoding.row = row;\n            delete barEncoding.column;\n            delete barEncoding.row;\n            spec.encoding = facetEncoding;\n            spec.layer = [\n                { mark: spec.mark, encoding: barEncoding },\n                {\n                    mark: { type: 'text', align: 'left', baseline: 'middle', dx: 4, fontSize: 10 },\n                    encoding: {\n                        y: { ...y },\n                        x: {\n                            field: x2.field,\n                            type: temporal ? 'temporal' : x.type,\n                            ...(barEncoding.x?.scale ? { scale: barEncoding.x.scale } : {}),\n                        },\n                        text: { field: labelField, type: 'nominal' },\n                    },\n                },\n            ];\n            delete spec.mark;\n        }\n    },\n    properties: GANTT_PROPERTIES,\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef } from '../../core/types';\n\n/**\n * Bullet chart — a compact KPI panel: one row per label, each showing a measure\n * bar compared against its own target, set against muted gray range bands.\n *\n * Channels:\n *   - y      label (the banded category axis — one row per KPI)\n *   - x      measured value (the bar, drawn from a zero baseline)\n *   - goal   target / comparative value (drawn as a tick across the bar)\n *   - color  optional explicit grouping for the value bar\n *\n * Following Stephen Few's design, each row carries graduated gray qualitative\n * bands whose breakpoints are derived from that row's own goal (a quarter, half\n * and three quarters of target), so the comparison is per bar rather than one\n * shared block. The 75%-100% target range is left as the white plot background\n * so the bar and target tick stay the focal elements. The value bar is colored\n * by goal attainment using an explicit muted red/green status palette; a dark\n * tick marks the exact target.\n *\n * Layout follows the candlestick pattern: the banded category channel (y) lives\n * at the top level so every layer — bands, bar and tick — aligns to the same\n * rows, while each layer supplies its own value on x.\n */\n\n// Muted grays for the qualitative zones, darkest nearest zero (poorest range).\nconst ZONE_GRAYS = ['#e2e2e2', '#ececec', '#f5f5f5'];\n// Goal-attainment colors: muted red for under target, muted green for met target.\nconst STATUS_COLORS = { below: '#c44e52', met: '#2f855a' };\nconst STATUS_BELOW = 'Below target';\nconst STATUS_MET = 'Meets target';\n\nexport const bulletChartDef: ChartTemplateDef = {\n    chart: \"Bullet Chart\",\n    template: {\n        encoding: {},\n        layer: [],\n    },\n    channels: [\"y\", \"x\", \"goal\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({\n        axisFlags: { y: { banded: true } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { x, y, goal, color, column, row } = ctx.resolvedEncodings;\n\n        const valueTitle = x ? (x.title ?? x.field) : undefined;\n        const xAxis = valueTitle != null ? { title: valueTitle } : {};\n\n        // Shared category axis at the top level so every layer aligns by row.\n        spec.encoding = {};\n        const yEnc = y\n            ? { ...y, axis: { ...(y.axis ?? {}), title: null } }\n            : undefined;\n        if (yEnc) spec.encoding.y = yEnc;\n        if (column) spec.encoding.column = column;\n        if (row) spec.encoding.row = row;\n\n        const table = ctx.table ?? [];\n        const layers: any[] = [];\n\n        // --- Per-row gray qualitative bands (drawn first, behind everything) ---\n        // Breakpoints come from each row's own goal in quarters; only the lower\n        // performance ranges are shaded, leaving 75% of target and above on the\n        // white plot background.\n        if (x?.field && y?.field && goal?.field && table.length > 0) {\n            const zoneData: Array<Array<Record<string, any>>> = [[], [], []];\n            for (const r of table) {\n                const cat = r[y.field];\n                const g = Number(r[goal.field]);\n                if (cat == null || !Number.isFinite(g) || g <= 0) continue;\n                zoneData[0].push({ [y.field]: cat, __lo: 0, __hi: 0.25 * g });\n                zoneData[1].push({ [y.field]: cat, __lo: 0.25 * g, __hi: 0.5 * g });\n                zoneData[2].push({ [y.field]: cat, __lo: 0.5 * g, __hi: 0.75 * g });\n            }\n            zoneData.forEach((rows, i) => {\n                if (rows.length === 0) return;\n                layers.push({\n                    data: { values: rows },\n                    mark: { type: 'rect', color: ZONE_GRAYS[i], opacity: 1 },\n                    encoding: {\n                        x: { field: '__lo', type: 'quantitative', axis: xAxis },\n                        x2: { field: '__hi' },\n                    },\n                });\n            });\n        }\n\n        // --- Value bar — length from zero, colored by goal attainment ---\n        const barLayer: any = {\n            mark: { type: 'bar', height: { band: 0.5 } },\n            encoding: {},\n        };\n        if (x) {\n            barLayer.encoding.x = {\n                ...x,\n                scale: { ...(x.scale ?? {}), zero: true },\n                axis: { ...(x.axis ?? {}), title: valueTitle },\n            };\n        }\n        if (color) {\n            // Explicit grouping wins over goal-attainment coloring.\n            barLayer.encoding.color = color;\n        } else if (x?.field && goal?.field) {\n            barLayer.transform = [{\n                calculate: `datum[${JSON.stringify(x.field)}] >= datum[${JSON.stringify(goal.field)}] ? '${STATUS_MET}' : '${STATUS_BELOW}'`,\n                as: '__status',\n            }];\n            barLayer.encoding.color = {\n                field: '__status',\n                type: 'nominal',\n                scale: {\n                    domain: [STATUS_BELOW, STATUS_MET],\n                    range: [STATUS_COLORS.below, STATUS_COLORS.met],\n                },\n                legend: { title: null },\n                title: null,\n            };\n        }\n        layers.push(barLayer);\n\n        // --- Target marker — a dark tick at the goal, sized to the row band ---\n        if (goal) {\n            // Size the tick to the actual row band (yStep) so the marker always\n            // sits within its own row, whatever the cardinality. The value bar\n            // fills 50% of the band, so a tick at ~72% reads as a slightly taller\n            // reference marker without spilling into neighbouring rows or past the\n            // plot edges (the bug when sizing off canvas height / row count).\n            const band = ctx.layout?.yStep;\n            const tickSize = band && band > 0\n                ? Math.min(band, Math.max(8, Math.round(band * 0.72)))\n                : 22;\n            layers.push({\n                mark: { type: 'tick', color: '#1a1a1a', thickness: 3, opacity: 1, size: tickSize },\n                encoding: {\n                    x: { field: goal.field, type: 'quantitative', axis: xAxis },\n                },\n            });\n        }\n\n        spec.layer = layers;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, ChannelSemantics } from '../../core/types';\nimport { getRegistryEntry } from '../../core/type-registry';\nimport type { FormatSpec } from '../../core/field-semantics';\nimport { formatSpecToVegaExpr } from '../format';\n\n/**\n * Bar Table — a ranked horizontal \"data bar table\".\n *\n * Visual pattern common in Chinese BI dashboards (FineBI, Quick BI) and\n * Excel/Power BI conditional formatting \"Data Bars\": rows of (category,\n * gradient bar, % share, value), each numeric column right-aligned.\n *\n * Layout uses `hconcat` with three panels sharing the same y scale:\n *   panel 0 — bar (y-axis labels on the left, gradient bar)\n *   panel 1 — % share text (auto-computed via joinaggregate)\n *   panel 2 — raw value text\n *\n * Required encodings:\n *   - y (nominal/ordinal): category column shown as row labels\n *   - x (quantitative): drives bar length AND the value/% columns\n *\n * Optional:\n *   - color (nominal/ordinal): groups rows by hue (overrides default\n *     gradient-by-value styling)\n */\nexport const barTableDef: ChartTemplateDef = {\n    chart: \"Bar Table\",\n    template: {\n        spacing: 4,\n        resolve: { scale: { y: 'shared' } },\n        hconcat: [],\n        config: { view: { stroke: null }, axis: { grid: false, domain: false, ticks: false } },\n    },\n    channels: [\"y\", \"x\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        // Bar tables split the plot width into 3 horizontal panels\n        // (bar | % | value), so they need a wider canvas than a basic\n        // bar chart at the same row count. We also want at least a\n        // moderately tall canvas so 20+ rows don't squish vertically.\n        //\n        // Estimate displayed row count after the Top-N rollup so the\n        // canvas is sized for what the user will actually see, not for\n        // the (possibly huge) raw row count.\n        const yField = cs.y?.field;\n        const facetFields = [cs.column?.field, cs.row?.field].filter(Boolean) as string[];\n        const rawRowCount = (() => {\n            if (!yField) return 0;\n            if (facetFields.length === 0) {\n                return new Set((table ?? []).map((r: any) => r[yField])).size;\n            }\n            const perFacetRows = new Map<string, Set<any>>();\n            for (const r of table ?? []) {\n                const key = facetFields.map(f => String(r[f] ?? '')).join('\\x00');\n                const rows = perFacetRows.get(key) ?? new Set<any>();\n                rows.add(r[yField]);\n                perFacetRows.set(key, rows);\n            }\n            return Math.max(0, ...Array.from(perFacetRows.values()).map(rows => rows.size));\n        })();\n        const maxRows = Math.max(0, Number(chartProperties?.maxRows ?? 20));\n        const displayedRows = maxRows > 0\n            ? Math.min(rawRowCount, maxRows)\n            : rawRowCount;\n        const minSubplotSize = displayedRows >= 30 ? 360 : 280;\n\n        return {\n            axisFlags: { y: { banded: true } },\n            paramOverrides: {\n                // Wider per-row band than the basic 20: leaves room for\n                // both the bar and the two text columns.\n                defaultBandSize: 24,\n                // Floor on overall subplot size — scales up when rows\n                // are dense so the bar column doesn't collapse below\n                // legibility.\n                minSubplotSize,\n                // Lengthen the continuous axis (bar) relative to the\n                // step height. Without this, a tall narrow canvas\n                // (many rows) leaves bars only a sliver wide.\n                targetBandAR: 280,\n            },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { x, y, color, column, row } = ctx.resolvedEncodings;\n        const config = ctx.chartProperties;\n        // ── Source of truth: full pre-overflow data ─────────────────\n        //\n        // We read from `ctx.fullTable` (pre-overflow) rather than\n        // `ctx.table` (post-overflow). The framework's filterOverflow\n        // step silently drops categories that don't fit pixel-budget\n        // assumptions — for a Bar Table, those budgets are wrong\n        // (we override panelHeight ourselves) AND lossy (the whole\n        // design is \"top-N + Others\", which only works if we can see\n        // the actual tail). Falling back to `ctx.table` keeps the\n        // template usable in tests / standalone callers that don't\n        // populate fullTable.\n        const table = ctx.fullTable ?? ctx.table ?? [];\n        const canvasSize = ctx.canvasSize;\n\n        const xField: string = x?.field || 'Value';\n        const yField: string = y?.field || 'Category';\n        const colorField: string | undefined = color?.field;\n        const facetFields = [column?.field, row?.field].filter(Boolean) as string[];\n        const hasFacet = facetFields.length > 0;\n        const scopeKeyOf = (r: any) => facetFields.map(f => String(r[f] ?? '')).join('\\x00');\n        const scopeValuesOf = (r: any) => Object.fromEntries(facetFields.map(f => [f, r[f]]));\n\n        // ── Channel semantics (resolved by framework, may be undefined\n        //    when the chart is rendered without a full pipeline) ───────\n        const xCS: ChannelSemantics | undefined = ctx.channelSemantics?.x;\n        const yCS: ChannelSemantics | undefined = ctx.channelSemantics?.y;\n        const xEntry = getRegistryEntry(xCS?.semanticAnnotation?.semanticType ?? 'Unknown');\n\n        // Sign profile of x values — used by the diverging-palette check.\n        let hasNegative = false;\n        let hasPositive = false;\n        for (const r of table) {\n            const v = r[xField];\n            if (typeof v === 'number' && isFinite(v)) {\n                if (v < 0) hasNegative = true;\n                else if (v > 0) hasPositive = true;\n            }\n        }\n\n        // showPercent: off by default (safer — avoids misleading shares\n        // for intensive measures, already-percent values, mixed-sign\n        // data, etc.). The agent or the user can flip it on when the\n        // measure is genuinely additive.\n        const showPercent = config?.showPercent === true;\n\n        // ── Per-category aggregate (built once on the input table) ──\n        // Used for both the Top-N trim decision and the panel-width\n        // estimation. `aggValue` collapses one group's sum/count into\n        // the single number the chart will display.\n        const useMeanForDisplay = xCS?.aggregationDefault === 'average';\n        const aggValue = (g: { sum: number; n: number }) =>\n            useMeanForDisplay ? g.sum / Math.max(1, g.n) : g.sum;\n\n        const scopedCategoryAgg = new Map<string, {\n            facetValues: Record<string, any>;\n            categories: Map<any, { sum: number; n: number }>;\n        }>();\n        for (const r of table) {\n            const v = r[xField];\n            if (typeof v !== 'number' || !isFinite(v)) continue;\n            const scopeKey = hasFacet ? scopeKeyOf(r) : '';\n            let scope = scopedCategoryAgg.get(scopeKey);\n            if (!scope) {\n                scope = { facetValues: hasFacet ? scopeValuesOf(r) : {}, categories: new Map() };\n                scopedCategoryAgg.set(scopeKey, scope);\n            }\n            const g = scope.categories.get(r[yField]) ?? { sum: 0, n: 0 };\n            g.sum += v; g.n += 1;\n            scope.categories.set(r[yField], g);\n        }\n        const scopes = Array.from(scopedCategoryAgg.entries());\n        const globalCategoryAgg = new Map<any, { sum: number; n: number }>();\n        for (const { categories } of scopedCategoryAgg.values()) {\n            for (const [cat, g] of categories.entries()) {\n                const total = globalCategoryAgg.get(cat) ?? { sum: 0, n: 0 };\n                total.sum += g.sum;\n                total.n += g.n;\n                globalCategoryAgg.set(cat, total);\n            }\n        }\n        const uniqueCats = Array.from(globalCategoryAgg.keys());\n\n        // ── Top-N + \"Others\" rollup ──────────────────────────────────\n        //\n        // Long bar tables become unreadable past ~20 rows. We rank\n        // categories by their per-category aggregate, keep the top\n        // (maxRows − 1), and roll the rest into one synthetic\n        // \"Others (+N)\" row pinned to the bottom.\n        //\n        // Skip when:\n        //   * y has a canonical ordinal order (Month, Rank, …) — top-N\n        //     would break the natural sequence.\n        //   * the user disables it via `maxRows: 0`.\n        //\n        // When a color field is bound (stacked bars), kept categories\n        // retain all their original (color-split) rows so VL can still\n        // stack; the Others row carries no color value and renders gray.\n        const maxRows: number = Math.max(0, Number(config?.maxRows ?? 20));\n        const ySortOrderForTrim: string[] | undefined = yCS?.ordinalSortOrder;\n        const maxScopedCategoryCount = Math.max(0, ...scopes.map(([, scope]) => scope.categories.size));\n        const canTrim = maxRows > 0\n            && !(ySortOrderForTrim && ySortOrderForTrim.length > 0)\n            && maxScopedCategoryCount > maxRows;\n\n        const sortRowsByValue = (items: Array<{ cat: any; value: number }>) => items\n            .sort((a, b) => yCS?.reversed ? a.value - b.value : b.value - a.value);\n\n        let displayTable: any[] = [];\n        let othersCatLabel: string | undefined;\n        let keptCatOrder: any[] | undefined;\n        const perCatAggValues: number[] = [];\n        const perScopeAggValues: number[][] = [];\n        let maxDisplayRowsPerScope = 0;\n\n        if (canTrim) {\n            const keepN = Math.max(1, maxRows - 1);\n            const displayRows: any[] = [];\n            for (const [scopeKey, scope] of scopes) {\n                const sorted = sortRowsByValue(Array.from(scope.categories.entries())\n                    .map(([cat, g]) => ({ cat, value: aggValue(g) })));\n                const keptItems = sorted.slice(0, keepN);\n                const rest = sorted.slice(keepN);\n                if (!hasFacet) {\n                    keptCatOrder = keptItems.map(a => a.cat);\n                }\n                const keptCats = new Set(keptItems.map(a => a.cat));\n\n                if (colorField) {\n                    const keptRanks = new Map(keptItems.map((a, idx) => [a.cat, idx]));\n                    for (const r of table) {\n                        if ((hasFacet ? scopeKeyOf(r) : '') === scopeKey && keptCats.has(r[yField])) {\n                            displayRows.push({ ...r, __bt_sort: keptRanks.get(r[yField]) ?? 0, __bt_others: false, __bt_others_num: 0 });\n                        }\n                    }\n                } else {\n                    keptItems.forEach((a, idx) => {\n                        displayRows.push({ ...scope.facetValues, [yField]: a.cat, [xField]: a.value, __bt_sort: idx, __bt_others: false, __bt_others_num: 0 });\n                    });\n                }\n\n                const restSum = rest.reduce((s, a) => s + a.value, 0);\n                const othersValue = useMeanForDisplay && rest.length > 0 ? restSum / rest.length : restSum;\n                const scopeOthersLabel = `Others (+${rest.length})`;\n                othersCatLabel = othersCatLabel ?? scopeOthersLabel;\n                displayRows.push({\n                    ...scope.facetValues,\n                    [yField]: scopeOthersLabel,\n                    [xField]: othersValue,\n                    __bt_sort: keptItems.length,\n                    __bt_others: true,\n                    __bt_others_num: 1,\n                });\n                const scopeAggValues = [...keptItems.map(a => a.value), othersValue];\n                perCatAggValues.push(...scopeAggValues);\n                perScopeAggValues.push(scopeAggValues);\n                maxDisplayRowsPerScope = Math.max(maxDisplayRowsPerScope, keptItems.length + 1);\n            }\n            displayTable = displayRows;\n        }\n\n        if (!canTrim) {\n            const sortRanksByScope = new Map<string, Map<any, number>>();\n            for (const [scopeKey, scope] of scopes) {\n                const sorted = sortRowsByValue(Array.from(scope.categories.entries())\n                    .map(([cat, g]) => ({ cat, value: aggValue(g) })));\n                sortRanksByScope.set(scopeKey, new Map(sorted.map((a, idx) => [a.cat, idx])));\n                const scopeAggValues = sorted.map(a => a.value);\n                perCatAggValues.push(...scopeAggValues);\n                perScopeAggValues.push(scopeAggValues);\n                maxDisplayRowsPerScope = Math.max(maxDisplayRowsPerScope, sorted.length);\n            }\n            displayTable = table.map(r => {\n                const scopeKey = hasFacet ? scopeKeyOf(r) : '';\n                return { ...r, __bt_sort: sortRanksByScope.get(scopeKey)?.get(r[yField]) ?? 0, __bt_others: false, __bt_others_num: 0 };\n            });\n        }\n\n        // ── Column header labels ─────────────────────────────────────\n        // Derived directly from field names; no override knobs.\n        const categoryHeader = yField;\n        const percentHeader  = '%';\n        const valueHeader    = xField;\n        // headerStyle.fontSize is set below once the responsive\n        // `fontSize` constant is available.\n\n        // ── Format derivation (from ChannelSemantics) ────────────────\n        //\n        // Policy: don't over-process user input. The framework's\n        // `resolveFormat` already follows a \"only override when the raw\n        // number would be misleading\" rule (e.g., 0–1 Percentage with an\n        // intrinsicDomain, currency with a known unit symbol). When\n        // `cs.format` is undefined, the raw value is already readable —\n        // we show it as-is and let VL apply its default number rendering.\n        //\n        // The %-share column (panel 1) is a different story: it's a\n        // *derived* 0..1 ratio computed by us, so it always needs `%`\n        // formatting. That's `pctPattern` below.\n        const valueFmt: FormatSpec | undefined = xCS?.format;\n        const pctPattern = '.1%';\n\n        // ── Text-panel transforms ────────────────────────────────────\n        //\n        // The bar panel naturally handles stacked / grouped data via VL.\n        // The text panels (% and value) must show ONE row per category;\n        // when the input has multiple rows per y-category (e.g. stacked\n        // by `color`), we first aggregate per-category, then derive the\n        // share. Without this, each input row would render its own text\n        // mark (overlapping) and each share would be value/grand-total\n        // (~0% per row instead of the per-category percent).\n        const sortOp: 'sum' | 'mean' = (xCS?.aggregationDefault === 'average') ? 'mean' : 'sum';\n        const uniqueGroupby = (fields: string[]) => Array.from(new Set(fields));\n        const textGroupby = hasFacet ? uniqueGroupby([...facetFields, yField]) : [yField];\n        const textPanelTransform: any[] = [\n            { aggregate: [{ op: sortOp, field: xField, as: '__bt_val' }, { op: 'min', field: '__bt_sort', as: '__bt_sort' }, { op: 'max', field: '__bt_others_num', as: '__bt_others_num' }], groupby: textGroupby },\n        ];\n        if (showPercent) {\n            const totalTransform: any = { joinaggregate: [{ op: 'sum', field: '__bt_val', as: '__bt_total' }] };\n            if (hasFacet) {\n                totalTransform.groupby = facetFields;\n            }\n            textPanelTransform.push(\n                totalTransform,\n                { calculate: `datum.__bt_total === 0 ? null : datum.__bt_val / datum.__bt_total`, as: '__bt_pct' },\n            );\n        }\n\n        const uniqueFacetValueCount = (field?: string) => field\n            ? new Set(displayTable.map(r => r[field])).size\n            : 0;\n        const columnFacetCount = uniqueFacetValueCount(column?.field);\n        const rowFacetCount = uniqueFacetValueCount(row?.field);\n        const layoutFacetColumns = ctx.layout?.facet?.columns ?? (columnFacetCount || 1);\n        const facetColsForSizing = hasFacet\n            ? Math.max(1, Math.min(layoutFacetColumns, columnFacetCount || 1))\n            : 1;\n        const facetRowsForSizing = hasFacet\n            ? Math.max(1, rowFacetCount || Math.ceil(Math.max(1, columnFacetCount) / facetColsForSizing))\n            : 1;\n        const subplotWidth = hasFacet ? (ctx.layout?.subplotWidth ?? canvasSize?.width) : canvasSize?.width;\n        const layoutSubplotHeight = hasFacet ? (ctx.layout?.subplotHeight ?? canvasSize?.height) : canvasSize?.height;\n        const facetHeightBudget = hasFacet && facetRowsForSizing > 1\n            ? (() => {\n                const maxStretch = ctx.assembleOptions?.maxStretchY ?? ctx.assembleOptions?.maxStretch ?? 2;\n                const facetElasticity = ctx.assembleOptions?.facetElasticity ?? 0.3;\n                const fixH = ctx.assembleOptions?.facetFixedPadding?.height ?? 0;\n                const gap = ctx.layout?.effectiveFacetGap ?? ctx.assembleOptions?.facetGap ?? 0;\n                const stretch = Math.min(maxStretch, Math.pow(facetRowsForSizing, facetElasticity));\n                return Math.max(0, Math.round((canvasSize.height * stretch - fixH) / facetRowsForSizing - gap));\n            })()\n            : layoutSubplotHeight;\n\n        // ── Sizing constants (responsive to row density) ────────\n        // `displayCount` is the number of rows the chart will actually\n        // render (post-rollup). As it grows, we shrink fonts so labels\n        // don't crowd. In facets, shrink again when each mini-table has\n        // substantially less plot budget than the full canvas.\n        const displayCount = maxDisplayRowsPerScope || uniqueCats.length;\n        // 0 (sparse, ≤12 rows) … 1 (dense, ≥52 rows) — font/density curve.\n        const density = Math.min(1, Math.max(0, (displayCount - 12) / 40));\n        const lerp = (a: number, b: number) => Math.round(a + (b - a) * density);\n        const subplotWidthRatio = hasFacet && canvasSize?.width\n            ? Math.min(1, Math.max(0, (subplotWidth ?? canvasSize.width) / canvasSize.width))\n            : 1;\n        const subplotHeightRatio = hasFacet && canvasSize?.height\n            ? Math.min(1, Math.max(0, (facetHeightBudget ?? canvasSize.height) / canvasSize.height))\n            : 1;\n        const facetFontDrop = hasFacet\n            ? Math.round((1 - Math.min(subplotWidthRatio, subplotHeightRatio)) * 3)\n            : 0;\n\n        const fontSize       = Math.max(9, lerp(12, 10) - facetFontDrop);   // text panels\n        const labelFontSize  = Math.max(9, lerp(13, 10) - facetFontDrop);   // y-axis tick labels\n\n        // ── Bar geometry: capped thickness, proportional gap ─────────\n        //\n        // Design intent: the bar is the signal — never let it get\n        // stretched into a fat rectangle (un-bar-like) and never let\n        // the gap dominate it. Vega-Lite default bars sit around 18px;\n        // we cap a touch tighter at 16 to match BI \"data bar\" feel.\n        //\n        // Bars stay at `barCap` until row count exceeds `compressStart`,\n        // then shrink linearly to `barMin` by `compressEnd`. Below\n        // `barMin` the mark becomes a hairline and stops reading as\n        // a bar, so we hold the floor.\n        //\n        // Gap = max(`gapMin`, bar × `gapRatio`) — proportional so the\n        // bar:gap ratio stays roughly constant (≈4–5×) across densities,\n        // with a 2px floor so rows never visually merge.\n        const barCap = 16, barMin = 8;\n        const gapMin = 2, gapRatio = 0.2;\n        const compressStart = 30, compressEnd = 80;\n        const compressT = Math.min(1, Math.max(0,\n            (displayCount - compressStart) / (compressEnd - compressStart)));\n        const barPx  = Math.round(barCap - (barCap - barMin) * compressT);\n        const gapPx  = Math.max(gapMin, Math.round(barPx * gapRatio));\n        const rowStep = barPx + gapPx;\n        const barBandRatio = +(barPx / rowStep).toFixed(3);\n\n        const charPx = fontSize * 0.6;\n        const textPad = 12;\n        const minTextPanel = 36;\n        const maxTextPanel = 140;\n        const cjkRe = /[\\u4E00-\\u9FFF\\u3000-\\u303F]/;\n\n        const headerStyle = {\n            fontSize: fontSize,\n            fontWeight: 'normal' as const,\n            color: '#999',\n        };\n\n        // ── Shared y encoding ────────────────────────────────────────\n        // Sort: honor canonical ordinal order if the y field has one\n        // (e.g. Month, Day-of-week, Rank); otherwise rank by aggregated x.\n        // When we trimmed, pin the synthetic \"Others\" row to the bottom\n        // by using an explicit sort array (kept categories in rank order\n        // followed by the Others label).\n        //\n        // Important: we use an explicit category array (not a\n        // `{field, op}` sort) even in the un-trimmed case. The y scale\n        // is `resolve: shared` across 3 panels, but the % / value\n        // panels run an `aggregate` transform that renames `xField` to\n        // `__bt_val`. With a field-based sort, VL can't resolve\n        // `xField` post-transform and falls back to alphabetical\n        // domain order — which silently breaks the ranking.\n        const ySortOrder: string[] | undefined = yCS?.ordinalSortOrder;\n        const rankedCatOrder = (() => {\n            if (canTrim && keptCatOrder && othersCatLabel) {\n                return [...keptCatOrder, othersCatLabel];\n            }\n            return uniqueCats\n                .map(cat => ({ cat, value: aggValue(globalCategoryAgg.get(cat)!) }))\n                .sort((a, b) => yCS?.reversed ? a.value - b.value : b.value - a.value)\n                .map(a => a.cat);\n        })();\n        const ySort: any = ySortOrder && ySortOrder.length > 0\n            ? ySortOrder\n            : hasFacet ? { field: '__bt_sort', op: 'min', order: 'ascending' } : rankedCatOrder;\n\n        // Labels are left-aligned and pushed flush with the panel's left\n        // edge so they line up under the \"Category\" column header.\n        const categoryLabelWidth = (() => {\n            const maxChars = displayTable.reduce((m, r) => {\n                const s = String(r[yField] ?? '');\n                const w = [...s].reduce((a, ch) => a + (cjkRe.test(ch) ? 2 : 1), 0);\n                return Math.max(m, w);\n            }, 0);\n            return Math.min(220, Math.max(60, Math.round(maxChars * labelFontSize * 0.55 + 12)));\n        })();\n        const yEncWithLabels: any = {\n            field: yField,\n            type: 'nominal',\n            sort: ySort,\n            axis: {\n                title: null,\n                domain: false,\n                ticks: false,\n                labelFontSize,\n                labelAlign: 'left',\n                labelPadding: categoryLabelWidth,\n                labelLimit: categoryLabelWidth,\n            },\n        };\n        const yEncNoLabels: any = { ...yEncWithLabels, axis: null };\n\n        // ── Color: gradient by value (default) or grouped by field ───\n        // Diverging types (Profit/Correlation) and mixed-sign data get a\n        // diverging palette anchored at 0; otherwise a sequential ramp.\n        const isDiverging = !colorField && (\n            xEntry.diverging === 'inherent'\n            || (xEntry.diverging === 'conditional' && hasNegative && hasPositive)\n        );\n        const colorEnc = colorField\n            ? (() => {\n                // When we trimmed, the synthetic Others row has no value\n                // for colorField, which would surface as an \"undefined\"\n                // entry in the legend. Restrict the scale domain to the\n                // actual values present in the kept rows.\n                const base: any = { ...color };\n                if (canTrim) {\n                    const vals = Array.from(new Set(\n                        displayTable\n                            .filter(r => !r.__bt_others)\n                            .map(r => r[colorField])\n                            .filter(v => v !== undefined && v !== null)\n                    ));\n                    base.scale = { ...(base.scale || {}), domain: vals };\n                }\n                return base;\n            })()\n            : isDiverging\n                ? {\n                    field: xField,\n                    type: 'quantitative',\n                    legend: null,\n                    scale: { scheme: 'redyellowgreen', domainMid: 0 },\n                }\n                : {\n                    field: xField,\n                    type: 'quantitative',\n                    legend: null,\n                    scale: { range: ['#cdebd3', '#41a25f'] },\n                };\n\n        // ── Dynamic panel widths from longest formatted label ────────\n        //\n        // Approximates the framework's d3-format output well enough for\n        // panel sizing. When no format is resolved, we just show the raw\n        // value via `String(v)` and measure that.\n        const approxFormat = (v: number): string => {\n            if (!Number.isFinite(v)) return '';\n            if (!valueFmt) return String(v);\n            const p = valueFmt.pattern || '';\n            let body: string;\n            if (p.includes('%')) {\n                const dec = /\\.(\\d+)/.exec(p)?.[1];\n                body = (v * 100).toFixed(dec ? parseInt(dec) : 1) + '%';\n            } else if (p.includes('d')) {\n                body = Math.round(v).toLocaleString('en-US');\n            } else if (/~s|s$/.test(p)) {\n                body = Math.abs(v) >= 1e6 ? (v / 1e6).toFixed(1) + 'M'\n                     : Math.abs(v) >= 1e3 ? (v / 1e3).toFixed(1) + 'K'\n                     : v.toFixed(0);\n            } else if (p) {\n                const dec = /\\.(\\d+)/.exec(p)?.[1];\n                body = v.toLocaleString('en-US', {\n                    minimumFractionDigits: dec ? parseInt(dec) : 0,\n                    maximumFractionDigits: dec ? parseInt(dec) : 2,\n                });\n            } else {\n                body = String(v);\n            }\n            return (valueFmt.prefix ?? '') + body + (valueFmt.suffix ?? '');\n        };\n        const approxPct = (v: number) =>\n            Number.isFinite(v) ? `${(v * 100).toFixed(1)}%` : '';\n\n        const measure = (strs: string[]) => {\n            const maxChars = strs.reduce((m, s) => Math.max(m, s.length), 0);\n            return Math.min(maxTextPanel, Math.max(minTextPanel, Math.round(maxChars * charPx + textPad)));\n        };\n\n        // ── Header wrap / truncate strategy ──────────────────────────\n        // Long field names like `video_views_for_the_last_30_days` blow\n        // past panel width. We try to fit them by:\n        //   1. measuring single-line width and reserving that as a\n        //      minimum for the panel (capped at maxTextPanel);\n        //   2. wrapping on `_` / space boundaries into up to two lines\n        //      when the single line still doesn't fit;\n        //   3. handing VL a `title.limit` so it ellipsizes anything\n        //      that still overflows.\n        const headerPad = 4;\n        const headerWidthOf = (s: string) => Math.round(s.length * charPx) + headerPad;\n        const wrapHeader = (label: string, maxPx: number): { text: string | string[]; widthPx: number } => {\n            const single = headerWidthOf(label);\n            if (single <= maxPx) return { text: label, widthPx: single };\n            const tokens = label.split(/[_\\s]+/).filter(Boolean);\n            if (tokens.length < 2) return { text: label, widthPx: single };\n            // Greedy balanced two-line split on token boundaries.\n            const totalLen = tokens.reduce((a, t) => a + t.length, 0);\n            let acc = 0, splitAt = 1;\n            for (let i = 0; i < tokens.length - 1; i++) {\n                acc += tokens[i].length;\n                if (acc >= totalLen / 2) { splitAt = i + 1; break; }\n            }\n            const line1 = tokens.slice(0, splitAt).join('_');\n            const line2 = tokens.slice(splitAt).join('_');\n            return { text: [line1, line2], widthPx: Math.max(headerWidthOf(line1), headerWidthOf(line2)) };\n        };\n\n        // Per-category aggregate values used for panel-width sizing.\n        // Built above as `perCatAggValues` — reuse directly.\n\n        // Wrap headers up to the panel's max width budget; the wrap\n        // result's `widthPx` then acts as a floor on the actual panel\n        // width (so the title doesn't get truncated when the data is\n        // narrower than the header).\n        const valueHeaderWrap   = wrapHeader(valueHeader,   maxTextPanel - headerPad);\n        const percentHeaderWrap = wrapHeader(percentHeader, maxTextPanel - headerPad);\n\n        const valuePanelDataWidth = measure(perCatAggValues.map(approxFormat));\n        const valuePanelWidth = Math.min(\n            maxTextPanel,\n            Math.max(valuePanelDataWidth, valueHeaderWrap.widthPx + headerPad, minTextPanel),\n        );\n        const pctValuesForSizing = perScopeAggValues.flatMap(values => {\n            const scopeTotal = values.reduce((a, b) => a + b, 0);\n            return Math.abs(scopeTotal) > 1e-9 ? values.map(v => v / scopeTotal) : [];\n        });\n        const percentPanelWidth = showPercent && pctValuesForSizing.length > 0\n            ? Math.min(\n                maxTextPanel,\n                Math.max(\n                    measure(pctValuesForSizing.map(approxPct)),\n                    percentHeaderWrap.widthPx + headerPad,\n                    minTextPanel,\n                ),\n            )\n            : 0;\n\n        const totalWidth = subplotWidth ?? 480;\n        const interPanelGap = 8;\n        const reservedForText = valuePanelWidth + interPanelGap\n            + (showPercent ? percentPanelWidth + interPanelGap : 0);\n        // Bar panel needs a meaningful min width — a 3-panel layout\n        // squeezes the bar column more than a basic bar chart, and the\n        // bar IS the chart, so it should never collapse below ~45% of\n        // the plot budget. Faceted small multiples get a smaller\n        // absolute floor so each mini-table can shrink like other charts.\n        const minBarPanelWidth = hasFacet\n            ? Math.max(80, Math.round(totalWidth * 0.45))\n            : Math.max(180, Math.round(totalWidth * 0.45));\n        const barPanelWidth = Math.max(minBarPanelWidth, totalWidth - reservedForText - categoryLabelWidth);\n\n        const yCard = Math.max(1, maxDisplayRowsPerScope || new Set(displayTable.map(r => r[yField])).size);\n        const panelHeight = Math.max(facetHeightBudget ?? 0, yCard * rowStep);\n\n        // ── Helpers to build a text encoding honoring prefix/suffix ──\n        //\n        // - No fmt resolved  → show the raw field, VL default rendering.\n        // - Pattern only     → VL `format` shortcut.\n        // - With affixes     → calculate transform that concats prefix\n        //                      + format(value, pattern) + suffix.\n        const buildTextEncoding = (\n            sourceField: string,\n            fmt: FormatSpec | undefined,\n            transformsOut: any[],\n            outFieldHint: string,\n        ): any => {\n            if (!fmt || (!fmt.pattern && !fmt.prefix && !fmt.suffix)) {\n                return { field: sourceField, type: 'quantitative' };\n            }\n            if (!fmt.abbreviate && fmt.pattern && !fmt.prefix && !fmt.suffix) {\n                return { field: sourceField, type: 'quantitative', format: fmt.pattern };\n            }\n            const formatExpr = formatSpecToVegaExpr(fmt, `datum[${JSON.stringify(sourceField)}]`);\n            if (!formatExpr) return { field: sourceField, type: 'quantitative' };\n            transformsOut.push({\n                calculate: formatExpr,\n                as: outFieldHint,\n            });\n            return { field: outFieldHint, type: 'nominal' };\n        };\n\n        // ── X-scale: anchor bars at 0 for diverging measures ─────────\n        const barXScale: any = { nice: false };\n        if (isDiverging) barXScale.domainMid = 0;\n\n        // ── Per-panel data: always register `displayTable` as a named\n        //    dataset and reference it from every panel. The Bar Table\n        //    is self-contained — we read from `ctx.fullTable` and\n        //    derive the exact rows we want to render, so we must NOT\n        //    fall back to the framework's root data injection (which\n        //    is the post-overflow filtered table and would silently\n        //    drop categories behind our back).\n        const datasetName = '__bt_displayTable';\n        spec.datasets = { ...(spec.datasets || {}), [datasetName]: displayTable };\n        if (hasFacet) {\n            spec.data = { name: datasetName };\n        }\n        const withData = (panel: any) => hasFacet ? panel : ({ data: { name: datasetName }, ...panel });\n\n        // ── Others row: gray out across panels ───────────────────────\n        // Text panels aggregate rows, so carry a numeric flag through\n        // the aggregate instead of relying on facet-specific labels.\n        const othersGray = '#bdbdbd';\n        const othersTextTest = canTrim\n            ? `datum.__bt_others_num === 1 || datum.__bt_others === true`\n            : undefined;\n\n        // ── Panel 0: bar (with y-axis labels) ────────────────────────\n        //\n        // For additive measures (sortOp = 'sum'), we let VL natively\n        // stack raw rows — the bar's length equals the row sum, which\n        // matches what the value text panel displays. This also keeps\n        // per-segment detail (gradient stripes / colored sub-groups).\n        //\n        // For non-additive measures (sortOp = 'mean'), stacking raw\n        // rows would silently encode bar length = SUM(values), which\n        // contradicts the MEAN we display in the value column. In that\n        // case we aggregate the bar data the same way the text panel\n        // does so the bar's length matches the displayed number.\n        const barAggregate = useMeanForDisplay;\n        const barTransform: any[] | undefined = barAggregate\n            ? [{\n                aggregate: [{ op: sortOp, field: xField, as: '__bt_val' }, { op: 'min', field: '__bt_sort', as: '__bt_sort' }, { op: 'max', field: '__bt_others_num', as: '__bt_others_num' }],\n                groupby: uniqueGroupby([...facetFields, yField, ...(colorField ? [colorField] : [])]),\n            }]\n            : undefined;\n        const barXField = barAggregate ? '__bt_val' : xField;\n\n        // Gradient-by-value color (no user color field) must reference\n        // the same field the bar's x encoding uses, otherwise the scale\n        // can't resolve post-aggregate.\n        const barColorBase = !colorField && barAggregate\n            ? (isDiverging\n                ? { field: '__bt_val', type: 'quantitative', legend: null, scale: { scheme: 'redyellowgreen', domainMid: 0 } }\n                : { field: '__bt_val', type: 'quantitative', legend: null, scale: { range: ['#cdebd3', '#41a25f'] } })\n            : colorEnc;\n\n        // Others-row detection: when we aggregate, the `__bt_others`\n        // flag is dropped, so fall back to the y-label test used by the\n        // text panels.\n        const barOthersTest = barAggregate ? othersTextTest : 'datum.__bt_others';\n        const barColorEnc: any = canTrim && barOthersTest\n            ? { condition: { test: barOthersTest, value: othersGray }, ...barColorBase }\n            : barColorBase;\n\n        const barPanel: any = withData({\n            width: barPanelWidth,\n            height: panelHeight,\n            // No `limit` here — the category header is allowed to\n            // overflow the (narrow) y-label gutter into the bar area\n            // so long field names stay legible.\n            title: { text: categoryHeader, anchor: 'start', offset: 6, ...headerStyle },\n            ...(barTransform ? { transform: barTransform } : {}),\n            mark: {\n                type: 'bar',\n                height: { band: barBandRatio },\n            },\n            encoding: {\n                y: yEncWithLabels,\n                x: {\n                    field: barXField,\n                    type: 'quantitative',\n                    axis: null,\n                    scale: barXScale,\n                },\n                color: barColorEnc,\n            },\n        });\n\n        const panels: any[] = [barPanel];\n\n        // ── Panel 1: % share (right-aligned text column) ─────────────\n        // Uses the per-category aggregate (__bt_pct) so it shows the\n        // category's share of the grand total, not a per-row fraction.\n        if (showPercent) {\n            const pctColor: any = othersTextTest\n                ? { condition: { test: othersTextTest, value: othersGray }, value: '#41a25f' }\n                : { value: '#41a25f' };\n            panels.push(withData({\n                width: percentPanelWidth,\n                height: panelHeight,\n                transform: textPanelTransform,\n                title: { text: percentHeaderWrap.text, anchor: 'end', offset: 6, limit: Math.max(20, percentPanelWidth - headerPad), ...headerStyle },\n                mark: {\n                    type: 'text',\n                    align: 'right',\n                    baseline: 'middle',\n                    fontSize,\n                },\n                encoding: {\n                    y: yEncNoLabels,\n                    x: { datum: 1, axis: null, scale: { type: 'linear', domain: [0, 1] } },\n                    text: { field: '__bt_pct', type: 'quantitative', format: pctPattern },\n                    color: pctColor,\n                },\n            }));\n        }\n\n        // ── Panel 2: aggregated value (right-aligned text column) ────\n        // Displays __bt_val (per-category total/mean) — one mark per\n        // category, regardless of how many input rows existed.\n        {\n            const valueTransforms: any[] = [...textPanelTransform];\n            const textEnc = buildTextEncoding('__bt_val', valueFmt, valueTransforms, '__bt_val_str');\n            const valColor: any = othersTextTest\n                ? { condition: { test: othersTextTest, value: othersGray }, value: '#666' }\n                : { value: '#666' };\n            panels.push(withData({\n                width: valuePanelWidth,\n                height: panelHeight,\n                transform: valueTransforms,\n                title: { text: valueHeaderWrap.text, anchor: 'end', offset: 6, limit: Math.max(20, valuePanelWidth - headerPad), ...headerStyle },\n                mark: {\n                    type: 'text',\n                    align: 'right',\n                    baseline: 'middle',\n                    fontSize,\n                },\n                encoding: {\n                    y: yEncNoLabels,\n                    x: { datum: 1, axis: null, scale: { type: 'linear', domain: [0, 1] } },\n                    text: textEnc,\n                    color: valColor,\n                },\n            }));\n        }\n\n        spec.spacing = interPanelGap;\n        spec.hconcat = panels;\n\n        // Facets (column/row) live on the outer spec.\n        if (column || row) {\n            spec.encoding = spec.encoding || {};\n            if (column) spec.encoding.column = column;\n            if (row) spec.encoding.row = row;\n        }\n    },\n    properties: [\n        { key: 'maxRows', label: 'Max Rows', type: 'continuous', min: 5, max: 100, step: 1, defaultValue: 20 },\n        // Off by default — safer for arbitrary measures. The agent (or\n        // the user) can flip it on when a \"% of total\" share is\n        // meaningful (additive, single-sign, non-zero total). Its `check`\n        // reports applicability per render from the measure's data.\n        {\n            key: 'showPercent', label: '% of total', type: 'binary', defaultValue: false,\n            check: (ctx) => {\n                // A \"% of total\" share only reads sensibly for an additive,\n                // single-sign measure with a non-zero total — a share of a\n                // mixed-sign or intensive (mean-aggregated) measure is misleading.\n                const mcs = ctx.channelSemantics?.x;\n                if (!mcs?.field || mcs.type !== 'quantitative' || mcs.aggregationDefault === 'average') {\n                    return { applicable: false };\n                }\n                let sum = 0, hasNeg = false, hasPos = false, count = 0;\n                for (const row of ctx.data ?? []) {\n                    const v = row[mcs.field];\n                    if (typeof v !== 'number' || !isFinite(v)) continue;\n                    count++;\n                    if (v < 0) hasNeg = true; else if (v > 0) hasPos = true;\n                    sum += v;\n                }\n                return { applicable: count > 0 && !(hasNeg && hasPos) && Math.abs(sum) > 0 };\n            },\n        },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\n\n/**\n * Radar / Spider Chart\n *\n * Data model (long format):\n *   - x (nominal): the metric / axis name\n *   - y (quantitative): the value for that metric\n *   - color (nominal): the entity / group\n *\n * Supports column/row faceting.\n */\n\n// ---------------------------------------------------------------------------\n// Helper: round up to a \"nice\" ceiling for axis max\n// ---------------------------------------------------------------------------\nfunction niceMax(v: number): number {\n    if (v <= 0) return 1;\n    const pow = Math.pow(10, Math.floor(Math.log10(v)));\n    const mantissa = v / pow;\n    const nice = mantissa <= 1 ? 1\n        : mantissa <= 2 ? 2\n        : mantissa <= 2.5 ? 2.5\n        : mantissa <= 5 ? 5\n        : 10;\n    return nice * pow;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: build VL layers for a single radar from long-format rows\n// ---------------------------------------------------------------------------\nfunction buildRadarLayers(\n    rows: any[],\n    axisField: string,\n    valueField: string,\n    groupField: string | undefined,\n    opts: { filled: boolean; fillOpacity: number; strokeWidth: number; domainPad: number },\n): any[] {\n    const axes: string[] = [];\n    const axisSet = new Set<string>();\n    for (const row of rows) {\n        const a = String(row[axisField]);\n        if (!axisSet.has(a)) { axisSet.add(a); axes.push(a); }\n    }\n    if (axes.length < 2) return [];\n\n    const groups: string[] = [];\n    if (groupField) {\n        const groupSet = new Set<string>();\n        for (const row of rows) {\n            const g = String(row[groupField]);\n            if (!groupSet.has(g)) { groupSet.add(g); groups.push(g); }\n        }\n    } else {\n        groups.push(\"_all\");\n    }\n\n    // Normalise each axis to 0-1\n    const axisMax: Record<string, number> = {};\n    for (const axis of axes) {\n        const vals = rows\n            .filter(r => String(r[axisField]) === axis)\n            .map(r => Number(r[valueField]))\n            .filter(v => isFinite(v));\n        const mx = vals.length > 0 ? Math.max(...vals) : 1;\n        axisMax[axis] = niceMax(mx);\n    }\n\n    // Aggregate: average per (group, axis)\n    const keyMap = new Map<string, { sum: number; rawSum: number; count: number }>();\n    for (const row of rows) {\n        const grp = groupField ? String(row[groupField]) : \"_all\";\n        const axis = String(row[axisField]);\n        const raw = Number(row[valueField]) || 0;\n        const mx = axisMax[axis];\n        const norm = mx > 0 ? raw / mx : 0;\n        const k = `${grp}|||${axis}`;\n        if (!keyMap.has(k)) keyMap.set(k, { sum: 0, rawSum: 0, count: 0 });\n        const entry = keyMap.get(k)!;\n        entry.sum += norm;\n        entry.rawSum += raw;\n        entry.count += 1;\n    }\n\n    // Compute polar coordinates\n    const angleStep = 360 / axes.length;\n    const finalData: any[] = [];\n    for (const [k, v] of keyMap.entries()) {\n        const [grp, axis] = k.split('|||');\n        const axisIndex = axes.indexOf(axis);\n        const angle = axisIndex * angleStep;\n        const normVal = v.sum / v.count;\n        const rawVal = Math.round((v.rawSum / v.count) * 100) / 100;\n        const rad = (angle * Math.PI) / 180;\n        finalData.push({\n            __group: grp,\n            __axis: axis,\n            __value: normVal,\n            __raw: rawVal,\n            __angle: angle,\n            __x: normVal * Math.sin(rad),\n            __y: -normVal * Math.cos(rad),\n        });\n    }\n\n    // Grid data (spokes + concentric rings)\n    const gridData: any[] = [];\n    for (let idx = 0; idx < axes.length; idx++) {\n        const ang = (idx * angleStep * Math.PI) / 180;\n        gridData.push({\n            __type: \"spoke\",\n            __x: 0, __y: 0,\n            __x2: Math.sin(ang),\n            __y2: -Math.cos(ang),\n        });\n    }\n    for (const level of [0.25, 0.5, 0.75, 1.0]) {\n        const points: any[] = [];\n        for (let i = 0; i <= axes.length; i++) {\n            const ang = ((i % axes.length) * angleStep * Math.PI) / 180;\n            points.push({ __x: level * Math.sin(ang), __y: -level * Math.cos(ang) });\n        }\n        for (let i = 0; i < points.length - 1; i++) {\n            gridData.push({\n                __type: \"ring\", __level: level,\n                __x: points[i].__x, __y: points[i].__y,\n                __x2: points[i + 1].__x, __y2: points[i + 1].__y,\n            });\n        }\n    }\n\n    // Axis labels\n    const labelData = axes.map((axis, i) => {\n        const angDeg = i * angleStep;\n        const ang = (angDeg * Math.PI) / 180;\n        const r = 1.15;\n        const mx = axisMax[axis];\n        const maxStr = mx % 1 === 0 ? String(mx) : mx.toFixed(1);\n\n        const sinA = Math.sin(ang);\n        const cosA = -Math.cos(ang);\n        let align: string;\n        let baseline: string;\n        let dx = 0;\n        let dy = 0;\n\n        if (Math.abs(sinA) < 0.15) {\n            align = 'center';\n            baseline = cosA < 0 ? 'bottom' : 'top';\n            dy = cosA < 0 ? -4 : 4;\n        } else if (sinA > 0) {\n            align = 'left';\n            baseline = Math.abs(cosA) < 0.3 ? 'middle' : (cosA < 0 ? 'bottom' : 'top');\n            dx = 4;\n        } else {\n            align = 'right';\n            baseline = Math.abs(cosA) < 0.3 ? 'middle' : (cosA < 0 ? 'bottom' : 'top');\n            dx = -4;\n        }\n\n        return {\n            __label: [axis, `(${maxStr})`],\n            __x: r * Math.sin(ang), __y: -r * Math.cos(ang),\n            __align: align, __baseline: baseline, __dx: dx, __dy: dy,\n        };\n    });\n\n    const { filled, fillOpacity, strokeWidth, domainPad } = opts;\n    const layers: any[] = [];\n\n    // Spokes\n    layers.push({\n        data: { values: gridData.filter(d => d.__type === \"spoke\") },\n        mark: { type: \"rule\", stroke: \"#ddd\", strokeWidth: 0.8 },\n        encoding: {\n            x: { field: \"__x\", type: \"quantitative\", scale: { domain: [-domainPad, domainPad] }, axis: null },\n            y: { field: \"__y\", type: \"quantitative\", scale: { domain: [-domainPad, domainPad] }, axis: null },\n            x2: { field: \"__x2\" }, y2: { field: \"__y2\" },\n        },\n    });\n\n    // Rings\n    layers.push({\n        data: { values: gridData.filter(d => d.__type === \"ring\") },\n        mark: { type: \"rule\", stroke: \"#e0e0e0\", strokeWidth: 0.6 },\n        encoding: {\n            x: { field: \"__x\", type: \"quantitative\", axis: null },\n            y: { field: \"__y\", type: \"quantitative\", axis: null },\n            x2: { field: \"__x2\" }, y2: { field: \"__y2\" },\n        },\n    });\n\n    // Labels\n    for (const lbl of labelData) {\n        const lines: string[] = lbl.__label;\n        layers.push({\n            data: { values: [lbl] },\n            mark: {\n                type: \"text\", fontSize: 10, fill: \"#555\",\n                align: lbl.__align, baseline: lbl.__baseline,\n                dx: lbl.__dx, dy: lbl.__dy,\n                limit: 120, lineHeight: 13,\n            },\n            encoding: {\n                x: { field: \"__x\", type: \"quantitative\", axis: null },\n                y: { field: \"__y\", type: \"quantitative\", axis: null },\n                text: { value: lines },\n            },\n        });\n    }\n\n    // Data polygon\n    const lineLayer: any = {\n        data: { values: finalData },\n        mark: {\n            type: \"line\", interpolate: \"linear-closed\", strokeWidth, point: false,\n            ...(filled ? { fillOpacity } : {}),\n        },\n        encoding: {\n            x: { field: \"__x\", type: \"quantitative\", axis: null },\n            y: { field: \"__y\", type: \"quantitative\", axis: null },\n            order: { field: \"__angle\", type: \"quantitative\" },\n            tooltip: [\n                { field: \"__axis\", type: \"nominal\", title: axisField },\n                { field: \"__raw\", type: \"quantitative\", title: valueField },\n            ],\n        },\n    };\n    if (groups.length > 1 && groupField) {\n        lineLayer.encoding.stroke = { field: \"__group\", type: \"nominal\", title: groupField };\n        if (filled) {\n            lineLayer.encoding.fill = { field: \"__group\", type: \"nominal\", title: groupField, legend: null };\n        }\n    } else if (filled) {\n        lineLayer.mark.fill = \"#4c78a8\";\n    }\n    layers.push(lineLayer);\n\n    // Data points\n    const pointLayer: any = {\n        data: { values: finalData },\n        mark: { type: \"point\", filled: true, size: 25 },\n        encoding: {\n            x: { field: \"__x\", type: \"quantitative\", axis: null },\n            y: { field: \"__y\", type: \"quantitative\", axis: null },\n            tooltip: [\n                ...(groupField ? [{ field: \"__group\", type: \"nominal\", title: groupField }] : []),\n                { field: \"__axis\", type: \"nominal\", title: axisField },\n                { field: \"__raw\", type: \"quantitative\", title: valueField },\n            ],\n        },\n    };\n    if (groups.length > 1 && groupField) {\n        pointLayer.encoding.color = { field: \"__group\", type: \"nominal\", title: groupField, legend: null };\n    }\n    layers.push(pointLayer);\n\n    return layers;\n}\n\n// ---------------------------------------------------------------------------\n// Template definition\n// ---------------------------------------------------------------------------\nexport const radarChartDef: ChartTemplateDef = {\n    chart: \"Radar Chart\",\n    template: {\n        description: \"Radar / Spider chart\",\n        mark: \"point\",\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const axisField: string | undefined = ctx.resolvedEncodings.x?.field;\n        const valueField: string | undefined = ctx.resolvedEncodings.y?.field;\n        const groupField: string | undefined = ctx.resolvedEncodings.color?.field;\n        const columnField: string | undefined = ctx.resolvedEncodings.column?.field;\n        const rowField: string | undefined = ctx.resolvedEncodings.row?.field;\n\n        const table = ctx.table;\n        const canvasSize = ctx.canvasSize;\n        const config = ctx.chartProperties;\n\n        const filled = config?.filled ?? true;\n        const fillOpacity = config?.fillOpacity ?? 0.15;\n        const strokeWidth = config?.strokeWidth ?? 1.5;\n\n        if (!table || table.length === 0 || !axisField || !valueField) {\n            spec.mark = \"point\";\n            return;\n        }\n\n        const size = Math.min(canvasSize?.width || 400, canvasSize?.height || 400);\n        const layerOpts = { filled, fillOpacity, strokeWidth, domainPad: 1.18 };\n\n        // ---- No faceting ----\n        if (!columnField && !rowField) {\n            const layers = buildRadarLayers(table, axisField, valueField, groupField, layerOpts);\n            if (layers.length === 0) { spec.mark = \"point\"; return; }\n\n            const finalSpec: any = {\n                width: size, height: size, layer: layers,\n                config: { view: { stroke: null } },\n            };\n            for (const key of Object.keys(spec)) delete spec[key];\n            Object.assign(spec, finalSpec);\n            return;\n        }\n\n        // ---- Faceting ----\n        const colGroups: string[] = columnField\n            ? [...new Set(table.map(r => String(r[columnField])))] as string[]\n            : [\"_all\"];\n        const rowGroups: string[] = rowField\n            ? [...new Set(table.map(r => String(r[rowField])))] as string[]\n            : [\"_all\"];\n\n        const minSubplot = 200;\n        const subplotSize = Math.max(minSubplot, size);\n\n        const buildSubplot = (rows: any[], title?: string) => {\n            const layers = buildRadarLayers(rows, axisField, valueField, groupField, layerOpts);\n            if (layers.length === 0) return null;\n            return {\n                width: subplotSize, height: subplotSize,\n                layer: layers,\n                title: title || undefined,\n            };\n        };\n\n        let finalSpec: any;\n        const concatSpacing = 5;\n\n        if (rowField && columnField) {\n            const vconcat: any[] = [];\n            for (const rg of rowGroups) {\n                const hconcat: any[] = [];\n                for (const cg of colGroups) {\n                    const subset = table.filter(r => String(r[rowField]) === rg && String(r[columnField]) === cg);\n                    const s = buildSubplot(subset, `${cg}`);\n                    if (s) hconcat.push(s);\n                }\n                if (hconcat.length > 0) {\n                    vconcat.push({ hconcat, spacing: concatSpacing, title: rg });\n                }\n            }\n            finalSpec = { vconcat, spacing: concatSpacing, config: { view: { stroke: null } } };\n        } else if (columnField) {\n            const hconcat: any[] = [];\n            for (const cg of colGroups) {\n                const subset = table.filter(r => String(r[columnField]) === cg);\n                const s = buildSubplot(subset, cg);\n                if (s) hconcat.push(s);\n            }\n            finalSpec = { hconcat, spacing: concatSpacing, config: { view: { stroke: null } } };\n        } else {\n            const vconcat: any[] = [];\n            for (const rg of rowGroups) {\n                const subset = table.filter(r => String(r[rowField!]) === rg);\n                const s = buildSubplot(subset, rg);\n                if (s) vconcat.push(s);\n            }\n            finalSpec = { vconcat, spacing: concatSpacing, config: { view: { stroke: null } } };\n        }\n\n        for (const key of Object.keys(spec)) delete spec[key];\n        Object.assign(spec, finalSpec);\n    },\n    properties: [\n        { key: \"filled\", label: \"Filled\", type: \"binary\", defaultValue: true },\n        { key: \"fillOpacity\", label: \"Fill Opacity\", type: \"continuous\", min: 0, max: 0.5, step: 0.1, defaultValue: 0.15 },\n        { key: \"strokeWidth\", label: \"Line Width\", type: \"continuous\", min: 0.5, max: 4, step: 0.5, defaultValue: 1.5 },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Rose Chart (Nightingale / Coxcomb chart) template.\n *\n * A rose chart is essentially a bar chart on a polar axis:\n *   - x (categorical)  → theta (angular position of each category)\n *   - y (quantitative)  → radius (bar height / sector radius)\n *   - color             → stacking within each angular slice (like stacked bar)\n *\n * Implementation note: the template uses a flat (non-layered) spec as its\n * base.  For non-faceted charts the instantiate function dynamically adds\n * a text-label layer.  Faceted charts stay flat and use encoding.facet,\n * because the restructureFacets pipeline path (facet + spec.layer) does\n * not render arc marks correctly.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { setMarkProp } from './utils';\n\nexport const roseChartDef: ChartTemplateDef = {\n    chart: \"Rose Chart\",\n    template: {\n        mark: {\n            type: \"arc\",\n            stroke: \"white\",\n            padAngle: 0.02,\n        },\n        encoding: {},\n    },\n    channels: [\"x\", \"y\", \"color\", \"column\", \"row\"],\n    markCognitiveChannel: 'area',\n\n    // Polar charts have no positional axes — declare no banded axes\n    // so the layout pipeline won't produce step-based sizing.\n    declareLayoutMode: () => ({}),\n\n    instantiate: (spec, ctx) => {\n        if (!spec.encoding) spec.encoding = {};\n\n        const { x, y, color, column, row, ...rest } = ctx.resolvedEncodings;\n        const isFaceted = !!(column || row);\n\n        // Slice ordering: 'none' keeps the category/data order; 'descending' /\n        // 'ascending' reorder the angular wedges (and their colours) by each\n        // category's total. We resolve the order to an EXPLICIT array so that\n        // both theta (slice angle) and the colour/legend follow the same order —\n        // a `{field, op}` sort on theta alone does not reliably reorder the\n        // wedges of a stacked arc.\n        const sortSlices = ctx.chartProperties?.sortSlices;\n        let sliceOrder: string[] | undefined;\n        if ((sortSlices === 'descending' || sortSlices === 'ascending') && x?.field && y?.field) {\n            const totals = new Map<string, number>();\n            for (const rr of ctx.table) {\n                const c = String((rr as any)[x.field] ?? '');\n                totals.set(c, (totals.get(c) ?? 0) + (Number((rr as any)[y.field]) || 0));\n            }\n            sliceOrder = [...totals.keys()].sort((a, b) =>\n                sortSlices === 'descending'\n                    ? (totals.get(b) ?? 0) - (totals.get(a) ?? 0)\n                    : (totals.get(a) ?? 0) - (totals.get(b) ?? 0),\n            );\n        }\n\n        // ── theta encoding (shared) ──\n        if (x) {\n            const thetaEnc: any = { ...x };\n            if (thetaEnc.type === 'quantitative' || thetaEnc.type === 'temporal') {\n                thetaEnc.type = 'nominal';\n            }\n            // Remove sort references to positional channels (x/y) — they are\n            // remapped to theta/radius and Vega-Lite can't resolve \"-y\" etc.\n            if (typeof thetaEnc.sort === 'string' && /^-?[xy]$/.test(thetaEnc.sort)) {\n                delete thetaEnc.sort;\n            }\n            delete thetaEnc.scale;\n            thetaEnc.stack = true;\n\n            // Rotate so the first slice aligns to 12 o'clock.\n            // 'center' (default): wedge center at top; 'left': wedge left edge at top.\n            const n = new Set(ctx.table.map((r: any) => r[x.field])).size;\n            if (n > 0) {\n                const alignment = ctx.chartProperties?.alignment ?? 'left';\n                if (alignment === 'center') {\n                    const halfSlice = Math.PI / n;\n                    thetaEnc.scale = { range: [-halfSlice, 2 * Math.PI - halfSlice] };\n                }\n                // 'left': no range offset needed — default [0, 2π] puts left edge at top\n            }\n\n            // Reorder the angular wedges by category total when sorting.\n            if (sliceOrder) {\n                thetaEnc.sort = sliceOrder;\n            }\n\n            spec.encoding.theta = thetaEnc;\n        }\n\n        // ── Build radius encoding ──\n        let radiusEnc: any | undefined;\n        let radiusField: string | undefined;\n        if (y) {\n            radiusEnc = { ...y };\n            if (typeof radiusEnc.sort === 'string' && /^-?[xy]$/.test(radiusEnc.sort)) {\n                delete radiusEnc.sort;\n            }\n            radiusEnc.scale = { type: 'sqrt' };\n            if (color) {\n                radiusEnc.stack = true;\n            }\n            radiusField = radiusEnc.field;\n        }\n\n        // ── Build color encoding ──\n        let colorEnc: any | undefined;\n        if (color) {\n            colorEnc = color;\n        } else if (x) {\n            // No color channel: color by category (like a pie chart)\n            colorEnc = { field: x.field, type: x.type || 'nominal' };\n            if (sliceOrder) {\n                colorEnc.sort = sliceOrder;\n            } else if (Array.isArray(x.sort)) {\n                colorEnc.sort = x.sort;\n            }\n        }\n\n        if (isFaceted) {\n            // ── FACETED: keep flat spec with encoding.facet ──\n            // The VL facet + spec.layer restructuring doesn't render arc\n            // marks correctly.  Using encoding.facet inline on a unit\n            // spec (single mark) works reliably.\n            if (radiusEnc) spec.encoding.radius = radiusEnc;\n            if (colorEnc)  spec.encoding.color  = colorEnc;\n\n            if (column && !row) {\n                const facetEnc: any = { ...column };\n                const facetCount = new Set(ctx.table.map((r: any) => r[column.field])).size;\n                facetEnc.columns = facetCount <= 6\n                    ? facetCount\n                    : Math.ceil(Math.sqrt(facetCount));\n                spec.encoding.facet = facetEnc;\n            } else if (row && !column) {\n                spec.encoding.row = row;\n            } else {\n                spec.encoding.column = column;\n                spec.encoding.row = row;\n            }\n        } else {\n            // ── NON-FACETED: convert to layered spec for text labels ──\n            const arcMark = spec.mark;\n            spec.layer = [\n                { mark: arcMark, encoding: {} as any },\n                {\n                    mark: { type: \"text\", radiusOffset: 15, fontSize: 11 },\n                    encoding: {} as any,\n                },\n            ];\n            delete spec.mark;\n\n            // radius → arc layer only\n            if (radiusEnc) {\n                spec.layer[0].encoding.radius = radiusEnc;\n            }\n\n            // color → arc layer only (so text layer isn't split by color)\n            if (colorEnc) {\n                spec.layer[0].encoding.color = colorEnc;\n            }\n\n            // text label layer: one label per category\n            if (x && spec.layer[1]) {\n                const textLayer = spec.layer[1];\n                textLayer.encoding.text = { field: x.field, type: x.type || 'nominal' };\n\n                if (radiusField) {\n                    // Aggregate: collapse to one row per category so labels\n                    // aren't duplicated per color segment.\n                    textLayer.transform = [\n                        {\n                            aggregate: [{ op: 'sum', field: radiusField, as: radiusField }],\n                            groupby: [x.field],\n                        },\n                    ];\n                    textLayer.encoding.radius = {\n                        field: radiusField,\n                        type: 'quantitative',\n                        scale: { type: 'sqrt' },\n                    };\n                }\n            }\n        }\n\n        // ── Fallbacks ──\n        const hasRadius = spec.encoding.radius || spec.layer?.[0]?.encoding?.radius;\n        if (!hasRadius) {\n            const fallback = { aggregate: 'count', type: 'quantitative', scale: { type: 'sqrt' } };\n            if (spec.layer) {\n                spec.layer[0].encoding.radius = fallback;\n            } else {\n                spec.encoding.radius = fallback;\n            }\n        }\n        if (!spec.encoding.theta) {\n            spec.encoding.theta = { aggregate: 'count', type: 'quantitative' };\n        }\n\n        // ── Pass-through channels ──\n        const mappedChannels = new Set(['x', 'y', 'color', 'column', 'row', 'radius', 'size', 'theta', 'facet']);\n        for (const [ch, enc] of Object.entries(rest)) {\n            if (mappedChannels.has(ch)) continue;\n            if (!enc.field && !enc.aggregate) continue;\n            spec.encoding[ch] = enc;\n        }\n\n        // ── Sizing: square aspect ratio ──\n        // Use subplot dimensions (which account for faceting).\n        const subW = ctx.layout.subplotWidth ?? ctx.canvasSize.width;\n        const subH = ctx.layout.subplotHeight ?? ctx.canvasSize.height;\n        const size = Math.min(subW, subH);\n        spec.width = size;\n        spec.height = size;\n\n        // ── Chart properties ──\n        const config = ctx.chartProperties;\n        if (config) {\n            const markTarget = spec.layer ? spec.layer[0] : spec;\n            if (config.padAngle > 0) {\n                markTarget.mark = setMarkProp(markTarget.mark, 'padAngle', config.padAngle);\n            }\n        }\n    },\n\n    properties: [\n        { key: \"padAngle\", label: \"Gap\", type: \"continuous\", min: 0, max: 0.1, step: 0.005, defaultValue: 0 },\n        {\n            key: 'alignment', label: 'Alignment', type: 'discrete', options: [\n                { value: 'left', label: 'Left (default)' },\n                { value: 'center', label: 'Center' },\n            ],\n        },\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete', options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Geographic gazetteer for choropleth maps — shared across backends.\n *\n * Real-world datasets identify regions by *name* (\"California\", \"United\n * States\") or by a familiar short code (USPS \"CA\", ISO alpha-2 \"US\", alpha-3\n * \"USA\") — almost never by the numeric ids that TopoJSON feature geometries\n * actually carry (FIPS state codes, ISO 3166-1 *numeric* country codes). This\n * module crosswalks any of those user-facing forms to whatever key a given\n * backend's geo rendering needs:\n *\n *   - `resolveUsState` / `resolveCountry` — numeric feature id, for the\n *     Vega-Lite backend's TopoJSON join (`us-10m.json` / `world-110m.json`).\n *   - `resolveUsStateCode` / `resolveCountryCode` — USPS / ISO alpha-3 code,\n *     for the Plotly backend's native `choropleth`/`scattergeo` `locations`.\n *\n * Living in `chart-types/` (rather than under one backend's `templates/`)\n * follows the same cross-backend-shared-logic convention as\n * `chart-types/gantt.ts` / `chart-types/waterfall.ts`.\n *\n * Lookups are case- and punctuation-insensitive. A value that is already the\n * numeric id passes through unchanged.\n */\n\n/**\n * Normalise a label for matching: accent-folded, lowercased, alphanumerics\n * only. Accent folding (NFD + strip combining marks) lets \"Côte d'Ivoire\" and\n * \"São Tomé\" match their plain-ASCII gazetteer keys.\n */\nfunction norm(s: string): string {\n    return s\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '')\n        .toLowerCase()\n        .replace(/[^a-z0-9]/g, '');\n}\n\n// ---------------------------------------------------------------------------\n// US states — [FIPS, name, USPS code]\n// ---------------------------------------------------------------------------\n\nconst US_STATES: Array<[number, string, string]> = [\n    [1, 'Alabama', 'AL'], [2, 'Alaska', 'AK'], [4, 'Arizona', 'AZ'], [5, 'Arkansas', 'AR'],\n    [6, 'California', 'CA'], [8, 'Colorado', 'CO'], [9, 'Connecticut', 'CT'], [10, 'Delaware', 'DE'],\n    [11, 'District of Columbia', 'DC'], [12, 'Florida', 'FL'], [13, 'Georgia', 'GA'], [15, 'Hawaii', 'HI'],\n    [16, 'Idaho', 'ID'], [17, 'Illinois', 'IL'], [18, 'Indiana', 'IN'], [19, 'Iowa', 'IA'],\n    [20, 'Kansas', 'KS'], [21, 'Kentucky', 'KY'], [22, 'Louisiana', 'LA'], [23, 'Maine', 'ME'],\n    [24, 'Maryland', 'MD'], [25, 'Massachusetts', 'MA'], [26, 'Michigan', 'MI'], [27, 'Minnesota', 'MN'],\n    [28, 'Mississippi', 'MS'], [29, 'Missouri', 'MO'], [30, 'Montana', 'MT'], [31, 'Nebraska', 'NE'],\n    [32, 'Nevada', 'NV'], [33, 'New Hampshire', 'NH'], [34, 'New Jersey', 'NJ'], [35, 'New Mexico', 'NM'],\n    [36, 'New York', 'NY'], [37, 'North Carolina', 'NC'], [38, 'North Dakota', 'ND'], [39, 'Ohio', 'OH'],\n    [40, 'Oklahoma', 'OK'], [41, 'Oregon', 'OR'], [42, 'Pennsylvania', 'PA'], [44, 'Rhode Island', 'RI'],\n    [45, 'South Carolina', 'SC'], [46, 'South Dakota', 'SD'], [47, 'Tennessee', 'TN'], [48, 'Texas', 'TX'],\n    [49, 'Utah', 'UT'], [50, 'Vermont', 'VT'], [51, 'Virginia', 'VA'], [53, 'Washington', 'WA'],\n    [54, 'West Virginia', 'WV'], [55, 'Wisconsin', 'WI'], [56, 'Wyoming', 'WY'],\n];\n\n/**\n * Extra US-state forms: AP-style newspaper abbreviations (\"Calif.\", \"Wash.\"),\n * directional shorthand (\"N. Carolina\", \"S. Dakota\") and common variants. Keys\n * are already `norm`-ed (punctuation/spacing removed), so \"N. Carolina\" arrives\n * as \"ncarolina\". None collide with a two-letter USPS code.\n */\nconst US_STATE_ALIASES: Record<string, number> = {\n    // AP-style abbreviations\n    ala: 1, ariz: 4, ark: 5, calif: 6, colo: 8, conn: 9, del: 10, fla: 12,\n    ill: 17, ind: 18, kan: 20, kans: 20, mass: 25, mich: 26, minn: 27,\n    miss: 28, mont: 30, neb: 31, nebr: 31, nev: 32, okla: 40, ore: 41,\n    oreg: 41, penn: 42, penna: 42, tenn: 47, tex: 48, wash: 53, wis: 55,\n    wisc: 55, wyo: 56,\n    // Directional shorthand\n    ncarolina: 37, scarolina: 45, ndakota: 38, sdakota: 46, wvirginia: 54,\n    nhampshire: 33, njersey: 34, nmexico: 35, nyork: 36,\n    // District of Columbia variants\n    washingtondc: 11, dcusa: 11,\n};\n\n// ---------------------------------------------------------------------------\n// Countries — [ISO numeric, name, alpha-2, alpha-3]\n// Numeric ids match Vega's world-110m.json `countries` feature ids.\n// ---------------------------------------------------------------------------\n\nconst COUNTRIES: Array<[number, string, string, string]> = [\n    [156, 'China', 'CN', 'CHN'], [356, 'India', 'IN', 'IND'], [840, 'United States', 'US', 'USA'],\n    [360, 'Indonesia', 'ID', 'IDN'], [586, 'Pakistan', 'PK', 'PAK'], [566, 'Nigeria', 'NG', 'NGA'],\n    [76, 'Brazil', 'BR', 'BRA'], [50, 'Bangladesh', 'BD', 'BGD'], [643, 'Russia', 'RU', 'RUS'],\n    [484, 'Mexico', 'MX', 'MEX'], [231, 'Ethiopia', 'ET', 'ETH'], [392, 'Japan', 'JP', 'JPN'],\n    [608, 'Philippines', 'PH', 'PHL'], [818, 'Egypt', 'EG', 'EGY'], [180, 'DR Congo', 'CD', 'COD'],\n    [704, 'Vietnam', 'VN', 'VNM'], [364, 'Iran', 'IR', 'IRN'], [792, 'Turkey', 'TR', 'TUR'],\n    [276, 'Germany', 'DE', 'DEU'], [764, 'Thailand', 'TH', 'THA'], [826, 'United Kingdom', 'GB', 'GBR'],\n    [250, 'France', 'FR', 'FRA'], [710, 'South Africa', 'ZA', 'ZAF'], [380, 'Italy', 'IT', 'ITA'],\n    [404, 'Kenya', 'KE', 'KEN'], [170, 'Colombia', 'CO', 'COL'], [724, 'Spain', 'ES', 'ESP'],\n    [32, 'Argentina', 'AR', 'ARG'], [12, 'Algeria', 'DZ', 'DZA'], [124, 'Canada', 'CA', 'CAN'],\n    [616, 'Poland', 'PL', 'POL'], [804, 'Ukraine', 'UA', 'UKR'], [682, 'Saudi Arabia', 'SA', 'SAU'],\n    [504, 'Morocco', 'MA', 'MAR'], [604, 'Peru', 'PE', 'PER'], [36, 'Australia', 'AU', 'AUS'],\n    [398, 'Kazakhstan', 'KZ', 'KAZ'], [152, 'Chile', 'CL', 'CHL'], [752, 'Sweden', 'SE', 'SWE'],\n    [578, 'Norway', 'NO', 'NOR'], [528, 'Netherlands', 'NL', 'NLD'], [56, 'Belgium', 'BE', 'BEL'],\n    [756, 'Switzerland', 'CH', 'CHE'], [40, 'Austria', 'AT', 'AUT'], [620, 'Portugal', 'PT', 'PRT'],\n    [300, 'Greece', 'GR', 'GRC'], [372, 'Ireland', 'IE', 'IRL'], [246, 'Finland', 'FI', 'FIN'],\n    [208, 'Denmark', 'DK', 'DNK'], [554, 'New Zealand', 'NZ', 'NZL'], [410, 'South Korea', 'KR', 'KOR'],\n    [458, 'Malaysia', 'MY', 'MYS'], [862, 'Venezuela', 'VE', 'VEN'], [218, 'Ecuador', 'EC', 'ECU'],\n    [4, 'Afghanistan', 'AF', 'AFG'], [368, 'Iraq', 'IQ', 'IRQ'], [887, 'Yemen', 'YE', 'YEM'],\n    [144, 'Sri Lanka', 'LK', 'LKA'], [104, 'Myanmar', 'MM', 'MMR'], [116, 'Cambodia', 'KH', 'KHM'],\n    [24, 'Angola', 'AO', 'AGO'], [834, 'Tanzania', 'TZ', 'TZA'], [800, 'Uganda', 'UG', 'UGA'],\n    [716, 'Zimbabwe', 'ZW', 'ZWE'], [288, 'Ghana', 'GH', 'GHA'], [384, 'Ivory Coast', 'CI', 'CIV'],\n    [686, 'Senegal', 'SN', 'SEN'],\n    // Additional countries — numeric ids verified present in world-110m.json.\n    [268, 'Georgia', 'GE', 'GEO'], [524, 'Nepal', 'NP', 'NPL'], [192, 'Cuba', 'CU', 'CUB'],\n    [634, 'Qatar', 'QA', 'QAT'], [400, 'Jordan', 'JO', 'JOR'], [422, 'Lebanon', 'LB', 'LBN'],\n    [376, 'Israel', 'IL', 'ISR'], [414, 'Kuwait', 'KW', 'KWT'], [512, 'Oman', 'OM', 'OMN'],\n    [784, 'United Arab Emirates', 'AE', 'ARE'], [788, 'Tunisia', 'TN', 'TUN'], [434, 'Libya', 'LY', 'LBY'],\n    [729, 'Sudan', 'SD', 'SDN'], [120, 'Cameroon', 'CM', 'CMR'], [508, 'Mozambique', 'MZ', 'MOZ'],\n    [450, 'Madagascar', 'MG', 'MDG'], [894, 'Zambia', 'ZM', 'ZMB'], [466, 'Mali', 'ML', 'MLI'],\n    [854, 'Burkina Faso', 'BF', 'BFA'], [562, 'Niger', 'NE', 'NER'], [148, 'Chad', 'TD', 'TCD'],\n    [706, 'Somalia', 'SO', 'SOM'], [68, 'Bolivia', 'BO', 'BOL'], [600, 'Paraguay', 'PY', 'PRY'],\n    [858, 'Uruguay', 'UY', 'URY'], [320, 'Guatemala', 'GT', 'GTM'], [340, 'Honduras', 'HN', 'HND'],\n    [214, 'Dominican Republic', 'DO', 'DOM'], [591, 'Panama', 'PA', 'PAN'], [188, 'Costa Rica', 'CR', 'CRI'],\n    [191, 'Croatia', 'HR', 'HRV'], [688, 'Serbia', 'RS', 'SRB'], [703, 'Slovakia', 'SK', 'SVK'],\n    [705, 'Slovenia', 'SI', 'SVN'], [100, 'Bulgaria', 'BG', 'BGR'], [642, 'Romania', 'RO', 'ROU'],\n    [348, 'Hungary', 'HU', 'HUN'], [112, 'Belarus', 'BY', 'BLR'], [440, 'Lithuania', 'LT', 'LTU'],\n    [428, 'Latvia', 'LV', 'LVA'], [233, 'Estonia', 'EE', 'EST'], [352, 'Iceland', 'IS', 'ISL'],\n    [418, 'Laos', 'LA', 'LAO'], [496, 'Mongolia', 'MN', 'MNG'], [408, 'North Korea', 'KP', 'PRK'],\n    [158, 'Taiwan', 'TW', 'TWN'], [64, 'Bhutan', 'BT', 'BTN'], [760, 'Syria', 'SY', 'SYR'],\n    [203, 'Czechia', 'CZ', 'CZE'], [795, 'Turkmenistan', 'TM', 'TKM'], [860, 'Uzbekistan', 'UZ', 'UZB'],\n    [31, 'Azerbaijan', 'AZ', 'AZE'], [51, 'Armenia', 'AM', 'ARM'], [558, 'Nicaragua', 'NI', 'NIC'],\n];\n\n/** Extra colloquial names that should resolve to a country numeric id. */\nconst COUNTRY_ALIASES: Record<string, number> = {\n    usa: 840, us: 840, unitedstatesofamerica: 840, america: 840,\n    uk: 826, greatbritain: 826, britain: 826, england: 826,\n    russianfederation: 643, southkorea: 410, korea: 410, republicofkorea: 410,\n    skorea: 410, korearep: 410, koreasouth: 410, koreasouthrepublicof: 410,\n    nkorea: 408, koreanorth: 408, koreademrep: 408, dprk: 408,\n    democraticpeoplesrepublicofkorea: 408,\n    democraticrepublicofthecongo: 180, congokinshasa: 180, drc: 180,\n    vietnam: 704, vietnamsocialistrepublic: 704, ivorycoast: 384, cotedivoire: 384,\n    iranislamicrepublicof: 364, syrianarabrepublic: 760, tanzaniaunitedrepublicof: 834,\n    burma: 104, czechrepublic: 203, czechia: 203, uae: 784, unitedarabemirates: 784,\n    holland: 528, thenetherlands: 528, turkiye: 792,\n    laopdr: 418, laopeoplesdemocraticrepublic: 418,\n};\n\n// ---------------------------------------------------------------------------\n// Lookup maps (built once)\n// ---------------------------------------------------------------------------\n\nfunction buildMap(entries: Array<[number, string[]]>): Map<string, number> {\n    const m = new Map<string, number>();\n    for (const [id, keys] of entries) {\n        for (const k of keys) {\n            const nk = norm(k);\n            if (nk && !m.has(nk)) m.set(nk, id);\n        }\n    }\n    return m;\n}\n\nconst US_STATE_LOOKUP = (() => {\n    const m = buildMap(US_STATES.map(([id, name, usps]) => [id, [name, usps]]));\n    for (const [alias, id] of Object.entries(US_STATE_ALIASES)) {\n        if (!m.has(alias)) m.set(alias, id);\n    }\n    return m;\n})();\n\nconst COUNTRY_LOOKUP = (() => {\n    const m = buildMap(COUNTRIES.map(([id, name, a2, a3]) => [id, [name, a2, a3]]));\n    for (const [alias, id] of Object.entries(COUNTRY_ALIASES)) {\n        if (!m.has(alias)) m.set(alias, id);\n    }\n    return m;\n})();\n\n// ---------------------------------------------------------------------------\n// Public resolvers\n// ---------------------------------------------------------------------------\n\n/** A choropleth region resolver: user value → TopoJSON numeric feature id. */\nexport type GeoResolver = (value: unknown) => number | undefined;\n\nfunction resolveWith(lookup: Map<string, number>, value: unknown): number | undefined {\n    if (value == null) return undefined;\n    // Already a numeric feature id (or a numeric string like \"6\" / \"06\").\n    if (typeof value === 'number' && Number.isFinite(value)) return value;\n    const s = String(value).trim();\n    if (/^\\d+$/.test(s)) return parseInt(s, 10);\n    const nk = norm(s);\n    if (!nk) return undefined;\n    const direct = lookup.get(nk);\n    if (direct !== undefined) return direct;\n    // Fallback: strip common qualifiers — \"State of California\", \"California,\n    // USA\", \"Washington State\" — and retry. Only runs after a direct miss, so\n    // legitimate names that happen to end in these tokens still match first.\n    let r = nk;\n    if (r.startsWith('stateof')) r = r.slice(7);\n    if (r.endsWith('usa')) r = r.slice(0, -3);\n    else if (r.endsWith('state')) r = r.slice(0, -5);\n    if (r !== nk && r) return lookup.get(r);\n    return undefined;\n}\n\n/** Resolve a US state name / USPS code / FIPS id to its FIPS numeric id. */\nexport const resolveUsState: GeoResolver = (value) => resolveWith(US_STATE_LOOKUP, value);\n\n/** Resolve a country name / ISO alpha-2 / alpha-3 / numeric to its ISO numeric id. */\nexport const resolveCountry: GeoResolver = (value) => resolveWith(COUNTRY_LOOKUP, value);\n\n// ---------------------------------------------------------------------------\n// Code resolvers — for backends (Plotly) whose native geo traces key on a\n// short code rather than a TopoJSON numeric feature id.\n//\n// Plotly's `choropleth`/`scattergeo` traces resolve `locations` through a\n// built-in atlas (no user-supplied TopoJSON needed) keyed on:\n//   - `locationmode: 'USA-states'`  → 2-letter USPS codes (\"CA\")\n//   - default (`locationmode: 'ISO-3'`) → 3-letter ISO alpha-3 codes (\"USA\")\n//\n// These resolvers share the same gazetteer/alias tables as the numeric-id\n// resolvers above (`resolveUsState` / `resolveCountry`), so a value that\n// resolves for the Vega-Lite choropleth (name, USPS/ISO code, or a bare\n// numeric id) resolves the same way here — same data contract, different\n// output shape.\n// ---------------------------------------------------------------------------\n\n/** A code resolver: user value → the short code a native geo trace expects. */\nexport type GeoCodeResolver = (value: unknown) => string | undefined;\n\nfunction resolveCodeWith(\n    lookup: Map<string, number>, codeById: Map<number, string>, value: unknown,\n): string | undefined {\n    if (value == null) return undefined;\n    // A bare numeric id (or numeric string) is resolved through the same\n    // id → code table used to build the gazetteer.\n    if (typeof value === 'number' && Number.isFinite(value)) return codeById.get(value);\n    const s = String(value).trim();\n    if (/^\\d+$/.test(s)) return codeById.get(parseInt(s, 10));\n    const id = resolveWith(lookup, value);\n    return id !== undefined ? codeById.get(id) : undefined;\n}\n\nconst US_STATE_USPS_BY_ID = new Map(US_STATES.map(([id, , usps]) => [id, usps]));\nconst COUNTRY_ALPHA3_BY_ID = new Map(COUNTRIES.map(([id, , , a3]) => [id, a3]));\n\n/** Resolve a US state name / USPS code / FIPS id to its 2-letter USPS code. */\nexport const resolveUsStateCode: GeoCodeResolver = (value) =>\n    resolveCodeWith(US_STATE_LOOKUP, US_STATE_USPS_BY_ID, value);\n\n/** Resolve a country name / ISO alpha-2 / alpha-3 / numeric to its ISO alpha-3 code. */\nexport const resolveCountryCode: GeoCodeResolver = (value) =>\n    resolveCodeWith(COUNTRY_LOOKUP, COUNTRY_ALPHA3_BY_ID, value);\n\n// ---------------------------------------------------------------------------\n// Map scope inference (US vs World) — shared by every backend's Map /\n// Choropleth templates so \"which base geography do we draw\" is decided the\n// same way regardless of which renderer draws it.\n// ---------------------------------------------------------------------------\n\nexport type MapScope = 'us' | 'world';\n\n// Generous bounding box for the United States (contiguous states + Alaska +\n// Hawaii). Used only to *infer* scope: a dataset whose every point falls\n// inside is treated as a US map; anything outside flips the whole map to world.\nconst US_LON: readonly [number, number] = [-170, -66];\nconst US_LAT: readonly [number, number] = [18, 72];\n\nfunction inUsBox(lon: number, lat: number): boolean {\n    return lon >= US_LON[0] && lon <= US_LON[1] && lat >= US_LAT[0] && lat <= US_LAT[1];\n}\n\n/** Infer scope for a bubble map from its longitude/latitude points. */\nexport function inferBubbleScope(rows: any[], lonField?: string, latField?: string): MapScope {\n    if (!lonField || !latField) return 'us';\n    for (const r of rows) {\n        const lon = Number(r[lonField]);\n        const lat = Number(r[latField]);\n        if (!Number.isFinite(lon) || !Number.isFinite(lat)) continue;\n        if (!inUsBox(lon, lat)) return 'world';\n    }\n    return 'us';\n}\n\n/** Infer scope for a choropleth from its region keys (names / codes / ids). */\nexport function inferChoroplethScope(rows: any[], idField?: string): MapScope {\n    if (!idField) return 'us';\n    for (const r of rows) {\n        const v = r[idField];\n        if (v == null || v === '') continue;\n        // A value that resolves as a US state (by name, USPS code, FIPS id, or a\n        // bare numeric that passes straight through) keeps us in the US; the\n        // first value that doesn't flips the whole map to world.\n        if (resolveUsState(v) === undefined) return 'world';\n    }\n    return 'us';\n}\n\n/**\n * Map the id field's *semantic type* to a map scope. This is the most reliable\n * signal we have: a field declared 'State' should use the US states map and the\n * US-state resolver, a field declared 'Country' the world map and country\n * resolver. It disambiguates the codes that collide between the two namespaces\n * — \"CA\" (California vs Canada), \"IN\" (Indiana vs India), \"Georgia\" (US state\n * vs the country) — which value inference alone cannot. Geographic types that\n * neither base layer can render (City, Region, Address, ZipCode) return\n * undefined so callers fall back to value inference.\n */\nconst SEMANTIC_SCOPE: Record<string, MapScope> = { State: 'us', Country: 'world' };\n\nexport function semanticScope(semType: string | undefined): MapScope | undefined {\n    if (!semType) return undefined;\n    return Object.prototype.hasOwnProperty.call(SEMANTIC_SCOPE, semType)\n        ? SEMANTIC_SCOPE[semType]\n        : undefined;\n}\n\n/** Honor an explicit `region` choice, else the id field's semantic type, else inference. */\nexport function pickMapScope(\n    chartProperties: any,\n    semScope: MapScope | undefined,\n    infer: () => MapScope,\n): MapScope {\n    const choice = chartProperties?.region;\n    if (choice === 'us' || choice === 'world') return choice;\n    if (semScope) return semScope;\n    return infer();\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef, OptionEvalContext } from '../../core/types';\nimport {\n    resolveUsState, resolveCountry, GeoResolver,\n    type MapScope, inferBubbleScope, inferChoroplethScope, semanticScope, pickMapScope,\n} from '../../chart-types/geo';\nimport { toTypeString } from '../../core/field-semantics';\n\nconst mapProjections = [\n    { value: \"mercator\", label: \"Mercator\" },\n    { value: \"equalEarth\", label: \"Equal Earth\" },\n    { value: \"orthographic\", label: \"Orthographic (Globe)\" },\n    { value: \"stereographic\", label: \"Stereographic\" },\n    { value: \"conicEqualArea\", label: \"Conic Equal Area\" },\n    { value: \"conicEquidistant\", label: \"Conic Equidistant\" },\n    { value: \"azimuthalEquidistant\", label: \"Azimuthal Equidistant\" },\n    { value: \"mollweide\", label: \"Mollweide\" },\n] as const;\n\nconst projectionCenterPresets: { label: string; center: [number, number] }[] = [\n    { label: \"World (Atlantic)\", center: [0, 0] },\n    { label: \"World (Pacific)\", center: [150, 0] },\n    { label: \"China\", center: [105, 35] },\n    { label: \"USA\", center: [-98, 39] },\n    { label: \"Europe\", center: [10, 50] },\n    { label: \"Japan\", center: [138, 36] },\n    { label: \"India\", center: [78, 22] },\n    { label: \"Brazil\", center: [-52, -14] },\n    { label: \"Australia\", center: [134, -25] },\n    { label: \"Russia\", center: [100, 60] },\n    { label: \"Africa\", center: [20, 0] },\n    { label: \"Middle East\", center: [45, 28] },\n    { label: \"Southeast Asia\", center: [115, 5] },\n    { label: \"South America\", center: [-60, -15] },\n    { label: \"North America\", center: [-100, 45] },\n    { label: \"UK\", center: [-2, 54] },\n    { label: \"Germany\", center: [10, 51] },\n    { label: \"France\", center: [2, 47] },\n    { label: \"Korea\", center: [128, 36] },\n];\n\n// ---------------------------------------------------------------------------\n// Map scope (US vs World)\n//\n// Both map templates are generic: the geography (which base TopoJSON,\n// projection and frame size) is chosen by the `region` property, defaulting to\n// 'auto' — infer from the data, preferring the US whenever the data fits it.\n// Scope *inference* (`MapScope`, `inferBubbleScope`, `inferChoroplethScope`,\n// `semanticScope`, `pickMapScope`) is shared with the Plotly backend's Map /\n// Choropleth templates via `chart-types/geo.ts`; only the base-layer geometry\n// below (TopoJSON URLs/projections) is Vega-Lite-specific.\n// ---------------------------------------------------------------------------\n\ninterface ScopeGeo {\n    url: string;\n    feature: string;\n    projection: string;\n    width: number;\n    height: number;\n    strokeWidth: number;\n}\n\nconst SCOPE_GEO: Record<MapScope, ScopeGeo> = {\n    us: {\n        url: \"https://vega.github.io/vega-lite/data/us-10m.json\",\n        feature: \"states\",\n        projection: \"albersUsa\",\n        width: 500,\n        height: 300,\n        strokeWidth: 0.5,\n    },\n    world: {\n        url: \"https://vega.github.io/vega-lite/data/world-110m.json\",\n        feature: \"countries\",\n        projection: \"equalEarth\",\n        width: 600,\n        height: 350,\n        strokeWidth: 0.4,\n    },\n};\n\n/** Would this spec render as a world map? (Drives world-only property gating.) */\nfunction wouldBeWorld(ctx: OptionEvalContext): boolean {\n    const choice = ctx.chartProperties?.region;\n    if (choice === 'us') return false;\n    if (choice === 'world') return true;\n    const rows = ctx.data ?? [];\n    const lonField = ctx.encodings?.longitude?.field;\n    const latField = ctx.encodings?.latitude?.field;\n    return inferBubbleScope(rows, lonField, latField) === 'world';\n}\n\nconst regionProperty: ChartPropertyDef = {\n    key: \"region\",\n    label: \"Region\",\n    type: \"discrete\",\n    options: [\n        { value: \"auto\", label: \"Auto-detect\" },\n        { value: \"us\", label: \"United States\" },\n        { value: \"world\", label: \"World\" },\n    ],\n    defaultValue: \"auto\",\n};\n\n/**\n * Merge the compiler's resolved encodings onto a layer's point encoding, then\n * drop any channel left as an empty `{}` (a template placeholder the spec never\n * bound). Vega-Lite rejects an encoding entry with no field/datum/value, so the\n * cleanup keeps the emitted spec valid when only some channels are used.\n */\nfunction applyPointEncodings(layer: any, resolved: Record<string, any>): void {\n    if (!layer.encoding) layer.encoding = {};\n    for (const [ch, enc] of Object.entries(resolved)) {\n        layer.encoding[ch] = { ...(layer.encoding[ch] || {}), ...enc };\n    }\n    for (const ch of Object.keys(layer.encoding)) {\n        const enc = layer.encoding[ch];\n        if (enc && typeof enc === 'object' && Object.keys(enc).length === 0) {\n            delete layer.encoding[ch];\n        }\n    }\n}\n\n/** Point the base + circle layers of a bubble map at the chosen geography. */\nfunction configureBubble(spec: any, scope: MapScope): void {\n    const g = SCOPE_GEO[scope];\n    spec.width = g.width;\n    spec.height = g.height;\n    spec.layer[0].data = { url: g.url, format: { type: \"topojson\", feature: g.feature } };\n    spec.layer[0].projection = { type: g.projection };\n    spec.layer[1].projection = { type: g.projection };\n}\n\n/** Point a choropleth's geoshape at the chosen base map. */\nfunction configureChoropleth(spec: any, scope: MapScope): void {\n    const g = SCOPE_GEO[scope];\n    spec.width = g.width;\n    spec.height = g.height;\n    spec.data = { url: g.url, format: { type: \"topojson\", feature: g.feature } };\n    spec.projection = { type: g.projection };\n    if (spec.mark && typeof spec.mark === 'object') spec.mark.strokeWidth = g.strokeWidth;\n}\n\nexport const mapDef: ChartTemplateDef = {\n    chart: \"Map\",\n    template: {\n        layer: [\n            {\n                mark: { type: \"geoshape\", fill: \"lightgray\", stroke: \"white\" },\n            },\n            {\n                mark: \"circle\",\n                encoding: { longitude: {}, latitude: {}, size: {}, color: {}, opacity: {} },\n            },\n        ],\n    },\n    channels: [\"longitude\", \"latitude\", \"color\", \"size\", \"opacity\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const rows = ctx.fullTable ?? ctx.table ?? [];\n        const lonField = ctx.resolvedEncodings.longitude?.field;\n        const latField = ctx.resolvedEncodings.latitude?.field;\n        const scope = pickMapScope(ctx.chartProperties, undefined, () => inferBubbleScope(rows, lonField, latField));\n\n        configureBubble(spec, scope);\n        applyPointEncodings(spec.layer[1], ctx.resolvedEncodings);\n\n        // Projection controls only apply to the world map; the US map is fixed\n        // to albersUsa (which insets Alaska + Hawaii).\n        if (scope === 'world') {\n            const config = ctx.chartProperties;\n            if (config) {\n                const projection = config.projection;\n                const projectionCenter = config.projectionCenter;\n                const applyProjection = (obj: any) => {\n                    if (obj?.projection) {\n                        if (projection && projection !== 'default') {\n                            obj.projection.type = projection;\n                        }\n                        if (projectionCenter && obj.projection.type !== 'albersUsa') {\n                            obj.projection.rotate = [-projectionCenter[0], -projectionCenter[1], 0];\n                        }\n                    }\n                };\n                for (const layer of spec.layer) applyProjection(layer);\n            }\n        }\n    },\n    properties: [\n        regionProperty,\n        {\n            key: \"projection\",\n            label: \"Projection\",\n            type: \"discrete\",\n            options: [\n                { value: \"default\", label: \"Default\" },\n                ...mapProjections.map(p => ({ value: p.value, label: p.label })),\n            ],\n            defaultValue: \"default\",\n            check: (ctx) => ({ applicable: wouldBeWorld(ctx) }),\n        },\n        {\n            key: \"projectionCenter\",\n            label: \"Center\",\n            type: \"discrete\",\n            options: [\n                { value: undefined, label: \"Default\" },\n                ...projectionCenterPresets.map(p => ({\n                    value: p.center,\n                    label: `${p.label} [${p.center[0]}, ${p.center[1]}]`,\n                })),\n            ],\n            defaultValue: undefined,\n            check: (ctx) => ({ applicable: wouldBeWorld(ctx) }),\n        },\n    ] as ChartPropertyDef[],\n};\n\n/**\n * Join the user's rows into a choropleth's geoshape.\n *\n * A choropleth fills each region of a base TopoJSON map by a data value, so the\n * geography is the *primary* mark and the user's rows are joined *into* it. We\n * keep the TopoJSON as the spec's base `data` (set by `configureChoropleth`)\n * and inline the user rows into a `lookup` transform keyed on each geoshape\n * feature's numeric `id`.\n *\n * The `id` channel carries the region key, but real datasets rarely hold the\n * raw TopoJSON ids (FIPS / ISO-numeric). They hold *names* (\"California\",\n * \"United States\") or short codes (\"CA\", \"US\", \"USA\"). So we resolve every\n * row's `id` value through a gazetteer (`resolver`) into the numeric feature\n * id, stash it on a synthetic `__geo_id` field, and join on that. A value that\n * is already the numeric id passes straight through.\n *\n * Channels: `id` = region name/code/id, `color` = the measure, `detail`\n * (optional) = an explicit display name for tooltips (defaults to the `id`\n * field so the user always sees a readable label).\n */\nfunction buildChoroplethJoin(spec: any, ctx: any, resolver: GeoResolver): void {\n    const idField: string | undefined = ctx.resolvedEncodings.id?.field;\n    const colorEnc = ctx.resolvedEncodings.color;\n    const valueField: string | undefined = colorEnc?.field;\n    const labelField: string | undefined = ctx.resolvedEncodings.detail?.field ?? idField;\n\n    const rows: any[] = ctx.fullTable ?? ctx.table ?? [];\n\n    if (idField) {\n        const joined = rows.map((r) => ({ ...r, __geo_id: resolver(r[idField]) }));\n        const lookupFields = [valueField, labelField].filter(Boolean) as string[];\n        spec.transform = [\n            {\n                lookup: 'id',\n                from: { data: { values: joined }, key: '__geo_id', fields: lookupFields },\n            },\n        ];\n    }\n\n    spec.encoding = {};\n    if (colorEnc) {\n        spec.encoding.color = { ...colorEnc };\n    }\n\n    const tooltip: any[] = [];\n    if (labelField) tooltip.push({ field: labelField, type: 'nominal' });\n    if (valueField) tooltip.push({ field: valueField, type: colorEnc?.type ?? 'quantitative' });\n    if (tooltip.length) spec.encoding.tooltip = tooltip;\n}\n\nexport const choroplethDef: ChartTemplateDef = {\n    chart: \"Choropleth\",\n    template: {\n        mark: { type: \"geoshape\", stroke: \"white\", strokeWidth: 0.5 },\n        encoding: {},\n    },\n    channels: [\"id\", \"color\", \"detail\"],\n    markCognitiveChannel: 'color',\n    instantiate: (spec, ctx) => {\n        const rows = ctx.fullTable ?? ctx.table ?? [];\n        const idField = ctx.resolvedEncodings.id?.field;\n        const semType = idField ? toTypeString(ctx.semanticTypes?.[idField]) : '';\n        const semScope = semanticScope(semType);\n        const scope = pickMapScope(\n            ctx.chartProperties,\n            semScope,\n            () => inferChoroplethScope(rows, idField),\n        );\n\n        configureChoropleth(spec, scope);\n        const resolver: GeoResolver = scope === 'us' ? resolveUsState : resolveCountry;\n        buildChoroplethJoin(spec, ctx, resolver);\n    },\n    properties: [regionProperty] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\n\n/**\n * KPI Card — \"big number\" dashboard tile, one row per tile.\n *\n * Data shape\n * ──────────\n * The input table is interpreted as a list of tiles. Each row produces\n * one tile.\n *\n *   { metric: string,             // tile caption (required, via `metric` channel)\n *     value:  number | string,    // big number (required, via `value` channel,\n *                                  //   pre-aggregated upstream)\n *     goal?:  number | string,    // optional comparison value (via `goal` channel)\n *   }\n *\n * Channels\n * ────────\n *   - `metric` (required): caption field.\n *   - `value`  (required): big-number field.\n *   - `goal`   (optional): comparison/target field.\n *\n * Formatting\n * ──────────\n * Formatting is delegated upstream. The template applies only a trivial\n * default (`toLocaleString`) to numeric values so a raw shelf binding\n * doesn't show `1184320.0`. If you want `\"$1.18M\"`, write that string\n * into the `value` column in the data prep step.\n *\n * Progress bar\n * ────────────\n * If both `value` and `goal` are numeric and finite, a thin progress\n * bar appears beneath the big number showing `value / goal` (clamped\n * to [0, 1.5] so overshoot is visible). Otherwise `goal` is shown as a\n * small \"Goal: <goal>\" line.\n */\n\ntype Layout = 'horizontal' | 'vertical' | 'grid';\n\nconst PROGRESS_TRACK = '#e6e9ef';\nconst PROGRESS_ON_TRACK = '#5b8def'; // < 100% of goal (in progress)\nconst PROGRESS_EXCEEDED = '#22a06b'; // ≥ 100% of goal (success)\nconst PROGRESS_BEHIND   = '#e07a3c'; // < 50% of goal (well short)\n\n// Card frame — drawn behind every tile so each KPI reads as a discrete\n// card rather than free-floating text. Sized to content (see cardTop /\n// cardBot below) so a tall panel never produces a tall empty card.\nconst CARD_FILL   = '#ffffff';\nconst CARD_STROKE = '#e6e9ef';\nconst CARD_RADIUS = 8;\n\nexport const kpiCardDef: ChartTemplateDef = {\n    chart: \"KPI Card\",\n    template: { layer: [] },\n    channels: [\"metric\", \"value\", \"goal\"],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { metric, value, goal } = ctx.resolvedEncodings;\n        const config = ctx.chartProperties || {};\n\n        const metricField: string | undefined = metric?.field;\n        const valueField:  string | undefined = value?.field;\n        const goalField:   string | undefined = goal?.field;\n\n        // Behind/on-track cutoff (see properties below).\n        const rawBehind = Number(config.behindThreshold);\n        const behindThreshold = Number.isFinite(rawBehind)\n            ? Math.min(1, Math.max(0, rawBehind))\n            : 0.5;\n\n        const sourceTable = ctx.fullTable ?? ctx.table ?? [];\n\n        // ── Collect tiles ──────────────────────────────────────────────────\n        type Tile = {\n            caption: string;\n            valueText: string;\n            goalText?: string;\n            // Progress is shown only when both value & goal are numeric.\n            progress?: { fraction: number; valueNum: number; goalNum: number };\n        };\n\n        const tiles: Tile[] = [];\n        if (valueField) {\n            for (const row of sourceTable) {\n                if (!row) continue;\n                const rawValue = row[valueField];\n                if (rawValue == null) continue;\n\n                const caption = metricField\n                    ? (row[metricField] != null ? String(row[metricField]) : '')\n                    : valueField;\n\n                const rawGoal = goalField ? row[goalField] : undefined;\n\n                const valueText = renderScalar(rawValue);\n                const goalText  = rawGoal != null ? renderScalar(rawGoal) : undefined;\n\n                let progress: Tile['progress'];\n                if (\n                    typeof rawValue === 'number' && Number.isFinite(rawValue) &&\n                    typeof rawGoal  === 'number' && Number.isFinite(rawGoal)  &&\n                    rawGoal !== 0\n                ) {\n                    progress = {\n                        fraction: rawValue / rawGoal,\n                        valueNum: rawValue,\n                        goalNum:  rawGoal,\n                    };\n                }\n\n                tiles.push({ caption, valueText, goalText, progress });\n            }\n        }\n\n        if (tiles.length === 0) {\n            tiles.push({ caption: 'Value', valueText: '—' });\n        }\n\n        // ── Layout ─────────────────────────────────────────────────────────\n        const baseW = ctx.canvasSize.width;\n        // baseH unused: tile height is derived from tile width via the\n        // target aspect ratio (see TARGET_ASPECT below) rather than from\n        // the canvas height.\n        const n = tiles.length;\n\n        const requestedLayout = (config.layout as Layout) || 'auto' as any;\n        const layout: Layout =\n            requestedLayout === 'horizontal' || requestedLayout === 'vertical' || requestedLayout === 'grid'\n                ? requestedLayout\n                : 'grid';\n\n        let cols: number;\n        let rows: number;\n        if (layout === 'horizontal') {\n            cols = n; rows = 1;\n        } else if (layout === 'vertical') {\n            cols = 1; rows = n;\n        } else {\n            cols = Math.ceil(Math.sqrt(n));\n            rows = Math.ceil(n / cols);\n        }\n\n        const spacing = 4;\n        // Sizing strategy\n        // ───────────────\n        // Cards target an aspect ratio (W:H) in the 1.2–1.5 range, which\n        // is what Tableau / Power BI / Looker scorecards converge on.\n        // Width is driven by the panel + tile-count budget; height is\n        // *derived* from width via TARGET_ASPECT so cards stay in shape\n        // whether they're compressed or expanded.\n        //\n        // Each tile *wants* to be TARGET_TILE_W wide. The canvas may\n        // stretch up to baseW × MAX_STRETCH (the \"budget\"). If granting\n        // every tile its wish would exceed that, tiles compress to share\n        // what the budget allows. If even that compression would push\n        // them below MIN_TILE_W, we let the canvas grow past the budget\n        // — readability wins. tileH is then derived from tileW.\n        const MAX_STRETCH   = 1.6;\n        const TARGET_ASPECT = 1.4;  // card W:H — within Tableau/Power BI range\n        const TARGET_TILE_W = 220;\n        const MIN_TILE_W    = 130;\n        const MIN_TILE_H    = Math.round(MIN_TILE_W / TARGET_ASPECT); // ~93\n\n        const wishW        = cols * TARGET_TILE_W + (cols - 1) * spacing;\n        const budgetW      = baseW * MAX_STRETCH;\n        const minRequiredW = cols * MIN_TILE_W + (cols - 1) * spacing;\n\n        const W = Math.max(\n            minRequiredW,\n            Math.min(budgetW, Math.max(baseW, wishW)),\n        );\n\n        // Tile dimensions follow the (possibly stretched) canvas; tileH\n        // is derived from tileW via the target aspect ratio so cards\n        // never go wider than ~1.5:1 or taller than ~1.2:1.\n        const tileW = Math.max(MIN_TILE_W, Math.floor((W - spacing * (cols - 1)) / cols));\n        const tileH = Math.max(MIN_TILE_H, Math.round(tileW / TARGET_ASPECT));\n        const H     = rows * tileH + (rows - 1) * spacing;\n\n        // Card horizontal inset (must match cardLeft below) and inner\n        // horizontal padding for text. Computed before font sizing so we\n        // can constrain valueFont to \"longest value text fits inside the\n        // card\" — otherwise long numbers like 32,799,314 overflow the\n        // card frame at small tile widths.\n        const cardLeftInset = Math.max(0.5, Math.floor(tileW * 0.04));\n        // Inner text padding scales with tile but has a sane floor; this\n        // keeps a consistent card aspect ratio across tile counts.\n        const cardInnerPadX = Math.max(8, Math.floor(tileW * 0.06));\n        const cardInnerW    = Math.max(20, tileW - 2 * cardLeftInset - 2 * cardInnerPadX);\n\n        // Estimate widest text per layer so fonts can be shrunk to fit\n        // inside the card. Without this, long captions (\"Massachusetts\")\n        // or sub-lines (\"111% of 761,723\") overflow the card border at\n        // small tile widths.\n        //   - Value is bold ⇒ ~0.66em per glyph on average (conservative;\n        //     real digit widths in the default sans bold land near 0.6,\n        //     but we leave headroom so the number never kisses the border).\n        //   - Caption / sub are regular weight ⇒ ~0.58em.\n        const CHAR_W_BOLD    = 0.66;\n        const CHAR_W_REGULAR = 0.58;\n\n        const maxValueChars   = tiles.reduce((m, t) => Math.max(m, t.valueText.length), 1);\n        const maxCaptionChars = tiles.reduce((m, t) => Math.max(m, t.caption.length), 1);\n        // Sub-line text is either \"<pct>% of <goal>\" (when both value and\n        // goal are numeric) or \"Goal: <goal>\" (otherwise). Predict the\n        // longest possible form per tile so the font shrinks accordingly.\n        const maxSubChars = tiles.reduce((m, t) => {\n            if (t.progress) {\n                const pct  = Math.round(t.progress.fraction * 100);\n                const text = `${pct}% of ${t.goalText ?? ''}`;\n                return Math.max(m, text.length);\n            }\n            if (t.goalText != null) return Math.max(m, (`Goal: ${t.goalText}`).length);\n            return m;\n        }, 1);\n\n        const fontFitsWidth = (chars: number, charW: number) =>\n            Math.floor(cardInnerW / Math.max(1, chars * charW));\n\n        const valueFontByWidth   = fontFitsWidth(maxValueChars,   CHAR_W_BOLD);\n        const captionFontByWidth = fontFitsWidth(maxCaptionChars, CHAR_W_REGULAR);\n        const subFontByWidth     = fontFitsWidth(maxSubChars,     CHAR_W_REGULAR);\n\n        // Detect sub-line presence early — used both to size value (more\n        // vertical room when there's no sub) and to lay out vertically below.\n        const hasSubLine  = tiles.some(t => t.progress || t.goalText != null);\n        const hasProgress = tiles.some(t => !!t.progress);\n\n        // Typographic hierarchy (matches Material / Tableau / Power BI /\n        // Looker scorecard conventions):\n        //   - value is the hero (~hero number).\n        //   - caption ≈ value / 3 (industry range 0.30–0.40).\n        //   - sub    ≈ caption (same size; hierarchy is color/weight, not\n        //     size — the sub-line carries data like \"78% of 1.2M\").\n        // Vertical cap on value is loosened when there's no sub-line, so a\n        // single-metric card uses more of its real estate.\n        const valueHCap = hasSubLine ? tileH / 2.6 : tileH / 2.1;\n        const valueFont   = Math.min(\n            80,\n            Math.max(10, Math.floor(Math.min(tileW / 5.0, valueHCap, valueFontByWidth))),\n        );\n        const captionFont = Math.max(11, Math.min(22, Math.floor(Math.min(valueFont / 3.0, captionFontByWidth))));\n        const subFont     = Math.max(10, Math.min(18, Math.floor(Math.min(captionFont,       subFontByWidth))));\n\n        const padTop   = Math.max(4, Math.floor(captionFont * 0.55));\n        const padBot   = Math.max(4, Math.floor(subFont * 0.6));\n        const gapCV    = Math.max(6, Math.floor(captionFont * 0.55));  // caption → value\n        const gapVS    = Math.max(8, Math.floor(subFont * 1.0));        // value → sub-line\n        const gapSB    = Math.max(4, Math.floor(subFont * 0.55));       // sub-line → bar\n        const barHeight = Math.max(2, Math.floor(subFont * 0.4));\n\n        const captionTop = padTop;\n        const captionBot = captionTop + captionFont;\n        const valueTop   = captionBot + gapCV;\n        const valueMid   = valueTop + Math.floor(valueFont / 2);\n        const valueBot   = valueTop + valueFont;\n        const subTop     = valueBot + gapVS;\n        const subBot     = subTop + subFont;\n        const barTop     = subBot + gapSB;\n        const barBot     = barTop + barHeight;\n\n        const contentBot = hasProgress ? barBot : hasSubLine ? subBot : valueBot;\n        const slack = Math.max(0, tileH - (contentBot + padBot));\n        const yOffset = Math.floor(slack / 2);\n\n        const captionY  = captionTop + yOffset;\n        const valueY    = valueMid   + yOffset;\n        const subY      = subTop     + yOffset;\n        const barY      = barTop     + yOffset;\n\n        const barPad    = Math.max(4, Math.floor(tileW * 0.1));\n        const barLeft   = barPad;\n        const barRight  = tileW - barPad;\n        const barWidth  = Math.max(12, barRight - barLeft);\n\n        // ── Card frame geometry ────────────────────────────────────────────\n        // Card fills the tile minus a small outer margin so the card's\n        // visible aspect ratio tracks the tile's (driven by TARGET_ASPECT\n        // above). Content stays vertically centered inside via yOffset.\n        const cardOuterPadY = Math.max(4, Math.floor(tileH * 0.06));\n        const cardLeft   = cardLeftInset;\n        const cardRight  = tileW - cardLeftInset;\n        const cardTop    = Math.max(0.5, cardOuterPadY);\n        const cardBot    = Math.min(tileH - 0.5, tileH - cardOuterPadY);\n\n        // Card style toggle — see properties[] below. When false, the\n        // frame layer is skipped and tiles render as plain text.\n        const showCardFrame = config.style !== false;\n\n        // ── Per-tile spec builder ──────────────────────────────────────────\n        const buildTile = (t: Tile): any => {\n            const layers: any[] = [];\n\n            // Card frame (bottom layer) — sized to content, centered with it.\n            if (showCardFrame) {\n                layers.push({\n                    data: { values: [{}] },\n                    mark: {\n                        type: 'rect',\n                        fill: CARD_FILL,\n                        stroke: CARD_STROKE,\n                        strokeWidth: 1,\n                        cornerRadius: CARD_RADIUS,\n                        tooltip: null,\n                    },\n                    encoding: {\n                        x:  { value: cardLeft },\n                        x2: { value: cardRight },\n                        y:  { value: cardTop },\n                        y2: { value: cardBot },\n                    },\n                });\n            }\n\n            // Caption\n            layers.push({\n                data: { values: [{}] },\n                mark: {\n                    type: 'text',\n                    fontSize: captionFont,\n                    fontWeight: 500,\n                    fill: '#4a4a4a',\n                    align: 'center',\n                    baseline: 'top',\n                    text: t.caption,\n                    tooltip: null,\n                },\n                encoding: {\n                    x: { value: tileW / 2 },\n                    y: { value: captionY },\n                },\n            });\n\n            // Big number\n            layers.push({\n                data: { values: [{}] },\n                mark: {\n                    type: 'text',\n                    fontSize: valueFont,\n                    fontWeight: 'bold',\n                    fill: '#1a1a1a',\n                    align: 'center',\n                    baseline: 'middle',\n                    text: t.valueText,\n                    tooltip: null,\n                },\n                encoding: {\n                    x: { value: tileW / 2 },\n                    y: { value: valueY },\n                },\n            });\n\n            // Optional goal / progress line\n            if (t.progress) {\n                // Numeric value + numeric goal → \"<pct>% of <goal>\" + bar.\n                const pct = clamp(t.progress.fraction, 0, 1.5);\n                const pctText = `${Math.round(t.progress.fraction * 100)}% of ${t.goalText}`;\n\n                // Status color: behind / on-track / exceeded. Assumes\n                // higher-is-better; lower-is-better metrics should be\n                // handled by the agent inverting the value/goal pair (or\n                // by a future `direction` chart property).\n                const isExceeded = t.progress.fraction >= 1;\n                const isBehind   = t.progress.fraction < behindThreshold;\n                const fillColor  = isExceeded\n                    ? PROGRESS_EXCEEDED\n                    : isBehind\n                        ? PROGRESS_BEHIND\n                        : PROGRESS_ON_TRACK;\n\n                layers.push({\n                    data: { values: [{}] },\n                    mark: {\n                        type: 'text',\n                        fontSize: subFont,\n                        fontWeight: isExceeded ? 600 : 400,\n                        fill: isExceeded ? PROGRESS_EXCEEDED : '#666',\n                        align: 'center',\n                        baseline: 'top',\n                        text: pctText,\n                        tooltip: null,\n                    },\n                    encoding: {\n                        x: { value: tileW / 2 },\n                        y: { value: subY },\n                    },\n                });\n\n                // Track\n                layers.push({\n                    data: { values: [{}] },\n                    mark: {\n                        type: 'rect',\n                        fill: PROGRESS_TRACK,\n                        cornerRadius: barHeight / 2,\n                        tooltip: null,\n                    },\n                    encoding: {\n                        x:  { value: barLeft },\n                        x2: { value: barRight },\n                        y:  { value: barY },\n                        y2: { value: barY + barHeight },\n                    },\n                });\n                // Fill — clamped to track width; overshoot capped visually\n                // at 100% of the track, but the % label and color reveal\n                // that the goal was exceeded.\n                const fillEnd = barLeft + Math.min(1, pct) * barWidth;\n                layers.push({\n                    data: { values: [{}] },\n                    mark: {\n                        type: 'rect',\n                        fill: fillColor,\n                        cornerRadius: barHeight / 2,\n                        tooltip: null,\n                    },\n                    encoding: {\n                        x:  { value: barLeft },\n                        x2: { value: fillEnd },\n                        y:  { value: barY },\n                        y2: { value: barY + barHeight },\n                    },\n                });\n            } else if (t.goalText != null) {\n                // Non-numeric goal (or non-numeric value) → just show \"Goal: …\".\n                layers.push({\n                    data: { values: [{}] },\n                    mark: {\n                        type: 'text',\n                        fontSize: subFont,\n                        fill: '#666',\n                        align: 'center',\n                        baseline: 'top',\n                        text: `Goal: ${t.goalText}`,\n                        tooltip: null,\n                    },\n                    encoding: {\n                        x: { value: tileW / 2 },\n                        y: { value: subY },\n                    },\n                });\n            }\n\n            return {\n                width: tileW,\n                height: tileH,\n                layer: layers,\n                resolve: { scale: { x: 'independent', y: 'independent' } },\n            };\n        };\n\n        const tileSpecs = tiles.map(buildTile);\n\n        if (tileSpecs.length === 1) {\n            const tile = tileSpecs[0];\n            spec.width  = tile.width;\n            spec.height = tile.height;\n            spec.layer  = tile.layer;\n            spec.resolve = tile.resolve;\n            return;\n        }\n\n        delete spec.layer;\n        delete spec.encoding;\n        if (layout === 'horizontal') {\n            spec.hconcat = tileSpecs;\n            spec.spacing = spacing;\n        } else if (layout === 'vertical') {\n            spec.vconcat = tileSpecs;\n            spec.spacing = spacing;\n        } else {\n            const grid: any[] = [];\n            for (let r = 0; r < rows; r++) {\n                const rowTiles = tileSpecs.slice(r * cols, (r + 1) * cols);\n                if (rowTiles.length === 0) continue;\n                grid.push({ hconcat: rowTiles, spacing });\n            }\n            spec.vconcat = grid;\n            spec.spacing = spacing;\n        }\n    },\n    properties: [\n        {\n            key: 'layout',\n            label: 'Layout',\n            type: 'discrete',\n            options: [\n                { value: 'horizontal', label: 'Horizontal' },\n                { value: 'vertical',   label: 'Vertical'   },\n                { value: 'grid',       label: 'Grid'       },\n            ],\n            defaultValue: 'grid',\n        },\n        {\n            // When on (default), each tile renders inside a subtle\n            // rounded card frame (white fill + 1px border). When off,\n            // the tile is plain text — useful for single hero numbers\n            // or when the surrounding panel already provides framing.\n            key: 'style',\n            label: 'Card style',\n            type: 'binary',\n            defaultValue: true,\n        },\n        {\n            // Progress fraction below this threshold is considered\n            // \"behind\" (amber). Between threshold and 1 is \"on track\"\n            // (blue). >= 1 is \"exceeded\" (green). Only applies when a\n            // goal channel is bound and both value and goal are numeric.\n            key: 'behindThreshold',\n            label: 'Behind threshold',\n            type: 'continuous',\n            min: 0,\n            max: 1,\n            step: 0.05,\n            defaultValue: 0.5,\n            check: (ctx) => ({ applicable: !!ctx.encodings.goal?.field }),\n        },\n    ] as ChartPropertyDef[],\n};\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Trivial scalar → display string.\n *\n * - Numbers: `toLocaleString` with at most 2 fraction digits. Tiny\n *   floating-point noise near zero is snapped so \"-0\" never appears.\n * - Strings / everything else: pass through via `String(...)`.\n *\n * Any richer formatting (currency symbols, SI abbreviations, percent,\n * locale-specific patterns) should be produced by the upstream data\n * transformation — the template intentionally does not parse format\n * patterns.\n */\nfunction renderScalar(v: any): string {\n    if (typeof v === 'number' && Number.isFinite(v)) {\n        // Snap -0 / FP noise.\n        if (Math.abs(v) < 1e-9) v = 0;\n        return Number.isInteger(v)\n            ? v.toLocaleString()\n            : v.toLocaleString(undefined, { maximumFractionDigits: 2 });\n    }\n    return String(v);\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n    return Math.max(lo, Math.min(hi, n));\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Template registry — collects all chart template definitions.\n * No UI/icon dependencies. This is the pure-data template catalog.\n *\n * Each template file exports individual ChartTemplateDef objects.\n * Categories are defined here to group related charts in the UI.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport type { ChartPropertyDef, OptionEvalContext } from '../../core/types';\n\n// --- Individual chart imports ---\nimport { scatterPlotDef, regressionDef, rangedDotPlotDef, boxplotDef } from './scatter';\nimport { connectedScatterDef } from './connected-scatter';\nimport { barChartDef, pyramidChartDef, groupedBarChartDef, stackedBarChartDef, histogramDef, heatmapDef } from './bar';\nimport { lineChartDef } from './line';\nimport { sparklineDef } from './sparkline';\nimport { bumpChartDef } from './bump';\nimport { slopeChartDef } from './slope';\nimport { areaChartDef, streamgraphDef } from './area';\nimport { rangeAreaChartDef } from './range-area';\nimport { donutChartDef, pieChartDef } from './pie';\nimport { lollipopChartDef } from './lollipop';\nimport { densityPlotDef } from './density';\nimport { violinPlotDef } from './violin';\nimport { ecdfPlotDef } from './ecdf';\nimport { stripPlotDef } from './jitter';\nimport { candlestickChartDef } from './candlestick';\nimport { waterfallChartDef } from './waterfall';\nimport { ganttChartDef } from './gantt';\nimport { bulletChartDef } from './bullet';\nimport { barTableDef } from './bar-table';\nimport { radarChartDef } from './radar';\nimport { roseChartDef } from './rose';\nimport { mapDef, choroplethDef } from './map';\nimport { kpiCardDef } from './kpi-card';\n\n/**\n * Cross-cutting properties injected into every template that supports\n * column/row faceting. `independentYAxis` lets the user give each facet its own\n * y-scale. Its `check` reports *applicability* purely (the chart is faceted\n * *and* its y is quantitative); the recommended default — whether to turn it on\n * by default — is layout-coupled (it depends on the resolved facet grid and the\n * per-facet range spread) and is supplied by the compiler at assembly time.\n */\nconst FACET_AXIS_PROPERTIES: ChartPropertyDef[] = [\n    {\n        key: 'independentYAxis', label: 'Independent Y', type: 'binary',\n        check: (ctx) => ({\n            applicable:\n                (!!ctx.encodings.column?.field || !!ctx.encodings.row?.field) &&\n                ctx.channelSemantics?.y?.type === 'quantitative',\n        }),\n    },\n];\n\n/**\n * Cross-cutting per-axis log-scale controls, injected into every\n * position-cognitive template (scatter/line/strip — never length/area marks,\n * where a zero baseline matters). Their `check` decides per render which axes\n * are eligible (continuous quantitative, wide-range data) and reports the\n * recommended default. Each is a simple on/off toggle: ON forces a log/symlog\n * scale, OFF forces linear.\n */\nfunction makeLogScaleCheck(axis: 'x' | 'y') {\n    return (ctx: OptionEvalContext): { applicable: boolean; recommendedValue?: any } => {\n        const cs = ctx.channelSemantics?.[axis];\n        if (!cs?.field || cs.type !== 'quantitative') return { applicable: false };\n        let posMin = Infinity, posMax = -Infinity, posCount = 0, hasNegative = false;\n        for (const row of ctx.data ?? []) {\n            const v = row[cs.field];\n            if (typeof v !== 'number' || !isFinite(v)) continue;\n            if (v < 0) hasNegative = true;\n            else if (v > 0) { posCount++; if (v < posMin) posMin = v; if (v > posMax) posMax = v; }\n        }\n        // Offer only on non-negative data with enough positive spread (≥ 3\n        // orders of magnitude); log is undefined for negatives.\n        const offerEligible = !hasNegative && posCount >= 5 && posMax / posMin >= 1000;\n        const choice = ctx.chartProperties?.[`logScale_${axis}`];\n        // The engine's recommendation survives in cs.scaleType whenever it\n        // matters: an unset choice never overrides it, and a set choice wins via\n        // chartProperties anyway (so recommendedValue is moot in that case).\n        const recommendsLog = cs.scaleType === 'log' || cs.scaleType === 'symlog';\n        return {\n            applicable: offerEligible || choice === true || choice === false,\n            recommendedValue: recommendsLog,\n        };\n    };\n}\n\nconst LOG_SCALE_PROPERTIES: ChartPropertyDef[] = [\n    {\n        key: 'logScale_x', label: 'Log X', type: 'binary', defaultValue: false,\n        check: makeLogScaleCheck('x'),\n    },\n    {\n        key: 'logScale_y', label: 'Log Y', type: 'binary', defaultValue: false,\n        check: makeLogScaleCheck('y'),\n    },\n];\n\n/**\n * Cross-cutting per-axis zero-baseline controls, injected into every\n * position-cognitive template (scatter/line/strip — never length/area marks,\n * where the baseline is structurally required). Each is an on/off toggle: ON\n * anchors the axis at zero, OFF lets it fit the data range.\n *\n * The control is *passive*: it never re-derives a zero recommendation of its\n * own. The engine already decided (computeZeroDecision → cs.zero); the `check`\n * just reads that decision. To keep the UI uncluttered it offers the toggle\n * ONLY when the engine flags the choice as a genuine toss-up worth surfacing\n * (`cs.zero.uncertain === true`) — i.e. a zero-meaningful field on a position\n * mark whose data sits far enough from zero that anchoring at zero would\n * noticeably compress the view. Every other case (arbitrary types where zero is\n * meaningless, contextual data-range calls, meaningful data that already spans\n * to zero, and forced/unknown cases) is hidden, since there is nothing to\n * debate. The recommended default is the engine's own `cs.zero.zero`. Once the\n * host has set an explicit value the toggle stays visible so the choice can be\n * reverted.\n */\nfunction makeZeroBaselineCheck(axis: 'x' | 'y') {\n    return (ctx: OptionEvalContext): { applicable: boolean; recommendedValue?: any } => {\n        const cs = ctx.channelSemantics?.[axis];\n        if (!cs?.field || cs.type !== 'quantitative') return { applicable: false };\n        const decision = cs.zero;\n        if (!decision) return { applicable: false };\n        const choice = ctx.chartProperties?.[`includeZero_${axis}`];\n        return {\n            applicable: decision.uncertain || choice === true || choice === false,\n            recommendedValue: decision.zero,\n        };\n    };\n}\n\nconst ZERO_BASELINE_PROPERTIES: ChartPropertyDef[] = [\n    {\n        key: 'includeZero_x', label: 'Zero X', type: 'binary',\n        check: makeZeroBaselineCheck('x'),\n    },\n    {\n        key: 'includeZero_y', label: 'Zero Y', type: 'binary',\n        check: makeZeroBaselineCheck('y'),\n    },\n];\n\n/**\n * Cross-cutting X-axis dtype toggle, injected into banded/categorical-x\n * templates (bar, line, area, lollipop) whose category axis carries a genuine\n * *dual* interpretation: a date-like field the resolver classified as\n * `temporal` but whose distinct values also form a modest, readable set of\n * discrete labels (e.g. year-month buckets like \"2010-01\"). The control lets\n * the user force that axis between a continuous time scale (`temporal`) and\n * discrete bands (`nominal`). It applies to *either* position axis — x on a\n * vertical bar/line, y on a horizontal (transposed) bar/lollipop. The chosen\n * value is applied at the *encoding* level (encoding.<axis>.type) by the\n * assembler, so the whole pipeline — sorting, layout, formatting — honors the\n * override (resolveChannelSemantics treats an explicit encoding.type as\n * authoritative). See assembleVegaLite.\n *\n * Charts that qualify (a position axis is a discrete-capable band that also\n * accepts a continuous time scale).\n */\nconst AXIS_DTYPE_CHARTS = new Set([\n    'Bar Chart', 'Line Chart', 'Area Chart', 'Lollipop Chart', 'Heatmap',\n]);\n\n/** Above this distinct-value count, discrete bands are unreadable — only the\n *  continuous time scale makes sense, so the toggle is not offered. */\nconst AXIS_DTYPE_MAX_CATEGORIES = 50;\n\nfunction makeAxisDtypeCheck(axis: 'x' | 'y') {\n    return (ctx: OptionEvalContext): { applicable: boolean; recommendedValue?: any } => {\n        const cs = ctx.channelSemantics?.[axis];\n        if (!cs?.field) return { applicable: false };\n        // Once the user picks a value the override flips cs.type, so keep\n        // the control visible on any explicit choice.\n        const choice = ctx.chartProperties?.[`${axis}AxisType`];\n        if (choice != null) return { applicable: true, recommendedValue: 'temporal' };\n        // Otherwise offer only the genuine dual-interpretation case: a\n        // date-like axis the resolver made temporal, with a modest number of\n        // distinct values so discrete bands stay readable.\n        if (cs.type !== 'temporal') return { applicable: false };\n        const distinct = new Set(\n            (ctx.data ?? []).map(r => r[cs.field]).filter(v => v != null && v !== ''),\n        );\n        const dual = distinct.size >= 2 && distinct.size <= AXIS_DTYPE_MAX_CATEGORIES;\n        return { applicable: dual, recommendedValue: 'temporal' };\n    };\n}\n\nconst AXIS_DTYPE_PROPERTIES: ChartPropertyDef[] = [\n    {\n        key: 'xAxisType', label: 'X as', type: 'discrete',\n        options: [\n            { value: 'temporal', label: 'Temporal' },\n            { value: 'nominal', label: 'Discrete' },\n        ],\n        check: makeAxisDtypeCheck('x'),\n    },\n    {\n        key: 'yAxisType', label: 'Y as', type: 'discrete',\n        options: [\n            { value: 'temporal', label: 'Temporal' },\n            { value: 'nominal', label: 'Discrete' },\n        ],\n        check: makeAxisDtypeCheck('y'),\n    },\n];\n\n/**\n * Attach the cross-cutting properties (faceting, log scale, axis dtype) a\n * template qualifies for, based on its channels and mark-cognitive role. Keeps\n * these options co-located with the engine that evaluates them, so a downstream\n * consumer of Flint sees a self-describing template catalog. Idempotent:\n * any property the template already declares with the same key wins.\n */\nfunction withInjectedProperties(def: ChartTemplateDef): ChartTemplateDef {\n    const hasFacetChannels = def.channels?.some(ch => ch === 'column' || ch === 'row');\n    const supportsFacetAxisControl = hasFacetChannels && def.chart !== 'Sparkline';\n    const isPosition = def.markCognitiveChannel === 'position';\n    const wantsAxisDtype = AXIS_DTYPE_CHARTS.has(def.chart);\n    const extra: ChartPropertyDef[] = [\n        ...(supportsFacetAxisControl ? FACET_AXIS_PROPERTIES : []),\n        ...(isPosition ? LOG_SCALE_PROPERTIES : []),\n        ...(isPosition ? ZERO_BASELINE_PROPERTIES : []),\n        ...(wantsAxisDtype ? AXIS_DTYPE_PROPERTIES : []),\n    ];\n    if (extra.length === 0) return def;\n    const ownKeys = new Set((def.properties ?? []).map(p => p.key));\n    return {\n        ...def,\n        properties: [...(def.properties ?? []), ...extra.filter(p => !ownKeys.has(p.key))],\n    };\n}\n\n/**\n * All chart template definitions, grouped by category.\n * Keys are category names shown in the UI, values are arrays of template definitions.\n *\n * Categories are organized by *mark family* — charts in the same group share\n * their dominant visual primitive (point, bar, line/area, etc.). This keeps\n * placement objective and the picker readable.\n */\nexport const vlTemplateDefs: { [key: string]: ChartTemplateDef[] } = Object.fromEntries(\n    Object.entries({\n        \"Points\":          [scatterPlotDef, regressionDef, connectedScatterDef, rangedDotPlotDef, stripPlotDef],\n        \"Bars\":            [barChartDef, groupedBarChartDef, stackedBarChartDef, lollipopChartDef, waterfallChartDef, ganttChartDef, bulletChartDef],\n        \"Distributions\":   [histogramDef, densityPlotDef, ecdfPlotDef, violinPlotDef, boxplotDef, pyramidChartDef, candlestickChartDef],\n        \"Lines & Areas\":   [lineChartDef, sparklineDef, bumpChartDef, slopeChartDef, areaChartDef, streamgraphDef, rangeAreaChartDef],\n        \"Circular\":        [pieChartDef, donutChartDef, roseChartDef, radarChartDef],\n        \"Tables & Maps\":   [heatmapDef, barTableDef, kpiCardDef, mapDef, choroplethDef],\n    }).map(([category, defs]) => [category, defs.map(withInjectedProperties)]),\n);\n\n/**\n * Flat list of all Vega-Lite chart template definitions.\n */\nexport const vlAllTemplateDefs: ChartTemplateDef[] = Object.values(vlTemplateDefs).flat();\n\n/**\n * Look up a Vega-Lite chart template definition by chart type name.\n */\nexport function vlGetTemplateDef(chartType: string): ChartTemplateDef | undefined {\n    return vlAllTemplateDefs.find(t => t.chart === chartType);\n}\n\n/**\n * Get the available channels for a Vega-Lite chart type.\n */\nexport function vlGetTemplateChannels(chartType: string): string[] {\n    return vlGetTemplateDef(chartType)?.channels || [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * PHASE 2: INSTANTIATE SPEC\n * =============================================================================\n *\n * Combine semantic decisions (Phase 0) and layout dimensions (Phase 1) to\n * produce the final Vega-Lite specification.\n *\n * This is the **only phase that knows about Vega-Lite** (or whichever\n * output format is targeted).\n *\n * VL dependency: **Yes — this is where VL lives**\n * =============================================================================\n */\n\nimport type {\n    ChannelSemantics,\n    InstantiateContext,\n    ChartWarning,\n} from '../core/types';\nimport { formatSpecToLabelExpr } from './format';\nimport { snapToBoundHeuristic } from '../core/field-semantics';\n\nconst DEFAULT_QUANTITATIVE_AXIS_FORMAT = ',.12~g';\n\n// ---------------------------------------------------------------------------\n// Public API: instantiateSpec\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 2: Build the final VL specification from semantic decisions and\n * layout results.\n *\n * This is the shared assembler logic that translates abstract decisions\n * into VL syntax. Template-specific logic is handled by\n * template.instantiate(spec, context).\n *\n * This function handles the VL-specific plumbing that is common across\n * all templates:\n *   - Canvas dimensions (config.view.continuousWidth/Height)\n *   - Discrete step sizing (width: {step: N})\n *   - Zero-baseline application\n *   - Color scheme application\n *   - Temporal format application\n *   - Label sizing application\n *   - Overflow warning styling\n *\n * @param vgObj       The mutated VL spec (after template encoding construction)\n * @param context     Combined context from all phases\n * @param warnings    Array to append warnings to\n */\nexport function vlApplyLayoutToSpec(\n    vgObj: any,\n    context: InstantiateContext,\n    warnings: ChartWarning[],\n): void {\n    const { channelSemantics, layout, canvasSize } = context;\n\n    const xIsDiscrete = layout.xNominalCount > 0;\n    const yIsDiscrete = layout.yNominalCount > 0;\n\n    // --- Helper: iterate encoding targets across top-level, spec, and layers ---\n    // After facet restructuring, encodings may live under vgObj.spec instead\n    // of vgObj directly, and layers may be under vgObj.spec.layer.\n    const collectEncodingTargets = (ch: string): any[] => {\n        const targets: any[] = [];\n        if (vgObj.encoding?.[ch]) targets.push(vgObj.encoding[ch]);\n        if (vgObj.spec?.encoding?.[ch]) targets.push(vgObj.spec.encoding[ch]);\n        if (Array.isArray(vgObj.layer)) {\n            for (const layer of vgObj.layer) {\n                if (layer.encoding?.[ch]) targets.push(layer.encoding[ch]);\n            }\n        }\n        if (Array.isArray(vgObj.spec?.layer)) {\n            for (const layer of vgObj.spec.layer) {\n                if (layer.encoding?.[ch]) targets.push(layer.encoding[ch]);\n            }\n        }\n        return targets;\n    };\n\n    // --- Apply zero-baseline decisions ---\n    for (const ch of ['x', 'y'] as const) {\n        const cs = channelSemantics[ch];\n        if (!cs?.zero) continue;\n        const decision = cs.zero;\n\n        const targets = collectEncodingTargets(ch)\n            .filter(enc => enc.type === 'quantitative');\n\n        for (const enc of targets) {\n            // Skip binned encodings — the bin axis represents data values,\n            // not bar length, so zero-baseline is inappropriate (e.g. histograms).\n            if (enc.bin) continue;\n            // Skip encodings using a private/synthetic field distinct from\n            // the channel's semantic field (e.g. Radar's `__y` polar coord).\n            if (cs.field && enc.field && enc.field !== cs.field) continue;\n            if (!enc.scale) enc.scale = {};\n            if (enc.scale.zero !== undefined) continue;\n            if (enc.scale.domain && Array.isArray(enc.scale.domain)) continue;\n\n            enc.scale.zero = decision.zero;\n\n            // No explicit domain padding — VL's native `nice` rounding\n            // (on by default) already provides breathing room with clean\n            // tick-aligned bounds, which is superior to computed fractional\n            // bounds like [1.86, 4.94] that also conflict with semantic\n            // domain constraints and log scales.\n        }\n    }\n\n    // --- Apply field-context semantic decisions (format, domain, ticks, etc.) ---\n    vlApplyFieldContext(vgObj, channelSemantics, collectEncodingTargets, context);\n\n    // --- Apply safe default formatting to quantitative axes ---\n    vlApplyDefaultQuantitativeAxisFormat(collectEncodingTargets);\n\n    // --- Apply temporal formatting ---\n    // For positional temporal axes (x/y), do NOT set axis.format — VL's\n    // built-in multi-level temporal labeling (e.g. \"2016\" at year boundaries,\n    // \"April\" / \"July\" within a year) is far superior to a single uniform\n    // format string which loses hierarchical context.\n    // We still apply the format to color legends where multi-level is unavailable.\n    const applyTemporalFormat = (enc: any, channel: string, cs: ChannelSemantics | undefined) => {\n        if (!enc || !cs?.temporalFormat) return;\n        if (enc.type === 'temporal') {\n            if (channel === 'color') {\n                if (!enc.legend) enc.legend = {};\n                enc.legend.format = cs.temporalFormat;\n            }\n            // x/y: intentionally omitted — let VL use native multi-level labels\n        }\n    };\n\n    // Discrete (ordinal/nominal) temporal axes and legends render the raw\n    // string value as-is. A discrete axis treats values as opaque categories,\n    // so the label should match what's in the table (e.g. \"2010-01\"). We avoid\n    // toDate/timeFormat reformatting here: it added no value for already-string\n    // data and risked timezone-shifted labels (\"2010-01\" → \"Dec 2009\"). If a\n    // column genuinely needs date parsing/formatting (e.g. numeric timestamps),\n    // the user can switch that axis to temporal (continuous), where Vega-Lite\n    // handles parsing and multi-level labels natively.\n\n    // Iterate all encoding locations (top-level, spec, layers)\n    const applyTemporalToEncoding = (encoding: Record<string, any>) => {\n        for (const [ch, enc] of Object.entries(encoding)) {\n            applyTemporalFormat(enc, ch, channelSemantics[ch]);\n        }\n    };\n\n    if (vgObj.encoding) applyTemporalToEncoding(vgObj.encoding);\n    if (vgObj.spec?.encoding) applyTemporalToEncoding(vgObj.spec.encoding);\n    if (Array.isArray(vgObj.layer)) {\n        for (const layer of vgObj.layer) {\n            if (layer.encoding) applyTemporalToEncoding(layer.encoding);\n        }\n    }\n    if (Array.isArray(vgObj.spec?.layer)) {\n        for (const layer of vgObj.spec.layer) {\n            if (layer.encoding) applyTemporalToEncoding(layer.encoding);\n        }\n    }\n\n    // --- Banded continuous axis domain padding ---\n    // For banded continuous axes (e.g. Heatmap with quantitative X/Y),\n    // add a half-step buffer so edge cells aren't clipped at the boundary.\n    // Without this, the domain starts/ends exactly at min/max data values\n    // and rect marks at the edges are only half-visible.\n    for (const axis of ['x', 'y'] as const) {\n        const bandedCount = axis === 'x' ? layout.xContinuousAsDiscrete : layout.yContinuousAsDiscrete;\n        if (bandedCount <= 1) continue;\n\n        const enc = vgObj.encoding?.[axis] || vgObj.spec?.encoding?.[axis];\n        if (!enc) continue;\n\n        // Skip binned encodings — VL handles bin domain automatically\n        if (enc.bin) continue;\n\n        const isTemporal = enc.type === 'temporal';\n        const isContinuous = enc.type === 'quantitative' || isTemporal;\n        if (!isContinuous) continue;\n        if (enc.scale?.domain) continue;\n\n        const numericVals = context.table\n            .map((r: any) => {\n                const raw = r[enc.field];\n                if (raw == null) return NaN;\n                if (isTemporal) return +new Date(raw);\n                return +raw;\n            })\n            .filter((v: number) => !isNaN(v));\n        if (numericVals.length <= 1) continue;\n\n        const minVal = Math.min(...numericVals);\n        const maxVal = Math.max(...numericVals);\n        const dataRange = maxVal - minVal;\n        if (dataRange === 0) continue;\n\n        const pad = dataRange / (bandedCount - 1) / 2;\n        if (!enc.scale) enc.scale = {};\n        enc.scale.nice = false;\n\n        if (isTemporal) {\n            enc.scale.domain = [\n                new Date(minVal - pad).toISOString(),\n                new Date(maxVal + pad).toISOString(),\n            ];\n        } else {\n            enc.scale.domain = [minVal - pad, maxVal + pad];\n        }\n    }\n\n    // --- Canvas sizing ---\n    const axisXConfig: Record<string, any> = {\n        labelLimit: layout.xLabel.labelLimit,\n        labelFontSize: layout.xLabel.fontSize,\n        titleFontSize: layout.titleFontSize,\n    };\n    if (layout.xLabel.labelAngle !== undefined) {\n        axisXConfig.labelAngle = layout.xLabel.labelAngle;\n        axisXConfig.labelAlign = layout.xLabel.labelAlign;\n        axisXConfig.labelBaseline = layout.xLabel.labelBaseline;\n    }\n    const axisYConfig: Record<string, any> = {\n        labelFontSize: layout.yLabel.fontSize,\n        titleFontSize: layout.titleFontSize,\n    };\n\n    vgObj.config = {\n        view: {\n            continuousWidth: layout.subplotWidth,\n            continuousHeight: layout.subplotHeight,\n            ...((!vgObj.encoding || vgObj._hideViewStroke) && { stroke: null }),\n        },\n        axisX: axisXConfig,\n        axisY: axisYConfig,\n        legend: {\n            labelFontSize: layout.legendFontSize,\n            titleFontSize: layout.titleFontSize,\n        },\n    };\n\n    // --- Step-based sizing for discrete axes ---\n    if (xIsDiscrete && typeof vgObj.width !== 'number') {\n        vgObj.width = layout.xStepUnit === 'group'\n            ? { step: layout.xStep, for: 'position' }\n            : { step: layout.xStep };\n    }\n    if (yIsDiscrete && typeof vgObj.height !== 'number') {\n        vgObj.height = layout.yStepUnit === 'group'\n            ? { step: layout.yStep, for: 'position' }\n            : { step: layout.yStep };\n    }\n\n    // Sync hardcoded template width/height to config.view\n    if (typeof vgObj.width === 'number') {\n        vgObj.config.view.continuousWidth = vgObj.width;\n    } else if (vgObj.width && typeof vgObj.width === 'object' && 'step' in vgObj.width) {\n        vgObj.width = layout.xStepUnit === 'group'\n            ? { step: layout.xStep, for: 'position' }\n            : { step: layout.xStep };\n    }\n    if (typeof vgObj.height === 'number') {\n        vgObj.config.view.continuousHeight = vgObj.height;\n    } else if (vgObj.height && typeof vgObj.height === 'object' && 'step' in vgObj.height) {\n        vgObj.height = layout.yStepUnit === 'group'\n            ? { step: layout.yStep, for: 'position' }\n            : { step: layout.yStep };\n    }\n\n    // Facet header sizing — constrain labels to subplot width\n    const totalFacets = (layout.facet?.columns ?? 1) * (layout.facet?.rows ?? 1);\n    const facetRows = layout.facet?.rows ?? 1;\n    const facetCols = layout.facet?.columns ?? 1;\n    if (facetRows > 1 || facetCols > 1) {\n        // Constrain each header's labels to the subplot it belongs to:\n        //   • column / wrap-facet headers run horizontally on top → bound by WIDTH\n        //   • row headers run rotated down the side → bound by HEIGHT\n        // Only inject the configs for the facet channels that actually exist.\n        const enc = vgObj.encoding || vgObj.spec?.encoding;\n        const facetDef = vgObj.facet || {};\n        const hasRow = !!(enc?.row || facetDef.row);\n        const hasColumn = !!(enc?.column || facetDef.column);\n        const hasWrap = !!(enc?.facet || (vgObj.facet && !facetDef.row && !facetDef.column));\n\n        const fontCfg: Record<string, any> = totalFacets > 6 ? { labelFontSize: 9 } : {};\n        const colLimit = Math.max(80, layout.subplotWidth + 20);\n        const rowLimit = Math.max(30, layout.subplotHeight);\n\n        if (hasColumn) {\n            vgObj.config.headerColumn = { ...(vgObj.config.headerColumn || {}), ...fontCfg, labelLimit: colLimit };\n        }\n        if (hasRow) {\n            vgObj.config.headerRow = { ...(vgObj.config.headerRow || {}), ...fontCfg, labelLimit: rowLimit };\n        }\n        if (hasWrap) {\n            vgObj.config.headerFacet = { ...(vgObj.config.headerFacet || {}), ...fontCfg, labelLimit: colLimit };\n        }\n    }\n    const encTarget = vgObj.spec?.encoding || vgObj.encoding;\n\n    if (facetRows > 1 || facetCols > 1) {\n        if (!vgObj.config) vgObj.config = {};\n        const lightTitle = { titleFontWeight: 'normal' as const, titleFontSize: 11, titleColor: '#666' };\n        vgObj.config.axisX = { ...(vgObj.config.axisX || {}), ...lightTitle };\n        vgObj.config.axisY = { ...(vgObj.config.axisY || {}), ...lightTitle };\n    }\n\n    // Row-faceted y-axis title handling.\n    // Vega-Lite draws the y-axis title once PER facet row, so on a stack of\n    // short subplots the same label repeats down the left edge until it\n    // collapses into an unreadable vertical smear right next to the row header.\n    //\n    //   • Nominal y — the category labels are self-describing, so just drop the\n    //     repeated title.\n    //   • Quantitative/temporal y on a SHARED scale — the measure is identical\n    //     in every subplot, so fold it into the row header title (e.g. the\n    //     rotated left label becomes \"Product: Price Index (Start = 100)\") and\n    //     suppress the per-subplot title. With an INDEPENDENT y scale each\n    //     subplot can differ, so we leave the per-subplot titles in place.\n    const rowEnc = encTarget?.row || vgObj.facet?.row;\n    const yEnc = encTarget?.y;\n    if (yEnc && (rowEnc || (facetRows > 1 && encTarget?.y))) {\n        if (yEnc.type === 'nominal') {\n            if (!vgObj.config) vgObj.config = {};\n            vgObj.config.axisY = { ...(vgObj.config.axisY || {}), title: null };\n            if (!yEnc.axis) yEnc.axis = {};\n            yEnc.axis.title = null;\n        } else if (rowEnc && vgObj.resolve?.scale?.y !== 'independent' && !vgObj._suppressFacetMeasureTitle) {\n            const yTitle = (yEnc.axis && yEnc.axis.title) || yEnc.title || yEnc.field;\n            const rowTitle = (rowEnc.header && rowEnc.header.title) || rowEnc.title || rowEnc.field;\n            if (yTitle && rowTitle) {\n                if (!rowEnc.header) rowEnc.header = {};\n                rowEnc.header.title = `${rowTitle}: ${yTitle}`;\n                if (!vgObj.config) vgObj.config = {};\n                vgObj.config.axisY = { ...(vgObj.config.axisY || {}), title: null };\n                if (!yEnc.axis) yEnc.axis = {};\n                yEnc.axis.title = null;\n            }\n        }\n    }\n\n    // --- Dual-legend repositioning ---\n    // When multiple channels produce legends (e.g. color + size, color + opacity),\n    // Vega-Lite stacks them all on the right, which eats into the plot area on a\n    // 400×300 canvas.  Detect this and move the categorical (nominal/ordinal)\n    // legend to the bottom with horizontal orientation, keeping the quantitative\n    // legend compact on the right — BUT only when the total chart height is too\n    // short to fit both stacked on the right comfortably.\n    const legendChannels = (['color', 'size', 'shape', 'opacity', 'strokeDash', 'strokeWidth'] as const)\n        .filter(ch => {\n            const targets = collectEncodingTargets(ch);\n            return targets.some(enc => enc.field && enc.legend !== null);\n        });\n\n    if (legendChannels.length >= 2) {\n        // Separate categorical vs quantitative legend channels\n        const categoricalChs: string[] = [];\n        const quantitativeChs: string[] = [];\n        for (const ch of legendChannels) {\n            const targets = collectEncodingTargets(ch);\n            const isQuant = targets.some(enc => enc.type === 'quantitative' || enc.type === 'temporal');\n            if (isQuant) {\n                quantitativeChs.push(ch);\n            } else {\n                categoricalChs.push(ch);\n            }\n        }\n\n        // Move categorical legends to bottom, keep quantitative ones on right\n        // — but only if the total chart height can't comfortably fit both.\n        if (categoricalChs.length > 0 && quantitativeChs.length > 0) {\n            // Estimate total right-side legend height:\n            //   Quantitative legend ≈ 100px (gradient + title + labels)\n            //   Categorical legend ≈ title(20px) + entries × 20px each\n            const QUANT_LEGEND_HEIGHT = 100;\n            const CAT_TITLE_HEIGHT = 20;\n            const CAT_ENTRY_HEIGHT = 20;\n\n            // Estimate domain sizes for categorical legends\n            let totalCatEntries = 0;\n            for (const ch of categoricalChs) {\n                const targets = collectEncodingTargets(ch);\n                for (const enc of targets) {\n                    if (!enc.field) continue;\n                    const domainSize = new Set(context.table.map((r: any) => r[enc.field])).size;\n                    totalCatEntries += domainSize;\n                }\n            }\n            const estCatHeight = CAT_TITLE_HEIGHT * categoricalChs.length + totalCatEntries * CAT_ENTRY_HEIGHT;\n            const estTotalLegendHeight = QUANT_LEGEND_HEIGHT + estCatHeight + 20; // 20px gap between legends\n\n            // Total chart height = subplot height × facet rows + overhead\n            const totalChartHeight = layout.subplotHeight * (layout.facet?.rows ?? 1)\n                + (layout.facet?.rows ?? 1) * 10; // approx facet spacing\n\n            const fitsOnRight = totalChartHeight >= estTotalLegendHeight;\n\n            if (!fitsOnRight) {\n                for (const ch of categoricalChs) {\n                    const targets = collectEncodingTargets(ch);\n                    for (const enc of targets) {\n                        if (!enc.field) continue;\n                        if (!enc.legend) enc.legend = {};\n                        enc.legend.orient = 'bottom';\n                        enc.legend.direction = 'horizontal';\n\n                        // Responsive columns: estimate how many legend entries fit\n                        // per row based on the available canvas width.\n                        // Each entry ≈ symbol(16) + label + padding.  Estimate label\n                        // width from the longest domain value, then derive columns.\n                        const domainValues = [...new Set(context.table.map((r: any) => r[enc.field]))];\n                        const domainSize = domainValues.length;\n                        const maxLabelLen = Math.max(\n                            ...domainValues.map((v: any) => String(v ?? '').length), 3,\n                        );\n                        // VL legend: symbol (~15px) + label (~5px/char at 11px proportional font) + gap (~8px)\n                        const entryWidth = 15 + maxLabelLen * 5 + 8;\n                        // Available width: VL's bottom legend spans the full SVG width,\n                        // which includes the plot area plus the right-side quantitative\n                        // legend (~130px).  Use that total for column estimation.\n                        const rightLegendWidth = 130;\n                        const availableWidth = canvasSize.width + rightLegendWidth;\n                        const columnsByWidth = Math.max(1, Math.floor(availableWidth / entryWidth));\n                        enc.legend.columns = Math.min(columnsByWidth, domainSize);\n\n                        // For very high cardinality, cap visible symbols to keep\n                        // the bottom legend from growing too tall.\n                        const maxRows = 4;\n                        const maxVisible = columnsByWidth * maxRows;\n                        if (domainSize > maxVisible) {\n                            enc.legend.symbolLimit = maxVisible;\n                        }\n                    }\n                }\n            }\n            // else: chart is tall enough — leave both legends on the right (VL default)\n        }\n    }\n\n    // --- Overflow styling (from TruncationWarning[]) ---\n    // Applied AFTER template.instantiate and facet restructuring,\n    // so we modify the spec's actual encoding objects.\n    for (const trunc of layout.truncations) {\n        const ch = trunc.channel;\n        const targets = collectEncodingTargets(ch);\n\n        for (const enc of targets) {\n            if (!enc.field) continue;\n\n            // Axis/legend label color: grey for placeholder\n            if (ch === 'x' || ch === 'y') {\n                if (enc.axis === null) continue; // preserve axis suppression\n                if (!enc.axis) enc.axis = {};\n                enc.axis.labelColor = {\n                    condition: {\n                        test: `datum.label == '${trunc.placeholder}'`,\n                        value: \"#999999\",\n                    },\n                    value: \"#000000\",\n                };\n                // Set domain to kept values + placeholder\n                if (!enc.scale) enc.scale = {};\n                enc.scale.domain = [...trunc.keptValues, trunc.placeholder];\n            } else if (ch === 'color') {\n                if (!enc.legend) enc.legend = {};\n                enc.legend.values = [...trunc.keptValues, trunc.placeholder];\n            }\n        }\n    }\n}\n\n// ---------------------------------------------------------------------------\n// vlApplyFieldContext — Apply field-level semantic decisions to VL encodings\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the positive and negative stacked extremes for a quantitative field.\n *\n * For a stacked bar chart with:\n *   x = category (grouping), y = value (stacked), color = series\n *\n * Vega-Lite stacks positive and negative contributions *separately* (positives\n * grow up from 0, negatives down from 0), so we track each side independently —\n * summing signed values together would let a mix of +0.9 and −0.2 cancel and\n * hide a tall positive stack. Returns the largest positive group sum and the\n * most-negative group sum, used to check whether either side overflows an\n * intrinsic domain bound (e.g., correlations summing past 1).\n *\n * Returns undefined if the grouping field can't be determined.\n */\nfunction computeStackedExtremes(\n    table: any[],\n    measureField: string,\n    measureChannel: string,\n    channelSemantics: Record<string, ChannelSemantics>,\n): { maxPos: number; minNeg: number } | undefined {\n    if (!table || table.length === 0) return undefined;\n\n    // The grouping axis is the *other* positional channel\n    const groupChannel = measureChannel === 'y' ? 'x' : 'y';\n    const groupCS = channelSemantics[groupChannel];\n    if (!groupCS) return undefined;\n    const groupField = groupCS.field;\n    if (!groupField) return undefined;\n\n    // Also consider facet fields (row/column) as additional grouping\n    const facetFields: string[] = [];\n    for (const ch of ['row', 'column']) {\n        const fcs = channelSemantics[ch];\n        if (fcs?.field) facetFields.push(fcs.field);\n    }\n\n    // Group rows and sum positive / negative contributions per group separately\n    const posTotals = new Map<string, number>();\n    const negTotals = new Map<string, number>();\n    for (const row of table) {\n        const val = row[measureField];\n        if (typeof val !== 'number' || isNaN(val)) continue;\n\n        // Build group key from grouping field + facet fields\n        const keyParts = [String(row[groupField])];\n        for (const ff of facetFields) {\n            keyParts.push(String(row[ff]));\n        }\n        const key = keyParts.join('|||');\n        if (val >= 0) {\n            posTotals.set(key, (posTotals.get(key) ?? 0) + val);\n        } else {\n            negTotals.set(key, (negTotals.get(key) ?? 0) + val);\n        }\n    }\n\n    if (posTotals.size === 0 && negTotals.size === 0) return undefined;\n    const maxPos = posTotals.size > 0 ? Math.max(...posTotals.values()) : 0;\n    const minNeg = negTotals.size > 0 ? Math.min(...negTotals.values()) : 0;\n    return { maxPos, minNeg };\n}\n\n/**\n * Detect whether a discrete category repeats across rows — i.e., multiple rows\n * share the same category value, which makes Vega-Lite stack the measure even\n * with no color encoding. Used to recognise implicit no-color stacking so the\n * intrinsic-domain check runs against the stacked total, not individual values.\n */\nfunction hasRepeatedCategory(\n    table: any[],\n    categoryField: string | undefined,\n    measureField: string,\n): boolean {\n    if (!table || table.length === 0 || !categoryField) return false;\n    const seen = new Set<string>();\n    for (const row of table) {\n        const val = row[measureField];\n        if (typeof val !== 'number' || isNaN(val)) continue;\n        const key = String(row[categoryField]);\n        if (seen.has(key)) return true;\n        seen.add(key);\n    }\n    return false;\n}\n\n/**\n * Get the effective intrinsic domain for a field, even when no explicit\n * `intrinsicDomain` is provided in the annotation.\n *\n * Mirrors steps 2–3 of `resolveDomainConstraint` (in field-semantics.ts)\n * which infer intrinsic bounds from the semantic type:\n *   - Percentage → [0, 1] or [0, 100] depending on data scale\n *   - Latitude → [-90, 90]\n *   - Longitude → [-180, 180]\n *   - Correlation → [-1, 1]\n *\n * Without this: stacked charts with Percentage fields that lack explicit\n * annotation never get domain constraints, because the stacking re-check\n * in vlApplyFieldContext couldn't find the intrinsic bounds.\n */\nfunction getEffectiveIntrinsicDomain(\n    cs: ChannelSemantics,\n    table: any[],\n    field: string,\n): [number, number] | undefined {\n    // 1. Explicit annotation — authoritative\n    if (cs.semanticAnnotation?.intrinsicDomain) {\n        return cs.semanticAnnotation.intrinsicDomain;\n    }\n\n    // 2. Infer from semantic type\n    const semanticType = cs.semanticAnnotation?.semanticType;\n    if (!semanticType) return undefined;\n\n    if (semanticType === 'Latitude')    return [-90, 90];\n    if (semanticType === 'Longitude')   return [-180, 180];\n    if (semanticType === 'Correlation') return [-1, 1];\n\n    if (semanticType === 'Percentage') {\n        const nums = table\n            .map(r => r[field])\n            .filter((v: any) => typeof v === 'number' && !isNaN(v));\n        if (nums.length > 0) {\n            // Inline scale detection: if ≥80% of |values| are ≤1, it's 0-1 scale\n            const countBelow1 = nums.filter(v => Math.abs(v) <= 1).length;\n            const isFractional = countBelow1 / nums.length >= 0.8;\n            return isFractional ? [0, 1] : [0, 100];\n        }\n    }\n\n    return undefined;\n}\n\n/**\n * Apply field-context semantic properties to VL encoding objects.\n *\n * Consumes the following ChannelSemantics properties that were previously\n * dead writes (computed by resolveChannelSemantics but never read):\n *\n *   1. format       → axis.format / axis.labelExpr  (number formatting)\n *   2. tooltipFormat → tooltip encoding format\n *   3. domainConstraint → scale.domain + scale.clamp  (bounded types)\n *   4. tickConstraint   → axis.tickMinStep + axis.values  (integer ticks)\n *   5. reversed     → scale.reverse  (rank axes)\n *   6. nice         → scale.nice  (bounded types disable nice)\n *   7. scaleType    → scale.type  (log, sqrt, symlog)\n */\nfunction vlApplyFieldContext(\n    vgObj: any,\n    channelSemantics: Record<string, ChannelSemantics>,\n    collectEncodingTargets: (ch: string) => any[],\n    context: InstantiateContext,\n): void {\n    for (const [ch, cs] of Object.entries(channelSemantics)) {\n        const targets = collectEncodingTargets(ch);\n        if (targets.length === 0) continue;\n\n        for (const enc of targets) {\n            if (!enc.field) continue;\n\n            // Skip encodings whose field differs from the channel's semantic\n            // field. Templates (e.g. Radar) may inject private computed fields\n            // (e.g. `__x`, `__y` for polar coordinates) on the same VL channel;\n            // applying the user field's semantic context (domain, format, etc.)\n            // to those synthetic fields produces wrong scales.\n            if (cs.field && enc.field !== cs.field) continue;\n\n            // ── 0. Temporal + bin incompatibility guard ──\n            // VL's `bin` operates on numeric values. Setting `type: \"temporal\"`\n            // with `bin` causes VL to parse values (e.g., year 2004) as dates\n            // and bin in milliseconds, producing nonsensical time-of-day labels.\n            // For temporal binning, VL expects `timeUnit` instead.\n            // Fix: demote to `quantitative` so bins work on raw numbers.\n            if (enc.bin && enc.type === 'temporal') {\n                enc.type = 'quantitative';\n                // Year/Decade values should show as plain integers, not \"2,004\"\n                if (enc.axis !== null) {\n                    if (!enc.axis) enc.axis = {};\n                    if (!enc.axis.format) enc.axis.format = 'd';\n                }\n            }\n\n            // ── 1. Number format (axis.format / axis.labelExpr) ──\n            // Only apply to quantitative positional channels.\n            // Skip binned encodings — VL formats bin ranges natively and\n            // our semantic format (e.g. percent) would misinterpret the\n            // bin boundaries.\n            // Without this: axes show raw numbers like \"1000000\" instead of \"$1,000,000\".\n            if ((cs.format?.pattern || cs.format?.abbreviate) && (ch === 'x' || ch === 'y') && enc.type === 'quantitative' && !enc.bin) {\n                // Skip if the encoding already has an explicit format\n                if (enc.axis === null) { /* preserve axis suppression */ }\n                else if (!enc.axis?.format && !enc.axis?.labelExpr) {\n                    if (!enc.axis) enc.axis = {};\n                    const expr = formatSpecToLabelExpr(cs.format);\n                    if (expr) {\n                        enc.axis.labelExpr = expr;\n                    } else {\n                        enc.axis.format = cs.format.pattern;\n                    }\n                }\n            }\n\n            // ── 2. Tooltip format ──\n            // Tooltip formatting is handled via VL's tooltip encoding with format.\n            // Without this: tooltips show raw floats like \"0.4812\" instead of \"48.12%\".\n            // NOTE: VL's `config.mark.tooltip: true` uses default formatting;\n            // explicit tooltip channels would need encoding-level format.\n            // For now, we set formatType on the main encoding when tooltipFormat\n            // has a simple pattern (no prefix/suffix).\n            // Full tooltip encoding is deferred to template-level implementation.\n\n            // ── 3. Domain constraint (scale.domain + scale.clamp) ──\n            // Semantic domain constraints represent *intrinsic* field bounds.\n            // Full constraints (both min+max) set scale.domain directly.\n            // Partial constraints (only min or max) use VL's domainMin/domainMax\n            // for single-ended bounds, letting the other end auto-fit from data.\n            // Skip binned encodings — VL handles bin domain automatically.\n            //\n            // Stacking interaction:\n            //   Sum-stacked charts (default / \"zero\" / \"center\") show stacked\n            //   totals on the axis, not individual values. The field-level snap\n            //   heuristic only saw individual values, which may not reflect the\n            //   actual axis range.  We recompute: if the max group total still\n            //   fits within the intrinsic bound, the snap constraint is safe\n            //   (e.g., percentages summing to exactly 100%).  If totals exceed\n            //   the bound, we skip the constraint to avoid clipping bars.\n            //   Normalize-stacked (stack: \"normalize\"): VL normalizes to [0,1],\n            //   so domain is always [0,1]. Constraint is harmless. → Keep.\n            //   Layered / no stack (stack: null/false): each bar is\n            //   independent. → Apply domain constraints as normal.\n            //\n            // VL auto-stacks bar/area marks whenever multiple rows share the\n            // same discrete position — most obviously with a color series, but\n            // ALSO with no color at all when a category repeats (several rows\n            // per x). Both cases sum on the measure axis, so the intrinsic\n            // domain must be checked against the stacked total, not individual\n            // values.\n            //\n            // Without this: Rating gets auto-fitted to data range (e.g., 2-4.5)\n            // instead of showing the full 1-5 scale.\n            const isExplicitlyStacked = enc.stack !== undefined && enc.stack !== null && enc.stack !== false;\n            const markType = typeof vgObj.mark === 'string' ? vgObj.mark : vgObj.mark?.type;\n            const isBarLike = ['bar', 'area', 'rect'].includes(markType);\n            // Check for color encoding at top level, in layers, or in faceted spec\n            const hasColorEncoding = !!(\n                vgObj.encoding?.color?.field\n                || (Array.isArray(vgObj.layer) && vgObj.layer.some((l: any) => l.encoding?.color?.field))\n                || vgObj.spec?.encoding?.color?.field\n            );\n            // The other positional channel; bar-like charts stack the measure\n            // when this axis is discrete and a category repeats across rows.\n            const otherChannel = ch === 'y' ? 'x' : 'y';\n            const otherCS = channelSemantics[otherChannel];\n            const otherIsDiscrete = otherCS?.type === 'nominal' || otherCS?.type === 'ordinal';\n            const isImplicitlyStacked = isBarLike && otherIsDiscrete && enc.stack !== null\n                && (hasColorEncoding || hasRepeatedCategory(context.table, otherCS?.field, enc.field));\n            const isStacked = isExplicitlyStacked || isImplicitlyStacked;\n            const isNormalizeStacked = enc.stack === 'normalize';\n            const isSumStacked = isStacked && !isNormalizeStacked;\n\n            // For sum-stacked charts, check if stacked totals exceed the\n            // intrinsic domain.  If they do, skip the domain constraint.\n            //\n            // Also, if snap didn't fire on individual values but stacked\n            // totals are near the intrinsic bound, re-run snap on the totals.\n            // Example: individual percentages range 20–50% (no snap), but\n            // they sum to ~100% per group → should snap to 100%.\n            let skipDomain = false;\n            let effectiveDomainConstraint = cs.domainConstraint;\n\n            if (isSumStacked) {\n                // Use explicit intrinsicDomain from annotation, or infer from\n                // semantic type for known bounded types (Percentage, Lat/Lon, etc.)\n                // Without this: Percentage fields without explicit annotation\n                // never get a domain constraint on stacked charts because\n                // individual values don't trigger snap, and the stacked re-check\n                // can't find the intrinsic bounds to snap totals against.\n                const intrinsic = getEffectiveIntrinsicDomain(cs, context.table, enc.field);\n                if (intrinsic) {\n                    const extremes = computeStackedExtremes(\n                        context.table, enc.field, ch, channelSemantics,\n                    );\n\n                    if (extremes !== undefined) {\n                        // VL stacks positive and negative contributions\n                        // separately, so either side can overflow its bound.\n                        const { maxPos, minNeg } = extremes;\n                        const range = intrinsic[1] - intrinsic[0];\n                        // Small epsilon tolerance for floating-point imprecision\n                        // (e.g., shares summing to 1.0000000001 should still be\n                        // treated as within bounds). Scaled to the domain range.\n                        const epsilon = range * 1e-6;\n                        const overflowsTop = maxPos > intrinsic[1] + epsilon;\n                        const overflowsBottom = minNeg < intrinsic[0] - epsilon;\n\n                        if (overflowsTop || overflowsBottom) {\n                            // Stacked totals exceed the intrinsic bound on at\n                            // least one side → skip the domain constraint so\n                            // bars aren't clipped (e.g., correlations summing\n                            // past 1, or percentages past 100%).\n                            if (cs.domainConstraint) {\n                                skipDomain = true;\n                            }\n                        } else {\n                            // Stacked extremes are within intrinsic bounds.\n                            // Re-run snap on the stacked extremes to pick up\n                            // bounds that individual values missed (e.g.,\n                            // individual shares of 20–40% don't snap to 100%,\n                            // but stacked totals of ~100% should).\n                            const stackedSnap = snapToBoundHeuristic(intrinsic, [maxPos, minNeg]);\n                            if (stackedSnap) {\n                                // Merge with existing constraint: keep any bound\n                                // already snapped from individual values, add any\n                                // new bound from stacked totals.\n                                if (cs.domainConstraint) {\n                                    effectiveDomainConstraint = {\n                                        min: cs.domainConstraint.min ?? stackedSnap.min,\n                                        max: cs.domainConstraint.max ?? stackedSnap.max,\n                                        clamp: cs.domainConstraint.clamp || stackedSnap.clamp,\n                                    };\n                                } else {\n                                    effectiveDomainConstraint = stackedSnap;\n                                }\n                            }\n                        }\n                    }\n                } else if (cs.domainConstraint) {\n                    // No intrinsic domain to compare against → skip to be safe\n                    skipDomain = true;\n                }\n            }\n\n            if (effectiveDomainConstraint && enc.type === 'quantitative' && (ch === 'x' || ch === 'y') && !enc.bin && !skipDomain) {\n                if (!enc.scale) enc.scale = {};\n                let { min } = effectiveDomainConstraint;\n                const { max, clamp } = effectiveDomainConstraint;\n                // The resolved zero decision (engine default, or the host's\n                // includeZero_x/_y override) is authoritative. When it says \"no\n                // zero\", a lower bound of exactly 0 in the semantic domain is\n                // merely a non-negativity floor, not a real semantic minimum —\n                // drop it so the axis fits the data instead of being re-pinned\n                // to zero. Length marks (bar/area/rect) always keep zero.\n                const wantsNoZero = cs.zero?.zero === false;\n                if (!isBarLike && wantsNoZero && min === 0) min = undefined;\n                if (min !== undefined && max !== undefined) {\n                    enc.scale.domain = [min, max];\n                    // For non-bar marks (scatter, line, etc.), the explicit\n                    // semantic domain is authoritative — clear zero so VL\n                    // doesn't extend beyond intrinsic bounds (e.g., Rating\n                    // scatter [1,5] shouldn't stretch to [0,5]).\n                    // For bar/area marks, keep zero:true so bars grow from\n                    // zero with correct proportional lengths — VL extends\n                    // the domain to include 0, and the upper bound is still\n                    // capped by the domain constraint (e.g., [0,5] not [0,6]).\n                    // Never clobber a decided zero:false.\n                    if (!isBarLike && enc.scale.zero !== undefined && !wantsNoZero) {\n                        delete enc.scale.zero;\n                    }\n                } else {\n                    // Partial constraint (or the zero-floor dropped above) — snap\n                    // the bounded end while auto-fitting the other.\n                    // E.g., Percentage data at 97% → domainMax = 100, domainMin auto-fits.\n                    if (min !== undefined) enc.scale.domainMin = min;\n                    if (max !== undefined) enc.scale.domainMax = max;\n                    // VL may suppress nice rounding on the free end when\n                    // domainMin/domainMax is set, causing data to touch the\n                    // chart border.  Force nice so the unconstrained end\n                    // gets proper headroom (e.g., data at +26% rounds to +40%).\n                    enc.scale.nice = true;\n                }\n                if (clamp) {\n                    enc.scale.clamp = true;\n                }\n            }\n\n            // ── 4. Tick constraint (axis.tickMinStep + axis.values) ──\n            // Skip binned encodings — VL handles bin ticks natively.\n            // Without this: Rating 1-5 and Count axes show fractional ticks\n            // like 1.5, 2.5, 3.5 that have no physical meaning.\n            if (cs.tickConstraint && (ch === 'x' || ch === 'y') && enc.type === 'quantitative' && !enc.bin) {\n                if (enc.axis === null) { /* preserve axis suppression */ }\n                else {\n                if (!enc.axis) enc.axis = {};\n                if (cs.tickConstraint.integersOnly && enc.axis.tickMinStep === undefined) {\n                    enc.axis.tickMinStep = cs.tickConstraint.minStep ?? 1;\n                }\n                if (cs.tickConstraint.exactTicks && !enc.axis.values) {\n                    enc.axis.values = cs.tickConstraint.exactTicks;\n                }\n                // Hide fractional tick labels for integer-only fields.\n                // VL may still generate fractional ticks when the domain\n                // span is small (e.g., all values = 1 → domain [0,1] →\n                // ticks at 0, 0.2, 0.4…). The `,d` format rounds these\n                // to duplicate labels. This labelExpr suppresses them.\n                if (cs.tickConstraint.integersOnly && !enc.axis.labelExpr && !enc.axis.values) {\n                    enc.axis.labelExpr = \"datum.value === ceil(datum.value) ? format(datum.value, ',d') : ''\";\n                }\n                // When ticks are integers, axis labels should show integers\n                // even if the underlying data has decimals (e.g., Rating\n                // data 3.7 with ticks at 1,2,3,4,5 → labels \"1,2,3,4,5\"\n                // not \"1.0,2.0,3.0\").\n                if (cs.tickConstraint.integersOnly && enc.axis.format) {\n                    // Replace decimal format with integer format for axis only\n                    enc.axis.format = enc.axis.format.replace(/\\.\\d+f$/, 'd');\n                }\n                // Same for labelExpr — swap the d3-format pattern inside\n                if (cs.tickConstraint.integersOnly && enc.axis.labelExpr) {\n                    enc.axis.labelExpr = enc.axis.labelExpr.replace(\n                        /format\\(datum\\.value,\\s*'([^']*)\\.\\d+f'\\)/,\n                        \"format(datum.value, '$1d')\",\n                    );\n                }\n                } // close else (axis !== null)\n            }\n\n            // ── 5. Reversed axis (scale.reverse) ──\n            // Only for quantitative axes. Ordinal y-axes already place the\n            // first domain value (rank 1) at the top by default, so adding\n            // scale.reverse there would double-reverse, putting 1 back at\n            // the bottom.\n            // Skip binned encodings — VL handles bin axis direction natively.\n            if (cs.reversed && (ch === 'x' || ch === 'y') && enc.type === 'quantitative' && !enc.bin) {\n                if (!enc.scale) enc.scale = {};\n                if (enc.scale.reverse === undefined) {\n                    enc.scale.reverse = true;\n                }\n            }\n\n            // ── 6. Nice rounding (scale.nice) ──\n            // Without this: Domain [1, 5] for ratings gets \"nice-rounded\"\n            // to [0, 6] which wastes space and implies values that don't exist.\n            // Skip binned encodings — VL computes bin extents automatically.\n            if (cs.nice === false && enc.type === 'quantitative' && !enc.bin) {\n                if (!enc.scale) enc.scale = {};\n                if (enc.scale.nice === undefined) {\n                    enc.scale.nice = false;\n                }\n            }\n\n            // ── 7. Scale type (scale.type) ──\n            // Only applies for specific semantic types (Population, GDP, etc.)\n            // when data spans ≥ 4 orders of magnitude. Conservative policy\n            // to avoid surprising users on normal datasets.\n            // Skip binned encodings — log/sqrt scales conflict with VL's\n            // linear bin computation and break when data contains zeros.\n            if (cs.scaleType && cs.scaleType !== 'linear' && enc.type === 'quantitative' && !enc.bin) {\n                if (!enc.scale) enc.scale = {};\n                if (!enc.scale.type) {\n                    enc.scale.type = cs.scaleType;\n\n                    // Log/symlog scales don't support zero baseline — clean it up\n                    if (cs.scaleType === 'log' || cs.scaleType === 'symlog') {\n                        if (enc.scale.zero !== undefined) {\n                            delete enc.scale.zero;\n                        }\n                        // Log axes produce many grid lines (1,2,3…9 per\n                        // decade).  Make them very light so they convey the\n                        // log-scale structure without competing with data.\n                        if (ch === 'x' || ch === 'y') {\n                            if (enc.axis === null) { /* preserve axis suppression */ }\n                            else {\n                                if (!enc.axis) enc.axis = {};\n                                enc.axis.gridColor = '#e8e8e8';\n                                enc.axis.gridOpacity = 0.5;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfunction vlApplyDefaultQuantitativeAxisFormat(\n    collectEncodingTargets: (ch: string) => any[],\n): void {\n    for (const ch of ['x', 'y'] as const) {\n        for (const enc of collectEncodingTargets(ch)) {\n            if (!enc || enc.type !== 'quantitative' || enc.bin || enc.axis === null) continue;\n            if (enc.axis?.format || enc.axis?.labelExpr) continue;\n\n            if (!enc.axis) enc.axis = {};\n            enc.axis.format = DEFAULT_QUANTITATIVE_AXIS_FORMAT;\n        }\n    }\n}\n\n/**\n * Apply tooltip configuration to a VL spec.\n *\n * Keep tooltip activation separate from axis/legend number formatting. Global\n * numberFormat also affects axes and can force small tick values into scientific\n * notation, so axis defaults are applied explicitly in vlApplyLayoutToSpec.\n */\nexport function vlApplyTooltips(vgObj: any): void {\n    if (!vgObj.config) vgObj.config = {};\n    vgObj.config.mark = { ...vgObj.config.mark, tooltip: true };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Normalize user-supplied `chart_spec.chartProperties` against a template's\n * declared `properties`, so an invalid *value* never reaches the backend spec.\n *\n * The reference docs (see `scripts/gen-chart-reference.ts`) list the accepted\n * `value` for each discrete property, but a caller may still pass a human label\n * (e.g. `\"Logarithmic\"` instead of `\"log\"`) or an outright unknown value. Left\n * unchecked, the template's `instantiate` copies that string verbatim into the\n * backend transform (e.g. Vega-Lite's `regression` `method`), which the renderer\n * silently rejects — producing a blank chart with no error.\n *\n * For every discrete property present in `chartProperties` this helper:\n *   - keeps the value untouched when it already matches an option `value`;\n *   - maps a known option `label` (case-insensitive) to its `value`, emitting an\n *     `info` warning so the caller learns the canonical value;\n *   - drops an unrecognized value (falling back to the property default) and\n *     emits a `warning`, keeping the \"safe to pass\" contract that a bad input\n *     degrades gracefully rather than rendering nothing.\n *\n * Non-discrete properties and keys not declared by the template (pivot state,\n * axis overrides, encoding overrides, …) are passed through unchanged.\n */\n\nimport type { ChartPropertyDef, ChartWarning } from './types';\n\nexport interface NormalizePropertiesResult {\n    chartProperties: Record<string, any> | undefined;\n    warnings: ChartWarning[];\n}\n\nexport function normalizeChartProperties(\n    properties: ChartPropertyDef[] | undefined,\n    chartProperties: Record<string, any> | undefined,\n): NormalizePropertiesResult {\n    const warnings: ChartWarning[] = [];\n    if (!properties || !chartProperties) {\n        return { chartProperties, warnings };\n    }\n\n    let result: Record<string, any> | undefined;\n    const ensureCopy = (): Record<string, any> => {\n        if (!result) result = { ...chartProperties };\n        return result;\n    };\n\n    for (const def of properties) {\n        if (def.type !== 'discrete') continue;\n        if (!(def.key in chartProperties)) continue;\n        const value = chartProperties[def.key];\n        if (value == null) continue;\n\n        // Already a valid accepted value — nothing to do.\n        if (def.options.some((o) => o.value === value)) continue;\n\n        // Known label (case-insensitive) → coerce to the canonical value.\n        const byLabel =\n            typeof value === 'string'\n                ? def.options.find(\n                      (o) =>\n                          o.label != null &&\n                          o.label.toLowerCase() === value.trim().toLowerCase(),\n                  )\n                : undefined;\n        if (byLabel) {\n            ensureCopy()[def.key] = byLabel.value;\n            warnings.push({\n                severity: 'info',\n                code: 'coerced-option-label',\n                message: `chartProperties.${def.key}: '${value}' is a display label; using the accepted value '${byLabel.value}' instead.`,\n            });\n            continue;\n        }\n\n        // Unrecognized value → drop it so the property falls back to its default,\n        // instead of emitting an invalid backend spec that renders blank.\n        const accepted = def.options\n            .map((o) => (o.value == null ? '(default)' : `'${o.value}'`))\n            .join(', ');\n        const copy = ensureCopy();\n        delete copy[def.key];\n        warnings.push({\n            severity: 'warning',\n            code: 'invalid-option-value',\n            message: `chartProperties.${def.key}: '${value}' is not a valid option (accepted: ${accepted}). Falling back to the default.`,\n        });\n    }\n\n    return { chartProperties: result ?? chartProperties, warnings };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Core chart assembly logic — Two-Stage Pipeline Coordinator.\n *\n * Given data, encoding definitions, and semantic types,\n * produces a complete Vega-Lite specification in two stages:\n *\n * ── ANALYSIS (VL-free) ──────────────────────────────────────\n *   Phase 0:  resolveChannelSemantics  → ChannelSemantics\n *   Step 0a:  declareLayoutMode    → LayoutDeclaration\n *   Step 0b:  convertTemporalData  → converted data\n *   Step 0c:  filterOverflow       → filtered data, nominalCounts\n *   Phase 1:  computeLayout        → LayoutResult\n *\n * ── INSTANTIATE (VL-specific) ───────────────────────────────\n *   buildVLEncodings    → resolvedEncodings\n *   template.instantiate\n *   restructureFacets\n *   vlApplyLayoutToSpec\n *   post-layout adjustments (facet binning, independent scales, tooltips)\n *\n * ── Backend Translation Responsibilities ────────────────────\n * The LayoutResult from Phase 1 is target-agnostic.  This assembler\n * translates it into Vega-Lite-specific structures:\n *\n *   subplotWidth / subplotHeight\n *     → VL `width` / `height` on the spec (or `width: {step: N}` for\n *       banded discrete axes).\n *\n *   xStep / yStep / stepPadding\n *     → VL `width: {step: N}`, `encoding.x.scale.paddingInner`, etc.\n *       VL handles bar sizing natively from the step declaration.\n *\n *   Facet wrapping\n *     → `restructureFacets()` converts column-only to `facet` +\n *       `columns: N`.  The wrapping decision uses the same parameters\n *       (maxStretch, minStep, minSubplotSize) as ECharts.\n *\n *   Axis titles, labels, legends\n *     → VL handles these declaratively via encoding / config.\n *\n * This module has NO React, Redux, or UI framework dependencies.\n */\n\nimport {\n    ChartEncoding,\n    ChartTemplateDef,\n    ChartAssemblyInput,\n    AssembleOptions,\n    LayoutDeclaration,\n    InstantiateContext,\n} from '../core/types';\nimport type { ChartWarning, ChartOption, OptionEvalContext } from '../core/types';\nimport { applyEncodingOverrides } from '../core/encoding-overrides';\nimport { applyAggregation } from '../core/aggregate';\nimport { planBandDodge, resolveDodge } from '../core/band-dodge';\nimport { applyPivot, applyTransform, type PivotSurface, type TransformSurface } from '../core/pivot';\nimport { vlGetTemplateDef } from './templates';\nimport { inferVisCategory, computeZeroDecision } from '../core/semantic-types';\nimport { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics';\nimport { toTypeString, type SemanticAnnotation } from '../core/field-semantics';\nimport { filterOverflow } from '../core/filter-overflow';\nimport { computeLayout, computeChannelBudgets, computeMinSubplotDimensions, deriveStretchCaps, resolveBaseSize, resolveFacetColumnsOption } from '../core/compute-layout';\nimport { vlApplyLayoutToSpec, vlApplyTooltips } from './instantiate-spec';\nimport { normalizeStaticSeries } from '../core/static-series';\nimport { normalizeChartProperties } from '../core/normalize-properties';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Escape characters that Vega-Lite interprets as field-access path syntax.\n *\n * In Vega-Lite a `field` string like `\"a.b\"` is parsed as a nested accessor\n * (`datum.a.b`), and `\"a[0]\"` as array indexing. Column names that literally\n * contain `.`, `[`, or `]` (e.g. `\"Oranges, Navel, per lb.\"`) must therefore be\n * escaped with a backslash so the renderer resolves the flat key instead of an\n * undefined nested path (which silently produces empty marks).\n *\n * Only the `field` accessor string needs escaping — direct JS data access via\n * `row[fieldName]` continues to use the raw, unescaped name.\n */\nconst escapeVlFieldName = (name: string): string =>\n    name.replace(/[.[\\]]/g, (ch) => `\\\\${ch}`);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Assemble a Vega-Lite specification.\n *\n * ```ts\n * const spec = assembleVegaLite({\n *   data: { values: myRows },\n *   semantic_types: { weight: 'Quantity', mpg: 'Quantity' },\n *   chart_spec: {\n *     chartType: 'Scatter Plot',\n *     encodings: { x: { field: 'weight' }, y: { field: 'mpg' } },\n *     canvasSize: { width: 400, height: 300 },\n *   },\n *   options: { addTooltips: true },\n * });\n * ```\n */\nexport function assembleVegaLite(input: ChartAssemblyInput): any {\n    const chartType = input.chart_spec.chartType;\n    const semanticTypes = input.semantic_types ?? {};\n    // Internal layout targets the base (target) size; the optional canvasSize\n    // ceiling is applied as per-dimension stretch caps once options resolve.\n    // The base is clamped to the ceiling so a smaller canvasSize shrinks the\n    // chart to fit rather than overflowing it.\n    const sizeCeiling = input.chart_spec.canvasSize;\n    const baseSize = resolveBaseSize(input.chart_spec.baseSize, sizeCeiling);\n    const canvasSize = baseSize;\n    const options = input.options ?? {};\n    let chartTemplate = vlGetTemplateDef(chartType) as ChartTemplateDef;\n    if (!chartTemplate) {\n        throw new Error(`Unknown chart type: ${chartType}`);\n    }\n\n    const warnings: ChartWarning[] = [];\n\n    // Validate discrete property *values* against the template's declared\n    // options before they reach `instantiate`. This maps a known display label\n    // to its accepted value and drops unrecognized values, so a bad input never\n    // produces an invalid backend spec (which would render blank).\n    const normalizedProps = normalizeChartProperties(\n        chartTemplate.properties, input.chart_spec.chartProperties,\n    );\n    const chartProperties = normalizedProps.chartProperties;\n    warnings.push(...normalizedProps.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PRE-PHASE: Static Series Normalization\n    // ═══════════════════════════════════════════════════════════════════════\n    // Detect array-valued encodings (static series), validate, and fold data.\n    const rawData = input.data.values ?? [];\n    const normalized = normalizeStaticSeries(\n        input.chart_spec.encodings, rawData, semanticTypes,\n    );\n    let data = normalized.data;\n    const staticSeries = normalized.staticSeries;\n\n    // Compose Category-B encoding-action overrides (stored by the host in\n    // chartProperties, keyed by action key) onto the base encodings before any\n    // pipeline phase runs. Flint owns the transform; the host only stores the\n    // override value. See applyEncodingOverrides / EncodingActionDef.\n    //\n    // Some actions (e.g. Sort) must know each channel's resolved encoding TYPE\n    // to decide which position axis is the discrete category and which is the\n    // measure. The host leaves `type` unset (\"auto\") for most encodings, so we\n    // run a preliminary semantics pass to fill in the inferred types, compose\n    // the overrides onto the type-enriched encodings, then re-resolve semantics\n    // on the result below (so that, e.g., a value-sort correctly suppresses the\n    // field's canonical ordinal ordering).\n    const prelimConvertedData = convertTemporalData(data, semanticTypes);\n    const prelimSemantics = resolveChannelSemantics(\n        normalized.encodings, data, semanticTypes, prelimConvertedData,\n    );\n    const typedRawEncodings: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(normalized.encodings)) {\n        typedRawEncodings[ch] = enc.type\n            ? enc\n            : { ...enc, type: prelimSemantics[ch]?.type };\n    }\n    // Axis dtype override (`xAxisType` / `yAxisType` properties): the user can\n    // force a position channel's interpretation between a continuous time scale\n    // ('temporal') and discrete bands ('nominal') for date-like fields that\n    // carry a dual interpretation. Applies to either axis — x on a vertical\n    // bar/line, y on a horizontal (transposed) bar/lollipop. Applied at the\n    // encoding level so the whole pipeline (sorting, layout, formatting) honors\n    // it — resolveChannelSemantics treats an explicit encoding.type as\n    // authoritative. Whether each control is *offered* is decided by the\n    // property's own `check` (see AXIS_DTYPE_PROPERTIES).\n    for (const axis of ['x', 'y'] as const) {\n        const choice = chartProperties?.[`${axis}AxisType`];\n        if ((choice === 'temporal' || choice === 'nominal') && typedRawEncodings[axis]?.field) {\n            typedRawEncodings[axis] = { ...typedRawEncodings[axis], type: choice };\n        }\n    }\n    // Transform (derived Category-B operator): re-route fields across position/\n    // legend/facet channels + optionally re-render as a sibling chart type, to\n    // surface alternative views. Split into TWO independent controls (see\n    // design-docs/chart-transform-two-axes.md):\n    //   - Control B (chart type, θ): stored under chartProperties.chartType\n    //   - Control A (arrange, τ/σ/γ): stored under chartProperties.arrange\n    // (A legacy composed `pivot` id is migrated by applyTransform.) Composed\n    // BEFORE other overrides so sort/overflow/layout resolve against the result.\n    // Both surfaces are exposed to hosts via `_transform` / getChartTransform;\n    // the legacy single-control `_pivot` surface is still emitted below.\n    const authoredTemplate = chartTemplate;\n    const transformed = applyTransform(chartTemplate, typedRawEncodings, data, chartProperties, vlGetTemplateDef);\n    // A chart-type *transition* (Control B) re-renders the same data as a sibling\n    // chart type (e.g. Grouped Bar → Stacked Bar, Scatter → Strip/Jitter). The\n    // authored chartType / encodings are untouched; rendering re-dispatches to\n    // the sibling template so its instantiate / layout logic takes over. See §4.6.\n    if (transformed.chartType && transformed.chartType !== chartType) {\n        const swapped = vlGetTemplateDef(transformed.chartType) as ChartTemplateDef | undefined;\n        if (swapped) chartTemplate = swapped;\n    }\n    const composedEncodings = applyEncodingOverrides(chartTemplate, transformed.encodings, chartProperties);\n\n    // Template-level encoding normalization (e.g. Sparkline remaps its series\n    // field onto the `row` facet channel). Runs BEFORE semantics/layout so the\n    // whole pipeline resolves against the normalized channel map.\n    const encodings = chartTemplate.normalizeEncodings\n        ? chartTemplate.normalizeEncodings(composedEncodings, data)\n        : composedEncodings;\n\n    // Optional aggregation transform: when an encoding sets `aggregate`, collapse\n    // the rows here (grouping by the dimension channels) so the derived\n    // `${field}_${op}` / `_count` columns the assemblers reference actually\n    // exist. No-op when no encoding requests it or the data is pre-aggregated.\n    data = applyAggregation(encodings, data);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 0: Resolve Semantics (VL-free)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const tplMark = chartTemplate.template?.mark;\n    const templateMarkType = typeof tplMark === 'string' ? tplMark : tplMark?.type;\n\n    // Convert temporal data on the (possibly folded) dataset for Phase 0+\n    const convertedData = convertTemporalData(data, semanticTypes);\n\n    const channelSemantics = resolveChannelSemantics(\n        encodings, data, semanticTypes, convertedData,\n    );\n\n    // Finalize zero-baseline (requires template mark knowledge)\n    const effectiveMarkType = templateMarkType || 'point';\n    for (const [channel, cs] of Object.entries(channelSemantics)) {\n        if ((channel === 'x' || channel === 'y') && cs.type === 'quantitative') {\n            const numericValues = data\n                .map(r => r[cs.field])\n                .filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            cs.zero = computeZeroDecision(\n                cs.semanticAnnotation.semanticType, channel, effectiveMarkType, numericValues,\n            );\n        }\n    }\n\n    // ── Zero-baseline override (position-cognitive axes) ──\n    // computeZeroDecision (above) is the single authority on whether an axis\n    // includes zero. For axes where that call is a genuine toss-up worth\n    // surfacing (see makeZeroBaselineCheck / ZeroDecision.uncertain), the host\n    // may override it via the stored config `includeZero_x`/`includeZero_y` (a boolean on/off\n    // toggle). We honor it by overwriting `cs.zero.zero`, leaving the rest of\n    // the decision intact, so every downstream consumer — the spec applier\n    // (instantiate-spec) AND banking layout (compute-layout reads cs.zero) —\n    // renders the user's choice consistently. Placed before the log-scale\n    // override and the layout phase so banking is zero-aware of the override.\n    if (chartTemplate.markCognitiveChannel === 'position') {\n        for (const axis of ['x', 'y'] as const) {\n            const cs = channelSemantics[axis];\n            if (!cs?.field || cs.type !== 'quantitative' || !cs.zero) continue;\n            const choice = chartProperties?.[`includeZero_${axis}`];\n            if (choice === undefined) continue; // keep the engine's decision\n            cs.zero = { ...cs.zero, zero: choice };\n        }\n    }\n\n    // ── Log-scale override (position-cognitive axes) ──\n    // A log/symlog scale only makes sense on a continuous quantitative POSITION\n    // axis (scatter/line/strip) — never on length/area marks, where bars encode\n    // magnitude as length from a zero baseline (log destroys the baseline and\n    // log(0) is undefined). The engine recommends log conservatively in\n    // resolveScaleType (→ cs.scaleType). Here we apply the user's per-axis\n    // override of that recommendation via the stored config `logScale_x`/\n    // `logScale_y` (a boolean on/off toggle). Whether the control is *offered*\n    // and its recommended default are decided by the property's own `check`\n    // (see LOG_SCALE_PROPERTIES) and surfaced through `getChartOptions`.\n    // On non-position marks we additionally strip any recommended log/symlog\n    // scale so length/area encodings always render linearly from their baseline.\n    if (chartTemplate.markCognitiveChannel === 'position') {\n        for (const axis of ['x', 'y'] as const) {\n            const cs = channelSemantics[axis];\n            if (!cs?.field || cs.type !== 'quantitative') continue;\n            // Binned axes use VL's linear bin computation — log conflicts.\n            if (chartTemplate.template?.encoding?.[axis]?.bin) continue;\n\n            const choice = chartProperties?.[`logScale_${axis}`];\n            if (choice === undefined) continue; // keep the engine's recommendation\n\n            // The control is a simple on/off toggle: `true` forces log (symlog\n            // when zeros are present), `false` forces linear.\n            const hasZero = data.some(row => row[cs.field] === 0);\n            cs.scaleType = choice === false\n                ? undefined                       // force linear\n                : (hasZero ? 'symlog' : 'log');   // force log (symlog if zeros)\n        }\n    } else {\n        // Non-position mark (length/area): never apply a log/symlog scale —\n        // these encodings read magnitude from a zero baseline that log destroys.\n        for (const axis of ['x', 'y'] as const) {\n            const cs = channelSemantics[axis];\n            if (cs?.scaleType === 'log' || cs?.scaleType === 'symlog') {\n                cs.scaleType = undefined;\n            }\n        }\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0a: declareLayoutMode (VL-free template hook)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const declaration: LayoutDeclaration = chartTemplate.declareLayoutMode\n        ? chartTemplate.declareLayoutMode(channelSemantics, data, chartProperties)\n        : {};\n\n    // Auto-detect binnedAxes from template encoding if not declared\n    if (!declaration.binnedAxes) {\n        const templateEnc = chartTemplate.template?.encoding;\n        if (templateEnc) {\n            const binnedAxes: Record<string, boolean | { maxbins?: number }> = {};\n            for (const axis of ['x', 'y']) {\n                if (templateEnc[axis]?.bin) {\n                    // Use chartProperties.binCount (the maxbins cap) when the user\n                    // has set one so layout sizing matches the rendered bins; a\n                    // value of 0/undefined means \"auto\" (Vega's default ~10 cap).\n                    const propBins = chartProperties?.binCount;\n                    if (propBins) {\n                        binnedAxes[axis] = { maxbins: propBins };\n                    } else if (typeof templateEnc[axis].bin === 'object' && templateEnc[axis].bin.maxbins) {\n                        binnedAxes[axis] = templateEnc[axis].bin;\n                    } else {\n                        binnedAxes[axis] = { maxbins: 10 };\n                    }\n                }\n            }\n            if (Object.keys(binnedAxes).length > 0) {\n                declaration.binnedAxes = binnedAxes;\n            }\n        }\n    }\n\n    // Merge paramOverrides into effective options\n    const effectiveOptions: AssembleOptions = {\n        // Vega-Lite native font defaults (labels 10, titles 11).\n        baseLabelFontSize: 10,\n        baseTitleFontSize: 11,\n        ...options,\n        ...(declaration.paramOverrides || {}),\n    };\n\n    const {\n        addTooltips: addTooltipsOpt = false,\n        minSubplotSize: minSubplotVal = 60,\n    } = effectiveOptions;\n\n    // VL facet overhead:\n    //   Fixed: y-axis labels (~35px width) + x-axis labels (~22px height)\n    //          + titles/legend margin.\n    //   Gap:   config.facet.spacing between panels; shrunk post-layout for\n    //          small subplots (see facetGapVal below).\n    if (effectiveOptions.facetFixedPadding == null) {\n        effectiveOptions.facetFixedPadding = { width: 50, height: 40 };\n    }\n    if (effectiveOptions.facetGap == null) {\n        effectiveOptions.facetGap = 10;\n    }\n    if (effectiveOptions.targetBandAR == null) {\n        effectiveOptions.targetBandAR = 10;\n    }\n\n    // Resolve the optional canvasSize ceiling into per-dimension stretch caps\n    // (βx, βy) so single plots AND facet grids honor the same budget. Falls\n    // back to maxStretch when no ceiling is set.\n    const caps = deriveStretchCaps(baseSize, sizeCeiling, effectiveOptions);\n    effectiveOptions.maxStretchX = caps.maxStretchX;\n    effectiveOptions.maxStretchY = caps.maxStretchY;\n    effectiveOptions.facetColumns = resolveFacetColumnsOption(input.chart_spec.chartProperties);\n    const facetFixW = effectiveOptions.facetFixedPadding.width;\n    const facetFixH = effectiveOptions.facetFixedPadding.height;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0b: filterOverflow (VL-free)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // Collect mark types for sort strategy\n    const allMarkTypes = new Set<string>();\n    if (templateMarkType) allMarkTypes.add(templateMarkType);\n    if (Array.isArray(chartTemplate.template?.layer)) {\n        for (const layer of chartTemplate.template.layer) {\n            const lm = typeof layer.mark === 'string' ? layer.mark : layer.mark?.type;\n            if (lm) allMarkTypes.add(lm);\n        }\n    }\n\n    // ── Channel budgets (shared, in layout module) ─────────────────────\n    // Computes per-channel max-to-keep using the most conservative\n    // assumptions (minStep, maxStretch).  Also decides facet grid.\n    const budgets = computeChannelBudgets(\n        channelSemantics, declaration, convertedData, canvasSize, effectiveOptions,\n    );\n    const facetGridResult = budgets.facetGrid;\n\n    const overflowResult = filterOverflow(\n        channelSemantics, declaration, encodings, convertedData,\n        budgets, allMarkTypes,\n    );\n\n    const values = overflowResult.filteredData;\n    const nominalCounts = overflowResult.nominalCounts;\n    warnings.push(...overflowResult.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 1: Compute Layout (VL-free)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const layoutResult = computeLayout(\n        channelSemantics,\n        declaration,\n        values,  // post-overflow filtered data\n        canvasSize,\n        effectiveOptions,\n        facetGridResult,\n    );\n\n    // Attach overflow truncations from filterOverflow\n    layoutResult.truncations = overflowResult.truncations;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 2: Instantiate VL Spec\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // --- Build VL encodings (abstract semantics → VL encoding objects) ---\n\n    // For static series, suppress the synthetic key/value column axis titles\n    // (show \"Series\"/\"Value\" instead of \"__flint_series_key\"/\"__flint_series_value\")\n    // and map field names to display names\n    let fieldDisplayNames = input.field_display_names;\n    if (staticSeries) {\n        fieldDisplayNames = { ...fieldDisplayNames };\n        // Hide the synthetic key column name from the legend title\n        if (!fieldDisplayNames[staticSeries.keyColumn]) {\n            fieldDisplayNames[staticSeries.keyColumn] = 'Series';\n        }\n        // Hide the synthetic value column name from the measure axis title.\n        // The folded fields have no single intrinsic name, so default to \"Value\"\n        // (the host can override via field_display_names).\n        if (!fieldDisplayNames[staticSeries.valueColumn]) {\n            fieldDisplayNames[staticSeries.valueColumn] = 'Value';\n        }\n        // Map each series field name to its display name (if available) for legend labels\n        // This uses VL's labelExpr or scale domain in the encoding\n    }\n\n    const resolvedEncodings = buildVLEncodings(\n        encodings, channelSemantics, declaration, data,\n        canvasSize, semanticTypes, templateMarkType, chartTemplate,\n        fieldDisplayNames, chartProperties,\n    );\n\n    // --- Align sort/domain arrays to converted data types ---\n    // buildVLEncodings uses the original data, but the VL spec embeds\n    // post-conversion data (e.g. Year 1980 → \"1980\").  Re-map sort and\n    // scale.domain entries so VL can match them against data.values.\n    for (const enc of Object.values(resolvedEncodings)) {\n        const field = enc?.field;\n        if (!field) continue;\n        // Build a lookup from the converted (spec-embedded) data\n        const valMap = new Map<string, any>();\n        for (const r of values) {\n            const v = r[field];\n            if (v != null && !valMap.has(String(v))) valMap.set(String(v), v);\n        }\n        if (valMap.size === 0) continue;\n        const remap = (arr: any[]) => arr.map(v => {\n            const key = String(v);\n            return valMap.has(key) ? valMap.get(key) : v;\n        });\n        if (Array.isArray(enc.sort)) enc.sort = remap(enc.sort);\n        if (Array.isArray(enc.scale?.domain)) enc.scale.domain = remap(enc.scale.domain);\n    }\n\n    // Detect x/y discrete counts inside template layers for layered specs\n    const isDiscreteType = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n    if (Array.isArray(chartTemplate.template?.layer)) {\n        for (const axis of ['x', 'y'] as const) {\n            if (nominalCounts[axis] === 0) {\n                for (const layer of chartTemplate.template.layer) {\n                    const layerEnc = layer.encoding?.[axis];\n                    if (layerEnc?.field && isDiscreteType(layerEnc.type)) {\n                        nominalCounts[axis] = new Set(values.map((r: any) => r[layerEnc.field])).size;\n                        break;\n                    }\n                }\n                if (nominalCounts[axis] === 0 && resolvedEncodings[axis]?.field) {\n                    const enc = resolvedEncodings[axis];\n                    if (isDiscreteType(enc.type)) {\n                        nominalCounts[axis] = new Set(values.map((r: any) => r[enc.field])).size;\n                    }\n                }\n            }\n        }\n    }\n\n    // --- template.instantiate (template-specific VL spec building) ---\n\n    const vgObj = structuredClone(chartTemplate.template);\n\n    const instantiateContext: InstantiateContext = {\n        channelSemantics,\n        layout: layoutResult,\n        table: values,\n        fullTable: convertedData,\n        resolvedEncodings,\n        encodings,\n        chartProperties,\n        staticSeries,\n        canvasSize,\n        semanticTypes,\n        chartType,\n        assembleOptions: effectiveOptions,\n    };\n\n    chartTemplate.instantiate(vgObj, instantiateContext);\n\n    // Facet-identity augmentation is presentation-only: the structural series\n    // has already moved to column/row for semantics, layout, stacking, and\n    // dodging. Reapply its learned color now so faceted panels preserve visual\n    // identity without making the compiler treat color as another series role.\n    if (transformed.augmentation?.kind === 'facet-identity') {\n        const facetEncoding = resolvedEncodings[transformed.augmentation.facetChannel];\n        if (facetEncoding?.field) {\n            const colorEncoding = { ...facetEncoding };\n            delete colorEncoding.header;\n            delete colorEncoding.axis;\n            delete colorEncoding.columns;\n            const scheme = transformed.augmentation.colorEncoding.scheme;\n            if (scheme) {\n                colorEncoding.scale = { ...(colorEncoding.scale ?? {}), scheme };\n            }\n            vgObj.encoding = vgObj.encoding || {};\n            vgObj.encoding.color = colorEncoding;\n\n            // Vega-Lite implicitly stacks bars/areas whenever a discrete color\n            // channel is present. This color is redundant identity, not a stack\n            // series, so pin the quantitative position channel to unstacked.\n            for (const axis of ['x', 'y']) {\n                const encoding = vgObj.encoding[axis];\n                if (encoding?.type === 'quantitative' && encoding.stack === undefined) {\n                    encoding.stack = null;\n                }\n            }\n        }\n    }\n\n    // Merge any warnings emitted by instantiate\n    if (vgObj._warnings && Array.isArray(vgObj._warnings)) {\n        warnings.push(...vgObj._warnings);\n        delete vgObj._warnings;\n    }\n\n    // --- restructureFacets (VL-specific) ---\n    // The facet grid (including wrapping) was already decided by\n    // computeChannelBudgets.  restructureFacets only performs the VL structural\n    // transform (column encoding → facet + spec for layered specs).\n\n    restructureFacets(vgObj, nominalCounts, facetGridResult);\n\n    // --- vlApplyLayoutToSpec (VL-specific: config, sizing, formatting) ---\n\n    vlApplyLayoutToSpec(vgObj, instantiateContext, warnings);\n\n    // --- Post-layout adjustments (VL-specific) ---\n\n    const defaultChartWidth = canvasSize.width;\n    const defaultChartHeight = canvasSize.height;\n\n    // Compute banded-aware minimum subplot dimensions from core helper.\n    const { minSubplotWidth, minSubplotHeight } = computeMinSubplotDimensions(\n        channelSemantics, declaration, values, effectiveOptions,\n    );\n\n    // Shrink gap for small subplots: scale linearly from the reference\n    // (10px gap at 100px subplot), with a floor of 4px.\n    const refGap = effectiveOptions.facetGap ?? 0;\n    const subplotDim = Math.min(layoutResult.subplotWidth, layoutResult.subplotHeight);\n    const REF_SUBPLOT = 100;\n    const facetGapVal = Math.max(6, Math.round(refGap * subplotDim / REF_SUBPLOT));\n\n    // Apply the computed gap to the VL spec so Vega-Lite uses it for spacing.\n    vgObj.config = vgObj.config || {};\n    vgObj.config.facet = { spacing: facetGapVal };\n\n    const maxFacetColumns = Math.max(2, Math.floor((defaultChartWidth * caps.maxStretchX - facetFixW) / (minSubplotWidth + facetGapVal)));\n    const maxFacetRows = Math.max(2, Math.floor((defaultChartHeight * caps.maxStretchY - facetFixH) / (minSubplotHeight + facetGapVal)));\n    const maxFacetNominalValues = maxFacetColumns * maxFacetRows;\n\n    // Bin quantitative facets\n    for (const channel of ['facet', 'column', 'row']) {\n        const enc = vgObj.encoding?.[channel];\n        if (enc?.type === 'quantitative') {\n            const fieldName = enc.field;\n            const uniqueValues = [...new Set(values.map((r: any) => r[fieldName]))];\n            if (uniqueValues.length > maxFacetNominalValues) {\n                enc.bin = true;\n            }\n        }\n    }\n\n    // Independent y-axis scaling for faceted charts.\n    // For layered specs (e.g. Regression), y encoding lives inside layer items, not at the top.\n    const effectiveEncoding = vgObj.spec?.encoding || vgObj.encoding;\n    const layerEncodings = (vgObj.spec?.layer || vgObj.layer || []).map((l: any) => l.encoding).filter(Boolean);\n    const yEnc = effectiveEncoding?.y || layerEncodings.find((e: any) => e.y)?.y;\n    const effectiveFacet = vgObj.facet || vgObj.encoding?.facet;\n    const hasFacetedQuant = effectiveFacet != undefined && yEnc?.type === 'quantitative';\n    let computedIndependentYAxis = false;\n    if (hasFacetedQuant) {\n        const userChoice = chartProperties?.independentYAxis; // true | false | undefined\n\n        if (userChoice === undefined) {\n            // Auto-heuristic: independent when value ranges differ by ≥100×\n            const yField = yEnc.field;\n            const columnField = effectiveFacet.field;\n\n            if (yField && columnField) {\n                const columnGroups = new Map<any, number>();\n                for (const row of data) {\n                    const columnValue = row[columnField];\n                    const yValue = row[yField];\n                    if (yValue != null && !isNaN(yValue)) {\n                        const currentMax = columnGroups.get(columnValue) || 0;\n                        columnGroups.set(columnValue, Math.max(currentMax, Math.abs(yValue)));\n                    }\n                }\n\n                const maxValues = Array.from(columnGroups.values()).filter(v => v > 0);\n                if (maxValues.length >= 2) {\n                    const maxValue = Math.max(...maxValues);\n                    const minValue = Math.min(...maxValues);\n                    const ratio = maxValue / minValue;\n                    const totalFacets = (layoutResult.facet?.columns ?? 1) * (layoutResult.facet?.rows ?? 1);\n                    if (ratio >= 100 && totalFacets < 6) {\n                        computedIndependentYAxis = true;\n                    }\n                }\n            }\n        } else {\n            computedIndependentYAxis = !!userChoice;\n        }\n\n        if (computedIndependentYAxis) {\n            if (!vgObj.resolve) vgObj.resolve = {};\n            if (!vgObj.resolve.scale) vgObj.resolve.scale = {};\n            vgObj.resolve.scale.y = \"independent\";\n        }\n    }\n\n    if (addTooltipsOpt) {\n        vlApplyTooltips(vgObj);\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // RESULT\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const result: any = { ...vgObj, data: vgObj.data ?? { values } };\n    if (warnings.length > 0) {\n        result._warnings = warnings;\n    }\n    result._width = layoutResult.subplotWidth;\n    result._height = layoutResult.subplotHeight;\n    // Annotated option catalog: every configurable property this template\n    // exposes, tagged with whether it is *applicable* for this spec + data and\n    // the *value* the compiler will use (host choice if set, else the engine's\n    // recommended default). This is the single contract a host (DF, an AI agent,\n    // another renderer) reads to know which controls to surface and how to seed\n    // them — see ChartOption / getChartOptions. Passing a non-applicable\n    // property back to the compiler is accepted but silently ignored.\n    //\n    // Each property decides its own applicability through its pure `check(ctx)`\n    // (the single source of truth, co-located with the property). The one piece\n    // that can't live there is `independentYAxis`'s *recommended default* —\n    // whether to turn it on automatically — which is layout-coupled (it needs the\n    // resolved facet grid and the assembled spec's facet/y structure, differing\n    // for 1-D vs 2-D facets); that value is computed above and threaded in here.\n    const evalCtx: OptionEvalContext = {\n        encodings,\n        channelSemantics,\n        data,\n        chartProperties,\n    };\n    const layoutCoupledRecommendation: Record<string, any> = {\n        independentYAxis: computedIndependentYAxis,\n    };\n\n    result._options = (chartTemplate.properties ?? []).map((def): ChartOption => {\n        const ev = def.check?.(evalCtx);\n        const applicable = ev ? ev.applicable : true;\n        const recommended = layoutCoupledRecommendation[def.key] ?? ev?.recommendedValue;\n        const value = chartProperties?.[def.key] ?? recommended ?? def.defaultValue;\n        // Strip the `check` rule — a ChartOption is the resolved, serializable\n        // answer (`applicable`/`value`), not the predicate that produced it.\n        const { check, ...rest } = def;\n        return { ...rest, applicable, value };\n    });\n    // Layout-level facet-wrap control: offered whenever a column facet has\n    // enough panels to wrap. It's not a per-template MARK property, so it's\n    // injected centrally rather than declared on every faceted template. The\n    // value seeds from the raw user override, else the auto-computed grid\n    // column count (facetGridResult), else all panels in one row.\n    const colFacetField = channelSemantics.column?.field;\n    if (colFacetField) {\n        const colCount = new Set(data.map((r: any) => r[colFacetField])).size;\n        if (colCount > 2) {\n            const rawFacetCols = input.chart_spec.chartProperties?.facetColumns;\n            result._options.push({\n                key: 'facetColumns',\n                label: 'Columns',\n                type: 'continuous',\n                min: 1,\n                max: colCount,\n                step: 1,\n                applicable: true,\n                value: rawFacetCols ?? facetGridResult?.columns ?? colCount,\n            } as ChartOption);\n        }\n    }\n    // Pivot surface: the resolved set of alternative views (state ids + labels +\n    // active index) for the current encodings + data. Hosts read this to render\n    // a cyclic prev/next control and write the chosen id back to\n    // chartProperties[pivot.key]. Absent when the chart has <= 1 state.\n    if (transformed.surface) {\n        result._transform = transformed.surface;\n    }\n    // Legacy single-control surface (composed orbit) for backward-compat\n    // consumers (getChartPivot). Enumerated from the AUTHORED template so its\n    // ids/labels match the pre-split contract. Rendering above is driven by\n    // `transformed` (the two-control model); this is surface-only.\n    const legacyPivot = applyPivot(authoredTemplate, typedRawEncodings, data, chartProperties, vlGetTemplateDef);\n    if (legacyPivot.surface) {\n        result._pivot = legacyPivot.surface;\n    }\n    return result;\n}\n\n/**\n * Inspect a chart spec + dataset and report the configurable options Flint\n * exposes for it, each annotated with whether it is *applicable* and the *value*\n * the compiler will use (see ChartOption).\n *\n * This is the \"ask Flint what knobs are available\" entry point. A host calls it\n * with the same input it would pass to `assembleVegaLite`, renders a control for\n * each applicable option seeded from `value`, and feeds the user's choices back\n * via `chart_spec.chartProperties`. Because applicability is derived from the\n * data (not from the chosen values), the set is stable across that loop.\n *\n * It runs the same analysis pipeline as `assembleVegaLite` (the options are a\n * by-product of assembly), so applicability can never drift from what the\n * compiler actually does — a property reported applicable is exactly one the\n * compiler will honor.\n */\nexport function getChartOptions(input: ChartAssemblyInput): ChartOption[] {\n    const spec = assembleVegaLite(input);\n    return spec && Array.isArray(spec._options) ? spec._options : [];\n}\n\n/**\n * Inspect a chart spec + dataset and report the pivot surface Flint exposes for\n * it — the ordered alternative views (orientation/role/facet) the host can cycle\n * through, with the active index. Returns `undefined` when the chart has a\n * single view (no control should be shown). Mirrors getChartOptions: it runs the\n * same analysis pipeline so the surface can never drift from what the compiler\n * actually does. The host renders a cyclic control seeded from `index` and\n * writes the chosen `ids[next]` back to `chart_spec.chartProperties[key]`.\n */\nexport function getChartPivot(input: ChartAssemblyInput): PivotSurface | undefined {\n    const spec = assembleVegaLite(input);\n    return spec && spec._pivot ? (spec._pivot as PivotSurface) : undefined;\n}\n\n/**\n * Inspect a chart spec + dataset and report the two-control transform surface\n * Flint exposes for it — Control B (chart-type transitions, a dropdown) and\n * Control A (local rearrangement group, a stepper). Either sub-surface is\n * absent when that control has a single state. Mirrors getChartPivot but for the\n * factored model (design-docs/chart-transform-two-axes.md). Hosts render a\n * dropdown seeded from `chartType.index` (writing the chosen id to\n * chartProperties.chartType) and a cyclic stepper seeded from `arrange.index`\n * (writing chartProperties.arrange).\n */\nexport function getChartTransform(input: ChartAssemblyInput): TransformSurface | undefined {\n    const spec = assembleVegaLite(input);\n    return spec && spec._transform ? (spec._transform as TransformSurface) : undefined;\n}\n\n// ===========================================================================\n// buildVLEncodings — Translate abstract semantics → VL encoding objects\n// ===========================================================================\n\n/**\n * Translate Phase 0 channel semantics + declaration overrides into\n * concrete Vega-Lite encoding objects. This is the only place outside\n * template.instantiate() that constructs VL-specific syntax.\n */\nfunction buildVLEncodings(\n    encodings: Record<string, ChartEncoding>,\n    channelSemantics: Record<string, import('../core/types').ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    data: any[],\n    canvasSize: { width: number; height: number },\n    semanticTypes: Record<string, string | SemanticAnnotation>,\n    templateMarkType: string | undefined,\n    chartTemplate: ChartTemplateDef,\n    fieldDisplayNames?: Record<string, string>,\n    chartProperties?: Record<string, any>,\n): Record<string, any> {\n    const resolvedEncodings: Record<string, any> = {};\n\n    // Only process channels the template declares (plus facets which are always valid)\n    const templateChannels = new Set([\n        ...(chartTemplate.channels || []),\n        'column', 'row',  // faceting is always allowed\n    ]);\n\n    for (const [channel, encoding] of Object.entries(encodings)) {\n        // Skip channels not supported by this chart type\n        if (!templateChannels.has(channel)) continue;\n\n        const encodingObj: any = {};\n        const fieldName = encoding.field;\n        const cs = channelSemantics[channel];\n\n        if (channel === \"radius\") {\n            encodingObj.scale = { type: \"sqrt\", zero: true };\n        }\n\n        // Handle count aggregate without a field\n        if (!fieldName && encoding.aggregate === \"count\") {\n            encodingObj.field = \"_count\";\n            encodingObj.title = \"Count\";\n            encodingObj.type = \"quantitative\";\n        }\n\n        if (fieldName) {\n            const escapedFieldName = escapeVlFieldName(fieldName);\n            encodingObj.field = escapedFieldName;\n            // Preserve a readable axis/legend title when the raw name had to be\n            // escaped (VL would otherwise display the backslash-escaped string).\n            if (escapedFieldName !== fieldName) {\n                encodingObj.title = fieldName;\n            }\n\n            // Use Phase 0's resolved type\n            encodingObj.type = cs?.type || 'nominal';\n\n            // Explicit type override\n            if (encoding.type) {\n                encodingObj.type = encoding.type;\n            } else if (channel === 'column' || channel === 'row') {\n                if (encodingObj.type !== 'nominal' && encodingObj.type !== 'ordinal') {\n                    encodingObj.type = 'nominal';\n                }\n            }\n\n            // Aggregation handling — point the encoding at the derived column.\n            // applyAggregation (run before semantics) produces `${field}_${op}`\n            // / `_count` when the caller requests it; a pre-aggregated caller\n            // supplies that column directly.\n            if (encoding.aggregate) {\n                if (encoding.aggregate === \"count\") {\n                    encodingObj.field = \"_count\";\n                    encodingObj.title = \"Count\";\n                    encodingObj.type = \"quantitative\";\n                } else {\n                    encodingObj.field = escapeVlFieldName(`${fieldName}_${encoding.aggregate}`);\n                    encodingObj.type = \"quantitative\";\n                }\n            }\n\n            // Scale: quantitative X axes need tight domains for line-like marks\n            if (encodingObj.type === \"quantitative\" && channel === \"x\") {\n                if (templateMarkType === 'line' || templateMarkType === 'area' ||\n                    templateMarkType === 'trail' || templateMarkType === 'point') {\n                    encodingObj.scale = { nice: false };\n                }\n            }\n\n            // Legend sizing for high-cardinality nominal color/group\n            if (encodingObj.type === \"nominal\" && (channel === 'color' || channel === 'group')) {\n                const actualDomain = [...new Set(data.map(r => r[fieldName]))];\n                if (actualDomain.length >= 16) {\n                    if (!encodingObj.legend) encodingObj.legend = {};\n                    encodingObj.legend.symbolSize = 12;\n                    encodingObj.legend.labelFontSize = 8;\n                }\n            }\n        }\n\n        // Size channel: set scale based on resolved encoding type\n        if (channel === \"size\") {\n            const vlDefaultMax = 361;\n            const plotArea = canvasSize.width * canvasSize.height;\n            const n = Math.max(data.length, 1);\n            const fairShare = plotArea / n;\n            const targetPct = 0.6;\n            const absoluteMin = 16;\n\n            const isQuantitative = encodingObj.type === 'quantitative' || encodingObj.type === 'temporal';\n            if (isQuantitative) {\n                const maxSize = Math.round(Math.max(absoluteMin, Math.min(vlDefaultMax, fairShare * targetPct)));\n                const minSize = 9;\n                encodingObj.scale = { type: \"sqrt\", zero: true, range: [minSize, maxSize] };\n            } else {\n                const maxSize = Math.round(Math.max(absoluteMin, Math.min(vlDefaultMax, fairShare * targetPct)));\n                const minSize = Math.round(maxSize / 4);\n                encodingObj.scale = { range: [minSize, maxSize] };\n            }\n        }\n\n        // --- Sorting ---\n        // Helper: when the field's actual data values are numeric but the\n        // encoding is nominal, domain/sort arrays must keep numeric types\n        // so Vega-Lite can match them against the data.\n        const fieldIsNumeric = fieldName\n            ? data.some(r => typeof r[fieldName] === 'number')\n            : false;\n        const preserveDomainTypes = (arr: any[]): any[] => {\n            if (!fieldIsNumeric) return arr;\n            return arr.map(v => {\n                if (typeof v === 'string') {\n                    const n = Number(v);\n                    if (!isNaN(n) && String(n) === v.trim()) return n;\n                }\n                return v;\n            });\n        };\n\n        if (encoding.sortBy || encoding.sortOrder) {\n            if (!encoding.sortBy) {\n                if (encoding.sortOrder) {\n                    encodingObj.sort = encoding.sortOrder;\n                }\n            } else if (encoding.sortBy === 'x' || encoding.sortBy === 'y') {\n                if (encoding.sortBy === channel) {\n                    encodingObj.sort = `${encoding.sortOrder === \"descending\" ? \"-\" : \"\"}${encoding.sortBy}`;\n                } else {\n                    encodingObj.sort = `${encoding.sortOrder === \"ascending\" ? \"\" : \"-\"}${encoding.sortBy}`;\n                }\n            } else if (encoding.sortBy === 'color') {\n                if (encodings.color?.field) {\n                    encodingObj.sort = `${encoding.sortOrder === \"ascending\" ? \"\" : \"-\"}${encoding.sortBy}`;\n                }\n            } else {\n                // Temporal fields sort chronologically by default in VL; an explicit\n                // value array is redundant, pollutes the spec with potentially hundreds\n                // of date strings, and can break continuous temporal scales.\n                if (encodingObj.type !== 'temporal') {\n                    try {\n                        if (fieldName) {\n                            const fieldSemType = toTypeString(semanticTypes[fieldName]);\n                            const fieldVisCat = inferVisCategory(data.map(r => r[fieldName]));\n                            let sortedValues = JSON.parse(encoding.sortBy);\n\n                            if (fieldVisCat === 'temporal' || fieldSemType === \"Year\" || fieldSemType === \"Decade\") {\n                                sortedValues = sortedValues.map((v: any) => v.toString());\n                            }\n\n                            // Preserve numeric types for nominal fields with numeric data\n                            sortedValues = preserveDomainTypes(sortedValues);\n\n                            encodingObj.sort = (encoding.sortOrder === \"ascending\" || !encoding.sortOrder)\n                                ? sortedValues : sortedValues.reverse();\n                        }\n                    } catch {\n                        console.warn(`sort error > ${encoding.sortBy}`);\n                    }\n                }\n            }\n        } else {\n            // Auto-sort: apply canonical ordinal sort (months, days, quarters, etc.)\n            // when available. Otherwise, set `sort: null` so VL preserves the data\n            // encounter order rather than its default alphabetical sort.\n            // Alphabetical sort breaks labels like \"Stage 1\", \"Stage 10\", \"Stage 2\"\n            // which should follow their natural data order.\n            const isDiscreteType = encodingObj.type === 'nominal' || encodingObj.type === 'ordinal';\n            if (isDiscreteType) {\n                if (cs?.ordinalSortOrder && cs.ordinalSortOrder.length > 0) {\n                    encodingObj.sort = preserveDomainTypes(cs.ordinalSortOrder);\n                } else if (fieldIsNumeric && fieldName) {\n                        // Numeric data treated as nominal/ordinal: sort by numeric\n                        // value so labels appear as 0,1,2,3… instead of data-encounter\n                        // order.  Use \"ascending\" instead of an explicit value array\n                        // to keep the spec compact (avoids enumerating every unique\n                        // value, which can be hundreds for fields like Rank).\n                        encodingObj.sort = \"ascending\";\n                } else {\n                    encodingObj.sort = null;\n                }\n            }\n        }\n\n        // Color scheme from Phase 0 decisions\n        if (channel === \"color\" || channel === \"group\") {\n            if (encoding.scheme && encoding.scheme !== \"default\") {\n                if ('scale' in encodingObj) {\n                    encodingObj.scale.scheme = encoding.scheme;\n                } else {\n                    encodingObj.scale = { scheme: encoding.scheme };\n                }\n            } else if (fieldName && cs?.colorScheme) {\n                if (!('scale' in encodingObj)) {\n                    encodingObj.scale = {};\n                }\n                encodingObj.scale.scheme = cs.colorScheme.scheme;\n                if (cs.colorScheme.type === 'diverging' && cs.colorScheme.domainMid !== undefined) {\n                    encodingObj.scale.domainMid = cs.colorScheme.domainMid;\n                }\n            }\n        }\n\n        // Apply localized display name as axis/legend title\n        if (fieldDisplayNames && fieldName && fieldDisplayNames[fieldName] && !encodingObj.title) {\n            encodingObj.title = fieldDisplayNames[fieldName];\n        }\n\n        // --- Collect resolved encoding ---\n        if (Object.keys(encodingObj).length !== 0) {\n            resolvedEncodings[channel] = encodingObj;\n        }\n    }\n\n    // --- Apply declaration overrides ---\n\n    // Apply resolved types from declareLayoutMode\n    if (declaration.resolvedTypes) {\n        for (const [ch, type] of Object.entries(declaration.resolvedTypes)) {\n            if (resolvedEncodings[ch]) {\n                resolvedEncodings[ch].type = type;\n            }\n        }\n    }\n\n    // Translate group channel → VL color + xOffset/yOffset encodings\n    const groupCS = channelSemantics.group;\n    if (groupCS?.field && resolvedEncodings.group) {\n        // Determine which axis the group subdivides (the discrete one)\n        const xType = resolvedEncodings.x?.type;\n        const yType = resolvedEncodings.y?.type;\n        const isDiscreteT = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n        const groupAxis = isDiscreteT(xType) ? 'x' : isDiscreteT(yType) ? 'y' : 'x';\n        const offsetChannel = groupAxis === 'x' ? 'xOffset' : 'yOffset';\n\n        // Map group → color encoding\n        if (!resolvedEncodings.color) {\n            resolvedEncodings.color = { ...resolvedEncodings.group };\n        }\n        delete resolvedEncodings.group;\n\n        // Suppress the dodge offset when the group is redundant/nested with the\n        // axis (group == x, or a 1:1 pair), OR when the user forces `dodge: none`.\n        // Otherwise VL subdivides each band by the global group domain. `local`\n        // and `global` both keep the (global) offset for now — the compact\n        // `local` renderer is a follow-up; the layout budget stays consistent.\n        const groupAxisField = channelSemantics[groupAxis]?.field;\n        const groupPlan = groupAxisField\n            ? planBandDodge(data, groupAxisField, groupCS.field)\n            : undefined;\n        const groupMode = groupPlan ? resolveDodge(groupPlan, chartProperties?.dodge).mode : 'global';\n        const groupIsNested = !!groupAxisField\n            && (groupAxisField === groupCS.field || groupMode === 'none');\n\n        // Create offset encoding for position subdivision.\n        // Coordinate sort with color so bar order matches legend order.\n        if (!groupIsNested && !resolvedEncodings[offsetChannel]) {\n            const offsetEnc: any = { field: groupCS.field, type: 'nominal' };\n            if (resolvedEncodings.color?.sort !== undefined) {\n                offsetEnc.sort = resolvedEncodings.color.sort;\n            }\n            resolvedEncodings[offsetChannel] = offsetEnc;\n        }\n    }\n\n    // Merge template encoding defaults (bin, aggregate, etc.)\n    const templateEncoding = chartTemplate.template?.encoding;\n    if (templateEncoding) {\n        for (const [ch, enc] of Object.entries(templateEncoding)) {\n            if (enc && typeof enc === 'object' && Object.keys(enc as any).length > 0) {\n                if (resolvedEncodings[ch]) {\n                    resolvedEncodings[ch] = { ...(enc as any), ...resolvedEncodings[ch] };\n                }\n            }\n        }\n    }\n\n    return resolvedEncodings;\n}\n\n// ===========================================================================\n// restructureFacets — VL-specific spec transforms for faceted charts\n// ===========================================================================\n\n/**\n * Purely structural VL transform for faceted charts.\n *\n * This function does NOT decide wrapping or column counts — that is done\n * earlier by computeFacetGrid, which returns a `FacetGridResult`.  This function\n * only:\n *   1. Moves `encoding.column` → `encoding.facet` (with `columns: N`).\n *   2. For layered specs, hoists to top-level `facet` + `spec`.\n */\nfunction restructureFacets(\n    vgObj: any,\n    nominalCounts: Record<string, number>,\n    facetGrid?: { columns: number; rows: number },\n): void {\n\n    const isConcatSpec = () => Array.isArray(vgObj.hconcat) || Array.isArray(vgObj.vconcat) || Array.isArray(vgObj.concat);\n\n    const hoistConcatIntoFacet = (facetDef: any, wrapColumns?: number) => {\n        const childSpec: any = {};\n        for (const key of ['hconcat', 'vconcat', 'concat', 'resolve', 'spacing', 'align', 'bounds', 'center'] as const) {\n            if (vgObj[key] !== undefined) {\n                childSpec[key] = vgObj[key];\n                delete vgObj[key];\n            }\n        }\n        if (vgObj.encoding && Object.keys(vgObj.encoding).length > 0) {\n            childSpec.encoding = vgObj.encoding;\n            delete vgObj.encoding;\n        }\n\n        vgObj.facet = facetDef;\n        if (wrapColumns != null) {\n            vgObj.columns = wrapColumns;\n        }\n        vgObj.spec = childSpec;\n        vgObj.resolve = {\n            ...(vgObj.resolve || {}),\n            scale: { ...(vgObj.resolve?.scale || {}), y: 'independent' },\n        };\n    };\n\n    if (vgObj.encoding?.column != undefined && vgObj.encoding?.row == undefined) {\n        vgObj.encoding.facet = vgObj.encoding.column;\n\n        // Use the grid decided by computeFacetGrid.\n        const numCols = facetGrid?.columns ?? (nominalCounts.column || 1);\n        const numRows = facetGrid?.rows ?? 1;\n\n        vgObj.encoding.facet.columns = numCols;\n\n        // Axis title suppression for faceted charts is handled by\n        // vlApplyLayoutToSpec, which uses actual subplot dimensions\n        // to decide whether titles should be hidden (size-based threshold).\n\n        delete vgObj.encoding.column;\n\n        // Faceting a concat spec must use top-level `facet` + child\n        // `spec`. Inline `encoding.facet` is ignored/invalid for\n        // hconcat/vconcat, which is the structure used by Bar Table.\n        if (isConcatSpec()) {\n            const facetDef = { ...vgObj.encoding.facet };\n            delete facetDef.columns;\n            delete vgObj.encoding.facet;\n            if (Object.keys(vgObj.encoding).length === 0) {\n                delete vgObj.encoding;\n            }\n            hoistConcatIntoFacet(facetDef, numCols);\n            return;\n        }\n\n        // For layered specs, VL doesn't support encoding.facet inline —\n        // restructure to top-level facet + spec.\n        // IMPORTANT: In top-level facet mode, `columns` must be a sibling\n        // of `facet`, not nested inside it. (VL ignores columns inside\n        // the facet object when it's a top-level property.)\n        if (vgObj.layer && Array.isArray(vgObj.layer)) {\n            const facetDef = { ...vgObj.encoding.facet };\n            const wrapColumns = facetDef.columns;\n            delete facetDef.columns; // remove from facet object\n            delete vgObj.encoding.facet;\n\n            vgObj.facet = facetDef;\n            if (wrapColumns != null) {\n                vgObj.columns = wrapColumns; // top-level sibling\n            }\n            vgObj.spec = {\n                layer: vgObj.layer,\n                encoding: vgObj.encoding,\n            };\n            delete vgObj.layer;\n            delete vgObj.encoding;\n        }\n\n        return;\n    }\n\n    // For concat specs with row-only or column+row facets\n    if (isConcatSpec() && (vgObj.encoding?.column || vgObj.encoding?.row)) {\n        const facetDef: any = {};\n        if (vgObj.encoding.column) {\n            facetDef.column = vgObj.encoding.column;\n            delete vgObj.encoding.column;\n        }\n        if (vgObj.encoding.row) {\n            facetDef.row = vgObj.encoding.row;\n            delete vgObj.encoding.row;\n        }\n        if (Object.keys(vgObj.encoding).length === 0) {\n            delete vgObj.encoding;\n        }\n        hoistConcatIntoFacet(facetDef);\n        return;\n    }\n\n    // For layered specs with row-only or column+row facets\n    if (vgObj.layer && Array.isArray(vgObj.layer) &&\n        (vgObj.encoding?.column || vgObj.encoding?.row)) {\n        const facetDef: any = {};\n        if (vgObj.encoding.column) {\n            facetDef.column = vgObj.encoding.column;\n            delete vgObj.encoding.column;\n        }\n        if (vgObj.encoding.row) {\n            facetDef.row = vgObj.encoding.row;\n            delete vgObj.encoding.row;\n        }\n        vgObj.facet = facetDef;\n        vgObj.spec = {\n            layer: vgObj.layer,\n            encoding: vgObj.encoding,\n        };\n        delete vgObj.layer;\n        delete vgObj.encoding;\n    }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Vega-Lite recommendation & adaptation wrappers.\n *\n * Extends core/recommendation.ts with VL-only chart types (Regression,\n * Ranged Dot Plot, Pyramid, Lollipop, Bump, Density, Waterfall,\n * Strip, Map, Choropleth) and filters results to VL-valid channels.\n */\n\nimport {\n    adaptChannels,\n    recommendChannels,\n    getRecommendation,\n    type InternalTableView,\n    // Pick utilities for VL-specific chart types\n    pick,\n    pickQuantitative,\n    pickDiscrete,\n    pickTemporal,\n    pickLowCardNominal,\n    pickLowCardDiscrete,\n    pickGeo,\n    pickSeriesAxis,\n    hasMultipleValuesPerField,\n    pickBestGroupingField,\n    pickLineChartColorField,\n    isValidLineSeriesData,\n    nameMatches,\n} from '../core/recommendation';\nimport {\n    recommendChartTypes,\n    type RecommendChartTypesOptions,\n    type RecommendedChart,\n} from '../core/chart-type-recommendation';\nimport { vlGetTemplateChannels, vlAllTemplateDefs } from './templates';\n\n// ── VL-extended recommendation ──────────────────────────────────────────\n\n/**\n * VL-specific recommendation function.  Handles VL-only chart types first,\n * then falls back to the core recommendation engine for shared types.\n */\nfunction vlGetRecommendation(chartType: string, tv: InternalTableView): Record<string, string> {\n    const used = new Set<string>();\n    const rec: Record<string, string> = {};\n    const assign = (channel: string, fieldName: string | undefined) => {\n        if (fieldName) rec[channel] = fieldName;\n    };\n\n    switch (chartType) {\n        case 'Regression':\n            // Regression uses the same logic as Scatter Plot in the core engine\n            return getRecommendation('Scatter Plot', tv);\n\n        case 'Ranged Dot Plot': {\n            const yField = pickGeo(tv, used) ?? pickDiscrete(tv, used);\n            const xField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('y', yField);\n            assign('x', xField);\n            return rec;\n        }\n\n        case 'Pyramid Chart': {\n            const yField = pickDiscrete(tv, used);\n            const xField = pickQuantitative(tv, used);\n            const colorField = pickDiscrete(tv, used);\n            if (!xField || !yField || !colorField) return {};\n            assign('y', yField);\n            assign('x', xField);\n            assign('color', colorField);\n            return rec;\n        }\n\n        case 'Bump Chart': {\n            // Same logic as Line Chart\n            const xField = pickSeriesAxis(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            if (!isValidLineSeriesData(tv, xField, undefined)) {\n                const colorField = pickLineChartColorField(tv, used, xField, 20)\n                    ?? pickLineChartColorField(tv, used, xField, 200);\n                if (!colorField) return {};\n                assign('color', colorField);\n            }\n            return rec;\n        }\n\n        case 'Lollipop Chart': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            if (hasMultipleValuesPerField(tv, xField)) {\n                assign('color', pickBestGroupingField(tv, used, xField));\n            }\n            return rec;\n        }\n\n        case 'Density Plot': {\n            const xField = pickQuantitative(tv, used);\n            if (!xField) return {};\n            assign('x', xField);\n            assign('color', pickLowCardNominal(tv, used, 15));\n            return rec;\n        }\n\n        case 'Waterfall Chart': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            return rec;\n        }\n\n        case 'Bar Table': {\n            // y = category to rank, x = quantitative value driving bar length\n            const yField = pickDiscrete(tv, used);\n            const xField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('y', yField);\n            assign('x', xField);\n            assign('color', pickLowCardNominal(tv, used, 20));\n            return rec;\n        }\n\n        case 'Strip Plot': {\n            const xField = pickDiscrete(tv, used);\n            const yField = pickQuantitative(tv, used);\n            if (!xField || !yField) return {};\n            assign('x', xField);\n            assign('y', yField);\n            assign('color', pickLowCardDiscrete(tv, used, 20));\n            return rec;\n        }\n\n        case 'Gantt Chart': {\n            // y = task label, x = start, x2 = end. Prefer two temporal fields\n            // for the interval; fall back to quantitative when no dates exist.\n            const yField = pickDiscrete(tv, used);\n            const startField = pickTemporal(tv, used) ?? pickQuantitative(tv, used);\n            const endField = pickTemporal(tv, used) ?? pickQuantitative(tv, used);\n            if (!yField || !startField || !endField) return {};\n            assign('y', yField);\n            assign('x', startField);\n            assign('x2', endField);\n            assign('color', pickLowCardNominal(tv, used, 12));\n            return rec;\n        }\n\n        case 'Bullet Chart': {\n            // y = label, x = measured value, goal = target marker.\n            const yField = pickDiscrete(tv, used);\n            const valueField = pickQuantitative(tv, used);\n            const goalField = pickQuantitative(tv, used);\n            if (!yField || !valueField) return {};\n            assign('y', yField);\n            assign('x', valueField);\n            if (goalField) assign('goal', goalField);\n            return rec;\n        }\n\n        case 'Map': {\n            const latField = pick(tv, used, (_n, _ty, st) => st === 'Latitude')\n                ?? pick(tv, used, (n) => nameMatches(n, ['latitude', 'lat']));\n            const lonField = pick(tv, used, (_n, _ty, st) => st === 'Longitude')\n                ?? pick(tv, used, (n) => nameMatches(n, ['longitude', 'lon', 'lng', 'long']));\n            if (!latField || !lonField) return {};\n            assign('latitude', latField);\n            assign('longitude', lonField);\n            assign('color', pickQuantitative(tv, used) ?? pickLowCardNominal(tv, used));\n            return rec;\n        }\n\n        case 'Choropleth': {\n            const GEO_PLACE = ['State', 'Country', 'Region', 'Province', 'County', 'Continent'];\n            const idField = pick(tv, used, (_n, _ty, st) => GEO_PLACE.includes(st as string))\n                ?? pick(tv, used, (n) => nameMatches(n, ['state', 'country', 'region', 'province', 'nation', 'county']))\n                ?? pickDiscrete(tv, used);\n            const measure = pickQuantitative(tv, used);\n            if (!idField || !measure) return {};\n            assign('id', idField);\n            assign('color', measure);\n            return rec;\n        }\n\n        default:\n            // Fall through to core recommendation engine\n            return getRecommendation(chartType, tv);\n    }\n}\n\n// ── Public API ──────────────────────────────────────────────────────────\n\n/**\n * Adapt encodings when switching between Vega-Lite chart types.\n *\n * @param sourceType     Current chart type name\n * @param targetType     Target chart type name\n * @param encodings      Current channel->fieldName map (filled channels only)\n * @param data           (optional) Data rows for recommendation-based adaptation\n * @param semanticTypes  (optional) Field->semantic-type map\n * @returns              Remapped channel->fieldName for the target\n */\nexport function vlAdaptChart(\n    sourceType: string,\n    targetType: string,\n    encodings: Record<string, string>,\n    data?: any[],\n    semanticTypes?: Record<string, string>,\n): Record<string, string> {\n    const targetChannels = vlGetTemplateChannels(targetType);\n    return adaptChannels(sourceType, targetType, targetChannels, encodings, data, semanticTypes, vlGetRecommendation);\n}\n\n/**\n * Recommend field->channel assignments for a Vega-Lite chart type.\n *\n * @param chartType      Chart template name (e.g. \"Bar Chart\")\n * @param data           Array of row objects\n * @param semanticTypes  Field->semantic-type map (e.g. { weight: \"Quantity\" })\n * @returns              channel->fieldName map (only VL-valid channels)\n */\nexport function vlRecommendEncodings(\n    chartType: string,\n    data: any[],\n    semanticTypes: Record<string, string>,\n): Record<string, string> {\n    const rec = recommendChannels(chartType, data, semanticTypes, vlGetRecommendation);\n    const validChannels = vlGetTemplateChannels(chartType);\n    const result: Record<string, string> = {};\n    for (const [ch, field] of Object.entries(rec)) {\n        if (validChannels.includes(ch)) {\n            result[ch] = field;\n        }\n    }\n    return result;\n}\n\n/** Chart-type names Vega-Lite can render (its template catalog). */\nconst VL_SUPPORTED_TYPES = vlAllTemplateDefs.map(d => d.chart);\n\n/**\n * Recommend a ranked list of Vega-Lite chart types for a dataset.\n *\n * Wraps the backend-agnostic `recommendChartTypes`, restricting results to\n * chart types Vega-Lite can render. Call it first, then feed the chosen type to\n * {@link vlRecommendEncodings} to populate channels — or use\n * {@link vlRecommendCharts} to do both in one step.\n *\n * @param data           Array of row objects.\n * @param semanticTypes  Field→semantic-type map (e.g. `{ Entity: \"Country\" }`).\n * @param options        Optional `max` cap on the number of suggestions.\n * @returns              Ranked VL chart-type names (best first).\n */\nexport function vlRecommendChartTypes(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): string[] {\n    return recommendChartTypes(data, semanticTypes, { ...options, supportedTypes: VL_SUPPORTED_TYPES });\n}\n\n/**\n * One-step recommendation: rank Vega-Lite chart types for the data, then\n * populate each with {@link vlRecommendEncodings}. Suggestions whose required\n * channels cannot be filled are dropped, so every returned chart is renderable.\n *\n * @param data           Array of row objects.\n * @param semanticTypes  Field→semantic-type map.\n * @param options        Optional `max` cap on the number of charts returned.\n * @returns              Ranked `{ chartType, encodings }` pairs (best first).\n */\nexport function vlRecommendCharts(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): RecommendedChart[] {\n    const { max, ...rest } = options;\n    const charts = vlRecommendChartTypes(data, semanticTypes, rest)\n        .map(chartType => ({ chartType, encodings: vlRecommendEncodings(chartType, data, semanticTypes) }))\n        .filter(s => Object.keys(s.encodings).length > 0);\n    return max != null ? charts.slice(0, max) : charts;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Shared helper functions for ECharts template hooks.\n * Pure logic — no UI dependencies.\n */\n\nimport type { ChannelSemantics, InstantiateContext } from '../../core/types';\n\n/**\n * Get canonical category order for a channel (from buildECEncodings or channelSemantics).\n * Use when calling extractCategories so sort order is consistent across templates.\n *\n * Honors the shared Sort encoding action (`encodings[channel].sortBy` =\n * measure channel + `sortOrder`) by aggregating the measure per category —\n * same contract as Plotly's `resolveCategoryOrder`.\n */\nexport function getCategoryOrder(ctx: InstantiateContext, channel: string): string[] | undefined {\n    const resolved = (ctx.resolvedEncodings as any)?.[channel];\n    if (Array.isArray(resolved?.sortValues) && resolved.sortValues.length > 0) {\n        return resolved.sortValues.map(String);\n    }\n\n    const ordinal = resolved?.ordinalSortOrder\n        ?? ctx.channelSemantics?.[channel]?.ordinalSortOrder;\n\n    const enc = ctx.encodings?.[channel];\n    const sortByChannel = enc?.sortBy;\n    if (\n        typeof sortByChannel === 'string'\n        && (sortByChannel === 'x' || sortByChannel === 'y' || sortByChannel === 'color'\n            || sortByChannel === 'size' || sortByChannel === 'group')\n    ) {\n        const catField = ctx.channelSemantics?.[channel]?.field ?? enc?.field;\n        const sortByField = ctx.channelSemantics?.[sortByChannel]?.field\n            ?? ctx.encodings?.[sortByChannel]?.field;\n        if (catField && sortByField && ctx.table) {\n            return resolveCategoryOrder(ctx.table, catField, {\n                ordinalSortOrder: ordinal,\n                sortBy: sortByField,\n                sortOrder: enc?.sortOrder,\n            });\n        }\n    }\n\n    return ordinal;\n}\n\n/**\n * Resolve the display order of a categorical axis, honoring either a canonical\n * `ordinalSortOrder` or a sort-by-measure request (`sortBy` + `sortOrder`).\n */\nexport function resolveCategoryOrder(\n    data: any[],\n    catField: string,\n    opts?: { ordinalSortOrder?: string[]; sortBy?: string; sortOrder?: 'ascending' | 'descending' },\n): string[] {\n    const base = extractCategories(data, catField, opts?.ordinalSortOrder);\n    if (!opts?.sortBy) return base;\n    const agg = new Map<string, number>();\n    for (const row of data) {\n        const cat = String(row[catField] ?? '');\n        const v = Number(row[opts.sortBy]);\n        if (Number.isFinite(v)) agg.set(cat, (agg.get(cat) ?? 0) + v);\n    }\n    const dir = opts.sortOrder === 'ascending' ? 1 : -1;\n    return [...base].sort((a, b) => dir * ((agg.get(a) ?? 0) - (agg.get(b) ?? 0)));\n}\n\n// Re-export circumference-pressure functions from core (shared with VL backend)\nexport {\n    computeCircumferencePressure,\n    computeEffectiveBarCount,\n    type CircumferencePressureParams,\n    type CircumferencePressureResult,\n} from '../../core/decisions';\n\n// ---------------------------------------------------------------------------\n// Discrete-dimension helpers (mirrored from vegalite/templates/utils.ts)\n// ---------------------------------------------------------------------------\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/**\n * Get the number of unique non-null values for a field in the data table.\n */\nexport function getFieldCardinality(field: string, table: any[]): number {\n    return new Set(table.map((r: any) => r[field]).filter((v: any) => v != null)).size;\n}\n\n/**\n * Determine the discrete type for a given encoding type.\n */\nexport function resolveDiscreteType(\n    currentType: string,\n    field: string | undefined,\n    table: any[],\n): 'nominal' | 'ordinal' {\n    if (currentType === 'nominal') return 'nominal';\n    if (currentType === 'ordinal') return 'ordinal';\n    if (currentType === 'temporal') return 'ordinal';\n    if (currentType === 'quantitative' && field && table.length > 0) {\n        const cardinality = getFieldCardinality(field, table);\n        return cardinality <= 20 ? 'ordinal' : 'nominal';\n    }\n    return 'nominal';\n}\n\n// ---------------------------------------------------------------------------\n// ECharts-specific helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract unique category values from data for a given field, preserving order.\n * If `ordinalSortOrder` is provided, returns values sorted in that canonical order.\n */\nexport function extractCategories(data: any[], field: string, ordinalSortOrder?: string[]): string[] {\n    const seen = new Set<string>();\n    const result: string[] = [];\n    for (const row of data) {\n        const val = row[field];\n        if (val != null) {\n            const key = String(val);\n            if (!seen.has(key)) {\n                seen.add(key);\n                result.push(key);\n            }\n        }\n    }\n\n    // Apply canonical ordinal sort if available\n    if (ordinalSortOrder && ordinalSortOrder.length > 0) {\n        const orderMap = new Map(ordinalSortOrder.map((v, i) => [v, i]));\n        result.sort((a, b) => {\n            const ia = orderMap.get(a);\n            const ib = orderMap.get(b);\n            if (ia !== undefined && ib !== undefined) return ia - ib;\n            if (ia !== undefined) return -1;\n            if (ib !== undefined) return 1;\n            return 0;\n        });\n    }\n\n    return result;\n}\n\n/**\n * Group data by a categorical field.\n * Returns a map: seriesName → rows[].\n */\nexport function groupBy(data: any[], field: string): Map<string, any[]> {\n    const groups = new Map<string, any[]>();\n    for (const row of data) {\n        const key = String(row[field] ?? '');\n        if (!groups.has(key)) groups.set(key, []);\n        groups.get(key)!.push(row);\n    }\n    return groups;\n}\n\n/**\n * Build ECharts axis config from a channel semantic.\n */\nexport function buildAxisConfig(\n    cs: ChannelSemantics | undefined,\n    position: 'x' | 'y',\n    categories?: string[],\n): any {\n    if (!cs) return { type: 'value' };\n\n    const axisType = isDiscrete(cs.type) ? 'category' : cs.type === 'temporal' ? 'time' : 'value';\n    const axis: any = { type: axisType };\n\n    if (axisType === 'category' && categories) {\n        axis.data = categories;\n    }\n\n    // Add field name as axis name\n    if (cs.field) {\n        axis.name = cs.field;\n        axis.nameLocation = 'middle';\n        axis.nameGap = 30;\n    }\n\n    return axis;\n}\n\n/**\n * Pick a default ECharts color palette.\n */\nexport const DEFAULT_COLORS = [\n    '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n    '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc', '#48b8d0',\n];\n\n/**\n * Detect which axis is the category (banded) axis and which is the value axis.\n * Returns { categoryAxis, valueAxis } with 'x' or 'y'.\n */\nexport function detectAxes(\n    channelSemantics: Record<string, ChannelSemantics>,\n): { categoryAxis: 'x' | 'y'; valueAxis: 'x' | 'y' } {\n    const xCS = channelSemantics.x;\n    const yCS = channelSemantics.y;\n\n    // If x is discrete → x is category\n    if (xCS && isDiscrete(xCS.type)) {\n        return { categoryAxis: 'x', valueAxis: 'y' };\n    }\n    // If y is discrete → y is category (horizontal bars)\n    if (yCS && isDiscrete(yCS.type)) {\n        return { categoryAxis: 'y', valueAxis: 'x' };\n    }\n    // x quantitative + y temporal → horizontal bars (VL: x=bar length, y=dates)\n    if (xCS?.type === 'quantitative' && yCS?.type === 'temporal') {\n        return { categoryAxis: 'y', valueAxis: 'x' };\n    }\n    // x temporal + y quantitative → vertical bars (VL: x=dates, y=bar length)\n    if (xCS?.type === 'temporal' && yCS?.type === 'quantitative') {\n        return { categoryAxis: 'x', valueAxis: 'y' };\n    }\n    // Default: x is category\n    return { categoryAxis: 'x', valueAxis: 'y' };\n}\n\n\n","// ECharts 专用调色板定义 + 选盘逻辑（backend 版 pickColorMap）。\n// 这里承接 core/color-decisions.ts 中的抽象信息（schemeType / categoryCount / schemeId），\n// 真正的「选哪个 palette」完全在 ECharts 层完成，并使用 ECharts 常用配色。\n\nimport type { ColorDecision, ColorMapType } from '../core/color-decisions';\nimport { DEFAULT_COLORS } from './templates/utils';\n\nexport type EChartsPaletteId = 'cat10' | 'cat20' | 'viridis' | 'RdBu' | string;\n\nexport interface EChartsColorMapDef {\n    /** 全局 id，例如 'cat10'、'viridis'、'RdBu' */\n    id: EChartsPaletteId;\n    type: ColorMapType;\n    /** 是否适合做离散 palette（分类 legend） */\n    supportsDiscrete: boolean;\n    /** 是否适合做连续色带（gradient） */\n    supportsContinuous: boolean;\n    /** 建议背景色 */\n    background: 'light' | 'dark' | 'any';\n    /** 是否推荐给色盲用户 */\n    colorblindSafe?: boolean;\n    /** 对 categorical：大致最大类别数 */\n    maxCategories?: number;\n    /** diverging 色带相关元数据 */\n    diverging?: boolean;\n    preferredMidpoint?: number;\n    /** 实际颜色数组（按 ECharts 推荐配色定义） */\n    colors: string[];\n}\n\n/**\n * ECharts 常用配色：\n * - cat10 / cat20：基于官方默认调色板 (`echarts~5` 默认 category palette) 扩展。\n * - viridis：在 ECharts 中没有内置同名 scheme，这里保留常见 viridis 色带，方便连续映射统一。\n * - RdBu：经典发散盘，适合正负对称的度量。\n */\nconst ECHARTS_COLOR_MAPS: EChartsColorMapDef[] = [\n    {\n        id: 'cat10',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'any',\n        maxCategories: 10,\n        colorblindSafe: false,\n        colors: [\n            '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n            '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc', '#d48265',\n        ],\n    },\n    {\n        id: 'cat20',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'any',\n        maxCategories: 20,\n        colorblindSafe: false,\n        colors: [\n            '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n            '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc', '#d48265',\n            '#749f83', '#ca8622', '#bda29a', '#6e7074', '#546570',\n            '#c4ccd3', '#4b565b', '#2f4554', '#61a0a8', '#c23531',\n        ],\n    },\n    {\n        id: 'viridis',\n        type: 'sequential',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        colorblindSafe: true,\n        colors: [\n            '#440154', '#46327e', '#365c8d', '#277f8e',\n            '#1fa187', '#4ac16d', '#a0da39', '#fde725',\n        ],\n    },\n    {\n        id: 'RdBu',\n        type: 'diverging',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        colorblindSafe: false,\n        diverging: true,\n        preferredMidpoint: 0,\n        colors: [\n            '#b2182b', '#d6604d', '#f4a582', '#fddbc7',\n            '#f7f7f7',\n            '#d1e5f0', '#92c5de', '#4393c3', '#2166ac',\n        ],\n    },\n];\n\nfunction getMapById(id: EChartsPaletteId | undefined): EChartsColorMapDef | undefined {\n    if (!id) return undefined;\n    const key = String(id).toLowerCase();\n    return ECHARTS_COLOR_MAPS.find(m => m.id.toLowerCase() === key);\n}\n\nexport function getPaletteForScheme(id: EChartsPaletteId): string[] | undefined {\n    const entry = getMapById(id);\n    return entry?.colors;\n}\n\n/**\n * ECharts 侧的「选盘」函数：等价于 backend 版 pickColorMap。\n *\n * 输入：\n *   - ColorDecision：来自 core/color-decisions（已算好 schemeType / categoryCount / schemeId）。\n *\n * 策略（与原先 core 中的 pickColorMap 思路一致，但完全 ECharts 本地化）：\n *   1）若用户显式指定了 schemeId，则优先按该 id 取 palette（若存在）。\n *   2）否则根据 schemeType + categoryCount + colormap 元数据自动挑选合适的盘：\n *        - categorical：根据 maxCategories 与 categoryCount 匹配 cat10 / cat20；\n *        - sequential：优先选支持连续的顺序色带（viridis）；\n *        - diverging ：优先选标记了 diverging 的色带（RdBu）。\n *   3）若都无法命中，回退到 ECharts 的 DEFAULT_COLORS。\n */\nexport function pickEChartsPalette(decision: ColorDecision | undefined): string[] {\n    if (!decision) {\n        return DEFAULT_COLORS;\n    }\n\n    const { schemeType, schemeId, categoryCount } = decision;\n\n    // 1. 用户 / 上层显式指定了 schemeId：直接尝试按 id 查表。\n    if (schemeId) {\n        const fromId = getPaletteForScheme(schemeId);\n        if (fromId && fromId.length > 0) {\n            return fromId;\n        }\n    }\n\n    // 2. 自动路径：根据类型 / 类别数挑选本 backend 推荐盘。\n    const mapsOfType = ECHARTS_COLOR_MAPS.filter(m => m.type === schemeType);\n\n    if (schemeType === 'categorical') {\n        const k = categoryCount ?? 0;\n        if (mapsOfType.length) {\n            // 先选「容量刚好够」的盘；若 maxCategories 缺失则认为无限容量。\n            const candidates = mapsOfType.filter(m => m.supportsDiscrete);\n            if (candidates.length) {\n                const byCapacity = candidates\n                    .filter(m => m.maxCategories == null || m.maxCategories >= k)\n                    .sort((a, b) => (a.maxCategories ?? Infinity) - (b.maxCategories ?? Infinity));\n                const picked = byCapacity[0] ?? candidates[0];\n                if (picked.colors.length) {\n                    return picked.colors;\n                }\n            }\n        }\n    } else if (schemeType === 'sequential') {\n        const seq = mapsOfType.find(m => m.supportsContinuous) ?? getMapById('viridis');\n        if (seq && seq.colors.length) {\n            return seq.colors;\n        }\n    } else if (schemeType === 'diverging') {\n        const divergingFirst = mapsOfType.find(m => m.diverging) ?? getMapById('RdBu');\n        if (divergingFirst && divergingFirst.colors.length) {\n            return divergingFirst.colors;\n        }\n    }\n\n    // 3. 最终兜底：ECharts 默认色盘。\n    return DEFAULT_COLORS;\n}\n\n\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Rose Chart (Nightingale / Coxcomb) template.\n *\n * Contrast with VL:\n *   VL: mark = \"arc\" with theta (angular extent fixed per slice) + radius (value)\n *   EC: series type = 'bar' with coordinateSystem = 'polar',\n *       angleAxis (categorical — directions/categories) +\n *       radiusAxis (value — the measure mapped to wedge radius).\n *\n * Data model (long format):\n *   x (nominal): angular category (direction, month, etc.)\n *   y (quantitative): value mapped to wedge radius\n *   color (nominal, optional): stack / group variable — stacked rose (one series per group).\n *   Without color: single polar bar series with one data item per category (each item named for\n *   legend). Multiple series would be grouped by ECharts and shrink each petal — wrong geometry.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, computeCircumferencePressure } from './utils';\n\n/**\n * Invisible pie series: polar `bar` has no `legendVisualProvider`, so ECharts would draw zero\n * legend rows (see LegendView.renderInner). Slices are not shown (radius 0); only names/colors\n * feed the legend. Must match `ecApplyLayoutToSpec` / facet polar merge.\n */\nexport const EC_ROSE_LEGEND_BRIDGE_SERIES_NAME = '__dfRoseLegendBridge__';\n\n/**\n * Map a raw measure to a wedge radius so that wedge AREA (not radius) is\n * proportional to the value. ECharts' polar `radiusAxis` is linear (there is no\n * `sqrt` axis type), so — unlike Vega-Lite which sets `radius.scale.type = 'sqrt'`\n * — we transform the data itself. The true value is preserved on each data item\n * (`_rawValue`) for the tooltip. Guards against negatives (sqrt(NaN)).\n */\nfunction roseRadius(value: number): number {\n    return Math.sqrt(Math.max(0, value));\n}\n\nexport const ecRoseChartDef: ChartTemplateDef = {\n    chart: 'Rose Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const catField = channelSemantics.x?.field;   // angular categories\n        const valField = channelSemantics.y?.field;    // wedge radius value\n        const colorField = channelSemantics.color?.field; // stack groups\n\n        if (!catField || !valField) return;\n\n        // Extract unique angular categories (directions, months, etc.)\n        const categories = extractCategories(table, catField, channelSemantics.x?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        // Slice ordering (design choice): default keeps the category order;\n        // sorting by value reorders the angular wedges by their radius sum.\n        const sortSlices = ctx.chartProperties?.sortSlices;\n        if (sortSlices === 'descending' || sortSlices === 'ascending') {\n            const totals = new Map<string, number>();\n            for (const c of categories) totals.set(c, 0);\n            for (const row of table) {\n                const c = String(row[catField] ?? '');\n                if (totals.has(c)) totals.set(c, totals.get(c)! + (Number(row[valField]) || 0));\n            }\n            categories.sort((a, b) =>\n                sortSlices === 'descending'\n                    ? (totals.get(b) ?? 0) - (totals.get(a) ?? 0)\n                    : (totals.get(a) ?? 0) - (totals.get(b) ?? 0),\n            );\n        }\n\n        // Build series data\n        const seriesArr: any[] = [];\n        const legendData: string[] = [];\n\n        if (colorField) {\n            // Stacked rose: one series per color group. ECharts stacks by SUMMING\n            // data values, so to make each segment's AREA proportional to its value\n            // we feed the incremental radius sqrt(cumsum) - sqrt(prevCumsum). The\n            // outer edge of each segment then sits at sqrt(total-so-far), mirroring\n            // Vega-Lite's stacked sqrt radius scale.\n            const groups = groupBy(table, colorField);\n            const cumSum = categories.map(() => 0);\n\n            for (const [name, rows] of groups) {\n                legendData.push(name);\n\n                // Aggregate: sum per category\n                const catAgg = new Map<string, number>();\n                for (const row of rows) {\n                    const cat = String(row[catField] ?? '');\n                    const val = Number(row[valField]) || 0;\n                    catAgg.set(cat, (catAgg.get(cat) ?? 0) + val);\n                }\n\n                const data = categories.map((c, i) => {\n                    const val = catAgg.get(c) ?? 0;\n                    const prev = cumSum[i];\n                    const next = prev + val;\n                    cumSum[i] = next;\n                    // Incremental radius so the stacked outer edge lands at sqrt(next).\n                    return { value: roseRadius(next) - roseRadius(prev), _rawValue: val };\n                });\n\n                seriesArr.push({\n                    type: 'bar',\n                    name,\n                    data,\n                    coordinateSystem: 'polar',\n                    stack: 'rose',\n                    emphasis: { focus: 'series' },\n                });\n            }\n        } else {\n            // No color channel: one series, one value per angle — full wedge width. Per-item colors\n            // + legend are applied in ecApplyLayoutToSpec (multi-series would trigger grouped barWidth).\n            const catAgg = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[catField] ?? '');\n                const val = Number(row[valField]) || 0;\n                catAgg.set(cat, (catAgg.get(cat) ?? 0) + val);\n            }\n\n            const values = categories.map(c => catAgg.get(c) ?? 0);\n            for (const c of categories) {\n                legendData.push(String(c));\n            }\n\n            seriesArr.push({\n                type: 'bar',\n                data: categories.map((c, i) => ({\n                    value: roseRadius(values[i]),\n                    name: String(c),\n                    _rawValue: values[i],\n                })),\n                coordinateSystem: 'polar',\n                emphasis: { focus: 'series' },\n            });\n            // Legend binding (bar alone does not implement legendVisualProvider in ECharts).\n            seriesArr.push({\n                type: 'pie',\n                name: EC_ROSE_LEGEND_BRIDGE_SERIES_NAME,\n                z: -10,\n                silent: true,\n                tooltip: { show: false },\n                radius: 0,\n                center: ['50%', '50%'],\n                label: { show: false },\n                labelLine: { show: false },\n                emphasis: { disabled: true },\n                data: categories.map(c => ({\n                    name: String(c),\n                    value: 1,\n                    label: { show: false },\n                    labelLine: { show: false },\n                })),\n            });\n        }\n\n        // Alignment: 'center' puts wedge center at 12 o'clock,\n        // 'left' puts wedge left edge at 12 o'clock.\n        const alignment = ctx.chartProperties?.alignment ?? 'left';\n        const n = categories.length;\n        // ECharts angleAxis: startAngle is where the first wedge's LEFT edge begins,\n        // and categories proceed clockwise (decreasing angle).\n        // Left alignment: startAngle=90 → left edge at top.\n        // Center alignment: shift forward (increase) by half a wedge so the center lands at top.\n        const startAngle = alignment === 'center' && n > 0\n            ? 90 + 180 / n\n            : 90;\n\n        const hasLegend = legendData.length > 0;\n\n        // Estimate legend width from label text\n        const maxLabelLen = hasLegend ? Math.max(...legendData.map(d => d.length), 3) : 0;\n        const estimatedLegendWidth = hasLegend ? Math.min(150, maxLabelLen * 7 + 40) : 0;\n\n        // ── Circumference-pressure sizing (spring model) ──────────────\n        // Rose: uniform angular width — each petal is one \"bar\".\n        const { radius: pressureRadius, canvasW: rawCanvasW, canvasH }\n            = computeCircumferencePressure(categories.length, ctx.canvasSize, {\n                minArcPx: 45,\n                minRadius: 80,\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n            });\n\n        // Canvas size — grow width to fit legend without squeezing the chart\n        const canvasW = rawCanvasW + (hasLegend ? estimatedLegendWidth : 0);\n\n        // Shrink polar radius and shift center left to leave room for legend\n        const polarRadius = hasLegend\n            ? Math.min(pressureRadius, (canvasW - estimatedLegendWidth - 40) / 2, (canvasH - 40) / 2)\n            : pressureRadius;\n        const polarCenter = hasLegend\n            ? [`${Math.round((canvasW - estimatedLegendWidth) / 2)}px`, '50%']\n            : undefined;\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                // Radii are sqrt-transformed for area-truth; show the true value\n                // (stashed on each data item as `_rawValue`) instead of the radius.\n                formatter: (params: any) => {\n                    const raw = params?.data?._rawValue;\n                    const shown = raw != null ? raw : params?.value;\n                    const cat = params?.name != null && params.name !== '' ? String(params.name) : '';\n                    const series = params?.seriesName;\n                    const head = series && series !== cat\n                        ? (cat ? `${cat} · ${series}` : String(series))\n                        : cat;\n                    const marker = params?.marker ?? '';\n                    return `${marker}${head}: <b>${shown}</b>`;\n                },\n            },\n            angleAxis: {\n                type: 'category',\n                data: categories,\n                startAngle,\n            },\n            radiusAxis: {\n                // hide axis line for cleaner look\n                axisLine: { show: false },\n                axisTick: { show: false },\n                // Radii encode sqrt(value); showing the raw sqrt tick numbers would\n                // misrepresent the scale, so suppress them (values live in tooltips).\n                axisLabel: { show: false },\n            },\n            polar: {\n                radius: polarRadius,\n                ...(polarCenter != null ? { center: polarCenter } : {}),\n            },\n            series: seriesArr,\n            // 颜色调色板由 color-decisions / ecApplyLayoutToSpec 注入到 option.color\n            // Canvas size\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        if (hasLegend) {\n            option.legend = {\n                data: legendData,\n                type: legendData.length > 8 ? 'scroll' : 'plain',\n                orient: 'vertical',\n                right: 10,\n                top: 'middle',\n                textStyle: { fontSize: ctx.layout.legendFontSize },\n            };\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'alignment', label: 'Alignment', type: 'discrete', options: [\n                { value: 'left', label: 'Left (default)' },\n                { value: 'center', label: 'Center' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete', options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * PHASE 2: INSTANTIATE SPEC — ECharts backend\n * =============================================================================\n *\n * Translates semantic decisions (Phase 0) and layout dimensions (Phase 1)\n * into ECharts-specific option properties.\n *\n * Key differences from Vega-Lite instantiation:\n *   - VL uses declarative encoding width: {step: N} — EC uses explicit pixel widths\n *   - VL color schemes are strings — EC uses explicit color arrays\n *   - VL handles zero-baseline via scale.zero — EC uses axis.min / scale=true\n *   - VL temporal formatting uses timeUnit — EC uses axisLabel.formatter\n *   - VL label rotation is axis.labelAngle — EC uses axisLabel.rotate\n *\n * EC dependency: **Yes — this is where ECharts-specific syntax lives**\n * =============================================================================\n */\n\nimport type {\n    ChannelSemantics,\n    LayoutResult,\n    InstantiateContext,\n    ChartWarning,\n} from '../core/types';\nimport { computePaddedDomain } from '../core/semantic-types';\nimport { getVisCategory } from '../core/semantic-types';\nimport { toTypeString } from '../core/field-semantics';\nimport {\n    looksLikeDateString,\n    analyzeTemporalField,\n    computeDataVotes,\n    pickBestLevel,\n    levelToFormat,\n    SEMANTIC_LEVEL,\n} from '../core/resolve-semantics';\nimport { ColorDecisionResult } from '../core/color-decisions';\nimport { getPaletteForScheme } from './colormap';\nimport { DEFAULT_COLORS } from './templates/utils';\nimport { EC_ROSE_LEGEND_BRIDGE_SERIES_NAME } from './templates/rose';\n\n/**\n * 在给定调色板长度和需要的颜色数量时，返回一组「在色带上尽量均匀分布」的索引。\n * 例如 paletteLength=10, count=4 → [0, 3, 6, 9]。\n */\nfunction pickEvenlySpacedColorIndices(paletteLength: number, count: number): number[] {\n    if (paletteLength <= 0 || count <= 0) return [];\n    if (count === 1) return [0];\n\n    // 当类别数超过调色板长度时，退化为简单循环使用全部颜色。\n    if (count >= paletteLength) {\n        return Array.from({ length: count }, (_, i) => i % paletteLength);\n    }\n\n    const maxIndex = paletteLength - 1;\n    const step = maxIndex / (count - 1);\n    const indices: number[] = [];\n    for (let i = 0; i < count; i += 1) {\n        const idx = Math.round(i * step);\n        indices.push(idx);\n    }\n    return indices;\n}\n\n/**\n * 简单的 HEX → RGB 转换（仅支持 #rrggbb）。\n */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n    const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n    if (!m) return null;\n    const intVal = parseInt(m[1], 16);\n    return {\n        r: (intVal >> 16) & 255,\n        g: (intVal >> 8) & 255,\n        b: intVal & 255,\n    };\n}\n\nfunction componentToHex(c: number): string {\n    const v = Math.max(0, Math.min(255, Math.round(c)));\n    const s = v.toString(16);\n    return s.length === 1 ? `0${s}` : s;\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n    return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;\n}\n\n/**\n * 将基础调色板插值为 256 个颜色采样点，用于 Rank / 连续映射。\n * 线性插值 RGB 空间，保证整体趋势与原色带一致。\n */\nfunction samplePaletteTo256(base: string[]): string[] {\n    if (base.length === 0) return [];\n    if (base.length === 1) return new Array(256).fill(base[0]);\n\n    const stops = base.map(hexToRgb);\n    if (stops.some(s => s == null)) {\n        // 回退：若存在无法解析的颜色，直接重复基础调色板。\n        return Array.from({ length: 256 }, (_, i) => base[i % base.length]);\n    }\n\n    const rgbStops = stops as { r: number; g: number; b: number }[];\n    const segmentCount = rgbStops.length - 1;\n    const result: string[] = [];\n\n    for (let i = 0; i < 256; i += 1) {\n        const t = i / 255;\n        const pos = t * segmentCount;\n        const idx = Math.floor(pos);\n        const localT = pos - idx;\n        const c0 = rgbStops[idx];\n        const c1 = rgbStops[Math.min(idx + 1, segmentCount)];\n        const r = c0.r + (c1.r - c0.r) * localT;\n        const g = c0.g + (c1.g - c0.g) * localT;\n        const b = c0.b + (c1.b - c0.b) * localT;\n        result.push(rgbToHex(r, g, b));\n    }\n\n    return result;\n}\n\n/**\n * 基于 legend 标签的数值（Rank/Index），从顺序色带采样 256 个颜色后，\n * 为每个 rank 值分配对应的颜色。\n */\nfunction buildRankColorLookupFromLegend(\n    legendData: any[],\n    palette: string[],\n): Map<string, string> {\n    const labels: string[] = legendData.map((d: any) =>\n        typeof d === 'string' ? d : (d?.name ?? String(d ?? '')),\n    );\n\n    const numericEntries = labels\n        .map((name) => {\n            const v = Number(name);\n            return Number.isFinite(v) ? { name, value: v } : null;\n        })\n        .filter((x): x is { name: string; value: number } => x != null);\n\n    if (numericEntries.length === 0) return new Map();\n\n    const values = numericEntries.map(e => e.value);\n    const minVal = Math.min(...values);\n    const maxVal = Math.max(...values);\n    const span = maxVal - minVal;\n\n    const sampled = samplePaletteTo256(palette);\n    if (sampled.length === 0) return new Map();\n\n    const colorMap = new Map<string, string>();\n    for (const { name, value } of numericEntries) {\n        let t: number;\n        if (!Number.isFinite(span) || span === 0) {\n            t = 0.5;\n        } else {\n            t = (value - minVal) / span;\n            if (t < 0) t = 0;\n            if (t > 1) t = 1;\n        }\n        const idx = Math.round(t * (sampled.length - 1));\n        colorMap.set(name, sampled[idx]);\n    }\n\n    return colorMap;\n}\n\n/**\n * Phase 2: Apply layout and semantic decisions to the ECharts option object.\n *\n * Handles common ECharts plumbing across all templates:\n *   - Grid/canvas sizing\n *   - Axis label rotation and sizing\n *   - Overflow truncation markers\n *   - Color scheme application\n *   - Temporal format application\n */\nfunction roundAxisNumber(v: number): number {\n    if (!Number.isFinite(v)) return v;\n    // Reduce floating point noise like 8.899999999999999 → 8.9\n    return Number(v.toFixed(10));\n}\n\nfunction cleanAxisNumericFields(axis: any): void {\n    if (!axis || typeof axis !== 'object') return;\n    for (const key of ['min', 'max', 'interval']) {\n        if (typeof axis[key] === 'number') {\n            axis[key] = roundAxisNumber(axis[key]);\n        }\n    }\n}\n\n/**\n * Match Vega-Lite pyramid panel height (vegalite/templates/bar.ts pyramidChartDef).\n * computeLayout often shrinks yStep on short canvases, making EC much shorter than VL.\n */\nfunction pyramidPanelHeightMatchVegaLite(\n    yCardinality: number,\n    canvasSize: { width: number; height: number },\n): number {\n    const baseWidth = canvasSize.width ?? 400;\n    const baseHeight = canvasSize.height ?? 320;\n    const baseRefSize = 300;\n    const sizeRatio = Math.max(baseWidth, baseHeight) / baseRefSize;\n    const defaultStep = Math.round(20 * Math.max(1, sizeRatio));\n    let panelHeight = baseHeight;\n    if (yCardinality > 0) {\n        const pressure = (yCardinality * defaultStep) / baseHeight;\n        if (pressure > 1) {\n            const stretch = Math.min(2, Math.pow(pressure, 0.5));\n            panelHeight = Math.round(baseHeight * stretch);\n        }\n    }\n    return panelHeight;\n}\n\n/**\n * Horizontal bar pyramid: y category labels sit inside the grid on the left, so x=0 is not at the\n * geometric grid midpoint. Estimate inset L, then zero-line px zX = gl + L + (gw-L)/2.\n */\nfunction estimatePyramidYCategoryInsetPx(option: any, gw: number): number {\n    const data = option.yAxis?.data;\n    if (!Array.isArray(data) || data.length === 0) return 0;\n    const maxLen = Math.max(...data.map((d: any) => String(d).length), 1);\n    const est = Math.round(8 + maxLen * 7.5 + 4);\n    return Math.min(Math.max(0, est), Math.floor(gw * 0.45));\n}\n\n/** Symmetric “nice” max for pyramid x (e.g. 573260 → 600000). */\nfunction pyramidNiceSymmetricMax(absMax: number): number {\n    if (!Number.isFinite(absMax) || absMax <= 0) return 1;\n    const exp = Math.floor(Math.log10(absMax));\n    const f = absMax / 10 ** exp;\n    let ceilF: number;\n    if (f <= 1) ceilF = 1;\n    else if (f <= 2) ceilF = 2;\n    else if (f <= 3) ceilF = 3;\n    else if (f <= 5) ceilF = 5;\n    else if (f <= 6) ceilF = 6;\n    else if (f <= 10) ceilF = 10;\n    else ceilF = 10;\n    return ceilF * 10 ** exp;\n}\n\n/** Tick step so labels land on round values (prefer 200k steps when max is 600k). */\nfunction pyramidNiceTickStep(niceMax: number): number {\n    const candidates = [1, 2, 2.5, 5, 10].flatMap(m => [m, m * 10, m * 100, m * 1000, m * 10000, m * 100000, m * 1000000]);\n    const sorted = [...new Set(candidates)].filter(s => s > 0 && s <= niceMax / 2).sort((a, b) => b - a);\n    for (const step of sorted) {\n        const n = niceMax / step;\n        if (n >= 2 && n <= 8 && Number.isInteger(n)) return step;\n    }\n    return niceMax / 4;\n}\n\n/**\n * Grouped boxplot needs enough per-category horizontal room; otherwise boxes overlap.\n * Return a conservative minimum plot width for category x-axis grouped boxplots.\n */\nfunction estimateGroupedBoxplotMinPlotWidth(option: any, layout: LayoutResult): number {\n    if (option?.xAxis?.type !== 'category' || !Array.isArray(option?.series)) return 0;\n    const boxplotSeriesCount = option.series.filter((s: any) => s?.type === 'boxplot').length;\n    if (boxplotSeriesCount <= 1) return 0;\n\n    let categoryCount = Array.isArray(option.xAxis?.data) ? option.xAxis.data.length : 0;\n    if (categoryCount <= 0 && layout.xNominalCount > 0) {\n        categoryCount = Math.max(1, Math.round(layout.xNominalCount / boxplotSeriesCount));\n    }\n    if (categoryCount <= 0) return 0;\n\n    const MIN_BOX_WIDTH = 10;\n    const MIN_INNER_GAP = 3;\n    const SIDE_PADDING = 6;\n    const perCategoryWidth =\n        boxplotSeriesCount * MIN_BOX_WIDTH\n        + (boxplotSeriesCount - 1) * MIN_INNER_GAP\n        + SIDE_PADDING * 2;\n    return categoryCount * perCategoryWidth;\n}\n\n/**\n * Channel captions: Direct at grid left quarter. Partner uses mostly geometric right quarter\n * (centerX + gw/4); a small blend toward inner positive-half center avoids mirroring about\n * zero (2*zX - directX), which pushes Partner too far right.\n */\nfunction placePyramidChannelHeaders(option: any): void {\n    const hdr = option._pyramidChannelHeader;\n    if (!hdr || !option.grid) return;\n    const cw = Number(option._width);\n    if (!Number.isFinite(cw) || cw <= 0) return;\n    delete option._pyramidChannelHeader;\n\n    const gl = Number(option.grid.left) || 0;\n    const gr = Number(option.grid.right) || 0;\n    const gt = Number(option.grid.top) || 0;\n    const gw = Math.max(0, cw - gl - gr);\n    const centerX = gl + gw / 2;\n    const dx = gw / 4;\n    const topY = Math.max(4, gt - 10);\n\n    const L = estimatePyramidYCategoryInsetPx(option, gw);\n    const innerW = Math.max(gw - L, 1);\n    const zX = gl + L + innerW / 2;\n\n    const style = {\n        fontSize: 11,\n        fontWeight: 'bold' as const,\n        fill: '#555',\n        textAlign: 'center' as const,\n        textVerticalAlign: 'bottom' as const,\n    };\n\n    if (hdr.mode === 'single') {\n        option.graphic = [{ type: 'text', left: zX, top: topY, z: 100, style: { ...style, text: hdr.text } }];\n    } else {\n        const directX = centerX - dx;\n        const geoPartnerX = centerX + dx;\n        const innerPartnerX = zX + innerW / 4;\n        const partnerX = 0.9 * geoPartnerX - 0.02 * innerPartnerX;\n        option.graphic = [\n            { type: 'text', left: directX, top: topY, z: 100, style: { ...style, text: hdr.left } },\n            { type: 'text', left: partnerX, top: topY, z: 100, style: { ...style, text: hdr.right } },\n        ];\n    }\n}\n\nexport function ecApplyLayoutToSpec(\n    option: any,\n    context: InstantiateContext,\n    warnings: ChartWarning[],\n): void {\n    const { channelSemantics, layout, canvasSize } = context;\n\n    // ── Axis-less chart types (pie, radar) ────────────────────────────────\n    // These set their own _width/_height and need no grid/axis processing.\n    const hasAxes = !!(option.xAxis || option.yAxis);\n\n    // ── Zero-baseline and domain padding (value axes) ───────────────────────\n    // Unify zero-baseline and domainPadFraction for all axis-based charts\n    // (including bar); VL does this in vlApplyLayoutToSpec.\n    for (const axis of ['x', 'y'] as const) {\n        const axisObj = option[`${axis}Axis`];\n        if (!axisObj || axisObj.type !== 'value') continue;\n        const cs = channelSemantics[axis];\n        if (!cs?.zero) continue;\n        const decision = cs.zero;\n        if (axisObj.scale === undefined) {\n            axisObj.scale = !decision.zero; // false = include zero, true = data-fit\n        }\n        if (!decision.zero && decision.domainPadFraction > 0 && cs.field) {\n            // Range bands (range area) and span marks (gantt) carry a second\n            // positional bound on the SAME axis: x2 / y2. The fitted domain must\n            // cover both bounds, otherwise the upper edge of the band (or the end\n            // of a span) is clipped. Include the paired field's values when present.\n            const pairField =\n                axis === 'y' ? channelSemantics.y2?.field\n                    : axis === 'x' ? channelSemantics.x2?.field\n                        : undefined;\n            const domainFields = pairField ? [cs.field, pairField] : [cs.field];\n            const numericValues = context.table\n                .flatMap((r: any) => domainFields.map((f) => r[f]))\n                .filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            const padded = computePaddedDomain(numericValues, decision.domainPadFraction);\n            if (padded) {\n                axisObj.min = padded[0];\n                axisObj.max = padded[1];\n            }\n        }\n    }\n\n    // ── Banded continuous axis domain (e.g. heatmap) ──────────────────────\n    // Half-step padding so edge cells are not clipped.\n    // Only apply to value axes — category/time axes (e.g. bar with temporal\n    // categories) should not receive numeric min/max, otherwise ECharts will\n    // window the category index range and hide all bars.\n    for (const axis of ['x', 'y'] as const) {\n        const bandedCount = axis === 'x' ? layout.xContinuousAsDiscrete : layout.yContinuousAsDiscrete;\n        if (bandedCount <= 1) continue;\n        const axisObj = option[`${axis}Axis`];\n        if (!axisObj || axisObj.type !== 'value' || axisObj.min != null) continue;\n        const cs = channelSemantics[axis];\n        if (!cs?.field || (cs.type !== 'quantitative' && cs.type !== 'temporal')) continue;\n        const isTemporal = cs.type === 'temporal';\n        const numericVals = context.table\n            .map((r: any) => {\n                const raw = r[cs.field];\n                if (raw == null) return NaN;\n                return isTemporal ? +new Date(raw) : +raw;\n            })\n            .filter((v: number) => !isNaN(v));\n        if (numericVals.length <= 1) continue;\n        const minVal = Math.min(...numericVals);\n        const maxVal = Math.max(...numericVals);\n        const dataRange = maxVal - minVal;\n        if (dataRange === 0) continue;\n        const pad = dataRange / (bandedCount - 1) / 2;\n        axisObj.min = minVal - pad;\n        axisObj.max = maxVal + pad;\n    }\n\n    // ── Axis title positioning ───────────────────────────────────────────\n    // Ensure axis names are centered (VL default), not at the endpoint.\n    if (option.xAxis) {\n        if (option.xAxis.name) {\n            option.xAxis.nameLocation = option.xAxis.nameLocation || 'middle';\n            option.xAxis.nameGap = option.xAxis.nameGap || 25;\n            option.xAxis.nameTextStyle = { fontSize: layout.titleFontSize, ...(option.xAxis.nameTextStyle || {}) };\n        }\n    }\n    if (option.yAxis) {\n        if (option.yAxis.name) {\n            option.yAxis.nameLocation = option.yAxis.nameLocation || 'middle';\n            option.yAxis.nameGap = option.yAxis.nameGap || 45;\n            option.yAxis.nameTextStyle = { fontSize: layout.titleFontSize, ...(option.yAxis.nameTextStyle || {}) };\n        }\n    }\n\n    // ── singleAxis title styling (themeRiver / streamgraph) ──────────────\n    if (option.singleAxis) {\n        if (option.singleAxis.name) {\n            option.singleAxis.nameLocation = option.singleAxis.nameLocation || 'middle';\n            option.singleAxis.nameGap = option.singleAxis.nameGap || 25;\n            option.singleAxis.nameTextStyle = { fontSize: layout.titleFontSize, ...(option.singleAxis.nameTextStyle || {}) };\n        }\n        if (!option.singleAxis.axisLabel) option.singleAxis.axisLabel = {};\n        option.singleAxis.axisLabel.fontSize = option.singleAxis.axisLabel.fontSize || layout.xLabel.fontSize;\n    }\n\n    // ── Legend positioning ────────────────────────────────────────────────\n    const hasLegend = !!option.legend;\n    const hasVisualMap = !!option.visualMap;\n    // Dual legend: when both a categorical legend and a visualMap (continuous\n    // size/color legend) coexist, move the categorical legend to the bottom\n    // to avoid crowding the right side of the chart.\n    const isDualLegend = hasLegend && hasVisualMap;\n    if (hasLegend) {\n        // If the template already fully positioned the legend (e.g. pie),\n        // skip repositioning — detect by checking if orient was already set.\n        const alreadyPositioned = option.legend.orient && (option.legend.right !== undefined || option.legend.left !== undefined);\n        // Derive a default legend title from semantics when templates don't set one explicitly.\n        let legendTitle = option._legendTitle as string | undefined;\n        if (legendTitle == null) {\n            const colorField = (channelSemantics as any)?.color?.field;\n            const groupField = (channelSemantics as any)?.group?.field;\n            legendTitle = colorField || groupField;\n        }\n        if (legendTitle != null) delete option._legendTitle;\n        if (!alreadyPositioned) {\n            const rawLegendData = option.legend.data || [];\n            const legendLabels: string[] = rawLegendData.map((d: any) => typeof d === 'string' ? d : (d?.name ?? ''));\n\n            if (isDualLegend) {\n                const highCardinality = legendLabels.length >= 16;\n                option._legendWidth = 0; // no right-side space needed for the legend\n                option.legend = {\n                    ...option.legend,\n                    bottom: 0,\n                    left: 'center',\n                    orient: 'horizontal',\n                    textStyle: {\n                        fontSize: highCardinality ? 8 : layout.legendFontSize,\n                        ...(option.legend.textStyle || {}),\n                    },\n                    ...(legendLabels.length > 10 ? { type: 'scroll' } : {}),\n                    ...(highCardinality ? { itemWidth: 12, itemHeight: 12 } : {}),\n                };\n                if (legendTitle != null) {\n                    const titleGraphic = {\n                        type: 'text' as const,\n                        bottom: 22,\n                        left: 'center',\n                        z: 100,\n                        style: {\n                            text: legendTitle,\n                            fontSize: layout.legendFontSize,\n                            fontWeight: 'bold',\n                            fill: '#333',\n                            textAlign: 'center',\n                        },\n                    };\n                    const existing = option.graphic;\n                    option.graphic = Array.isArray(existing) ? [...existing, titleGraphic] : (existing ? [existing, titleGraphic] : [titleGraphic]);\n                }\n            } else {\n                // Single legend: use left positioning so title and legend circles share the same left edge\n                const maxLabelLen = Math.max(...legendLabels.map((l: string) => l.length), 3);\n                const highCardinality = legendLabels.length >= 16;\n                const legendSymbolWidth = highCardinality ? 12 : 14;\n                const legendItemGap = 5;\n                const estimatedTextWidth = Math.min(120, maxLabelLen * 7 + 30);\n                option._legendWidth = legendSymbolWidth + legendItemGap + estimatedTextWidth;\n                const LEGEND_GAP = 12;\n                const CANVAS_BUFFER = 16;\n                const rightMarginPx = option._legendWidth + LEGEND_GAP + CANVAS_BUFFER;\n                const hasYTitle = !!option.yAxis?.name;\n                const gridLeft = (hasYTitle ? 70 : 50) + CANVAS_BUFFER;\n                // Use same effective plot width as canvas block (grouped bar/boxplot widen the plot) so legend does not overlap chart\n                let plotW = layout?.subplotWidth ?? canvasSize?.width ?? 400;\n                const xIsDiscreteForLegend = layout.xNominalCount > 0 || layout.xContinuousAsDiscrete > 0;\n                if (xIsDiscreteForLegend) {\n                    let xItemCount = layout.xNominalCount || layout.xContinuousAsDiscrete || 0;\n                    if (layout.xStepUnit === 'group' && option.series && Array.isArray(option.series) && layout.xNominalCount > 0) {\n                        const barSeriesCount = option.series.filter((s: any) => s.type === 'bar').length || option.series.length;\n                        if (barSeriesCount > 0) {\n                            xItemCount = Math.max(1, Math.round(layout.xNominalCount / barSeriesCount));\n                        }\n                    }\n                    plotW = xItemCount > 0 ? layout.xStep * xItemCount : plotW;\n                }\n                const boxplotMinWForLegend = estimateGroupedBoxplotMinPlotWidth(option, layout);\n                if (boxplotMinWForLegend > 0) {\n                    plotW = Math.max(plotW, boxplotMinWForLegend);\n                }\n                const effectiveChartWidth = plotW + gridLeft + rightMarginPx;\n                const legendLeftPx = Math.max(0, effectiveChartWidth - rightMarginPx);\n                option.legend = {\n                    ...option.legend,\n                    top: legendTitle != null ? 20 : 0,\n                    left: legendLeftPx,\n                    orient: option.legend.orient || 'vertical',\n                    align: 'left', // icon on left, text on right\n                    textStyle: {\n                        fontSize: highCardinality ? 8 : layout.legendFontSize,\n                        ...(option.legend.textStyle || {}),\n                    },\n                    ...(legendLabels.length > 10 ? { type: 'scroll' } : {}),\n                    ...(highCardinality ? { itemWidth: 12, itemHeight: 12 } : {}),\n                };\n                if (legendTitle != null) {\n                    const titleGraphic = {\n                        type: 'text' as const,\n                        left: legendLeftPx,\n                        top: 4,\n                        z: 100,\n                        style: {\n                            text: legendTitle,\n                            fontSize: layout.legendFontSize,\n                            fontWeight: 'bold',\n                            fill: '#333',\n                            textAlign: 'left',\n                        },\n                    };\n                    const existing = option.graphic;\n                    option.graphic = Array.isArray(existing) ? [...existing, titleGraphic] : (existing ? [existing, titleGraphic] : [titleGraphic]);\n                }\n            }\n        } else {\n            // Already positioned — estimate width for grid margin\n            const rawData = option.legend.data || [];\n            const legendLabels = rawData.map((d: any) => typeof d === 'string' ? d : (d?.name ?? ''));\n            const maxLabelLen = Math.max(...legendLabels.map((l: string) => l.length), 3);\n            option._legendWidth = Math.min(150, maxLabelLen * 7 + 30);\n        }\n    }\n\n    // ── Grid sizing ──────────────────────────────────────────────────────\n    // ECharts uses an explicit grid with left/right/top/bottom margins.\n    // Unlike VL where width/height set the *plot area* and the SVG wraps\n    // around it, ECharts' width/height set the *total canvas* and the grid\n    // sits inside.  We define explicit grid margins and inflate the canvas\n    // so that the inner plot area matches the intended subplot dimensions.\n    //\n    // Skip grid processing for axis-less charts (pie, radar) which handle\n    // their own sizing in their template instantiate() methods.\n    const hasXTitle = !!option.xAxis?.name;\n    const hasYTitle = !!option.yAxis?.name;\n    // ECharts init() creates an internal div with overflow:hidden at the\n    // exact _width × _height pixel dimensions.  Adding a small buffer to\n    // each grid margin keeps the plot area unchanged but gives breathing\n    // room for axis labels / legends / ticks that extend to the canvas edge.\n    const CANVAS_BUFFER = 16;\n    const LEGEND_GAP = 12; // gap between plot and legend/visualMap so they don't overlap\n    const VISUALMAP_GAP = 18; // extra gap between plot and visualMap bar when only visualMap (no legend)\n    const VISUALMAP_RIGHT_OFFSET = 10; // must match scatter (and other templates) visualMap right position\n    const legendWidth = (hasLegend ? (option._legendWidth || 120) : 20);\n    const visualMapWidth = (option._visualMapWidth as number) || 0;\n    if (visualMapWidth) delete option._visualMapWidth;\n    // When dual legend (segment at bottom + size/color bar on right), reserve right space so plot does not overlap visualMap\n    const rightMargin =\n        isDualLegend\n            ? (hasVisualMap ? VISUALMAP_RIGHT_OFFSET + visualMapWidth + VISUALMAP_GAP : 10)\n            : (hasLegend ? legendWidth : (hasVisualMap ? visualMapWidth + VISUALMAP_GAP : 10)) + LEGEND_GAP;\n    const bottomLegendExtra = isDualLegend ? 30 : 0;\n\n    const gridMargin = {\n        left: (hasYTitle ? 70 : 50) + CANVAS_BUFFER,\n        right: rightMargin + CANVAS_BUFFER,\n        top: 20 + CANVAS_BUFFER,\n        bottom: (hasXTitle ? 45 : 30) + CANVAS_BUFFER + bottomLegendExtra,\n    };\n    if (hasAxes) {\n        if (!option.grid) option.grid = {};\n        option.grid.left = gridMargin.left;\n        option.grid.right = gridMargin.right;\n        option.grid.top = gridMargin.top;\n        option.grid.bottom = gridMargin.bottom;\n    }\n\n    // ── Canvas dimensions ────────────────────────────────────────────────\n    // For axis-less charts (pie, radar), _width/_height are set by the\n    // template itself.  Only compute for axis-based charts.\n    if ((hasAxes || option.singleAxis) && !option._width) {\n        // For discrete axes, VL uses width:{step:N} which auto-sizes the plot.\n        // ECharts has no such feature — we derive the plot size from layout.\n        //\n        // For non-grouped discrete axes: plotWidth = xStep × categoryCount\n        // For grouped discrete axes (stepUnit='group'): the step already\n        //   accounts for multiple bars per category, but xNominalCount includes\n        //   the group multiplier.  Use subplotWidth which is already correct.\n        // For continuous axes: use subplotWidth directly.\n        const xIsDiscrete = layout.xNominalCount > 0 || layout.xContinuousAsDiscrete > 0;\n        const yIsDiscrete = layout.yNominalCount > 0 || layout.yContinuousAsDiscrete > 0;\n\n        let plotWidth: number;\n        let plotHeight: number;\n\n        if (xIsDiscrete) {\n            // For grouped discrete axes (stepUnit='group'), layout.xNominalCount\n            // typically includes the group multiplier (categories × seriesCount).\n            // To mimic Vega-Lite's width:{step} behaviour (canvas grows with the\n            // number of *categories*), derive an approximate category count\n            // from the series when possible.\n            let xItemCount = layout.xNominalCount || layout.xContinuousAsDiscrete || 0;\n            if (layout.xStepUnit === 'group' && option.series && Array.isArray(option.series) && layout.xNominalCount > 0) {\n                const barSeriesCount = option.series.filter((s: any) => s.type === 'bar').length || option.series.length;\n                if (barSeriesCount > 0) {\n                    xItemCount = Math.max(1, Math.round(layout.xNominalCount / barSeriesCount));\n                }\n            }\n            plotWidth = xItemCount > 0 ? layout.xStep * xItemCount : (layout.subplotWidth || canvasSize.width);\n            const boxplotMinW = estimateGroupedBoxplotMinPlotWidth(option, layout);\n            if (boxplotMinW > 0) {\n                plotWidth = Math.max(plotWidth, boxplotMinW);\n            }\n        } else {\n            // Continuous axis — subplotWidth is already correct\n            plotWidth = layout.subplotWidth || canvasSize.width;\n        }\n\n        if (yIsDiscrete && layout.yStepUnit !== 'group') {\n            const yItemCount = layout.yNominalCount || layout.yContinuousAsDiscrete || 0;\n            plotHeight = yItemCount > 0 ? layout.yStep * yItemCount : (layout.subplotHeight || canvasSize.height);\n        } else {\n            plotHeight = layout.subplotHeight || canvasSize.height;\n        }\n\n        if (context.chartType === 'Pyramid Chart' && yIsDiscrete && layout.yStepUnit !== 'group') {\n            const yItemCount = layout.yNominalCount || layout.yContinuousAsDiscrete || 0;\n            if (yItemCount > 0) {\n                plotHeight = Math.max(\n                    plotHeight,\n                    pyramidPanelHeightMatchVegaLite(yItemCount, canvasSize),\n                );\n            }\n        }\n\n        option._width = plotWidth + gridMargin.left + gridMargin.right;\n        option._height = plotHeight + gridMargin.top + gridMargin.bottom;\n    }\n\n    if (context.chartType === 'Pyramid Chart') {\n        placePyramidChannelHeaders(option);\n    }\n\n    // ── Bar sizing ───────────────────────────────────────────────────────\n    // ECharts needs barCategoryGap / barWidth to match the step layout.\n    // VL pads *inside* the step (bandwidth = step × (1 − paddingInner)),\n    // while ECharts uses barCategoryGap as a percentage of the category\n    // slot.  For single/stacked bars we use barCategoryGap only —\n    // letting ECharts auto-size bars proportionally to the grid width.\n    // For grouped bars we need explicit barWidth per series.\n    if (option.series && Array.isArray(option.series)) {\n        const barSeries = option.series.filter((s: any) => s.type === 'bar');\n        if (barSeries.length > 0) {\n            const catAxis = option.xAxis?.type === 'category' ? 'x' : 'y';\n            const step = catAxis === 'x' ? layout.xStep : layout.yStep;\n            const stepUnit = catAxis === 'x' ? layout.xStepUnit : layout.yStepUnit;\n            const isStacked = barSeries.some((s: any) => s.stack != null);\n            // Pyramid: two mirrored horizontal bars must fully overlap per category\n            // (barGap: '-100%'), not grouped-bar side-by-side layout.\n            const isPyramidMirror =\n                context.chartType === 'Pyramid Chart' && barSeries.length === 2 && !isStacked;\n            // Rose: polar categorical bars — never use Cartesian grouped-barWidth (would split each\n            // angle into N thin slots when multiple series existed, or mis-size if layout sees >1 bar).\n            const isRosePolar =\n                context.chartType === 'Rose Chart'\n                && barSeries.every((s: any) => s.coordinateSystem === 'polar');\n\n            if (step > 0) {\n                const bandPadding = layout.stepPadding;\n                const catGapPct = `${Math.round(bandPadding * 100)}%`;\n\n                if (!isStacked && (stepUnit === 'group' || barSeries.length > 1) && !isPyramidMirror && !isRosePolar) {\n                    // Grouped: each bar gets an equal share of the usable band.\n                    // Use (seriesCount + 1) so total bar width stays strictly inside the slot and bars不会互相挤压重叠.\n                    const usableStep = step * (1 - bandPadding);\n                    const barW = Math.max(1, Math.floor(usableStep / (barSeries.length + 1)));\n                    for (const s of barSeries) {\n                        s.barWidth = barW;\n                        s.barGap = '0%';\n                    }\n                    barSeries[0].barCategoryGap = catGapPct;\n                } else {\n                    // Single series or stacked: let ECharts auto-size bars.\n                    // barCategoryGap controls the fraction of each slot\n                    // reserved for inter-category gap.\n                    for (const s of barSeries) {\n                        s.barCategoryGap = catGapPct;\n                    }\n                    if (isPyramidMirror) {\n                        for (const s of barSeries) {\n                            s.barGap = '-100%';\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // ── X-axis label sizing ──────────────────────────────────────────────\n    if (option.xAxis && layout.xLabel) {\n        if (!option.xAxis.axisLabel) option.xAxis.axisLabel = {};\n\n        // Category axis: templates (line, heatmap, bar) set rotate by label type (numeric vs non-numeric). Preserve it.\n        // Time axis: line chart sets rotate 90 for date labels; preserve that too.\n        const templateRotate = option.xAxis.axisLabel.rotate;\n        const isCategoryX = option.xAxis.type === 'category';\n        const isTimeX = option.xAxis.type === 'time';\n        const preserveTemplateRotate =\n            (isCategoryX && (templateRotate === 0 || templateRotate === 90)) ||\n            (isTimeX && templateRotate === 90);\n        if (layout.xLabel.labelAngle != null && layout.xLabel.labelAngle !== 0 && !preserveTemplateRotate) {\n            option.xAxis.axisLabel.rotate = -layout.xLabel.labelAngle;  // VL convention → EC convention\n        }\n\n        if (layout.xLabel.fontSize) {\n            option.xAxis.axisLabel.fontSize = layout.xLabel.fontSize;\n        }\n\n        if (layout.xLabel.labelLimit && layout.xLabel.labelLimit < 100) {\n            const maxLen = layout.xLabel.labelLimit;\n            option.xAxis.axisLabel.formatter = (value: string) => {\n                if (typeof value === 'string' && value.length > maxLen) {\n                    return value.substring(0, maxLen) + '…';\n                }\n                return value;\n            };\n        }\n    }\n\n    // ── Adjust bottom margin for rotated x-axis labels ──────────────────\n    // When x-axis labels are rotated (especially 90°), increase nameGap and\n    // grid.bottom to prevent overlap between rotated labels and axis title.\n    if (option.xAxis && option.grid && option.xAxis.axisLabel) {\n        const rotate = Math.abs(option.xAxis.axisLabel.rotate || 0);\n        if (rotate >= 45) {\n            const labelFontSize = option.xAxis.axisLabel.fontSize || 11;\n            // Estimate the rotated-label height from the *actual* longest category\n            // label rather than the generic labelLimit. The latter over-reserves\n            // bottom space for short labels (e.g. \"Jan\", \"Mon\"), which pushes\n            // bottom-anchored visualMaps / legends far below the plot.\n            const labelLimit = layout.xLabel?.labelLimit || 20;\n            const categoryData = Array.isArray(option.xAxis.data) ? option.xAxis.data : undefined;\n            const actualMaxChars = categoryData && categoryData.length > 0\n                ? Math.max(...categoryData.map((d: any) => String(d?.value ?? d ?? '').length))\n                : labelLimit;\n            const maxChars = Math.min(actualMaxChars, labelLimit);\n            const estimatedLabelWidth = maxChars * labelFontSize * 0.6;\n            const rotatedHeight = Math.min(estimatedLabelWidth, 120);\n            const extraBottom = Math.max(0, rotatedHeight - 30);\n            if (extraBottom > 0) {\n                option.grid.bottom = (option.grid.bottom || 61) + extraBottom;\n                if (option.xAxis.name) {\n                    option.xAxis.nameGap = (option.xAxis.nameGap || 25) + extraBottom;\n                }\n                if (option._height) {\n                    option._height = (option._height as number) + extraBottom;\n                }\n            }\n        }\n    }\n\n    // ── Y-axis label sizing ──────────────────────────────────────────────\n    if (option.yAxis && layout.yLabel) {\n        if (!option.yAxis.axisLabel) option.yAxis.axisLabel = {};\n\n        // Don't override category axis rotate — scatter keeps y labels horizontal (0) to avoid overlap.\n        if (layout.yLabel.labelAngle && layout.yLabel.labelAngle !== 0 && option.yAxis.type !== 'category') {\n            option.yAxis.axisLabel.rotate = -layout.yLabel.labelAngle;\n        }\n        if (layout.yLabel.fontSize) {\n            option.yAxis.axisLabel.fontSize = layout.yLabel.fontSize;\n        }\n    }\n\n    // Pyramid: keep x (value) and y (category) axis chrome aligned (line/tick/label).\n    if (context.chartType === 'Pyramid Chart') {\n        const lineStyle = { color: '#333', width: 1 };\n        const tickStyle = { color: '#333', width: 1 };\n        if (option.xAxis?.type === 'value') {\n            const xAxis = option.xAxis;\n            const rawAbs = Math.max(\n                Math.abs(Number(xAxis.min) || 0),\n                Math.abs(Number(xAxis.max) || 0),\n            );\n            if (rawAbs > 0 && Number.isFinite(rawAbs)) {\n                const nice = pyramidNiceSymmetricMax(rawAbs);\n                xAxis.min = -nice;\n                xAxis.max = nice;\n                xAxis.interval = pyramidNiceTickStep(nice);\n            }\n            xAxis.axisLine = { show: true, lineStyle: lineStyle, ...(xAxis.axisLine || {}) };\n            xAxis.axisLine.show = true;\n            xAxis.axisTick = {\n                show: true,\n                length: 6,\n                lineStyle: tickStyle,\n                ...(typeof xAxis.axisTick === 'object' ? xAxis.axisTick : {}),\n            };\n            xAxis.axisTick.show = true;\n            if (!xAxis.axisLabel) xAxis.axisLabel = {};\n            if (xAxis.axisLabel.fontSize == null) xAxis.axisLabel.fontSize = 11;\n            if (xAxis.axisLabel.color == null) xAxis.axisLabel.color = '#333';\n            if (!xAxis.nameTextStyle) xAxis.nameTextStyle = { fontSize: 12, color: '#333' };\n        }\n        if (option.yAxis?.type === 'category') {\n            const yAxis = option.yAxis;\n            if (yAxis.boundaryGap === undefined) yAxis.boundaryGap = true;\n            yAxis.axisLine = {\n                show: true,\n                onZero: false,\n                lineStyle,\n                ...(typeof yAxis.axisLine === 'object' && yAxis.axisLine ? yAxis.axisLine : {}),\n            };\n            yAxis.axisLine.show = true;\n            yAxis.axisTick = {\n                show: true,\n                alignWithLabel: true,\n                interval: 0,\n                length: 6,\n                lineStyle: tickStyle,\n                ...(typeof yAxis.axisTick === 'object' && yAxis.axisTick ? yAxis.axisTick : {}),\n            };\n            yAxis.axisTick.show = true;\n            if (!yAxis.axisLabel) yAxis.axisLabel = {};\n            if (yAxis.axisLabel.fontSize == null) yAxis.axisLabel.fontSize = 11;\n            if (yAxis.axisLabel.color == null) yAxis.axisLabel.color = '#333';\n            if (!yAxis.nameTextStyle) yAxis.nameTextStyle = { fontSize: 12, color: '#333' };\n        }\n    }\n\n    // ── Ordinal temporal: category axes with date-like labels ──────────────\n    // VL applyOrdinalTemporalFormat: format nominal/ordinal axis as dates when data looks like dates.\n    for (const axis of ['x', 'y'] as const) {\n        const axisObj = option[`${axis}Axis`];\n        if (!axisObj || axisObj.type !== 'category') continue;\n        const cs = channelSemantics[axis];\n        if (!cs?.field || (cs.type !== 'nominal' && cs.type !== 'ordinal')) continue;\n        const semanticType = toTypeString(context.semanticTypes[cs.field]);\n        if (getVisCategory(semanticType) !== 'temporal') continue;\n        const fieldVals = context.table.map((r: any) => r[cs.field]).filter((v: any) => v != null);\n        const datelikeCnt = fieldVals.filter((v: any) =>\n            typeof v !== 'string' || looksLikeDateString(String(v))\n        ).length;\n        if (datelikeCnt < fieldVals.length * 0.5) continue;\n        const analysis = analyzeTemporalField(fieldVals);\n        if (!analysis) continue;\n        const votes = computeDataVotes(analysis.same);\n        const semLevel = SEMANTIC_LEVEL[semanticType];\n        if (semLevel !== undefined) votes[semLevel] += 3;\n        const { level, score } = pickBestLevel(votes);\n        if (score < 5) continue;\n        const fmt = levelToFormat(level, analysis);\n        if (!fmt) continue;\n        if (!axisObj.axisLabel) axisObj.axisLabel = {};\n        const existingFormatter = axisObj.axisLabel.formatter;\n        axisObj.axisLabel.formatter = (value: string) => {\n            const formatted = formatCategoryTemporal(value, fmt);\n            return typeof existingFormatter === 'function' ? existingFormatter(formatted) : formatted;\n        };\n    }\n\n    // ── Temporal format (time / value axes) ──────────────────────────────\n    for (const axis of ['x', 'y'] as const) {\n        const cs = channelSemantics[axis];\n        if (cs?.temporalFormat && option[`${axis}Axis`]) {\n            const axisObj = option[`${axis}Axis`];\n            if (axisObj.type === 'time') {\n                if (!axisObj.axisLabel) axisObj.axisLabel = {};\n                axisObj.axisLabel.formatter = convertTemporalFormat(cs.temporalFormat);\n            }\n            if (axisObj.type === 'value' && cs.type === 'temporal') {\n                // Bar (and similar) repurpose temporal channel as count → axis shows numbers, not dates\n                if (axisObj.name === 'Count') continue;\n                if (!axisObj.axisLabel) axisObj.axisLabel = {};\n                const fmt = cs.temporalFormat;\n                axisObj.axisLabel.formatter = (val: number) => formatTimestamp(val, fmt);\n            }\n        }\n    }\n\n    // ── Clean axis numeric fields (min/max/interval) to avoid long floats ─\n    for (const axisKey of ['xAxis', 'yAxis'] as const) {\n        const axisVal = (option as any)[axisKey];\n        if (Array.isArray(axisVal)) {\n            axisVal.forEach(cleanAxisNumericFields);\n        } else {\n            cleanAxisNumericFields(axisVal);\n        }\n    }\n\n    // ── Tooltip category as temporal (line/area/bar axis tooltip) ─────────\n    const enc = option._encodingTooltip;\n    if (enc?.trigger === 'axis' && enc.categoryLabel != null && option.xAxis?.type === 'time') {\n        const xFmt = channelSemantics?.x?.temporalFormat;\n        if (xFmt) {\n            option._encodingTooltip = { ...enc, categoryFormat: 'temporal', temporalFormat: xFmt };\n        }\n    }\n\n    // ── Color scheme ─────────────────────────────────────────────────────\n    // Use palette derived from backend-agnostic colorDecisions when present.\n    const visualMapOwnsSeriesColor = context.chartType === 'Heatmap' && !!option.visualMap;\n    const decisions: ColorDecisionResult | undefined = context.colorDecisions;\n    const colorDecision = decisions ? (decisions.color ?? decisions.group) : undefined;\n    let effectivePalette: string[] | undefined;\n    if (decisions && colorDecision) {\n        let palette: string[] | undefined;\n        const isCategoricalScheme = colorDecision.schemeType === 'categorical';\n\n        // 对于 categorical：沿用原有逻辑（cat10/cat20 等）。\n        if (isCategoricalScheme) {\n            const fromResolved =\n                context.resolvedEncodings?.color?.colorPalette\n                ?? context.resolvedEncodings?.group?.colorPalette;\n\n            if (colorDecision.schemeId) {\n                const fromRegistry = getPaletteForScheme(colorDecision.schemeId);\n                if (fromRegistry && fromRegistry.length > 0) {\n                    palette = fromRegistry;\n                }\n            }\n            if (!palette) {\n                const targetId =\n                    (colorDecision.categoryCount ?? 0) > 10\n                        ? 'cat20'\n                        : 'cat10';\n                palette = getPaletteForScheme(targetId)\n                    ?? (fromResolved && fromResolved.length > 0 ? fromResolved : DEFAULT_COLORS);\n            }\n        } else {\n            // 对于 sequential/diverging（包括 Rank 数值型）：\n            //   - 若有显式 schemeId，则先尝试对应的连续色带；\n            //   - 否则根据类型自动挑选连续 palette（如 viridis / RdBu），\n            //     以便后续 Rank 颜色采样在连续 colormap 上进行。\n            if (colorDecision.schemeId) {\n                const fromRegistry = getPaletteForScheme(colorDecision.schemeId);\n                if (fromRegistry && fromRegistry.length > 0) {\n                    palette = fromRegistry;\n                }\n            }\n            if (!palette) {\n                if (colorDecision.schemeType === 'sequential') {\n                    palette = getPaletteForScheme('viridis') ?? DEFAULT_COLORS;\n                } else if (colorDecision.schemeType === 'diverging') {\n                    palette = getPaletteForScheme('RdBu') ?? DEFAULT_COLORS;\n                } else {\n                    palette = DEFAULT_COLORS;\n                }\n            }\n        }\n\n        if (palette && palette.length) {\n            option.color = [...palette];\n            effectivePalette = palette;\n        }\n    } else {\n        // Back-compat: keep existing behavior when colorDecisions are absent.\n        const colorPalette = context.resolvedEncodings?.color?.colorPalette\n            ?? context.resolvedEncodings?.group?.colorPalette;\n        if (colorPalette?.length) {\n            option.color = [...colorPalette];\n            effectivePalette = colorPalette;\n        }\n    }\n\n    // 若上述两步都没有得到有效 palette，则回退到统一默认：cat10。\n    // 这覆盖「没有显式 color/group 通道」的情况：此时也会有一个稳定的默认调色板，\n    // 从而保证单系列用 cat10[0]，多系列则依次使用 cat10[i]。\n    if (!effectivePalette || effectivePalette.length === 0) {\n        const cat10 = getPaletteForScheme('cat10');\n        if (cat10 && cat10.length > 0) {\n            effectivePalette = cat10;\n            if (!option.color) {\n                option.color = [...cat10];\n            }\n        }\n    }\n\n    if (visualMapOwnsSeriesColor) {\n        delete option.color;\n        effectivePalette = undefined;\n    }\n\n    // 当存在调色板时，覆盖模板中的硬编码 itemStyle.color，\n    // 让最终颜色真正由 colorDecisions / colormap 注册表驱动。\n    if (effectivePalette && effectivePalette.length > 0 && Array.isArray(option.series)) {\n        const palette_ = effectivePalette; // local const so TS narrows inside closures\n        const n = palette_.length;\n        const schemeType = colorDecision?.schemeType;\n\n        // 由 colorDecisions 实际使用的通道（color 或 group）来驱动语义判断，\n        // 这样 Grouped Bar 等只用 group 通道的图表也能正确应用 Rank 等语义。\n        let drivingColorChannel: ChannelSemantics | undefined;\n        if (decisions?.color && channelSemantics.color) {\n            drivingColorChannel = channelSemantics.color;\n        } else if (decisions?.group && channelSemantics.group) {\n            drivingColorChannel = channelSemantics.group;\n        }\n        const colorSemanticType = drivingColorChannel?.semanticAnnotation?.semanticType;\n        const isRankLikeColor = !!colorSemanticType\n            && colorSemanticType === 'Rank';\n        const useEvenSpacing = !isRankLikeColor && (schemeType === 'sequential' || schemeType === 'diverging');\n\n        // 特例：Regression 图表有「散点 + 趋势线」成对系列。\n        // 颜色应该按「类别（legend 项）」而不是「series 索引」消费 palette，\n        // 否则当类别很多时，series 数翻倍会导致 palette 提前回绕，最后一个类别复用第一个颜色。\n        if (context.chartType === 'Regression' && option.legend && Array.isArray(option.legend.data)) {\n            // 1) 建立 legend 类别 → 调色板颜色 的映射\n            const legendLabels: string[] = option.legend.data.map((d: any) =>\n                typeof d === 'string' ? d : (d?.name ?? ''),\n            );\n            const categoryToColor = new Map<string, string>();\n            if (useEvenSpacing) {\n                const spacedLegendIndices = pickEvenlySpacedColorIndices(n, legendLabels.length);\n                legendLabels.forEach((name, i) => {\n                    if (!name) return;\n                    const paletteIndex = spacedLegendIndices[i] ?? (i % n);\n                    categoryToColor.set(name, palette_[paletteIndex]);\n                });\n            } else {\n                let colorIdx = 0;\n                for (const name of legendLabels) {\n                    if (!name) continue;\n                    categoryToColor.set(name, palette_[colorIdx % n]);\n                    colorIdx += 1;\n                }\n            }\n\n            // 2) 为每个 series 赋色：\n            //    - series.name 为 \"Math\" / \"Science\" 等 → 直接查映射；\n            //    - 趋势线系列名为 \"Math (trend)\" → 去掉 \" (trend)\" 后再查映射；\n            //    - 找不到映射时兜底按 series 索引循环 palette。\n            option.series.forEach((s: any, idx: number) => {\n                if (!s) return;\n                const rawName: string = typeof s.name === 'string' ? s.name : '';\n                const baseName = rawName.endsWith(' (trend)')\n                    ? rawName.slice(0, -' (trend)'.length)\n                    : rawName;\n\n                const mappedColor = baseName && categoryToColor.has(baseName)\n                    ? categoryToColor.get(baseName)\n                    : palette_[idx % n];\n\n                s.itemStyle = s.itemStyle || {};\n                s.itemStyle.color = mappedColor!;\n            });\n        } else if (context.chartType === 'Boxplot' && option.legend && Array.isArray(option.legend.data)) {\n            // Boxplot：每个类别有 boxplot + 可选 scatter(outliers)，需按 legend 类别赋同一颜色\n            const legendLabels: string[] = option.legend.data.map((d: any) =>\n                typeof d === 'string' ? d : (d?.name ?? ''),\n            );\n            const categoryToColor = new Map<string, string>();\n            legendLabels.forEach((name, i) => {\n                if (!name) return;\n                categoryToColor.set(name, palette_[i % n]);\n            });\n            option.series.forEach((s: any, idx: number) => {\n                if (!s) return;\n                const rawName: string = typeof s.name === 'string' ? s.name : (s.name != null ? String(s.name) : '');\n                const baseName = rawName.endsWith(' (outliers)')\n                    ? rawName.slice(0, -' (outliers)'.length)\n                    : rawName;\n                const mappedColor = baseName && categoryToColor.has(baseName)\n                    ? categoryToColor.get(baseName)\n                    : palette_[idx % n];\n                s.itemStyle = s.itemStyle || {};\n                s.itemStyle.color = mappedColor!;\n                if (s.type === 'boxplot') {\n                    s.itemStyle.borderColor = mappedColor!;\n                }\n            });\n        } else if (context.chartType === 'Pyramid Chart' && Array.isArray(option.series)) {\n            // ECharts default palette: first = blue (#5470c6), fourth = red (#ee6666) — not adjacent greens.\n            const pal = effectivePalette && effectivePalette.length > 0 ? effectivePalette : DEFAULT_COLORS;\n            const cLeft = pal[0];\n            const cRight = pal.length > 3 ? pal[3] : pal[Math.min(1, pal.length - 1)];\n            let barIdx = 0;\n            for (const s of option.series) {\n                if (!s || s.type !== 'bar') continue;\n                s.itemStyle = s.itemStyle || {};\n                s.itemStyle.color = barIdx === 0 ? cLeft : cRight;\n                barIdx += 1;\n                if (barIdx >= 2) break;\n            }\n        } else if (context.chartType === 'Rose Chart' && Array.isArray(option.series)) {\n            // 无 color：单条 polar bar + data 项带 name；按图例与角标对齐 palette（勿用多 series，否则分组 barWidth 破坏扇形）。\n            const polarBars = option.series.filter(\n                (s: any) => s && s.type === 'bar' && s.coordinateSystem === 'polar',\n            );\n            const stacked = polarBars.some((s: any) => s.stack != null && s.stack !== '');\n            const single = polarBars.length === 1 && !stacked;\n            if (single && Array.isArray(polarBars[0].data)) {\n                const legendLabels: string[] = option.legend?.data?.map((d: any) =>\n                    typeof d === 'string' ? d : (d?.name ?? ''),\n                ) ?? [];\n                const categoryToColor = new Map<string, string>();\n                legendLabels.forEach((name, i) => {\n                    if (!name) return;\n                    categoryToColor.set(name, effectivePalette[i % n]);\n                });\n                const s0 = polarBars[0];\n                s0.data.forEach((item: any, i: number) => {\n                    const rawName: string = typeof item === 'object' && item != null && typeof item.name === 'string'\n                        ? item.name\n                        : (legendLabels[i] ?? '');\n                    const mapped = rawName && categoryToColor.has(rawName)\n                        ? categoryToColor.get(rawName)\n                        : effectivePalette[i % n];\n                    const color = mapped!;\n                    if (item != null && typeof item === 'object') {\n                        item.itemStyle = item.itemStyle || {};\n                        if (item.itemStyle.color == null) item.itemStyle.color = color;\n                    } else {\n                        s0.data[i] = { value: item, name: String(rawName || i), itemStyle: { color } };\n                    }\n                });\n                const bridge = option.series.find(\n                    (s: any) => s && s.type === 'pie' && s.name === EC_ROSE_LEGEND_BRIDGE_SERIES_NAME,\n                );\n                if (bridge && Array.isArray(bridge.data)) {\n                    bridge.data.forEach((item: any, i: number) => {\n                        const rawName: string = typeof item === 'object' && item != null && typeof item.name === 'string'\n                            ? item.name\n                            : '';\n                        const color = (rawName && categoryToColor.get(rawName))\n                            ?? effectivePalette[i % n];\n                        if (item != null && typeof item === 'object') {\n                            item.itemStyle = item.itemStyle || {};\n                            if (item.itemStyle.color == null) item.itemStyle.color = color;\n                        }\n                    });\n                }\n                if (option.legend) {\n                    const order: string[] = Array.isArray(option.angleAxis?.data) && option.angleAxis.data.length > 0\n                        ? option.angleAxis.data.map((c: any) => String(c))\n                        : legendLabels.filter(Boolean);\n                    const names = order.length > 0\n                        ? order\n                        : s0.data.map((item: any, j: number) =>\n                            (typeof item === 'object' && item != null && item.name != null)\n                                ? String(item.name)\n                                : String(j));\n                    names.forEach((name: string, i: number) => {\n                        if (!name || categoryToColor.has(name)) return;\n                        categoryToColor.set(name, effectivePalette[i % n]);\n                    });\n                    option.legend.show = true;\n                    option.legend.selectedMode = false;\n                    option.legend.data = names;\n                }\n            }\n        } else {\n            // Pie / Streamgraph / Sunburst，以及 Rose（叠堆或单角分类）：颜色多在 data / 节点上；\n            // 无 color 的多角分类 Rose 已在上面按系列赋色，此处勿给整图套单一 series 色。\n            const colorByDataItem = context.chartType === 'Pie Chart' || context.chartType === 'Rose Chart'\n                || context.chartType === 'Streamgraph'\n                || context.chartType === 'Sunburst Chart';\n            if (colorByDataItem) {\n                // Pie / Sunburst / Streamgraph：依赖 option.color 按扇区或数据项取色；Rose 叠堆依赖多 series 默认色带。\n            } else if (context.chartType === 'Radar Chart') {\n                // Radar：通常是「单个 radar series + 多个 data item(类别)」。\n                // 颜色应按类别(data item)分配，而不是按 series 分配，否则所有多边形会共用同色。\n                const legendLabels: string[] = option.legend?.data?.map((d: any) =>\n                    typeof d === 'string' ? d : (d?.name ?? ''),\n                ) ?? [];\n                const categoryToColor = new Map<string, string>();\n                legendLabels.forEach((name, i) => {\n                    if (!name) return;\n                    categoryToColor.set(name, palette_[i % n]);\n                });\n\n                const radarSeries = Array.isArray(option.series)\n                    ? option.series.find((s: any) => s && s.type === 'radar')\n                    : null;\n                if (radarSeries && Array.isArray(radarSeries.data)) {\n                    radarSeries.data.forEach((item: any, i: number) => {\n                        if (!item) return;\n                        const rawName: string = typeof item.name === 'string' ? item.name : '';\n                        const mapped = rawName && categoryToColor.has(rawName)\n                            ? categoryToColor.get(rawName)\n                            : palette_[i % n];\n                        const color = mapped!;\n                        item.itemStyle = item.itemStyle || {};\n                        if (item.itemStyle.color == null) item.itemStyle.color = color;\n                        // Keep fill opacity set by template; only supply fill color if unset.\n                        item.areaStyle = item.areaStyle || {};\n                        if (item.areaStyle.color == null) item.areaStyle.color = color;\n                        item.lineStyle = item.lineStyle || {};\n                        if (item.lineStyle.color == null) item.lineStyle.color = color;\n                    });\n                }\n            } else {\n                // 默认：按 series 索引循环 palette，但仅在模板未显式指定颜色时填充：\n                // - 无 color/group 编码的单系列图表 → 使用 cat10[0] 作为默认颜色\n                // - 多系列 → 依次使用 palette[i]，保持跨图表的一致顺序\n                // - 若模板已为某些 series 设置特殊颜色（透明底座、参考线等），则尊重模板设置。\n                const hasLegend = !!option.legend && Array.isArray(option.legend.data);\n                const rankLegendColorMap = (isRankLikeColor && hasLegend)\n                    ? buildRankColorLookupFromLegend(option.legend.data, palette_)\n                    : new Map<string, string>();\n\n                // 只对「需要上色」的 series 从 palette 取色，已设 color 的（如连接线、参考线）不占下标，使 Min/Max 等得到第 1、2 个颜色\n                const colorableCount = option.series.filter((s: any) => s && s.itemStyle?.color == null).length;\n                const spacedIndices = useEvenSpacing && colorableCount > 0\n                    ? pickEvenlySpacedColorIndices(n, colorableCount)\n                    : null;\n                let colorIdx = 0;\n\n                option.series.forEach((s: any, idx: number) => {\n                    if (!s) return;\n                    s.itemStyle = s.itemStyle || {};\n                    if (s.itemStyle.color != null) return;\n\n                    // Rank / Index 颜色映射：根据 rank 数值在连续色带上取色\n                    if (isRankLikeColor && rankLegendColorMap.size > 0) {\n                        const rawName: string = typeof s.name === 'string'\n                            ? s.name\n                            : (s.name != null ? String(s.name) : '');\n                        const mapped = rawName ? rankLegendColorMap.get(rawName) : undefined;\n                        if (mapped) {\n                            s.itemStyle.color = mapped;\n                            if (s.type === 'boxplot') s.itemStyle.borderColor = mapped;\n                            colorIdx += 1;\n                            return;\n                        }\n                        // 若找不到映射，则继续走下面的一般逻辑兜底。\n                    }\n\n                    const paletteIndex = spacedIndices\n                        ? (spacedIndices[colorIdx] ?? colorIdx % n)\n                        : (colorIdx % n);\n                    const color = palette_[paletteIndex];\n                    s.itemStyle.color = color;\n                    if (s.type === 'boxplot') {\n                        s.itemStyle.borderColor = color;\n                    }\n                    colorIdx += 1;\n                });\n            }\n        }\n    }\n\n    // ── Overflow truncation markers ──────────────────────────────────────\n    if (layout.truncations && layout.truncations.length > 0) {\n        const axisPlaceholders: Record<string, Set<string>> = { xAxis: new Set(), yAxis: new Set() };\n        for (const trunc of layout.truncations) {\n            warnings.push({\n                severity: 'warning',\n                code: 'overflow',\n                message: trunc.message,\n                channel: trunc.channel,\n                field: trunc.field,\n            });\n            const axisKey = trunc.channel === 'x' ? 'xAxis' : 'yAxis';\n            if (trunc.channel === 'x' || trunc.channel === 'y') {\n                axisPlaceholders[axisKey].add(trunc.placeholder);\n                if (option[axisKey]?.data && Array.isArray(option[axisKey].data)) {\n                    option[axisKey].data.push(trunc.placeholder);\n                }\n            }\n        }\n        // Grey styling for placeholder labels (VL labelColor equivalent)\n        for (const axisKey of ['xAxis', 'yAxis'] as const) {\n            const placeholders = axisPlaceholders[axisKey];\n            if (placeholders.size === 0 || !option[axisKey]) continue;\n            if (!option[axisKey].axisLabel) option[axisKey].axisLabel = {};\n            const existingColor = option[axisKey].axisLabel.color;\n            option[axisKey].axisLabel.color = (params: string) =>\n                placeholders.has(params) ? '#999999' : (typeof existingColor === 'function' ? existingColor(params) : (existingColor ?? '#000'));\n        }\n    }\n}\n\n/**\n * Convert a d3-style temporal format string to an ECharts template string.\n * Only suitable for ECharts 'time' type axes which support {yyyy}, {MM}, etc.\n *\n * d3: %Y → 2024, %b → Jan, %d → 01, %H → 14, %M → 30\n * EC uses {yyyy}, {MM}, {dd}, {HH}, {mm} in templates\n */\nfunction convertTemporalFormat(d3Format: string): string {\n    return d3Format\n        .replace(/%Y/g, '{yyyy}')\n        .replace(/%y/g, '{yy}')\n        .replace(/%b/g, '{MMM}')\n        .replace(/%B/g, '{MMMM}')\n        .replace(/%m/g, '{MM}')\n        .replace(/%d/g, '{dd}')\n        .replace(/%H/g, '{HH}')\n        .replace(/%M/g, '{mm}')\n        .replace(/%S/g, '{ss}');\n}\n\nconst MONTH_ABBR = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst MONTH_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n/**\n * Format a category-axis label as date when it parses as valid date.\n * Used for ordinal temporal (nominal/ordinal channel with date-like strings).\n */\nfunction formatCategoryTemporal(value: string, d3Format: string): string {\n    const d = new Date(value);\n    if (isNaN(d.getTime())) return value;\n    return formatTimestamp(d.getTime(), d3Format);\n}\n\n/**\n * Format a numeric timestamp using a d3-style format string.\n * Used for 'value' axes that hold temporal data (timestamps).\n * Exported for scatter (temporal color visualMap labels).\n */\nexport function formatTimestamp(val: number, d3Format: string): string {\n    const d = new Date(val);\n    const pad = (n: number) => n < 10 ? '0' + n : String(n);\n    return d3Format\n        .replace(/%Y/g, String(d.getFullYear()))\n        .replace(/%y/g, String(d.getFullYear()).slice(-2))\n        .replace(/%B/g, MONTH_FULL[d.getMonth()])\n        .replace(/%b/g, MONTH_ABBR[d.getMonth()])\n        .replace(/%m/g, pad(d.getMonth() + 1))\n        .replace(/%d/g, pad(d.getDate()))\n        .replace(/%H/g, pad(d.getHours()))\n        .replace(/%M/g, pad(d.getMinutes()))\n        .replace(/%S/g, pad(d.getSeconds()));\n}\n\nfunction fmtNumForTooltip(v: unknown): string {\n    if (v == null) return '';\n    const n = Number(v);\n    return isNaN(n) ? String(v) : (Number.isInteger(n) ? String(n) : n.toFixed(1));\n}\n\n/**\n * Build a single encoding-style tooltip formatter from _encodingTooltip.\n * Supports item trigger (parts from data/series) and axis trigger (category + series values).\n */\nfunction buildEncodingTooltipFormatter(option: any): ((params: any) => string) | null {\n    const enc = option._encodingTooltip as any;\n    if (!enc) return null;\n\n    if (enc.trigger === 'axis' && enc.categoryLabel != null) {\n        const categoryLabel = enc.categoryLabel;\n        const valueLabel = enc.valueLabel ?? 'Value';\n        const categoryFormat = enc.categoryFormat;\n        const temporalFormat = enc.temporalFormat ?? '%b %d, %Y';\n        const filterScatterOnly = !!enc.filterScatterOnly;\n        return (params: any) => {\n            const rawList = Array.isArray(params) ? params : [params];\n            const list = filterScatterOnly\n                ? rawList.filter((item: any) => item && item.seriesType === 'scatter')\n                : rawList;\n            if (list.length === 0) return '';\n            const p = list[0];\n            let cat: string;\n            const rawCat = p.axisValue ?? p.name ?? '';\n            if (categoryFormat === 'temporal' && (rawCat !== '' && rawCat != null)) {\n                const ts = typeof rawCat === 'number' ? rawCat : new Date(rawCat as string).getTime();\n                cat = Number.isFinite(ts) ? formatTimestamp(ts, temporalFormat) : String(rawCat);\n            } else {\n                cat = String(rawCat);\n            }\n            const parts = [`${categoryLabel}: ${cat}`];\n            for (const item of list) {\n                const name = item.seriesName ?? valueLabel;\n                let val = item.value != null ? item.value : (Array.isArray(item.data) ? item.data[item.dataIndex] : item.data);\n                // Line/area series data is [x, y]; ECharts may pass the full point — use y (index 1) for value.\n                if (Array.isArray(val) && val.length >= 2) val = val[1];\n                parts.push(`${name}: ${fmtNumForTooltip(val)}`);\n            }\n            return parts.join('<br/>');\n        };\n    }\n\n    const parts = enc.parts as Array<{ from: string; index?: number; label: string; format?: string; temporalFormat?: string; categoryNames?: string[] }>;\n    if (!parts || !Array.isArray(parts) || parts.length === 0) return null;\n\n    return (params: any) => {\n        if (params == null) return '';\n        const d = Array.isArray(params.data) ? params.data : (params.data != null ? [params.data] : []);\n        const out: string[] = [];\n        for (const p of parts) {\n            let val: unknown;\n            if (p.from === 'series') {\n                val = params.seriesName ?? params.name;\n            } else if (p.from === 'name') {\n                val = params.name;\n            } else if (p.from === 'value') {\n                val = params.value;\n            } else {\n                const idx = p.index ?? 0;\n                val = d[idx];\n                if (val != null && typeof val === 'object' && 'value' in val) val = (val as any).value;\n            }\n            if (val == null && p.from !== 'series' && p.from !== 'name') continue;\n            let str: string;\n            if (p.format === 'temporal') {\n                const ts = typeof val === 'number' ? val : new Date(val as string).getTime();\n                str = Number.isFinite(ts) ? formatTimestamp(ts, p.temporalFormat ?? '%b %d, %Y') : String(val ?? '');\n            } else if (p.format === 'category' && p.categoryNames) {\n                const i = Number(val);\n                str = Number.isInteger(i) && p.categoryNames[i] != null ? p.categoryNames[i] : String(val ?? '');\n            } else if (p.format === 'number' || (p.from === 'data' && p.format !== 'category')) {\n                str = fmtNumForTooltip(val);\n            } else {\n                str = String(val ?? '');\n            }\n            out.push(`${p.label}: ${str}`);\n        }\n        return out.join('<br/>');\n    };\n}\n\n/**\n * Apply tooltips to an ECharts option.\n * ECharts tooltip is typically configured at the top level.\n * When option._encodingTooltip is set, a Vega-Lite–style formatter (label: value per encoding) is applied.\n */\nexport function ecApplyTooltips(option: any): void {\n    if (!option.tooltip) {\n        option.tooltip = {};\n    }\n\n    const encodingFormatter = buildEncodingTooltipFormatter(option);\n    if (encodingFormatter) {\n        delete option._encodingTooltip;\n        option.tooltip.formatter = encodingFormatter;\n    }\n\n    // Ensure trigger is set\n    if (!option.tooltip.trigger) {\n        const hasScatter = option.series?.some((s: any) => s.type === 'scatter');\n        const hasPie = option.series?.some((s: any) => s.type === 'pie');\n        const hasRadar = option.series?.some((s: any) => s.type === 'radar');\n        const hasHeatmap = option.series?.some((s: any) => s.type === 'heatmap');\n        const hasCandlestick = option.series?.some((s: any) => s.type === 'candlestick');\n        const hasThemeRiver = option.series?.some((s: any) => s.type === 'themeRiver');\n        option.tooltip.trigger = (hasScatter || hasPie || hasRadar || hasHeatmap || hasThemeRiver)\n            ? 'item'\n            : 'axis';\n        // Candlestick charts benefit from crosshair pointer\n        if (hasCandlestick && !option.tooltip.axisPointer) {\n            option.tooltip.axisPointer = { type: 'cross' };\n        }\n\n        // ThemeRiver default tooltip shows raw template tokens — provide a\n        // custom formatter.  ThemeRiver params: { data: [date, value, name], color }\n        if (hasThemeRiver && !option.tooltip.formatter) {\n            option.tooltip.formatter = (params: any) => {\n                if (!params || !params.data) return '';\n                const [date, value, name] = params.data;\n                const color = params.color || '#333';\n                const dateStr = date instanceof Date ? date.toLocaleDateString() : String(date);\n                return `<span style=\"display:inline-block;width:10px;height:10px;border-radius:50%;background:${color};margin-right:6px;\"></span>`\n                    + `<b>${name}</b><br/>${dateStr}: ${value}`;\n            };\n        }\n    }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Scatter Plot template.\n *\n * Maps scatter semantics to ECharts series-based config:\n *   VL: encoding.x.field + encoding.y.field → positional channels\n *   EC: series[].data = [[x, y], [x, y], ...] with type: 'scatter'\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { formatTimestamp } from '../instantiate-spec';\nimport { DEFAULT_COLORS, groupBy, getCategoryOrder, extractCategories } from './utils';\nimport { getPaletteForScheme } from '../colormap';\nimport { makeCartesianPivot } from '../../core/pivot';\n\n/** Compute a reasonable scatter symbolSize based on canvas area and point count. */\nfunction computeSymbolSize(width: number, height: number, pointCount: number): number {\n    // Target: each point occupies ~0.05% of canvas area (in px²), take sqrt for diameter.\n    // 50pts @ 400×300 → areaPerPt=2400, 2400*0.05=120, √120≈11 → 11\n    // 500pts @ 600×450 → areaPerPt=540,  540*0.05=27,  √27≈5   → 5\n    // 1000pts @ 400×300 → areaPerPt=120, 120*0.05=6,   √6≈2.4  → 3 (min)\n    const canvasArea = width * height;\n    const areaPerPoint = canvasArea / Math.max(1, pointCount);\n    const idealDiameter = Math.sqrt(areaPerPoint * 0.05);\n    return Math.max(3, Math.min(12, Math.round(idealDiameter)));\n}\n\nexport const ecScatterPlotDef: ChartTemplateDef = {\n    chart: 'Scatter Plot',\n    template: { mark: 'circle', encoding: {} },  // skeleton for compatibility\n    channels: ['x', 'y', 'color', 'size', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        const sizeField = channelSemantics.size?.field;\n        const sizeRange = (ctx.resolvedEncodings as any)?.size?.sizeRange as [number, number] | undefined;\n        const sizeType = channelSemantics.size?.type;\n\n        if (!xField || !yField) return;\n\n        // ECharts symbolSize is pixel diameter; buildECEncodings outputs sizeRange in pixels [4, 28]\n        const EC_SIZE_MIN = 4;\n        const EC_SIZE_MAX = 30;\n        let rangeMin = Math.max(EC_SIZE_MIN, Math.min(EC_SIZE_MAX, sizeRange?.[0] ?? 6));\n        let rangeMaxClamped = Math.max(EC_SIZE_MIN, Math.min(EC_SIZE_MAX, sizeRange?.[1] ?? 20));\n        rangeMaxClamped = Math.max(rangeMin, rangeMaxClamped);\n        // Fallback: ensure a visible spread if sizeRange was degenerate\n        if (rangeMaxClamped <= rangeMin) {\n            rangeMin = EC_SIZE_MIN;\n            rangeMaxClamped = EC_SIZE_MAX;\n        }\n\n        // VL: ordinal/nominal (Rank, Level, etc.) → ordered domain, map by index. Quantitative/temporal with many unique values → sqrt scale.\n        // When resolved type is quantitative but unique count is small (e.g. 4 levels), treat as discrete priority levels → ordinal by index.\n        // If type is missing/wrong but data are 2–12 discrete non-numeric levels (e.g. \"Low\",\"Medium\",\"High\",\"Critical\"), treat as ordinal.\n        const sizeUniqueCount = sizeField && table.length > 0\n            ? new Set(table.map((r: any) => String(r[sizeField]))).size\n            : 0;\n        const sizeValuesSample = sizeField && table.length > 0\n            ? table.slice(0, 50).map((r: any) => r[sizeField]).filter((v: any) => v != null)\n            : [];\n        const allSizeValuesNumeric = sizeValuesSample.length > 0 && sizeValuesSample.every((v: any) => !isNaN(Number(v)) && String(v).trim() !== '');\n        const useOrdinalSize =\n            sizeType === 'ordinal' ||\n            sizeType === 'nominal' ||\n            (sizeType === 'quantitative' && sizeUniqueCount >= 2 && sizeUniqueCount <= 12) ||\n            (sizeField && sizeUniqueCount >= 2 && sizeUniqueCount <= 12 && !allSizeValuesNumeric);\n\n        let scaleSize: (raw: number | string | null | undefined) => number;\n        let sizeOrderForLegend: string[] | undefined;\n        /** For quantitative size: data domain for size legend (VL-style). */\n        let sizeDomainMin: number | undefined;\n        let sizeDomainMax: number | undefined;\n\n        if (useOrdinalSize && sizeField) {\n            // Discrete levels (Rank, Level, etc.): ordered domain → size by index (VL ordinal scale).\n            // VL: sort = ordinalSortOrder when set, else sort = null → domain order = data encounter order.\n            // We align: getCategoryOrder(ctx, 'size') when present; otherwise extractCategories(..., undefined)\n            // preserves first-occurrence order, matching VL.\n            const sizeOrder = extractCategories(table, sizeField, getCategoryOrder(ctx, 'size'));\n            sizeOrderForLegend = sizeOrder;\n            const orderMap = new Map<string, number>(sizeOrder.map((val, i) => [String(val), i]));\n            const n = sizeOrder.length;\n            scaleSize = (raw: number | string | null | undefined): number => {\n                if (raw == null) return rangeMin;\n                const key = String(raw);\n                const index = orderMap.get(key);\n                if (index === undefined) return rangeMin;\n                const t = n > 1 ? index / (n - 1) : 0;\n                return Math.round(rangeMin + t * (rangeMaxClamped - rangeMin));\n            };\n        } else if (sizeField) {\n            // Continuous quantitative/temporal: sqrt scale over numeric domain (VL size scale type: sqrt, zero: true).\n            const vals = table\n                .map((r: any) => r[sizeField])\n                .map((v: any) => (v != null ? Number(v) : NaN))\n                .filter((v: number) => !isNaN(v));\n            const sizeMin = vals.length ? Math.min(...vals) : 0;\n            const sizeMax = vals.length ? Math.max(...vals) : 1;\n            sizeDomainMin = sizeMin;\n            sizeDomainMax = sizeMax;\n            scaleSize = (raw: number | string | null | undefined): number => {\n                const v = raw != null ? Number(raw) : NaN;\n                if (isNaN(v)) return rangeMin;\n                let t: number;\n                if (sizeMax === sizeMin) t = 0.5;\n                else {\n                    const sqrtMin = Math.sqrt(Math.max(0, sizeMin));\n                    const sqrtMax = Math.sqrt(Math.max(0, sizeMax));\n                    const sqrtV = Math.sqrt(Math.max(0, v));\n                    t = (sqrtV - sqrtMin) / (sqrtMax - sqrtMin);\n                }\n                t = Math.max(0, Math.min(1, t));\n                return Math.round(rangeMin + t * (rangeMaxClamped - rangeMin));\n            };\n        } else {\n            scaleSize = () => rangeMin;\n        }\n\n        // When ordinal size has a discrete order, use piecewise visualMap; when quantity, use continuous visualMap (scatter-aqi-color style).\n        const usePiecewiseSizeVisualMap = sizeOrderForLegend && sizeOrderForLegend.length > 0 && sizeField;\n        const useContinuousSizeVisualMap = sizeField != null && sizeDomainMin !== undefined && sizeDomainMax !== undefined;\n        const useVisualMapForSize = usePiecewiseSizeVisualMap || useContinuousSizeVisualMap;\n\n        // X/Y can be value (quantitative/temporal) or category (nominal/ordinal) — align with VL\n        const xType = channelSemantics.x?.type;\n        const yType = channelSemantics.y?.type;\n        const xIsCategorical = xType === 'nominal' || xType === 'ordinal';\n        const yIsCategorical = yType === 'nominal' || yType === 'ordinal';\n        const xCategories = xIsCategorical ? extractCategories(table, xField, getCategoryOrder(ctx, 'x')) : [];\n        const yCategories = yIsCategorical ? extractCategories(table, yField, getCategoryOrder(ctx, 'y')) : [];\n        const xCategoryToIndex = new Map<string, number>(xCategories.map((c, i) => [String(c), i]));\n        const yCategoryToIndex = new Map<string, number>(yCategories.map((c, i) => [String(c), i]));\n\n        // ECharts scatter uses direct data arrays\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            xAxis: xIsCategorical\n                ? {\n                    type: 'category',\n                    data: xCategories,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisLabel: { interval: 0, rotate: 90 },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                }\n                : { type: 'value', name: xField, nameLocation: 'middle', nameGap: 30 },\n            yAxis: yIsCategorical\n                ? {\n                    type: 'category',\n                    data: yCategories,\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisLabel: { interval: 0, rotate: 0 },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                }\n                : { type: 'value', name: yField, nameLocation: 'middle', nameGap: 40 },\n            series: [],\n        };\n\n        if (usePiecewiseSizeVisualMap) {\n            // Piecewise visualMap maps dimension 2 to symbolSize; hide default UI and use custom graphic legend (Vega-Lite style: different sized circles, label on the right).\n            option.visualMap = [\n                {\n                    type: 'piecewise',\n                    show: false,\n                    dimension: 2,\n                    pieces: sizeOrderForLegend!.map((name) => ({\n                        value: name,\n                        symbolSize: scaleSize(name),\n                    })),\n                    orient: 'vertical',\n                    right: 10,\n                    top: 'center',\n                    itemGap: 8,\n                    itemSymbol: 'circle',\n                    formatter: (value: string) => value,\n                    title: sizeField,\n                },\n            ];\n            option._visualMapWidth = 88;\n            // One group for the whole legend; all coordinates use left/top so text aligns left\n            const ordLegendRight = 28;\n            const ordGap = 8;\n            const ordRowGap = 6;\n            const ordFontSize = 10;\n            const ordTitleHeight = 20;\n            const ordLabelWidth = 44;\n            const canvasH = ctx.canvasSize?.height ?? 300;\n            const maxCircleR = Math.max(...sizeOrderForLegend!.map((name) => scaleSize(name) / 2));\n            const legendWidth = ordLabelWidth + ordGap + 2 * maxCircleR;\n            // 当存在颜色编码（分类 color 图例）时：\n            // - Size 图例表示“通用大小规则”，不应看起来像属于某个具体类别\n            // - 按业界惯例使用中性灰色\n            // 否则（无 color 编码，全图单色）则跟随主色：\n            //   散点默认颜色来自 cat10[0]（在 ecApplyLayoutToSpec 中的统一逻辑），\n            //   因此这里也用 cat10[0]，保证 size 图例与图元颜色一致。\n            const hasColorEncoding = !!channelSemantics.color?.field;\n            const fallbackPalette = getPaletteForScheme('cat10') ?? DEFAULT_COLORS;\n            const fallbackColor = fallbackPalette[0];\n            const scatterColor = hasColorEncoding\n                ? '#cccccc'\n                : ((ctx.resolvedEncodings as any)?.color?.colorPalette?.[0] ?? fallbackColor);\n            const rowHeights = sizeOrderForLegend!.map((name) => Math.max(scaleSize(name), 16) + ordRowGap);\n            const totalLegendHeight = ordTitleHeight + rowHeights.reduce((a, b) => a + b, 0);\n            const ordLegendTop = Math.max(10, (canvasH - totalLegendHeight) / 2);\n            const legendChildren: any[] = [\n                {\n                    type: 'text' as const,\n                    left: 0,\n                    top: 0,\n                    style: {\n                        text: sizeField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'left',\n                    },\n                },\n            ];\n            let rowTop = ordTitleHeight;\n            for (let i = 0; i < sizeOrderForLegend!.length; i++) {\n                const name = sizeOrderForLegend![i];\n                const r = scaleSize(name) / 2;\n                const rowH = rowHeights[i];\n                const circleTop = rowTop + (rowH - scaleSize(name)) / 2;\n                const textTop = rowTop + (rowH - ordFontSize) / 2;\n                legendChildren.push({\n                    type: 'circle' as const,\n                    left: maxCircleR - r,\n                    top: circleTop - r,\n                    shape: { cx: r, cy: r, r },\n                    style: { fill: scatterColor },\n                });\n                legendChildren.push({\n                    type: 'text' as const,\n                    left: 2 * maxCircleR + ordGap,\n                    top: textTop,\n                    style: {\n                        text: name,\n                        fontSize: ordFontSize,\n                        fill: '#333',\n                        textAlign: 'left',\n                    },\n                });\n                rowTop += rowH;\n            }\n            const ordLegendGraphic = {\n                type: 'group' as const,\n                right: ordLegendRight,\n                top: ordLegendTop,\n                width: legendWidth,\n                z: 100,\n                children: legendChildren,\n            };\n            const existingGraphic = option.graphic;\n            option.graphic = Array.isArray(existingGraphic)\n                ? [...existingGraphic, ordLegendGraphic]\n                : existingGraphic\n                    ? [existingGraphic, ordLegendGraphic]\n                    : [ordLegendGraphic];\n        } else if (useContinuousSizeVisualMap) {\n            // Quantity size: continuous visualMap (scatter-aqi-color style), inRange.symbolSize maps dimension to size.\n            // Enforce a minimum spread so circles are visibly different (ECharts maps data linearly to [min, max]).\n            const SIZE_SPREAD_MIN = 20;\n            const sizeMaxForMap = Math.max(rangeMaxClamped, rangeMin + SIZE_SPREAD_MIN);\n            const fmtSize = (v: number) => (Number.isInteger(v) ? String(v) : v.toFixed(1));\n            const sizeVisualMap: any = {\n                type: 'continuous' as const,\n                show: true,\n                min: sizeDomainMin!,\n                max: sizeDomainMax!,\n                dimension: 2,\n                inRange: { symbolSize: [rangeMin, sizeMaxForMap] as [number, number] },\n                orient: 'vertical',\n                right: 50,\n                top: '10.0%',\n                bottom: '10.0%',\n                padding: 0,\n                itemGap: 0,\n                text: [fmtSize(sizeDomainMax!), fmtSize(sizeDomainMin!)] as [string, string],\n                textStyle: { fontSize: 10 },\n                seriesIndex: 0,\n                name: sizeField,\n            };\n            // controller 只影响图例 UI，不改变散点本身的颜色。\n            // - 有 color 编码时：size 图例表示“通用大小”，使用中性灰色。\n            // - 无 color 编码时：size 图例颜色应与图元一致，使用主色（cat10[0] 或 palette[0]）。\n            const hasColorEncoding = !!colorField;\n            if (hasColorEncoding) {\n                sizeVisualMap.controller = {\n                    inRange: {\n                        color: ['#888'],\n                    },\n                };\n            } else {\n                const basePalette =\n                    (ctx.resolvedEncodings as any)?.color?.colorPalette\n                    ?? getPaletteForScheme('cat10')\n                    ?? DEFAULT_COLORS;\n                const baseColor = basePalette[0];\n                sizeVisualMap.controller = {\n                    inRange: {\n                        color: [baseColor],\n                    },\n                };\n            }\n            if (option.visualMap) {\n                (option.visualMap as any[]).push(sizeVisualMap);\n            } else {\n                option.visualMap = [sizeVisualMap];\n            }\n            option._visualMapWidth = 70;\n            option.graphic = option.graphic || [];\n            const existingGraphic = Array.isArray(option.graphic) ? option.graphic : [option.graphic];\n            option.graphic = [\n                ...existingGraphic,\n                {\n                    type: 'text' as const,\n                    right: 50,\n                    top: 10,\n                    z: 100,\n                    style: {\n                        text: sizeField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                },\n            ];\n        }\n\n        // Apply zero-baseline decisions (only for value axes)\n        // ECharts: scale=true means \"data-fit, don't force zero\"\n        //          scale=false (default) means \"include zero\"\n        // Scatter reads position/correlation — data-fit unless zero is on.\n        if (!xIsCategorical) {\n            option.xAxis.scale = channelSemantics.x?.zero ? !channelSemantics.x.zero.zero : true;\n        }\n        if (!yIsCategorical) {\n            option.yAxis.scale = channelSemantics.y?.zero ? !channelSemantics.y.zero.zero : true;\n        }\n\n        // Opacity from chart properties\n        const opacity = chartProperties?.opacity ?? 1;\n\n        const xVal = (row: any) => xIsCategorical ? (xCategoryToIndex.get(String(row[xField] ?? '')) ?? 0) : row[xField];\n        const yVal = (row: any) => yIsCategorical ? (yCategoryToIndex.get(String(row[yField] ?? '')) ?? 0) : row[yField];\n        const pointData = (row: any) =>\n            sizeField != null\n                ? [xVal(row), yVal(row), row[sizeField]]\n                : [xVal(row), yVal(row)];\n\n        // Palette from resolvedEncodings (scheme) or fallback to DEFAULT_COLORS\n        const colorPalette = (ctx.resolvedEncodings as any)?.color?.colorPalette\n            ?? (ctx.resolvedEncodings as any)?.group?.colorPalette\n            ?? DEFAULT_COLORS;\n        const legendOpts = (ctx.resolvedEncodings as any)?.color ?? (ctx.resolvedEncodings as any)?.group;\n        const colorType = channelSemantics.color?.type ?? (ctx.resolvedEncodings as any)?.color?.type;\n        const isTemporalColor = colorField && colorType === 'temporal';\n        const isContinuousColor = colorField && (colorType === 'quantitative' || colorType === 'temporal');\n\n        if (isContinuousColor) {\n            // VL: color type quantitative → numeric scale; temporal → timestamp scale (mirror VL type \"temporal\" + legend format \"%b %d, %Y\").\n            const colorDim = sizeField != null ? 3 : 2; // data: [x, y, size?, colorVal]\n            const toColorVal = isTemporalColor\n                ? (v: any) => (v != null ? new Date(v).getTime() : NaN)\n                : (v: any) => (v != null ? Number(v) : NaN);\n            const pointDataWithColor = (row: any) => {\n                const x = xVal(row);\n                const y = yVal(row);\n                const c = toColorVal(row[colorField]);\n                if (sizeField != null) return [x, y, row[sizeField], c];\n                return [x, y, c];\n            };\n            const colorVals = table\n                .map((r: any) => toColorVal(r[colorField]))\n                .filter((v: number) => !isNaN(v));\n            const colorMin = colorVals.length ? Math.min(...colorVals) : (isTemporalColor ? Date.now() : 0);\n            const colorMax = colorVals.length ? Math.max(...colorVals) : (isTemporalColor ? Date.now() : 1);\n            const scheme = (ctx.encodings as any)?.color?.scheme ?? '';\n            // Default visualMap color bar: gray gradient (light → dark)\n            const defaultGrayRange = ['#f5f5f5', '#e0e0e0', '#9e9e9e', '#616161', '#424242'];\n            const greensRange = ['#f7fcf5', '#c7e9c0', '#41ab5d', '#006d2c', '#00441b'];\n            // 优先使用 colordecisions 的 colormap；否则仍支持原来的 green scheme 或 palette/灰阶兜底。\n            const decisionSchemeId = colorDecisions?.color?.schemeId ?? colorDecisions?.group?.schemeId;\n            const paletteFromDecision = decisionSchemeId ? getPaletteForScheme(decisionSchemeId) : undefined;\n            const inRange = paletteFromDecision && paletteFromDecision.length > 0\n                ? paletteFromDecision\n                : (/green/i.test(scheme)\n                    ? greensRange\n                    : colorPalette.length >= 2\n                        ? [colorPalette[colorPalette.length - 1], colorPalette[0]]  // light → dark\n                        : defaultGrayRange);\n            // Layout: when both size and color visualMap exist, place them side by side (size right, color left)\n            const VM_BAR_RIGHT = 50;\n            const VM_BAR_WIDTH = 70;\n            const VM_GAP = 16;\n            const VM_VAL_RIGHT = 28;\n            const VM_TITLE_TOP = 10;\n            const VM_FONT_SIZE = 10;\n            const REF_H = 400;\n            const VM_BAR_TOP_PX = 40;\n            const VM_BAR_BOTTOM_PX = 40;\n            const VM_TOP_PCT = ((VM_BAR_TOP_PX / REF_H) * 100).toFixed(1) + '%';\n            const VM_BOTTOM_PCT = ((VM_BAR_BOTTOM_PX / REF_H) * 100).toFixed(1) + '%';\n            const hasSizeVisualMap = option.visualMap && Array.isArray(option.visualMap)\n                && option.visualMap.some((vm: any) => vm.inRange?.symbolSize != null);\n            const colorBarRight = hasSizeVisualMap ? VM_BAR_RIGHT + VM_BAR_WIDTH + VM_GAP : VM_BAR_RIGHT;\n            const temporalFormat = channelSemantics.color?.temporalFormat ?? '%b %d, %Y';\n            const formatColorLabel = (val: number) =>\n                isTemporalColor ? formatTimestamp(val, temporalFormat) : String(val);\n            // Use visualMap's built-in text for max/min so labels are positioned by ECharts and align with the bar.\n            // text[0] = high (top), text[1] = low (bottom) per ContinuousView.\n            const colorVisualMap = {\n                type: 'continuous' as const,\n                min: colorMin,\n                max: colorMax,\n                dimension: colorDim,\n                inRange: { color: inRange },\n                orient: 'vertical',\n                right: colorBarRight,\n                top: VM_TOP_PCT,\n                bottom: VM_BOTTOM_PCT,\n                padding: 0,\n                itemGap: 0,\n                text: [formatColorLabel(colorMax), formatColorLabel(colorMin)] as [string, string],\n                formatter: formatColorLabel,\n                textStyle: { fontSize: VM_FONT_SIZE },\n                show: true,\n                seriesIndex: 0,\n                name: colorField,\n            };\n            if (option.visualMap) {\n                (option.visualMap as any[]).push(colorVisualMap);\n            } else {\n                option.visualMap = colorVisualMap;\n            }\n            option._visualMapWidth = hasSizeVisualMap ? VM_BAR_WIDTH + VM_GAP + VM_BAR_WIDTH : VM_BAR_WIDTH;\n            // Only the title is custom graphic; max/min come from visualMap.text above.\n            const vmGraphics: any[] = [\n                {\n                    type: 'text' as const,\n                    right: colorBarRight,\n                    top: VM_TITLE_TOP,\n                    z: 100,\n                    style: {\n                        text: colorField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                },\n            ];\n            const existingGraphic = option.graphic;\n            option.graphic = Array.isArray(existingGraphic)\n                ? [...existingGraphic, ...vmGraphics]\n                : existingGraphic\n                    ? [existingGraphic, ...vmGraphics]\n                    : vmGraphics;\n            const data = table.map((row: any) => pointDataWithColor(row));\n            const seriesOpt: any = {\n                type: 'scatter',\n                data,\n                itemStyle: { opacity },\n            };\n            if (sizeField != null && !useVisualMapForSize) {\n                seriesOpt.symbolSize = (value: number[] | number) => scaleSize(Array.isArray(value) ? value[2] : value);\n            }\n            option.series.push(seriesOpt);\n        } else if (colorField) {\n            // Categorical color: one series per category, legend with category names\n            const colorOrder = extractCategories(table, colorField, getCategoryOrder(ctx, 'color'));\n            const groups = new Map<string, number[][]>();\n            for (const row of table) {\n                const key = String(row[colorField] ?? '');\n                if (!groups.has(key)) groups.set(key, []);\n                groups.get(key)!.push(pointData(row) as number[]);\n            }\n\n            const legendNames = colorOrder.length > 0 ? colorOrder : [...groups.keys()];\n            const hasSizeBySeries = sizeField != null && !useVisualMapForSize;\n            option.legend = {\n                data: legendNames.map((name) => {\n                    const data = groups.get(name) ?? [];\n                    if (!hasSizeBySeries || data.length === 0) return name;\n                    const sizes = data.map((d: number[]) => (d.length >= 3 ? scaleSize(d[2]) : rangeMin));\n                    sizes.sort((a, b) => a - b);\n                    const medianSize = sizes[Math.floor(sizes.length / 2)] ?? rangeMin;\n                    return { name, symbolSize: medianSize, itemStyle: { symbolSize: medianSize } };\n                }),\n                show: true,\n            };\n            option._legendTitle = colorField;\n            if (legendOpts?.legendSymbolSize != null && !hasSizeBySeries) {\n                option.legend.itemWidth = legendOpts.legendSymbolSize;\n                option.legend.itemHeight = legendOpts.legendSymbolSize;\n                option.legend.itemGap = 8;\n            }\n            if (legendOpts?.legendLabelFontSize != null) {\n                option.legend.textStyle = option.legend.textStyle ?? {};\n                option.legend.textStyle.fontSize = legendOpts.legendLabelFontSize;\n            }\n\n            legendNames.forEach((name) => {\n                const data = groups.get(name) ?? [];\n                if (data.length === 0) return;\n                const seriesOpt: any = {\n                    name,\n                    type: 'scatter',\n                    data,\n                    // 不在模板中显式设置颜色，交由 ecApplyLayoutToSpec 使用\n                    // colorDecisions / colormap（通常是 cat10）统一分配。\n                    itemStyle: {\n                        opacity,\n                    },\n                };\n                if (hasSizeBySeries) {\n                    seriesOpt.symbolSize = (value: number[] | number) => scaleSize(Array.isArray(value) ? value[2] : value);\n                }\n                option.series.push(seriesOpt);\n            });\n        } else {\n            const data = table.map((row: any) => pointData(row));\n            const seriesOpt: any = {\n                type: 'scatter',\n                data,\n                itemStyle: { opacity },\n            };\n            if (sizeField != null && !useVisualMapForSize) {\n                seriesOpt.symbolSize = (value: number[] | number) => scaleSize(Array.isArray(value) ? value[2] : value);\n            } else if (useContinuousSizeVisualMap && sizeDomainMin !== undefined && sizeDomainMax !== undefined) {\n                // Apply same linear mapping as visualMap so circles are sized correctly (visualMap may not drive symbolSize in all environments)\n                const SIZE_SPREAD_MIN = 20;\n                const sizeSpread = Math.max(rangeMaxClamped - rangeMin, SIZE_SPREAD_MIN);\n                const sizeMaxMapped = rangeMin + sizeSpread;\n                seriesOpt.symbolSize = (value: number[] | number) => {\n                    const v = Array.isArray(value) ? value[2] : value;\n                    const num = Number(v);\n                    if (v == null || isNaN(num)) return rangeMin;\n                    const span = sizeDomainMax! - sizeDomainMin!;\n                    const t = span <= 0 ? 0.5 : Math.max(0, Math.min(1, (num - sizeDomainMin!) / span));\n                    return Math.round(rangeMin + t * (sizeMaxMapped - rangeMin));\n                };\n            }\n            option.series.push(seriesOpt);\n        }\n\n        // Tooltip: use shared encoding-style formatter (same as bar/line/pie) via _encodingTooltip\n        const xName = option.xAxis?.name ?? xField ?? 'X';\n        const yName = option.yAxis?.name ?? yField ?? 'Y';\n        const sizeName = sizeField ?? null;\n        const colorName = colorField ?? null;\n        const temporalFormat = channelSemantics.color?.temporalFormat ?? '%b %d, %Y';\n        const tooltipParts: Array<{ from: string; index?: number; label: string; format?: string; temporalFormat?: string; categoryNames?: string[] }> = [\n            { from: 'data', index: 0, label: xName, format: xIsCategorical ? 'category' : 'number', categoryNames: xIsCategorical ? xCategories : undefined },\n            { from: 'data', index: 1, label: yName, format: yIsCategorical ? 'category' : 'number', categoryNames: yIsCategorical ? yCategories : undefined },\n        ];\n        if (sizeName != null) tooltipParts.push({ from: 'data', index: 2, label: sizeName, format: 'number' });\n        if (colorName != null) {\n            if (isContinuousColor) {\n                tooltipParts.push({\n                    from: 'data',\n                    index: sizeField != null ? 3 : 2,\n                    label: colorName,\n                    format: isTemporalColor ? 'temporal' : 'number',\n                    temporalFormat,\n                });\n            } else {\n                tooltipParts.push({ from: 'series', label: colorName });\n            }\n        }\n        option.tooltip = option.tooltip ?? {};\n        option._encodingTooltip = { trigger: 'item', parts: tooltipParts };\n\n        // When there are multiple series (e.g. categorical color), size visualMap must apply to all of them\n        const vmList = Array.isArray(option.visualMap) ? option.visualMap : (option.visualMap ? [option.visualMap] : []);\n        const seriesCount = option.series?.length ?? 0;\n        if (seriesCount > 1) {\n            const allIndices = option.series!.map((_: any, i: number) => i);\n            for (const vm of vmList) {\n                if (vm.type === 'continuous' && vm.inRange?.symbolSize != null) {\n                    vm.seriesIndex = allIndices;\n                }\n            }\n        }\n\n        // Write the ECharts option into the spec object\n        Object.assign(spec, option);\n        // Clear VL skeleton\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 1 },\n    ],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color', 'size']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ transitions declared centrally in core/chart-transitions.ts.\n    }),\n    postProcess: (option, ctx) => {\n        if (!option.series || !Array.isArray(option.series)) return;\n        // When visualMap controls symbolSize (piecewise ordinal or continuous quantity), do not override series.symbolSize\n        const vmList = Array.isArray(option.visualMap) ? option.visualMap : (option.visualMap ? [option.visualMap] : []);\n        const visualMapControlsSize = vmList.some(\n            (vm: any) =>\n                (vm.type === 'piecewise' && Array.isArray(vm.pieces) && vm.pieces.some((p: any) => p.symbolSize != null))\n                || (vm.type === 'continuous' && vm.inRange?.symbolSize != null),\n        );\n        if (visualMapControlsSize) return;\n        const w = option._width || ctx.canvasSize.width;\n        const h = option._height || ctx.canvasSize.height;\n        const pointCount = ctx.table.length;\n        const size = computeSymbolSize(w, h, pointCount);\n        for (const series of option.series) {\n            if (series.type !== 'scatter') continue;\n            // Series has size encoding (data is [x, y, size]): keep template-set symbolSize function, do not override\n            const hasSizeEncoding = series.data?.length && Array.isArray(series.data[0]) && (series.data[0] as number[]).length >= 3;\n            if (hasSizeEncoding) continue;\n            if (series.symbolSize == null) {\n                series.symbolSize = size;\n            }\n        }\n    },\n};\n\n/** Simple linear regression: slope and intercept. */\nfunction linearRegression(data: number[][]): { slope: number; intercept: number; xMin: number; xMax: number } {\n    const n = data.length;\n    if (n === 0) return { slope: 0, intercept: 0, xMin: 0, xMax: 0 };\n    let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n    let xMin = data[0][0], xMax = data[0][0];\n    for (const [x, y] of data) {\n        sumX += x;\n        sumY += y;\n        sumXY += x * y;\n        sumXX += x * x;\n        if (x < xMin) xMin = x;\n        if (x > xMax) xMax = x;\n    }\n    const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX) || 0;\n    const intercept = (sumY - slope * sumX) / n;\n    return { slope, intercept, xMin, xMax };\n}\n\n/** Polynomial regression via least-squares normal equations. */\nfunction polyRegression(data: number[][], order: number): { coeffs: number[]; xMin: number; xMax: number } {\n    const n = data.length;\n    if (n === 0) return { coeffs: [0], xMin: 0, xMax: 0 };\n\n    let xMin = data[0][0];\n    let xMax = data[0][0];\n    for (const [x] of data) {\n        if (x < xMin) xMin = x;\n        if (x > xMax) xMax = x;\n    }\n\n    const k = order + 1;\n    // Build normal equations: (XᵀX) · a = Xᵀy\n    // X has columns [1, x, x², ..., x^order].\n    const xtx: number[][] = Array.from({ length: k }, () => new Array(k).fill(0));\n    const xty: number[] = new Array(k).fill(0);\n\n    for (const [x, y] of data) {\n        // Precompute powers x^0 .. x^(2*order) so that:\n        //   (XᵀX)[i,j] = Σ x^(i+j)\n        //   (Xᵀy)[i]   = Σ y * x^i\n        const xp: number[] = new Array(2 * order + 1);\n        xp[0] = 1;\n        for (let p = 1; p < xp.length; p++) {\n            xp[p] = xp[p - 1] * x;\n        }\n        for (let i = 0; i < k; i++) {\n            xty[i] += y * xp[i];\n            for (let j = 0; j < k; j++) {\n                xtx[i][j] += xp[i + j];\n            }\n        }\n    }\n\n    // Gaussian elimination with partial pivoting\n    const aug: number[][] = xtx.map((row, i) => [...row, xty[i]]);\n    for (let col = 0; col < k; col++) {\n        let maxRow = col;\n        for (let row = col + 1; row < k; row++) {\n            if (Math.abs(aug[row][col]) > Math.abs(aug[maxRow][col])) {\n                maxRow = row;\n            }\n        }\n        if (maxRow !== col) {\n            [aug[col], aug[maxRow]] = [aug[maxRow], aug[col]];\n        }\n        const pivot = aug[col][col];\n        if (Math.abs(pivot) < 1e-12) continue;\n        for (let j = col; j <= k; j++) {\n            aug[col][j] /= pivot;\n        }\n        for (let row = 0; row < k; row++) {\n            if (row === col) continue;\n            const factor = aug[row][col];\n            for (let j = col; j <= k; j++) {\n                aug[row][j] -= factor * aug[col][j];\n            }\n        }\n    }\n\n    const coeffs = aug.map(row => row[k]);\n    return { coeffs, xMin, xMax };\n}\n\n/** Evaluate polynomial at x given coefficients [a0, a1, a2, ...] */\nfunction polyEval(coeffs: number[], x: number): number {\n    let result = 0, xp = 1;\n    for (const c of coeffs) { result += c * xp; xp *= x; }\n    return result;\n}\n\n/** Generate regression curve points for a given method. */\nfunction regressionCurvePoints(\n    data: number[][],\n    method: string,\n    order: number,\n    numPoints: number = 50,\n): number[][] {\n    if (data.length === 0) return [];\n    if (method === 'linear' || !method) {\n        const reg = linearRegression(data);\n        return [[reg.xMin, reg.slope * reg.xMin + reg.intercept],\n        [reg.xMax, reg.slope * reg.xMax + reg.intercept]];\n    }\n    // For non-linear methods, transform data, fit linear, then transform back\n    if (method === 'log') {\n        // y = a + b * ln(x)\n        const filtered = data.filter(([x]) => x > 0);\n        if (filtered.length < 2) return [];\n        const logData = filtered.map(([x, y]) => [Math.log(x), y]);\n        const reg = linearRegression(logData);\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        const pts: number[][] = [];\n        for (let i = 0; i < numPoints; i++) {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            pts.push([x, reg.intercept + reg.slope * Math.log(x)]);\n        }\n        return pts;\n    }\n    if (method === 'exp') {\n        // ln(y) = a + b*x  →  y = exp(a) * exp(b*x)\n        const filtered = data.filter(([, y]) => y > 0);\n        if (filtered.length < 2) return [];\n        const logData = filtered.map(([x, y]) => [x, Math.log(y)]);\n        const reg = linearRegression(logData);\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        const pts: number[][] = [];\n        for (let i = 0; i < numPoints; i++) {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            pts.push([x, Math.exp(reg.intercept + reg.slope * x)]);\n        }\n        return pts;\n    }\n    if (method === 'pow') {\n        // ln(y) = a + b*ln(x)  →  y = exp(a) * x^b\n        const filtered = data.filter(([x, y]) => x > 0 && y > 0);\n        if (filtered.length < 2) return [];\n        const logData = filtered.map(([x, y]) => [Math.log(x), Math.log(y)]);\n        const reg = linearRegression(logData);\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        const pts: number[][] = [];\n        for (let i = 0; i < numPoints; i++) {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            pts.push([x, Math.exp(reg.intercept) * Math.pow(x, reg.slope)]);\n        }\n        return pts;\n    }\n    if (method === 'quad') {\n        const reg = polyRegression(data, 2);\n        const pts: number[][] = [];\n        for (let i = 0; i < numPoints; i++) {\n            const x = reg.xMin + (reg.xMax - reg.xMin) * i / (numPoints - 1);\n            pts.push([x, polyEval(reg.coeffs, x)]);\n        }\n        return pts;\n    }\n    if (method === 'poly') {\n        const reg = polyRegression(data, order);\n        const pts: number[][] = [];\n        for (let i = 0; i < numPoints; i++) {\n            const x = reg.xMin + (reg.xMax - reg.xMin) * i / (numPoints - 1);\n            pts.push([x, polyEval(reg.coeffs, x)]);\n        }\n        return pts;\n    }\n    // Fallback to linear\n    const reg = linearRegression(data);\n    return [[reg.xMin, reg.slope * reg.xMin + reg.intercept],\n    [reg.xMax, reg.slope * reg.xMax + reg.intercept]];\n}\n\n/**\n * Regression — scatter + trend line (mirror vegalite/templates/scatter.ts regressionDef).\n */\nexport const ecRegressionDef: ChartTemplateDef = {\n    chart: 'Regression',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'size', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xField || !yField) return;\n\n        const method = chartProperties?.regressionMethod ?? 'linear';\n        const polyOrder = chartProperties?.polyOrder ?? 3;\n\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            xAxis: { type: 'value', name: xField, nameLocation: 'middle', nameGap: 30, axisTick: { show: true } },\n            yAxis: { type: 'value', name: yField, nameLocation: 'middle', nameGap: 40, axisTick: { show: true } },\n            series: [],\n        };\n\n        if (channelSemantics.x?.zero) option.xAxis.scale = !channelSemantics.x.zero.zero;\n        if (channelSemantics.y?.zero) option.yAxis.scale = !channelSemantics.y.zero.zero;\n\n        const opacity = chartProperties?.opacity ?? 1;\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n            option._legendTitle = colorField;\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const data = rows.map((r: any) => [r[xField], r[yField]]);\n                const lineData = regressionCurvePoints(data, method, polyOrder);\n                option.series.push({\n                    name,\n                    type: 'scatter',\n                    data,\n                    itemStyle: { color: DEFAULT_COLORS[colorIdx % DEFAULT_COLORS.length], opacity },\n                });\n                option.series.push({\n                    name: `${name} (trend)`,\n                    type: 'line',\n                    data: lineData,\n                    showSymbol: false,\n                    smooth: method !== 'linear',\n                    lineStyle: { color: DEFAULT_COLORS[colorIdx % DEFAULT_COLORS.length], width: 2 },\n                });\n                colorIdx++;\n            }\n        } else {\n            const data = table.map((r: any) => [r[xField], r[yField]]);\n            const lineData = regressionCurvePoints(data, method, polyOrder);\n            option.series.push({ type: 'scatter', data, itemStyle: { opacity } });\n            option.series.push({\n                name: 'Trend',\n                type: 'line',\n                data: lineData,\n                showSymbol: false,\n                smooth: method !== 'linear',\n                lineStyle: { color: '#ee6666', width: 2 },\n            });\n        }\n\n        const xName = option.xAxis?.name ?? xField ?? 'X';\n        const yName = option.yAxis?.name ?? yField ?? 'Y';\n        const tooltipParts: Array<{ from: string; index?: number; label: string; format?: string }> = [\n            { from: 'data', index: 0, label: xName, format: 'number' },\n            { from: 'data', index: 1, label: yName, format: 'number' },\n        ];\n        if (colorField) tooltipParts.push({ from: 'series', label: colorField });\n        option._encodingTooltip = { trigger: 'item', parts: tooltipParts };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'regressionMethod', label: 'Method', type: 'discrete',\n            options: [\n                { value: 'linear', label: 'Linear' },\n                { value: 'log', label: 'Logarithmic' },\n                { value: 'exp', label: 'Exponential' },\n                { value: 'pow', label: 'Power' },\n                { value: 'quad', label: 'Quadratic' },\n                { value: 'poly', label: 'Polynomial' },\n            ],\n            defaultValue: 'linear',\n        } as ChartPropertyDef,\n        {\n            key: 'polyOrder', label: 'Poly Order', type: 'continuous',\n            min: 2, max: 10, step: 1, defaultValue: 3,\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Connected Scatter Plot template.\n *\n * Points plotted in 2-D (x, y both quantitative) and **connected by a straight\n * line in a defined order** (usually time / sequence), tracing a trajectory.\n * Shows the x↔y correlation AND the ordered path at once — distinct from a\n * plain scatter (no order, no line) and from a regression (a fitted trend).\n *\n * Mirrors ecScatterPlotDef (points) and ecLineChartDef (connecting line).\n *\n * Contract:\n *   x      — quantitative (value axis).\n *   y      — quantitative (value axis).\n *   order  — the sequence field; the series data is **sorted by this field** so\n *            the line follows the trajectory, NOT the x value. `smooth:false`\n *            keeps the segments straight, so a looping path crosses itself.\n *   color  — optional series → one line series (trajectory) per value.\n *   detail — optional series → one trajectory per value (used when color absent).\n *\n * Each series is a `line` with `showSymbol:true` so every observation shows a\n * point marker.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { groupBy } from './utils';\n\n/**\n * Stable sort of `rows` by the sequence `field`. Detection is value-based so it\n * works for any order field type: numeric (years / step indices) sort\n * numerically, date-parseable values sort chronologically, everything else\n * sorts lexically. Ties keep their original row order so equal-key points stay\n * stable.\n */\nfunction sortByOrder(rows: any[], field: string | undefined): any[] {\n    if (!field) return rows;\n    const tagged = rows.map((row, idx) => ({ row, idx, key: row[field] }));\n    const present = tagged.filter(t => t.key != null && t.key !== '');\n    const allNumeric = present.length > 0 &&\n        present.every(t => typeof t.key === 'number' ||\n            (typeof t.key === 'string' && t.key.trim() !== '' && !isNaN(Number(t.key))));\n    const allDates = !allNumeric && present.length > 0 &&\n        present.every(t => !isNaN(Date.parse(String(t.key))));\n    const rank = (k: any): number | string => {\n        if (allNumeric) return Number(k);\n        if (allDates) return Date.parse(String(k));\n        return String(k);\n    };\n    return [...tagged].sort((a, b) => {\n        const ra = rank(a.key);\n        const rb = rank(b.key);\n        if (ra < rb) return -1;\n        if (ra > rb) return 1;\n        return a.idx - b.idx; // stable\n    }).map(t => t.row);\n}\n\n/** Build the [x, y] point list for a (sorted) set of rows. */\nfunction toPoints(rows: any[], xField: string, yField: string): (number | null)[][] {\n    return rows.map(r => {\n        const x = r[xField];\n        const y = r[yField];\n        return [\n            x != null && !isNaN(Number(x)) ? Number(x) : null,\n            y != null && !isNaN(Number(y)) ? Number(y) : null,\n        ];\n    });\n}\n\nexport const ecConnectedScatterDef: ChartTemplateDef = {\n    chart: 'Connected Scatter Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'order', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const orderField = channelSemantics.order?.field;\n        // One trajectory per series: prefer color, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            xAxis: {\n                type: 'value',\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                axisTick: { show: true },\n            },\n            yAxis: {\n                type: 'value',\n                name: yField,\n                nameLocation: 'middle',\n                nameGap: 40,\n                axisTick: { show: true },\n            },\n            series: [],\n        };\n\n        // A trajectory reads its shape, not the distance from zero, so let both\n        // value axes fit the data unless a zero decision forces a zero baseline.\n        option.xAxis.scale = channelSemantics.x?.zero ? !channelSemantics.x.zero.zero : true;\n        option.yAxis.scale = channelSemantics.y?.zero ? !channelSemantics.y.zero.zero : true;\n\n        const baseSeriesOpt = {\n            type: 'line' as const,\n            showSymbol: true,\n            symbol: 'circle' as const,\n            symbolSize: 8,\n            // Straight segments — never smooth, so a looping path crosses itself.\n            smooth: false as const,\n            lineStyle: { width: 2 },\n            // Don't clip symbols at the grid edge: a point that lands exactly on\n            // an axis bound would otherwise have its marker cut in half.\n            clip: false as const,\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            option.legend = { data: [...groups.keys()] };\n            for (const [name, rows] of groups) {\n                const sorted = sortByOrder(rows, orderField);\n                option.series.push({\n                    name,\n                    ...baseSeriesOpt,\n                    data: toPoints(sorted, xField, yField),\n                    // Colors assigned by ecApplyLayoutToSpec from colorDecisions.\n                });\n            }\n        } else {\n            const sorted = sortByOrder(table, orderField);\n            option.series.push({\n                ...baseSeriesOpt,\n                data: toPoints(sorted, xField, yField),\n            });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Bar Chart templates: Bar, Stacked Bar, Grouped Bar.\n *\n * Key contrast with Vega-Lite:\n *   VL: encoding channels determine stacking/grouping implicitly\n *       - stacked bar:  color channel → auto-stacks\n *       - grouped bar:  xOffset/group channel → side-by-side\n *   EC: explicit series[] with stack property for stacking,\n *       and barGap/barCategoryGap for grouped layout\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport {\n    extractCategories, groupBy, detectAxes, getCategoryOrder,\n} from './utils';\nimport type { ColorDecision } from '../../core/color-decisions';\nimport { pickEChartsPalette } from '../colormap';\nimport { planBandDodge, resolveDodge } from '../../core/band-dodge';\nimport {\n    detectBandedAxisFromSemantics, detectBandedAxisForceDiscrete,\n} from '../../core/axis-detection';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { makeSortAction } from '../../core/encoding-actions';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/**\n * `local` dodge for grouped bars: build `maxPerBand` LANE series (native ECharts\n * grouping = compact, left-anchored) instead of one series per global group.\n * Each bar is colored per-datum by its actual group value, and a custom legend\n * maps group → color. Returns the series[] + legend data, or null when the plan\n * doesn't call for local dodge.\n */\nfunction buildLocalLaneSeries(\n    table: any[],\n    categories: string[],\n    catField: string,\n    groupField: string,\n    valField: string,\n    groupColor: (g: string) => string,\n): { series: any[]; legendData: { name: string; itemStyle: { color: string } }[] } | null {\n    const globalGroups: string[] = [...new Set(table.map((r) => String(r[groupField] ?? '')))].filter(Boolean);\n    // Per-band ordered present groups → lane index.\n    const perBand = new Map<string, string[]>();\n    for (const cat of categories) perBand.set(cat, []);\n    for (const r of table) {\n        const cat = String(r[catField] ?? '');\n        const g = String(r[groupField] ?? '');\n        if (!perBand.has(cat) || !g) continue;\n        const arr = perBand.get(cat)!;\n        if (!arr.includes(g)) arr.push(g);\n    }\n    for (const arr of perBand.values()) arr.sort();\n    const maxPerBand = Math.max(1, ...[...perBand.values()].map((a) => a.length));\n    if (maxPerBand <= 1) return null;\n\n    // value lookup per (cat, group)\n    const valAt = new Map<string, number>();\n    for (const r of table) {\n        const v = Number(r[valField]);\n        if (isFinite(v)) valAt.set(`${r[catField]}\\u0000${r[groupField]}`, v);\n    }\n\n    const series = Array.from({ length: maxPerBand }, (_, lane) => ({\n        type: 'bar',\n        name: `__lane${lane}`,\n        data: categories.map((cat) => {\n            const g = perBand.get(cat)?.[lane];\n            if (g === undefined) return '-';\n            const v = valAt.get(`${cat}\\u0000${g}`);\n            return v === undefined ? '-' : { value: v, itemStyle: { color: groupColor(g) } };\n        }),\n    }));\n    const legendData = globalGroups.map((g) => ({ name: g, itemStyle: { color: groupColor(g) } }));\n    return { series, legendData };\n}\n\n/**\n * For a category-axis bar chart, build an array of values aligned to the\n * category array. Each entry is the sum of values for that category in the\n * given rows (to handle pre-aggregated or raw data).\n */\nfunction buildCategoryValues(\n    rows: any[],\n    categoryField: string,\n    valueField: string,\n    categories: string[],\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const cat = String(row[categoryField] ?? '');\n        const val = row[valueField];\n        if (val != null && !isNaN(val)) {\n            map.set(cat, (map.get(cat) ?? 0) + Number(val));\n        }\n    }\n    return categories.map(cat => map.get(cat) ?? null);\n}\n\n/** Count rows per category (when value axis has no numeric field, e.g. temporal). */\nfunction buildCategoryCounts(\n    rows: any[],\n    categoryField: string,\n    categories: string[],\n): number[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const cat = String(row[categoryField] ?? '');\n        map.set(cat, (map.get(cat) ?? 0) + 1);\n    }\n    return categories.map(cat => map.get(cat) ?? 0);\n}\n\n/** When both x and y are discrete: count per (category, group). Returns one row per group. */\nfunction buildCategoryGroupCounts(\n    rows: any[],\n    categoryField: string,\n    groupField: string,\n    categories: string[],\n    groups: string[],\n): number[][] {\n    return groups.map(group =>\n        categories.map(cat =>\n            rows.filter(r => String(r[categoryField] ?? '') === cat && String(r[groupField] ?? '') === group).length,\n        ),\n    );\n}\n\n/** True if all labels parse as numbers → horizontal axis labels; otherwise vertical (for heatmap). */\nfunction areHeatmapCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\n/** Few, short category labels → keep axis text horizontal (0°); else 90° to reduce overlap. */\nconst EC_BAR_SHORT_CATEGORY_COUNT = 4;\nconst EC_BAR_SHORT_CATEGORY_LABEL_LEN = 8;\n\nfunction categoryAxisLabelRotateDeg(\n    categories: string[],\n    channelType: string | undefined,\n): number {\n    if (channelType === 'quantitative') return 0;\n    const labels = categories.map(c => String(c));\n    if (labels.length === 0) return 0;\n    const maxLen = Math.max(...labels.map(s => s.length));\n    if (labels.length <= EC_BAR_SHORT_CATEGORY_COUNT && maxLen <= EC_BAR_SHORT_CATEGORY_LABEL_LEN) {\n        return 0;\n    }\n    return 90;\n}\n\n// ─── Bar Chart ──────────────────────────────────────────────────────────────\n\nexport const ecBarChartDef: ChartTemplateDef = {\n    chart: 'Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const valCS = channelSemantics[valueAxis];\n        const colorField = channelSemantics.color?.field;\n        const bothDiscrete =\n            isDiscrete(channelSemantics.x?.type) && isDiscrete(channelSemantics.y?.type);\n\n        if (bothDiscrete) {\n            // x=Category, y=Group both nominal → heatmap: cell color = count per (Category, Group)\n            const categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n            const groups = extractCategories(table, valField, getCategoryOrder(ctx, valueAxis));\n            const countMatrix = buildCategoryGroupCounts(table, catField, valField, categories, groups);\n\n            const heatData: [number, number, number][] = [];\n            let minVal = Infinity;\n            let maxVal = -Infinity;\n            for (let yi = 0; yi < groups.length; yi++) {\n                for (let xi = 0; xi < categories.length; xi++) {\n                    const v = countMatrix[yi][xi];\n                    heatData.push([xi, yi, v]);\n                    if (v < minVal) minVal = v;\n                    if (v > maxVal) maxVal = v;\n                }\n            }\n            if (minVal === Infinity) minVal = 0;\n            if (maxVal === -Infinity) maxVal = 1;\n\n            const option: any = {\n                tooltip: { position: 'top' },\n                _encodingTooltip: {\n                    trigger: 'item',\n                    parts: [\n                        { from: 'data', index: 0, label: catField, format: 'category', categoryNames: categories },\n                        { from: 'data', index: 1, label: valField, format: 'category', categoryNames: groups },\n                        { from: 'data', index: 2, label: 'Count', format: 'number' },\n                    ],\n                },\n                xAxis: {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    splitArea: { show: true },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: {\n                        rotate: areHeatmapCategoriesNumeric(categories)\n                            ? 0\n                            : categoryAxisLabelRotateDeg(categories, catCS?.type),\n                    },\n                },\n                yAxis: {\n                    type: 'category',\n                    data: groups,\n                    name: valField,\n                    splitArea: { show: true },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: 0 },\n                },\n                visualMap: {\n                    min: minVal,\n                    max: maxVal,\n                    calculable: true,\n                    orient: 'vertical',\n                    right: 10,\n                    top: 'center',\n                    itemGap: 15,\n                    inRange: { color: ['#f0f9ff', '#0ea5e9', '#0369a1'] },\n                },\n                _visualMapWidth: 50,\n                series: [{\n                    type: 'heatmap',\n                    data: heatData,\n                    label: { show: heatData.length <= 100 },\n                    emphasis: {\n                        itemStyle: { shadowBlur: 10, shadowColor: 'rgba(0, 0, 0, 0.5)' },\n                    },\n                }],\n            };\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        // Color + quantitative value → default to stacked bar (like Vega-Lite).\n        if (colorField && valCS?.type === 'quantitative') {\n            const categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n            const isHorizontal = categoryAxis === 'y';\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                xAxis: isHorizontal\n                    ? { type: 'value', name: valField }\n                    : {\n                        type: 'category',\n                        data: categories,\n                        name: catField,\n                        axisLabel: { rotate: categoryAxisLabelRotateDeg(categories, catCS?.type) },\n                        axisTick: { show: true, alignWithLabel: true },\n                        axisLine: { show: true },\n                    },\n                yAxis: isHorizontal\n                    ? { type: 'category', data: categories, name: catField }\n                    : { type: 'value', name: valField },\n                series: [],\n            };\n            option._encodingTooltip = { trigger: 'axis', categoryLabel: catField, valueLabel: valField };\n\n            const groups = groupBy(table, colorField);\n            const legendKeys = [...groups.keys()];\n            const highCardinality = legendKeys.length > 10;\n            option.legend = {\n                data: legendKeys,\n                orient: 'vertical',\n                right: 10,\n                top: highCardinality ? 30 : 20,\n                bottom: highCardinality ? 10 : undefined,\n                type: highCardinality ? 'scroll' : 'plain',\n                align: 'left',\n            };\n\n            // Legend title (e.g., Segment) aligned with legend symbols on the right\n            if (colorField) {\n                const titleGraphic = {\n                    type: 'text' as const,\n                    right: 10,\n                    top: 4,\n                    z: 100,\n                    style: {\n                        text: colorField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                };\n                const existingGraphic = (spec as any).graphic ?? option.graphic;\n                option.graphic = Array.isArray(existingGraphic)\n                    ? [...existingGraphic, titleGraphic]\n                    : existingGraphic\n                        ? [existingGraphic, titleGraphic]\n                        : [titleGraphic];\n            }\n\n            for (const [name, rows] of groups) {\n                const data = buildCategoryValues(rows, catField, valField, categories);\n                option.series.push({\n                    name,\n                    type: 'bar',\n                    data,\n                    stack: 'total',\n                    // 颜色由 ecApplyLayoutToSpec 中的 palette 决定，这里不再硬编码。\n                });\n            }\n\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        // x=temporal, y=nominal → vertical grouped bar: x=dates (labels), y=count, series=group\n        // 这里没有显式的 color/group 通道，但从 y 轴类别派生出了“系列分组”，\n        // 所以无法直接复用 global colorDecisions.color / group。\n        // 在这种场景下，通过一个「虚拟」的 ColorDecision 调用 pickEChartsPalette，\n        // 依然走统一的 colormap 选盘逻辑（通常会得到 cat10 / cat20）。\n        if (categoryAxis === 'y' && valCS?.type === 'temporal') {\n            const dateCategories = extractCategories(table, valField, getCategoryOrder(ctx, valueAxis));\n            dateCategories.sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n            const groups = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n            const countMatrix = buildCategoryGroupCounts(table, valField, catField, dateCategories, groups);\n\n            const virtualDecision: ColorDecision = {\n                channel: 'color',\n                schemeType: 'categorical',\n                // 这里没有真实的 encoding.color，但我们知道会画按 group 分类的条形，\n                // 因此用 group 数作为 categoryCount，方便 colormap 选择 cat10/cat20。\n                categoryCount: groups.length || undefined,\n                primary: true,\n                dataDriven: true,\n            };\n            const palette = pickEChartsPalette(virtualDecision);\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                legend: { data: groups },\n                xAxis: {\n                    type: 'category',\n                    data: dateCategories,\n                    name: valField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(dateCategories, 'temporal') },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n                yAxis: { type: 'value', name: 'Count', axisTick: { show: true } },\n                // 显式把 palette 写到 option.color，方便和其它图类型保持一致\n                color: palette,\n                series: groups.map((name, i) => ({\n                    name,\n                    type: 'bar',\n                    data: countMatrix[i],\n                    itemStyle: {\n                        color: palette[i % palette.length],\n                        borderRadius: chartProperties?.cornerRadius ?? 0,\n                    },\n                })),\n            };\n            option._encodingTooltip = { trigger: 'axis', categoryLabel: valField, valueLabel: 'Count', groupLabel: catField };\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        let categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n        let values: (number | null)[];\n        if (valCS?.type === 'temporal') {\n            // Value axis is date — use count per category (no numeric to sum)\n            values = buildCategoryCounts(table, catField, categories);\n        } else {\n            values = buildCategoryValues(table, catField, valField, categories);\n        }\n        if (catCS?.type === 'temporal') {\n            const pairs: [string, number | null][] = categories.map((c, i) => [c, values[i]]);\n            pairs.sort((a, b) => new Date(a[0]).getTime() - new Date(b[0]).getTime());\n            categories = pairs.map(p => p[0]);\n            values = pairs.map(p => p[1]);\n        }\n\n        const isHorizontal = categoryAxis === 'y';\n        const valueLabel = valCS?.type === 'temporal' ? 'Count' : valField;\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n            xAxis: isHorizontal\n                ? { type: 'value', name: valueLabel }\n                : {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(categories, catCS?.type) },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n            yAxis: isHorizontal\n                ? { type: 'category', data: categories, name: catField }\n                : { type: 'value', name: valueLabel },\n            series: [{\n                type: 'bar',\n                data: values,\n                itemStyle: {\n                    borderRadius: chartProperties?.cornerRadius ?? 0,\n                },\n            }],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: catField, valueLabel };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'cornerRadius', label: 'Corners', type: 'continuous', min: 0, max: 15, step: 1, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n\n// ─── Stacked Bar Chart ──────────────────────────────────────────────────────\n\nexport const ecStackedBarChartDef: ChartTemplateDef = {\n    chart: 'Stacked Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const colorField = channelSemantics.color?.field;\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const valCS = channelSemantics[valueAxis];\n        let categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n        if (catCS?.type === 'temporal') {\n            categories = [...categories].sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n        }\n        const isHorizontal = categoryAxis === 'y';\n        const valueLabel = valCS?.type === 'temporal' ? 'Count' : valField;\n\n        // All categorical (e.g., x=Category, y=Group, color=Segment) → count per (x, color) with stacked bars.\n        if (colorField && isDiscrete(channelSemantics.x?.type) && isDiscrete(channelSemantics.y?.type)) {\n            const categoriesX = extractCategories(table, channelSemantics.x!.field!, getCategoryOrder(ctx, 'x'));\n            const groups = groupBy(table, colorField);\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                xAxis: {\n                    type: 'category',\n                    data: categoriesX,\n                    name: channelSemantics.x!.field,\n                    axisLabel: {\n                        rotate: categoryAxisLabelRotateDeg(categoriesX, channelSemantics.x?.type),\n                    },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n                yAxis: { type: 'value', name: 'Count', axisTick: { show: true } },\n                series: [],\n            };\n            option._encodingTooltip = {\n                trigger: 'axis',\n                categoryLabel: channelSemantics.x!.field!,\n                valueLabel: 'Count',\n                groupLabel: colorField,\n            };\n\n            const legendKeys = [...groups.keys()];\n            const highCardinality = legendKeys.length > 10;\n            option.legend = {\n                data: legendKeys,\n                orient: 'vertical',\n                right: 10,\n                top: highCardinality ? 30 : 20,\n                bottom: highCardinality ? 10 : undefined,\n                type: highCardinality ? 'scroll' : 'plain',\n                align: 'left',\n            };\n\n            const titleGraphic = {\n                type: 'text' as const,\n                right: 10,\n                top: 4,\n                z: 100,\n                style: {\n                    text: colorField,\n                    fontSize: 11,\n                    fontWeight: 'bold',\n                    fill: '#333',\n                    textAlign: 'right',\n                },\n            };\n            const existingGraphic = (spec as any).graphic ?? option.graphic;\n            option.graphic = Array.isArray(existingGraphic)\n                ? [...existingGraphic, titleGraphic]\n                : existingGraphic\n                    ? [existingGraphic, titleGraphic]\n                    : [titleGraphic];\n\n            for (const [name, rows] of groups) {\n                const data = buildCategoryCounts(rows, channelSemantics.x!.field!, categoriesX);\n                option.series.push({\n                    name,\n                    type: 'bar',\n                    data,\n                    stack: 'total',\n                    // 颜色由全局 palette 决定。\n                });\n            }\n\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n            xAxis: isHorizontal\n                ? { type: 'value', name: valueLabel }\n                : {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(categories, catCS?.type) },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n            yAxis: isHorizontal\n                ? { type: 'category', data: categories, name: catField }\n                : { type: 'value', name: valueLabel },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: catField, valueLabel };\n\n        // Stack mode from chart properties. Once the series channel is routed to\n        // a facet, this is just a regular bar inside each facet.\n        const stackMode = colorField ? chartProperties?.stackMode : undefined;\n        // In ECharts, stack is a group name; normalize maps to '%' formatting\n        const stackGroup = colorField && stackMode !== 'layered' ? 'total' : undefined;\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            const legendKeys = [...groups.keys()];\n            const highCardinality = legendKeys.length > 10;\n            option.legend = {\n                data: legendKeys,\n                orient: 'vertical',\n                right: 10,\n                top: highCardinality ? 30 : 20,\n                bottom: highCardinality ? 10 : undefined,\n                type: highCardinality ? 'scroll' : 'plain',\n                align: 'left',\n            };\n\n            // Legend title (e.g., Segment) aligned with legend symbols on the right\n            const titleField = colorField;\n            if (titleField) {\n                const titleGraphic = {\n                    type: 'text' as const,\n                    right: 10,\n                    top: 4,\n                    z: 100,\n                    style: {\n                        text: titleField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                };\n                const existingGraphic = (spec as any).graphic ?? option.graphic;\n                option.graphic = Array.isArray(existingGraphic)\n                    ? [...existingGraphic, titleGraphic]\n                    : existingGraphic\n                        ? [existingGraphic, titleGraphic]\n                        : [titleGraphic];\n            }\n\n            for (const [name, rows] of groups) {\n                const data = valCS?.type === 'temporal'\n                    ? buildCategoryCounts(rows, catField, categories)\n                    : buildCategoryValues(rows, catField, valField, categories);\n                const series: any = {\n                    name,\n                    type: 'bar',\n                    data,\n                    // 颜色由全局 palette 决定。\n                };\n                if (stackGroup) {\n                    series.stack = stackGroup;\n                }\n                // Normalize: ECharts doesn't have a built-in \"normalize\" stack,\n                // but we can signal it via a custom label format\n                if (stackMode === 'normalize') {\n                    series.stack = 'total';\n                    // Note: true normalize requires computing percentages;\n                    // for now we just stack — full normalize would need data transform\n                }\n                option.series.push(series);\n            }\n        } else {\n            // Single series stacked (no color = just a regular bar)\n            const data = valCS?.type === 'temporal'\n                ? buildCategoryCounts(table, catField, categories)\n                : buildCategoryValues(table, catField, valField, categories);\n            option.series.push({ type: 'bar', data });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'stackMode', label: 'Stack', type: 'discrete', options: [\n                { value: undefined, label: 'Stacked (default)' },\n                { value: 'normalize', label: 'Normalize (100%)' },\n            ],\n            check: (ctx) => ({ applicable: !!ctx.encodings.color?.field }),\n        },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Grouped Bar) declared centrally in core/chart-transitions.ts.\n    }),\n};\n\n// ─── Grouped Bar Chart ──────────────────────────────────────────────────────\n\nexport const ecGroupedBarChartDef: ChartTemplateDef = {\n    chart: 'Grouped Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'group', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        const axis = result?.axis || 'x';\n        const decl: import('../../core/types').LayoutDeclaration = {\n            axisFlags: { [axis]: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n        // `local` dodge budgets only maxPerBand lanes per band (compact).\n        const groupField = cs.group?.field || cs.color?.field;\n        const axisField = cs[axis]?.field;\n        if (groupField && axisField) {\n            const plan = planBandDodge(table, axisField, groupField);\n            const { mode } = resolveDodge(plan, chartProperties?.dodge);\n            if (mode === 'local') decl.groupLaneCount = Math.max(1, plan.maxPerBand);\n        }\n        return decl;\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n\n        // The \"group\" channel in the core maps to color/series in ECharts\n        const groupField = channelSemantics.group?.field || channelSemantics.color?.field;\n\n        // ── Special case: x=temporal, y=nominal, group=Segment → vertical grouped bars by Date ──\n        // Mirror ecBarChartDef's \"x=temporal, y=nominal\" behaviour, but use the explicit group channel\n        // for series instead of the y field. Result:\n        //   - x axis: Date categories (sorted)\n        //   - y axis: Count\n        //   - series: Segment (group channel), values = count of rows per (Date, Segment)\n        if (channelSemantics.x?.type === 'temporal'\n            && isDiscrete(channelSemantics.y?.type)\n            && groupField\n            && channelSemantics.x.field) {\n            const xField = channelSemantics.x.field;\n            const xCS = channelSemantics.x;\n\n            const dateCategories = extractCategories(table, xField, getCategoryOrder(ctx, 'x'));\n            dateCategories.sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n\n            const segments = extractCategories(table, groupField, getCategoryOrder(ctx, 'group'));\n            const countMatrix = buildCategoryGroupCounts(table, xField, groupField, dateCategories, segments);\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                legend: { data: segments },\n                xAxis: {\n                    type: 'category',\n                    data: dateCategories,\n                    name: xField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(dateCategories, xCS?.type) },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n                yAxis: { type: 'value', name: 'Count', axisTick: { show: true } },\n                series: segments.map((name, i) => ({\n                    name,\n                    type: 'bar',\n                    data: countMatrix[i],\n                    // 颜色由全局 palette 决定。\n                })),\n            };\n            // Let ecApplyLayoutToSpec place a single legend title for the group channel.\n            // Avoid adding our own graphic here, otherwise we'd get a duplicate \"Segment\" title.\n            option._legendTitle = groupField;\n            option._encodingTooltip = {\n                trigger: 'axis',\n                categoryLabel: xField,\n                valueLabel: 'Count',\n                groupLabel: groupField,\n            };\n\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        const valType = channelSemantics[valueAxis]?.type;\n\n        // ── Fallback: no numeric value axis, but we do have a group channel ──\n        // Example specs:\n        //   - x=Category (nominal), y=Group (nominal), group=Segment\n        //   - x=Date (temporal),   y=Group (nominal), group=Segment\n        // In these cases we mirror bar chart's \"all categorical\" behaviour:\n        // use x as the category axis and plot grouped bars where height = count.\n        if ((!valField || valType === 'nominal' || valType === 'ordinal') && groupField && channelSemantics.x?.field) {\n            const xField = channelSemantics.x.field!;\n            const xCS = channelSemantics.x;\n            let categories = extractCategories(table, xField, getCategoryOrder(ctx, 'x'));\n            if (xCS?.type === 'temporal') {\n                categories = [...categories].sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n            }\n\n            const groups = groupBy(table, groupField);\n            const legendKeys = [...groups.keys()];\n            const highCardinality = legendKeys.length > 10;\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                xAxis: {\n                    type: 'category',\n                    data: categories,\n                    name: xField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(categories, xCS?.type) },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n                yAxis: { type: 'value', name: 'Count', axisTick: { show: true } },\n                series: [],\n            };\n            option._encodingTooltip = {\n                trigger: 'axis',\n                categoryLabel: xField,\n                valueLabel: 'Count',\n                groupLabel: groupField,\n            };\n\n            option.legend = {\n                data: legendKeys,\n                orient: 'vertical',\n                right: 10,\n                top: highCardinality ? 30 : 20,\n                bottom: highCardinality ? 10 : undefined,\n                type: highCardinality ? 'scroll' : 'plain',\n                align: 'left',\n            };\n\n            const titleGraphic = {\n                type: 'text' as const,\n                right: 10,\n                top: 4,\n                z: 100,\n                style: {\n                    text: groupField,\n                    fontSize: 11,\n                    fontWeight: 'bold',\n                    fill: '#333',\n                    textAlign: 'right',\n                },\n            };\n            const existingGraphic = (spec as any).graphic ?? option.graphic;\n            option.graphic = Array.isArray(existingGraphic)\n                ? [...existingGraphic, titleGraphic]\n                : existingGraphic\n                    ? [existingGraphic, titleGraphic]\n                    : [titleGraphic];\n\n            for (const [name, rows] of groups) {\n                const data = buildCategoryCounts(rows, xField, categories);\n                option.series.push({\n                    name,\n                    type: 'bar',\n                    data,\n                    // 颜色由全局 palette 决定。\n                });\n            }\n\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        // ── Default: we have a proper value axis (quantitative / temporal) ──\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        let categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis));\n        if (catCS?.type === 'temporal') {\n            categories = [...categories].sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n        }\n        const isHorizontal = categoryAxis === 'y';\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n            xAxis: isHorizontal\n                ? { type: 'value', name: valField }\n                : {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    axisLabel: { rotate: categoryAxisLabelRotateDeg(categories, catCS?.type) },\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLine: { show: true },\n                },\n            yAxis: isHorizontal\n                ? { type: 'category', data: categories, name: catField }\n                : { type: 'value', name: valField },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: catField, valueLabel: valField };\n\n            if (groupField) {\n            // Each group becomes a separate series — ECharts places them\n            // side-by-side within each category automatically\n            const groups = groupBy(table, groupField);\n            const legendKeys = [...groups.keys()];\n            const highCardinality = legendKeys.length > 10;\n            option.legend = {\n                data: legendKeys,\n                orient: 'vertical',\n                right: 10,\n                top: highCardinality ? 30 : 20,\n                bottom: highCardinality ? 10 : undefined,\n                type: highCardinality ? 'scroll' : 'plain',\n                align: 'left',\n            };\n\n            // Legend title (e.g., Segment) aligned with legend symbols on the right\n            const titleField = groupField;\n            if (titleField) {\n                const titleGraphic = {\n                    type: 'text' as const,\n                    right: 10,\n                    top: 4,\n                    z: 100,\n                    style: {\n                        text: titleField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                };\n                const existingGraphic = (spec as any).graphic ?? option.graphic;\n                option.graphic = Array.isArray(existingGraphic)\n                    ? [...existingGraphic, titleGraphic]\n                    : existingGraphic\n                        ? [existingGraphic, titleGraphic]\n                        : [titleGraphic];\n            }\n\n            for (const [name, rows] of groups) {\n                const data = buildCategoryValues(rows, catField, valField, categories);\n                option.series.push({\n                    name,\n                    type: 'bar',\n                    data,\n                    // 颜色由全局 palette 决定。\n                });\n            }\n\n            // `local` dodge → rebuild as compact maxPerBand lane-series (native,\n            // left-anchored), colored per-datum by group. Replaces the per-group\n            // series built above. `none`/`global` keep the native series above.\n            const gAxisField = channelSemantics[categoryAxis]?.field;\n            if (gAxisField) {\n                const plan = planBandDodge(ctx.fullTable ?? table, gAxisField, groupField);\n                const { mode } = resolveDodge(plan, ctx.chartProperties?.dodge);\n                if (mode === 'local') {\n                    const palette = pickEChartsPalette(ctx.colorDecisions?.group ?? ctx.colorDecisions?.color);\n                    const colorFor = (g: string) => palette[legendKeys.indexOf(g) % palette.length] ?? palette[0];\n                    const built = buildLocalLaneSeries(table, categories, catField, groupField, valField, colorFor);\n                    if (built) {\n                        option.series = built.series;\n                        option.legend.data = built.legendData;\n                    }\n                }\n            }\n        } else {\n            // No grouping — single series\n            const data = buildCategoryValues(table, catField, valField, categories);\n            option.series.push({ type: 'bar', data });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'dodge', label: 'Dodge', type: 'discrete',\n            options: [\n                { value: 'auto',   label: 'Auto' },\n                { value: 'local',  label: 'Local (compact)' },\n                { value: 'global', label: 'Global (aligned)' },\n            ],\n            defaultValue: 'auto',\n            check: (ctx) => {\n                const groupField = ctx.channelSemantics?.group?.field ?? ctx.encodings?.group?.field;\n                const axisField = isDiscrete(ctx.channelSemantics?.x?.type)\n                    ? ctx.channelSemantics?.x?.field\n                    : ctx.channelSemantics?.y?.field;\n                const rows = ctx.data;\n                if (!groupField || !axisField || !rows) return { applicable: false };\n                const plan = planBandDodge(rows, axisField, groupField);\n                return { applicable: plan.ambiguous, recommendedValue: plan.mode === 'none' ? 'auto' : plan.mode };\n            },\n        } as ChartPropertyDef,\n    ],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Stacked Bar) declared centrally in core/chart-transitions.ts.\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Line Chart template (supports multi-series).\n *\n * Contrast with VL:\n *   VL: encoding.x + encoding.y + encoding.color → auto-groups into separate lines\n *   EC: explicit series[] with each series.data = [v1, v2, ...] aligned to xAxis.data\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\nimport { toTypeString } from '../../core/field-semantics';\nimport { getPaletteForScheme } from '../colormap';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → horizontal; otherwise vertical (x-axis only). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\nconst interpolateMap: Record<string, string> = {\n    'linear': 'linear',       // default\n    'monotone': 'monotone',   // ECharts smooth: true approximates this\n    'step': 'step',\n    'step-before': 'stepBefore',   // Not directly supported; mapped\n    'step-after': 'stepAfter',     // Not directly supported; mapped\n    'basis': 'smooth',\n    'cardinal': 'smooth',\n    'catmull-rom': 'smooth',\n};\n\nexport const ecLineChartDef: ChartTemplateDef = {\n    chart: 'Line Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        // Determine x-axis type\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const yIsDiscrete = isDiscrete(yCS.type);\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n\n        // Build x-axis categories for discrete/temporal axes\n        const categories = xIsDiscrete ? extractCategories(table, xField, getCategoryOrder(ctx, 'x')) : undefined;\n        const yCategories = yIsDiscrete ? extractCategories(table, yField, getCategoryOrder(ctx, 'y')) : undefined;\n\n        const option: any = {\n            tooltip: {\n                trigger: 'axis',\n            },\n            xAxis: (() => {\n                const type = xIsDiscrete ? 'category' : xIsTemporal ? 'time' : 'value';\n                const base: any = {\n                    type,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    ...(categories ? { data: categories } : {}),\n                };\n                if (xIsDiscrete && categories) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: areCategoriesNumeric(categories) ? 0 : 90 };\n                } else if (xIsTemporal) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: 90 };\n                } else {\n                    base.axisTick = { show: true };\n                }\n                return base;\n            })(),\n            yAxis: yIsDiscrete && yCategories\n                ? {\n                    type: 'category',\n                    data: yCategories,\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: 0 },\n                }\n                : {\n                    type: 'value',\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                    axisLabel: { rotate: 0 },\n                },\n            series: [],\n        };\n        // Default: axis tooltip for standard line charts.\n        // When color is continuous (Quantity/Date), we switch to item tooltip to support per-point color values.\n        option._encodingTooltip = isContinuousColor\n            ? {\n                trigger: 'item',\n                parts: [\n                    { from: 'data', index: 0, label: xField, format: 'number' },\n                    { from: 'data', index: 1, label: yField, format: 'number' },\n                    { from: 'data', index: 2, label: colorField, format: 'number' },\n                ],\n            }\n            : { trigger: 'axis', categoryLabel: xField, valueLabel: yField };\n\n        // Apply zero-baseline\n        // ECharts: scale=true means \"data-fit\", scale=false means \"include zero\"\n        if (channelSemantics.y?.zero) {\n            option.yAxis.scale = !channelSemantics.y.zero.zero;\n        }\n\n        // Interpolation / smooth\n        const interpolate = chartProperties?.interpolate;\n        const showPoints = !!chartProperties?.showPoints;\n        const smooth = interpolate === 'monotone' || interpolate === 'basis' ||\n            interpolate === 'cardinal' || interpolate === 'catmull-rom';\n        const step = interpolate === 'step' ? 'middle'\n            : interpolate === 'step-before' ? 'start'\n                : interpolate === 'step-after' ? 'end'\n                    : undefined;\n\n        if (isContinuousColor && colorField) {\n            // Continuous color (Quantity/Date): single line + colored points with a continuous visualMap.\n            // This mirrors Vega-Lite's common pattern: gray line + colored points.\n            const sorted = [...table].sort((a: any, b: any) => {\n                const ax = a[xField];\n                const bx = b[xField];\n                if (xIsTemporal) return new Date(ax).getTime() - new Date(bx).getTime();\n                const na = Number(ax);\n                const nb = Number(bx);\n                if (!isNaN(na) && !isNaN(nb)) return na - nb;\n                return String(ax).localeCompare(String(bx));\n            });\n\n            const pointData = sorted.map((r: any) => [r[xField], r[yField], r[colorField]]);\n            const lineData = sorted.map((r: any) => [r[xField], r[yField]]);\n\n            // VisualMap domain\n            const nums = sorted\n                .map((r: any) => Number(r[colorField]))\n                .filter((v: number) => !isNaN(v) && isFinite(v));\n            const cMin = nums.length ? Math.min(...nums) : 0;\n            const cMax = nums.length ? Math.max(...nums) : 1;\n\n            const decisionSchemeId = colorDecisions?.color?.schemeId;\n            const paletteFromDecision = decisionSchemeId ? getPaletteForScheme(decisionSchemeId) : undefined;\n\n            option.visualMap = {\n                type: 'continuous',\n                min: cMin,\n                max: cMax,\n                dimension: 2, // [x, y, color]\n                orient: 'vertical',\n                right: 10,\n                top: 'center',\n                // 优先使用 colordecisions palette，找不到时退回原来的绿色色带。\n                inRange: {\n                    color: paletteFromDecision && paletteFromDecision.length > 0\n                        ? paletteFromDecision\n                        : ['#f7fcf5', '#74c476', '#00441b'],\n                },\n                seriesIndex: 1, // apply to point series\n                name: colorField,\n                textStyle: { fontSize: 10 },\n                calculable: true,\n            };\n            option._visualMapWidth = 70;\n            option.graphic = [\n                ...(Array.isArray(option.graphic) ? option.graphic : (option.graphic ? [option.graphic] : [])),\n                {\n                    type: 'text' as const,\n                    right: 10,\n                    top: 4,\n                    z: 100,\n                    style: {\n                        text: colorField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                },\n            ];\n\n            option.series.push({\n                type: 'line',\n                data: lineData,\n                itemStyle: { color: '#cccccc' },\n                lineStyle: { color: '#cccccc' },\n                showSymbol: false,\n                symbol: 'none',\n                ...(smooth ? { smooth: true } : {}),\n                ...(step ? { step } : {}),\n            });\n            option.series.push({\n                type: 'scatter',\n                data: pointData,\n                symbol: 'circle',\n                symbolSize: 7,\n                itemStyle: { opacity: 1 },\n            });\n        } else if (colorField && isDiscrete(colorType)) {\n            // Multi-series line chart — 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 统一分配\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n\n            for (const [name, rows] of groups) {\n                const seriesData =\n                    yIsDiscrete && yCategories\n                        ? buildCategoryAlignedXYData(rows, xField, yField, yCategories)\n                        : xIsDiscrete\n                            ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                            : rows.map(r => [r[xField], r[yField]]);\n\n                const series: any = {\n                    name,\n                    type: 'line',\n                    data: seriesData,\n                    // Default line chart: don't draw point markers (unless showPoints is set).\n                    showSymbol: !!showPoints,\n                    symbol: showPoints ? 'circle' : 'none',\n                    ...(showPoints ? { symbolSize: 6 } : {}),\n                };\n                if (smooth) series.smooth = true;\n                if (step) series.step = step;\n\n                option.series.push(series);\n            }\n        } else {\n            // Single series\n            const seriesData =\n                yIsDiscrete && yCategories\n                    ? buildCategoryAlignedXYData(table, xField, yField, yCategories)\n                    : xIsDiscrete\n                        ? categories!.map(cat => {\n                            const row = table.find(r => String(r[xField]) === cat);\n                            return row ? row[yField] : null;\n                        })\n                        : table.map(r => [r[xField], r[yField]]);\n\n            const series: any = {\n                type: 'line',\n                data: seriesData,\n                // Default line chart: don't draw point markers (unless showPoints is set).\n                showSymbol: !!showPoints,\n                symbol: showPoints ? 'circle' : 'none',\n                ...(showPoints ? { symbolSize: 6 } : {}),\n            };\n            if (smooth) series.smooth = true;\n            if (step) series.step = step;\n\n            option.series.push(series);\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n    pivot: makeCartesianPivot({\n        permute: [['y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n\n/**\n * For category-axis line charts, align series data to the shared category array.\n * Returns an array of y-values (or null) indexed by category position.\n * Optional yTransform applies to non-null values (e.g. rank inversion for Bump chart).\n */\nfunction buildCategoryAlignedData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    categories: string[],\n    yTransform?: (y: number) => number,\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const v = row[yField];\n        if (v != null && !isNaN(Number(v))) map.set(String(row[xField]), Number(v));\n    }\n    return categories.map(cat => {\n        const v = map.get(cat);\n        return v != null ? (yTransform ? yTransform(v) : v) : null;\n    });\n}\n\n/**\n * For y-category axis line charts (x is numeric/time, y is discrete),\n * align points by y category order and output [x, yCategory] pairs.\n */\nfunction buildCategoryAlignedXYData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    yCategories: string[],\n): Array<[any, string]> {\n    const map = new Map<string, any>();\n    for (const row of rows) {\n        const key = String(row[yField] ?? '');\n        if (!map.has(key)) {\n            map.set(key, row[xField]);\n        }\n    }\n    return yCategories\n        .filter((cat) => map.has(cat))\n        .map((cat) => [map.get(cat), cat] as [any, string]);\n}\n\n/** RANK_SEMANTIC_TYPES: used to detect rank axis for Bump Chart (mirror vegalite/templates/bump.ts). */\nconst RANK_SEMANTIC_TYPES = new Set(['Rank', 'Score', 'Level']);\n\n/**\n * Bump Chart — line with points, rank axis reversed when y is rank-like (mirror vegalite/templates/bump.ts).\n * Use yAxis as category with data ['1','2',...,'maxRank'] and inverse: true so rank 1 is at top without\n * using value-axis inverse (which in ECharts moves the x-axis to the top). Series y values are category\n * indices (rank - 1). All serializable — no formatter needed.\n */\nexport const ecBumpChartDef: ChartTemplateDef = {\n    chart: 'Bump Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 80, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, semanticTypes } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const ySemType = toTypeString(semanticTypes?.[yField]);\n        const xSemType = toTypeString(semanticTypes?.[xField]);\n        const yIsRank = RANK_SEMANTIC_TYPES.has(ySemType);\n        const xIsRank = RANK_SEMANTIC_TYPES.has(xSemType);\n        const rankOnY = yIsRank && !xIsRank;\n        const rankOnX = xIsRank && !yIsRank;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const categories = xIsDiscrete ? extractCategories(table, xField, getCategoryOrder(ctx, 'x')) : undefined;\n\n        const rankValues = table.map((r: any) => Number(r[yField])).filter((v: number) => !isNaN(v) && isFinite(v));\n        const maxRank = rankValues.length ? Math.max(...rankValues) : 1;\n        const rankCategories = Array.from({ length: maxRank }, (_, i) => String(i + 1));\n        const rankToIndex = (rank: number) => Math.max(0, Math.min(maxRank - 1, Math.round(rank) - 1));\n\n        const toXValue = (v: any): number | string => {\n            if (v == null) return NaN;\n            if (xIsTemporal) return typeof v === 'number' ? v : new Date(String(v)).getTime();\n            const n = Number(v);\n            return isNaN(n) ? String(v) : n;\n        };\n        const sortRowsByX = (rows: any[]) =>\n            [...rows].sort((a, b) => {\n                const ax = toXValue(a[xField]);\n                const bx = toXValue(b[xField]);\n                if (typeof ax === 'number' && typeof bx === 'number') return ax - bx;\n                return String(ax).localeCompare(String(bx));\n            });\n\n        const option: any = {\n            tooltip: { trigger: 'axis' },\n            xAxis: (() => {\n                const type = xIsDiscrete ? 'category' : xIsTemporal ? 'time' : 'value';\n                const base: any = {\n                    type,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisLine: { show: true },\n                    ...(categories ? { data: categories } : {}),\n                };\n                if (xIsDiscrete && categories) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: areCategoriesNumeric(categories) ? 0 : 90 };\n                } else if (xIsTemporal) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: 90 };\n                } else {\n                    base.axisTick = { show: true };\n                }\n                return base;\n            })(),\n            yAxis: rankOnY\n                ? {\n                    type: 'category',\n                    data: rankCategories,\n                    inverse: true,\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisLabel: { rotate: 0 },\n                    axisTick: { show: true, alignWithLabel: true },\n                }\n                : {\n                    type: 'value',\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                    axisLabel: { rotate: 0 },\n                },\n            series: [],\n        };\n        if (rankOnY) {\n            option.tooltip = {\n                trigger: 'axis',\n                formatter: (params: any) => {\n                    const list = Array.isArray(params) ? params : [params];\n                    if (list.length === 0) return '';\n                    const p = list[0];\n                    const cat = p.axisValue ?? p.name ?? '';\n                    let html = `<b>${cat}</b><br/>`;\n                    list.forEach((item: any) => {\n                        const idx = item.value != null ? Number(item.value) : null;\n                        const displayRank = idx != null && Number.isInteger(idx) ? String(idx + 1) : '–';\n                        html += `${item.marker} ${item.seriesName}: ${displayRank}<br/>`;\n                    });\n                    return html;\n                },\n            };\n        } else {\n            option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: yField };\n        }\n\n        const baseSeriesOpt = { showSymbol: true, symbolSize: 6, smooth: true };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n            for (const [name, rows] of groups) {\n                const orderedRows = xIsDiscrete ? rows : sortRowsByX(rows);\n                const seriesData = xIsDiscrete\n                    ? buildCategoryAlignedData(rows, xField, yField, categories!, rankOnY ? rankToIndex : undefined)\n                    : orderedRows.map(r => [toXValue(r[xField]), rankOnY ? rankToIndex(Number(r[yField])) : r[yField]]);\n                option.series.push({\n                    name,\n                    type: 'line',\n                    data: seriesData,\n                    ...baseSeriesOpt,\n                    // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 统一分配\n                });\n            }\n        } else {\n            const rows = xIsDiscrete ? table : sortRowsByX(table);\n            const seriesData = xIsDiscrete\n                ? buildCategoryAlignedData(rows, xField, yField, categories!, rankOnY ? rankToIndex : undefined)\n                : rows.map(r => [toXValue(r[xField]), rankOnY ? rankToIndex(Number(r[yField])) : r[yField]]);\n            option.series.push({ type: 'line', data: seriesData, ...baseSeriesOpt });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Slope Chart (slopegraph) template.\n *\n * One straight line **per category** connecting that category's value at exactly\n * **two periods**, with a point marker at each end. The read is the slope /\n * direction of change and the crossovers between categories — the 2-point\n * value-change cousin of the Bump Chart, so this mirrors ecBumpChartDef /\n * ecLineChartDef wherever practical.\n *\n * Contract:\n *   x      — period, rendered as a *category* axis with exactly two positions\n *            (temporal / numeric period fields are bucketed into two ordered\n *            category labels, so the slope — not the gap — carries meaning).\n *   y      — value (quantitative).\n *   color  — category → one line per value (legend).\n *   detail — category → one line per value (used when color is absent).\n *\n * The line is always straight (no `smooth`) and shows symbols at both ends.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\n\n/**\n * Order the period categories naturally: numerically when every label parses as\n * a number, chronologically when every label parses as a date, else preserve\n * the order ECharts already extracted from the data.\n */\nfunction orderPeriods(categories: string[]): string[] {\n    if (categories.length <= 1) return categories;\n    const allNumeric = categories.every(c => c.trim() !== '' && !isNaN(Number(c)));\n    if (allNumeric) return [...categories].sort((a, b) => Number(a) - Number(b));\n    const allDates = categories.every(c => !isNaN(Date.parse(c)));\n    if (allDates) return [...categories].sort((a, b) => Date.parse(a) - Date.parse(b));\n    return categories;\n}\n\n/** Align a group's rows to the shared period categories → y value per period. */\nfunction alignToPeriods(\n    rows: any[],\n    xField: string,\n    yField: string,\n    categories: string[],\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const v = row[yField];\n        if (v != null && !isNaN(Number(v))) map.set(String(row[xField]), Number(v));\n    }\n    return categories.map(cat => {\n        const v = map.get(cat);\n        return v != null ? v : null;\n    });\n}\n\nexport const ecSlopeChartDef: ChartTemplateDef = {\n    chart: 'Slope Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n        paramOverrides: {\n            defaultBandSize: 120,\n            continuousMarkCrossSection: { x: 0, y: 0, seriesCountAxis: 'auto' },\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        // One line per category: prefer the color field, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        // The period axis is always a two-band category axis (slopegraph).\n        const categories = orderPeriods(extractCategories(table, xField, getCategoryOrder(ctx, 'x')));\n\n        const option: any = {\n            tooltip: { trigger: 'axis' },\n            xAxis: {\n                type: 'category',\n                data: categories,\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                boundaryGap: true,\n                axisLine: { show: true },\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: { rotate: 0 },\n            },\n            yAxis: {\n                type: 'value',\n                name: yField,\n                nameLocation: 'middle',\n                nameGap: 40,\n                axisTick: { show: true },\n                axisLabel: { rotate: 0 },\n            },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: yField };\n\n        // Slope charts emphasize the change, not the absolute level, so let the\n        // value axis fit the data unless the zero decision says otherwise.\n        if (channelSemantics.y?.zero) {\n            option.yAxis.scale = !channelSemantics.y.zero.zero;\n        } else {\n            option.yAxis.scale = true;\n        }\n\n        const baseSeriesOpt = {\n            type: 'line' as const,\n            showSymbol: true,\n            symbol: 'circle' as const,\n            symbolSize: 7,\n            // Straight segments — never smooth/monotone for a slopegraph.\n            smooth: false as const,\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            option.legend = { data: [...groups.keys()] };\n            for (const [name, rows] of groups) {\n                option.series.push({\n                    name,\n                    ...baseSeriesOpt,\n                    data: alignToPeriods(rows, xField, yField, categories),\n                    // Colors assigned by ecApplyLayoutToSpec from colorDecisions.\n                });\n            }\n        } else {\n            option.series.push({\n                ...baseSeriesOpt,\n                data: alignToPeriods(table, xField, yField, categories),\n            });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Area Chart template (single + multi-series, stacked / layered).\n *\n * Contrast with VL:\n *   VL: mark = \"area\" with encoding; stacking via y.stack property\n *   EC: line series with areaStyle; stacking via series[].stack property\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → horizontal; otherwise vertical (x-axis only). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\nexport const ecAreaChartDef: ChartTemplateDef = {\n    chart: 'Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const yIsDiscrete = isDiscrete(yCS.type);\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, getCategoryOrder(ctx, 'x'))\n            : undefined;\n        const yCategories = yIsDiscrete ? extractCategories(table, yField, getCategoryOrder(ctx, 'y')) : undefined;\n\n        const option: any = {\n            tooltip: { trigger: 'axis' },\n            xAxis: (() => {\n                const type = xIsDiscrete ? 'category' : xIsTemporal ? 'time' : 'value';\n                const base: any = {\n                    type,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    boundaryGap: xIsDiscrete,\n                    ...(categories ? { data: categories } : {}),\n                };\n                if (xIsDiscrete && categories) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: areCategoriesNumeric(categories) ? 0 : 90 };\n                } else if (xIsTemporal) {\n                    base.axisTick = { show: true, alignWithLabel: true };\n                    base.axisLabel = { rotate: 90 };\n                } else {\n                    base.axisTick = { show: true };\n                    base.axisLabel = { rotate: 0 };\n                }\n                return base;\n            })(),\n            yAxis: yIsDiscrete && yCategories\n                ? {\n                    type: 'category',\n                    data: yCategories,\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: 0 },\n                }\n                : {\n                    type: 'value',\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                    axisLabel: { rotate: 0 },\n                },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: yField };\n\n        // ECharts: scale=true means \"data-fit\", scale=false means \"include zero\"\n        if (channelSemantics.y?.zero) {\n            option.yAxis.scale = !channelSemantics.y.zero.zero;\n        }\n\n        // Stack / layer mode\n        const stackMode = chartProperties?.stackMode;\n        const stackGroup = stackMode === 'layered' ? undefined : 'total';\n\n        // Opacity\n        const opacity = chartProperties?.opacity ?? 0.7;\n\n        // Interpolation / smooth\n        const interpolate = chartProperties?.interpolate;\n        const smooth = interpolate === 'monotone' || interpolate === 'basis' ||\n            interpolate === 'cardinal' || interpolate === 'catmull-rom';\n        const step = interpolate === 'step' ? 'middle'\n            : interpolate === 'step-before' ? 'start'\n                : interpolate === 'step-after' ? 'end'\n                    : undefined;\n\n        if (isContinuousColor && colorField) {\n            // Continuous color (Quantity/Date): single area + colored points with continuous visualMap (mirror VL layer: area + point).\n            const sorted = [...table].sort((a: any, b: any) => {\n                const ax = a[xField];\n                const bx = b[xField];\n                if (xIsTemporal) return new Date(ax).getTime() - new Date(bx).getTime();\n                const na = Number(ax);\n                const nb = Number(bx);\n                if (!isNaN(na) && !isNaN(nb)) return na - nb;\n                return String(ax).localeCompare(String(bx));\n            });\n\n            const pointData = sorted.map((r: any) => [r[xField], r[yField], r[colorField]]);\n            const lineData = sorted.map((r: any) => [r[xField], r[yField]]);\n\n            const nums = sorted\n                .map((r: any) => Number(r[colorField]))\n                .filter((v: number) => !isNaN(v) && isFinite(v));\n            const cMin = nums.length ? Math.min(...nums) : 0;\n            const cMax = nums.length ? Math.max(...nums) : 1;\n\n            option.tooltip = { trigger: 'item' };\n            option._encodingTooltip = {\n                trigger: 'item',\n                parts: [\n                    { from: 'data', index: 0, label: xField, format: xIsTemporal ? 'temporal' : 'number', temporalFormat: channelSemantics.x?.temporalFormat ?? '%b %d, %Y' },\n                    { from: 'data', index: 1, label: yField, format: 'number' },\n                    { from: 'data', index: 2, label: colorField, format: colorType === 'temporal' ? 'temporal' : 'number', temporalFormat: channelSemantics.color?.temporalFormat ?? '%b %d, %Y' },\n                ],\n            };\n\n            const decisionSchemeId = colorDecisions?.color?.schemeId;\n            const paletteFromDecision = decisionSchemeId ? getPaletteForScheme(decisionSchemeId) : undefined;\n\n            option.visualMap = {\n                type: 'continuous',\n                min: cMin,\n                max: cMax,\n                dimension: 2,\n                orient: 'vertical',\n                right: 10,\n                top: 'center',\n                inRange: {\n                    color: paletteFromDecision && paletteFromDecision.length > 0\n                        ? paletteFromDecision\n                        : ['#f7fcf5', '#74c476', '#00441b'],\n                },\n                seriesIndex: 1,\n                name: colorField,\n                textStyle: { fontSize: 10 },\n                calculable: true,\n            };\n            option._visualMapWidth = 70;\n            option.graphic = [\n                ...(Array.isArray(option.graphic) ? option.graphic : (option.graphic ? [option.graphic] : [])),\n                {\n                    type: 'text' as const,\n                    right: 10,\n                    top: 4,\n                    z: 100,\n                    style: {\n                        text: colorField,\n                        fontSize: 11,\n                        fontWeight: 'bold',\n                        fill: '#333',\n                        textAlign: 'right',\n                    },\n                },\n            ];\n\n            option.series.push({\n                type: 'line',\n                data: lineData,\n                showSymbol: false,\n                symbol: 'none',\n                areaStyle: { opacity },\n                itemStyle: { color: '#999' },\n                lineStyle: { color: '#999' },\n                ...(smooth ? { smooth: true } : {}),\n                ...(step ? { step } : {}),\n            });\n            option.series.push({\n                type: 'scatter',\n                data: pointData,\n                symbol: 'circle',\n                symbolSize: 8,\n                itemStyle: { opacity: 1 },\n            });\n        } else if (colorField) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n\n            // ECharts stacking only works correctly with category x-axis (stacks by index).\n            // For stacked + continuous (value) x + value y: use category axis with sorted unique x as labels,\n            // and value-aligned y arrays. Skip when y is category (e.g. x=Quantity, y=Step) — keep [x,y] pairs.\n            const useValueAlignedStack =\n                stackGroup && !xIsDiscrete && !xIsTemporal && !yIsDiscrete;\n            const sortedX = useValueAlignedStack ? getSortedUniqueXValues(table, xField) : undefined;\n\n            if (useValueAlignedStack && sortedX && sortedX.length > 0) {\n                option.xAxis = {\n                    type: 'category',\n                    data: sortedX,\n                    boundaryGap: false,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisLabel: { rotate: 0 },\n                };\n            }\n\n            // For temporal x with stacking, align all series to the same timeline so stack indices match.\n            const sortedDates = xIsTemporal ? getSortedUniqueDates(table, xField) : undefined;\n\n            for (const [name, rows] of groups) {\n                const seriesData = xIsDiscrete\n                    ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                    : useValueAlignedStack && sortedX\n                        ? buildValueAlignedYData(rows, xField, yField, sortedX)\n                        : sortedDates\n                            ? buildTimeAlignedData(rows, xField, yField, sortedDates)\n                            : rows.map(r => [r[xField], r[yField]]);\n\n                const series: any = {\n                    name,\n                    type: 'line',\n                    data: seriesData,\n                    showSymbol: false,\n                    symbol: 'none',\n                    areaStyle: { opacity },\n                    // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 统一分配\n                };\n                if (stackGroup) series.stack = stackGroup;\n                if (smooth) series.smooth = true;\n                if (step) series.step = step;\n\n                option.series.push(series);\n            }\n        } else {\n            const seriesData =\n                yIsDiscrete && yCategories\n                    ? buildCategoryAlignedXYData(table, xField, yField, yCategories)\n                    : xIsDiscrete\n                        ? categories!.map(cat => {\n                            const row = table.find(r => String(r[xField]) === cat);\n                            return row ? row[yField] : null;\n                        })\n                        : xIsTemporal\n                            ? (() => {\n                                const sorted = [...table].sort((a, b) => new Date(a[xField]).getTime() - new Date(b[xField]).getTime());\n                                return sorted.map(r => [r[xField], r[yField]]);\n                            })()\n                            : table.map(r => [r[xField], r[yField]]);\n\n            const series: any = {\n                type: 'line',\n                data: seriesData,\n                showSymbol: false,\n                symbol: 'none',\n                areaStyle: { opacity },\n            };\n            if (smooth) series.smooth = true;\n            if (step) series.step = step;\n            option.series.push(series);\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 0.7,\n            check: (ctx) => ({\n                applicable: !!ctx.encodings.color?.field && ctx.chartProperties?.stackMode === 'layered',\n            }),\n        } as ChartPropertyDef,\n        {\n            key: 'stackMode', label: 'Stack', type: 'discrete', options: [\n                { value: undefined, label: 'Stacked (default)' },\n                { value: 'normalize', label: 'Normalize (100%)' },\n                { value: 'center', label: 'Center' },\n                { value: 'layered', label: 'Layered (overlap)' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n\n/** Align series data to category array, returning y values by category position. */\nfunction buildCategoryAlignedData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    categories: string[],\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const v = row[yField];\n        if (v != null && !isNaN(Number(v))) {\n            const k = String(row[xField]);\n            map.set(k, (map.get(k) ?? 0) + Number(v));\n        }\n    }\n    return categories.map(cat => map.get(cat) ?? null);\n}\n\n/** For y-category axis (x numeric, y discrete): output [x, yCategory] pairs in y category order. */\nfunction buildCategoryAlignedXYData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    yCategories: string[],\n): Array<[any, string]> {\n    const map = new Map<string, any>();\n    for (const row of rows) {\n        const key = String(row[yField] ?? '');\n        if (!map.has(key)) {\n            map.set(key, row[xField]);\n        }\n    }\n    return yCategories\n        .filter((cat) => map.has(cat))\n        .map((cat) => [map.get(cat), cat] as [any, string]);\n}\n\n/** Collect sorted unique dates (as ISO strings) from table for temporal x. */\nfunction getSortedUniqueDates(table: any[], xField: string): string[] {\n    const set = new Set<string>();\n    for (const row of table) {\n        const v = row[xField];\n        if (v != null && v !== '') set.add(String(v));\n    }\n    return [...set].sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n}\n\n/** Collect sorted unique numeric x values for value-aligned stacking (category x + y arrays). */\nfunction getSortedUniqueXValues(table: any[], xField: string): number[] {\n    const set = new Set<number>();\n    for (const row of table) {\n        const v = row[xField];\n        if (v == null || v === '') continue;\n        const n = Number(v);\n        if (Number.isFinite(n)) set.add(n);\n    }\n    return [...set].sort((a, b) => a - b);\n}\n\n/** Build y-only array aligned to sorted x for one series; missing x get y=0. Used with category xAxis.data. */\nfunction buildValueAlignedYData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    sortedX: number[],\n): number[] {\n    const map = new Map<number, number>();\n    for (const row of rows) {\n        const x = Number(row[xField]);\n        const y = Number(row[yField]);\n        if (!Number.isFinite(x)) continue;\n        map.set(x, Number.isFinite(y) ? y : 0);\n    }\n    return sortedX.map(x => map.get(x) ?? 0);\n}\n\n/** Build time-aligned [date, value] data for one series so stacking matches across series. Missing dates get y=0. */\nfunction buildTimeAlignedData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    sortedDates: string[],\n): Array<[string, number]> {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const n = Number(row[yField]);\n        map.set(String(row[xField]), Number.isFinite(n) ? n : 0);\n    }\n    return sortedDates.map(d => [d, map.get(d) ?? 0]);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Range Area Chart (band / high–low / area-range) template.\n *\n * A filled band showing a **low–high range** at each x. ECharts has no native\n * ranged-area mark, so the idiomatic fully-serializable band (NO renderItem) is\n * a pair of stacked line series per group:\n *\n *   1. a TRANSPARENT base series at the lower bound (`stack`, line opacity 0,\n *      no areaStyle) — it only provides the stack floor;\n *   2. a series of (upper − lower) DELTAS on the same stack with a translucent\n *      `areaStyle`. Because the delta is stacked on the transparent base, its\n *      area fills the region between the lower bound and the upper bound — a\n *      translucent ribbon BETWEEN the two bounds, never a solid block down to\n *      the axis.\n *\n * The base series carries an explicit (transparent) `itemStyle.color` so the\n * color-assignment pass skips it and does not consume a palette slot; the delta\n * series gets the group's palette color for both its line and its fill.\n *\n * Contract:\n *   x      — position (rendered on a category axis of sorted unique values so\n *            the two stacked series align index-for-index).\n *   y      — lower bound (quantitative).\n *   y2     — upper bound (quantitative).\n *   color  — optional series → one band (base+delta pair) per value (legend).\n *\n * The value axis fits the band (`scale: true`) — a ranged area reads its extent,\n * not its distance from zero.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** Sorted unique x values as display labels (numeric → numeric sort, date → chronological, else data order). */\nfunction orderedXLabels(\n    table: any[],\n    xField: string,\n    xType: string | undefined,\n    ordinalOrder: string[] | undefined,\n): { labels: string[]; isTemporal: boolean } {\n    if (isDiscrete(xType)) {\n        return { labels: extractCategories(table, xField, ordinalOrder), isTemporal: false };\n    }\n    const isTemporal = xType === 'temporal';\n    const seen = new Map<string, any>();\n    for (const row of table) {\n        const v = row[xField];\n        if (v == null || v === '') continue;\n        const key = String(v);\n        if (!seen.has(key)) seen.set(key, v);\n    }\n    const raw = [...seen.values()];\n    if (isTemporal) {\n        raw.sort((a, b) => new Date(a).getTime() - new Date(b).getTime());\n    } else {\n        raw.sort((a, b) => Number(a) - Number(b));\n    }\n    return { labels: raw.map(v => String(v)), isTemporal };\n}\n\n/** Format a temporal label for the category axis (short, readable). */\nfunction fmtTemporalLabel(s: string): string {\n    const t = new Date(s).getTime();\n    if (!Number.isFinite(t)) return s;\n    return new Date(t).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n}\n\n/** Map a group's rows → {lower, upper} per x label. */\nfunction alignBounds(\n    rows: any[],\n    xField: string,\n    lowField: string,\n    highField: string,\n    labels: string[],\n): Array<{ low: number | null; high: number | null }> {\n    const map = new Map<string, { low: number; high: number }>();\n    for (const row of rows) {\n        const lo = Number(row[lowField]);\n        const hi = Number(row[highField]);\n        if (!Number.isFinite(lo) || !Number.isFinite(hi)) continue;\n        map.set(String(row[xField]), { low: Math.min(lo, hi), high: Math.max(lo, hi) });\n    }\n    return labels.map(l => {\n        const v = map.get(l);\n        return v ? { low: v.low, high: v.high } : { low: null, high: null };\n    });\n}\n\nexport const ecRangeAreaChartDef: ChartTemplateDef = {\n    chart: 'Range Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'y2', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const y2CS = channelSemantics.y2;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field || !y2CS?.field) return;\n        const xField = xCS.field;\n        const lowField = yCS.field;\n        const highField = y2CS.field;\n\n        const { labels, isTemporal } = orderedXLabels(\n            table, xField, xCS.type, getCategoryOrder(ctx, 'x'),\n        );\n        const displayLabels = isTemporal ? labels.map(fmtTemporalLabel) : labels;\n\n        const opacity = ctx.chartProperties?.opacity ?? 0.35;\n\n        // Title the value axis with BOTH bound fields (matching Vega-Lite's\n        // native \"low, high\" axis title), falling back to the single name.\n        const valueTitle = lowField === highField ? lowField : `${lowField}, ${highField}`;\n\n        const option: any = {\n            tooltip: {\n                trigger: 'axis',\n                // Show the low–high range at each x (the delta series carries the\n                // original bounds as `_low` / `_high`; the transparent base\n                // series has plain numeric data and is skipped).\n                formatter: (params: any) => {\n                    const list = Array.isArray(params) ? params : [params];\n                    if (list.length === 0) return '';\n                    const head = list[0].axisValueLabel ?? list[0].axisValue ?? list[0].name ?? '';\n                    const lines = [`${xField}: ${head}`];\n                    for (const p of list) {\n                        const d = p?.data;\n                        if (d && typeof d === 'object' && d._high != null) {\n                            const nm = p.seriesName && !String(p.seriesName).startsWith('__base')\n                                ? p.seriesName\n                                : 'Range';\n                            lines.push(`${nm}: ${fmtNum(d._low)} – ${fmtNum(d._high)}`);\n                        }\n                    }\n                    return lines.join('<br/>');\n                },\n            },\n            xAxis: {\n                type: 'category',\n                data: displayLabels,\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                boundaryGap: false,\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: { rotate: isTemporal ? 30 : 0 },\n            },\n            yAxis: {\n                type: 'value',\n                // A ranged area reads its extent, not its distance from zero —\n                // fit the band rather than forcing a zero baseline.\n                scale: true,\n                name: valueTitle,\n                nameLocation: 'middle',\n                nameGap: 45,\n                axisTick: { show: true },\n                axisLabel: { rotate: 0 },\n            },\n            series: [],\n        };\n\n        const pushBand = (rows: any[], name: string | undefined, idx: number) => {\n            const bounds = alignBounds(rows, xField, lowField, highField, labels);\n            const stackId = `band-${idx}`;\n            const baseName = `__base-${idx}`;\n            // 1. Transparent base at the lower bound (explicit color → skipped by\n            //    the palette pass, so it never consumes a band color).\n            option.series.push({\n                name: baseName,\n                type: 'line',\n                stack: stackId,\n                // Cumulative stacking regardless of sign — otherwise ECharts\n                // routes a negative lower bound into a separate negative stack\n                // and the band collapses to the zero baseline (see the\n                // zero-crossing case).\n                stackStrategy: 'all',\n                data: bounds.map(b => b.low),\n                symbol: 'none',\n                showSymbol: false,\n                lineStyle: { opacity: 0 },\n                itemStyle: { color: 'transparent' },\n                silent: true,\n                z: 1,\n            });\n            // 2. Translucent (upper − lower) delta on the same stack → fills the\n            //    ribbon between the bounds. Data items carry the original bounds\n            //    for the tooltip.\n            option.series.push({\n                name: name ?? lowField,\n                type: 'line',\n                stack: stackId,\n                stackStrategy: 'all',\n                data: bounds.map(b =>\n                    b.low != null && b.high != null\n                        ? { value: b.high - b.low, _low: b.low, _high: b.high }\n                        : { value: null, _low: null, _high: null },\n                ),\n                symbol: 'none',\n                showSymbol: false,\n                lineStyle: { width: 1.5, opacity: 0.9 },\n                areaStyle: { opacity },\n                emphasis: { focus: 'series' },\n                z: 2,\n            });\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n            let idx = 0;\n            for (const [name, rows] of groups) {\n                pushBand(rows, name, idx);\n                idx++;\n            }\n        } else {\n            pushBand(table, undefined, 0);\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n\n/** Compact number formatting for the tooltip. */\nfunction fmtNum(v: unknown): string {\n    const n = Number(v);\n    if (!Number.isFinite(n)) return String(v ?? '');\n    return Number.isInteger(n) ? String(n) : n.toFixed(2);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Pie Chart template.\n *\n * Contrast with VL:\n *   VL: mark = \"arc\" with theta (angular extent) + color (slice groups)\n *   EC: series type = 'pie' with data = [{ name, value }, ...]\n *\n * Pie charts have no axes — a fundamentally different layout from bar/line/scatter.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, computeCircumferencePressure, computeEffectiveBarCount } from './utils';\n\nexport const ecPieChartDef: ChartTemplateDef = {\n    chart: 'Pie Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['size', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const colorField = channelSemantics.color?.field;\n        const sizeField = channelSemantics.size?.field;\n\n        // Build pie data: { name, value } pairs\n        const pieData: { name: string; value: number }[] = [];\n\n        if (colorField && sizeField) {\n            // color = category (slice label), size = measure (slice value)\n            // Aggregate: sum values per category\n            const agg = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                const val = Number(row[sizeField]) || 0;\n                agg.set(cat, (agg.get(cat) ?? 0) + val);\n            }\n            // Preserve ordinal sort if available\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                pieData.push({ name: cat, value: agg.get(cat) ?? 0 });\n            }\n        } else if (colorField) {\n            // No size field → count occurrences per category\n            const counts = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                counts.set(cat, (counts.get(cat) ?? 0) + 1);\n            }\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                pieData.push({ name: cat, value: counts.get(cat) ?? 0 });\n            }\n        } else if (sizeField) {\n            // Only size field, no categories\n            for (const row of table) {\n                const val = Number(row[sizeField]) || 0;\n                pieData.push({ name: String(val), value: val });\n            }\n        }\n\n        const innerRadius = chartProperties?.innerRadius ?? 0;\n\n        // Slice ordering (design choice): keep data/category order by default, or\n        // sort by value so the largest/smallest slice leads.\n        const sortSlices = chartProperties?.sortSlices;\n        if (sortSlices === 'descending') {\n            pieData.sort((a, b) => b.value - a.value);\n        } else if (sortSlices === 'ascending') {\n            pieData.sort((a, b) => a.value - b.value);\n        }\n\n        // Slice-label content (design choice). Defaults to category + percent,\n        // ECharts' long-standing pie label.\n        const labelType = chartProperties?.labelType ?? 'categoryPercent';\n        const labelFormatter: Record<string, string | undefined> = {\n            none: undefined,\n            category: '{b}',\n            value: '{c}',\n            percent: '{d}%',\n            categoryPercent: '{b}: {d}%',\n        };\n        const formatter = labelFormatter[labelType] ?? '{b}: {d}%';\n\n        // ── Circumference-pressure sizing (spring model) ──────────────\n        // Pie slices have variable width — use effective bar count based\n        // on the smallest slice to determine worst-case pressure.\n        const sliceValues = pieData.map(d => d.value);\n        const effectiveCount = computeEffectiveBarCount(sliceValues);\n        const { radius: pressureRadius, canvasW: rawCanvasW, canvasH }\n            = computeCircumferencePressure(effectiveCount, ctx.canvasSize, {\n                minArcPx: 45,\n                minRadius: 60,\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n                // 增大 margin，给外侧标签留出更多画布空间，避免文字被裁切。\n                margin: 80,\n            });\n\n        const canvasW = rawCanvasW;\n\n        // ── Adaptive label sizing ─────────────────────────────────────\n        // Scale font size and label width based on slice count so that\n        // labels stay readable without crowding.\n        const n = pieData.length;\n        const labelFontSize = n <= 4 ? 13 : n <= 8 ? 11 : n <= 15 ? 10 : 9;\n\n        // 估算最长标签需要的宽度（按字符数粗略估算），再反推饼图半径与标签宽度。\n        const maxLabelChars = pieData.reduce((m, d) => {\n            const len = String(d.name ?? '').length;\n            return len > m ? len : m;\n        }, 0);\n        const approxCharWidth = labelFontSize * 0.55; // 略小一点，避免过度放大 label 宽度\n        const neededLabelWidth = Math.max(40, maxLabelChars * approxCharWidth);\n\n        // Label width budget: available space outside the pie on each side.\n        // Shrink pie more when there are many slices or标签过长，以便让文字尽量完全展示在画布内。\n        const baseRadiusFraction = n <= 4 ? 0.72 : n <= 8 ? 0.62 : n <= 15 ? 0.54 : 0.48;\n        const halfCanvas = (canvasW - 40) / 2;\n        const padding = 16;\n        const maxLabelWidthAvailable = Math.max(40, halfCanvas - halfCanvas * baseRadiusFraction - padding);\n        const labelBudget = Math.min(neededLabelWidth, maxLabelWidthAvailable);\n        const radiusFraction = baseRadiusFraction;\n\n        // 根据需要的文字宽度，适度调整引导线长度，但整体保持较短，避免文字被推到画布外。\n        const labelLineLength = Math.max(10, Math.min(22, 10 + neededLabelWidth * 0.10));\n        const labelLineLength2 = Math.max(8, Math.min(26, 8 + neededLabelWidth * 0.15));\n\n        // Pie radius\n        const outerRadiusPx = Math.max(60, Math.round(\n            Math.min(pressureRadius,\n                (canvasW - 40) / 2 * radiusFraction,\n                (canvasH - 40) / 2 * radiusFraction)));\n        const outerRadius = `${outerRadiusPx}px`;\n\n        const categoryLabel = colorField ?? 'Category';\n        const valueLabel = sizeField ?? 'Value';\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            _encodingTooltip: {\n                trigger: 'item',\n                parts: [\n                    { from: 'name', label: categoryLabel },\n                    { from: 'value', label: valueLabel, format: 'number' },\n                ],\n            },\n            series: [{\n                type: 'pie',\n                radius: innerRadius > 0\n                    ? [`${Math.round(outerRadiusPx * innerRadius / 100)}px`, outerRadius]\n                    : ['0%', outerRadius],\n                center: ['50%', '50%'],\n                data: pieData,\n                emphasis: {\n                    itemStyle: {\n                        shadowBlur: 10,\n                        shadowOffsetX: 0,\n                        shadowColor: 'rgba(0, 0, 0, 0.5)',\n                    },\n                },\n                label: {\n                    show: labelType !== 'none',\n                    formatter: formatter ?? '{b}: {d}%',\n                    fontSize: labelFontSize,\n                    width: labelBudget,\n                    overflow: 'break',     // word-wrap long labels\n                },\n                // 让 ECharts 尝试自动避免标签重叠，并在必要时隐藏重叠标签，\n                // 减少标签被挤到画布外的概率。\n                avoidLabelOverlap: true,\n                labelLayout: {\n                    hideOverlap: true,\n                },\n                labelLine: {\n                    show: true,\n                    length: labelLineLength,\n                    length2: labelLineLength2,\n                },\n                itemStyle: {\n                    borderRadius: chartProperties?.cornerRadius ?? 0,\n                },\n            }],\n            // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 设置 option.color\n        };\n\n        // Canvas size from context\n        option._width = canvasW;\n        option._height = canvasH;\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'innerRadius', label: 'Donut', type: 'continuous', min: 0, max: 60, step: 5, defaultValue: 0 } as ChartPropertyDef,\n        { key: 'cornerRadius', label: 'Corners', type: 'continuous', min: 0, max: 10, step: 1, defaultValue: 0 } as ChartPropertyDef,\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n            options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        } as ChartPropertyDef,\n        {\n            key: 'labelType', label: 'Labels', type: 'discrete',\n            options: [\n                { value: 'categoryPercent', label: 'Name + %' },\n                { value: 'category', label: 'Name' },\n                { value: 'value', label: 'Value' },\n                { value: 'percent', label: 'Percent' },\n                { value: 'none', label: 'None' },\n            ],\n            defaultValue: 'categoryPercent',\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Heatmap template.\n *\n * Contrast with VL:\n *   VL: mark = \"rect\" with x (nominal), y (nominal), color (quantitative)\n *   EC: series type = 'heatmap' with data = [[xIdx, yIdx, value], ...]\n *       and a visualMap component for the color scale.\n */\n\nimport { ChartTemplateDef, EncodingActionDef } from '../../core/types';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { extractCategories } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → use horizontal labels; otherwise vertical. */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\n/** Map VL-style scheme names to ECharts built-in color ranges. */\nconst SCHEME_COLORS: Record<string, string[]> = {\n    viridis: ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],\n    inferno: ['#000004', '#420a68', '#932667', '#dd513a', '#fca50a', '#fcffa4'],\n    magma: ['#000004', '#3b0f70', '#8c2981', '#de4968', '#fe9f6d', '#fcfdbf'],\n    plasma: ['#0d0887', '#6a00a8', '#b12a90', '#e16462', '#fca636', '#f0f921'],\n    turbo: ['#30123b', '#4662d7', '#35abed', '#1ae4b6', '#72fe5e', '#c8ef34', '#faba39', '#f66b19', '#d23105', '#7a0403'],\n    blues: ['#f7fbff', '#6baed6', '#08519c'],\n    reds: ['#fff5f0', '#fb6a4a', '#a50f15'],\n    greens: ['#f7fcf5', '#74c476', '#00441b'],\n    oranges: ['#fff5eb', '#fd8d3c', '#7f2704'],\n    purples: ['#fcfbfd', '#9e9ac8', '#3f007d'],\n    greys: ['#ffffff', '#969696', '#252525'],\n    blueorange: ['#08519c', '#f7fbff', '#ff7f00'],\n    redblue: ['#a50f15', '#ffffff', '#08519c'],\n};\n\nconst DEFAULT_HEATMAP_SCHEME = 'blues';\n\nfunction isDivergingHeatmapScheme(scheme: string | undefined): boolean {\n    return scheme === 'blueorange' || scheme === 'redblue';\n}\n\nexport const ecHeatmapDef: ChartTemplateDef = {\n    chart: 'Heatmap',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'color',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true }, y: { banded: true } },\n        // No paramOverrides needed — uses the backend default band size\n        // (defaultBandSize=20, minStep=6), matching VL heatmap sizing.\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, colorDecisions, encodings } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorCS = channelSemantics.color;\n\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        const colorField = colorCS?.field;\n        if (!xField || !yField) return;\n\n        const xCategories = extractCategories(table, xField, xCS?.ordinalSortOrder);\n        const yCategories = extractCategories(table, yField, yCS?.ordinalSortOrder);\n\n        // Build heatmap data: [xIndex, yIndex, value]\n        const xIndexMap = new Map(xCategories.map((c, i) => [c, i]));\n        const yIndexMap = new Map(yCategories.map((c, i) => [c, i]));\n\n        const heatData: [number, number, number][] = [];\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n\n        // Aggregate if multiple rows per cell (sum)\n        const cellMap = new Map<string, number>();\n        for (const row of table) {\n            const xKey = String(row[xField]);\n            const yKey = String(row[yField]);\n            const val = colorField ? (Number(row[colorField]) || 0) : 1;\n            const cellKey = `${xKey}|||${yKey}`;\n            cellMap.set(cellKey, (cellMap.get(cellKey) ?? 0) + val);\n        }\n\n        for (const [cellKey, val] of cellMap) {\n            const [xKey, yKey] = cellKey.split('|||');\n            const xi = xIndexMap.get(xKey);\n            const yi = yIndexMap.get(yKey);\n            if (xi !== undefined && yi !== undefined) {\n                heatData.push([xi, yi, val]);\n                if (val < minVal) minVal = val;\n                if (val > maxVal) maxVal = val;\n            }\n        }\n\n        if (minVal === Infinity) minVal = 0;\n        if (maxVal === -Infinity) maxVal = 1;\n\n        // Color scheme\n        // Category-B encoding override: the compiler already composed\n        // chartProperties.colorScheme onto encoding.color.scheme before assembly\n        // (see applyEncodingOverrides), so we just read it here. This also covers\n        // charts saved before the migration, whose value lived in\n        // chartProperties.colorScheme.\n        const encScheme = encodings?.color?.scheme;\n        const userScheme = (encScheme && encScheme !== 'default') ? encScheme : undefined;\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        const semanticIsDiverging = decision?.schemeType === 'diverging';\n        const schemeName = userScheme || (semanticIsDiverging ? 'redblue' : DEFAULT_HEATMAP_SCHEME);\n        const isDivergingScale =\n            semanticIsDiverging\n            || isDivergingHeatmapScheme(schemeName);\n        if (isDivergingScale && minVal < 0 && maxVal > 0) {\n            const sym = Math.max(Math.abs(minVal), Math.abs(maxVal));\n            minVal = -sym;\n            maxVal = sym;\n        }\n\n        // 优先使用 backend-agnostic colorDecisions：\n        //   - 若有显式 schemeId，则尝试该 id；\n        //   - 否则依据 schemeType（sequential / diverging）选择默认连续 / 发散色带；\n        //   - 都没有时，再退回到本地 SCHEME_COLORS（兼容旧行为）。\n        let schemeColors: string[];\n\n        if (decision) {\n            let paletteFromDecision: string[] | undefined;\n            if (decision.schemeId) {\n                paletteFromDecision = getPaletteForScheme(decision.schemeId);\n            }\n            if (!paletteFromDecision || paletteFromDecision.length === 0) {\n                if (decision.schemeType === 'diverging') {\n                    paletteFromDecision = getPaletteForScheme('RdBu');\n                } else if (decision.schemeType === 'sequential') {\n                    paletteFromDecision = SCHEME_COLORS[DEFAULT_HEATMAP_SCHEME];\n                }\n            }\n            if (paletteFromDecision && paletteFromDecision.length > 0) {\n                schemeColors = paletteFromDecision;\n            } else {\n                schemeColors = SCHEME_COLORS[schemeName] || SCHEME_COLORS[DEFAULT_HEATMAP_SCHEME];\n            }\n        } else {\n            schemeColors = SCHEME_COLORS[schemeName] || SCHEME_COLORS[DEFAULT_HEATMAP_SCHEME];\n        }\n\n        const option: any = {\n            tooltip: { position: 'top' },\n            _encodingTooltip: {\n                trigger: 'item',\n                parts: [\n                    { from: 'data', index: 0, label: xField, format: 'category', categoryNames: xCategories },\n                    { from: 'data', index: 1, label: yField, format: 'category', categoryNames: yCategories },\n                    { from: 'data', index: 2, label: colorField ?? 'Value', format: 'number' },\n                ],\n            },\n            xAxis: {\n                type: 'category',\n                data: xCategories,\n                name: xField,\n                splitArea: { show: true },\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: {\n                    rotate: areCategoriesNumeric(xCategories) ? 0 : 90,\n                },\n            },\n            yAxis: {\n                type: 'category',\n                data: yCategories,\n                name: yField,\n                splitArea: { show: true },\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: { rotate: 0 },\n            },\n            visualMap: {\n                min: minVal,\n                max: maxVal,\n                calculable: true,\n                orient: 'horizontal',\n                left: 'center',\n                bottom: 0,\n                inRange: {\n                    color: schemeColors,\n                },\n            },\n            series: [{\n                type: 'heatmap',\n                data: heatData,\n                label: {\n                    show: heatData.length <= 100,  // Show labels for small heatmaps\n                },\n                emphasis: {\n                    itemStyle: {\n                        shadowBlur: 10,\n                        shadowColor: 'rgba(0, 0, 0, 0.5)',\n                    },\n                },\n            }],\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    postProcess: (option, ctx) => {\n        // Scale heatmap label font size based on cell dimensions\n        const heatSeries = option.series?.find((s: any) => s.type === 'heatmap');\n\n        const { layout } = ctx;\n        const cellW = layout.xStep || 50;\n        const cellH = layout.yStep || 50;\n        const minDim = Math.min(cellW, cellH);\n\n        if (heatSeries?.label) {\n            // Scale font: 12px at 60px cell, down to 8px at 35px, hide below 30px\n            if (minDim < 30) {\n                heatSeries.label.show = false;\n            } else {\n                const fontSize = Math.max(8, Math.min(12, Math.round(minDim * 0.2)));\n                heatSeries.label.fontSize = fontSize;\n                // If cell is narrow, truncate displayed value\n                if (cellW < 50) {\n                    const maxChars = Math.max(2, Math.floor(cellW / (fontSize * 0.6)));\n                    heatSeries.label.formatter = (params: any) => {\n                        const val = params.data[2];\n                        const s = String(val);\n                        return s.length > maxChars ? s.slice(0, maxChars) : s;\n                    };\n                }\n            }\n        }\n\n        // Make room for the visualMap bar below the chart\n        // The bottom stack is: grid → x-axis labels → x-axis title → visualMap\n        if (option.visualMap && option.grid) {\n            const vmHeight = 50; // space for visualMap below the x-axis title\n            option.grid.bottom = (option.grid.bottom || 30) + vmHeight;\n            // Position visualMap at absolute bottom with a small margin\n            option.visualMap.bottom = 5;\n            if (option._height) {\n                option._height += vmHeight;\n            }\n        }\n    },\n    encodingActions: [\n        {\n            key: 'colorScheme',\n            label: 'Scheme',\n            isApplicable: (ctx) => !!ctx.encodings.color?.field,\n            dependencies: ['color'],\n            control: {\n                type: 'discrete', options: [\n                    { value: undefined, label: 'Default (Blues)' },\n                    { value: 'viridis', label: 'Viridis' },\n                    { value: 'inferno', label: 'Inferno' },\n                    { value: 'magma', label: 'Magma' },\n                    { value: 'plasma', label: 'Plasma' },\n                    { value: 'turbo', label: 'Turbo' },\n                    { value: 'blues', label: 'Blues' },\n                    { value: 'reds', label: 'Reds' },\n                    { value: 'greens', label: 'Greens' },\n                    { value: 'oranges', label: 'Oranges' },\n                    { value: 'purples', label: 'Purples' },\n                    { value: 'greys', label: 'Greys' },\n                    { value: 'blueorange', label: 'Blue-Orange (diverging)' },\n                    { value: 'redblue', label: 'Red-Blue (diverging)' },\n                ],\n            },\n            get: (enc) => enc.color?.scheme,\n            set: (enc, value) => ({ ...enc, color: { ...enc.color, scheme: value } }),\n        },\n    ] as EncodingActionDef[],\n    pivot: makeCartesianPivot({ transpose: [['x', 'y']] }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Histogram template.\n *\n * Contrast with VL:\n *   VL: encoding.x.bin = true + encoding.y.aggregate = \"count\"\n *       (VL handles binning internally)\n *   EC: No built-in bin transform — we compute bins client-side and render\n *       as a bar chart with contiguous bars (barCategoryGap: 0).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\n\nexport const ecHistogramDef: ChartTemplateDef = {\n    chart: 'Histogram',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField) return;\n\n        // Extract numeric values\n        const values = table\n            .map(r => Number(r[xField]))\n            .filter(v => isFinite(v));\n\n        if (values.length === 0) return;\n\n        // `binCount` is the bin count; 0 (auto) falls back to 10.\n        const binCount = chartProperties?.binCount || 10;\n\n        const minVal = Math.min(...values);\n        const maxVal = Math.max(...values);\n        const range = maxVal - minVal;\n        const binWidth = range > 0 ? range / binCount : 1;\n\n        if (!colorField) {\n            // Simple histogram — single series\n            const counts = new Array(binCount).fill(0);\n            for (const v of values) {\n                let idx = Math.floor((v - minVal) / binWidth);\n                if (idx >= binCount) idx = binCount - 1;\n                counts[idx]++;\n            }\n\n            const categories = counts.map((_, i) => {\n                const lo = (minVal + i * binWidth).toFixed(1);\n                const hi = (minVal + (i + 1) * binWidth).toFixed(1);\n                return `${lo}–${hi}`;\n            });\n\n            const option: any = {\n                tooltip: {\n                    trigger: 'axis',\n                    axisPointer: { type: 'shadow' },\n                },\n                xAxis: {\n                    type: 'category',\n                    data: categories,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 25,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: categories.length > 10 ? 45 : 0 },\n                },\n                yAxis: {\n                    type: 'value',\n                    name: 'Count',\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                },\n                series: [{\n                    type: 'bar',\n                    data: counts,\n                    barCategoryGap: '0%',   // contiguous bars\n                    itemStyle: {\n                        borderColor: '#fff',\n                        borderWidth: 0.5,\n                    },\n                }],\n            };\n            option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: 'Count' };\n\n            Object.assign(spec, option);\n        } else {\n            // Stacked histogram — one series per color group\n            const groupValues = new Map<string, number[]>();\n            for (const row of table) {\n                const v = Number(row[xField]);\n                if (!isFinite(v)) continue;\n                const g = String(row[colorField] ?? '');\n                if (!groupValues.has(g)) groupValues.set(g, []);\n                groupValues.get(g)!.push(v);\n            }\n\n            const categories = Array.from({ length: binCount }, (_, i) => {\n                const lo = (minVal + i * binWidth).toFixed(1);\n                const hi = (minVal + (i + 1) * binWidth).toFixed(1);\n                return `${lo}–${hi}`;\n            });\n\n            const series: any[] = [];\n            const legendData: string[] = [];\n\n            for (const [name, vals] of groupValues) {\n                const counts = new Array(binCount).fill(0);\n                for (const v of vals) {\n                    let idx = Math.floor((v - minVal) / binWidth);\n                    if (idx >= binCount) idx = binCount - 1;\n                    counts[idx]++;\n                }\n                legendData.push(name);\n                series.push({\n                    name,\n                    type: 'bar',\n                    data: counts,\n                    stack: 'total',\n                    barCategoryGap: '0%',\n                    itemStyle: {\n                        borderColor: '#fff',\n                        borderWidth: 0.5,\n                    },\n                });\n            }\n\n            const option: any = {\n                tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n                legend: { data: legendData },\n                xAxis: {\n                    type: 'category',\n                    data: categories,\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 25,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: categories.length > 10 ? 45 : 0 },\n                },\n                yAxis: {\n                    type: 'value',\n                    name: 'Count',\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                },\n                series,\n            };\n            option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: 'Count' };\n\n            Object.assign(spec, option);\n        }\n\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'binCount', label: 'Max Bins', type: 'continuous', min: 5, max: 50, step: 1, defaultValue: 0 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Boxplot template.\n *\n * Contrast with VL:\n *   VL: mark = \"boxplot\" — VL computes quartiles automatically from raw data\n *   EC: series type = 'boxplot' — we compute quartiles client-side and pass\n *       [min, Q1, median, Q3, max] per category.\n *       Optionally an \"outlier\" scatter series.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\nimport { detectBandedAxisForceDiscrete } from '../../core/axis-detection';\nimport { planBandDodge, resolveDodge } from '../../core/band-dodge';\nimport { pickEChartsPalette } from '../colormap';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → horizontal; otherwise vertical (x-axis only, same as line chart). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\n/** Compute the five-number summary for an array of values. */\nfunction fiveNumberSummary(\n    values: number[],\n    whiskerMethod: 'iqr' | 'minmax' = 'iqr',\n): [number, number, number, number, number] {\n    const sorted = [...values].sort((a, b) => a - b);\n    const n = sorted.length;\n    if (n === 0) return [0, 0, 0, 0, 0];\n    if (n === 1) return [sorted[0], sorted[0], sorted[0], sorted[0], sorted[0]];\n\n    const median = quantile(sorted, 0.5);\n    const q1 = quantile(sorted, 0.25);\n    const q3 = quantile(sorted, 0.75);\n\n    // Min–Max whiskers span the full data range (no points are outliers).\n    if (whiskerMethod === 'minmax') {\n        return [sorted[0], q1, median, q3, sorted[n - 1]];\n    }\n\n    // Tukey whiskers: extend to the most extreme value within 1.5×IQR.\n    const iqr = q3 - q1;\n    const lowerFence = q1 - 1.5 * iqr;\n    const upperFence = q3 + 1.5 * iqr;\n    const whiskerLow = sorted.find(v => v >= lowerFence) ?? sorted[0];\n    const whiskerHigh = [...sorted].reverse().find(v => v <= upperFence) ?? sorted[n - 1];\n\n    return [whiskerLow, q1, median, q3, whiskerHigh];\n}\n\nfunction quantile(sorted: number[], p: number): number {\n    const n = sorted.length;\n    const idx = p * (n - 1);\n    const lo = Math.floor(idx);\n    const hi = Math.ceil(idx);\n    const frac = idx - lo;\n    return sorted[lo] * (1 - frac) + sorted[hi] * frac;\n}\n\n/** Find outliers outside 1.5×IQR fences. */\nfunction findOutliers(values: number[]): number[] {\n    const sorted = [...values].sort((a, b) => a - b);\n    const q1 = quantile(sorted, 0.25);\n    const q3 = quantile(sorted, 0.75);\n    const iqr = q3 - q1;\n    const lo = q1 - 1.5 * iqr;\n    const hi = q3 + 1.5 * iqr;\n    return values.filter(v => v < lo || v > hi);\n}\n\nfunction boxplotLaneOffset(bandWidth: number, laneCount: number, laneIndex: number): number {\n    const availableWidth = bandWidth * 0.8 - 2;\n    const boxGap = availableWidth / laneCount * 0.3;\n    const boxWidth = (availableWidth - boxGap * (laneCount - 1)) / laneCount;\n    return boxWidth / 2 - availableWidth / 2 + laneIndex * (boxGap + boxWidth);\n}\n\nfunction makeOutlierSeries(\n    name: string,\n    data: any[],\n    laneIndex: number,\n    laneCount: number,\n    horizontal: boolean,\n): any {\n    return {\n        name,\n        type: 'custom',\n        coordinateSystem: 'cartesian2d',\n        data,\n        encode: { tooltip: [0, 1] },\n        z: 3,\n        renderItem: (_params: any, api: any) => {\n            const category = Number(api.value(0));\n            const value = Number(api.value(1));\n            const point = horizontal\n                ? api.coord([value, category])\n                : api.coord([category, value]);\n            const size = api.size(horizontal ? [0, 1] : [1, 0]);\n            const bandWidth = Math.abs(horizontal ? size[1] : size[0]);\n            const offset = boxplotLaneOffset(bandWidth, laneCount, laneIndex);\n            return {\n                type: 'circle',\n                shape: {\n                    cx: point[0] + (horizontal ? 0 : offset),\n                    cy: point[1] + (horizontal ? offset : 0),\n                    r: 2,\n                },\n                style: { fill: api.visual('color') },\n            };\n        },\n    };\n}\n\nfunction makeGroupSeparatorSeries(categoryCount: number, horizontal: boolean): any {\n    return {\n        name: '__groupSeparators',\n        type: 'custom',\n        coordinateSystem: 'cartesian2d',\n        data: Array.from({ length: Math.max(0, categoryCount - 1) }, (_, index) => [index]),\n        silent: true,\n        tooltip: { show: false },\n        z: 0,\n        renderItem: (params: any, api: any) => {\n            const index = Number(api.value(0));\n            const current = horizontal ? api.coord([0, index]) : api.coord([index, 0]);\n            const next = horizontal ? api.coord([0, index + 1]) : api.coord([index + 1, 0]);\n            const boundary = horizontal\n                ? (current[1] + next[1]) / 2\n                : (current[0] + next[0]) / 2;\n            return {\n                type: 'line',\n                shape: horizontal\n                    ? { x1: params.coordSys.x, y1: boundary, x2: params.coordSys.x + params.coordSys.width, y2: boundary }\n                    : { x1: boundary, y1: params.coordSys.y, x2: boundary, y2: params.coordSys.y + params.coordSys.height },\n                style: { stroke: '#c9ced6', lineWidth: 1, lineDash: [4, 4], opacity: 0.75 },\n            };\n        },\n    };\n}\n\nexport const ecBoxplotDef: ChartTemplateDef = {\n    chart: 'Boxplot',\n    template: { mark: 'boxplot', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        if (!cs.x?.field || !cs.y?.field) return {};\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        if (!result) return {};\n        const decl: import('../../core/types').LayoutDeclaration = {\n            axisFlags: { [result.axis]: { banded: true } },\n            resolvedTypes: result.resolvedTypes,\n            paramOverrides: { defaultBandSize: 28 },  // box+whisker needs wider bands\n        };\n        const colorField = cs.color?.field;\n        const axisField = cs[result.axis]?.field;\n        if (colorField && axisField && isDiscrete(cs.color?.type)) {\n            const plan = planBandDodge(table, axisField, colorField);\n            const { mode } = resolveDodge(plan, chartProperties?.dodge);\n            if (mode === 'local') decl.groupLaneCount = Math.max(1, plan.maxPerBand);\n        }\n        return decl;\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        const colorIsDiscrete = colorField && isDiscrete(colorType);\n\n        if (!xCS?.field || !yCS?.field) return;\n\n        // Whisker convention + outlier visibility (design choices). Min–Max\n        // whiskers span the full range, so no points are outliers; with Tukey\n        // whiskers, outliers are drawn as a scatter overlay unless suppressed.\n        const whiskerMethod: 'iqr' | 'minmax' =\n            ctx.chartProperties?.whiskerMethod === 'minmax' ? 'minmax' : 'iqr';\n        const showOutliers =\n            whiskerMethod === 'iqr' && ctx.chartProperties?.showOutliers !== false;\n\n        // Determine which axis is categorical and which is quantitative\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const yIsDiscrete = isDiscrete(yCS.type);\n\n        // Default: x is category, y is value\n        let catAxis: 'x' | 'y' = 'x';\n        let valAxis: 'x' | 'y' = 'y';\n        if (yIsDiscrete && !xIsDiscrete) {\n            catAxis = 'y';\n            valAxis = 'x';\n        }\n\n        const catField = channelSemantics[catAxis]!.field!;\n        const valField = channelSemantics[valAxis]!.field!;\n        const catCS = channelSemantics[catAxis];\n        const categories = extractCategories(table, catField, catCS?.ordinalSortOrder);\n\n        // Decide whether `color` genuinely subdivides a category band (dodge into\n        // one series per color) or is redundant/nested with the axis (`color == x`\n        // or a 1:1 field pair) — in which case a single boxplot series is correct.\n        // Sharing `planBandDodge` avoids the collapse-to-slivers bug AND the\n        // degenerate zero-boxes that a per-color series would draw in empty cells.\n        const dodgePlan = colorIsDiscrete && colorField\n            ? planBandDodge(ctx.fullTable ?? table, catField, colorField, {\n                nestedSnapThreshold: ctx.chartProperties?.nestedSnapThreshold,\n            })\n            : null;\n        const dodgeMode = dodgePlan ? resolveDodge(dodgePlan, ctx.chartProperties?.dodge).mode : 'none';\n        const dodgeColor = dodgeMode !== 'none';\n\n        // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 统一分配（不在此处硬编码）\n        const isHorizontal = catAxis === 'y';\n\n        const catAxisLabel = {\n            rotate: isHorizontal ? 0 : (areCategoriesNumeric(categories) ? 0 : 90),\n        };\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            [isHorizontal ? 'yAxis' : 'xAxis']: {\n                type: 'category',\n                data: categories,\n                name: catField,\n                boundaryGap: true,\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: catAxisLabel,\n            },\n            [isHorizontal ? 'xAxis' : 'yAxis']: {\n                type: 'value',\n                name: valField,\n                axisTick: { show: true },\n                axisLabel: { rotate: 0 },\n            },\n            series: [],\n        };\n\n        if (colorIsDiscrete && colorField && dodgeMode === 'local') {\n            // Local (compact) dodge: only `maxPerBand` lanes, packed left-aligned\n            // per band. Each lane is a boxplot series; a band that has fewer than\n            // `maxPerBand` present colors simply leaves trailing lanes null. Boxes\n            // are colored per-datum by their color value (a custom legend maps the\n            // color value → swatch, since lane-series names are synthetic).\n            const globalColors = [...new Set(\n                (ctx.fullTable ?? table).map((r: any) => String(r[colorField] ?? '')),\n            )].filter(Boolean).sort();\n            const palette = pickEChartsPalette(ctx.colorDecisions?.color);\n            const colorFor = (g: string) => palette[Math.max(0, globalColors.indexOf(g)) % palette.length];\n\n            // Per-band ordered present colors → lane index.\n            const perBand = new Map<string, string[]>();\n            for (const cat of categories) perBand.set(cat, []);\n            for (const r of table) {\n                const cat = String(r[catField] ?? '');\n                const g = String(r[colorField] ?? '');\n                if (!perBand.has(cat) || !g) continue;\n                const arr = perBand.get(cat)!;\n                if (!arr.includes(g)) arr.push(g);\n            }\n            for (const arr of perBand.values()) arr.sort();\n            const maxPerBand = Math.max(1, ...[...perBand.values()].map((a) => a.length));\n\n            // value lookup per (cat, color)\n            const catGroups = groupBy(table, catField);\n            for (let lane = 0; lane < maxPerBand; lane++) {\n                const boxData: ({ value: [number, number, number, number, number]; itemStyle: any } | '-')[] = [];\n                const outlierData: any[] = [];\n                for (let i = 0; i < categories.length; i++) {\n                    const cat = categories[i];\n                    const g = perBand.get(cat)?.[lane];\n                    if (g === undefined) { boxData.push('-'); continue; }\n                    const rows = (catGroups.get(cat) || []).filter((r: any) => String(r[colorField] ?? '') === g);\n                    const values = rows.map((r: any) => Number(r[valField])).filter((v: number) => isFinite(v));\n                    if (!values.length) { boxData.push('-'); continue; }\n                    const c = colorFor(g);\n                    boxData.push({ value: fiveNumberSummary(values, whiskerMethod), itemStyle: { color: c, borderColor: c } });\n                    if (showOutliers) {\n                        for (const o of findOutliers(values)) outlierData.push({ value: [i, o], itemStyle: { color: c } });\n                    }\n                }\n                option.series.push({ name: `__lane${lane}`, type: 'boxplot', data: boxData });\n                if (outlierData.length > 0) {\n                    option.series.push(makeOutlierSeries(\n                        `__lane${lane} (outliers)`, outlierData, lane, maxPerBand, isHorizontal,\n                    ));\n                }\n            }\n            option.series.push(makeGroupSeparatorSeries(categories.length, isHorizontal));\n            option.legend = { data: globalColors.map((g) => ({ name: g, itemStyle: { color: colorFor(g) } })) };\n            option._legendTitle = colorField;\n        } else if (colorIsDiscrete && colorField && dodgeColor) {\n            // Grouped boxplot: one series per color value (e.g. Male, Female)\n            const colorCategories = extractCategories(table, colorField, getCategoryOrder(ctx, 'color'));\n            const catGroups = groupBy(table, catField);\n\n            for (let cIdx = 0; cIdx < colorCategories.length; cIdx++) {\n                const colorName = colorCategories[cIdx];\n                const boxData: ([number, number, number, number, number] | '-')[] = [];\n                const outlierData: [number, number][] = [];\n\n                for (let i = 0; i < categories.length; i++) {\n                    const cat = categories[i];\n                    const rows = (catGroups.get(cat) || []).filter(\n                        (r: any) => String(r[colorField] ?? '') === colorName,\n                    );\n                    const values = rows.map((r: any) => Number(r[valField])).filter(v => isFinite(v));\n                    // Empty (category, color) cells must draw NO box. Pushing a\n                    // five-number summary of [] yields [0,0,0,0,0] — a degenerate\n                    // flat box at 0 in every unoccupied lane (the sparse-dodge\n                    // zero-box bug). ECharts boxplot does not accept `null`\n                    // data items; `'-'` is its missing-value sentinel.\n                    boxData.push(values.length ? fiveNumberSummary(values, whiskerMethod) : '-');\n\n                    if (showOutliers) {\n                        for (const o of findOutliers(values)) {\n                            outlierData.push([i, o]);\n                        }\n                    }\n                }\n\n                option.series.push({\n                    name: colorName,\n                    type: 'boxplot',\n                    data: boxData,\n                    // itemStyle 由 ecApplyLayoutToSpec 按 colorDecisions 填充\n                });\n                if (outlierData.length > 0) {\n                    option.series.push(makeOutlierSeries(\n                        colorName + ' (outliers)', outlierData, cIdx, colorCategories.length, isHorizontal,\n                    ));\n                }\n            }\n\n            option.legend = { data: colorCategories };\n            option._legendTitle = colorField;\n        } else {\n            // Single boxplot series (no color grouping)\n            const catGroups = groupBy(table, catField);\n            const boxData: [number, number, number, number, number][] = [];\n            const outlierData: [number, number][] = [];\n\n            for (let i = 0; i < categories.length; i++) {\n                const cat = categories[i];\n                const rows = catGroups.get(cat) || [];\n                const values = rows.map((r: any) => Number(r[valField])).filter((v: number) => isFinite(v));\n                boxData.push(fiveNumberSummary(values, whiskerMethod));\n\n                if (showOutliers) {\n                    for (const o of findOutliers(values)) {\n                        outlierData.push([i, o]);\n                    }\n                }\n            }\n\n            option.series.push({\n                type: 'boxplot',\n                data: boxData,\n                // 单系列颜色由 ecApplyLayoutToSpec 使用 cat10[0] 等统一默认\n            });\n            if (outlierData.length > 0) {\n                option.series.push(makeOutlierSeries('Outliers', outlierData, 0, 1, isHorizontal));\n            }\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'whiskerMethod', label: 'Whiskers', type: 'discrete',\n            options: [\n                { value: 'iqr', label: 'Tukey (1.5 × IQR)' },\n                { value: 'minmax', label: 'Min–Max' },\n            ],\n            defaultValue: 'iqr',\n        } as ChartPropertyDef,\n        {\n            key: 'showOutliers', label: 'Outliers', type: 'binary', defaultValue: true,\n            check: (ctx) => ({ applicable: ctx.chartProperties?.whiskerMethod !== 'minmax' }),\n        } as ChartPropertyDef,\n        {\n            key: 'dodge', label: 'Dodge', type: 'discrete',\n            options: [\n                { value: 'auto',   label: 'Auto' },\n                { value: 'local',  label: 'Local (compact)' },\n                { value: 'global', label: 'Global (aligned)' },\n            ],\n            defaultValue: 'auto',\n            check: (ctx) => {\n                const colorField = ctx.channelSemantics?.color?.field;\n                const colorType = ctx.channelSemantics?.color?.type;\n                const axisField = isDiscrete(ctx.channelSemantics?.x?.type)\n                    ? ctx.channelSemantics?.x?.field\n                    : ctx.channelSemantics?.y?.field;\n                const rows = ctx.data;\n                if (!colorField || !axisField || !isDiscrete(colorType) || !rows) {\n                    return { applicable: false };\n                }\n                const plan = planBandDodge(rows, axisField, colorField, {\n                    nestedSnapThreshold: ctx.chartProperties?.nestedSnapThreshold,\n                });\n                return { applicable: plan.ambiguous, recommendedValue: plan.mode === 'none' ? 'auto' : plan.mode };\n            },\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Radar Chart template.\n *\n * Contrast with VL:\n *   VL: No native radar — the VL template manually computes polar coordinates\n *       using trig and draws with layered point/line/rule marks.\n *   EC: Native radar series with polar coordinate system — much simpler.\n *       ECharts handles the axis spokes, grid rings, and polar projection natively.\n *\n * Data model (long format):\n *   x (nominal): metric / axis name\n *   y (quantitative): value for that metric\n *   color (nominal): entity / group\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, computeCircumferencePressure } from './utils';\n\n/** Round up to a nice ceiling for radar axis max. */\nfunction niceMax(v: number): number {\n    if (v <= 0) return 1;\n    const pow = Math.pow(10, Math.floor(Math.log10(v)));\n    const mantissa = v / pow;\n    const nice = mantissa <= 1 ? 1\n        : mantissa <= 2 ? 2\n        : mantissa <= 2.5 ? 2.5\n        : mantissa <= 5 ? 5\n        : 10;\n    return nice * pow;\n}\n\nexport const ecRadarChartDef: ChartTemplateDef = {\n    chart: 'Radar Chart',\n    template: { mark: 'point', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const axisField = channelSemantics.x?.field;   // metric names\n        const valueField = channelSemantics.y?.field;   // metric values\n        const groupField = channelSemantics.color?.field; // entities\n\n        if (!axisField || !valueField) return;\n\n        // Extract unique metrics (radar axes)\n        const metrics = extractCategories(table, axisField, channelSemantics.x?.ordinalSortOrder);\n        if (metrics.length < 2) return;\n\n        // Compute max value per metric for axis scaling\n        const metricMax = new Map<string, number>();\n        for (const m of metrics) {\n            const vals = table\n                .filter(r => String(r[axisField]) === m)\n                .map(r => Number(r[valueField]))\n                .filter(v => isFinite(v));\n            metricMax.set(m, niceMax(vals.length > 0 ? Math.max(...vals) : 1));\n        }\n\n        // Build radar indicator (axis) definitions\n        const indicator = metrics.map(m => ({\n            name: m,\n            max: metricMax.get(m) || 1,\n        }));\n\n        // Build series data\n        const filled = chartProperties?.filled !== false;\n        const fillOpacity = chartProperties?.fillOpacity ?? 0.3;\n\n        const seriesData: any[] = [];\n        const legendData: string[] = [];\n\n        if (groupField) {\n            // Multi-group: one polygon per group\n            const groups = groupBy(table, groupField);\n\n            const colorIdx = 0;\n            for (const [name, rows] of groups) {\n                legendData.push(name);\n\n                // Aggregate: mean per metric\n                const metricVals = new Map<string, { sum: number; count: number }>();\n                for (const row of rows) {\n                    const m = String(row[axisField]);\n                    const v = Number(row[valueField]) || 0;\n                    if (!metricVals.has(m)) metricVals.set(m, { sum: 0, count: 0 });\n                    const entry = metricVals.get(m)!;\n                    entry.sum += v;\n                    entry.count++;\n                }\n\n                const values = metrics.map(m => {\n                    const entry = metricVals.get(m);\n                    return entry ? Math.round((entry.sum / entry.count) * 100) / 100 : 0;\n                });\n\n                seriesData.push({\n                    name,\n                    value: values,\n                    areaStyle: filled ? { opacity: fillOpacity } : undefined,\n                });\n            }\n        } else {\n            // Single group\n            const metricVals = new Map<string, { sum: number; count: number }>();\n            for (const row of table) {\n                const m = String(row[axisField]);\n                const v = Number(row[valueField]) || 0;\n                if (!metricVals.has(m)) metricVals.set(m, { sum: 0, count: 0 });\n                const entry = metricVals.get(m)!;\n                entry.sum += v;\n                entry.count++;\n            }\n\n            const values = metrics.map(m => {\n                const entry = metricVals.get(m);\n                return entry ? Math.round((entry.sum / entry.count) * 100) / 100 : 0;\n            });\n\n            seriesData.push({\n                value: values,\n                areaStyle: filled ? { opacity: fillOpacity } : undefined,\n            });\n        }\n\n        // ── Layout: keep radar and axis labels inside canvas, legend not overlapping ──\n        // Use percentage center/radius so top/bottom axis labels don't overflow; reserve bottom for legend.\n        const hasLegend = legendData.length > 0;\n        const { canvasW, canvasH }\n            = computeCircumferencePressure(metrics.length, ctx.canvasSize, {\n                minArcPx: 60,\n                minRadius: 80,\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n            });\n        const chartH = canvasH + (hasLegend ? 36 : 0);\n\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            radar: {\n                indicator,\n                shape: chartProperties?.shape === 'circle' ? 'circle' : 'polygon',\n                center: ['50%', '46%'],\n                radius: '38%',\n                axisName: { fontSize: ctx.layout.titleFontSize },\n            },\n            series: [{\n                type: 'radar',\n                data: seriesData,\n                emphasis: {\n                    lineStyle: { width: 3 },\n                },\n            }],\n            _width: canvasW,\n            _height: chartH,\n        };\n\n        if (hasLegend) {\n            option.legend = {\n                data: legendData,\n                bottom: 12,\n                left: 'center',\n                orient: 'horizontal',\n            };\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'shape', label: 'Grid', type: 'discrete', options: [\n                { value: undefined, label: 'Polygon (default)' },\n                { value: 'circle', label: 'Circle' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'filled', label: 'Fill', type: 'discrete', options: [\n                { value: true, label: 'Filled (default)' },\n                { value: false, label: 'Outline only' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'fillOpacity', label: 'Opacity', type: 'continuous', min: 0.05, max: 0.8, step: 0.05, defaultValue: 0.3 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Candlestick Chart template.\n *\n * Contrast with VL:\n *   VL: layered spec with rule (high→low) + bar (open→close) + conditional color\n *   EC: native `candlestick` series type — OHLC data format built-in\n *\n * ECharts candlestick is one of its strongest native chart types:\n *   - Built-in up/down coloring\n *   - Automatic tooltip with OHLC labels\n *   - Integrated with dataZoom for pan/zoom\n *\n * Channels: x (date/category), open, high, low, close\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories } from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const ecCandlestickDef: ChartTemplateDef = {\n    chart: 'Candlestick Chart',\n    template: { mark: 'candlestick', encoding: {} },\n    channels: ['x', 'open', 'high', 'low', 'close', 'column', 'row'],\n    markCognitiveChannel: 'position',\n\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n    }),\n\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const openCS = channelSemantics.open;\n        const highCS = channelSemantics.high;\n        const lowCS = channelSemantics.low;\n        const closeCS = channelSemantics.close;\n\n        if (!xCS?.field) return;\n        const xField = xCS.field;\n        const openField = openCS?.field;\n        const highField = highCS?.field;\n        const lowField = lowCS?.field;\n        const closeField = closeCS?.field;\n\n        // Need at least open+close for a meaningful candlestick\n        if (!openField || !closeField) return;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        // ── Build OHLC data ──────────────────────────────────────────────\n        // ECharts candlestick data format: [open, close, low, high]\n        // (note: EC ordering is open, close, low, high — NOT the typical OHLC)\n        const candleData: [number, number, number, number][] = [];\n        const xValues: string[] = [];\n\n        for (const row of table) {\n            const o = Number(row[openField]);\n            const c = Number(row[closeField]);\n            const h = highField ? Number(row[highField]) : Math.max(o, c);\n            const l = lowField ? Number(row[lowField]) : Math.min(o, c);\n            candleData.push([o, c, l, h]);\n            xValues.push(String(row[xField]));\n        }\n\n        // ── Build option ─────────────────────────────────────────────────\n        const option: any = {\n            tooltip: {\n                trigger: 'axis',\n                axisPointer: { type: 'cross' },\n            },\n            xAxis: {\n                type: xIsDiscrete ? 'category' : xIsTemporal ? 'category' : 'category',\n                data: categories || xValues,\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                boundaryGap: true,\n                axisLine: { onZero: false },\n                axisTick: { show: true, alignWithLabel: true },\n            },\n            yAxis: {\n                type: 'value',\n                scale: true,  // candlestick charts should never start at zero\n                name: 'Price',\n                nameLocation: 'middle',\n                nameGap: 50,\n                axisTick: { show: true },\n                axisLabel: { rotate: 0 },\n            },\n            series: [{\n                type: 'candlestick',\n                data: candleData,\n                itemStyle: {\n                    color: '#06982d',        // bullish (close > open) — green\n                    color0: '#ae1325',        // bearish (close < open) — red\n                    borderColor: '#06982d',\n                    borderColor0: '#ae1325',\n                },\n            }],\n        };\n\n        // ── Optional MA overlay ──────────────────────────────────────────\n        if (chartProperties?.showMA) {\n            const maWindow = chartProperties.maWindow ?? 5;\n            const closePrices = table.map((r: any) => Number(r[closeField]));\n            const maData = computeMA(closePrices, maWindow);\n            option.series.push({\n                name: `MA${maWindow}`,\n                type: 'line',\n                data: maData,\n                smooth: true,\n                lineStyle: { width: 1.5, opacity: 0.7 },\n                symbol: 'none',\n            });\n            option.legend = { data: [`MA${maWindow}`] };\n        }\n\n        // ── DataZoom for large datasets ──────────────────────────────────\n        if (table.length > 60) {\n            const startPercent = Math.max(0, 100 - Math.round(60 / table.length * 100));\n            option.dataZoom = [\n                { type: 'inside', start: startPercent, end: 100 },\n                { type: 'slider', start: startPercent, end: 100, bottom: 5, height: 20 },\n            ];\n            // Extra grid bottom padding so axis title + slider don't overlap\n            option._dataZoomExtra = 35;\n        }\n\n        // ── Bar width auto-sizing ────────────────────────────────────────\n        const plotWidth = ctx.canvasSize?.width || 400;\n        const barWidth = Math.max(2, Math.min(20, Math.round(plotWidth * 0.6 / table.length)));\n        option.series[0].barWidth = barWidth;\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n\n    postProcess: (option) => {\n        // Grow canvas to fit dataZoom slider below the axis title\n        const extra = option._dataZoomExtra ?? 0;\n        if (extra > 0) {\n            if (!option.grid) option.grid = {};\n            const curBottom = typeof option.grid.bottom === 'number' ? option.grid.bottom : 45;\n            option.grid.bottom = curBottom + extra;\n            if (typeof option._height === 'number') {\n                option._height += extra;\n            }\n            delete option._dataZoomExtra;\n        }\n    },\n\n    properties: [\n        {\n            key: 'showMA', label: 'Moving average', type: 'binary', defaultValue: false,\n        } as ChartPropertyDef,\n        {\n            key: 'maWindow', label: 'Average window', type: 'continuous',\n            min: 3, max: 30, step: 1, defaultValue: 5,\n        } as ChartPropertyDef,\n    ],\n};\n\n/**\n * Compute simple moving average.\n * Returns null for the first (window-1) entries.\n */\nfunction computeMA(prices: number[], window: number): (number | null)[] {\n    const result: (number | null)[] = [];\n    for (let i = 0; i < prices.length; i++) {\n        if (i < window - 1) {\n            result.push(null);\n        } else {\n            let sum = 0;\n            for (let j = i - window + 1; j <= i; j++) {\n                sum += prices[j];\n            }\n            result.push(Math.round(sum / window * 100) / 100);\n        }\n    }\n    return result;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Streamgraph template — uses native ThemeRiver series.\n *\n * Contrast with VL:\n *   VL: area mark with y.stack = \"center\" and y.axis = null\n *   EC: themeRiver series — purpose-built for streamgraphs\n *\n * ThemeRiver is ECharts' native streamgraph implementation:\n *   - Automatic center-aligned stacking (wiggle / silhouette baseline)\n *   - Built-in legend integration\n *   - Smooth transitions between series\n *\n * Channels: x (temporal/ordinal), y (quantitative), color (series groups)\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { groupBy } from './utils';\n\nexport const ecStreamgraphDef: ChartTemplateDef = {\n    chart: 'Streamgraph',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        // ── Build ThemeRiver data ────────────────────────────────────────\n        // ThemeRiver data format: [[date, value, seriesName], ...]\n        // All series must have entries for every x-value (fill with 0 if missing)\n\n        if (!colorField) {\n            // Without a color/series field, fall back to a simple area chart\n            const option: any = {\n                tooltip: { trigger: 'axis' },\n                xAxis: {\n                    type: xCS.type === 'temporal' ? 'time' : 'value',\n                    name: xField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisTick: { show: true },\n                },\n                yAxis: { type: 'value', show: false, axisTick: { show: true } },\n                series: [{\n                    type: 'line',\n                    data: table.map(r => [r[xField], r[yField]]),\n                    areaStyle: { opacity: 0.85 },\n                    lineStyle: { width: 0.5 },\n                    symbol: 'none',\n                }],\n            };\n            Object.assign(spec, option);\n            delete spec.mark;\n            delete spec.encoding;\n            return;\n        }\n\n        // Collect unique x-values in order (preserving data order)\n        const xValSet = new Set<string>();\n        const xVals: string[] = [];\n        for (const row of table) {\n            const xv = String(row[xField]);\n            if (!xValSet.has(xv)) {\n                xValSet.add(xv);\n                xVals.push(xv);\n            }\n        }\n\n        // Collect series names\n        const groups = groupBy(table, colorField);\n        const seriesNames = [...groups.keys()];\n\n        // Build a lookup: (xVal, seriesName) → numeric value\n        const valMap = new Map<string, number>();\n        for (const row of table) {\n            const key = `${row[xField]}|||${row[colorField]}`;\n            const v = row[yField];\n            valMap.set(key, v != null && v !== '' ? Number(v) : 0);\n        }\n\n        // ThemeRiver expects first element to be date or number; category labels as string often don't render.\n        // For category x: use numeric index (0,1,2,...) and axisLabel.formatter to show category names.\n        const xIsTemporal = xCS.type === 'temporal';\n        const riverData: [string | number, number, string][] = [];\n        for (let i = 0; i < xVals.length; i++) {\n            const xv = xVals[i];\n            for (const sn of seriesNames) {\n                const key = `${xv}|||${sn}`;\n                const numVal = valMap.get(key);\n                const value = numVal != null && Number.isFinite(numVal) ? numVal : 0;\n                // Use index for category so ThemeRiver renders; use string for temporal (date string)\n                riverData.push([xIsTemporal ? xv : i, value, sn]);\n            }\n        }\n\n        // ── Build option ─────────────────────────────────────────────────\n        const option: any = {\n            tooltip: {\n                trigger: 'axis',\n                axisPointer: { type: 'line', lineStyle: { color: 'rgba(0,0,0,0.2)', width: 1, type: 'solid' } },\n                formatter: (params: any) => {\n                    if (!params || params.length === 0) return '';\n                    const xVal = params[0].value[0];\n                    const displayX = xIsTemporal ? xVal : (xVals[xVal] ?? xVal);\n                    let html = `<b>${displayX}</b><br/>`;\n                    // Sort by value descending\n                    const sortedParams = [...params].sort((a, b) => (b.value[1] || 0) - (a.value[1] || 0));\n                    sortedParams.forEach((p: any) => {\n                        html += `${p.marker} ${p.value[2]}: <b>${p.value[1]}</b><br/>`;\n                    });\n                    return html;\n                },\n            },\n            legend: {\n                data: seriesNames,\n            },\n            singleAxis: {\n                ...(xIsTemporal\n                    ? { type: 'time' as const }\n                    : {\n                        type: 'value' as const,\n                        min: 0,\n                        max: Math.max(1, xVals.length - 1),\n                        axisLabel: {\n                            fontSize: 11,\n                            formatter: (value: number) => {\n                                const idx = Math.round(Number(value));\n                                return xVals[idx] ?? value;\n                            },\n                        },\n                    }),\n                axisTick: { show: true },\n                bottom: 45,         // enough room for tick labels + axis name below\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 25,\n                nameTextStyle: { fontSize: ctx.layout.titleFontSize },\n                ...(xIsTemporal ? { axisLabel: { fontSize: 11 } } : {}),\n            },\n            series: [{\n                type: 'themeRiver',\n                data: riverData,\n                label: { show: false },\n                emphasis: { focus: 'series' },\n                itemStyle: {\n                    borderWidth: 0.5,\n                    borderColor: 'rgba(255,255,255,0.3)',\n                },\n            }],\n        };\n\n        // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 设置 option.color，ThemeRiver 会按 stream 顺序使用\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n\n    postProcess: (option) => {\n        // ThemeRiver uses singleAxis (not xAxis/yAxis).  The layout engine\n        // now computes _width/_height for singleAxis charts too, but it uses\n        // the grid-based margins (which assume xAxis/yAxis).  We adjust the\n        // singleAxis margins and canvas to match consistently.\n        if (option.singleAxis) {\n            const BUFFER = 15;\n            const LEGEND_GAP = 12;\n            const hasLegend = !!option.legend;\n            // Reserve enough right margin for legend so it doesn't overlap the chart\n            const legendWidth = (option._legendWidth as number) || 140;\n            const rightMargin = hasLegend ? legendWidth + LEGEND_GAP + BUFFER : 20;\n\n            // Ensure canvas is large enough\n            const minW = 600 + BUFFER;\n            const minH = 350 + BUFFER;\n            if (typeof option._width === 'number' && option._width < minW) {\n                option._width = minW;\n            }\n            if (typeof option._height === 'number' && option._height < minH) {\n                option._height = minH;\n            }\n            if (!option._width) option._width = minW;\n            if (!option._height) option._height = minH;\n\n            // singleAxis positions: left/right control horizontal extent,\n            // top/bottom control vertical extent\n            option.singleAxis.left = option.singleAxis.left || 50;\n            option.singleAxis.right = Math.max(option.singleAxis.right || 0, rightMargin);\n\n            // Position legend in the right margin so it doesn't overlap the stream\n            if (hasLegend && option.legend) {\n                const legendLeft = option._width - rightMargin + BUFFER;\n                option.legend.left = legendLeft;\n                delete option.legend.right; // Use left to align with graphic titles\n                option.legend.top = 20;\n                option.legend.orient = option.legend.orient || 'vertical';\n                option.legend.align = 'left';\n\n                // Also update any custom graphic legend titles\n                if (Array.isArray(option.graphic)) {\n                    for (const g of option.graphic) {\n                        // The legend title added in instantiate-spec.ts typically has top: 4 and type: 'text'\n                        if (g.type === 'text' && (g.top === 4 || g.top === 20) && g.style && g.style.fontWeight === 'bold') {\n                            g.left = legendLeft;\n                            delete g.right;\n                        }\n                    }\n                }\n            }\n\n            // Push the axis up from the canvas bottom to avoid clipping\n            if (typeof option.singleAxis.bottom === 'number') {\n                option.singleAxis.bottom += BUFFER;\n            }\n        }\n    },\n\n    properties: [\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Gauge Chart template.\n *\n * Unique to ECharts — no Vega-Lite equivalent.\n * Displays numeric KPI values on speedometer-style dials.\n *\n * Data model:\n *   size   (quantitative): the value to display\n *   column (nominal, optional): splits into separate gauge subplots with\n *          facet-style wrapping — each unique value creates one gauge dial\n *\n * When multiple rows share the same column value, the size values are\n * averaged.  With no column channel, all rows are averaged into a single\n * gauge.\n *\n * Scaling: uses facet-style wrapping — the template computes a grid layout\n * internally (since gauge is axis-less, the assembler's facet path doesn't\n * apply).  The grid respects a minimum gauge cell size and wraps to multiple\n * rows when there are too many dials for a single row.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nexport const ecGaugeChartDef: ChartTemplateDef = {\n    chart: 'Gauge Chart',\n    template: { mark: 'point', encoding: {} },\n    channels: ['size', 'column'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const valueField = channelSemantics.size?.field;\n        const columnField = channelSemantics.column?.field;\n\n        if (!valueField) return;\n\n        // Compute data range for axis scaling\n        const allValues = table.map(r => Number(r[valueField])).filter(v => isFinite(v));\n        const dataMax = allValues.length > 0 ? Math.max(...allValues) : 100;\n\n        const scaleMin = chartProperties?.min ?? 0;\n        const scaleMax = chartProperties?.max ?? niceGaugeMax(dataMax);\n\n        // ── Resolve palette from backend-agnostic color decisions ───────\n        // 1) 若存在显式 color/group 决策，则优先使用其 schemeId 对应的注册表色盘。\n        // 2) 否则根据仪表数量选择 cat10 / cat20。\n        // 3) 注册表缺失时，退回到 ECharts 默认颜色。\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) {\n                palette = fromRegistry;\n            }\n        }\n        if (!palette || palette.length === 0) {\n            const fallbackId = (channelSemantics.column\n                ? Math.max(1, extractCategories(table, channelSemantics.column.field, channelSemantics.column.ordinalSortOrder).length)\n                : 1) > 10\n                ? 'cat20'\n                : 'cat10';\n            palette = getPaletteForScheme(fallbackId) ?? DEFAULT_COLORS;\n        }\n\n        // ── Build gauge items: one per column category, or single ────────\n        const gaugeItems: { name: string; value: number; color?: string }[] = [];\n\n        if (columnField) {\n            const groups = groupBy(table, columnField);\n            const categories = extractCategories(\n                table, columnField, channelSemantics.column?.ordinalSortOrder,\n            );\n            categories.forEach((cat, idx) => {\n                const rows = groups.get(cat) || [];\n                const vals = rows.map(r => Number(r[valueField])).filter(v => isFinite(v));\n                const avg = vals.length > 0\n                    ? Math.round(vals.reduce((a, b) => a + b, 0) / vals.length * 100) / 100\n                    : 0;\n                gaugeItems.push({\n                    name: cat,\n                    value: avg,\n                    color: palette![idx % palette!.length],\n                });\n            });\n        } else {\n            const avg = allValues.length > 0\n                ? Math.round(allValues.reduce((a, b) => a + b, 0) / allValues.length * 100) / 100\n                : 0;\n            gaugeItems.push({ name: valueField, value: avg });\n        }\n\n        // ── Facet-style grid wrapping ────────────────────────────────────\n        const n = gaugeItems.length;\n        const baseW = ctx.canvasSize.width;\n        const baseH = ctx.canvasSize.height;\n        const minCellDim = 180;       // minimum px per gauge cell\n        // Column wrapping consumes the width budget (βx).\n        const maxStretchFactor = ctx.assembleOptions?.maxStretchX ?? ctx.assembleOptions?.maxStretch ?? 2.0;\n\n        let gridCols: number, gridRows: number;\n        if (n === 1) {\n            gridCols = 1;\n            gridRows = 1;\n        } else {\n            const maxCols = Math.max(1,\n                Math.floor(baseW * maxStretchFactor / minCellDim));\n            if (n <= maxCols) {\n                gridCols = n;\n                gridRows = 1;\n            } else {\n                gridRows = Math.ceil(n / maxCols);\n                gridCols = Math.ceil(n / gridRows);\n            }\n        }\n\n        const canvasW = Math.max(baseW, gridCols * minCellDim);\n        const canvasH = Math.max(baseH, gridRows * (minCellDim + 20));\n        const cellW = canvasW / gridCols;\n        const cellH = canvasH / gridRows;\n        const gaugeRadius = Math.max(40,\n            Math.round(Math.min(cellW * 0.38, cellH * 0.38)));\n\n        // Scale all gauge element sizes proportionally to the radius.\n        // Reference radius ~100px maps to baseline sizes.\n        const s = gaugeRadius / 100;\n        const progressWidth = Math.max(4, Math.round(12 * s));\n        const pointerWidth = Math.max(2, Math.round(5 * s));\n        const detailFontSize = Math.max(10, Math.round(20 * s));\n        const titleFontSize = Math.max(8, Math.round(14 * s));\n        const axisLabelFontSize = Math.max(6, Math.round(9 * s));\n        const tickLength = Math.max(3, Math.round(5 * s));\n        const tickDistance = -Math.round(16 * s);\n        const splitLength = Math.max(5, Math.round(12 * s));\n        const splitDistance = -Math.round(20 * s);\n        const labelDistance = -Math.round(24 * s);\n\n        const showProgress = chartProperties?.showProgress !== false;\n\n        // ── Build one ECharts gauge series per item ──────────────────────\n        const series = gaugeItems.map((item, i) => {\n            const col = i % gridCols;\n            const row = Math.floor(i / gridCols);\n            const cx = Math.round((col + 0.5) * cellW);\n            const cy = Math.round((row + 0.5) * cellH);\n\n            return {\n                type: 'gauge' as const,\n                min: scaleMin,\n                max: scaleMax,\n                center: [`${cx}px`, `${cy}px`],\n                radius: `${gaugeRadius}px`,\n                data: [{\n                    name: item.name,\n                    value: item.value,\n                    ...(item.color ? { itemStyle: { color: item.color } } : {}),\n                }],\n                detail: {\n                    formatter: '{value}',\n                    fontSize: detailFontSize,\n                    offsetCenter: [0, '70%'],\n                },\n                title: {\n                    fontSize: titleFontSize,\n                    offsetCenter: [0, '85%'],\n                },\n                axisLine: {\n                    lineStyle: { width: progressWidth },\n                },\n                progress: {\n                    show: showProgress,\n                    width: progressWidth,\n                    ...(item.color ? { itemStyle: { color: item.color } } : {}),\n                },\n                pointer: {\n                    length: '60%',\n                    width: pointerWidth,\n                    ...(item.color ? { itemStyle: { color: item.color } } : {}),\n                },\n                axisTick: {\n                    distance: tickDistance,\n                    length: tickLength,\n                    lineStyle: { color: '#999', width: 1 },\n                },\n                splitLine: {\n                    distance: splitDistance,\n                    length: splitLength,\n                    lineStyle: { color: '#999', width: 2 },\n                },\n                axisLabel: {\n                    distance: labelDistance,\n                    fontSize: axisLabelFontSize,\n                    color: '#666',\n                },\n            };\n        });\n\n        const option: any = {\n            tooltip: { trigger: 'item', formatter: '{b}: {c}' },\n            series,\n            color: DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'min', label: 'Min', type: 'continuous', min: 0, max: 1000, step: 10, defaultValue: 0 } as ChartPropertyDef,\n        { key: 'max', label: 'Max', type: 'continuous', min: 0, max: 10000, step: 100, defaultValue: 100 } as ChartPropertyDef,\n        {\n            key: 'showProgress', label: 'Progress', type: 'discrete', options: [\n                { value: true, label: 'Show (default)' },\n                { value: false, label: 'Hide' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n\n/** Round up to a nice gauge maximum. */\nfunction niceGaugeMax(v: number): number {\n    if (v <= 0) return 100;\n    const pow = Math.pow(10, Math.floor(Math.log10(v)));\n    const mantissa = v / pow;\n    const nice = mantissa <= 1 ? 1\n        : mantissa <= 2 ? 2\n        : mantissa <= 5 ? 5\n        : 10;\n    return nice * pow;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Funnel Chart template.\n *\n * Unique to ECharts — no Vega-Lite equivalent.\n * Displays a funnel (descending trapezoids) showing sequential stage values,\n * commonly used for conversion pipelines (e.g., visits → signups → purchases).\n *\n * Data model:\n *   y    (nominal): stage name / category — drives vertical sizing via spring model\n *   size (quantitative): value for each stage — drives trapezoid width\n *\n * Each row represents one stage. Multiple rows per stage are aggregated (sum).\n *\n * Scaling: the `y` channel is declared as banded, so the spring model in\n * `computeLayout` decides `yStep` (px per stage).  Height = yStep × stageCount.\n * The `defaultStepMultiplier: 2.5` gives each stage generous vertical space\n * (≈50-67px default vs 20-27px for bars).\n *\n * The template does NOT create yAxis/xAxis in the ECharts option, so\n * `ecApplyLayoutToSpec` correctly skips grid processing.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nexport const ecFunnelChartDef: ChartTemplateDef = {\n    chart: 'Funnel Chart',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['y', 'size'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        axisFlags: { y: { banded: true } },\n        paramOverrides: {\n            defaultBandSize: 50,  // taller bands for funnel stages\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, layout, colorDecisions } = ctx;\n        const stageField = channelSemantics.y?.field;\n        const valField = channelSemantics.size?.field;\n\n        if (!stageField) return;\n\n        // Extract stages (categories from y channel)\n        const stages = extractCategories(\n            table, stageField, channelSemantics.y?.ordinalSortOrder,\n        );\n        if (stages.length === 0) return;\n\n        // ── Resolve color palette from backend-agnostic color decisions ──\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) {\n                palette = fromRegistry;\n            }\n        }\n        if (!palette || palette.length === 0) {\n            const catCount = stages.length;\n            const fallbackId = catCount > 10 ? 'cat20' : 'cat10';\n            palette = getPaletteForScheme(fallbackId) ?? DEFAULT_COLORS;\n        }\n\n        // Aggregate values per stage\n        const funnelData: { name: string; value: number }[] = [];\n        if (valField) {\n            const agg = new Map<string, number>();\n            for (const row of table) {\n                const stage = String(row[stageField] ?? '');\n                const val = Number(row[valField]) || 0;\n                agg.set(stage, (agg.get(stage) ?? 0) + val);\n            }\n            for (const stage of stages) {\n                funnelData.push({ name: stage, value: agg.get(stage) ?? 0 });\n            }\n        } else {\n            // No value field — count occurrences per stage\n            const counts = new Map<string, number>();\n            for (const row of table) {\n                const stage = String(row[stageField] ?? '');\n                counts.set(stage, (counts.get(stage) ?? 0) + 1);\n            }\n            for (const stage of stages) {\n                funnelData.push({ name: stage, value: counts.get(stage) ?? 0 });\n            }\n        }\n\n        // Sort by value (largest first) for funnel shape\n        const sortOrder = chartProperties?.sort ?? 'descending';\n        if (sortOrder === 'descending') {\n            funnelData.sort((a, b) => b.value - a.value);\n        } else if (sortOrder === 'ascending') {\n            funnelData.sort((a, b) => a.value - b.value);\n        }\n        // 'none' preserves original stage order\n\n        // ── Layout-driven sizing ─────────────────────────────────────────\n        // Use spring model results: yStep × stageCount → funnel body height\n        const stageCount = layout.yNominalCount || stages.length;\n        const yStep = layout.yStep;\n        const funnelBodyH = Math.max(120, yStep * stageCount);\n\n        const topMargin = 30;\n        const bottomMargin = 20;\n        const canvasH = funnelBodyH + topMargin + bottomMargin;\n\n        // Estimate legend width from label text\n        const maxLabelLen = Math.max(...funnelData.map(d => d.name.length), 3);\n        const estimatedLegendWidth = Math.min(150, maxLabelLen * 7 + 30);\n\n        const canvasW = Math.max(ctx.canvasSize.width, 300);\n\n        // Leave room for legend on the right\n        const funnelLeft = 40;\n        const funnelRight = estimatedLegendWidth + 30;\n        const funnelWidth = `${Math.max(100, canvasW - funnelLeft - funnelRight)}px`;\n\n        const orient = chartProperties?.orient ?? 'vertical';\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: '{b}: {c} ({d}%)',\n            },\n            legend: {\n                data: funnelData.map(d => d.name),\n                type: funnelData.length > 8 ? 'scroll' : 'plain',\n                orient: 'vertical',\n                right: 10,\n                top: 'middle',\n                textStyle: { fontSize: layout.legendFontSize },\n            },\n            series: [{\n                type: 'funnel',\n                left: funnelLeft,\n                top: topMargin,\n                bottom: bottomMargin,\n                width: funnelWidth,\n                sort: sortOrder,\n                orient,\n                gap: chartProperties?.gap ?? 2,\n                data: funnelData.map((d, idx) => ({\n                    ...d,\n                    itemStyle: {\n                        ...(palette ? { color: palette[idx % palette.length] } : {}),\n                    },\n                })),\n                label: {\n                    show: true,\n                    position: 'inside',\n                    formatter: '{b}\\n{c}',\n                    fontSize: 11,\n                },\n                emphasis: {\n                    label: {\n                        fontSize: 13,\n                    },\n                },\n                itemStyle: {\n                    borderColor: '#fff',\n                    borderWidth: 1,\n                },\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'sort', label: 'Sort', type: 'discrete', options: [\n                { value: 'descending', label: 'Descending (default)' },\n                { value: 'ascending', label: 'Ascending' },\n                { value: 'none', label: 'Original order' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'orient', label: 'Orient', type: 'discrete', options: [\n                { value: 'vertical', label: 'Vertical (default)' },\n                { value: 'horizontal', label: 'Horizontal' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'gap', label: 'Gap', type: 'continuous', min: 0, max: 20, step: 1, defaultValue: 2 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Treemap template.\n *\n * Unique to ECharts — no native Vega-Lite equivalent.\n * Displays hierarchical data as nested rectangles where area encodes value.\n *\n * Data model:\n *   color  (nominal): top-level category\n *   size   (quantitative): value (mapped to rectangle area)\n *   detail (nominal, optional): sub-category for two-level hierarchy\n *\n * If only color + size: flat treemap with one level.\n * If color + size + detail: two-level hierarchy (color → detail → value).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\nimport { computeEffectiveBarCount } from '../../core/decisions';\n\nexport const ecTreemapDef: ChartTemplateDef = {\n    chart: 'Treemap',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['color', 'size', 'detail'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const catField = channelSemantics.color?.field;\n        const valField = channelSemantics.size?.field;\n        const subCatField = channelSemantics.detail?.field;\n\n        if (!catField) return;\n\n        const categories = extractCategories(table, catField, channelSemantics.color?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        // ── Resolve palette from backend-agnostic color decisions ────────\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) {\n                palette = fromRegistry;\n            }\n        }\n        if (!palette || palette.length === 0) {\n            const catCount = categories.length;\n            const fallbackId = catCount > 10 ? 'cat20' : 'cat10';\n            palette = getPaletteForScheme(fallbackId) ?? DEFAULT_COLORS;\n        }\n\n        // Build treemap data\n        let treemapData: any[];\n\n        if (subCatField) {\n            // Two-level hierarchy: color → detail → value\n            treemapData = categories.map((cat, catIdx) => {\n                const catRows = table.filter(r => String(r[catField]) === cat);\n                const subCats = extractCategories(catRows, subCatField);\n\n                const children = subCats.map(sub => {\n                    const subRows = catRows.filter(r => String(r[subCatField]) === sub);\n                    let value: number;\n                    if (valField) {\n                        value = subRows.reduce((sum, r) => sum + (Number(r[valField]) || 0), 0);\n                    } else {\n                        value = subRows.length;\n                    }\n                    return { name: sub, value };\n                });\n\n                return {\n                    name: cat,\n                    children,\n                    itemStyle: { color: palette![catIdx % palette!.length] },\n                };\n            });\n        } else {\n            // Flat treemap: one level\n            const agg = new Map<string, number>();\n            if (valField) {\n                for (const row of table) {\n                    const cat = String(row[catField] ?? '');\n                    const val = Number(row[valField]) || 0;\n                    agg.set(cat, (agg.get(cat) ?? 0) + val);\n                }\n            } else {\n                for (const row of table) {\n                    const cat = String(row[catField] ?? '');\n                    agg.set(cat, (agg.get(cat) ?? 0) + 1);\n                }\n            }\n\n            treemapData = categories.map((cat, i) => ({\n                name: cat,\n                value: agg.get(cat) ?? 0,\n                itemStyle: { color: palette![i % palette!.length] },\n            }));\n        }\n\n        // ── Scaling: treat treemap items as variable-width vertical bars ──\n        // Use effective bar count (total/min) to determine if the treemap\n        // needs more area. Both axes share the area stretch but X takes\n        // a larger share via the xBias factor:\n        //   stretchX = areaStretch^(xBias/(xBias+1))\n        //   stretchY = areaStretch^(1/(xBias+1))\n        //   stretchX × stretchY = areaStretch  (total area preserved)\n        // xBias=1 → uniform, xBias=2 → X gets 2/3 of the log-stretch.\n        const leafValues = treemapData.flatMap((d: any) =>\n            d.children ? d.children.map((c: any) => c.value as number) : [d.value as number]\n        ).filter((v: number) => v > 0);\n\n        const effectiveCount = leafValues.length > 0\n            ? computeEffectiveBarCount(leafValues)\n            : categories.length;\n\n        const baseW = ctx.canvasSize.width;\n        const baseH = ctx.canvasSize.height;\n        const minBarPx = 30;          // minimum width per effective bar\n        const elasticity = 0.5;\n        const maxStretch = ctx.assembleOptions?.maxStretch ?? 2.0;       // legacy scalar fallback\n        const maxStretchX = ctx.assembleOptions?.maxStretchX ?? maxStretch;  // width budget βx\n        const maxStretchY = ctx.assembleOptions?.maxStretchY ?? maxStretch;  // height budget βy\n        const xBias = 1.5;            // X takes more of the stretch than Y\n\n        const pressure = (effectiveCount * minBarPx) / baseW;\n        const areaStretch = pressure <= 1 ? 1 : Math.min(maxStretchX * maxStretchY, Math.pow(pressure, elasticity));\n        const stretchX = Math.min(maxStretchX, Math.pow(areaStretch, xBias / (xBias + 1)));\n        const stretchY = Math.min(maxStretchY, Math.pow(areaStretch, 1 / (xBias + 1)));\n\n        const canvasW = Math.round(baseW * stretchX);\n        const canvasH = Math.round(baseH * stretchY);\n\n        const showBreadcrumb = chartProperties?.breadcrumb !== false;\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (params: any) => {\n                    const { name, value, treePathInfo } = params;\n                    const path = treePathInfo\n                        ? treePathInfo.map((n: any) => n.name).filter(Boolean).join(' → ')\n                        : name;\n                    return `${path}<br/>Value: ${value}`;\n                },\n            },\n            series: [{\n                type: 'treemap',\n                data: treemapData,\n                width: '90%',\n                height: showBreadcrumb ? '80%' : '90%',\n                top: 10,\n                left: 'center',\n                roam: false,\n                leafDepth: subCatField ? 2 : 1,\n                breadcrumb: {\n                    show: showBreadcrumb,\n                    bottom: 5,\n                },\n                label: {\n                    show: true,\n                    formatter: '{b}',\n                    fontSize: 12,\n                },\n                upperLabel: subCatField ? {\n                    show: true,\n                    height: 20,\n                    fontSize: 11,\n                    color: '#fff',\n                } : undefined,\n                levels: subCatField ? [\n                    {\n                        // Root level (hidden)\n                        itemStyle: { borderWidth: 0, gapWidth: 2 },\n                    },\n                    {\n                        // Top-level categories\n                        itemStyle: {\n                            borderWidth: 2,\n                            borderColor: '#fff',\n                            gapWidth: 2,\n                        },\n                        upperLabel: { show: true },\n                    },\n                    {\n                        // Leaf level (sub-categories)\n                        itemStyle: {\n                            borderWidth: 1,\n                            borderColor: 'rgba(255,255,255,0.5)',\n                            gapWidth: 1,\n                        },\n                        label: { show: true, fontSize: 10 },\n                        colorSaturation: [0.3, 0.6],\n                        colorMappingBy: 'value',\n                    },\n                ] : [\n                    {\n                        itemStyle: {\n                            borderWidth: 2,\n                            borderColor: '#fff',\n                            gapWidth: 2,\n                        },\n                    },\n                ],\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'breadcrumb', label: 'Breadcrumb', type: 'discrete', options: [\n                { value: true, label: 'Show (default)' },\n                { value: false, label: 'Hide' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Sunburst Chart template.\n *\n * Unique to ECharts — no native Vega-Lite equivalent.\n * Displays hierarchical data as concentric rings where angular extent\n * encodes value and ring level encodes hierarchy depth.\n *\n * Data model:\n *   color  (nominal): inner ring (top-level partition, drives palette)\n *   size   (quantitative): value (mapped to angular extent on leaves)\n *   group  (nominal, optional): middle ring — e.g. gameType under region\n *   detail (nominal, optional): outer ring / leaves — e.g. game under gameType\n *\n * If only color + size: single-ring sunburst (same as pie but styled differently).\n * If color + size + group: two-ring (color = inner, group = outer).\n * If color + size + detail (no group): two-ring (color = inner, detail = outer).\n * If color + size + group + detail: three-ring (inner → middle → outer).\n *   Same base hue per inner branch: 100% / 80% / 60% opacity by depth.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, DEFAULT_COLORS, computeCircumferencePressure, computeEffectiveBarCount } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nfunction collectSunburstLeafValues(nodes: any[]): number[] {\n    return nodes.flatMap((d: any) => {\n        if (d.children?.length) {\n            return collectSunburstLeafValues(d.children);\n        }\n        return [Number(d.value) || 0];\n    });\n}\n\n/** Inner ring = 100%, middle = 80%, outer = 60% — same hue as inner (palette base). */\nconst SUNBURST_OPACITY_L1 = 1;\nconst SUNBURST_OPACITY_L2 = 0.8;\nconst SUNBURST_OPACITY_L3 = 0.6;\n\n/** Outer ring only: hide label when sector angle (deg) is below this (ECharts label.minAngle). */\nconst SUNBURST_OUTER_LABEL_MIN_ANGLE_DEG = 3;\n\n/** Enlarge sunburst canvas (_width/_height) and radius budget vs default gallery size. */\nconst SUNBURST_CANVAS_SIZE_MULTIPLIER = 1.55;\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n    const s = hex.trim();\n    let m = /^#?([0-9a-f]{6})$/i.exec(s);\n    if (m) {\n        const intVal = parseInt(m[1], 16);\n        return { r: (intVal >> 16) & 255, g: (intVal >> 8) & 255, b: intVal & 255 };\n    }\n    m = /^#?([0-9a-f]{3})$/i.exec(s);\n    if (m) {\n        const x = m[1];\n        const full = x.split('').map(c => c + c).join('');\n        const intVal = parseInt(full, 16);\n        return { r: (intVal >> 16) & 255, g: (intVal >> 8) & 255, b: intVal & 255 };\n    }\n    return null;\n}\n\nfunction sunburstColorWithOpacity(baseColor: string, alpha: number): string {\n    const rgb = hexToRgb(baseColor);\n    if (rgb) {\n        return `rgba(${rgb.r},${rgb.g},${rgb.b},${alpha})`;\n    }\n    const rgbaM = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i.exec(baseColor.trim());\n    if (rgbaM) {\n        return `rgba(${rgbaM[1]},${rgbaM[2]},${rgbaM[3]},${alpha})`;\n    }\n    return baseColor;\n}\n\nexport const ecSunburstDef: ChartTemplateDef = {\n    chart: 'Sunburst Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['color', 'size', 'detail', 'group'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const catField = channelSemantics.color?.field;\n        const valField = channelSemantics.size?.field;\n        const middleField = channelSemantics.group?.field;\n        const leafField = channelSemantics.detail?.field;\n\n        if (!catField) return;\n\n        const categories = extractCategories(table, catField, channelSemantics.color?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        // ── Resolve palette from backend-agnostic color decisions ────────\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) {\n                palette = fromRegistry;\n            }\n        }\n        if (!palette || palette.length === 0) {\n            const catCount = categories.length;\n            const fallbackId = catCount > 10 ? 'cat20' : 'cat10';\n            palette = getPaletteForScheme(fallbackId) ?? DEFAULT_COLORS;\n        }\n\n        // Build sunburst data (hierarchical tree structure)\n        let sunburstData: any[];\n\n        if (middleField && leafField) {\n            // Three-level: color (100%) → group (80%) → detail leaves (60%)\n            sunburstData = categories.map((cat, catIdx) => {\n                const base = palette![catIdx % palette!.length];\n                const catRows = table.filter(r => String(r[catField]) === cat);\n                const subCats = extractCategories(catRows, middleField);\n\n                const children = subCats.map(sub => {\n                    const subRows = catRows.filter(r => String(r[middleField]) === sub);\n                    const leaves = extractCategories(subRows, leafField);\n                    const grandchildren = leaves.map(leaf => {\n                        const leafRows = subRows.filter(r => String(r[leafField]) === leaf);\n                        let value: number;\n                        if (valField) {\n                            value = leafRows.reduce((sum, r) => sum + (Number(r[valField]) || 0), 0);\n                        } else {\n                            value = leafRows.length;\n                        }\n                        return {\n                            name: leaf,\n                            value,\n                            itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L3) },\n                        };\n                    });\n                    return {\n                        name: sub,\n                        children: grandchildren,\n                        itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L2) },\n                    };\n                });\n\n                return {\n                    name: cat,\n                    children,\n                    itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L1) },\n                };\n            });\n        } else if (middleField) {\n            // Two-level: color + group — inner 100%, outer 80%\n            sunburstData = categories.map((cat, catIdx) => {\n                const base = palette![catIdx % palette!.length];\n                const catRows = table.filter(r => String(r[catField]) === cat);\n                const subCats = extractCategories(catRows, middleField);\n\n                const children = subCats.map(sub => {\n                    const subRows = catRows.filter(r => String(r[middleField]) === sub);\n                    let value: number;\n                    if (valField) {\n                        value = subRows.reduce((sum, r) => sum + (Number(r[valField]) || 0), 0);\n                    } else {\n                        value = subRows.length;\n                    }\n                    return {\n                        name: sub,\n                        value,\n                        itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L2) },\n                    };\n                });\n\n                return {\n                    name: cat,\n                    children,\n                    itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L1) },\n                };\n            });\n        } else if (leafField) {\n            // Two-level: color + detail (no group) — inner 100%, outer 80%\n            sunburstData = categories.map((cat, catIdx) => {\n                const base = palette![catIdx % palette!.length];\n                const catRows = table.filter(r => String(r[catField]) === cat);\n                const subCats = extractCategories(catRows, leafField);\n\n                const children = subCats.map(sub => {\n                    const subRows = catRows.filter(r => String(r[leafField]) === sub);\n                    let value: number;\n                    if (valField) {\n                        value = subRows.reduce((sum, r) => sum + (Number(r[valField]) || 0), 0);\n                    } else {\n                        value = subRows.length;\n                    }\n                    return {\n                        name: sub,\n                        value,\n                        itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L2) },\n                    };\n                });\n\n                return {\n                    name: cat,\n                    children,\n                    itemStyle: { color: sunburstColorWithOpacity(base, SUNBURST_OPACITY_L1) },\n                };\n            });\n        } else {\n            // Flat: single ring\n            const agg = new Map<string, number>();\n            if (valField) {\n                for (const row of table) {\n                    const cat = String(row[catField] ?? '');\n                    const val = Number(row[valField]) || 0;\n                    agg.set(cat, (agg.get(cat) ?? 0) + val);\n                }\n            } else {\n                for (const row of table) {\n                    const cat = String(row[catField] ?? '');\n                    agg.set(cat, (agg.get(cat) ?? 0) + 1);\n                }\n            }\n\n            sunburstData = categories.map((cat, i) => ({\n                name: cat,\n                value: agg.get(cat) ?? 0,\n                itemStyle: { color: palette![i % palette!.length] },\n            }));\n        }\n\n        // ── Circumference-pressure sizing (spring model) ──────────────\n        // Compute effective bar count from outer-ring leaf values.\n        // For two-level hierarchy: use the outer-ring leaves.\n        // For flat: use slice values directly.\n        let outerValues: number[];\n        if (middleField || leafField) {\n            outerValues = collectSunburstLeafValues(sunburstData);\n        } else {\n            outerValues = sunburstData.map((d: any) => d.value as number);\n        }\n        const effectiveCount = computeEffectiveBarCount(outerValues);\n\n        const sunburstCanvas = {\n            width: Math.round(ctx.canvasSize.width * SUNBURST_CANVAS_SIZE_MULTIPLIER),\n            height: Math.round(ctx.canvasSize.height * SUNBURST_CANVAS_SIZE_MULTIPLIER),\n        };\n        const { radius: pressureRadius, canvasW, canvasH }\n            = computeCircumferencePressure(effectiveCount, sunburstCanvas, {\n                minArcPx: 45,\n                minRadius: Math.round(80 * SUNBURST_CANVAS_SIZE_MULTIPLIER),\n                maxRadius: Math.round(400 * SUNBURST_CANVAS_SIZE_MULTIPLIER),\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n            });\n\n        const minOuterR = Math.round(80 * SUNBURST_CANVAS_SIZE_MULTIPLIER);\n        const outerRadius = Math.max(\n            minOuterR,\n            Math.round(Math.min(pressureRadius, (Math.min(canvasW, canvasH) / 2 - 20))),\n        );\n        const innerRadius = chartProperties?.innerRadius ?? Math.round(outerRadius * 0.15);\n        const span = outerRadius - innerRadius;\n        const ringThird1 = innerRadius + Math.round(span / 3);\n        const ringThird2 = innerRadius + Math.round((2 * span) / 3);\n        const ringHalf = Math.round(innerRadius + span * 0.5);\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (params: any) => {\n                    const { name, value, treePathInfo } = params;\n                    const path = treePathInfo\n                        ? treePathInfo.map((n: any) => n.name).filter(Boolean).join(' → ')\n                        : name;\n                    return `${path}<br/>Value: ${value}`;\n                },\n            },\n            series: [{\n                type: 'sunburst',\n                data: sunburstData,\n                radius: [`${innerRadius}px`, `${outerRadius}px`],\n                center: ['50%', '50%'],\n                label: {\n                    show: true,\n                    rotate: chartProperties?.labelRotate ?? 'radial',\n                    fontSize: 11,\n                    color: '#000000',\n                },\n                emphasis: {\n                    focus: 'ancestor',\n                    label: { color: '#000000' },\n                },\n                levels: middleField && leafField ? [\n                    {},\n                    {\n                        r0: `${innerRadius}px`,\n                        r: `${ringThird1}px`,\n                        label: { fontSize: 11, fontWeight: 'bold', color: '#000000' },\n                        itemStyle: { borderWidth: 2, borderColor: '#fff' },\n                    },\n                    {\n                        r0: `${ringThird1}px`,\n                        r: `${ringThird2}px`,\n                        label: { fontSize: 10, color: '#000000' },\n                        itemStyle: { borderWidth: 1, borderColor: 'rgba(255,255,255,0.55)' },\n                    },\n                    {\n                        r0: `${ringThird2}px`,\n                        r: `${outerRadius}px`,\n                        label: {\n                            fontSize: 9,\n                            color: '#000000',\n                            minAngle: SUNBURST_OUTER_LABEL_MIN_ANGLE_DEG,\n                        },\n                        itemStyle: { borderWidth: 1, borderColor: 'rgba(255,255,255,0.35)' },\n                    },\n                ] : (middleField || leafField) ? [\n                    {}, // root\n                    {\n                        // Inner ring (top-level categories)\n                        r0: `${innerRadius}px`,\n                        r: `${ringHalf}px`,\n                        label: { fontSize: 12, fontWeight: 'bold', color: '#000000' },\n                        itemStyle: { borderWidth: 2, borderColor: '#fff' },\n                    },\n                    {\n                        // Outer ring (sub-categories)\n                        r0: `${ringHalf}px`,\n                        r: `${outerRadius}px`,\n                        label: {\n                            fontSize: 10,\n                            color: '#000000',\n                            minAngle: SUNBURST_OUTER_LABEL_MIN_ANGLE_DEG,\n                        },\n                        itemStyle: { borderWidth: 1, borderColor: 'rgba(255,255,255,0.5)' },\n                    },\n                ] : [\n                    {}, // root\n                    {\n                        label: {\n                            fontSize: 12,\n                            color: '#000000',\n                            minAngle: SUNBURST_OUTER_LABEL_MIN_ANGLE_DEG,\n                        },\n                        itemStyle: { borderWidth: 2, borderColor: '#fff' },\n                    },\n                ],\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'innerRadius', label: 'Inner R', type: 'continuous', min: 0, max: 80, step: 5, defaultValue: 0 } as ChartPropertyDef,\n        {\n            key: 'labelRotate', label: 'Labels', type: 'discrete', options: [\n                { value: 'radial', label: 'Radial (default)' },\n                { value: 'tangential', label: 'Tangential' },\n                { value: 0, label: 'Horizontal' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Sankey Diagram template.\n *\n * Unique to ECharts — no Vega-Lite equivalent.\n * Displays flow/transfer data as a node-link diagram where link width\n * encodes flow magnitude.\n *\n * Data model (each row = one flow link):\n *   x    (nominal): source node name\n *   y    (nominal): target node name\n *   size (quantitative): flow value / weight\n *\n * Nodes are auto-derived from unique source/target values.\n * Multiple rows with the same source→target pair are aggregated (sum).\n *\n * Scaling: uses the spring model separately for x and y, treating each\n * node block as a spring.  The x-axis counts source nodes (proxy for\n * layer width), y-axis counts target nodes (proxy for vertical stacking).\n * Large step multipliers ensure adequate space for edge routing between\n * node columns.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nexport const ecSankeyDef: ChartTemplateDef = {\n    chart: 'Sankey Diagram',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['x', 'y', 'size'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        axisFlags: {\n            x: { banded: true },\n            y: { banded: true },\n        },\n        paramOverrides: {\n            // Each node block needs generous space:\n            // x-step covers node width (~20px) + edge routing gap (~60px)\n            // y-step covers node height + nodeGap\n            defaultBandSize: 60,\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, layout, colorDecisions } = ctx;\n        const sourceField = channelSemantics.x?.field;   // source node\n        const targetField = channelSemantics.y?.field;    // target node\n        const valueField = channelSemantics.size?.field;  // flow value\n\n        if (!sourceField || !targetField) return;\n\n        // Aggregate links: source→target → sum(value)\n        const linkAgg = new Map<string, number>();\n        for (const row of table) {\n            const src = String(row[sourceField] ?? '');\n            const tgt = String(row[targetField] ?? '');\n            if (!src || !tgt || src === tgt) continue; // skip self-links\n            const key = `${src}\\x00${tgt}`;\n            const val = valueField ? (Number(row[valueField]) || 0) : 1;\n            linkAgg.set(key, (linkAgg.get(key) ?? 0) + val);\n        }\n\n        // Build links & collect unique nodes\n        const nodeSet = new Set<string>();\n        const links: { source: string; target: string; value: number }[] = [];\n        for (const [key, value] of linkAgg) {\n            const [source, target] = key.split('\\x00');\n            nodeSet.add(source);\n            nodeSet.add(target);\n            links.push({ source, target, value });\n        }\n\n        if (links.length === 0) return;\n\n        // Build nodes with colors\n        const nodeArr = [...nodeSet];\n\n        // ── Resolve palette from backend-agnostic color decisions ────────\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) {\n                palette = fromRegistry;\n            }\n        }\n        if (!palette || palette.length === 0) {\n            const catCount = nodeArr.length;\n            const fallbackId = catCount > 10 ? 'cat20' : 'cat10';\n            palette = getPaletteForScheme(fallbackId) ?? DEFAULT_COLORS;\n        }\n\n        const nodes = nodeArr.map((name, i) => ({\n            name,\n            itemStyle: { color: palette![i % palette!.length] },\n        }));\n\n        // ── Layout-driven sizing ─────────────────────────────────────────\n        // x-step × sourceCount → width (proxy for layer structure)\n        // y-step × targetCount → height (proxy for vertical stacking)\n        const sourceCount = layout.xNominalCount || new Set(table.map(r => String(r[sourceField]))).size;\n        const targetCount = layout.yNominalCount || new Set(table.map(r => String(r[targetField]))).size;\n\n        const nodeGap = chartProperties?.nodeGap ?? 10;\n        const nodeWidth = chartProperties?.nodeWidth ?? 20;\n\n        // Width: need room for source column + target column + edge routing\n        // Use xStep as \"per source node spacing\" — scale by max(2, layerEstimate)\n        const layerEstimate = 2; // typical sankey has at least 2 layers\n        const canvasW = Math.max(300,\n            layout.xStep * Math.max(sourceCount, layerEstimate) + 60);\n        // Height: need room for max stacking of nodes vertically\n        const maxNodesPerColumn = Math.max(sourceCount, targetCount);\n        const canvasH = Math.max(250,\n            layout.yStep * maxNodesPerColumn);\n\n        const orient = chartProperties?.orient ?? 'horizontal';\n\n        const margin = 60;\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                triggerOn: 'mousemove',\n                formatter: (params: any) => {\n                    if (params.dataType === 'edge') {\n                        return `${params.data.source} → ${params.data.target}<br/>Value: ${params.data.value}`;\n                    }\n                    return params.name;\n                },\n            },\n            series: [{\n                type: 'sankey',\n                data: nodes,\n                links,\n                orient,\n                emphasis: {\n                    focus: 'adjacency',\n                },\n                lineStyle: {\n                    color: 'gradient',\n                    curveness: 0.5,\n                },\n                nodeWidth,\n                nodeGap,\n                label: {\n                    show: true,\n                    fontSize: 11,\n                },\n                left: margin,\n                right: margin,\n                top: 20,\n                bottom: 20,\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'orient', label: 'Orient', type: 'discrete', options: [\n                { value: 'horizontal', label: 'Horizontal (default)' },\n                { value: 'vertical', label: 'Vertical' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'nodeWidth', label: 'Node Width', type: 'continuous', min: 5, max: 40, step: 5, defaultValue: 20 } as ChartPropertyDef,\n        { key: 'nodeGap', label: 'Node Gap', type: 'continuous', min: 2, max: 30, step: 2, defaultValue: 10 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Lollipop Chart — rule from 0 to value + dot at end (mirror vegalite/templates/lollipop.ts).\n * Vega-Lite: rule strokeWidth 1.5、圆 size 80；茎黑色，圆点用图例色。\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport { extractCategories, groupBy, DEFAULT_COLORS, getCategoryOrder } from './utils';\nimport { detectAxes } from './utils';\nimport { detectBandedAxisFromSemantics } from '../../core/axis-detection';\nimport { makeSortAction } from '../../core/encoding-actions';\n\n/** Vega-Lite 风格：茎（rule）黑色、细线，圆点与 color 图例一致 */\nconst STEM_COLOR = '#000000';\n/** 茎线宽度，对应 VL rule strokeWidth: 1.5 */\nconst STEM_WIDTH_PX = 1.5;\n/** 圆点直径约 10px，对应 VL circle size: 80（面积量级） */\nconst DOT_SIZE_BASE = 10;\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → horizontal labels; otherwise vertical (align with line chart). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\nexport const ecLollipopChartDef: ChartTemplateDef = {\n    chart: 'Lollipop Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const colorField = channelSemantics.color?.field;\n        const categories = extractCategories(table, catField, getCategoryOrder(ctx, categoryAxis) ?? catCS?.ordinalSortOrder);\n\n        const valueMap = new Map<string, number>();\n        for (const row of table) {\n            const cat = String(row[catField] ?? '');\n            const val = row[valField];\n            if (val != null && !isNaN(val)) {\n                valueMap.set(cat, (valueMap.get(cat) ?? 0) + Number(val));\n            }\n        }\n        const values = categories.map(cat => valueMap.get(cat) ?? null);\n\n        const isHorizontal = categoryAxis === 'y';\n        const dotSizeConfig = chartProperties?.dotSize ?? 80;\n        const symbolSizePx = Math.max(6, Math.min(DOT_SIZE_BASE + (dotSizeConfig - 80) / 40, 16));\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n            xAxis: isHorizontal\n                ? {\n                    type: 'value',\n                    name: valField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisTick: { show: true },\n                    axisLabel: { rotate: 0 },\n                }\n                : {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    nameLocation: 'middle',\n                    nameGap: 30,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: areCategoriesNumeric(categories) ? 0 : 90 },\n                },\n            yAxis: isHorizontal\n                ? {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: 0 },\n                }\n                : {\n                    type: 'value',\n                    name: valField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true },\n                    axisLabel: { rotate: 0 },\n                },\n            series: [\n                {\n                    type: 'bar',\n                    data: values,\n                    barWidth: STEM_WIDTH_PX,\n                    itemStyle: { color: STEM_COLOR },\n                },\n            ],\n        };\n\n        // Tooltip：只展示圆点（scatter）的值，不展示茎（bar）\n        option.tooltip = option.tooltip ?? {};\n        option._encodingTooltip = {\n            trigger: 'axis',\n            categoryLabel: catField,\n            valueLabel: valField,\n            // 由 buildEncodingTooltipFormatter 只保留 seriesType === 'scatter' 的条目\n            filterScatterOnly: true,\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            const colorOrder = getCategoryOrder(ctx, 'color');\n            const legendKeys = colorOrder && colorOrder.length > 0\n                ? colorOrder.filter((k: string) => groups.has(k))\n                : [...groups.keys()];\n            if (legendKeys.length > 0) {\n                option.legend = { data: legendKeys };\n                option._legendTitle = colorField;\n            }\n            for (const name of legendKeys) {\n                const rows = groups.get(name) ?? [];\n                const scatterData = rows\n                    .filter((r: any) => {\n                        const v = r[valField];\n                        return v != null && !isNaN(Number(v));\n                    })\n                    .map((r: any) => {\n                        const cat = String(r[catField] ?? '');\n                        const v = Number(r[valField]);\n                        return isHorizontal ? [v, cat] : [cat, v];\n                    });\n                option.series.push({\n                    name,\n                    type: 'scatter',\n                    data: scatterData,\n                    symbolSize: symbolSizePx,\n                    itemStyle: { borderColor: '#fff', borderWidth: 1 },\n                    z: 2,\n                });\n            }\n        } else {\n            option.series.push({\n                type: 'scatter',\n                data: categories.map((cat, i) => {\n                    const v = values[i];\n                    return isHorizontal ? [v, cat] : [cat, v];\n                }),\n                symbolSize: symbolSizePx,\n                itemStyle: { color: DEFAULT_COLORS[0], borderColor: '#fff', borderWidth: 1 },\n                z: 2,\n            });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'dotSize', label: 'Dot Size', type: 'continuous', min: 20, max: 300, step: 10, defaultValue: 80 },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Strip Plot — scatter with jitter on categorical axis (mirror vegalite/templates/jitter.ts).\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { extractCategories, groupBy } from './utils';\nimport { pickEChartsPalette } from '../colormap';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** True if all category labels parse as numbers → horizontal; else vertical (align with line/bar). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\n/** Seeded jitter for reproducible strip plot. */\nfunction jitter(seed: number): () => number {\n    let s = seed;\n    return () => {\n        s = (s * 1103515245 + 12345) & 0x7fffffff;\n        return (s / 0x7fffffff) * 2 - 1;\n    };\n}\n\nexport const ecStripPlotDef: ChartTemplateDef = {\n    chart: 'Strip Plot',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'color', 'size', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { defaultBandSize: 50, minStep: 16 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n        const isTemporalColor = colorType === 'temporal';\n\n        if (!xField || !yField) return;\n\n        const xIsDiscrete = isDiscrete(xCS?.type);\n        const yIsDiscrete = isDiscrete(yCS?.type);\n        const catAxis = xIsDiscrete ? 'x' : yIsDiscrete ? 'y' : 'x';\n        const contAxis = catAxis === 'x' ? 'y' : 'x';\n        const catField = catAxis === 'x' ? xField : yField;\n        const contField = contAxis === 'x' ? xField : yField;\n\n        const categories = extractCategories(table, catField!, (catAxis === 'x' ? xCS : yCS)?.ordinalSortOrder);\n        const catToIndex = new Map(categories.map((c, i) => [c, i]));\n        const jitterHalfWidth = 0.3;\n        const rand = jitter(42);\n        const nCat = categories.length;\n\n        const isHorizontal = catAxis === 'y';\n        const catAxisLabel = {\n            rotate: isHorizontal ? 0 : (areCategoriesNumeric(categories) ? 0 : 45),\n        };\n        const valueAxisCommon = (name: string) => ({\n            type: 'value' as const,\n            name,\n            axisTick: { show: true },\n            axisLabel: { rotate: 0 },\n            axisLine: { onZero: false },\n        });\n\n        // Use a visible category axis for labels + a hidden value axis for scatter positioning.\n        // This lets fractional indices produce real jitter while keeping clean category labels.\n        const catAxisIdx = isHorizontal ? 'yAxis' : 'xAxis';\n        const valAxisIdx = isHorizontal ? 'xAxis' : 'yAxis';\n\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            [catAxisIdx]: [\n                {\n                    type: 'category',\n                    data: categories,\n                    name: catField,\n                    boundaryGap: true,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: catAxisLabel,\n                },\n                {\n                    // Hidden value axis aligned with the category axis for scatter jitter.\n                    type: 'value',\n                    min: -0.5,\n                    max: nCat - 0.5,\n                    show: false,\n                },\n            ],\n            [valAxisIdx]: valueAxisCommon(contField!),\n            series: [],\n        };\n\n        const catScatterAxisIndex = 1; // use the hidden value axis\n\n        const toColorVal = (value: any) => {\n            if (value == null) return NaN;\n            return isTemporalColor ? new Date(value).getTime() : Number(value);\n        };\n\n        const buildPoint = (row: any) => {\n            const cat = String(row[catField!] ?? '');\n            const idx = catToIndex.get(cat) ?? 0;\n            const offset = rand() * jitterHalfWidth;\n            const catVal = idx + offset;\n            const contVal = row[contField];\n            const point = catAxis === 'x' ? [catVal, contVal] : [contVal, catVal];\n            if (isContinuousColor && colorField) {\n                point.push(toColorVal(row[colorField]));\n            }\n            return point;\n        };\n\n        const scatterAxisRef = isHorizontal\n            ? { yAxisIndex: catScatterAxisIndex }\n            : { xAxisIndex: catScatterAxisIndex };\n\n        if (isContinuousColor && colorField) {\n            const colorVals = table\n                .map((row: any) => toColorVal(row[colorField]))\n                .filter((value: number) => Number.isFinite(value));\n            const colorMin = colorVals.length ? Math.min(...colorVals) : 0;\n            const colorMax = colorVals.length ? Math.max(...colorVals) : 1;\n            const palette = pickEChartsPalette(colorDecisions?.color ?? colorDecisions?.group);\n            option.visualMap = {\n                type: 'continuous',\n                min: colorMin,\n                max: colorMax,\n                dimension: 2,\n                inRange: { color: palette },\n                orient: 'vertical',\n                right: 10,\n                top: '12%',\n                bottom: '12%',\n                name: colorField,\n            };\n            option._visualMapWidth = 70;\n            option.graphic = [{\n                type: 'text',\n                right: 10,\n                top: 4,\n                z: 100,\n                style: {\n                    text: colorField,\n                    fontSize: 11,\n                    fontWeight: 'bold',\n                    fill: '#333',\n                    textAlign: 'right',\n                },\n            }];\n            option.series.push({\n                name: colorField,\n                type: 'scatter',\n                ...scatterAxisRef,\n                data: table.map(buildPoint),\n                itemStyle: { opacity: 0.7 },\n                symbolSize: 8,\n            });\n        } else if (colorField && isDiscrete(colorType)) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n            for (const [name, rows] of groups) {\n                option.series.push({\n                    name,\n                    type: 'scatter',\n                    ...scatterAxisRef,\n                    data: rows.map(buildPoint),\n                    itemStyle: { opacity: 0.7 },\n                    symbolSize: 8,\n                });\n            }\n        } else {\n            option.series.push({\n                type: 'scatter',\n                ...scatterAxisRef,\n                data: table.map(buildPoint),\n                itemStyle: { opacity: 0.7 },\n                symbolSize: 8,\n            });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    pivot: makeCartesianPivot({\n        // θ (Strip → Scatter) declared centrally in core/chart-transitions.ts.\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Waterfall Chart — cumulative bar with start/delta/end (mirror vegalite/templates/waterfall.ts).\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { resolveTotalsMode } from '../../chart-types/waterfall';\nimport { extractCategories } from './utils';\n\n/** True if all category labels parse as numbers → horizontal; else vertical (align with line/bar). */\nfunction areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\nexport const ecWaterfallChartDef: ChartTemplateDef = {\n    chart: 'Waterfall Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { x: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xField = channelSemantics.x?.field || 'Category';\n        const yField = channelSemantics.y?.field || 'Amount';\n        const colorField = channelSemantics.color?.field;\n\n        const categories = extractCategories(table, xField, undefined);\n        const rows = categories.map(cat => table.find((r: any) => String(r[xField]) === cat)).filter(Boolean);\n        const values = rows.map((r: any) => Number(r[yField]) || 0);\n\n        const hasTypeCol = !!colorField;\n        // Which bars (if any) touch down to zero as full \"total\" bars. The default\n        // is data-aware (see chart-types/waterfall.ts): first is a start total, last is a\n        // total only when it reconciles with the prior cumulative. The user's\n        // `totals` property overrides this; an explicit Type column is\n        // authoritative. Mirror vegalite/templates/waterfall.ts.\n        const totalsMode = resolveTotalsMode(values, ctx.chartProperties?.totals);\n        const wantFirst = totalsMode === 'first' || totalsMode === 'both';\n        const wantLast = totalsMode === 'last' || totalsMode === 'both';\n        const types: string[] = hasTypeCol\n            ? rows.map((r: any) => String(r[colorField] ?? 'delta'))\n            : values.map((_, i) =>\n                wantFirst && i === 0 ? 'start'\n                    : wantLast && i === values.length - 1 ? 'end'\n                        : 'delta');\n\n        // Cumulative sum including the current row (mirror vegalite/templates/waterfall.ts).\n        const cumulative: number[] = [];\n        let acc = 0;\n        for (const v of values) { acc += v; cumulative.push(acc); }\n\n        const COLOR = { startEnd: '#5470c6', increase: '#91cc75', decrease: '#ee6666' };\n\n        // Compact number formatter for the value labels (mirror the Vega-Lite\n        // template's grouped/SI formatting).\n        const fmt = (n: number) => {\n            const a = Math.abs(n);\n            if (a >= 1000) {\n                const v = n / 1000;\n                return `${Number(v.toFixed(v % 1 === 0 ? 0 : 1)).toLocaleString('en-US')}k`;\n            }\n            return Number(n.toFixed(2)).toLocaleString('en-US');\n        };\n\n        // Per-bar [base, base+height]. 'start'/'end' are anchored at 0 (full bars to\n        // the running total — the end row's own value is a subtotal marker, excluded,\n        // matching Vega-Lite); 'delta' floats from the previous running total. Heights\n        // are kept positive (base = the lower edge) because ECharts stacks negative\n        // values on a separate negative stack, which would otherwise drop decrease bars\n        // to the zero baseline instead of floating them.\n        // Per-bar floating rectangle [lo, hi] plus the original signed amount (for\n        // tooltips). Drawn via a custom series below so bars that cross zero render\n        // correctly. Mirror vegalite/templates/waterfall.ts.\n        const barData: Array<{ value: number[]; itemStyle: { color: string } }> = [];\n        const tops: number[] = [];\n        // Per-bar label strings: the running total shown outside the tip and the\n        // signed step delta shown inside the bar (mirror vegalite/templates/waterfall.ts).\n        const outerText: string[] = [];\n        const innerText: string[] = [];\n        const tipVals: number[] = [];\n        const prevVals: number[] = [];\n        for (let i = 0; i < values.length; i++) {\n            const v = values[i];\n            const t = types[i];\n            const top = t === 'end' ? cumulative[i] - v : cumulative[i];\n            const prev = (t === 'start' || t === 'end') ? 0 : cumulative[i] - v;\n            const lo = Math.min(prev, top);\n            const hi = Math.max(prev, top);\n            const color = (t === 'start' || t === 'end')\n                ? COLOR.startEnd\n                : top >= prev ? COLOR.increase : COLOR.decrease;\n            barData.push({ value: [i, lo, hi, v], itemStyle: { color } });\n            tops.push(top);\n            outerText.push(fmt(top));\n            innerText.push((t === 'delta' && v > 0 ? '+' : '') + fmt(v));\n            tipVals.push(top);\n            prevVals.push(prev);\n        }\n\n        const showLabels = !!ctx.chartProperties?.showTextLabels;\n\n        // Thin connector lines bridging each bar to the next at the running\n        // cumulative level, spanning only the inter-bar gap. Mirror\n        // vegalite/templates/waterfall.ts (drawn via a custom series since ECharts\n        // markLine cannot offset to the bar edges).\n        const BAR_WIDTH_FRAC = 0.58;\n        const connectorData = tops.slice(0, -1).map((y, i) => [i, y]);\n\n        const legendItems = ['Start/End', 'Increase', 'Decrease'];\n        const legendColors = [COLOR.startEnd, COLOR.increase, COLOR.decrease];\n\n        const option: any = {\n            tooltip: {\n                trigger: 'axis',\n                axisPointer: { type: 'shadow' },\n                formatter: (params: any[]) => {\n                    const head = params[0]?.axisValueLabel ?? params[0]?.name ?? '';\n                    const bar = params.find((p) => p.seriesName === 'Delta' && Array.isArray(p.value));\n                    if (!bar) return String(head);\n                    return `${head}<br/>${bar.marker ?? ''} ${yField}: ${bar.value[3]}`;\n                },\n            },\n            legend: {\n                data: legendItems,\n            },\n            xAxis: {\n                type: 'category',\n                data: categories,\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                axisTick: { show: true, alignWithLabel: true },\n                axisLabel: {\n                    rotate: areCategoriesNumeric(categories) ? 0 : 90,\n                    formatter: (value: string) => value,\n                },\n            },\n            yAxis: { type: 'value', name: yField, axisTick: { show: true } },\n            series: [\n                // Bars as floating rectangles. A custom series gives full [lo, hi]\n                // control so bars crossing zero render correctly (a transparent-base +\n                // delta stack would snap them back to the zero baseline, because\n                // ECharts splits positive/negative values onto separate stacks).\n                {\n                    type: 'custom' as const,\n                    name: 'Delta',\n                    data: barData,\n                    encode: { x: 0, y: [1, 2] },\n                    renderItem: (params: any, api: any) => {\n                        const i = api.value(0);\n                        const lo = api.value(1);\n                        const hi = api.value(2);\n                        const pLo = api.coord([i, lo]);\n                        const pHi = api.coord([i, hi]);\n                        const band = api.size([1, 0])[0];\n                        const w = band * BAR_WIDTH_FRAC;\n                        const cx = pLo[0];\n                        const yTop = Math.min(pLo[1], pHi[1]);\n                        const h = Math.abs(pLo[1] - pHi[1]);\n                        const rect = {\n                            type: 'rect',\n                            shape: { x: cx - w / 2, y: yTop, width: w, height: h },\n                            style: api.style(),\n                        };\n\n                        // Labels are resolution-aware: skip when the band is too\n                        // narrow; inner delta is skipped when the bar is too short.\n                        if (!showLabels || band < 18) return rect;\n                        const idx = params.dataIndex;\n                        const fontSize = band >= 40 ? 10 : band >= 26 ? 9 : 8;\n                        const up = tipVals[idx] >= prevVals[idx];\n                        const pTip = api.coord([i, tipVals[idx]]);\n                        const children: any[] = [rect];\n                        // Running total outside the bar tip (above up-moves / below).\n                        children.push({\n                            type: 'text',\n                            style: {\n                                text: outerText[idx],\n                                x: cx,\n                                y: pTip[1] + (up ? -4 : 4),\n                                textAlign: 'center',\n                                textVerticalAlign: up ? 'bottom' : 'top',\n                                fill: '#374151',\n                                fontSize,\n                            },\n                        });\n                        // Delta inside the bar (white), only when tall enough.\n                        if (h >= fontSize + 4) {\n                            children.push({\n                                type: 'text',\n                                style: {\n                                    text: innerText[idx],\n                                    x: cx,\n                                    y: (pLo[1] + pHi[1]) / 2,\n                                    textAlign: 'center',\n                                    textVerticalAlign: 'middle',\n                                    fill: '#ffffff',\n                                    fontSize,\n                                },\n                            });\n                        }\n                        return { type: 'group', children };\n                    },\n                },\n                // Legend-only series: no data, only for the legend colour swatches.\n                ...legendItems.map((name, i) => ({\n                    type: 'bar' as const,\n                    name,\n                    data: [] as number[],\n                    barWidth: '58%',\n                    itemStyle: { color: legendColors[i] },\n                })),\n                // Connector lines: gap-only horizontal segments between adjacent bars.\n                {\n                    type: 'custom' as const,\n                    name: '__connectors',\n                    silent: true,\n                    z: 5,\n                    data: connectorData,\n                    renderItem: (_params: any, api: any) => {\n                        const i = api.value(0);\n                        const y = api.value(1);\n                        const pThis = api.coord([i, y]);\n                        const pNext = api.coord([i + 1, y]);\n                        const half = (pNext[0] - pThis[0]) * (BAR_WIDTH_FRAC / 2);\n                        // Span from the current bar's left edge to the next bar's right\n                        // edge (offsets pushed outward), tracing the bar tops like the\n                        // Vega-Lite connector — not just the inter-bar gap.\n                        return {\n                            type: 'line',\n                            shape: {\n                                x1: pThis[0] - half,\n                                y1: pThis[1],\n                                x2: pNext[0] + half,\n                                y2: pNext[1],\n                            },\n                            style: { stroke: '#6b7280', lineWidth: 1, opacity: 0.7 },\n                        };\n                    },\n                },\n            ],\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Pyramid Chart — horizontal bar symmetric (mirror vegalite/templates/bar.ts pyramidChartDef).\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, getCategoryOrder } from './utils';\n\nfunction rowMatchesColorGroup(row: any, colorField: string, groupVal: unknown): boolean {\n    const raw = row[colorField];\n    if (raw === groupVal) return true;\n    if (raw == null || groupVal == null) return false;\n    return String(raw) === String(groupVal);\n}\n\nexport const ecPyramidChartDef: ChartTemplateDef = {\n    chart: 'Pyramid Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        if (!xField || !yField) return;\n\n        const yDiscrete = yCS?.type === 'nominal' || yCS?.type === 'ordinal';\n        const catField = yDiscrete ? yField : xField;\n        const valField = yDiscrete ? xField : yField;\n        const colorField = channelSemantics.color?.field ?? channelSemantics.group?.field;\n\n        const catChannel = yDiscrete ? 'y' : 'x';\n        const ordinalSort =\n            getCategoryOrder(ctx, catChannel)\n            ?? (yDiscrete ? yCS?.ordinalSortOrder : xCS?.ordinalSortOrder);\n        const categories = extractCategories(table, catField, ordinalSort);\n\n        const sumPerCategory = (predicate?: (row: any) => boolean): number[] => {\n            const valueMap = new Map<string, number>();\n            for (const row of table) {\n                if (predicate && !predicate(row)) continue;\n                const cat = String(row[catField] ?? '');\n                const v = row[valField];\n                if (v != null && !isNaN(Number(v))) {\n                    valueMap.set(cat, (valueMap.get(cat) ?? 0) + Number(v));\n                }\n            }\n            return categories.map(cat => valueMap.get(cat) ?? 0);\n        };\n\n        let leftPos: number[];\n        let rightPos: number[];\n        let leftName: string | undefined;\n        let rightName: string | undefined;\n\n        if (colorField && table.length > 0) {\n            const groups = [...new Set(table.map(r => r[colorField]))];\n            const leftGroup = groups[0];\n            const rightGroup = groups.length > 1 ? groups[1] : groups[0];\n            leftPos = sumPerCategory(row => rowMatchesColorGroup(row, colorField, leftGroup));\n            rightPos = sumPerCategory(row => rowMatchesColorGroup(row, colorField, rightGroup));\n            leftName = String(leftGroup);\n            rightName = String(rightGroup);\n\n            if (groups.length > 2) {\n                if (!spec._warnings) spec._warnings = [];\n                spec._warnings.push({\n                    severity: 'warning',\n                    code: 'too-many-groups-pyramid',\n                    message: `Pyramid chart works best with exactly 2 groups, but found ${groups.length} (${groups.map((g: string) => `'${g}'`).join(', ')}). Only the first two are shown.`,\n                    channel: 'color',\n                    field: colorField,\n                });\n            }\n        } else {\n            const values = sumPerCategory();\n            leftPos = values;\n            rightPos = values;\n        }\n\n        const leftData = leftPos.map(v => -v);\n        const rightData = rightPos;\n\n        const maxAbs = Math.max(0, ...leftData.map(Math.abs), ...rightData.map(Math.abs));\n\n        // Shared axis look — x (value) and y (category) match.\n        const axisLineStyle = { color: '#333', width: 1 };\n        const tickLineStyle = { color: '#333', width: 1 };\n        const labelFont = { fontSize: 11, color: '#333' };\n\n        const yAxisStyle = {\n            type: 'category' as const,\n            data: categories,\n            name: catField,\n            nameLocation: 'middle' as const,\n            nameGap: 40,\n            nameTextStyle: { fontSize: ctx.layout.titleFontSize, color: '#333' },\n            boundaryGap: true,\n            axisLine: { show: true, onZero: false, lineStyle: axisLineStyle },\n            axisTick: {\n                show: true,\n                alignWithLabel: true,\n                interval: 0,\n                length: 6,\n                lineStyle: tickLineStyle,\n            },\n            axisLabel: { ...labelFont },\n            splitLine: { show: false },\n        };\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\n            xAxis: {\n                type: 'value',\n                name: valField,\n                nameLocation: 'middle',\n                nameGap: 28,\n                nameTextStyle: { fontSize: ctx.layout.titleFontSize, color: '#333' },\n                axisLine: { show: true, lineStyle: axisLineStyle },\n                axisTick: { show: true, length: 6, lineStyle: tickLineStyle },\n                axisLabel: {\n                    ...labelFont,\n                    formatter: (v: number) => Math.abs(v).toString(),\n                },\n                splitLine: { show: false },\n                ...(maxAbs > 0 ? { min: -maxAbs, max: maxAbs } : {}),\n            },\n            yAxis: yAxisStyle,\n            series: [\n                {\n                    type: 'bar',\n                    name: leftName,\n                    data: leftData,\n                    barGap: '-100%',\n                },\n                {\n                    type: 'bar',\n                    name: rightName,\n                    data: rightData,\n                    barGap: '-100%',\n                },\n            ],\n        };\n\n        // Channel titles: positioned in ecApplyLayoutToSpec from grid geometry (equal offset from x=0).\n        if (leftName != null && rightName != null) {\n            option._pyramidChannelHeader = leftName === rightName\n                ? { mode: 'single' as const, text: leftName }\n                : { mode: 'pair' as const, left: leftName, right: rightName };\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Ranged Dot Plot — line segments + points (mirror vegalite/templates/scatter.ts rangedDotPlotDef).\n * Expects x (e.g. category), y (value); optional color. Renders as line + scatter.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, groupBy, getCategoryOrder } from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const ecRangedDotPlotDef: ChartTemplateDef = {\n    chart: 'Ranged Dot Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xField || !yField) return;\n\n        const xIsDiscrete = isDiscrete(channelSemantics.x?.type);\n        const yIsDiscrete = isDiscrete(channelSemantics.y?.type);\n        const xCategories = xIsDiscrete ? extractCategories(table, xField, channelSemantics.x?.ordinalSortOrder) : undefined;\n        const yCategories = yIsDiscrete ? extractCategories(table, yField, getCategoryOrder(ctx, 'y')) : undefined;\n        const yIndexMap = yCategories ? new Map(yCategories.map((c, i) => [c, i])) : null;\n\n        const option: any = {\n            tooltip: { trigger: 'item' },\n            xAxis: {\n                type: xIsDiscrete ? 'category' : 'value',\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                axisTick: xIsDiscrete ? { show: true, alignWithLabel: true } : { show: true },\n                ...(xCategories ? { data: xCategories } : {}),\n            },\n            yAxis: yIsDiscrete && yCategories\n                ? {\n                    type: 'category',\n                    data: yCategories,\n                    name: yField,\n                    nameLocation: 'middle',\n                    nameGap: 40,\n                    axisTick: { show: true, alignWithLabel: true },\n                    axisLabel: { rotate: 0 },\n                }\n                : { type: 'value', name: yField, nameLocation: 'middle', nameGap: 40, axisTick: { show: true } },\n            series: [],\n        };\n\n        const pointForRow = (r: any): [number, number] | [any, string] => {\n            if (yIndexMap != null) {\n                const yi = yIndexMap.get(String(r[yField] ?? ''));\n                if (yi === undefined) return [Number(r[xField]), 0];\n                return [Number(r[xField]), yi];\n            }\n            return [r[xField], r[yField]];\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            const colorCategories = [...groups.keys()];\n            option.legend = { data: colorCategories };\n            option._legendTitle = colorField;\n\n            // One line series: each y-category gets one segment from min(x) to max(x) (e.g. Min–Max per country). Use null between segments.\n            if (yCategories && yIndexMap) {\n                const segmentData: Array<[number, number] | null> = [];\n                for (let i = 0; i < yCategories.length; i++) {\n                    const yCat = yCategories[i];\n                    const rows = table.filter((r: any) => String(r[yField] ?? '') === yCat);\n                    if (xIsDiscrete && xCategories) {\n                        const indices = rows.map((r: any) => xCategories.indexOf(String(r[xField] ?? ''))).filter((idx: number) => idx >= 0);\n                        if (indices.length >= 1) {\n                            const minXi = Math.min(...indices);\n                            const maxXi = Math.max(...indices);\n                            segmentData.push([minXi, i], [maxXi, i], null);\n                        }\n                    } else {\n                        const vals = rows.map((r: any) => Number(r[xField])).filter((v: number) => isFinite(v));\n                        if (vals.length >= 1) {\n                            const minX = Math.min(...vals);\n                            const maxX = Math.max(...vals);\n                            segmentData.push([minX, i], [maxX, i], null);\n                        }\n                    }\n                }\n                if (segmentData.length > 0) {\n                    segmentData.pop(); // remove trailing null\n                    option.series.push({\n                        name: '', // no legend entry for connector line\n                        type: 'line',\n                        data: segmentData,\n                        showSymbol: false,\n                        itemStyle: { color: '#999' },\n                        lineStyle: { color: '#999' },\n                    });\n                }\n            }\n\n            for (const [name, rows] of groups) {\n                const scatterData = xIsDiscrete\n                    ? xCategories!.map((cat, xi) => {\n                        const row = rows.find((r: any) => String(r[xField]) === cat);\n                        if (!row) return null;\n                        return yIndexMap ? [xi, yIndexMap.get(String(row[yField] ?? '')) ?? 0] : [xi, row[yField]];\n                    }).filter(Boolean)\n                    : (yCategories && yIndexMap\n                        ? [...rows].sort((a, b) => (yIndexMap.get(String(a[yField])) ?? 0) - (yIndexMap.get(String(b[yField])) ?? 0)).map((r: any) => pointForRow(r))\n                        : rows.map((r: any) => [r[xField], r[yField]]));\n                option.series.push({\n                    name,\n                    type: 'scatter',\n                    data: scatterData,\n                    symbolSize: 8,\n                    // 颜色由 ecApplyLayoutToSpec 根据 colorDecisions 统一分配\n                });\n            }\n        } else {\n            const lineData = xIsDiscrete\n                ? xCategories!.map((cat, xi) => {\n                    const row = table.find((r: any) => String(r[xField]) === cat);\n                    if (!row) return null;\n                    return yIndexMap ? [xi, yIndexMap.get(String(row[yField] ?? '')) ?? 0] : [xi, row[yField]];\n                })\n                : (yCategories\n                    ? [...table].sort((a, b) => (yIndexMap!.get(String(a[yField])) ?? 0) - (yIndexMap!.get(String(b[yField])) ?? 0)).map((r: any) => pointForRow(r))\n                    : table.map((r: any) => [r[xField], r[yField]]));\n            const scatterData = xIsDiscrete\n                ? (yIndexMap ? lineData : xCategories!.map((cat, i) => [cat, (lineData as any[])[i]]))\n                : lineData;\n            option.series.push({ type: 'line', data: lineData, showSymbol: false });\n            option.series.push({ type: 'scatter', data: scatterData, symbolSize: 8 });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Density Plot — KDE area (align with vegalite/templates/density.ts).\n *\n * Why VL and EC specs differ:\n *   - Vega-Lite: spec keeps raw data + transform [{ density: field }]; the runtime computes\n *     kernel density (KDE) when rendering. Encoding uses transform outputs \"value\" and \"density\".\n *   - ECharts: no transform pipeline; we compute KDE here and put (value, density) points\n *     into series[].data. The spec therefore contains the derived curve, not the raw rows.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy } from './utils';\n\n/**\n * Bandwidth for KDE — match vega-statistics (bandwidth.js).\n * Scott/Silverman-style: 1.06 * v * n^(-0.2) with v = min(std, IQR/1.34).\n */\nfunction estimateBandwidth(values: number[]): number {\n    const n = values.length;\n    if (n < 2) return 1;\n    const sorted = [...values].sort((a, b) => a - b);\n    const mean = values.reduce((a, b) => a + b, 0) / n;\n    const variance = values.reduce((s, v) => s + (v - mean) ** 2, 0) / n;\n    const d = Math.sqrt(variance); // standard deviation\n    const q1 = sorted[Math.floor((n - 1) * 0.25)];\n    const q3 = sorted[Math.floor((n - 1) * 0.75)];\n    const iqr = (q3 != null && q1 != null) ? q3 - q1 : 0;\n    const h = iqr / 1.34;\n    const v = Math.min(d, h || d) || d || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n}\n\n/** One-dimensional Gaussian KDE over extent; formula matches vega-statistics kde.pdf. */\nfunction kde(values: number[], steps: number, bandwidthMultiplier: number, extent?: { min: number; max: number }): { x: number[]; y: number[] } {\n    if (values.length === 0) return { x: [], y: [] };\n    const min = extent ? extent.min : Math.min(...values);\n    const max = extent ? extent.max : Math.max(...values);\n    const range = max - min || 1;\n    const lo = min;\n    const hi = max;\n    const h = estimateBandwidth(values) * bandwidthMultiplier;\n    const n = values.length;\n\n    const x: number[] = [];\n    const y: number[] = [];\n    for (let i = 0; i <= steps; i++) {\n        const t = lo + (i / steps) * (hi - lo || range);\n        let sum = 0;\n        for (const v of values) {\n            const z = (t - v) / h;\n            sum += Math.exp(-0.5 * z * z);\n        }\n        const density = sum / (n * h * Math.sqrt(2 * Math.PI));\n        x.push(t);\n        y.push(density);\n    }\n    return { x, y };\n}\n\nexport const ecDensityPlotDef: ChartTemplateDef = {\n    chart: 'Density Plot',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xField) return;\n\n        const steps = 200; // match Vega density minsteps/maxsteps (default up to 200)\n        const bandwidthMultiplier = (chartProperties?.bandwidth != null && chartProperties.bandwidth > 0)\n            ? chartProperties.bandwidth\n            : 1;\n\n        const option: any = {\n            tooltip: { trigger: 'axis' },\n            xAxis: { type: 'value', name: xField, nameLocation: 'middle', nameGap: 30, axisTick: { show: true } },\n            yAxis: { type: 'value', name: 'Density', nameLocation: 'middle', nameGap: 40, axisTick: { show: true } },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: 'Density' };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            option.legend = { data: [...groups.keys()] };\n            option._legendTitle = colorField;\n            // Shared extent (like Vega's density with groupby) so all curves use the same x domain\n            const allValues = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            const sharedExtent = allValues.length > 0\n                ? { min: Math.min(...allValues), max: Math.max(...allValues) }\n                : undefined;\n            for (const [name, rows] of groups) {\n                const values = rows.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n                const { x, y } = kde(values, steps, bandwidthMultiplier, sharedExtent);\n                const data = x.map((xi, i) => [xi, y[i]]);\n                option.series.push({\n                    name,\n                    type: 'line',\n                    data,\n                    symbol: 'none',\n                    // 颜色由 color-decisions / option.color 驱动；这里只设置透明度。\n                    areaStyle: { opacity: 0.5 },\n                });\n            }\n        } else {\n            const values = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            const { x, y } = kde(values, steps, bandwidthMultiplier);\n            const data = x.map((xi, i) => [xi, y[i]]);\n            option.series.push({\n                type: 'line',\n                data,\n                symbol: 'none',\n                areaStyle: { opacity: 0.5 },\n            });\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'bandwidth', label: 'Bandwidth', type: 'continuous', min: 0.05, max: 2, step: 0.05, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts ECDF Plot (Empirical Cumulative Distribution Function) template.\n *\n * Align with vegalite/templates/ecdf.ts. ECharts has no transform pipeline, so\n * we precompute here: for each color/detail group, sort the numeric values\n * ascending and emit (value, cumulative-proportion) pairs using the \"≤ x\"\n * convention — each DISTINCT value maps to the proportion at its LAST occurrence\n * (ties collapsed). The series is a `line` with `step: 'end'` (= step-after: the\n * proportion holds until the next value, then jumps), drawn on a `value` x-axis;\n * the y-axis is pinned to [0, 1]. One series per group; the curve is\n * non-decreasing and reaches 1.0 at the largest value.\n *\n * Why VL and EC specs differ: VL keeps raw rows + a window transform that\n * computes the running proportion at render time; EC stores the derived step\n * curve directly in series[].data. Both produce the SAME monotonic step shape.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy } from './utils';\n\n/**\n * Sorted distinct (value, cumulative-proportion) pairs using the \"≤ x\"\n * convention. Ties collapse to the proportion at the value's last occurrence,\n * so the curve is strictly the empirical CDF and ends at 1.0.\n */\nfunction ecdfPairs(values: number[]): [number, number][] {\n    const sorted = values.filter(v => Number.isFinite(v)).sort((a, b) => a - b);\n    const n = sorted.length;\n    const pairs: [number, number][] = [];\n    if (n === 0) return pairs;\n    let i = 0;\n    while (i < n) {\n        let j = i;\n        while (j + 1 < n && sorted[j + 1] === sorted[i]) j++;\n        // Last occurrence index (0-based) = j → count(≤ value) = j + 1.\n        pairs.push([sorted[i], (j + 1) / n]);\n        i = j + 1;\n    }\n    return pairs;\n}\n\nexport const ecEcdfPlotDef: ChartTemplateDef = {\n    chart: 'ECDF Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        // One ECDF per group: prefer color, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField) return;\n\n        const showPoints = !!chartProperties?.showPoints;\n\n        const option: any = {\n            tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } },\n            xAxis: {\n                type: 'value',\n                name: xField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                // Fit the measure range (an ECDF reads the value of the rise, not\n                // distance from zero).\n                scale: true,\n                axisTick: { show: true },\n            },\n            yAxis: {\n                type: 'value',\n                name: 'Cumulative proportion',\n                nameLocation: 'middle',\n                nameGap: 45,\n                min: 0,\n                max: 1,\n                axisTick: { show: true },\n            },\n            series: [],\n        };\n        option._encodingTooltip = { trigger: 'axis', categoryLabel: xField, valueLabel: 'Cumulative proportion' };\n\n        const makeSeries = (name: string | undefined, values: number[]) => ({\n            ...(name != null ? { name } : {}),\n            type: 'line' as const,\n            // step-after: hold the proportion until the next value, then jump.\n            step: 'end' as const,\n            data: ecdfPairs(values),\n            showSymbol: showPoints,\n            symbol: 'circle' as const,\n            symbolSize: 6,\n            lineStyle: { width: 2 },\n            emphasis: { focus: 'series' as const },\n        });\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            option.legend = { data: [...groups.keys()] };\n            option._legendTitle = groupField;\n            for (const [name, rows] of groups) {\n                const values = rows.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n                option.series.push(makeSeries(name, values));\n            }\n        } else {\n            const values = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            option.series.push(makeSeries(undefined, values));\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Calendar Heatmap template.\n *\n * Contrast with VL:\n *   VL: has no first-class calendar; would fake it with rect + computed\n *       week/day fields.\n *   EC: a `calendar` coordinate system + a `heatmap` series bound to it\n *       (coordinateSystem: 'calendar'), plus a continuous `visualMap`.\n *\n * Encoding:\n *   x     (temporal) → the date of each cell\n *   color (quantitative) → the cell value (defaults to a count of 1)\n */\n\nimport { ChartTemplateDef, EncodingActionDef } from '../../core/types';\nimport { getPaletteForScheme } from '../colormap';\n\n/** Sequential color ramps (low → high). Mirrors heatmap's scheme vocabulary. */\nconst SCHEME_COLORS: Record<string, string[]> = {\n    viridis: ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],\n    blues: ['#f7fbff', '#6baed6', '#08519c'],\n    greens: ['#f7fcf5', '#74c476', '#00441b'],\n    reds: ['#fff5f0', '#fb6a4a', '#a50f15'],\n    oranges: ['#fff5eb', '#fd8d3c', '#7f2704'],\n    purples: ['#fcfbfd', '#9e9ac8', '#3f007d'],\n    github: ['#ebedf0', '#9be9a8', '#40c463', '#30a14e', '#216e39'],\n};\n\n/** Coerce a raw cell key into a 'YYYY-MM-DD' string, regardless of upstream temporal conversion. */\nfunction toDateString(raw: unknown): string | null {\n    if (raw == null) return null;\n    let d: Date;\n    if (raw instanceof Date) {\n        d = raw;\n    } else if (typeof raw === 'number' && isFinite(raw)) {\n        // Treat as epoch (ms if large, seconds otherwise).\n        d = new Date(raw < 1e12 ? raw * 1000 : raw);\n    } else {\n        const s = String(raw).trim();\n        d = new Date(s);\n        if (isNaN(d.getTime())) return null;\n    }\n    if (isNaN(d.getTime())) return null;\n    // Use UTC components so the labelled day matches the source date.\n    const y = d.getUTCFullYear();\n    const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n    const day = String(d.getUTCDate()).padStart(2, '0');\n    return `${y}-${m}-${day}`;\n}\n\nexport const ecCalendarHeatmapDef: ChartTemplateDef = {\n    chart: 'Calendar Heatmap',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['x', 'color'],\n    markCognitiveChannel: 'color',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, colorDecisions, encodings } = ctx;\n        const dateField = channelSemantics.x?.field;\n        const valueField = channelSemantics.color?.field;\n        if (!dateField) return;\n\n        // Aggregate to one value per calendar day (sum when multiple rows share a date).\n        const cellMap = new Map<string, number>();\n        for (const row of table) {\n            const dateStr = toDateString(row[dateField]);\n            if (!dateStr) continue;\n            const val = valueField ? (Number(row[valueField]) || 0) : 1;\n            cellMap.set(dateStr, (cellMap.get(dateStr) ?? 0) + val);\n        }\n\n        const calData: [string, number][] = [];\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n        let minDate = '9999-12-31';\n        let maxDate = '0000-01-01';\n        for (const [dateStr, val] of cellMap) {\n            calData.push([dateStr, val]);\n            if (val < minVal) minVal = val;\n            if (val > maxVal) maxVal = val;\n            if (dateStr < minDate) minDate = dateStr;\n            if (dateStr > maxDate) maxDate = dateStr;\n        }\n        if (calData.length === 0) return;\n        if (minVal === Infinity) minVal = 0;\n        if (maxVal === -Infinity) maxVal = 1;\n        if (minVal === maxVal) maxVal = minVal + 1;\n\n        // ── Layout: weeks span the X axis, weekdays the Y axis ───────────────\n        const dayMs = 86400000;\n        const spanDays = (Date.parse(maxDate) - Date.parse(minDate)) / dayMs;\n        const weeks = Math.max(1, Math.ceil((spanDays + 8) / 7));\n        // Shrink cells when the range is long so the canvas stays reasonable.\n        const cell = weeks > 60 ? 12 : weeks > 30 ? 15 : 18;\n        const calLeft = 44;   // room for weekday labels\n        const calRight = 16;\n        const calTop = 34;    // room for the month-label row\n        // Bottom band for the continuous visualMap. In the gallery `calculable`\n        // is on, so the colour bar also draws value labels + drag handles above\n        // it; reserve enough height that none of it rides up into the last\n        // weekday row of the calendar.\n        const vmHeight = 70;\n        const gridH = 7 * cell;\n\n        const canvasW = calLeft + weeks * cell + calRight;\n        const canvasH = calTop + gridH + vmHeight;\n\n        // ── Color scheme ─────────────────────────────────────────────────────\n        const encScheme = encodings?.color?.scheme;\n        const userScheme = (encScheme && encScheme !== 'default') ? encScheme : undefined;\n        const schemeName = userScheme || 'viridis';\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let schemeColors: string[] = SCHEME_COLORS[schemeName] || SCHEME_COLORS.viridis;\n        if (decision?.schemeId) {\n            const fromDecision = getPaletteForScheme(decision.schemeId);\n            if (fromDecision && fromDecision.length > 0) schemeColors = fromDecision;\n        }\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (params: any) => {\n                    const [date, val] = params.value;\n                    return `${date}<br/>${valueField ?? 'Count'}: ${val}`;\n                },\n            },\n            visualMap: {\n                type: 'continuous',\n                min: minVal,\n                max: maxVal,\n                calculable: true,\n                orient: 'horizontal',\n                left: 'center',\n                bottom: 6,\n                itemWidth: 12,\n                itemHeight: 100,\n                text: ['high', 'low'],\n                inRange: { color: schemeColors },\n            },\n            calendar: {\n                top: calTop,\n                left: calLeft,\n                right: calRight,\n                cellSize: [cell, cell],\n                range: minDate === maxDate ? minDate : [minDate, maxDate],\n                orient: 'horizontal',\n                splitLine: { show: true, lineStyle: { color: '#ccc', width: 1 } },\n                itemStyle: { borderWidth: 1, borderColor: '#fff', color: '#f4f4f4' },\n                yearLabel: { show: false },\n                dayLabel: { firstDay: 1, fontSize: 10, color: '#666' },\n                monthLabel: { fontSize: 11, color: '#333' },\n            },\n            series: [{\n                type: 'heatmap',\n                coordinateSystem: 'calendar',\n                data: calData,\n            }],\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    encodingActions: [\n        {\n            key: 'colorScheme',\n            label: 'Scheme',\n            isApplicable: (ctx) => !!ctx.encodings.color?.field,\n            dependencies: ['color'],\n            control: {\n                type: 'discrete', options: [\n                    { value: undefined, label: 'Default (Viridis)' },\n                    { value: 'viridis', label: 'Viridis' },\n                    { value: 'github', label: 'GitHub' },\n                    { value: 'blues', label: 'Blues' },\n                    { value: 'greens', label: 'Greens' },\n                    { value: 'reds', label: 'Reds' },\n                    { value: 'oranges', label: 'Oranges' },\n                    { value: 'purples', label: 'Purples' },\n                ],\n            },\n            get: (enc) => enc.color?.scheme,\n            set: (enc, value) => ({ ...enc, color: { ...enc.color, scheme: value } }),\n        },\n    ] as EncodingActionDef[],\n};\n","// Chart.js 专用调色板定义。\n// 承接 core/color-decisions.ts 中的抽象 colormap 信息（schemeType / schemeId / categoryCount），\n// 但真正的颜色数组与选盘策略完全在 Chart.js backend 本地实现，并尽量贴近 Chart.js 默认配色。\n\nimport type { ColorDecision, ColorMapType } from '../core/color-decisions';\n\nexport type ChartJsPaletteId = 'cat10' | 'cat20' | 'viridis' | 'RdBu' | string;\n\nexport interface ChartJsColorMapDef {\n    id: ChartJsPaletteId;\n    type: ColorMapType;\n    supportsDiscrete: boolean;\n    supportsContinuous: boolean;\n    background: 'light' | 'dark' | 'any';\n    colorblindSafe?: boolean;\n    maxCategories?: number;\n    diverging?: boolean;\n    preferredMidpoint?: number;\n    colors: string[]; // 使用 Chart.js 推荐的基础色（不含 alpha）\n}\n\n/**\n * Chart.js 常用的基础配色，基于官方文档中推荐的默认颜色集合：\n * https://www.chartjs.org/docs/latest/general/colors.html\n */\nconst CHARTJS_COLOR_MAPS: ChartJsColorMapDef[] = [\n    {\n        id: 'cat10',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'any',\n        maxCategories: 10,\n        colorblindSafe: false,\n        colors: [\n            '#36a2eb', // blue\n            '#ff6384', // red\n            '#ffcd56', // yellow\n            '#4bc0c0', // teal\n            '#9966ff', // purple\n            '#ff9f40', // orange\n            '#2ecc71', // green\n            '#34495e', // dark blue-grey\n            '#e74c3c', // red-orange\n            '#95a5a6', // grey\n        ],\n    },\n    {\n        id: 'cat20',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'any',\n        maxCategories: 20,\n        colorblindSafe: false,\n        colors: [\n            '#36a2eb', '#9ad0f5',\n            '#ff6384', '#ff99aa',\n            '#ffcd56', '#ffe39f',\n            '#4bc0c0', '#8fdede',\n            '#9966ff', '#c3a3ff',\n            '#ff9f40', '#ffc078',\n            '#2ecc71', '#7ee2a8',\n            '#34495e', '#5d6d7e',\n            '#e74c3c', '#f1948a',\n            '#95a5a6', '#cfd4d6',\n        ],\n    },\n    {\n        id: 'viridis',\n        type: 'sequential',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        colorblindSafe: true,\n        colors: [\n            '#440154', '#46327e', '#365c8d', '#277f8e',\n            '#1fa187', '#4ac16d', '#a0da39', '#fde725',\n        ],\n    },\n    {\n        id: 'RdBu',\n        type: 'diverging',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        diverging: true,\n        preferredMidpoint: 0,\n        colors: [\n            '#b2182b', '#d6604d', '#f4a582', '#fddbc7',\n            '#f7f7f7',\n            '#d1e5f0', '#92c5de', '#4393c3', '#2166ac',\n        ],\n    },\n];\n\nfunction getMapById(id: ChartJsPaletteId | undefined): ChartJsColorMapDef | undefined {\n    if (!id) return undefined;\n    const key = String(id).toLowerCase();\n    return CHARTJS_COLOR_MAPS.find(m => m.id.toLowerCase() === key);\n}\n\nexport function getPaletteForScheme(id: ChartJsPaletteId): string[] | undefined {\n    const entry = getMapById(id);\n    return entry?.colors;\n}\n\n/**\n * Chart.js 侧的「选盘」函数：等价于 backend 版 pickColorMap。\n *\n * 输入：\n *   - ColorDecision：来自 core/color-decisions（已算好 schemeType / categoryCount / schemeId）。\n *\n * 策略：\n *   1）若用户显式指定了 schemeId，则优先按该 id 取 palette。\n *   2）否则根据 schemeType + categoryCount 自动挑选合适的盘：\n *        - categorical：按类别数量在 cat10 / cat20 之间选；\n *        - sequential：优先 viridis；\n *        - diverging ：优先 RdBu。\n *   3）若都无法命中，回退到符合 Chart.js 习惯的默认 categorical palette（cat10）。\n */\nexport function pickChartJsPalette(decision: ColorDecision | undefined): string[] {\n    if (!decision) {\n        const fallback = getPaletteForScheme('cat10');\n        return fallback && fallback.length ? fallback : [];\n    }\n\n    const { schemeType, schemeId, categoryCount } = decision;\n\n    // 1. 显式 schemeId 优先。\n    if (schemeId) {\n        const fromId = getPaletteForScheme(schemeId);\n        if (fromId && fromId.length > 0) {\n            return fromId;\n        }\n    }\n\n    // 2. 自动路径：根据类型 / 类别数挑选本 backend 推荐盘。\n    const mapsOfType = CHARTJS_COLOR_MAPS.filter(m => m.type === schemeType);\n\n    if (schemeType === 'categorical') {\n        const k = categoryCount ?? 0;\n        if (mapsOfType.length) {\n            const candidates = mapsOfType.filter(m => m.supportsDiscrete);\n            if (candidates.length) {\n                const byCapacity = candidates\n                    .filter(m => m.maxCategories == null || m.maxCategories >= k)\n                    .sort((a, b) => (a.maxCategories ?? Infinity) - (b.maxCategories ?? Infinity));\n                const picked = byCapacity[0] ?? candidates[0];\n                if (picked.colors.length) {\n                    return picked.colors;\n                }\n            }\n        }\n        const fallback = getPaletteForScheme('cat10');\n        if (fallback && fallback.length) {\n            return fallback;\n        }\n    } else if (schemeType === 'sequential') {\n        const seq = mapsOfType.find(m => m.supportsContinuous) ?? getMapById('viridis');\n        if (seq && seq.colors.length) {\n            return seq.colors;\n        }\n    } else if (schemeType === 'diverging') {\n        const divergingFirst = mapsOfType.find(m => m.diverging) ?? getMapById('RdBu');\n        if (divergingFirst && divergingFirst.colors.length) {\n            return divergingFirst.colors;\n        }\n    }\n\n    // 3. 兜底：Chart.js 默认 categorical palette（cat10）。\n    const fallback = getPaletteForScheme('cat10');\n    return fallback && fallback.length ? fallback : [];\n}\n\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Shared helper functions for Chart.js template hooks.\n * Pure logic — no UI dependencies.\n */\n\nimport type { ChannelSemantics, InstantiateContext } from '../../core/types';\nimport { pickChartJsPalette } from '../colormap';\n\n// ---------------------------------------------------------------------------\n// Discrete-dimension helpers\n// ---------------------------------------------------------------------------\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/**\n * Get the number of unique non-null values for a field in the data table.\n */\nexport function getFieldCardinality(field: string, table: any[]): number {\n    return new Set(table.map((r: any) => r[field]).filter((v: any) => v != null)).size;\n}\n\n// ---------------------------------------------------------------------------\n// Chart.js-specific helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract unique category values from data for a given field, preserving order.\n * If `ordinalSortOrder` is provided, returns values sorted in that canonical order.\n */\nexport function extractCategories(data: any[], field: string, ordinalSortOrder?: string[]): string[] {\n    const seen = new Set<string>();\n    const result: string[] = [];\n    for (const row of data) {\n        const val = row[field];\n        if (val != null) {\n            const key = String(val);\n            if (!seen.has(key)) {\n                seen.add(key);\n                result.push(key);\n            }\n        }\n    }\n\n    if (ordinalSortOrder && ordinalSortOrder.length > 0) {\n        const orderMap = new Map(ordinalSortOrder.map((v, i) => [v, i]));\n        result.sort((a, b) => {\n            const ia = orderMap.get(a);\n            const ib = orderMap.get(b);\n            if (ia !== undefined && ib !== undefined) return ia - ib;\n            if (ia !== undefined) return -1;\n            if (ib !== undefined) return 1;\n            return 0;\n        });\n    }\n\n    return result;\n}\n\n/**\n * Resolve the display order of a categorical axis, honoring either a canonical\n * `ordinalSortOrder` or a sort-by-measure request (`sortBy` + `sortOrder` from\n * the shared Sort encoding action).\n */\nexport function resolveCategoryOrder(\n    data: any[],\n    catField: string,\n    opts?: { ordinalSortOrder?: string[]; sortBy?: string; sortOrder?: 'ascending' | 'descending' },\n): string[] {\n    const base = extractCategories(data, catField, opts?.ordinalSortOrder);\n    if (!opts?.sortBy) return base;\n    const agg = new Map<string, number>();\n    for (const row of data) {\n        const cat = String(row[catField] ?? '');\n        const v = Number(row[opts.sortBy]);\n        if (Number.isFinite(v)) agg.set(cat, (agg.get(cat) ?? 0) + v);\n    }\n    const dir = opts.sortOrder === 'ascending' ? 1 : -1;\n    return [...base].sort((a, b) => dir * ((agg.get(a) ?? 0) - (agg.get(b) ?? 0)));\n}\n\n/**\n * Group data by a categorical field.\n * Returns a map: seriesName → rows[].\n */\nexport function groupBy(data: any[], field: string): Map<string, any[]> {\n    const groups = new Map<string, any[]>();\n    for (const row of data) {\n        const key = String(row[field] ?? '');\n        if (!groups.has(key)) groups.set(key, []);\n        groups.get(key)!.push(row);\n    }\n    return groups;\n}\n\n/**\n * Chart.js `linear` scale requires numeric `x` in `{x,y}` points. ISO strings\n * (from temporal conversion) become NaN and nothing renders. Map to Unix ms.\n * Seconds (e.g. ≤1e12) are treated as Unix seconds and multiplied by 1000.\n */\nexport function coerceUnixMsForChartJs(raw: unknown): number {\n    if (raw == null) return NaN;\n    if (typeof raw === 'number' && Number.isFinite(raw)) {\n        return raw < 1e12 ? Math.round(raw * 1000) : raw;\n    }\n    if (raw instanceof Date) {\n        const t = raw.getTime();\n        return Number.isFinite(t) ? t : NaN;\n    }\n    const t = new Date(String(raw)).getTime();\n    return Number.isFinite(t) ? t : NaN;\n}\n\n/**\n * Default Chart.js color palette (RGBA with alpha for fill).\n */\nexport const DEFAULT_COLORS = [\n    'rgba(54, 162, 235, 1)',    // blue\n    'rgba(255, 99, 132, 1)',    // red\n    'rgba(255, 206, 86, 1)',    // yellow\n    'rgba(75, 192, 192, 1)',    // teal\n    'rgba(153, 102, 255, 1)',   // purple\n    'rgba(255, 159, 64, 1)',    // orange\n    'rgba(46, 204, 113, 1)',    // green\n    'rgba(52, 73, 94, 1)',      // dark blue-grey\n    'rgba(231, 76, 60, 1)',     // red-orange\n    'rgba(149, 165, 166, 1)',   // grey\n];\n\nexport const DEFAULT_BG_COLORS = [\n    'rgba(54, 162, 235, 0.6)',\n    'rgba(255, 99, 132, 0.6)',\n    'rgba(255, 206, 86, 0.6)',\n    'rgba(75, 192, 192, 0.6)',\n    'rgba(153, 102, 255, 0.6)',\n    'rgba(255, 159, 64, 0.6)',\n    'rgba(46, 204, 113, 0.6)',\n    'rgba(52, 73, 94, 0.6)',\n    'rgba(231, 76, 60, 0.6)',\n    'rgba(149, 165, 166, 0.6)',\n];\n\n// ---------------------------------------------------------------------------\n// Color-decisions integration\n// ---------------------------------------------------------------------------\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n    const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n    if (!m) return null;\n    const intVal = parseInt(m[1], 16);\n    return {\n        r: (intVal >> 16) & 255,\n        g: (intVal >> 8) & 255,\n        b: intVal & 255,\n    };\n}\n\nfunction rgbaFromHex(hex: string, alpha: number): string {\n    const rgb = hexToRgb(hex);\n    if (!rgb) return hex;\n    const a = Math.max(0, Math.min(1, alpha));\n    return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${a})`;\n}\n\nfunction applyAlphaToColor(color: string, alpha: number): string {\n    const a = Math.max(0, Math.min(1, alpha));\n    if (color.startsWith('#')) {\n        return rgbaFromHex(color, a);\n    }\n    if (color.startsWith('rgba')) {\n        return color.replace(\n            /rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([\\d.]+)\\)/,\n            (_m, r, g, b) => `rgba(${r}, ${g}, ${b}, ${a})`,\n        );\n    }\n    if (color.startsWith('rgb(')) {\n        return color.replace(\n            /rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/,\n            (_m, r, g, b) => `rgba(${r}, ${g}, ${b}, ${a})`,\n        );\n    }\n    return color;\n}\n\n/**\n * 从 color-decisions 解析调色板；若没有决策则回退到 Chart.js 默认 cat10。\n */\nexport function getChartJsPalette(ctx: InstantiateContext, preferred: 'color' | 'group' = 'color'): string[] {\n    const decisions = ctx.colorDecisions;\n    const decision =\n        preferred === 'color'\n            ? decisions?.color ?? decisions?.group\n            : decisions?.group ?? decisions?.color;\n\n    const palette = pickChartJsPalette(decision);\n    if (palette.length > 0) {\n        return palette;\n    }\n    return DEFAULT_COLORS;\n}\n\n/**\n * 取得第 i 个系列的描边色（优先使用统一调色板）。\n */\nexport function getSeriesBorderColor(palette: string[], index: number): string {\n    if (!palette.length) {\n        return DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n    }\n    return palette[index % palette.length];\n}\n\n/**\n * 取得第 i 个系列的填充色，自动按需要设置透明度。\n */\nexport function getSeriesBackgroundColor(palette: string[], index: number, alpha = 0.6): string {\n    const border = getSeriesBorderColor(palette, index);\n    return applyAlphaToColor(border, alpha);\n}\n\n/**\n * Detect which axis is the category (banded) axis and which is the value axis.\n */\nexport function detectAxes(\n    channelSemantics: Record<string, ChannelSemantics>,\n): { categoryAxis: 'x' | 'y'; valueAxis: 'x' | 'y' } {\n    const xCS = channelSemantics.x;\n    const yCS = channelSemantics.y;\n\n    if (xCS && isDiscrete(xCS.type)) {\n        return { categoryAxis: 'x', valueAxis: 'y' };\n    }\n    if (yCS && isDiscrete(yCS.type)) {\n        return { categoryAxis: 'y', valueAxis: 'x' };\n    }\n    return { categoryAxis: 'x', valueAxis: 'y' };\n}\n\n/**\n * Build category-aligned data array for a subset of rows.\n * Returns values indexed by category position (null for missing).\n */\nexport function buildCategoryAlignedData(\n    rows: any[],\n    xField: string,\n    yField: string,\n    categories: string[],\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const key = String(row[xField] ?? '');\n        const val = row[yField];\n        if (val != null && !isNaN(val)) {\n            map.set(key, (map.get(key) ?? 0) + Number(val));\n        }\n    }\n    return categories.map(cat => map.get(cat) ?? null);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Parallel Coordinates template.\n *\n * Contrast with VL:\n *   VL: no first-class parallel coordinates; would require folding many\n *       quantitative fields into a long format + custom layering.\n *   EC: a `parallel` coordinate system with one `parallelAxis` per numeric\n *       dimension and a `series` of type 'parallel'. Optionally grouped (and\n *       coloured) by a categorical field via the `color` channel.\n *\n * Dimensions: every numeric field in the data (excluding the color field),\n * unless the host passes an explicit `chartProperties.dimensions` order.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { getChartJsPalette } from '../../chartjs/templates/utils';\n\nconst DEFAULT_COLORS = [\n    '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n    '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc', '#c0504d',\n];\n\n/** Numeric-ness test: a field is a dimension if (nearly) all non-null values parse as numbers. */\nfunction isNumericField(table: any[], field: string): boolean {\n    let total = 0;\n    let numeric = 0;\n    for (const row of table) {\n        const v = row[field];\n        if (v == null || v === '') continue;\n        total++;\n        if (typeof v === 'number' ? isFinite(v) : !isNaN(Number(v))) numeric++;\n    }\n    return total > 0 && numeric / total >= 0.9;\n}\n\n/**\n * Round a [min, max] data extent outward to tidy bounds (multiples of a\n * 1/2/5×10ⁿ step) so axis labels are clean and always contain the data.\n */\nfunction niceBounds(min: number, max: number): [number, number] | null {\n    if (!isFinite(min) || !isFinite(max)) return null;\n    if (min === max) {\n        const pad = Math.abs(min) > 1e-9 ? Math.abs(min) * 0.1 : 1;\n        return [min - pad, max + pad];\n    }\n    const rawStep = (max - min) / 5;\n    const mag = Math.pow(10, Math.floor(Math.log10(rawStep)));\n    const norm = rawStep / mag;\n    const step = (norm < 1.5 ? 1 : norm < 3 ? 2 : norm < 7 ? 5 : 10) * mag;\n    return [Math.floor(min / step) * step, Math.ceil(max / step) * step];\n}\n\nexport const ecParallelCoordinatesDef: ChartTemplateDef = {\n    chart: 'Parallel Coordinates',\n    template: { mark: 'line', encoding: {} },\n    channels: ['color', 'detail'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        if (table.length === 0) return;\n\n        const colorField = channelSemantics.color?.field;\n\n        // Resolve the ordered list of numeric dimensions.\n        let dims: string[] = Array.isArray(chartProperties?.dimensions)\n            ? chartProperties!.dimensions.filter((d: string) => d in table[0])\n            : [];\n        if (dims.length === 0) {\n            dims = Object.keys(table[0]).filter(\n                (k) => k !== colorField && isNumericField(table, k),\n            );\n        }\n        if (dims.length < 2) return;\n\n        const palette = colorField ? getChartJsPalette(ctx, 'color') : DEFAULT_COLORS;\n        const colors = palette.length > 0 ? palette : DEFAULT_COLORS;\n\n        const parallelAxis = dims.map((name, i) => {\n            // Derive each axis range from every row. ECharts otherwise infers a\n            // parallelAxis extent from only the first series, which clips lines\n            // from later groups above the top label.\n            let lo = Infinity;\n            let hi = -Infinity;\n            for (const row of table) {\n                const v = Number(row[name]);\n                if (isFinite(v)) {\n                    if (v < lo) lo = v;\n                    if (v > hi) hi = v;\n                }\n            }\n            const bounds = niceBounds(lo, hi);\n            return {\n                dim: i,\n                name,\n                nameTextStyle: { fontSize: ctx.layout.titleFontSize },\n                nameGap: 8,\n                axisLabel: { fontSize: 10 },\n                ...(bounds ? { min: bounds[0], max: bounds[1] } : {}),\n            };\n        });\n\n        const toLine = (row: any) => dims.map((d) => {\n            const v = Number(row[d]);\n            return isFinite(v) ? v : null;\n        });\n\n        const series: any[] = [];\n        const legendData: string[] = [];\n        // Thinner, more transparent lines as the dataset grows (avoid a hairball).\n        const lineOpacity = table.length > 200 ? 0.22 : table.length > 100 ? 0.3 : table.length > 60 ? 0.45 : 0.6;\n\n        if (colorField) {\n            const groups = new Map<string, any[]>();\n            for (const row of table) {\n                const key = String(row[colorField] ?? '');\n                if (!groups.has(key)) groups.set(key, []);\n                groups.get(key)!.push(toLine(row));\n            }\n            let i = 0;\n            for (const [name, data] of groups) {\n                legendData.push(name);\n                series.push({\n                    name,\n                    type: 'parallel',\n                    data,\n                    lineStyle: { width: 1.5, opacity: lineOpacity, color: colors[i % colors.length] },\n                    emphasis: { lineStyle: { width: 3, opacity: 0.9 } },\n                });\n                i++;\n            }\n        } else {\n            series.push({\n                type: 'parallel',\n                data: table.map(toLine),\n                lineStyle: { width: 1.5, opacity: lineOpacity, color: colors[0] },\n                emphasis: { lineStyle: { width: 3, opacity: 0.9 } },\n            });\n        }\n\n        const hasLegend = legendData.length > 1;\n\n        // ── Layout: one column band per dimension ────────────────────────────\n        const parTop = hasLegend ? 56 : 28;\n        const parBottom = 36;\n        const parLeft = 56;   // room for the first axis labels\n        const parRight = 56;  // room for the last axis name\n        const perDim = 96;    // horizontal band per dimension\n        const canvasW = Math.max(ctx.canvasSize.width, parLeft + parRight + (dims.length - 1) * perDim);\n        const canvasH = Math.max(ctx.canvasSize.height, parTop + parBottom + 200);\n\n        const option: any = {\n            tooltip: {},\n            parallelAxis,\n            parallel: {\n                top: parTop,\n                bottom: parBottom,\n                left: parLeft,\n                right: parRight,\n                parallelAxisDefault: {\n                    nameLocation: 'end',\n                    nameGap: 14,\n                    axisLine: { lineStyle: { color: '#888' } },\n                    axisLabel: { color: '#555' },\n                },\n            },\n            series,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        if (hasLegend) {\n            option.legend = {\n                data: legendData,\n                top: 8,\n                left: 'center',\n                orient: 'horizontal',\n                itemWidth: 18,\n                textStyle: { fontSize: ctx.layout.legendFontSize },\n                ...(legendData.length > 10 ? { type: 'scroll' } : {}),\n            };\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Graph (Network) template.\n *\n * Unique to ECharts — no Vega-Lite equivalent.\n * Renders relationship/edge-list data as a node-link network. Node size\n * encodes degree (number of connections), so hubs stand out.\n *\n * Data model (each row = one edge):\n *   x    (nominal): source node name\n *   y    (nominal): target node name\n *   size (quantitative, optional): edge weight (defaults to 1)\n *\n * Nodes are derived from the union of source/target values. Parallel edges\n * (same source→target pair) are aggregated (summed weight).\n *\n * Layout defaults to `circular` so the render is deterministic (no force\n * simulation needed to settle); a `force` layout is available as a property.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nexport const ecGraphDef: ChartTemplateDef = {\n    chart: 'Network Graph',\n    template: { mark: 'point', encoding: {} },\n    channels: ['x', 'y', 'size'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const sourceField = channelSemantics.x?.field;\n        const targetField = channelSemantics.y?.field;\n        const weightField = channelSemantics.size?.field;\n        if (!sourceField || !targetField) return;\n\n        // Aggregate parallel edges and accumulate per-node degree (weighted).\n        const linkAgg = new Map<string, number>();\n        const degree = new Map<string, number>();\n        for (const row of table) {\n            const src = String(row[sourceField] ?? '');\n            const tgt = String(row[targetField] ?? '');\n            if (!src || !tgt || src === tgt) continue;\n            const w = weightField ? (Number(row[weightField]) || 0) : 1;\n            const key = `${src}\\x00${tgt}`;\n            linkAgg.set(key, (linkAgg.get(key) ?? 0) + w);\n            degree.set(src, (degree.get(src) ?? 0) + w);\n            degree.set(tgt, (degree.get(tgt) ?? 0) + w);\n        }\n\n        const links: { source: string; target: string; value: number }[] = [];\n        const nodeSet = new Set<string>();\n        for (const [key, value] of linkAgg) {\n            const [source, target] = key.split('\\x00');\n            nodeSet.add(source);\n            nodeSet.add(target);\n            links.push({ source, target, value });\n        }\n        if (links.length === 0) return;\n\n        const nodeArr = [...nodeSet];\n\n        // ── Palette ───────────────────────────────────────────────────────\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) palette = fromRegistry;\n        }\n        if (!palette || palette.length === 0) {\n            palette = getPaletteForScheme(nodeArr.length > 10 ? 'cat20' : 'cat10') ?? DEFAULT_COLORS;\n        }\n\n        // ── Node sizing: area-proportional to degree ─────────────────────────\n        const degVals = nodeArr.map((n) => degree.get(n) ?? 0);\n        const dMin = Math.min(...degVals);\n        const dMax = Math.max(...degVals);\n        const rMin = 12, rMax = 46;\n        const sizeFor = (d: number) => {\n            if (dMax === dMin) return (rMin + rMax) / 2;\n            const t = (d - dMin) / (dMax - dMin);\n            // Interpolate area, then convert back to a diameter.\n            const area = rMin * rMin + t * (rMax * rMax - rMin * rMin);\n            return Math.sqrt(area);\n        };\n\n        const nodes = nodeArr.map((name, i) => ({\n            name,\n            value: degree.get(name) ?? 0,\n            symbolSize: sizeFor(degree.get(name) ?? 0),\n            itemStyle: { color: palette![i % palette!.length] },\n        }));\n\n        // ── Edge widths scaled to weight ─────────────────────────────────────\n        const wVals = links.map((l) => l.value);\n        const wMin = Math.min(...wVals);\n        const wMax = Math.max(...wVals);\n        const widthFor = (v: number) => {\n            if (wMax === wMin) return 1.4;\n            return 0.8 + ((v - wMin) / (wMax - wMin)) * 3.2;\n        };\n\n        const layout = chartProperties?.layout === 'force' ? 'force' : 'circular';\n\n        // Square canvas; grow with node count. Extra padding leaves room for the\n        // radial node labels so they don't clip at the canvas edge.\n        const side = Math.max(420, Math.min(860, Math.round(Math.sqrt(nodeArr.length) * 155) + 40));\n        const pad = 64;\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (params: any) => {\n                    if (params.dataType === 'edge') {\n                        return `${params.data.source} → ${params.data.target}<br/>Weight: ${params.data.value}`;\n                    }\n                    return `${params.name}<br/>Degree: ${params.value}`;\n                },\n            },\n            series: [{\n                type: 'graph',\n                layout,\n                data: nodes,\n                links: links.map((l) => ({ ...l, lineStyle: { width: widthFor(l.value) } })),\n                roam: false,\n                label: {\n                    show: true,\n                    position: 'right',\n                    fontSize: 11,\n                    color: '#333',\n                },\n                lineStyle: {\n                    color: 'source',\n                    opacity: 0.5,\n                    curveness: layout === 'circular' ? 0.3 : 0,\n                },\n                emphasis: {\n                    focus: 'adjacency',\n                    lineStyle: { width: 4 },\n                },\n                circular: { rotateLabel: true },\n                force: { repulsion: 180, edgeLength: [50, 130], gravity: 0.08 },\n                left: pad,\n                right: pad,\n                top: pad,\n                bottom: pad,\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: side,\n            _height: side,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'layout', label: 'Layout', type: 'discrete', options: [\n                { value: 'circular', label: 'Circular (default)' },\n                { value: 'force', label: 'Force-directed' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Tree template.\n *\n * Unique to ECharts — no Vega-Lite equivalent.\n * Renders a hierarchy as an orthogonal node-link tree (dendrogram). Good for\n * showing parent → child structure where containment/area (treemap) or radial\n * nesting (sunburst) would obscure the branching itself.\n *\n * Data model:\n *   color  (nominal): first-level category (root's children)\n *   detail (nominal, optional): second-level category (leaves)\n *   size   (quantitative, optional): leaf value (defaults to a count)\n *\n * color only            → two levels: root → categories.\n * color + detail        → three levels: root → categories → sub-categories.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, DEFAULT_COLORS } from './utils';\nimport { getPaletteForScheme } from '../colormap';\n\nexport const ecTreeDef: ChartTemplateDef = {\n    chart: 'Tree',\n    template: { mark: 'point', encoding: {} },\n    channels: ['color', 'detail', 'size'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const catField = channelSemantics.color?.field;\n        const subCatField = channelSemantics.detail?.field;\n        const valField = channelSemantics.size?.field;\n        if (!catField) return;\n\n        const categories = extractCategories(table, catField, channelSemantics.color?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        // ── Palette ───────────────────────────────────────────────────────\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        let palette: string[] | undefined;\n        if (decision?.schemeId) {\n            const fromRegistry = getPaletteForScheme(decision.schemeId);\n            if (fromRegistry && fromRegistry.length > 0) palette = fromRegistry;\n        }\n        if (!palette || palette.length === 0) {\n            palette = getPaletteForScheme(categories.length > 10 ? 'cat20' : 'cat10') ?? DEFAULT_COLORS;\n        }\n\n        // ── Build the hierarchy ───────────────────────────────────────────\n        let leafCount = 0;\n        const children = categories.map((cat, catIdx) => {\n            const catRows = table.filter((r) => String(r[catField]) === cat);\n            const color = palette![catIdx % palette!.length];\n            if (subCatField) {\n                const subCats = extractCategories(catRows, subCatField);\n                const subChildren = subCats.map((sub) => {\n                    const subRows = catRows.filter((r) => String(r[subCatField]) === sub);\n                    const value = valField\n                        ? subRows.reduce((s, r) => s + (Number(r[valField]) || 0), 0)\n                        : subRows.length;\n                    leafCount++;\n                    return { name: sub, value, lineStyle: { color }, itemStyle: { color } };\n                });\n                return { name: cat, children: subChildren, lineStyle: { color }, itemStyle: { color } };\n            }\n            const value = valField\n                ? catRows.reduce((s, r) => s + (Number(r[valField]) || 0), 0)\n                : catRows.length;\n            leafCount++;\n            return { name: cat, value, lineStyle: { color }, itemStyle: { color } };\n        });\n\n        const rootName = chartProperties?.rootLabel ?? 'All';\n        const treeData = [{ name: rootName, children }];\n\n        const depth = subCatField ? 3 : 2;\n        const orient = chartProperties?.orient === 'TB' ? 'TB' : 'LR';\n\n        // ── Layout: depth drives width (LR), leaf count drives height ─────────\n        const canvasW = Math.max(ctx.canvasSize.width, 340 + (depth - 1) * 210);\n        const canvasH = Math.max(ctx.canvasSize.height, Math.min(1400, Math.max(300, leafCount * 26)));\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                triggerOn: 'mousemove',\n                formatter: (params: any) => {\n                    const v = params.value;\n                    return v != null && v !== ''\n                        ? `${params.name}<br/>Value: ${v}`\n                        : params.name;\n                },\n            },\n            series: [{\n                type: 'tree',\n                data: treeData,\n                layout: 'orthogonal',\n                orient,\n                top: 24,\n                bottom: 24,\n                left: orient === 'LR' ? 40 : 24,\n                right: orient === 'LR' ? 140 : 24,\n                symbol: 'circle',\n                symbolSize: 8,\n                initialTreeDepth: -1,\n                expandAndCollapse: false,\n                roam: false,\n                lineStyle: { width: 1.2, curveness: 0.5, color: '#bbb' },\n                label: {\n                    show: true,\n                    position: orient === 'LR' ? 'left' : 'top',\n                    verticalAlign: 'middle',\n                    align: orient === 'LR' ? 'right' : 'center',\n                    fontSize: 11,\n                    color: '#333',\n                },\n                leaves: {\n                    label: {\n                        position: orient === 'LR' ? 'right' : 'bottom',\n                        verticalAlign: 'middle',\n                        align: orient === 'LR' ? 'left' : 'center',\n                    },\n                },\n                emphasis: { focus: 'descendant' },\n            }],\n            color: palette ?? DEFAULT_COLORS,\n            _width: canvasW,\n            _height: canvasH,\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'orient', label: 'Orient', type: 'discrete', options: [\n                { value: 'LR', label: 'Left → Right (default)' },\n                { value: 'TB', label: 'Top → Bottom' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Gantt Chart — one horizontal bar per task, spanning [start, end]\n * (mirror vegalite/templates/gantt.ts).\n *\n * Channels:\n *   - y      task / activity label (banded category axis)\n *   - x      start of the interval (temporal or quantitative)\n *   - x2     end of the interval (shares x's scale)\n *   - color  optional grouping (phase, owner, resource)\n *\n * ECharts has no native interval-bar mark, so the bar is floated using the same\n * transparent-base + visible-delta stack the waterfall uses: a silent\n * transparent bar carries the start offset and the colored bar carries the\n * duration (end − start). Tasks are sorted by start so the timeline reads\n * chronologically top-to-bottom (the category axis is inverted so index 0 sits\n * at the top). Temporal intervals are positioned on a value axis of epoch\n * milliseconds with a date-formatting axis label.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    coerceGanttEndpoint,\n    formatGanttLabel,\n    ganttLabelReservePx,\n    GANTT_PROPERTIES,\n    isGanttTemporal,\n    sortGanttRows,\n} from '../../chart-types/gantt';\nimport { DEFAULT_COLORS } from './utils';\n\n/** Format an epoch-ms value as a compact ISO date (YYYY-MM-DD). */\nfunction fmtDate(ms: number): string {\n    if (!Number.isFinite(ms)) return '';\n    return new Date(ms).toISOString().slice(0, 10);\n}\n\nexport const ecGanttChartDef: ChartTemplateDef = {\n    chart: 'Gantt Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'x2', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, semanticTypes } = ctx;\n        const taskField = channelSemantics.y?.field;\n        const startField = channelSemantics.x?.field;\n        const endField = channelSemantics.x2?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!taskField || !startField || !endField || table.length === 0) return;\n\n        const temporal = isGanttTemporal(channelSemantics.x?.type, semanticTypes[startField]);\n\n        // One row per task, sorted by start ascending so the timeline reads\n        // chronologically. The y-axis is inverted below, so the earliest task,\n        // first in this list, ends up at the top.\n        const rows = sortGanttRows(table\n            .map((r: any, inputIndex: number) => ({\n                task: String(r[taskField] ?? ''),\n                start: coerceGanttEndpoint(r[startField], temporal),\n                end: coerceGanttEndpoint(r[endField], temporal),\n                group: colorField != null ? String(r[colorField] ?? '') : undefined,\n                inputIndex,\n            }))\n            .filter((r) => r.task && Number.isFinite(r.start) && Number.isFinite(r.end)));\n        const taskHeight = chartProperties?.taskHeight ?? 70;\n        const cornerRadius = chartProperties?.cornerRadius ?? 2;\n        const intervalLabels = chartProperties?.intervalLabels === true;\n        const labelReserve = ganttLabelReservePx(rows, temporal);\n\n        const tasks = rows.map((r) => r.task);\n\n        // Color groups → palette.\n        const groups = colorField\n            ? Array.from(new Set(rows.map((r) => r.group ?? '')))\n            : [];\n        const groupColor = new Map<string, string>();\n        groups.forEach((g, i) => groupColor.set(g, DEFAULT_COLORS[i % DEFAULT_COLORS.length]));\n        const BAR_COLOR = DEFAULT_COLORS[0];\n\n        const baseData = rows.map((r) => r.start);\n        const durationData = rows.map((r) => ({\n            value: r.end - r.start,\n            itemStyle: { color: colorField ? (groupColor.get(r.group ?? '') ?? BAR_COLOR) : BAR_COLOR },\n        }));\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (p: any) => {\n                    if (p.seriesName === '_base') return '';\n                    const r = rows[p.dataIndex];\n                    if (!r) return '';\n                    const s = temporal ? fmtDate(r.start) : r.start;\n                    const e = temporal ? fmtDate(r.end) : r.end;\n                    const grp = r.group != null ? `<br/>${colorField}: ${r.group}` : '';\n                    return `${r.task}<br/>${startField}: ${s}<br/>${endField}: ${e}${grp}`;\n                },\n            },\n            grid: {\n                containLabel: true,\n                ...(intervalLabels ? { right: labelReserve } : {}),\n            },\n            xAxis: {\n                type: 'value',\n                scale: true,\n                name: temporal ? '' : startField,\n                nameLocation: 'middle',\n                nameGap: 30,\n                axisLabel: temporal\n                    ? { formatter: (v: number) => fmtDate(v), hideOverlap: true }\n                    : {},\n            },\n            yAxis: {\n                type: 'category',\n                data: tasks,\n                inverse: true,\n                axisTick: { show: false },\n                axisLabel: { interval: 0 },\n            },\n            series: [\n                {\n                    type: 'bar',\n                    name: '_base',\n                    stack: 'gantt',\n                    data: baseData,\n                    itemStyle: { color: 'transparent' },\n                    silent: true,\n                    emphasis: { disabled: true },\n                    barWidth: `${taskHeight}%`,\n                },\n                {\n                    type: 'bar',\n                    name: 'Task',\n                    stack: 'gantt',\n                    data: durationData,\n                    barWidth: `${taskHeight}%`,\n                    itemStyle: { borderRadius: cornerRadius },\n                    label: {\n                        show: intervalLabels,\n                        position: 'right',\n                        formatter: (p: any) => {\n                            const row = rows[p.dataIndex];\n                            return row ? formatGanttLabel(row.start, row.end, temporal) : '';\n                        },\n                    },\n                },\n            ],\n        };\n\n        // Color legend: one swatch per group, rendered as data-less bar series\n        // sharing the stack so ECharts reserves no extra bar slot for them.\n        if (colorField && groups.length > 1) {\n            option.legend = { data: groups, top: 0 };\n            option._legendTitle = colorField;\n            for (const g of groups) {\n                option.series.push({\n                    type: 'bar',\n                    name: g,\n                    stack: 'gantt',\n                    data: [],\n                    barWidth: `${taskHeight}%`,\n                    itemStyle: { color: groupColor.get(g) },\n                });\n            }\n            option.grid.top = 40;\n        }\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: GANTT_PROPERTIES,\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Bullet Chart — one row per label: a measure bar against its own\n * target, set on muted gray qualitative bands (mirror vegalite/templates/bullet.ts).\n *\n * Channels:\n *   - y      label (banded category axis — one row per KPI)\n *   - x      measured value (bar from a zero baseline)\n *   - goal   target / comparative value (a dark tick across the bar)\n *   - color  optional explicit grouping for the value bar\n *\n * Following Stephen Few's design, each row carries graduated gray bands at\n * quarters of its own goal (0–25 / 25–50 / 50–75%); the 75–100% range is left\n * white so the bar and target tick stay focal. The bands are wide stacked bars;\n * the narrower value bar is overlaid concentrically (`barGap: '-100%'`) and\n * colored by goal attainment; the target is a tall thin rect marker.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, getCategoryOrder } from './utils';\n\n// Muted grays for the qualitative zones, darkest nearest zero (poorest range).\nconst ZONE_GRAYS = ['#e2e2e2', '#ececec', '#f5f5f5'];\n// Goal-attainment colors: muted red for under target, muted green for met.\nconst STATUS_COLORS = { below: '#c44e52', met: '#2f855a' };\nconst STATUS_BELOW = 'Below target';\nconst STATUS_MET = 'Meets target';\n\nexport const ecBulletChartDef: ChartTemplateDef = {\n    chart: 'Bullet Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'goal', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const labelField = channelSemantics.y?.field;\n        const valueField = channelSemantics.x?.field;\n        const goalField = channelSemantics.goal?.field;\n        if (!labelField || !valueField || table.length === 0) return;\n\n        const categories = extractCategories(\n            table, labelField, getCategoryOrder(ctx, 'y') ?? channelSemantics.y?.ordinalSortOrder,\n        );\n\n        const byCat = new Map<string, any>();\n        for (const r of table) byCat.set(String(r[labelField] ?? ''), r);\n\n        const valueOf = (cat: string) => Number(byCat.get(cat)?.[valueField]);\n        const goalOf = (cat: string) =>\n            goalField != null ? Number(byCat.get(cat)?.[goalField]) : NaN;\n\n        // Per-row gray band widths (each a quarter of that row's goal).\n        const band1: number[] = [];\n        const band2: number[] = [];\n        const band3: number[] = [];\n        for (const cat of categories) {\n            const g = goalOf(cat);\n            const q = Number.isFinite(g) && g > 0 ? g / 4 : 0;\n            band1.push(q);\n            band2.push(q);\n            band3.push(q);\n        }\n\n        // Value bar, colored per row by goal attainment.\n        const valueData = categories.map((cat) => {\n            const v = valueOf(cat);\n            const g = goalOf(cat);\n            const met = Number.isFinite(g) ? v >= g : true;\n            return {\n                value: Number.isFinite(v) ? v : 0,\n                itemStyle: { color: met ? STATUS_COLORS.met : STATUS_COLORS.below },\n            };\n        });\n\n        // Target tick: a tall thin rect at the goal, sized to the row band.\n        const band = ctx.layout?.yStep;\n        const tickH = band && band > 0 ? Math.min(band, Math.max(8, Math.round(band * 0.72))) : 18;\n        const goalData = goalField\n            ? categories\n                .map((cat) => ({ value: [goalOf(cat), cat] }))\n                .filter((d) => Number.isFinite(d.value[0] as number))\n            : [];\n\n        const bandSeries = [band1, band2, band3].map((data, i) => ({\n            type: 'bar' as const,\n            name: `_band${i}`,\n            stack: 'bullet-bands',\n            data,\n            barWidth: '62%',\n            itemStyle: { color: ZONE_GRAYS[i] },\n            silent: true,\n            emphasis: { disabled: true },\n            z: 1,\n        }));\n\n        const option: any = {\n            tooltip: {\n                trigger: 'item',\n                formatter: (p: any) => {\n                    if (typeof p.seriesName === 'string' && p.seriesName.startsWith('_')) return '';\n                    const cat = categories[p.dataIndex] ?? '';\n                    const v = valueOf(cat);\n                    const g = goalOf(cat);\n                    const goalLine = Number.isFinite(g) ? `<br/>${goalField}: ${g}` : '';\n                    return `${cat}<br/>${valueField}: ${v}${goalLine}`;\n                },\n            },\n            legend: goalField ? { data: [STATUS_BELOW, STATUS_MET], top: 0 } : undefined,\n            grid: { containLabel: true, top: goalField ? 40 : 20 },\n            xAxis: {\n                type: 'value',\n                min: 0,\n                name: valueField,\n                nameLocation: 'middle',\n                nameGap: 30,\n            },\n            yAxis: {\n                type: 'category',\n                data: categories,\n                inverse: true,\n                axisTick: { show: false },\n                axisLabel: { interval: 0 },\n            },\n            series: [\n                ...bandSeries,\n                {\n                    type: 'bar',\n                    name: 'value',\n                    data: valueData,\n                    barWidth: '34%',\n                    barGap: '-100%',\n                    z: 2,\n                },\n                {\n                    type: 'scatter',\n                    name: 'target',\n                    data: goalData,\n                    symbol: 'rect',\n                    symbolSize: [4, tickH],\n                    itemStyle: { color: '#1a1a1a' },\n                    z: 4,\n                    silent: true,\n                },\n                // Legend-only series for the status colors (no bar slots).\n                ...(goalField\n                    ? [\n                        { type: 'scatter' as const, name: STATUS_BELOW, data: [], itemStyle: { color: STATUS_COLORS.below } },\n                        { type: 'scatter' as const, name: STATUS_MET, data: [], itemStyle: { color: STATUS_COLORS.met } },\n                    ]\n                    : []),\n            ],\n        };\n\n        Object.assign(spec, option);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts template registry.\n *\n * Mirrors the structure of vegalite/templates/index.ts but with ECharts\n * template definitions.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { ecScatterPlotDef, ecRegressionDef } from './scatter';\nimport { ecConnectedScatterDef } from './connected-scatter';\nimport { ecBarChartDef, ecStackedBarChartDef, ecGroupedBarChartDef } from './bar';\nimport { ecLineChartDef, ecBumpChartDef } from './line';\nimport { ecSlopeChartDef } from './slope';\nimport { ecAreaChartDef } from './area';\nimport { ecRangeAreaChartDef } from './range-area';\nimport { ecPieChartDef } from './pie';\nimport { ecHeatmapDef } from './heatmap';\nimport { ecHistogramDef } from './histogram';\nimport { ecBoxplotDef } from './boxplot';\nimport { ecRadarChartDef } from './radar';\nimport { ecCandlestickDef } from './candlestick';\nimport { ecStreamgraphDef } from './streamgraph';\nimport { ecRoseChartDef } from './rose';\nimport { ecGaugeChartDef } from './gauge';\nimport { ecFunnelChartDef } from './funnel';\nimport { ecTreemapDef } from './treemap';\nimport { ecSunburstDef } from './sunburst';\nimport { ecSankeyDef } from './sankey';\nimport { ecLollipopChartDef } from './lollipop';\nimport { ecStripPlotDef } from './jitter';\nimport { ecWaterfallChartDef } from './waterfall';\nimport { ecPyramidChartDef } from './pyramid';\nimport { ecRangedDotPlotDef } from './ranged-dot';\nimport { ecDensityPlotDef } from './density';\nimport { ecEcdfPlotDef } from './ecdf';\nimport { ecCalendarHeatmapDef } from './calendar';\nimport { ecParallelCoordinatesDef } from './parallel';\nimport { ecGraphDef } from './graph';\nimport { ecTreeDef } from './tree';\nimport { ecGanttChartDef } from './gantt';\nimport { ecBulletChartDef } from './bullet';\n\n/**\n * ECharts chart template definitions, grouped by category.\n * Mirrors vegalite/templates/index.ts so VegaLite test cases can run through ECharts.\n */\nexport const ecTemplateDefs: { [key: string]: ChartTemplateDef[] } = {\n    'Scatter & Point': [ecScatterPlotDef, ecRegressionDef, ecConnectedScatterDef, ecRangedDotPlotDef, ecBoxplotDef, ecStripPlotDef],\n    'Bar':             [ecBarChartDef, ecGroupedBarChartDef, ecStackedBarChartDef, ecLollipopChartDef, ecPyramidChartDef, ecHeatmapDef, ecCalendarHeatmapDef],\n    'Line & Area':     [ecLineChartDef, ecBumpChartDef, ecSlopeChartDef, ecAreaChartDef, ecStreamgraphDef, ecRangeAreaChartDef],\n    'Part-to-Whole':   [ecPieChartDef, ecFunnelChartDef, ecTreemapDef, ecSunburstDef, ecTreeDef],\n    'Statistical':     [ecHistogramDef, ecDensityPlotDef, ecEcdfPlotDef, ecParallelCoordinatesDef],\n    'Financial':       [ecCandlestickDef],\n    'Other':           [ecWaterfallChartDef, ecGanttChartDef, ecBulletChartDef],\n    'Polar':           [ecRadarChartDef, ecRoseChartDef],\n    'Indicator':       [ecGaugeChartDef],\n    'Flow':            [ecSankeyDef, ecGraphDef],\n};\n\n/**\n * Flat list of all ECharts chart template definitions.\n */\nexport const ecAllTemplateDefs: ChartTemplateDef[] = Object.values(ecTemplateDefs).flat();\n\n/**\n * Look up an ECharts chart template definition by chart type name.\n */\nexport function ecGetTemplateDef(chartType: string): ChartTemplateDef | undefined {\n    return ecAllTemplateDefs.find(t => t.chart === chartType);\n}\n\n/**\n * Get the available channels for an ECharts chart type.\n */\nexport function ecGetTemplateChannels(chartType: string): string[] {\n    return ecGetTemplateDef(chartType)?.channels || [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts Facet Support — Multi-grid layout for column/row channels.\n *\n * ECharts has no native faceting like VL's column/row encodings.\n * This module transforms per-panel single-grid options into one\n * combined multi-grid option:\n *\n *   - grid[]     one positioned grid per facet panel\n *   - xAxis[]    per-grid, labels only on bottom-row panels\n *   - yAxis[]    per-grid, labels only on left-column panels\n *   - series[]   assigned to grids via xAxisIndex/yAxisIndex\n *   - graphic[]  column/row facet header text labels\n *\n * Only axis-based charts (bar, scatter, line, area, etc.) are supported.\n * Pie, radar, and themeRiver charts use different positioning and cannot\n * be faceted with multi-grid.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FacetConfig {\n    colField?: string;\n    rowField?: string;\n    /** When true, each visual row shows its own column-header row.\n     *  Set by the assembler when column-only facets are wrapped. */\n    colHeaderPerRow?: boolean;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/** True if panels are radar charts (use radar component, not grid/xAxis/yAxis). */\nfunction isRadarFacet(ref: any): boolean {\n    return !!(\n        ref?.radar &&\n        Array.isArray(ref.series) &&\n        ref.series.length > 0 &&\n        ref.series[0]?.type === 'radar'\n    );\n}\n\n/** True if panels are polar charts (Rose: polar + angleAxis + radiusAxis, series coordinateSystem 'polar'). */\nfunction isPolarFacet(ref: any): boolean {\n    return !!(\n        ref?.polar &&\n        ref?.angleAxis &&\n        Array.isArray(ref.series) &&\n        ref.series.length > 0 &&\n        ref.series[0]?.coordinateSystem === 'polar'\n    );\n}\n\n/**\n * Combine faceted radar panels: one radar component per cell, series use radarIndex.\n */\nfunction combineRadarFacetPanels(panels: any[][], config: FacetConfig): any {\n    const nRows = panels.length;\n    const nCols = Math.max(1, ...panels.map(r => r.length));\n    const ref = panels[0]?.[0];\n    if (!ref?.radar) return {};\n\n    const plotW = ref._plotWidth || ref._width || 400;\n    const plotH = ref._plotHeight || ref._height || 300;\n    const GAP = 6;\n    const COL_HEADER_H = config.colField ? 18 : 0;\n    const ROW_HEADER_W = config.rowField ? 18 : 0;\n    const colHeaderPerRow = config.colHeaderPerRow ?? false;\n    const PAD = 4;\n    const baseLeft = ROW_HEADER_W;\n    const col0W = PAD + plotW + PAD;\n    const colInnerW = PAD + plotW + PAD;\n    const rowInnerH = PAD + plotH + PAD;\n    const totalW = baseLeft + col0W + (nCols > 1 ? (nCols - 1) * (colInnerW + GAP) : 0);\n    const totalH = (colHeaderPerRow ? 0 : COL_HEADER_H)\n        + (nRows > 1 ? (nRows - 1) * (rowInnerH + GAP) : 0)\n        + rowInnerH;\n\n    const combined: any = {\n        radar: [],\n        series: [],\n        _width: totalW,\n        _height: totalH,\n    };\n    if (ref.tooltip) combined.tooltip = { ...ref.tooltip };\n    if (ref.color) combined.color = ref.color;\n    if (ref.legend) combined.legend = { ...ref.legend };\n\n    const radarRadiusRatio = 0.38;\n    const headerFontSize = 11;\n    const hStyle = {\n        fontSize: headerFontSize, fontWeight: 'bold' as const, fill: '#555',\n        textAlign: 'center' as const, textVerticalAlign: 'middle' as const\n    };\n    const graphics: any[] = [];\n\n    let radarIdx = 0;\n    for (let ri = 0; ri < nRows; ri++) {\n        for (let ci = 0; ci < nCols; ci++) {\n            const panel = panels[ri]?.[ci];\n            if (!panel) continue;\n\n            const cx = baseLeft + (ci === 0 ? 0 : col0W + GAP + (ci - 1) * (colInnerW + GAP));\n            const cy = colHeaderPerRow\n                ? ri * (rowInnerH + GAP) + COL_HEADER_H\n                : COL_HEADER_H + ri * (rowInnerH + GAP);\n            const left = cx + PAD;\n            const top = cy + PAD;\n            const width = plotW;\n            const height = plotH;\n            const centerX = left + width / 2;\n            const centerY = top + height / 2;\n            const radius = Math.min(width, height) * radarRadiusRatio;\n\n            combined.radar.push({\n                ...ref.radar,\n                indicator: ref.radar.indicator,\n                shape: ref.radar.shape,\n                center: [centerX, centerY],\n                radius,\n                axisName: ref.radar.axisName ?? { fontSize: 11 },\n            });\n\n            if (Array.isArray(panel.series)) {\n                for (const s of panel.series) {\n                    combined.series.push({ ...s, radarIndex: radarIdx });\n                }\n            }\n\n            if (config.colField && panel._colHeader && (colHeaderPerRow || ri === 0)) {\n                graphics.push({\n                    type: 'text',\n                    left: centerX,\n                    top: top - COL_HEADER_H / 2,\n                    style: { ...hStyle, text: String(panel._colHeader) },\n                });\n            }\n            if (config.rowField && ci === 0 && panel._rowHeader) {\n                graphics.push({\n                    type: 'text',\n                    left: ROW_HEADER_W / 2,\n                    top: centerY,\n                    style: { ...hStyle, text: String(panel._rowHeader) },\n                    rotation: Math.PI / 2,\n                });\n            }\n            radarIdx++;\n        }\n    }\n    if (graphics.length > 0) combined.graphic = graphics;\n    return combined;\n}\n\n/** Polar (Rose) radius as fraction of cell min dimension. */\nconst POLAR_RADIUS_RATIO = 0.38;\n\n/**\n * Combine faceted polar (Rose) panels: one polar + angleAxis + radiusAxis per cell, series use polarIndex.\n */\nfunction combinePolarFacetPanels(panels: any[][], config: FacetConfig): any {\n    const nRows = panels.length;\n    const nCols = Math.max(1, ...panels.map(r => r.length));\n    const ref = panels[0]?.[0];\n    if (!ref?.polar || !ref?.angleAxis) return {};\n\n    const plotW = ref._plotWidth || ref._width || 400;\n    const plotH = ref._plotHeight || ref._height || 300;\n    const GAP = 14;\n    const COL_HEADER_H = config.colField ? 18 : 0;\n    const ROW_HEADER_W = config.rowField ? 18 : 0;\n    const colHeaderPerRow = config.colHeaderPerRow ?? false;\n    const PAD = 4;\n    const baseLeft = ROW_HEADER_W;\n    const col0W = PAD + plotW + PAD;\n    const colInnerW = PAD + plotW + PAD;\n    const rowInnerH = PAD + plotH + PAD;\n    const totalW = baseLeft + col0W + (nCols > 1 ? (nCols - 1) * (colInnerW + GAP) : 0);\n    const totalH = (colHeaderPerRow ? 0 : COL_HEADER_H)\n        + (nRows > 1 ? (nRows - 1) * (rowInnerH + GAP) : 0)\n        + rowInnerH;\n\n    const combined: any = {\n        polar: [],\n        angleAxis: [],\n        radiusAxis: [],\n        series: [],\n        _width: totalW,\n        _height: totalH,\n    };\n    if (ref.tooltip) combined.tooltip = { ...ref.tooltip };\n    if (ref.color) combined.color = ref.color;\n    if (ref.legend) combined.legend = { ...ref.legend };\n\n    const headerFontSize = 11;\n    const hStyle = {\n        fontSize: headerFontSize, fontWeight: 'bold' as const, fill: '#555',\n        textAlign: 'center' as const, textVerticalAlign: 'middle' as const\n    };\n    const graphics: any[] = [];\n\n    let polarIdx = 0;\n    for (let ri = 0; ri < nRows; ri++) {\n        for (let ci = 0; ci < nCols; ci++) {\n            const panel = panels[ri]?.[ci];\n            if (!panel) continue;\n\n            const cx = baseLeft + (ci === 0 ? 0 : col0W + GAP + (ci - 1) * (colInnerW + GAP));\n            const cy = colHeaderPerRow\n                ? ri * (rowInnerH + GAP) + COL_HEADER_H\n                : COL_HEADER_H + ri * (rowInnerH + GAP);\n            const left = cx + PAD;\n            const top = cy + PAD;\n            const width = plotW;\n            const height = plotH;\n            const centerX = left + width / 2;\n            const centerY = top + height / 2;\n            const radius = Math.min(width, height) * POLAR_RADIUS_RATIO;\n\n            combined.polar.push({\n                center: [centerX, centerY],\n                radius,\n            });\n\n            combined.angleAxis.push({\n                ...ref.angleAxis,\n                polarIndex: polarIdx,\n            });\n            combined.radiusAxis.push({\n                ...(ref.radiusAxis || {}),\n                polarIndex: polarIdx,\n            });\n\n            if (Array.isArray(panel.series)) {\n                for (const s of panel.series) {\n                    // Only polar coordinateSystem belongs to this polarIndex (e.g. rose legend-bridge pie has none).\n                    if (s && s.coordinateSystem === 'polar') {\n                        combined.series.push({ ...s, polarIndex: polarIdx });\n                    } else {\n                        combined.series.push({ ...s });\n                    }\n                }\n            }\n\n            if (config.colField && panel._colHeader && (colHeaderPerRow || ri === 0)) {\n                graphics.push({\n                    type: 'text',\n                    left: centerX,\n                    top: top - COL_HEADER_H / 2,\n                    style: { ...hStyle, text: String(panel._colHeader) },\n                });\n            }\n            if (config.rowField && ci === 0 && panel._rowHeader) {\n                graphics.push({\n                    type: 'text',\n                    left: ROW_HEADER_W / 2,\n                    top: centerY,\n                    style: { ...hStyle, text: String(panel._rowHeader) },\n                    rotation: Math.PI / 2,\n                });\n            }\n            polarIdx++;\n        }\n    }\n    if (graphics.length > 0) combined.graphic = graphics;\n    repositionFacetedPolarLegend(combined);\n    return combined;\n}\n\n/**\n * Combine per-panel single-grid ECharts options into a multi-grid faceted layout.\n *\n * The assembler is responsible for wrapping column-only facets into a proper\n * 2D panels array before calling this function.  Each panel may carry\n * `_colHeader` / `_rowHeader` strings for facet header labels.\n *\n * For radar charts, uses multiple radar components (one per panel) and radarIndex\n * instead of grid/xAxis/yAxis.\n *\n * @param panels  2D array `panels[rowIdx][colIdx]` of single-panel ECharts options.\n *                Each panel is a complete option with xAxis, yAxis, grid, series, etc.\n * @param config  Facet field names and layout hints.\n * @returns       Combined ECharts option with multi-grid layout.\n */\nexport function ecCombineFacetPanels(\n    panels: any[][],\n    config: FacetConfig,\n): any {\n    const nRows = panels.length;\n    const nCols = Math.max(1, ...panels.map(r => r.length));\n    const ref = panels[0]?.[0];\n    if (!ref) return {};\n\n    if (isRadarFacet(ref)) {\n        return combineRadarFacetPanels(panels, config);\n    }\n    if (isPolarFacet(ref)) {\n        return combinePolarFacetPanels(panels, config);\n    }\n\n    // ── Plot-area dimensions (extracted by assembler) ─────────────────────\n    const plotW = ref._plotWidth || ref._width || 200;\n    const plotH = ref._plotHeight || ref._height || 150;\n\n    // ── Simple spacing constants ─────────────────────────────────────────\n    const GAP = 6;                                        // between panels\n    const COL_HEADER_H = config.colField ? 18 : 0;       // facet column headers\n    const ROW_HEADER_W = config.rowField ? 18 : 0;       // facet row headers\n    const colHeaderPerRow = config.colHeaderPerRow ?? false;\n\n    const refX = ref.xAxis || {};\n    const refY = ref.yAxis || {};\n    const hasYTitle = !!(refY.name);\n\n    // Shared axis titles — rendered once as graphic elements\n    const sharedXTitle = refX.name || '';\n    const sharedYTitle = (config.rowField && hasYTitle) ? (refY.name || '') : '';\n    const SHARED_X_H = sharedXTitle ? 18 : 0;\n    const SHARED_Y_W = sharedYTitle ? 18 : 0;\n\n    // ── Uniform cell size ────────────────────────────────────────────────\n    // ── Facet-specific margins ─────────────────────────────────────────\n    // The assembler's refGrid margins include CANVAS_BUFFER (16px) meant\n    // for standalone charts.  In a faceted layout the grids are internal\n    // elements — no buffer needed. Use tighter margins based on content.\n    const mLeft = hasYTitle && !sharedYTitle ? 55 : 35;  // y-axis labels (+ title if not shared)\n    const mBottom = 22;                                     // x-axis labels\n    const PAD = 4;                                          // minimal padding for inner panels\n\n    // Cell widths differ: first column includes y-axis label margin,\n    // inner columns use minimal padding.  Row heights differ: only the\n    // bottom row reserves mBottom for x-axis labels.\n    const col0W = mLeft + plotW + PAD;\n    const colInnerW = PAD + plotW + PAD;\n    const rowInnerH = PAD + plotH + PAD;       // non-bottom rows: compact\n    const rowBottomH = PAD + plotH + mBottom;  // bottom row: x-axis labels\n\n    // ── Overall dimensions ───────────────────────────────────────────────\n    const baseLeft = SHARED_Y_W + ROW_HEADER_W;\n    const innerRowBlock = colHeaderPerRow ? COL_HEADER_H + rowInnerH : rowInnerH;\n    const bottomRowBlock = colHeaderPerRow ? COL_HEADER_H + rowBottomH : rowBottomH;\n    const totalW = baseLeft + col0W + (nCols > 1 ? (nCols - 1) * (colInnerW + GAP) : 0);\n    const totalH = (colHeaderPerRow ? 0 : COL_HEADER_H)\n        + (nRows > 1 ? (nRows - 1) * (innerRowBlock + GAP) : 0)\n        + bottomRowBlock\n        + SHARED_X_H;\n\n    // ── Combined option ──────────────────────────────────────────────────\n    const combined: any = {\n        grid: [], xAxis: [], yAxis: [], series: [],\n        _width: totalW, _height: totalH,\n    };\n    if (ref.tooltip) combined.tooltip = { ...ref.tooltip };\n    if (ref.color) combined.color = ref.color;\n    if (ref.legend) combined.legend = { ...ref.legend };\n\n    const fontSize = Math.max(8, Math.round(10 * Math.min(1, plotW / 200)));\n    const headerFontSize = Math.max(9, Math.round(11 * Math.min(1, plotW / 200)));\n\n    // ── Place grids & axes ───────────────────────────────────────────────\n    const gridMap: number[][] = [];\n    let gridIdx = 0;\n\n    for (let ri = 0; ri < nRows; ri++) {\n        gridMap[ri] = [];\n        for (let ci = 0; ci < nCols; ci++) {\n            const panel = panels[ri]?.[ci];\n            if (!panel) { gridMap[ri][ci] = -1; continue; }\n            gridMap[ri][ci] = gridIdx;\n\n            const isLeft = ci === 0;\n            const isBottom = ri === nRows - 1;\n\n            // Cell position — row height depends on whether it's the bottom row\n            const cx = baseLeft + (ci === 0\n                ? 0\n                : col0W + GAP + (ci - 1) * (colInnerW + GAP));\n            let cy: number;\n            if (colHeaderPerRow) {\n                const rowOff = ri * (innerRowBlock + GAP);\n                cy = rowOff + COL_HEADER_H;\n            } else {\n                const rowOff = COL_HEADER_H + ri * (innerRowBlock + GAP);\n                cy = rowOff;\n            }\n\n            // Grid — position the plot area inside the cell.\n            const pLeft = ci === 0 ? mLeft : PAD;\n            combined.grid.push({\n                left: cx + pLeft,\n                top: cy + PAD,\n                width: plotW,\n                height: plotH,\n            });\n\n            // xAxis\n            const srcX = panel.xAxis ? { ...panel.xAxis } : { type: 'category' };\n            combined.xAxis.push({\n                ...srcX,\n                gridIndex: gridIdx,\n                name: undefined, nameGap: 0,\n                axisLabel: { ...(srcX.axisLabel || {}), show: isBottom, fontSize },\n                axisTick: { ...(srcX.axisTick || {}), show: isBottom },\n                axisLine: { show: true },\n            });\n\n            // yAxis — per-panel name only when row facet is absent\n            const srcY = panel.yAxis ? { ...panel.yAxis } : { type: 'value' };\n            const showYName = isLeft && !sharedYTitle;\n            combined.yAxis.push({\n                ...srcY,\n                gridIndex: gridIdx,\n                name: showYName ? srcY.name : undefined,\n                nameGap: showYName ? (srcY.nameGap ?? 4) : 0,\n                axisLabel: { ...(srcY.axisLabel || {}), show: isLeft, fontSize },\n                axisTick: { ...(srcY.axisTick || {}), show: isLeft },\n                axisLine: { show: true },\n            });\n\n            // Series\n            if (Array.isArray(panel.series)) {\n                for (const s of panel.series) {\n                    combined.series.push({ ...s, xAxisIndex: gridIdx, yAxisIndex: gridIdx });\n                }\n            }\n            gridIdx++;\n        }\n    }\n\n    // ── Helpers: grid center from placed grids ───────────────────────────\n    const gridOf = (ri: number, ci: number) => {\n        const gi = gridMap[ri]?.[ci];\n        return gi != null && gi >= 0 ? combined.grid[gi] : null;\n    };\n    const gCX = (g: any) => g.left + g.width / 2;\n    const gCY = (g: any) => g.top + g.height / 2;\n\n    // ── Facet headers — positioned from actual grids ─────────────────────\n    const graphics: any[] = [];\n    const hStyle = {\n        fontSize: headerFontSize, fontWeight: 'bold' as const, fill: '#555',\n        textAlign: 'center' as const, textVerticalAlign: 'middle' as const\n    };\n\n    // Column headers\n    if (config.colField) {\n        const hRows = colHeaderPerRow ? nRows : 1;\n        for (let ri = 0; ri < hRows; ri++) {\n            for (let ci = 0; ci < nCols; ci++) {\n                const p = panels[ri]?.[ci], g = gridOf(ri, ci);\n                if (!p?._colHeader || !g) continue;\n                graphics.push({\n                    type: 'text', left: gCX(g), top: g.top - COL_HEADER_H / 2,\n                    style: { ...hStyle, text: String(p._colHeader) },\n                });\n            }\n        }\n    }\n\n    // Row headers\n    if (config.rowField) {\n        for (let ri = 0; ri < nRows; ri++) {\n            const p = panels[ri]?.[0], g = gridOf(ri, 0);\n            if (!p?._rowHeader || !g) continue;\n            graphics.push({\n                type: 'text', left: SHARED_Y_W + ROW_HEADER_W / 2, top: gCY(g),\n                style: { ...hStyle, text: String(p._rowHeader) },\n                rotation: Math.PI / 2,\n            });\n        }\n    }\n\n    // Shared Y-axis title\n    if (sharedYTitle) {\n        const first = gridOf(0, 0), last = gridOf(nRows - 1, 0);\n        if (first && last) {\n            graphics.push({\n                type: 'text', left: SHARED_Y_W / 2, top: (gCY(first) + gCY(last)) / 2,\n                style: {\n                    text: sharedYTitle, fontSize: headerFontSize, fill: '#333',\n                    textAlign: 'center', textVerticalAlign: 'middle'\n                },\n                rotation: Math.PI / 2,\n            });\n        }\n    }\n\n    // Shared X-axis title\n    if (sharedXTitle) {\n        graphics.push({\n            type: 'text', left: totalW / 2, top: totalH - SHARED_X_H + 4,\n            style: { text: sharedXTitle, fontSize: headerFontSize, fill: '#333', textAlign: 'center' },\n        });\n    }\n\n    if (graphics.length > 0) combined.graphic = graphics;\n\n    // Per-panel ecApplyLayoutToSpec positions legend using a single subplot width, so after\n    // merging grids the legend's `left` often lands in the inter-column gap and overlaps plots.\n    repositionFacetedLegendBesideGrids(combined);\n\n    return combined;\n}\n\n/** Move categorical legend to the right of the rightmost grid; widen canvas so it is not clipped. */\nfunction repositionFacetedLegendBesideGrids(combined: any): void {\n    const grids = combined.grid;\n    if (!combined.legend || !Array.isArray(grids) || grids.length <= 1) return;\n\n    const rawData = combined.legend.data || [];\n    const legendLabels: string[] = rawData.map((d: any) => (typeof d === 'string' ? d : (d?.name ?? '')));\n    if (legendLabels.length === 0) return;\n\n    const maxLabelLen = Math.max(...legendLabels.map((l: string) => l.length), 3);\n    const highCardinality = legendLabels.length >= 16;\n    const legendSymbolWidth = highCardinality ? 12 : 14;\n    const legendItemGap = 5;\n    const estimatedTextWidth = Math.min(120, maxLabelLen * 7 + 30);\n    const legendW = legendSymbolWidth + legendItemGap + estimatedTextWidth;\n    const GAP = 12;\n    const BUFFER = 16;\n\n    const rightMost = Math.max(...grids.map((g: any) => (g.left ?? 0) + (g.width ?? 0)));\n    combined.legend = {\n        ...combined.legend,\n        left: rightMost + GAP,\n        top: combined.legend.top ?? 20,\n        orient: combined.legend.orient || 'vertical',\n        align: 'left',\n        right: undefined,\n        textStyle: {\n            fontSize: highCardinality ? 8 : 11,\n            ...(combined.legend.textStyle || {}),\n        },\n        ...(legendLabels.length > 10 ? { type: 'scroll' } : {}),\n        ...(highCardinality ? { itemWidth: 12, itemHeight: 12 } : {}),\n    };\n    combined._width = Math.max(combined._width || 0, rightMost + GAP + legendW + BUFFER);\n}\n\n/** Move faceted polar legend to the right of rightmost polar circle and widen canvas. */\nfunction repositionFacetedPolarLegend(combined: any): void {\n    const polars = combined.polar;\n    if (!combined.legend || !Array.isArray(polars) || polars.length <= 1) return;\n\n    const rawData = combined.legend.data || [];\n    const legendLabels: string[] = rawData.map((d: any) => (typeof d === 'string' ? d : (d?.name ?? '')));\n    if (legendLabels.length === 0) return;\n\n    const maxLabelLen = Math.max(...legendLabels.map((l: string) => l.length), 3);\n    const highCardinality = legendLabels.length >= 16;\n    const legendSymbolWidth = highCardinality ? 12 : 14;\n    const legendItemGap = 5;\n    const estimatedTextWidth = Math.min(120, maxLabelLen * 7 + 30);\n    const legendW = legendSymbolWidth + legendItemGap + estimatedTextWidth;\n    const GAP = 15;\n    const BUFFER = 16;\n\n    const rightMost = Math.max(...polars.map((p: any) => {\n        const cx = Array.isArray(p?.center) ? Number(p.center[0]) : 0;\n        const r = Number(p?.radius) || 0;\n        return cx + r;\n    }));\n    combined.legend = {\n        ...combined.legend,\n        left: rightMost + GAP,\n        top: combined.legend.top ?? 20,\n        orient: combined.legend.orient || 'vertical',\n        align: 'left',\n        right: undefined,\n        textStyle: {\n            fontSize: highCardinality ? 8 : 11,\n            ...(combined.legend.textStyle || {}),\n        },\n        ...(legendLabels.length > 10 ? { type: 'scroll' } : {}),\n        ...(highCardinality ? { itemWidth: 12, itemHeight: 12 } : {}),\n    };\n    combined._width = Math.max(combined._width || 0, rightMost + GAP + legendW + BUFFER);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n+ * =============================================================================\n+ * COLOR DECISIONS (backend-agnostic)\n+ * =============================================================================\n+ *\n+ * Pure decision layer for choosing colormaps based on:\n+ *   - Field semantics (FieldSemantics / ColorSchemeHint)\n+ *   - Channel semantics (ChannelSemantics)\n+ *   - Chart type & encodings\n+ *   - Data statistics (distinct count, numeric range)\n+ *\n+ * This module does NOT know about Vega-Lite / ECharts syntax.\n+ * It only returns abstract colormap identifiers and palette needs.\n+ * Backends translate these decisions into concrete scale/option config.\n+ * =============================================================================\n+ */\n\nimport type { ChartEncoding, ChannelSemantics } from './types';\n\n// -----------------------------------------------------------------------------\n// 公共类型\n// -----------------------------------------------------------------------------\n\nexport type ColorMapType = 'categorical' | 'sequential' | 'diverging';\n\nexport type ColorChannel = 'color' | 'group' | 'fill' | 'stroke';\n\nexport interface ColorDecision {\n    channel: ColorChannel;\n    schemeType: ColorMapType;\n    /**\n     * 具体 colormap 标识：\n     *   - 当用户在 encoding.scheme 中显式指定时，这里会带上该 id（如 'viridis'）。\n     *   - 自动决策路径下，core 不再选择具体 id，schemeId 留空，由各后端的 colormap\n     *     模块根据 schemeType / categoryCount / backend 主题自行挑选合适的 palette。\n     */\n    schemeId?: string;\n    divergingMidpoint?: number;\n    categoryCount?: number;\n    /** 是否是主编码（影响后续主题/对比度策略） */\n    primary: boolean;\n    /** 是否是数据驱动的颜色（而非常量色） */\n    dataDriven: boolean;\n}\n\n/**\n * 一个后端无关的颜色决策结果：按 channel 存一份。\n */\nexport interface ColorDecisionResult {\n    color?: ColorDecision;\n    group?: ColorDecision;\n    fill?: ColorDecision;\n    stroke?: ColorDecision;\n}\n\n// -----------------------------------------------------------------------------\n// 通道级颜色决策\n// -----------------------------------------------------------------------------\n\ninterface DecideColorMapsContext {\n    chartType: string;\n    encodings: Record<string, ChartEncoding>;\n    channelSemantics: Record<string, ChannelSemantics>;\n    table: any[];\n    // backend: 'vegalite' | 'echarts' | 'chartjs';\n    background?: 'light' | 'dark';\n}\n\nfunction inferColorChannelPrimary(channel: ColorChannel, chartType: string): boolean {\n    // 目前简单：color / group 视为主色通道\n    if (channel === 'color' || channel === 'group') return true;\n    return false;\n}\n\n/**\n * 从 ChannelSemantics 推断需要的 scheme 类型（categorical / sequential / diverging）。\n */\nfunction decideSchemeTypeFromChannel(\n    channel: ColorChannel,\n    cs: ChannelSemantics | undefined,\n): { schemeType: ColorMapType; divergingMidpoint?: number } {\n    const hint = cs?.colorScheme;\n    if (hint) {\n        // 若语义推荐是 diverging，则直接按发散处理。\n        if (hint.type === 'diverging') {\n            return {\n                schemeType: 'diverging',\n                // resolve-semantics 里用 domainMid 表示 diverging 中点\n                divergingMidpoint: (hint as any).domainMid,\n            };\n        }\n        // 若推荐为 sequential，则直接按顺序色带处理。\n        if (hint.type === 'sequential') {\n            return { schemeType: 'sequential' };\n        }\n        // 语义推荐为 categorical，但编码类型实际是 temporal 时，\n        // 对 color 通道优先按连续时间轴处理，使用 sequential colormap，\n        // 而不是一条一条离散颜色（防止 Date/Time 被当成类别色盘）。\n        if (hint.type === 'categorical') {\n            // 若语义为 Rank，则更适合作为连续数轴上的等级映射，\n            // 使用 continuous colormap（sequential），否则按普通类别处理。\n            const semType = cs?.semanticAnnotation?.semanticType;\n            const isRankLike = semType === 'Rank';\n            if (isRankLike) {\n                return { schemeType: 'sequential' };\n            }\n\n            if (cs?.type === 'temporal' && channel === 'color') {\n                return { schemeType: 'sequential' };\n            }\n            return { schemeType: 'categorical' };\n        }\n    }\n\n    // 没 hint 时，用语义 + encoding type 兜底\n    const encType = cs?.type;\n    const semType = cs?.semanticAnnotation?.semanticType;\n\n    // 相关系数 [-1,1] 等「双向度量」优先使用发散色带，以 0 为中点。\n    if (semType === 'Correlation') {\n        return { schemeType: 'diverging', divergingMidpoint: 0 };\n    }\n\n    if (encType === 'quantitative' || encType === 'temporal') {\n        return { schemeType: 'sequential' };\n    }\n\n    return { schemeType: 'categorical' };\n}\n\nfunction countDistinctValues(table: any[], field: string | undefined): number | undefined {\n    if (!field) return undefined;\n    const set = new Set<any>();\n    for (const row of table) {\n        if (row == null) continue;\n        set.add(row[field]);\n    }\n    return set.size;\n}\n\nfunction decideColorForChannel(\n    channel: ColorChannel,\n    ctx: DecideColorMapsContext,\n): ColorDecision | undefined {\n    const encoding = ctx.encodings[channel as string];\n    const cs = ctx.channelSemantics[channel as string];\n\n    // 没字段就不是数据驱动色，不做决策\n    if (!encoding || !cs?.field) return undefined;\n\n    const dataDriven = true;\n    const primary = inferColorChannelPrimary(channel, ctx.chartType);\n\n    // 1. 显式 scheme 优先\n    if (encoding.scheme && encoding.scheme !== 'default') {\n        const distinct = countDistinctValues(ctx.table, cs.field);\n        // 用户显式指定 scheme 时，core 只透传 id，并根据 ChannelSemantics 推断类型；\n        // 真正选择调色板由各后端的 colormap 模块完成。\n        const { schemeType } = decideSchemeTypeFromChannel(channel, cs);\n        return {\n            channel,\n            schemeType,\n            schemeId: encoding.scheme,\n            categoryCount: distinct,\n            primary,\n            dataDriven,\n        };\n    }\n\n    // 2. 基于 ChannelSemantics.colorScheme 的 family 决策\n    const { schemeType, divergingMidpoint } = decideSchemeTypeFromChannel(channel, cs);\n    const distinct = countDistinctValues(ctx.table, cs.field);\n\n    return {\n        channel,\n        schemeType,\n        divergingMidpoint,\n        categoryCount: distinct,\n        primary,\n        dataDriven,\n    };\n}\n\n/**\n * 主入口：根据 chart / encodings / channelSemantics / data 计算颜色决策。\n */\nexport function decideColorMaps(ctx: DecideColorMapsContext): ColorDecisionResult {\n    const result: ColorDecisionResult = {\n        color: undefined,\n        group: undefined,\n        fill: undefined,\n        stroke: undefined,\n    };\n\n    // 目前只对 color / group 做决策，fill / stroke 预留\n    const channels: ColorChannel[] = ['color', 'group'];\n    for (const ch of channels) {\n        const decision = decideColorForChannel(ch, ctx);\n        if (decision) {\n            result[ch] = decision;\n        }\n    }\n\n    return result;\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts chart assembly — Two-Stage Pipeline Coordinator.\n *\n * Reuses the **same core analysis pipeline** as Vega-Lite:\n *   Phase 0:  resolveChannelSemantics  → ChannelSemantics\n *   Step 0a:  declareLayoutMode    → LayoutDeclaration\n *   Step 0b:  convertTemporalData  → converted data\n *   Step 0c:  filterOverflow       → filtered data, nominalCounts\n *   Phase 1:  computeLayout        → LayoutResult\n *\n * Then diverges for Phase 2 (ECharts-specific):\n *   template.instantiate → builds ECharts option structure\n *   ecApplyLayoutToSpec  → applies layout decisions to option\n *\n * ── Backend Translation Responsibilities ────────────────────────────\n * The LayoutResult from Phase 1 is target-agnostic.  This assembler is\n * responsible for translating it into ECharts-specific structures:\n *\n *   subplotWidth / subplotHeight\n *     → ECharts `grid.width` / `grid.height` (the inner plot area).\n *       The assembler adds ECharts-specific margins (CANVAS_BUFFER,\n *       axis label space, legend width) to compute the outer canvas\n *       `_width` / `_height`.\n *\n *   xStep / yStep / stepPadding\n *     → ECharts `barWidth`, `barCategoryGap`, `barGap` on series.\n *       VL handles this via `width: {step: N}` natively; ECharts has\n *       no such declarative feature, so we compute explicit pixel\n *       values from the layout numbers.\n *\n *   Facet wrapping\n *     → Column wrapping is decided by filterOverflow (shared with VL).\n *       This assembler reads `overflowResult.facetGrid` for the grid\n *       dimensions, restructures the flat 1×N panels into a wrapped\n *       2D grid, and passes the result to ecCombineFacetPanels.\n *       The combiner itself has NO wrapping logic — it renders\n *       whatever grid it receives.\n *\n *   Per-panel vs shared axis titles\n *     → The facet combiner keeps Y-axis titles on the left column only\n *       and renders the X-axis title as a shared centered element.\n *\n * Key structural differences from Vega-Lite output:\n *   VL: { mark, encoding, data: {values}, width, height }\n *   EC: { xAxis, yAxis, series: [{type, data}], tooltip, legend, grid }\n *\n * This module has NO React, Redux, or UI framework dependencies.\n */\n\nimport {\n    ChartEncoding,\n    ChartTemplateDef,\n    ChartAssemblyInput,\n    AssembleOptions,\n    LayoutDeclaration,\n    InstantiateContext,\n} from '../core/types';\nimport type { ChartWarning } from '../core/types';\nimport { applyEncodingOverrides } from '../core/encoding-overrides';\nimport { applyAggregation } from '../core/aggregate';\nimport { applyPivot, applyTransform, type PivotSurface, type TransformSurface } from '../core/pivot';\nimport { ecGetTemplateDef } from './templates';\nimport { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics';\nimport { toTypeString, type SemanticAnnotation } from '../core/field-semantics';\nimport { filterOverflow } from '../core/filter-overflow';\nimport { computeLayout, computeChannelBudgets, deriveStretchCaps, resolveBaseSize, resolveFacetColumnsOption } from '../core/compute-layout';\nimport { ecApplyLayoutToSpec, ecApplyTooltips } from './instantiate-spec';\nimport { ecCombineFacetPanels } from './facet';\nimport { DEFAULT_COLORS } from './templates/utils';\nimport { inferVisCategory, computeZeroDecision } from '../core/semantic-types';\nimport { decideColorMaps } from '../core/color-decisions';\nimport { getPaletteForScheme } from './colormap';\nimport { normalizeStaticSeries } from '../core/static-series';\nimport { normalizeChartProperties } from '../core/normalize-properties';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Assemble an ECharts option object.\n *\n * ```ts\n * const option = assembleECharts({\n *   data: { values: myRows },\n *   semantic_types: { weight: 'Quantity' },\n *   chart_spec: { chartType: 'Bar Chart', encodings: { x: { field: 'category' }, y: { field: 'value' } } },\n *   options: { addTooltips: true },\n * });\n * ```\n *\n * @returns An ECharts option object with optional `_warnings` and `_width`/`_height` hints\n */\nexport function assembleECharts(input: ChartAssemblyInput): any {\n    const chartType = input.chart_spec.chartType;\n    const semanticTypes = input.semantic_types ?? {};\n    // Internal layout targets the base (target) size; the optional canvasSize\n    // ceiling is applied as per-dimension stretch caps once options resolve.\n    // The base is clamped to the ceiling so a smaller canvasSize shrinks the\n    // chart to fit rather than overflowing it.\n    const sizeCeiling = input.chart_spec.canvasSize;\n    const baseSize = resolveBaseSize(input.chart_spec.baseSize, sizeCeiling);\n    const canvasSize = baseSize;\n    const options = input.options ?? {};\n    let chartTemplate = ecGetTemplateDef(chartType) as ChartTemplateDef;\n    if (!chartTemplate) {\n        throw new Error(`Unknown ECharts chart type: ${chartType}. Use ecAllTemplateDefs to see available types.`);\n    }\n\n    const warnings: ChartWarning[] = [];\n\n    // Validate discrete property values against the template's options before\n    // they reach `instantiate` (map known labels → values, drop unknowns).\n    const normalizedProps = normalizeChartProperties(\n        chartTemplate.properties, input.chart_spec.chartProperties,\n    );\n    const chartProperties = normalizedProps.chartProperties;\n    warnings.push(...normalizedProps.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PRE-PHASE: Static Series Normalization\n    // ═══════════════════════════════════════════════════════════════════════\n    const rawData = input.data.values ?? [];\n    const normalized = normalizeStaticSeries(\n        input.chart_spec.encodings, rawData, semanticTypes,\n    );\n    let data = normalized.data;\n    const staticSeries = normalized.staticSeries;\n\n    const prelimConvertedData = convertTemporalData(data, semanticTypes);\n    const prelimSemantics = resolveChannelSemantics(\n        normalized.encodings, data, semanticTypes, prelimConvertedData,\n    );\n    const typedRawEncodings: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(normalized.encodings)) {\n        typedRawEncodings[ch] = enc.type\n            ? enc\n            : { ...enc, type: prelimSemantics[ch]?.type };\n    }\n\n    // Transform (derived Category-B operator): same two-control model as VL —\n    // chartProperties.chartType (θ) + chartProperties.arrange (τ/σ/γ). Legacy\n    // composed `pivot` ids are migrated inside applyTransform. See\n    // design-docs/chart-transform-two-axes.md.\n    const authoredTemplate = chartTemplate;\n    const transformed = applyTransform(chartTemplate, typedRawEncodings, data, chartProperties, ecGetTemplateDef);\n    if (transformed.chartType && transformed.chartType !== chartType) {\n        const swapped = ecGetTemplateDef(transformed.chartType) as ChartTemplateDef | undefined;\n        if (swapped) chartTemplate = swapped;\n    }\n\n    // Compose Category-B encoding-action overrides (stored by the host in\n    // chartProperties, keyed by action key) onto the post-transform encodings\n    // before any pipeline phase runs. Flint owns the transform; the host only\n    // stores the override value. See applyEncodingOverrides / EncodingActionDef.\n    const encodings = applyEncodingOverrides(chartTemplate, transformed.encodings, chartProperties);\n\n    // Optional aggregation transform — see vegalite/assemble for rationale.\n    data = applyAggregation(encodings, data);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 0: Resolve Semantics (shared with VL — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // Extract mark type from template (for zero finalization)\n    // ECharts templates still use VL-style `template.mark` for compatibility\n    const tplMark = chartTemplate.template?.mark;\n    const templateMarkType = typeof tplMark === 'string' ? tplMark : tplMark?.type;\n\n    // Convert temporal data once — feeds semantic resolution and all downstream stages\n    const convertedData = convertTemporalData(data, semanticTypes);\n\n    const channelSemantics = resolveChannelSemantics(\n        encodings, data, semanticTypes, convertedData,\n    );\n\n    // Finalize zero-baseline (requires template mark knowledge)\n    const effectiveMarkType = templateMarkType || 'point';\n    for (const [channel, cs] of Object.entries(channelSemantics)) {\n        if ((channel === 'x' || channel === 'y') && cs.type === 'quantitative') {\n            const numericValues = data\n                .map(r => r[cs.field])\n                .filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            cs.zero = computeZeroDecision(\n                cs.semanticAnnotation.semanticType, channel, effectiveMarkType, numericValues,\n            );\n        }\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0a: declareLayoutMode (shared hook)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const declaration: LayoutDeclaration = chartTemplate.declareLayoutMode\n        ? chartTemplate.declareLayoutMode(channelSemantics, data, chartProperties)\n        : {};\n\n    // Merge paramOverrides into effective options\n    const effectiveOptions: AssembleOptions = {\n        // ECharts uses step × itemCount for discrete canvas sizing (like VL),\n        // but adds ~120-160px grid margins on top.  A 24px base band gives\n        // bars close to ECharts's native auto-sizing at typical category counts.\n        defaultBandSize: 24,\n        // ECharts fills its grid natively (bars sized by barCategoryGap), so\n        // sparse categories spread out. Allow bands to expand past the base to\n        // match that, capped so a couple of bars don't span the whole canvas.\n        maxBandSize: 100,\n        // ECharts native font defaults (labels, titles, legend all 12).\n        baseLabelFontSize: 12,\n        baseTitleFontSize: 12,\n        ...options,\n        ...(declaration.paramOverrides || {}),\n    };\n\n    // ECharts facet overhead:\n    //   Fixed: mLeft (~35-55px width) + mBottom (~22px height).\n    //   Gap:   GAP + PAD between panels (ref 14px at 400px canvas,\n    //          core scales proportionally).\n    if (effectiveOptions.facetFixedPadding == null) {\n        effectiveOptions.facetFixedPadding = { width: 55, height: 22 };\n    }\n    if (effectiveOptions.facetGap == null) {\n        effectiveOptions.facetGap = 14;   // reference at 400px canvas\n    }\n\n    // Resolve the optional canvasSize ceiling into per-dimension stretch caps\n    // (βx, βy) so the entire layout — single plot OR facet grid — stays within\n    // the same budget. Falls back to maxStretch when no ceiling is set.\n    Object.assign(effectiveOptions, deriveStretchCaps(baseSize, sizeCeiling, effectiveOptions));\n    effectiveOptions.facetColumns = resolveFacetColumnsOption(input.chart_spec.chartProperties);\n\n    // Default true so that _encodingTooltip is applied and all charts get encoding-style tooltips\n    const {\n        addTooltips: addTooltipsOpt = true,\n    } = effectiveOptions;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0b: filterOverflow (shared)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const allMarkTypes = new Set<string>();\n    if (templateMarkType) allMarkTypes.add(templateMarkType);\n\n    // ── Channel budgets (shared, in layout module) ─────────────────────\n    const budgets = computeChannelBudgets(\n        channelSemantics, declaration, convertedData, canvasSize, effectiveOptions,\n    );\n    const facetGridResult = budgets.facetGrid;\n\n    const overflowResult = filterOverflow(\n        channelSemantics, declaration, encodings, convertedData,\n        budgets, allMarkTypes,\n    );\n\n    let values = overflowResult.filteredData;\n    warnings.push(...overflowResult.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 1: Compute Layout (shared — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const layoutResult = computeLayout(\n        channelSemantics,\n        declaration,\n        values,\n        canvasSize,\n        effectiveOptions,\n        facetGridResult,\n    );\n\n    layoutResult.truncations = overflowResult.truncations;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 2: Instantiate ECharts Option (EC-specific)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // --- Build resolved encodings (EC analogue of VL buildVLEncodings) ---\n    const resolvedEncodings = buildECEncodings(\n        encodings,\n        channelSemantics,\n        declaration,\n        values,\n        canvasSize,\n        semanticTypes,\n        templateMarkType,\n        chartTemplate,\n    );\n\n    const colorDecisions = decideColorMaps({\n        chartType,\n        encodings,\n        channelSemantics,\n        table: values,\n        background: 'light',\n    });\n\n    // --- Template instantiate ---\n\n    const instantiateContext: InstantiateContext = {\n        channelSemantics,\n        layout: layoutResult,\n        table: values,\n        fullTable: convertedData,\n        resolvedEncodings,\n        encodings,\n        chartProperties,\n        staticSeries,\n        canvasSize,\n        semanticTypes,\n        chartType,\n        assembleOptions: effectiveOptions,\n        colorDecisions,\n    };\n\n    // --- Detect faceting (column / row channels) ---\n\n    const colField = channelSemantics.column?.field;\n    const rowField = channelSemantics.row?.field;\n    const hasFacet = !!(colField || rowField);\n\n    // Multi-grid faceting only works for axis-based charts.\n    // Pie, radar, themeRiver use different positioning.\n    const hasAxes = chartTemplate.channels.includes('x') || chartTemplate.channels.includes('y');\n\n    let ecOption: any;\n\n    if (hasFacet && hasAxes) {\n        // ── Faceted rendering — multi-grid layout ────────────────────────\n        const maxFacetCols = facetGridResult?.columns ?? 1;\n        const maxFacetRows = facetGridResult?.rows ?? 1;\n        const maxFacetNominalValues = maxFacetCols * maxFacetRows;\n\n        // Bin quantitative facet channels when unique values exceed grid capacity (VL enc.bin = true)\n        let colValues: string[];\n        let rowValues: string[];\n        if (colField && channelSemantics.column?.type === 'quantitative') {\n            const raw = values.map((r: any) => r[colField]).filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            const uniques = new Set(raw);\n            if (uniques.size > maxFacetNominalValues) {\n                const numBins = Math.min(maxFacetNominalValues, 20);\n                const minVal = Math.min(...raw);\n                const maxVal = Math.max(...raw);\n                const step = (maxVal - minVal) / numBins || 1;\n                const getColBin = (v: number) => Math.min(numBins - 1, Math.floor((v - minVal) / step));\n                values = values.map((r: any) => {\n                    const v = r[colField];\n                    const bin = (v != null && typeof v === 'number' && !isNaN(v)) ? getColBin(v) : 0;\n                    return { ...r, _ecColumnBin: bin };\n                });\n                colValues = Array.from({ length: numBins }, (_, i) => String(i));\n            } else {\n                colValues = [...new Set(values.map((r: any) => String(r[colField])))];\n            }\n        } else {\n            colValues = colField ? [...new Set(values.map((r: any) => String(r[colField])))] : [];\n        }\n        if (rowField && channelSemantics.row?.type === 'quantitative') {\n            const raw = values.map((r: any) => r[rowField]).filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            const uniques = new Set(raw);\n            if (uniques.size > maxFacetNominalValues) {\n                const numBins = Math.min(maxFacetNominalValues, 20);\n                const minVal = Math.min(...raw);\n                const maxVal = Math.max(...raw);\n                const step = (maxVal - minVal) / numBins || 1;\n                const getRowBin = (v: number) => Math.min(numBins - 1, Math.floor((v - minVal) / step));\n                values = values.map((r: any) => {\n                    const v = r[rowField];\n                    const bin = (v != null && typeof v === 'number' && !isNaN(v)) ? getRowBin(v) : 0;\n                    return { ...r, _ecRowBin: bin };\n                });\n                rowValues = Array.from({ length: numBins }, (_, i) => String(i));\n            } else {\n                rowValues = [...new Set(values.map((r: any) => String(r[rowField])))];\n            }\n        } else {\n            rowValues = rowField ? [...new Set(values.map((r: any) => String(r[rowField])))] : [];\n        }\n\n        // ── Shared layout (facet-aware, same as VL path) ─────────────────\n        const facetLayout = computeLayout(\n            channelSemantics, declaration, values, canvasSize, effectiveOptions,\n            facetGridResult,\n        );\n        facetLayout.truncations = overflowResult.truncations;\n\n        const nRows = rowValues.length || 1;\n        const nCols = colValues.length || 1;\n\n        // ── Column wrapping ─────────────────────────────────────────────\n        // Use the facet grid decided by computeFacetGrid.\n        const maxColsPerRow = facetGridResult?.columns ?? nCols;\n\n        const panels: any[][] = [];\n        const colBinned = colField && values.length > 0 && (values[0] as any)._ecColumnBin !== undefined;\n        const rowBinned = rowField && values.length > 0 && (values[0] as any)._ecRowBin !== undefined;\n\n        for (let ri = 0; ri < nRows; ri++) {\n            const row: any[] = [];\n            for (let ci = 0; ci < nCols; ci++) {\n                const cv = colValues[ci];\n                const rv = rowValues[ri];\n                const panelData = values.filter((r: any) => {\n                    if (colField) {\n                        if (colBinned) { if ((r as any)._ecColumnBin !== ci) return false; }\n                        else if (String(r[colField]) !== cv) return false;\n                    }\n                    if (rowField) {\n                        if (rowBinned) { if ((r as any)._ecRowBin !== ri) return false; }\n                        else if (String(r[rowField]) !== rv) return false;\n                    }\n                    return true;\n                });\n\n                const panelOption: any = structuredClone(chartTemplate.template);\n                const panelCtx: InstantiateContext = {\n                    ...instantiateContext,\n                    table: panelData,\n                    layout: facetLayout,\n                    canvasSize,\n                };\n\n                // Let ecApplyLayoutToSpec compute step-based dimensions\n                // naturally (plotWidth = step × itemCount for discrete,\n                // subplotWidth for continuous).  _width/_height are NOT\n                // pre-set so the computation runs.\n                chartTemplate.instantiate(panelOption, panelCtx);\n                ecApplyLayoutToSpec(panelOption, panelCtx, []);\n                if (addTooltipsOpt) ecApplyTooltips(panelOption);\n                if (chartTemplate.postProcess) chartTemplate.postProcess(panelOption, panelCtx);\n\n                // Extract pure plot-area dimensions for facet.ts.\n                // Always anchor faceted panel sizing to shared core layout\n                // (same source used by Vega-Lite), instead of per-panel\n                // standalone canvas dimensions (which may include legend space).\n                const g = panelOption.grid || {};\n                panelOption._plotWidth = Math.max(\n                    20,\n                    facetLayout.subplotWidth\n                    || ((panelOption._width || 200) - (g.left || 0) - (g.right || 0)),\n                );\n                panelOption._plotHeight = Math.max(\n                    20,\n                    facetLayout.subplotHeight\n                    || ((panelOption._height || 150) - (g.top || 0) - (g.bottom || 0)),\n                );\n\n                // Attach facet header labels for the combiner\n                if (colField) panelOption._colHeader = cv;\n                if (rowField) panelOption._rowHeader = rv;\n\n                row.push(panelOption);\n            }\n            panels.push(row);\n        }\n\n        // ── Wrap column-only facets into a proper 2D grid ────────────────\n        // The wrapping decision was already computed above (maxColsPerRow).\n        // Restructure the flat 1×N panels into displayCols×wrapRows so\n        // that ecCombineFacetPanels receives a plain grid with no\n        // wrapping logic of its own.\n        let finalPanels = panels;\n        let colHeaderPerRow = false;\n\n        if (colField && !rowField && maxColsPerRow < nCols) {\n            const displayCols = maxColsPerRow;\n            const wrapRows = Math.ceil(nCols / displayCols);\n            finalPanels = [];\n            for (let wr = 0; wr < wrapRows; wr++) {\n                const wrapRow: any[] = [];\n                for (let vc = 0; vc < displayCols; vc++) {\n                    const origCi = wr * displayCols + vc;\n                    if (origCi < nCols) {\n                        wrapRow.push(panels[0][origCi]);\n                    }\n                }\n                if (wrapRow.length > 0) finalPanels.push(wrapRow);\n            }\n            colHeaderPerRow = true;\n        }\n\n        ecOption = ecCombineFacetPanels(finalPanels, {\n            colField, rowField, colHeaderPerRow,\n        });\n    } else {\n        // ── Standard single-panel rendering ──────────────────────────────\n        ecOption = structuredClone(chartTemplate.template);\n\n        chartTemplate.instantiate(ecOption, instantiateContext);\n\n        // --- Apply layout decisions (EC-specific) ---\n\n        ecApplyLayoutToSpec(ecOption, instantiateContext, warnings);\n\n        // --- Tooltips ---\n\n        if (addTooltipsOpt) {\n            ecApplyTooltips(ecOption);\n        }\n\n        // --- ECharts-specific post-processing ---\n\n        // Template-specific post-processing (e.g. scatter symbolSize)\n        if (chartTemplate.postProcess) {\n            chartTemplate.postProcess(ecOption, instantiateContext);\n        }\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // RESULT\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // Attach metadata\n    if (warnings.length > 0) {\n        ecOption._warnings = warnings;\n    }\n\n    // Store data reference (unlike VL which embeds data.values,\n    // ECharts data is embedded directly in series[].data)\n    ecOption._dataLength = values.length;\n\n    if (transformed.surface) {\n        ecOption._transform = transformed.surface;\n    }\n    // Legacy single-control surface for getEChartsPivot — enumerated from the\n    // authored template so ids/labels match the pre-split contract.\n    const legacyPivot = applyPivot(authoredTemplate, typedRawEncodings, data, chartProperties, ecGetTemplateDef);\n    if (legacyPivot.surface) {\n        ecOption._pivot = legacyPivot.surface;\n    }\n\n    // Clean internal-only props\n    delete ecOption._legendWidth;\n\n    return ecOption;\n}\n\n/** Inspect the ECharts legacy (composed) view transformation surface for an input. */\nexport function getEChartsPivot(input: ChartAssemblyInput): PivotSurface | undefined {\n    const spec = assembleECharts(input);\n    return spec && spec._pivot ? (spec._pivot as PivotSurface) : undefined;\n}\n\n/** Inspect the ECharts two-control transform surface for an input. */\nexport function getEChartsTransform(input: ChartAssemblyInput): TransformSurface | undefined {\n    const spec = assembleECharts(input);\n    return spec && spec._transform ? (spec._transform as TransformSurface) : undefined;\n}\n\n// ===========================================================================\n// buildECEncodings — Translate abstract semantics → EC-resolved encodings\n// ===========================================================================\n// Analogous to VegaLite's buildVLEncodings in vegalite/assemble.ts. Output is\n// passed as context.resolvedEncodings so ecApplyLayoutToSpec and templates\n// read colorPalette, ordinalSortOrder, sizeRange, etc. from one place.\n\ninterface ECResolvedChannelEncoding {\n    field?: string;\n    type?: 'quantitative' | 'nominal' | 'ordinal' | 'temporal';\n    aggregate?: string;\n    colorPalette?: string[];\n    /** Diverging scale mid value (from Phase 0 colorScheme.domainMid). */\n    colorDomainMid?: number;\n    ordinalSortOrder?: string[];\n    /** Explicit sort order when sortBy is a JSON array of values (e.g. custom order). */\n    sortValues?: string[];\n    /** When true, discrete axis should preserve data encounter order (no alphabetical sort). */\n    preserveDataOrder?: boolean;\n    sortOrder?: 'ascending' | 'descending';\n    sortBy?: string;\n    sizeRange?: [number, number];\n    /** For radius channel: ECharts can use sqrt scale for area-proportional radius. */\n    radiusScale?: { type: 'sqrt'; zero: boolean };\n    /** When true, quantitative x axis should not \"nice\" the domain (line/area/point). */\n    scaleNice?: boolean;\n    /** High-cardinality legend: suggest smaller symbol/label (EC legend itemStyle.symbolSize, etc.). */\n    legendSymbolSize?: number;\n    legendLabelFontSize?: number;\n    groupAxis?: 'x' | 'y';\n    offsetChannel?: 'xOffset' | 'yOffset';\n}\n\n// 颜色 palette 现在从 core/color-decisions 的统一注册表获取；\n// 这里保留 DEFAULT_COLORS 作为找不到注册表项时的兜底。\n\n/**\n * Translate Phase 0 channel semantics + declaration overrides into\n * ECharts-resolved encodings. Mirrors Vega-Lite buildVLEncodings logic\n * but outputs EC-specific fields (colorPalette, sizeRange, ordinalSortOrder,\n * etc.) for template.instantiate and ecApplyLayoutToSpec.\n */\nfunction buildECEncodings(\n    encodings: Record<string, ChartEncoding>,\n    channelSemantics: Record<string, import('../core/types').ChannelSemantics>,\n    declaration: LayoutDeclaration,\n    data: any[],\n    canvasSize: { width: number; height: number },\n    semanticTypes: Record<string, string | SemanticAnnotation>,\n    templateMarkType: string | undefined,\n    chartTemplate: ChartTemplateDef,\n): Record<string, ECResolvedChannelEncoding> {\n    const resolved: Record<string, ECResolvedChannelEncoding> = {};\n    const encodingsEntries = Object.entries(encodings);\n\n    for (const [channel, encoding] of encodingsEntries) {\n        const entry: ECResolvedChannelEncoding = {};\n        const fieldName = encoding.field;\n        const cs = channelSemantics[channel];\n\n        // --- Radius: ECharts can use sqrt scale for area-proportional radius (mirror VL) ---\n        if (channel === 'radius') {\n            entry.radiusScale = { type: 'sqrt', zero: true };\n        }\n\n        // --- Count aggregate without a field (mirror VL) ---\n        if (!fieldName && encoding.aggregate === 'count') {\n            entry.field = '_count';\n            entry.type = 'quantitative';\n        }\n\n        if (fieldName) {\n            entry.field = fieldName;\n            entry.type = (cs?.type ?? 'nominal') as ECResolvedChannelEncoding['type'];\n\n            // Explicit type override; column/row forced to nominal when not discrete (mirror VL)\n            if (encoding.type) {\n                entry.type = encoding.type as ECResolvedChannelEncoding['type'];\n            } else if (channel === 'column' || channel === 'row') {\n                if (entry.type !== 'nominal' && entry.type !== 'ordinal') {\n                    entry.type = 'nominal';\n                }\n            }\n\n            if (encoding.aggregate) {\n                if (encoding.aggregate === 'count') {\n                    entry.field = '_count';\n                    entry.type = 'quantitative';\n                } else {\n                    entry.field = `${fieldName}_${encoding.aggregate}`;\n                    entry.type = 'quantitative';\n                }\n            }\n\n            // Quantitative X axis: no \"nice\" for line/area/point (mirror VL scale.nice: false)\n            if (entry.type === 'quantitative' && channel === 'x') {\n                if (templateMarkType === 'line' || templateMarkType === 'area' ||\n                    templateMarkType === 'trail' || templateMarkType === 'point') {\n                    entry.scaleNice = false;\n                }\n            }\n\n            // High-cardinality nominal color/group: suggest smaller legend (mirror VL)\n            if (entry.type === 'nominal' && (channel === 'color' || channel === 'group')) {\n                const actualDomain = [...new Set(data.map((r: any) => r[fieldName]))];\n                if (actualDomain.length >= 16) {\n                    entry.legendSymbolSize = 12;\n                    entry.legendLabelFontSize = 8;\n                }\n            }\n        }\n\n        // --- Size channel: pixel range for ECharts symbolSize (mirror VL size scale logic) ---\n        if (channel === 'size') {\n            const EC_SIZE_MIN_PX = 10;\n            const EC_SIZE_MAX_PX = 50;\n            const plotArea = canvasSize.width * canvasSize.height;\n            const n = Math.max(data.length, 1);\n            const fairShare = plotArea / n;\n            const targetPct = 0.05;\n            const idealDiameterPx = Math.sqrt(fairShare * targetPct);\n            const isQuant = entry.type === 'quantitative' || entry.type === 'temporal';\n            const maxSize = Math.round(Math.max(EC_SIZE_MIN_PX, Math.min(EC_SIZE_MAX_PX, idealDiameterPx)));\n            const minSize = isQuant ? Math.max(EC_SIZE_MIN_PX, Math.round(maxSize / 3)) : Math.round(maxSize / 4);\n            entry.sizeRange = [Math.max(EC_SIZE_MIN_PX, minSize), Math.max(minSize, maxSize)];\n        }\n\n        // --- Sorting (mirror VL: sortBy/sortOrder + custom sortValues + auto ordinal/preserve order) ---\n        if (encoding.sortBy || encoding.sortOrder) {\n            entry.sortOrder = encoding.sortOrder as 'ascending' | 'descending';\n            entry.sortBy = encoding.sortBy;\n            if (encoding.sortBy) {\n                if (encoding.sortBy === 'x' || encoding.sortBy === 'y' || encoding.sortBy === 'color') {\n                    // Stored for templates to apply axis/series order\n                } else {\n                    try {\n                        if (fieldName) {\n                            const fieldSemType = toTypeString(semanticTypes[fieldName]);\n                            const fieldVisCat = inferVisCategory(data.map((r: any) => r[fieldName]));\n                            let sortedValues = JSON.parse(encoding.sortBy) as any[];\n                            if (fieldVisCat === 'temporal' || fieldSemType === 'Year' || fieldSemType === 'Decade') {\n                                sortedValues = sortedValues.map((v: any) => String(v));\n                            }\n                            entry.sortValues = (encoding.sortOrder === 'descending')\n                                ? [...sortedValues].reverse() : sortedValues;\n                        }\n                    } catch {\n                        // ignore invalid sortBy JSON\n                    }\n                }\n            }\n        } else {\n            const isDiscrete = entry.type === 'nominal' || entry.type === 'ordinal';\n            if (isDiscrete) {\n                if (cs?.ordinalSortOrder?.length) {\n                    entry.ordinalSortOrder = cs.ordinalSortOrder;\n                } else {\n                    entry.preserveDataOrder = true;\n                }\n            }\n        }\n\n        // Color / group palettes are now sourced from backend-agnostic\n        // colorDecisions in InstantiateContext, so we no longer derive\n        // a palette directly from encoding.scheme or cs.colorScheme here.\n\n        if (Object.keys(entry).length > 0) {\n            resolved[channel] = entry;\n        }\n    }\n\n    // --- Declaration overrides (mirror VL) ---\n    if (declaration.resolvedTypes) {\n        for (const [ch, type] of Object.entries(declaration.resolvedTypes)) {\n            if (resolved[ch]) {\n                resolved[ch].type = type as ECResolvedChannelEncoding['type'];\n            }\n        }\n    }\n\n    // --- Group → color + offset (mirror VL: ensure color exists from group; keep group for EC offset) ---\n    const groupCS = channelSemantics.group;\n    if (groupCS?.field && resolved.group) {\n        const xType = resolved.x?.type;\n        const yType = resolved.y?.type;\n        const isDiscrete = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n        const groupAxis = isDiscrete(xType) ? 'x' : isDiscrete(yType) ? 'y' : 'x';\n        const offsetChannel = groupAxis === 'x' ? 'xOffset' : 'yOffset';\n        resolved.group.groupAxis = groupAxis;\n        resolved.group.offsetChannel = offsetChannel;\n        if (!resolved.color) {\n            const palette = groupCS.colorScheme?.scheme\n                ? (getPaletteForScheme(groupCS.colorScheme.scheme) ?? DEFAULT_COLORS)\n                : DEFAULT_COLORS;\n            resolved.color = {\n                field: groupCS.field,\n                type: (groupCS.type ?? 'nominal') as ECResolvedChannelEncoding['type'],\n                colorPalette: palette,\n                colorDomainMid: resolved.group.colorDomainMid,\n                ordinalSortOrder: resolved.group.ordinalSortOrder,\n                sortOrder: resolved.group.sortOrder,\n                sortBy: resolved.group.sortBy,\n                sortValues: resolved.group.sortValues,\n                preserveDataOrder: resolved.group.preserveDataOrder,\n                legendSymbolSize: resolved.group.legendSymbolSize,\n                legendLabelFontSize: resolved.group.legendLabelFontSize,\n            };\n        } else if (!resolved.color.colorPalette && groupCS.colorScheme?.scheme) {\n            resolved.color.colorPalette =\n                getPaletteForScheme(groupCS.colorScheme.scheme) ?? DEFAULT_COLORS;\n        }\n    }\n\n    // --- Merge template encoding defaults (mirror VL: template encoding as base) ---\n    const templateEncoding = chartTemplate.template?.encoding as Record<string, any> | undefined;\n    if (templateEncoding && typeof templateEncoding === 'object') {\n        for (const [ch, enc] of Object.entries(templateEncoding)) {\n            if (enc && typeof enc === 'object' && Object.keys(enc).length > 0 && resolved[ch]) {\n                resolved[ch] = { ...enc, ...resolved[ch] };\n            }\n        }\n    }\n\n    return resolved;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * ECharts recommendation & adaptation wrappers.\n *\n * Extends core/recommendation.ts with ECharts-only chart types\n * (Gauge, Funnel, Treemap, Sunburst, Sankey).\n */\n\nimport {\n    adaptChannels,\n    recommendChannels,\n    getRecommendation,\n    type InternalTableView,\n    pickQuantitative,\n    pickDiscrete,\n    pickLowCardDiscrete,\n} from '../core/recommendation';\nimport {\n    recommendChartTypes,\n    type RecommendChartTypesOptions,\n    type RecommendedChart,\n} from '../core/chart-type-recommendation';\nimport { ecGetTemplateChannels, ecAllTemplateDefs } from './templates';\n\n// ── EC-extended recommendation ──────────────────────────────────────────\n\nfunction ecGetRecommendation(chartType: string, tv: InternalTableView): Record<string, string> {\n    const used = new Set<string>();\n    const rec: Record<string, string> = {};\n    const assign = (channel: string, fieldName: string | undefined) => {\n        if (fieldName) rec[channel] = fieldName;\n    };\n\n    switch (chartType) {\n        case 'Gauge Chart': {\n            // Channels: ['size', 'column'] — size carries the value, column\n            // optionally splits into multiple dials.\n            const valueField = pickQuantitative(tv, used);\n            if (!valueField) return {};\n            assign('size', valueField);\n            assign('column', pickLowCardDiscrete(tv, used, 10));\n            return rec;\n        }\n\n        case 'Funnel Chart': {\n            // Channels: ['y', 'size'] — y is the stage/category, size is the value.\n            const valueField = pickQuantitative(tv, used);\n            const stageField = pickLowCardDiscrete(tv, used, 15);\n            if (!valueField || !stageField) return {};\n            assign('y', stageField);\n            assign('size', valueField);\n            return rec;\n        }\n\n        case 'Treemap':\n        case 'Sunburst Chart': {\n            const sizeField = pickQuantitative(tv, used);\n            const colorField = pickLowCardDiscrete(tv, used, 20);\n            if (!sizeField || !colorField) return {};\n            assign('size', sizeField);\n            assign('color', colorField);\n            return rec;\n        }\n\n        case 'Sankey Diagram': {\n            // Channels: ['x', 'y', 'size'] — x is source node, y is target node,\n            // size is the flow value.\n            const sourceField = pickDiscrete(tv, used);\n            const targetField = pickDiscrete(tv, used);\n            const valueField = pickQuantitative(tv, used);\n            if (!sourceField || !targetField || !valueField) return {};\n            assign('x', sourceField);\n            assign('y', targetField);\n            assign('size', valueField);\n            return rec;\n        }\n\n        default:\n            return getRecommendation(chartType, tv);\n    }\n}\n\n// ── Public API ──────────────────────────────────────────────────────────\n\nexport function ecAdaptChart(\n    sourceType: string,\n    targetType: string,\n    encodings: Record<string, string>,\n    data?: any[],\n    semanticTypes?: Record<string, string>,\n): Record<string, string> {\n    const targetChannels = ecGetTemplateChannels(targetType);\n    return adaptChannels(sourceType, targetType, targetChannels, encodings, data, semanticTypes, ecGetRecommendation);\n}\n\nexport function ecRecommendEncodings(\n    chartType: string,\n    data: any[],\n    semanticTypes: Record<string, string>,\n): Record<string, string> {\n    const rec = recommendChannels(chartType, data, semanticTypes, ecGetRecommendation);\n    const validChannels = ecGetTemplateChannels(chartType);\n    const result: Record<string, string> = {};\n    for (const [ch, field] of Object.entries(rec)) {\n        if (validChannels.includes(ch)) result[ch] = field;\n    }\n    return result;\n}\n\n/** Chart-type names ECharts can render (its template catalog). */\nconst EC_SUPPORTED_TYPES = ecAllTemplateDefs.map(d => d.chart);\n\n/**\n * Recommend a ranked list of ECharts chart types for a dataset, restricted to\n * chart types ECharts can render. See {@link ecRecommendCharts} for the\n * one-step variant that also fills channels.\n */\nexport function ecRecommendChartTypes(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): string[] {\n    return recommendChartTypes(data, semanticTypes, { ...options, supportedTypes: EC_SUPPORTED_TYPES });\n}\n\n/**\n * One-step recommendation: rank ECharts chart types for the data, then populate\n * each with {@link ecRecommendEncodings}. Suggestions whose required channels\n * cannot be filled are dropped, so every returned chart is renderable.\n */\nexport function ecRecommendCharts(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): RecommendedChart[] {\n    const { max, ...rest } = options;\n    const charts = ecRecommendChartTypes(data, semanticTypes, rest)\n        .map(chartType => ({ chartType, encodings: ecRecommendEncodings(chartType, data, semanticTypes) }))\n        .filter(s => Object.keys(s.encodings).length > 0);\n    return max != null ? charts.slice(0, max) : charts;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Scatter Plot template.\n *\n * Maps scatter semantics to Chart.js config:\n *   VL: encoding.x.field + encoding.y.field → positional channels\n *   CJS: datasets[].data = [{x, y}, ...] with type: 'scatter'\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\n/** Compute a reasonable point radius based on canvas area and point count. */\nfunction computePointRadius(width: number, height: number, pointCount: number): number {\n    const canvasArea = width * height;\n    const areaPerPoint = canvasArea / Math.max(1, pointCount);\n    const idealRadius = Math.sqrt(areaPerPoint * 0.05) / 2;\n    return Math.max(2, Math.min(6, Math.round(idealRadius)));\n}\n\nexport const cjsScatterPlotDef: ChartTemplateDef = {\n    chart: 'Scatter Plot',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'color', 'size', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xField || !yField) return;\n\n        const opacity = chartProperties?.opacity ?? 1;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'scatter',\n            data: { datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: 'linear',\n                        title: { display: true, text: xField },\n                    },\n                    y: {\n                        type: 'linear',\n                        title: { display: true, text: yField },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        // Apply zero-baseline decisions\n        // Chart.js linear scales default beginAtZero to false, so we must\n        // explicitly set true when the semantic decision includes zero.\n        if (channelSemantics.x?.zero) {\n            config.options.scales.x.beginAtZero = channelSemantics.x.zero.zero !== false;\n        }\n        if (channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        if (colorField) {\n            // Multi-series: group by color field\n            const groups = new Map<string, { x: number; y: number }[]>();\n            for (const row of table) {\n                const key = String(row[colorField] ?? '');\n                if (!groups.has(key)) groups.set(key, []);\n                groups.get(key)!.push({ x: row[xField], y: row[yField] });\n            }\n\n            let colorIdx = 0;\n            for (const [name, data] of groups) {\n                config.data.datasets.push({\n                    label: name,\n                    data,\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx, opacity),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    borderWidth: 1,\n                    pointRadius: 4,\n                });\n                colorIdx++;\n            }\n            config.options.plugins.legend = { display: true };\n        } else {\n            const data = table.map(row => ({ x: row[xField], y: row[yField] }));\n            config.data.datasets.push({\n                data,\n                backgroundColor: getSeriesBackgroundColor(palette, 0, opacity),\n                borderColor: getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n                pointRadius: 4,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        // Write Chart.js config into spec\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 1 },\n    ],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color', 'size']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ transitions declared centrally in core/chart-transitions.ts.\n    }),\n    postProcess: (option, ctx) => {\n        if (!option.data?.datasets) return;\n        const w = option._width || ctx.canvasSize.width;\n        const h = option._height || ctx.canvasSize.height;\n        const pointCount = ctx.table.length;\n        const radius = computePointRadius(w, h, pointCount);\n        for (const ds of option.data.datasets) {\n            if (ds.pointRadius == null || ds.pointRadius === 4) {\n                ds.pointRadius = radius;\n            }\n        }\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Connected Scatter Plot template.\n *\n * Points plotted in 2-D (x, y both quantitative) and **connected by a straight\n * line in a defined order** (usually time / sequence), tracing a trajectory.\n * Shows the x↔y correlation AND the ordered path at once — distinct from a\n * plain scatter (no order, no line) and from a regression (a fitted trend).\n *\n * Mirrors cjsScatterPlotDef (points) and cjsLineChartDef (connecting line).\n *\n * Contract:\n *   x      — quantitative (linear axis).\n *   y      — quantitative (linear axis).\n *   order  — the sequence field; each dataset's points are **pre-sorted by this\n *            field** so the line follows the trajectory, NOT the x value. With\n *            `tension:0` the segments stay straight, so a looping path crosses\n *            itself.\n *   color  — optional series → one dataset (trajectory) per value (legend).\n *   detail — optional series → one trajectory per value (used when color absent).\n *\n * Each dataset is a `scatter` with `showLine:true` so both the points and the\n * connecting line are drawn.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    groupBy,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\n\n/**\n * Stable sort of `rows` by the sequence `field`. Detection is value-based so it\n * works for any order field type: numeric (years / step indices) sort\n * numerically, date-parseable values sort chronologically, everything else\n * sorts lexically. Ties keep their original row order.\n */\nfunction sortByOrder(rows: any[], field: string | undefined): any[] {\n    if (!field) return rows;\n    const tagged = rows.map((row, idx) => ({ row, idx, key: row[field] }));\n    const present = tagged.filter(t => t.key != null && t.key !== '');\n    const allNumeric = present.length > 0 &&\n        present.every(t => typeof t.key === 'number' ||\n            (typeof t.key === 'string' && t.key.trim() !== '' && !isNaN(Number(t.key))));\n    const allDates = !allNumeric && present.length > 0 &&\n        present.every(t => !isNaN(Date.parse(String(t.key))));\n    const rank = (k: any): number | string => {\n        if (allNumeric) return Number(k);\n        if (allDates) return Date.parse(String(k));\n        return String(k);\n    };\n    return [...tagged].sort((a, b) => {\n        const ra = rank(a.key);\n        const rb = rank(b.key);\n        if (ra < rb) return -1;\n        if (ra > rb) return 1;\n        return a.idx - b.idx; // stable\n    }).map(t => t.row);\n}\n\n/** Build the {x, y} point list for a (sorted) set of rows. */\nfunction toPoints(rows: any[], xField: string, yField: string): { x: number; y: number }[] {\n    return rows.map(r => ({ x: Number(r[xField]), y: Number(r[yField]) }));\n}\n\nexport const cjsConnectedScatterDef: ChartTemplateDef = {\n    chart: 'Connected Scatter Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'order', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const orderField = channelSemantics.order?.field;\n        // One trajectory per dataset: prefer color, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'scatter',\n            data: { datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: 'linear',\n                        title: { display: true, text: xField },\n                        ticks: { font: { size: 10 } },\n                    },\n                    y: {\n                        type: 'linear',\n                        title: { display: true, text: yField },\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                    legend: { display: false },\n                },\n            },\n        };\n\n        // A trajectory reads its shape, not the distance from zero — fit the\n        // data unless the zero decision forces a zero baseline.\n        if (channelSemantics.x?.zero) {\n            config.options.scales.x.beginAtZero = channelSemantics.x.zero.zero !== false;\n        }\n        if (channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        const baseDataset = {\n            // Straight segments + visible points connecting the trajectory.\n            showLine: true,\n            tension: 0,\n            borderWidth: 2,\n            pointRadius: 4,\n            fill: false,\n            // Don't clip points at the chart-area edge: a point that lands\n            // exactly on an axis bound would otherwise have its marker cut off.\n            clip: false,\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            config.options.plugins.legend = { display: true };\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const sorted = sortByOrder(rows, orderField);\n                config.data.datasets.push({\n                    label: name,\n                    data: toPoints(sorted, xField, yField),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx, 1),\n                    ...baseDataset,\n                });\n                colorIdx++;\n            }\n        } else {\n            const sorted = sortByOrder(table, orderField);\n            config.data.datasets.push({\n                label: yField,\n                data: toPoints(sorted, xField, yField),\n                borderColor: getSeriesBorderColor(palette, 0),\n                backgroundColor: getSeriesBackgroundColor(palette, 0, 1),\n                ...baseDataset,\n            });\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Bubble Chart template.\n *\n * Contrast with VL / Scatter:\n *   VL: encoding.x + encoding.y + encoding.size (quantitative) → point area\n *   CJS: native type 'bubble' with data = [{x, y, r}, ...] where `r` is a\n *        per-point pixel radius derived (area-proportionally) from the size\n *        channel. Optional color channel groups points into datasets.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\n\n/**\n * Build an area-proportional value → pixel-radius mapper for the size channel.\n * Returns a constant-radius mapper when there is no usable size field.\n */\nfunction makeRadiusScale(\n    values: number[],\n    rMin: number,\n    rMax: number,\n): (v: number) => number {\n    const finite = values.filter((v) => typeof v === 'number' && isFinite(v));\n    if (finite.length === 0) {\n        const mid = Math.round((rMin + rMax) / 2);\n        return () => mid;\n    }\n    const min = Math.min(...finite);\n    const max = Math.max(...finite);\n    if (min === max) {\n        const mid = Math.round((rMin + rMax) / 2);\n        return () => mid;\n    }\n    // Area-proportional: interpolate area (r^2) linearly, then take sqrt.\n    const aMin = rMin * rMin;\n    const aMax = rMax * rMax;\n    return (v: number) => {\n        if (typeof v !== 'number' || !isFinite(v)) return rMin;\n        const t = (v - min) / (max - min);\n        const area = aMin + t * (aMax - aMin);\n        return Math.max(rMin, Math.sqrt(area));\n    };\n}\n\nexport const cjsBubbleChartDef: ChartTemplateDef = {\n    chart: 'Bubble Chart',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'size', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const sizeField = channelSemantics.size?.field;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xField || !yField) return;\n\n        const opacity = chartProperties?.opacity ?? 0.6;\n        const palette = getChartJsPalette(ctx, 'color');\n\n        // Radius scale spans the whole dataset so groups stay comparable.\n        const sizeValues = sizeField\n            ? table.map((row) => Number(row[sizeField]))\n            : [];\n        // Provisional radius range; postProcess refines rMax to canvas size.\n        const radiusScale = makeRadiusScale(sizeValues, 5, 24);\n\n        const toPoint = (row: any) => {\n            const v = sizeField ? Number(row[sizeField]) : NaN;\n            return {\n                x: Number(row[xField]),\n                y: Number(row[yField]),\n                r: sizeField ? radiusScale(v) : 8,\n                // Raw size value retained so postProcess can rescale to canvas.\n                _v: v,\n            };\n        };\n\n        const config: any = {\n            type: 'bubble',\n            data: { datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    // Bubble charts scale to the data extent (not a zero\n                    // baseline) and pad both ends with `grace` so large bubbles\n                    // sitting at the min/max aren't clipped by the plot edge.\n                    x: { type: 'linear', grace: '10%', title: { display: true, text: xField } },\n                    y: { type: 'linear', grace: '10%', title: { display: true, text: yField } },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        if (colorField) {\n            const groups = new Map<string, any[]>();\n            for (const row of table) {\n                const key = String(row[colorField] ?? '');\n                if (!groups.has(key)) groups.set(key, []);\n                groups.get(key)!.push(toPoint(row));\n            }\n            let colorIdx = 0;\n            for (const [name, data] of groups) {\n                config.data.datasets.push({\n                    label: name,\n                    data,\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx, opacity),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    borderWidth: 1,\n                });\n                colorIdx++;\n            }\n            config.options.plugins.legend = { display: true };\n        } else {\n            config.data.datasets.push({\n                data: table.map(toPoint),\n                backgroundColor: getSeriesBackgroundColor(palette, 0, opacity),\n                borderColor: getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        // Stash size metadata so postProcess can rescale radii to the final canvas.\n        config._sizeField = sizeField ?? null;\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 0.6 },\n    ],\n    postProcess: (option, ctx) => {\n        if (!option.data?.datasets) return;\n        const sizeField: string | null = option._sizeField ?? null;\n        delete option._sizeField;\n        if (!sizeField) {\n            // Strip helper field even when no size channel is present.\n            for (const ds of option.data.datasets) for (const pt of ds.data) delete pt._v;\n            return;\n        }\n\n        // Collect all raw size values to build a dataset-wide radius scale.\n        const allValues: number[] = [];\n        for (const ds of option.data.datasets) {\n            for (const pt of ds.data) allValues.push(pt._v);\n        }\n\n        // Scale the max bubble radius to the canvas AND point density so dense\n        // plots don't turn into a blob.\n        const w = option._width || ctx.canvasSize.width;\n        const h = option._height || ctx.canvasSize.height;\n        const minDim = Math.min(w, h);\n        const count = Math.max(1, allValues.length);\n        const rMaxByDensity = Math.sqrt((w * h) / count * 0.08);\n        const rMax = Math.max(8, Math.min(34, Math.round(Math.min(minDim * 0.09, rMaxByDensity))));\n        const rMin = Math.max(3, Math.round(rMax * 0.22));\n        const radiusScale = makeRadiusScale(allValues, rMin, rMax);\n\n        for (const ds of option.data.datasets) {\n            for (const pt of ds.data) {\n                const v = pt._v;\n                if (typeof v === 'number' && isFinite(v)) pt.r = radiusScale(v);\n                delete pt._v;\n            }\n        }\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Strip Plot — scatter points jittered along a categorical axis.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport {\n    extractCategories,\n    groupBy,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nfunction clamp01(value: number): number {\n    return Math.max(0, Math.min(1, value));\n}\n\nfunction hexToRgb(color: string): [number, number, number] | undefined {\n    const hex = color.trim().replace(/^#/, '');\n    if (!/^[0-9a-fA-F]{6}$/.test(hex)) return undefined;\n    return [\n        parseInt(hex.slice(0, 2), 16),\n        parseInt(hex.slice(2, 4), 16),\n        parseInt(hex.slice(4, 6), 16),\n    ];\n}\n\nfunction continuousColor(palette: string[], value: number, min: number, max: number, alpha: number): string {\n    const colors = palette.length > 0 ? palette : ['#440154', '#fde725'];\n    const span = max > min ? max - min : 1;\n    const scaled = clamp01((value - min) / span) * (colors.length - 1);\n    const lo = Math.floor(scaled);\n    const hi = Math.min(colors.length - 1, Math.ceil(scaled));\n    const t = scaled - lo;\n    const left = hexToRgb(colors[lo]);\n    const right = hexToRgb(colors[hi]);\n    if (!left || !right) return colors[lo];\n    const mix = (a: number, b: number) => Math.round(a + (b - a) * t);\n    return `rgba(${mix(left[0], right[0])}, ${mix(left[1], right[1])}, ${mix(left[2], right[2])}, ${alpha})`;\n}\n\nfunction jitter(seed: number): () => number {\n    let state = seed;\n    return () => {\n        state = (state * 1103515245 + 12345) & 0x7fffffff;\n        return (state / 0x7fffffff) * 2 - 1;\n    };\n}\n\nexport const cjsStripPlotDef: ChartTemplateDef = {\n    chart: 'Strip Plot',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'color', 'size', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { defaultBandSize: 50, minStep: 16 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n        const isTemporalColor = colorType === 'temporal';\n        if (!xField || !yField) return;\n\n        const xIsDiscrete = isDiscrete(xCS?.type);\n        const yIsDiscrete = isDiscrete(yCS?.type);\n        const catAxis: 'x' | 'y' = xIsDiscrete ? 'x' : yIsDiscrete ? 'y' : 'x';\n        const contAxis: 'x' | 'y' = catAxis === 'x' ? 'y' : 'x';\n        const catField = catAxis === 'x' ? xField : yField;\n        const contField = contAxis === 'x' ? xField : yField;\n        const catSemantics = catAxis === 'x' ? xCS : yCS;\n        const categories = extractCategories(table, catField, catSemantics?.ordinalSortOrder);\n        const categoryIndex = new Map(categories.map((category, index) => [String(category), index]));\n        const nextJitter = jitter(42);\n        const jitterHalfWidth = 0.3;\n        const palette = getChartJsPalette(ctx, isDiscrete(colorType) ? 'color' : 'group');\n        const opacity = chartProperties?.opacity ?? 0.7;\n        const explicitPointSize = Number(chartProperties?.pointSize ?? 0);\n        const pointRadius = explicitPointSize > 0\n            ? Math.max(1, Math.min(10, Math.round(explicitPointSize / 12)))\n            : 3;\n        const toColorValue = (value: any) => {\n            if (value == null) return NaN;\n            return isTemporalColor ? new Date(value).getTime() : Number(value);\n        };\n        const continuousColorValues = isContinuousColor && colorField\n            ? table.map((row: any) => toColorValue(row[colorField])).filter((value: number) => Number.isFinite(value))\n            : [];\n        const colorMin = continuousColorValues.length ? Math.min(...continuousColorValues) : 0;\n        const colorMax = continuousColorValues.length ? Math.max(...continuousColorValues) : 1;\n        const pointColors = isContinuousColor && colorField\n            ? table.map((row: any) => continuousColor(palette, toColorValue(row[colorField]), colorMin, colorMax, opacity))\n            : undefined;\n\n        const buildPoint = (row: any) => {\n            const category = String(row[catField] ?? '');\n            const index = categoryIndex.get(category) ?? 0;\n            const categoryValue = index + nextJitter() * jitterHalfWidth;\n            const continuousValue = row[contField];\n            return catAxis === 'x'\n                ? { x: categoryValue, y: continuousValue }\n                : { x: continuousValue, y: categoryValue };\n        };\n\n        const categoryScale = {\n            type: 'linear' as const,\n            min: -0.5,\n            max: Math.max(0.5, categories.length - 0.5),\n            title: { display: true, text: catField },\n            ticks: {\n                stepSize: 1,\n                callback(value: number | string) {\n                    const index = Math.round(Number(value));\n                    return categories[index] ?? '';\n                },\n            },\n        };\n        const continuousScale = {\n            type: 'linear' as const,\n            title: { display: true, text: contField },\n            ticks: { font: { size: 10 } },\n        };\n\n        const config: any = {\n            type: 'scatter',\n            data: { datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: catAxis === 'x'\n                    ? { x: categoryScale, y: continuousScale }\n                    : { x: continuousScale, y: categoryScale },\n                plugins: {\n                    tooltip: { enabled: true },\n                    legend: { display: !!colorField && isDiscrete(colorType) },\n                },\n            },\n        };\n\n        if (colorField && isDiscrete(colorType)) {\n            let colorIndex = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                config.data.datasets.push({\n                    label: name,\n                    data: rows.map(buildPoint),\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIndex, opacity),\n                    borderColor: getSeriesBorderColor(palette, colorIndex),\n                    borderWidth: 1,\n                    pointRadius,\n                });\n                colorIndex++;\n            }\n        } else {\n            config.data.datasets.push({\n                data: table.map(buildPoint),\n                backgroundColor: pointColors ?? getSeriesBackgroundColor(palette, 0, opacity),\n                borderColor: pointColors ?? getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n                pointRadius,\n            });\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'stepWidth', label: 'Jitter', type: 'continuous', min: 10, max: 100, step: 5, defaultValue: 20 },\n        { key: 'pointSize', label: 'Size', type: 'continuous', min: 0, max: 150, step: 5, defaultValue: 0 },\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0, max: 1, step: 0.05, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    pivot: makeCartesianPivot({\n        // θ (Strip → Scatter) declared centrally in core/chart-transitions.ts.\n    }),\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Bar Chart templates: Bar, Stacked Bar, Grouped Bar.\n *\n * Key contrast with Vega-Lite:\n *   VL: encoding channels determine stacking/grouping implicitly\n *   CJS: explicit datasets[] with stacked option on scales\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport {\n  resolveCategoryOrder,\n  groupBy,\n  detectAxes,\n  buildCategoryAlignedData,\n  getChartJsPalette,\n  getSeriesBorderColor,\n  getSeriesBackgroundColor,\n} from './utils';\nimport {\n    detectBandedAxisFromSemantics, detectBandedAxisForceDiscrete,\n} from '../../core/axis-detection';\nimport { planBandDodge, resolveDodge } from '../../core/band-dodge';\nimport { makeCartesianPivot } from '../../core/pivot';\nimport { makeSortAction } from '../../core/encoding-actions';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n// ─── Bar Chart ──────────────────────────────────────────────────────────────\n\nexport const cjsBarChartDef: ChartTemplateDef = {\n    chart: 'Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder,\n            sortBy: sortByField,\n            sortOrder: catEnc?.sortOrder,\n        });\n        const values = buildCategoryAlignedData(table, catField, valField, categories);\n\n        const isHorizontal = categoryAxis === 'y';\n\n        const palette = getChartJsPalette(ctx);\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels: categories,\n                datasets: [{\n                    label: valField,\n                    data: values,\n                    backgroundColor: getSeriesBackgroundColor(palette, 0),\n                    borderColor: getSeriesBorderColor(palette, 0),\n                    borderWidth: 1,\n                    borderRadius: chartProperties?.cornerRadius ?? 0,\n                }],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                indexAxis: isHorizontal ? 'y' as const : 'x' as const,\n                scales: {\n                    x: {\n                        title: { display: true, text: isHorizontal ? valField : catField },\n                        ...(isHorizontal ? {} : {}),\n                    },\n                    y: {\n                        title: { display: true, text: isHorizontal ? catField : valField },\n                    },\n                },\n                plugins: {\n                    legend: { display: false },\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        // Apply zero-baseline from semantic decision\n        const valScale = isHorizontal ? 'x' : 'y';\n        const valCS = channelSemantics[valueAxis];\n        if (valCS?.zero) {\n            config.options.scales[valScale].beginAtZero = valCS.zero.zero !== false;\n        } else {\n            // Default: bars should include zero for length integrity\n            config.options.scales[valScale].beginAtZero = true;\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'cornerRadius', label: 'Corners', type: 'continuous', min: 0, max: 15, step: 1, defaultValue: 0 },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n\n// ─── Stacked Bar Chart ──────────────────────────────────────────────────────\n\nexport const cjsStackedBarChartDef: ChartTemplateDef = {\n    chart: 'Stacked Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const colorField = channelSemantics.color?.field;\n        const hasStackSeries = !!colorField;\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder,\n            sortBy: sortByField,\n            sortOrder: catEnc?.sortOrder,\n        });\n        const isHorizontal = categoryAxis === 'y';\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels: categories,\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                indexAxis: isHorizontal ? 'y' as const : 'x' as const,\n                scales: {\n                    x: {\n                        stacked: hasStackSeries,\n                        title: { display: true, text: isHorizontal ? valField : catField },\n                    },\n                    y: {\n                        stacked: hasStackSeries,\n                        title: { display: true, text: isHorizontal ? catField : valField },\n                    },\n                },\n                plugins: {\n                    legend: { display: !!colorField },\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const values = buildCategoryAlignedData(rows, catField, valField, categories);\n                config.data.datasets.push({\n                    label: name,\n                    data: values,\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    borderWidth: 1,\n                });\n                colorIdx++;\n            }\n        } else {\n            const values = buildCategoryAlignedData(table, catField, valField, categories);\n            config.data.datasets.push({\n                label: valField,\n                data: values,\n                backgroundColor: getSeriesBackgroundColor(palette, 0),\n                borderColor: getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n            });\n        }\n\n        // Apply zero-baseline from semantic decision\n        const valScaleS = isHorizontal ? 'x' : 'y';\n        const valCSs = channelSemantics[valueAxis];\n        if (valCSs?.zero) {\n            config.options.scales[valScaleS].beginAtZero = valCSs.zero.zero !== false;\n        } else {\n            config.options.scales[valScaleS].beginAtZero = true;\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Grouped Bar) declared centrally in core/chart-transitions.ts.\n    }),\n};\n\n// ─── Grouped Bar Chart ──────────────────────────────────────────────────────\n\nexport const cjsGroupedBarChartDef: ChartTemplateDef = {\n    chart: 'Grouped Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'group', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table, chartProperties) => {\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        const decl: any = {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n        const groupField = cs.group?.field || cs.color?.field;\n        const axisField = result?.axis ? cs[result.axis]?.field : (isDiscrete(cs.x?.type) ? cs.x?.field : cs.y?.field);\n        if (groupField && axisField) {\n            const plan = planBandDodge(table, axisField, groupField);\n            const { mode } = resolveDodge(plan, chartProperties?.dodge);\n            if (mode === 'local') decl.groupLaneCount = Math.max(1, plan.maxPerBand);\n        }\n        return decl;\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const groupField = channelSemantics.group?.field || channelSemantics.color?.field;\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder,\n            sortBy: sortByField,\n            sortOrder: catEnc?.sortOrder,\n        });\n        const isHorizontal = categoryAxis === 'y';\n\n        const palette = getChartJsPalette(ctx, 'group');\n\n        // Decide compact (local) vs fixed-lane (global) dodge.\n        const dodgePlan = groupField ? planBandDodge(table, catField, groupField) : null;\n        const dodgeMode = dodgePlan ? resolveDodge(dodgePlan, chartProperties?.dodge).mode : 'none';\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels: categories,\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                indexAxis: isHorizontal ? 'y' as const : 'x' as const,\n                scales: {\n                    x: {\n                        title: { display: true, text: isHorizontal ? valField : catField },\n                    },\n                    y: {\n                        title: { display: true, text: isHorizontal ? catField : valField },\n                    },\n                },\n                plugins: {\n                    legend: { display: !!groupField },\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        if (groupField && dodgeMode === 'local') {\n            // Local (compact) dodge: pack only `maxPerBand` lanes per band,\n            // left-aligned. Each lane is a dataset; a band with fewer present\n            // groups leaves trailing lanes null. Bars are colored per-datum by\n            // their group value, and a custom legend maps group → swatch (lane\n            // dataset labels are synthetic).\n            const globalGroups: string[] = [...new Set(table.map((r) => String(r[groupField] ?? '')))].filter(Boolean).sort();\n            const colorFor = (g: string) => getSeriesBackgroundColor(palette, Math.max(0, globalGroups.indexOf(g)));\n            const borderFor = (g: string) => getSeriesBorderColor(palette, Math.max(0, globalGroups.indexOf(g)));\n\n            // Per-band ordered present groups → lane index.\n            const perBand = new Map<string, string[]>();\n            for (const cat of categories) perBand.set(cat, []);\n            for (const r of table) {\n                const cat = String(r[catField] ?? '');\n                const g = String(r[groupField] ?? '');\n                if (!perBand.has(cat) || !g) continue;\n                const arr = perBand.get(cat)!;\n                if (!arr.includes(g)) arr.push(g);\n            }\n            for (const arr of perBand.values()) arr.sort();\n            const maxPerBand = Math.max(1, ...[...perBand.values()].map((a) => a.length));\n\n            const valAt = new Map<string, number>();\n            for (const r of table) {\n                const v = Number(r[valField]);\n                if (isFinite(v)) valAt.set(`${r[catField]}\\u0000${r[groupField]}`, v);\n            }\n\n            for (let lane = 0; lane < maxPerBand; lane++) {\n                const data: (number | null)[] = [];\n                const bg: string[] = [];\n                const bd: string[] = [];\n                for (const cat of categories) {\n                    const g = perBand.get(cat)?.[lane];\n                    if (g === undefined) { data.push(null); bg.push('transparent'); bd.push('transparent'); continue; }\n                    const v = valAt.get(`${cat}\\u0000${g}`);\n                    data.push(v === undefined ? null : v);\n                    bg.push(colorFor(g));\n                    bd.push(borderFor(g));\n                }\n                config.data.datasets.push({\n                    label: `__lane${lane}`,\n                    data,\n                    backgroundColor: bg,\n                    borderColor: bd,\n                    borderWidth: 1,\n                });\n            }\n\n            // Custom legend: one swatch per group value (not per lane).\n            config.options.plugins.legend = {\n                display: true,\n                labels: {\n                    generateLabels: () => globalGroups.map((g) => ({\n                        text: g,\n                        fillStyle: colorFor(g),\n                        strokeStyle: borderFor(g),\n                        lineWidth: 1,\n                    })),\n                },\n            };\n        } else if (groupField) {\n            const groups = groupBy(table, groupField);\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const values = buildCategoryAlignedData(rows, catField, valField, categories);\n                config.data.datasets.push({\n                    label: name,\n                    data: values,\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    borderWidth: 1,\n                });\n                colorIdx++;\n            }\n        } else {\n            const values = buildCategoryAlignedData(table, catField, valField, categories);\n            config.data.datasets.push({\n                label: valField,\n                data: values,\n                backgroundColor: getSeriesBackgroundColor(palette, 0),\n                borderColor: getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n            });\n        }\n\n        // Apply zero-baseline from semantic decision\n        const valScaleG = isHorizontal ? 'x' : 'y';\n        const valCSg = channelSemantics[valueAxis];\n        if (valCSg?.zero) {\n            config.options.scales[valScaleG].beginAtZero = valCSg.zero.zero !== false;\n        } else {\n            config.options.scales[valScaleG].beginAtZero = true;\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'dodge', label: 'Dodge', type: 'discrete',\n            options: [\n                { value: 'auto',   label: 'Auto' },\n                { value: 'local',  label: 'Local (compact)' },\n                { value: 'global', label: 'Global (aligned)' },\n            ],\n            defaultValue: 'auto',\n            check: (ctx) => {\n                const isDisc = (t: string | undefined) => t === 'nominal' || t === 'ordinal';\n                const groupField = ctx.channelSemantics?.group?.field\n                    ?? ctx.channelSemantics?.color?.field\n                    ?? ctx.encodings?.group?.field\n                    ?? ctx.encodings?.color?.field;\n                const axisField = isDisc(ctx.channelSemantics?.x?.type)\n                    ? ctx.channelSemantics?.x?.field\n                    : ctx.channelSemantics?.y?.field;\n                const rows = ctx.data;\n                if (!groupField || !axisField || !rows) return { applicable: false };\n                const plan = planBandDodge(rows, axisField, groupField);\n                return { applicable: plan.ambiguous, recommendedValue: plan.mode === 'none' ? 'auto' : plan.mode };\n            },\n        },\n    ] as ChartPropertyDef[],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n        // θ (→ Stacked Bar) declared centrally in core/chart-transitions.ts.\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Combo (Bar + Line) template.\n *\n * A dual-measure chart: bars for a primary measure and a line for a secondary\n * measure plotted on its own right-hand axis. This is one of the most common\n * dashboard idioms (e.g. revenue bars + growth-rate line).\n *\n * Data model:\n *   x  (nominal)      → shared category axis\n *   y  (quantitative) → the BAR measure (left axis)\n *   line measure      → the LINE measure (right axis); chosen from\n *                       `chartProperties.lineField`, else the first other\n *                       numeric field in the data.\n *   color is intentionally not used — the two series ARE the legend.\n *\n * Chart.js renders this as a base `type: 'bar'` chart with one dataset\n * overridden to `type: 'line'` and bound to a secondary `y1` scale.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    extractCategories,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\nimport { detectBandedAxisFromSemantics } from '../../core/axis-detection';\n\n/** A field is numeric if (nearly) all of its non-null values parse as numbers. */\nfunction isNumericField(table: any[], field: string): boolean {\n    let total = 0;\n    let numeric = 0;\n    for (const row of table) {\n        const v = row[field];\n        if (v == null || v === '') continue;\n        total++;\n        if (typeof v === 'number' ? isFinite(v) : !isNaN(Number(v))) numeric++;\n    }\n    return total > 0 && numeric / total >= 0.9;\n}\n\nexport const cjsComboChartDef: ChartTemplateDef = {\n    chart: 'Combo Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const catField = channelSemantics.x?.field;\n        const barField = channelSemantics.y?.field;\n        if (!catField || !barField || table.length === 0) return;\n\n        // Resolve the line measure: explicit override, else first other numeric field.\n        const lineField: string | undefined =\n            (chartProperties?.lineField && chartProperties.lineField in table[0])\n                ? chartProperties.lineField\n                : Object.keys(table[0]).find(\n                    (k) => k !== catField && k !== barField && isNumericField(table, k),\n                );\n\n        const categories = extractCategories(table, catField, channelSemantics.x?.ordinalSortOrder);\n        const barData = buildCategoryAlignedData(table, catField, barField, categories);\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const datasets: any[] = [{\n            type: 'bar' as const,\n            label: barField,\n            data: barData,\n            yAxisID: 'y',\n            order: 2,\n            backgroundColor: getSeriesBackgroundColor(palette, 0),\n            borderColor: getSeriesBorderColor(palette, 0),\n            borderWidth: 1,\n            borderRadius: chartProperties?.cornerRadius ?? 0,\n        }];\n\n        if (lineField) {\n            const lineData = buildCategoryAlignedData(table, catField, lineField, categories);\n            datasets.push({\n                type: 'line' as const,\n                label: lineField,\n                data: lineData,\n                yAxisID: 'y1',\n                order: 1,\n                borderColor: getSeriesBorderColor(palette, 1),\n                backgroundColor: 'transparent',\n                borderWidth: 2,\n                pointRadius: 3,\n                tension: 0.3,\n                fill: false,\n            });\n        }\n\n        const config: any = {\n            type: 'bar',\n            data: { labels: categories, datasets },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        title: { display: true, text: catField },\n                    },\n                    y: {\n                        type: 'linear' as const,\n                        position: 'left' as const,\n                        beginAtZero: channelSemantics.y?.zero ? channelSemantics.y.zero.zero !== false : true,\n                        title: { display: true, text: barField },\n                    },\n                    ...(lineField ? {\n                        y1: {\n                            type: 'linear' as const,\n                            position: 'right' as const,\n                            title: { display: true, text: lineField },\n                            // Don't draw the right axis grid over the bars.\n                            grid: { drawOnChartArea: false },\n                        },\n                    } : {}),\n                },\n                plugins: {\n                    legend: { display: true },\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'cornerRadius', label: 'Corners', type: 'continuous', min: 0, max: 15, step: 1, defaultValue: 0 },\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Line Chart template (single + multi-series).\n *\n * Contrast with VL:\n *   VL: encoding.x + encoding.y + encoding.color → auto-groups into lines\n *   CJS: explicit datasets[] — each dataset is one line\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    coerceUnixMsForChartJs,\n} from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const cjsLineChartDef: ChartTemplateDef = {\n    chart: 'Line Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, fullTable, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n\n        const mapContinuousX = (raw: unknown) =>\n            (xIsTemporal ? coerceUnixMsForChartJs(raw) : raw);\n\n        // For a continuous (linear) x-scale, Chart.js auto-computes a \"nice\"\n        // range that, on large Unix-ms timestamps, balloons far beyond the\n        // data extent and squeezes the plotted line into a narrow band. Pin\n        // the scale to the actual data extent — computed from the full table\n        // so faceted small multiples share one aligned x-domain (matching the\n        // Vega-Lite output).\n        let continuousXExtent: { min: number; max: number } | undefined;\n        if (!xIsDiscrete) {\n            const xNums = (fullTable ?? table)\n                .map((r: any) => mapContinuousX(r[xField]))\n                .filter((v: any): v is number => typeof v === 'number' && Number.isFinite(v));\n            if (xNums.length > 0) {\n                continuousXExtent = { min: Math.min(...xNums), max: Math.max(...xNums) };\n            }\n        }\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        // Determine tension for interpolation\n        const interpolate = chartProperties?.interpolate;\n        const tension = (interpolate === 'monotone' || interpolate === 'basis' ||\n                         interpolate === 'cardinal' || interpolate === 'catmull-rom')\n            ? 0.4 : 0;\n        const stepped = interpolate === 'step' ? 'middle' as const\n                      : interpolate === 'step-before' ? 'before' as const\n                      : interpolate === 'step-after' ? 'after' as const\n                      : false as const;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: {\n                labels: categories || [],\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: xIsDiscrete ? 'category' : 'linear',\n                        title: { display: true, text: xField },\n                        ...(continuousXExtent\n                            ? { min: continuousXExtent.min, max: continuousXExtent.max }\n                            : {}),\n                        ticks: {\n                            font: { size: 10 },\n                            ...(xIsTemporal\n                                ? {\n                                    maxTicksLimit: 4,\n                                    autoSkip: true,\n                                    maxRotation: 0,\n                                    callback(v: number | string) {\n                                        const n = typeof v === 'number' ? v : Number(v);\n                                        if (!Number.isFinite(n)) return String(v);\n                                        // Drop the day for spans longer than ~2\n                                        // months so faceted (narrow) panels don't\n                                        // collide long \"Apr 18, 2025\" labels.\n                                        const spanDays = continuousXExtent\n                                            ? (continuousXExtent.max - continuousXExtent.min) / 86_400_000\n                                            : 0;\n                                        const opts: Intl.DateTimeFormatOptions = spanDays > 60\n                                            ? { month: 'short', year: 'numeric' }\n                                            : { month: 'short', day: 'numeric', year: 'numeric' };\n                                        return new Date(n).toLocaleDateString(undefined, opts);\n                                    },\n                                }\n                                : {}),\n                        },\n                    },\n                    y: {\n                        type: 'linear',\n                        title: { display: true, text: yField },\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        // Zero-baseline: Chart.js defaults beginAtZero to false, so\n        // explicitly set true when the semantic decision includes zero.\n        if (channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            config.options.plugins.legend = { display: true };\n\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const data = xIsDiscrete\n                    ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                    : rows\n                        .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                        .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n                config.data.datasets.push({\n                    label: name,\n                    data,\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    backgroundColor: 'transparent',\n                    tension,\n                    stepped,\n                    pointRadius: 3,\n                    fill: false,\n                });\n                colorIdx++;\n            }\n        } else {\n            const data = xIsDiscrete\n                ? categories!.map(cat => {\n                    const row = table.find(r => String(r[xField]) === cat);\n                    return row ? row[yField] : null;\n                })\n                : table\n                    .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                    .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n            config.data.datasets.push({\n                label: yField,\n                data,\n                borderColor: getSeriesBorderColor(palette, 0),\n                backgroundColor: 'transparent',\n                tension,\n                stepped,\n                pointRadius: 3,\n                fill: false,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n    ],\n    pivot: makeCartesianPivot({\n        permute: [['y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Bump Chart — line with points, rank axis reversed so rank 1 sits on\n * top (mirror of ecBumpChartDef in echarts/templates/line.ts and\n * vegalite/templates/bump.ts).\n *\n * Unlike ECharts — where a value-axis `inverse` moves the x-axis to the top,\n * forcing a category-index workaround — Chart.js reverses a linear scale in\n * place (`reverse: true`), so series keep their real rank values and the\n * config stays pure JSON with no tooltip formatter.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    coerceUnixMsForChartJs,\n} from './utils';\nimport { toTypeString } from '../../core/field-semantics';\n\n/** Semantic types that indicate a rank-like field (mirror vegalite/templates/bump.ts). */\nconst RANK_SEMANTIC_TYPES = new Set(['Rank', 'Score', 'Level']);\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const cjsBumpChartDef: ChartTemplateDef = {\n    chart: 'Bump Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 80, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, fullTable, semanticTypes } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const ySemType = toTypeString(semanticTypes?.[yField]);\n        const xSemType = toTypeString(semanticTypes?.[xField]);\n        const yIsRank = RANK_SEMANTIC_TYPES.has(ySemType);\n        const xIsRank = RANK_SEMANTIC_TYPES.has(xSemType);\n        const rankOnY = yIsRank && !xIsRank;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n\n        const mapContinuousX = (raw: unknown) =>\n            (xIsTemporal ? coerceUnixMsForChartJs(raw) : raw);\n\n        // Pin continuous x to the data extent (same reasoning as line.ts:\n        // Chart.js \"nice\" ranges balloon on Unix-ms timestamps).\n        let continuousXExtent: { min: number; max: number } | undefined;\n        if (!xIsDiscrete) {\n            const xNums = (fullTable ?? table)\n                .map((r: any) => mapContinuousX(r[xField]))\n                .filter((v: any): v is number => typeof v === 'number' && Number.isFinite(v));\n            if (xNums.length > 0) {\n                continuousXExtent = { min: Math.min(...xNums), max: Math.max(...xNums) };\n            }\n        }\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        const sortRowsByX = (rows: any[]) =>\n            [...rows].sort((a, b) => {\n                const ax = mapContinuousX(a[xField]);\n                const bx = mapContinuousX(b[xField]);\n                if (typeof ax === 'number' && typeof bx === 'number') return ax - bx;\n                return String(ax).localeCompare(String(bx));\n            });\n\n        const rankValues = table\n            .map((r: any) => Number(r[yField]))\n            .filter((v: number) => !isNaN(v) && isFinite(v));\n        const maxRank = rankValues.length ? Math.max(...rankValues) : 1;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: { labels: categories || [], datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: xIsDiscrete ? 'category' : 'linear',\n                        title: { display: true, text: xField },\n                        ...(continuousXExtent\n                            ? { min: continuousXExtent.min, max: continuousXExtent.max }\n                            : {}),\n                        ticks: {\n                            font: { size: 10 },\n                            ...(xIsTemporal\n                                ? {\n                                    maxTicksLimit: 4,\n                                    autoSkip: true,\n                                    maxRotation: 0,\n                                    callback(v: number | string) {\n                                        const n = typeof v === 'number' ? v : Number(v);\n                                        if (!Number.isFinite(n)) return String(v);\n                                        const spanDays = continuousXExtent\n                                            ? (continuousXExtent.max - continuousXExtent.min) / 86_400_000\n                                            : 0;\n                                        const opts: Intl.DateTimeFormatOptions = spanDays > 60\n                                            ? { month: 'short', year: 'numeric' }\n                                            : { month: 'short', day: 'numeric', year: 'numeric' };\n                                        return new Date(n).toLocaleDateString(undefined, opts);\n                                    },\n                                }\n                                : {}),\n                        },\n                    },\n                    y: rankOnY\n                        ? {\n                            type: 'linear',\n                            reverse: true,\n                            min: 1,\n                            max: maxRank,\n                            title: { display: true, text: yField },\n                            ticks: { font: { size: 10 }, stepSize: 1, precision: 0 },\n                        }\n                        : {\n                            type: 'linear',\n                            title: { display: true, text: yField },\n                            ticks: { font: { size: 10 } },\n                        },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        // Zero-baseline only applies to the non-rank value axis; a reversed\n        // rank axis is pinned to [1, maxRank] instead.\n        if (!rankOnY && channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        const baseDataset = {\n            tension: 0.4,\n            pointRadius: 3,\n            fill: false,\n            backgroundColor: 'transparent',\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            config.options.plugins.legend = { display: true };\n\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const data = xIsDiscrete\n                    ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                    : sortRowsByX(rows)\n                        .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                        .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n                config.data.datasets.push({\n                    label: name,\n                    data,\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    ...baseDataset,\n                });\n                colorIdx++;\n            }\n        } else {\n            const data = xIsDiscrete\n                ? categories!.map(cat => {\n                    const row = table.find(r => String(r[xField]) === cat);\n                    return row ? row[yField] : null;\n                })\n                : sortRowsByX(table)\n                    .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                    .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n            config.data.datasets.push({\n                label: yField,\n                data,\n                borderColor: getSeriesBorderColor(palette, 0),\n                ...baseDataset,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Slope Chart (slopegraph) template.\n *\n * One straight line **per category** connecting that category's value at exactly\n * **two periods**, with a point marker at each end. The read is the slope /\n * direction of change and the crossovers between categories — the 2-point\n * value-change cousin of the Bump Chart. Mirrors cjsLineChartDef where\n * practical.\n *\n * Contract:\n *   x      — period, rendered as a *category* axis with exactly two labels.\n *   y      — value (linear).\n *   color  — category → one line (dataset) per value (legend).\n *   detail — category → one line per value (used when color is absent).\n *\n * Each dataset uses tension 0 (straight) and a visible point at each end.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n} from './utils';\n\n/**\n * Order the period categories naturally: numerically when every label parses as\n * a number, chronologically when every label parses as a date, else preserve\n * the extracted order.\n */\nfunction orderPeriods(categories: string[]): string[] {\n    if (categories.length <= 1) return categories;\n    const allNumeric = categories.every(c => c.trim() !== '' && !isNaN(Number(c)));\n    if (allNumeric) return [...categories].sort((a, b) => Number(a) - Number(b));\n    const allDates = categories.every(c => !isNaN(Date.parse(c)));\n    if (allDates) return [...categories].sort((a, b) => Date.parse(a) - Date.parse(b));\n    return categories;\n}\n\nexport const cjsSlopeChartDef: ChartTemplateDef = {\n    chart: 'Slope Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n        paramOverrides: {\n            defaultBandSize: 120,\n            continuousMarkCrossSection: { x: 0, y: 0, seriesCountAxis: 'auto' },\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        // One line per category: prefer color, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        // Period axis is always a two-label category axis (slopegraph).\n        const categories = orderPeriods(\n            extractCategories(table, xField, xCS.ordinalSortOrder),\n        );\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: { labels: categories, datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: 'category',\n                        // Inset the two period bands so the end points/labels\n                        // are not clipped against the plot edges.\n                        offset: true,\n                        title: { display: true, text: xField },\n                        ticks: { font: { size: 10 } },\n                    },\n                    y: {\n                        type: 'linear',\n                        title: { display: true, text: yField },\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                    legend: { display: false },\n                },\n            },\n        };\n\n        // Slope charts emphasize the change, not the absolute level — let the\n        // value axis fit the data unless the zero decision forces zero.\n        if (channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        const baseDataset = {\n            // Straight segments + visible end points.\n            tension: 0,\n            pointRadius: 4,\n            backgroundColor: 'transparent',\n            fill: false,\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            config.options.plugins.legend = { display: true };\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                config.data.datasets.push({\n                    label: name,\n                    data: buildCategoryAlignedData(rows, xField, yField, categories),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    ...baseDataset,\n                });\n                colorIdx++;\n            }\n        } else {\n            config.data.datasets.push({\n                label: yField,\n                data: buildCategoryAlignedData(table, xField, yField, categories),\n                borderColor: getSeriesBorderColor(palette, 0),\n                ...baseDataset,\n            });\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Area Chart template (single + multi-series).\n *\n * Chart.js renders area charts as line charts with `fill: true`.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n    coerceUnixMsForChartJs,\n} from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const cjsAreaChartDef: ChartTemplateDef = {\n    chart: 'Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapContinuousX = (raw: unknown) =>\n            (xIsTemporal ? coerceUnixMsForChartJs(raw) : raw);\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        const opacity = chartProperties?.opacity ?? 0.4;\n\n        // Stacking\n        const stackMode = chartProperties?.stackMode;\n        const stacked = stackMode !== 'layered';\n\n        // Interpolation\n        const interpolate = chartProperties?.interpolate;\n        const tension = (interpolate === 'monotone' || interpolate === 'basis' ||\n                         interpolate === 'cardinal' || interpolate === 'catmull-rom')\n            ? 0.4 : 0;\n        const stepped = interpolate === 'step' ? 'middle' as const\n                      : interpolate === 'step-before' ? 'before' as const\n                      : interpolate === 'step-after' ? 'after' as const\n                      : false;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: {\n                labels: categories || [],\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: xIsDiscrete ? 'category' : 'linear',\n                        title: { display: true, text: xField },\n                        ticks: {\n                            font: { size: 10 },\n                            ...(xIsTemporal\n                                ? {\n                                    maxTicksLimit: 8,\n                                    callback(v: number | string) {\n                                        const n = typeof v === 'number' ? v : Number(v);\n                                        if (!Number.isFinite(n)) return String(v);\n                                        return new Date(n).toLocaleDateString(undefined, {\n                                            month: 'short',\n                                            day: 'numeric',\n                                            year: 'numeric',\n                                        });\n                                    },\n                                }\n                                : {}),\n                        },\n                    },\n                    y: {\n                        type: 'linear',\n                        title: { display: true, text: yField },\n                        stacked,\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                    filler: { propagate: true },\n                },\n            },\n        };\n\n        // Zero-baseline: Chart.js defaults beginAtZero to false, so\n        // explicitly set true when the semantic decision includes zero.\n        if (channelSemantics.y?.zero) {\n            config.options.scales.y.beginAtZero = channelSemantics.y.zero.zero !== false;\n        }\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            config.options.plugins.legend = { display: true };\n\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                const data = xIsDiscrete\n                    ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                    : rows\n                        .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                        .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n                const borderColor = getSeriesBorderColor(palette, colorIdx);\n                const bgColor = getSeriesBackgroundColor(palette, colorIdx, opacity);\n\n                config.data.datasets.push({\n                    label: name,\n                    data,\n                    borderColor,\n                    backgroundColor: bgColor,\n                    tension,\n                    stepped,\n                    fill: stacked ? 'stack' : 'origin',\n                    pointRadius: 2,\n                });\n                colorIdx++;\n            }\n        } else {\n            const data = xIsDiscrete\n                ? categories!.map(cat => {\n                    const row = table.find(r => String(r[xField]) === cat);\n                    return row ? row[yField] : null;\n                })\n                : table\n                    .map(r => ({ x: mapContinuousX(r[xField]), y: r[yField] }))\n                    .filter(p => p.y != null && (xIsTemporal ? Number.isFinite(p.x as number) : true));\n\n            config.data.datasets.push({\n                label: yField,\n                data,\n                borderColor: getSeriesBorderColor(palette, 0),\n                backgroundColor: getSeriesBackgroundColor(palette, 0, opacity),\n                tension,\n                stepped,\n                fill: 'origin',\n                pointRadius: 2,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 0.4,\n            check: (ctx) => ({\n                applicable: !!ctx.encodings.color?.field && ctx.chartProperties?.stackMode === 'layered',\n            }),\n        } as ChartPropertyDef,\n        {\n            key: 'stackMode', label: 'Stack', type: 'discrete', options: [\n                { value: undefined, label: 'Stacked (default)' },\n                { value: 'layered', label: 'Layered (overlap)' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Range Area Chart (band / high–low / area-range) template.\n *\n * A filled band showing a **low–high range** at each x. Chart.js has no native\n * ranged-area type, so a band is two line datasets per group:\n *\n *   - a LOWER-bound line dataset (`fill: false`);\n *   - an UPPER-bound line dataset that FILLS down to the lower dataset via\n *     `fill: { target: <lowerDatasetIndex> }` with a translucent\n *     `backgroundColor`.\n *\n * Because the upper fills to the lower (not to the origin), the band is a\n * translucent ribbon between the two bounds — it is never drawn down to zero.\n *\n * Contract:\n *   x      — position (category axis for discrete x; linear axis for numeric x;\n *            linear axis with unix-ms points for temporal x).\n *   y      — lower bound (linear).\n *   y2     — upper bound (linear).\n *   color  — optional series → one band (lower+upper pair) per value. The legend\n *            shows one entry per band (the lower datasets are filtered out).\n *\n * Core Chart.js only — no plugins.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n    coerceUnixMsForChartJs,\n} from './utils';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\nexport const cjsRangeAreaChartDef: ChartTemplateDef = {\n    chart: 'Range Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'y2', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: {\n            continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' },\n            facetAspectRatioResistance: 0.5,\n        },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const y2CS = channelSemantics.y2;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field || !y2CS?.field) return;\n        const xField = xCS.field;\n        const lowField = yCS.field;\n        const highField = y2CS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapContinuousX = (raw: unknown) => (xIsTemporal ? coerceUnixMsForChartJs(raw) : Number(raw));\n\n        // Title the value axis with BOTH bound fields (matching Vega-Lite's\n        // native \"low, high\" axis title), falling back to the single name.\n        const valueTitle = lowField === highField ? lowField : `${lowField}, ${highField}`;\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        const opacity = chartProperties?.opacity ?? 0.3;\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: { labels: categories ?? [], datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: xIsDiscrete ? 'category' : 'linear',\n                        title: { display: true, text: xField },\n                        ticks: {\n                            font: { size: 10 },\n                            ...(xIsTemporal\n                                ? {\n                                    maxTicksLimit: 8,\n                                    callback(v: number | string) {\n                                        const n = typeof v === 'number' ? v : Number(v);\n                                        if (!Number.isFinite(n)) return String(v);\n                                        return new Date(n).toLocaleDateString(undefined, {\n                                            month: 'short', day: 'numeric', year: 'numeric',\n                                        });\n                                    },\n                                }\n                                : {}),\n                        },\n                    },\n                    y: {\n                        type: 'linear',\n                        // A ranged area reads its extent, not its distance from\n                        // zero — fit the band rather than forcing a zero baseline.\n                        title: { display: true, text: valueTitle },\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                    legend: { display: false },\n                },\n            },\n        };\n\n        /** Build the lower / upper data arrays for a group of rows. */\n        const buildBoundData = (rows: any[], field: string): any => {\n            if (xIsDiscrete) return buildCategoryAlignedData(rows, xField, field, categories!);\n            return rows\n                .map(r => ({ x: mapContinuousX(r[xField]), y: Number(r[field]) }))\n                .filter(p => Number.isFinite(p.x) && Number.isFinite(p.y))\n                .sort((a, b) => a.x - b.x);\n        };\n\n        const pushBand = (rows: any[], name: string, colorIdx: number) => {\n            const lowerData = buildBoundData(rows, lowField);\n            const upperData = buildBoundData(rows, highField);\n            const border = getSeriesBorderColor(palette, colorIdx);\n            const lowerIndex = config.data.datasets.length;\n            // Lower bound — a thin line, no fill.\n            config.data.datasets.push({\n                label: name,\n                data: lowerData,\n                borderColor: border,\n                backgroundColor: 'transparent',\n                borderWidth: 1,\n                pointRadius: 0,\n                fill: false,\n                tension: 0,\n                _rangeBound: 'lower',\n            });\n            // Upper bound — fills DOWN to the lower dataset (the band ribbon).\n            config.data.datasets.push({\n                label: name,\n                data: upperData,\n                borderColor: border,\n                backgroundColor: getSeriesBackgroundColor(palette, colorIdx, opacity),\n                borderWidth: 1,\n                pointRadius: 0,\n                fill: { target: lowerIndex },\n                tension: 0,\n                _rangeBound: 'upper',\n            });\n        };\n\n        if (colorField) {\n            const groups = groupBy(table, colorField);\n            let idx = 0;\n            for (const [name, rows] of groups) {\n                pushBand(rows, String(name), idx);\n                idx++;\n            }\n            // One legend entry per band: hide the lower-bound datasets.\n            config.options.plugins.legend = {\n                display: true,\n                labels: {\n                    filter: (item: any, data: any) =>\n                        data.datasets[item.datasetIndex]?._rangeBound !== 'lower',\n                },\n            };\n        } else {\n            pushBand(table, lowField, 0);\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Pie Chart template.\n *\n * Contrast with VL:\n *   VL: mark = \"arc\" with theta + color\n *   CJS: type = 'pie' or 'doughnut' with data = { labels, datasets[{data}] }\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\n\n/**\n * Reorder parallel label/value arrays in place by slice value. 'descending'\n * leads with the largest slice, 'ascending' the smallest; anything else keeps\n * the incoming data/category order.\n */\nexport function sortSlicesInPlace(\n    labels: string[],\n    values: number[],\n    sortSlices: unknown,\n): void {\n    if (sortSlices !== 'descending' && sortSlices !== 'ascending') return;\n    const idx = values.map((_, i) => i);\n    idx.sort((a, b) => (sortSlices === 'descending' ? values[b] - values[a] : values[a] - values[b]));\n    const sortedLabels = idx.map((i) => labels[i]);\n    const sortedValues = idx.map((i) => values[i]);\n    labels.splice(0, labels.length, ...sortedLabels);\n    values.splice(0, values.length, ...sortedValues);\n}\n\nconst SORT_SLICES_PROPERTY: ChartPropertyDef = {\n    key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n    options: [\n        { value: 'none', label: 'Data order' },\n        { value: 'descending', label: 'Largest first' },\n        { value: 'ascending', label: 'Smallest first' },\n    ],\n    defaultValue: 'none',\n};\n\nexport const cjsPieChartDef: ChartTemplateDef = {\n    chart: 'Pie Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['size', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const colorField = channelSemantics.color?.field;\n        const sizeField = channelSemantics.size?.field;\n\n        const labels: string[] = [];\n        const values: number[] = [];\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        if (colorField && sizeField) {\n            // color = category (slice label), size = measure (slice value)\n            const agg = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                const val = Number(row[sizeField]) || 0;\n                agg.set(cat, (agg.get(cat) ?? 0) + val);\n            }\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                labels.push(cat);\n                values.push(agg.get(cat) ?? 0);\n            }\n        } else if (colorField) {\n            // No size field → count occurrences per category\n            const counts = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                counts.set(cat, (counts.get(cat) ?? 0) + 1);\n            }\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                labels.push(cat);\n                values.push(counts.get(cat) ?? 0);\n            }\n        } else if (sizeField) {\n            for (const row of table) {\n                const val = Number(row[sizeField]) || 0;\n                labels.push(String(val));\n                values.push(val);\n            }\n        }\n\n        const innerRadius = chartProperties?.innerRadius ?? 0;\n        const isDoughnut = innerRadius > 0;\n\n        sortSlicesInPlace(labels, values, chartProperties?.sortSlices);\n\n        const config: any = {\n            type: isDoughnut ? 'doughnut' : 'pie',\n            data: {\n                labels,\n                datasets: [{\n                    data: values,\n                    backgroundColor: labels.map((_, i) => getSeriesBackgroundColor(palette, i, 0.6)),\n                    borderColor: labels.map((_, i) => getSeriesBorderColor(palette, i)),\n                    borderWidth: 1,\n                }],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                plugins: {\n                    legend: { display: true, position: 'right' as const },\n                    tooltip: { enabled: true },\n                },\n                ...(isDoughnut ? { cutout: `${innerRadius}%` } : {}),\n            },\n            // Canvas size from context (no axes)\n            _width: Math.max(ctx.canvasSize.width, 300),\n            _height: Math.max(ctx.canvasSize.height, 250),\n        };\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'innerRadius', label: 'Donut', type: 'continuous', min: 0, max: 60, step: 5, defaultValue: 0 } as ChartPropertyDef,\n        SORT_SLICES_PROPERTY,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Doughnut Chart template.\n *\n * Contrast with Pie:\n *   Pie: type = 'pie' (full disc, area encodes value)\n *   Doughnut: type = 'doughnut' with a `cutout` — the hollow centre trades a\n *             little area-judgement accuracy for a cleaner look and room for a\n *             centre label. Same data model as Pie (color = slice, size = value).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\nimport { sortSlicesInPlace } from './pie';\n\nexport const cjsDoughnutChartDef: ChartTemplateDef = {\n    chart: 'Doughnut Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['size', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const colorField = channelSemantics.color?.field;\n        const sizeField = channelSemantics.size?.field;\n\n        const labels: string[] = [];\n        const values: number[] = [];\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        if (colorField && sizeField) {\n            const agg = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                const val = Number(row[sizeField]) || 0;\n                agg.set(cat, (agg.get(cat) ?? 0) + val);\n            }\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                labels.push(cat);\n                values.push(agg.get(cat) ?? 0);\n            }\n        } else if (colorField) {\n            const counts = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[colorField] ?? '');\n                counts.set(cat, (counts.get(cat) ?? 0) + 1);\n            }\n            const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n            for (const cat of categories) {\n                labels.push(cat);\n                values.push(counts.get(cat) ?? 0);\n            }\n        } else if (sizeField) {\n            for (const row of table) {\n                const val = Number(row[sizeField]) || 0;\n                labels.push(String(val));\n                values.push(val);\n            }\n        }\n\n        // Default to a 55% hollow centre; let callers tune it.\n        const cutout = chartProperties?.innerRadius ?? 55;\n\n        sortSlicesInPlace(labels, values, chartProperties?.sortSlices);\n\n        const config: any = {\n            type: 'doughnut',\n            data: {\n                labels,\n                datasets: [{\n                    data: values,\n                    backgroundColor: labels.map((_, i) => getSeriesBackgroundColor(palette, i, 0.6)),\n                    borderColor: labels.map((_, i) => getSeriesBorderColor(palette, i)),\n                    borderWidth: 1,\n                }],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                cutout: `${cutout}%`,\n                plugins: {\n                    legend: { display: true, position: 'right' as const },\n                    tooltip: { enabled: true },\n                },\n            },\n            _width: Math.max(ctx.canvasSize.width, 300),\n            _height: Math.max(ctx.canvasSize.height, 250),\n        };\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'innerRadius', label: 'Hole', type: 'continuous', min: 20, max: 80, step: 5, defaultValue: 55 } as ChartPropertyDef,\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n            options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Histogram template.\n *\n * Chart.js has no built-in binning — we compute bins client-side\n * and render as a bar chart.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\nexport const cjsHistogramDef: ChartTemplateDef = {\n    chart: 'Histogram',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField) return;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        // Extract numeric values\n        const numValues = table\n            .map(r => Number(r[xField]))\n            .filter(v => isFinite(v));\n\n        if (numValues.length === 0) return;\n\n        // `binCount` is the bin count; 0 (auto) falls back to 10.\n        const binCount = chartProperties?.binCount || 10;\n\n        const minVal = Math.min(...numValues);\n        const maxVal = Math.max(...numValues);\n        const range = maxVal - minVal;\n        const binWidth = range > 0 ? range / binCount : 1;\n\n        const categories = Array.from({ length: binCount }, (_, i) => {\n            const lo = (minVal + i * binWidth).toFixed(1);\n            const hi = (minVal + (i + 1) * binWidth).toFixed(1);\n            return `${lo}–${hi}`;\n        });\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels: categories,\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        title: { display: true, text: xField },\n                    },\n                    y: {\n                        title: { display: true, text: 'Count' },\n                        beginAtZero: true,\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n        };\n\n        if (!colorField) {\n            // Simple histogram\n            const counts = new Array(binCount).fill(0);\n            for (const v of numValues) {\n                let idx = Math.floor((v - minVal) / binWidth);\n                if (idx >= binCount) idx = binCount - 1;\n                counts[idx]++;\n            }\n\n            config.data.datasets.push({\n                label: 'Count',\n                data: counts,\n                backgroundColor: getSeriesBackgroundColor(palette, 0),\n                borderColor: getSeriesBorderColor(palette, 0),\n                borderWidth: 1,\n                barPercentage: 1.0,\n                categoryPercentage: 1.0,\n            });\n            config.options.plugins.legend = { display: false };\n        } else {\n            // Stacked histogram\n            const groupValues = new Map<string, number[]>();\n            for (const row of table) {\n                const v = Number(row[xField]);\n                if (!isFinite(v)) continue;\n                const g = String(row[colorField] ?? '');\n                if (!groupValues.has(g)) groupValues.set(g, []);\n                groupValues.get(g)!.push(v);\n            }\n\n            config.options.scales.x.stacked = true;\n            config.options.scales.y.stacked = true;\n\n            let colorIdx = 0;\n            for (const [name, vals] of groupValues) {\n                const counts = new Array(binCount).fill(0);\n                for (const v of vals) {\n                    let idx = Math.floor((v - minVal) / binWidth);\n                    if (idx >= binCount) idx = binCount - 1;\n                    counts[idx]++;\n                }\n                config.data.datasets.push({\n                    label: name,\n                    data: counts,\n                    backgroundColor: getSeriesBackgroundColor(palette, colorIdx),\n                    borderColor: getSeriesBorderColor(palette, colorIdx),\n                    borderWidth: 1,\n                    barPercentage: 1.0,\n                    categoryPercentage: 1.0,\n                });\n                colorIdx++;\n            }\n            config.options.plugins.legend = { display: true };\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'binCount', label: 'Max Bins', type: 'continuous', min: 5, max: 50, step: 1, defaultValue: 0 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js ECDF Plot (Empirical Cumulative Distribution Function) template.\n *\n * Align with vegalite/templates/ecdf.ts and echarts/templates/ecdf.ts. Chart.js\n * has no transform pipeline, so we precompute the same sorted cumulative arrays:\n * for each color/detail group, sort the numeric values ascending and emit\n * {x, y} points using the \"≤ x\" convention (ties collapse to the proportion at\n * the value's last occurrence). Each group is one `line` dataset with\n * `stepped: 'after'` (= step-after, matching VL's `step-after` and ECharts'\n * `step: 'end'`), drawn on a `linear` x-axis; the y-axis is pinned to [0, 1].\n *\n * Core Chart.js only — no plugins. A measure is always quantitative, so a linear\n * x-axis is correct (never temporal).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getChartJsPalette, getSeriesBorderColor } from './utils';\n\n/**\n * Sorted distinct {x, y} ECDF points using the \"≤ x\" convention. Ties collapse\n * to the proportion at the value's last occurrence, so the curve is\n * non-decreasing and ends at y = 1.0.\n */\nfunction ecdfPoints(values: number[]): { x: number; y: number }[] {\n    const sorted = values.filter(v => Number.isFinite(v)).sort((a, b) => a - b);\n    const n = sorted.length;\n    const out: { x: number; y: number }[] = [];\n    if (n === 0) return out;\n    let i = 0;\n    while (i < n) {\n        let j = i;\n        while (j + 1 < n && sorted[j + 1] === sorted[i]) j++;\n        out.push({ x: sorted[i], y: (j + 1) / n });\n        i = j + 1;\n    }\n    return out;\n}\n\nexport const cjsEcdfPlotDef: ChartTemplateDef = {\n    chart: 'ECDF Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        // One ECDF per dataset: prefer color, fall back to detail.\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField) return;\n\n        const showPoints = !!chartProperties?.showPoints;\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'line',\n            data: { datasets: [] },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        type: 'linear',\n                        title: { display: true, text: xField },\n                        ticks: { font: { size: 10 } },\n                    },\n                    y: {\n                        type: 'linear',\n                        min: 0,\n                        max: 1,\n                        title: { display: true, text: 'Cumulative proportion' },\n                        ticks: { font: { size: 10 } },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                    legend: { display: false },\n                },\n            },\n        };\n\n        const pushDataset = (name: string, values: number[], idx: number) => {\n            config.data.datasets.push({\n                label: name,\n                data: ecdfPoints(values),\n                borderColor: getSeriesBorderColor(palette, idx),\n                backgroundColor: 'transparent',\n                // step-after: hold the proportion until the next value, then jump.\n                stepped: 'after',\n                pointRadius: showPoints ? 3 : 0,\n                borderWidth: 2,\n                fill: false,\n                tension: 0,\n            });\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            config.options.plugins.legend = { display: true };\n            let idx = 0;\n            for (const [name, rows] of groups) {\n                const values = rows.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n                pushDataset(String(name), values, idx);\n                idx++;\n            }\n        } else {\n            const values = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            pushDataset(xField, values, 0);\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Radar Chart template.\n *\n * Chart.js has native radar chart support via type: 'radar'.\n *\n * Data model (long format):\n *   x (nominal): metric / axis name\n *   y (quantitative): value for that metric\n *   color (nominal): entity / group\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\n\nexport const cjsRadarChartDef: ChartTemplateDef = {\n    chart: 'Radar Chart',\n    template: { mark: 'point', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const axisField = channelSemantics.x?.field;   // metric names\n        const valueField = channelSemantics.y?.field;   // metric values\n        const groupField = channelSemantics.color?.field; // entities\n\n        if (!axisField || !valueField) return;\n\n        // Extract unique metrics (radar axes)\n        const metrics = extractCategories(table, axisField, channelSemantics.x?.ordinalSortOrder);\n        if (metrics.length < 2) return;\n\n        const filled = chartProperties?.filled !== false;\n        const fillOpacity = chartProperties?.fillOpacity ?? 0.3;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        const config: any = {\n            type: 'radar',\n            data: {\n                labels: metrics,\n                datasets: [],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    r: {\n                        beginAtZero: true,\n                        ticks: { display: true },\n                        pointLabels: { display: true },\n                    },\n                },\n                plugins: {\n                    tooltip: { enabled: true },\n                },\n            },\n            // Canvas size from context (no axes)\n            _width: Math.max(ctx.canvasSize.width, 350),\n            _height: Math.max(ctx.canvasSize.height, 300),\n        };\n\n        if (groupField) {\n            const groups = groupBy(table, groupField);\n            config.options.plugins.legend = { display: true };\n\n            let colorIdx = 0;\n            for (const [name, rows] of groups) {\n                // Aggregate: mean per metric\n                const metricVals = new Map<string, { sum: number; count: number }>();\n                for (const row of rows) {\n                    const m = String(row[axisField]);\n                    const v = Number(row[valueField]) || 0;\n                    if (!metricVals.has(m)) metricVals.set(m, { sum: 0, count: 0 });\n                    const entry = metricVals.get(m)!;\n                    entry.sum += v;\n                    entry.count++;\n                }\n\n                const values = metrics.map(m => {\n                    const entry = metricVals.get(m);\n                    return entry ? Math.round((entry.sum / entry.count) * 100) / 100 : 0;\n                });\n\n                const borderColor = getSeriesBorderColor(palette, colorIdx);\n                const bgColor = getSeriesBackgroundColor(palette, colorIdx, fillOpacity);\n\n                config.data.datasets.push({\n                    label: name,\n                    data: values,\n                    borderColor,\n                    backgroundColor: filled ? bgColor : 'transparent',\n                    pointBackgroundColor: borderColor,\n                    fill: filled,\n                });\n                colorIdx++;\n            }\n        } else {\n            // Single group\n            const metricVals = new Map<string, { sum: number; count: number }>();\n            for (const row of table) {\n                const m = String(row[axisField]);\n                const v = Number(row[valueField]) || 0;\n                if (!metricVals.has(m)) metricVals.set(m, { sum: 0, count: 0 });\n                const entry = metricVals.get(m)!;\n                entry.sum += v;\n                entry.count++;\n            }\n\n            const values = metrics.map(m => {\n                const entry = metricVals.get(m);\n                return entry ? Math.round((entry.sum / entry.count) * 100) / 100 : 0;\n            });\n\n            config.data.datasets.push({\n                label: valueField,\n                data: values,\n                borderColor: getSeriesBorderColor(palette, 0),\n                backgroundColor: filled\n                    ? getSeriesBackgroundColor(palette, 0, fillOpacity)\n                    : 'transparent',\n                pointBackgroundColor: getSeriesBorderColor(palette, 0),\n                fill: filled,\n            });\n            config.options.plugins.legend = { display: false };\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'filled', label: 'Fill', type: 'discrete', options: [\n                { value: true, label: 'Filled (default)' },\n                { value: false, label: 'Outline only' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'fillOpacity', label: 'Opacity', type: 'continuous', min: 0.05, max: 0.8, step: 0.05, defaultValue: 0.3 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Rose Chart (Nightingale / Coxcomb) template.\n *\n * Contrast with VL:\n *   VL: mark = \"arc\" with theta (angular extent fixed per slice) + radius (value)\n *   CJS: type = 'polarArea' — each wedge spans an equal angle, radius encodes value.\n *\n * Data model (long format):\n *   x (nominal): angular category (direction, month, etc.)\n *   y (quantitative): value mapped to wedge radius\n *   color (nominal, optional): stack / group variable\n *\n * Note: Chart.js polarArea doesn't support native stacking. When a color\n * field is present we aggregate per category (sum across groups) and show\n * the total, with the legend listing the color groups for reference.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    getChartJsPalette,\n    getSeriesBorderColor,\n    getSeriesBackgroundColor,\n} from './utils';\nimport { sortSlicesInPlace } from './pie';\n\nexport const cjsRoseChartDef: ChartTemplateDef = {\n    chart: 'Rose Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const catField = channelSemantics.x?.field;   // angular categories\n        const valField = channelSemantics.y?.field;    // wedge radius value\n        const colorField = channelSemantics.color?.field; // optional grouping\n\n        if (!catField || !valField) return;\n\n        const palette = getChartJsPalette(ctx, 'color');\n\n        // Extract unique angular categories\n        const categories = extractCategories(table, catField, channelSemantics.x?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        let labels: string[];\n        let values: number[];\n        let bgColors: string[];\n        let borderColors: string[];\n\n        if (colorField) {\n            // Stacked: aggregate per (category × group), then sum across groups per category\n            const groups = groupBy(table, colorField);\n            const groupNames = [...groups.keys()];\n\n            // Build per-category totals\n            const catTotals = new Map<string, number>();\n            for (const cat of categories) catTotals.set(cat, 0);\n\n            for (const [, rows] of groups) {\n                for (const row of rows) {\n                    const cat = String(row[catField] ?? '');\n                    const val = Number(row[valField]) || 0;\n                    if (catTotals.has(cat)) {\n                        catTotals.set(cat, catTotals.get(cat)! + val);\n                    }\n                }\n            }\n\n            labels = categories;\n            values = categories.map(c => catTotals.get(c) ?? 0);\n\n            // Assign distinct colors per wedge (category)\n            bgColors = categories.map((_, i) => getSeriesBackgroundColor(palette, i, 0.6));\n            borderColors = categories.map((_, i) => getSeriesBorderColor(palette, i));\n        } else {\n            // Simple: one value per category\n            const catAgg = new Map<string, number>();\n            for (const row of table) {\n                const cat = String(row[catField] ?? '');\n                const val = Number(row[valField]) || 0;\n                catAgg.set(cat, (catAgg.get(cat) ?? 0) + val);\n            }\n\n            labels = categories;\n            values = categories.map(c => catAgg.get(c) ?? 0);\n            bgColors = categories.map((_, i) => getSeriesBackgroundColor(palette, i, 0.6));\n            borderColors = categories.map((_, i) => getSeriesBorderColor(palette, i));\n        }\n\n        // Alignment: 'center' puts wedge center at 12 o'clock,\n        // 'left' puts wedge left edge at 12 o'clock.\n        sortSlicesInPlace(labels, values, ctx.chartProperties?.sortSlices);\n\n        // Area-truth: Chart.js `polarArea` maps the datum linearly to the wedge\n        // radius, so raw values make AREA ∝ value² (a 4:1 value reads as 16:1\n        // area). Vega-Lite instead uses a sqrt radius scale. Chart.js' radial `r`\n        // scale has no sqrt type, so we plot sqrt(value) as the radius (making\n        // AREA ∝ value) and keep the true value for the tooltip/label. Guard\n        // against negatives (sqrt(NaN)).\n        const rawValues = values.slice();\n        const radii = values.map(v => Math.sqrt(Math.max(0, v)));\n\n        const alignment = ctx.chartProperties?.alignment ?? 'left';\n        const n = categories.length;\n        // Chart.js polarArea rotation lives on the RADIAL SCALE\n        // (`scales.r.startAngle`, in degrees, 0 = 12 o'clock, CW) — the\n        // top-level `options.startAngle` is NOT read for polarArea and has no\n        // effect. Default (0) is left alignment (first wedge's left edge at 12\n        // o'clock); center rotates back by half a slice so the first wedge is\n        // centred on 12 o'clock.\n        const startAngle = alignment === 'center' && n > 0\n            ? -(180 / n)\n            : 0;\n\n        const config: any = {\n            type: 'polarArea',\n            data: {\n                labels,\n                datasets: [{\n                    data: radii,\n                    backgroundColor: bgColors,\n                    borderColor: borderColors,\n                    borderWidth: 1,\n                }],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    r: {\n                        beginAtZero: true,\n                        startAngle,\n                        // Radii are sqrt(value); the raw tick numbers would\n                        // misrepresent the scale, so hide them (true values are\n                        // surfaced in the tooltip).\n                        ticks: { display: false },\n                    },\n                },\n                plugins: {\n                    legend: { display: true, position: 'right' as const },\n                    tooltip: {\n                        enabled: true,\n                        callbacks: {\n                            // Radius is sqrt-transformed; report the true value.\n                            label: (item: any) => {\n                                const raw = rawValues[item.dataIndex];\n                                const shown = raw != null ? raw : item.raw;\n                                const name = item.label != null ? item.label : '';\n                                return `${name}: ${shown}`;\n                            },\n                        },\n                    },\n                },\n            },\n            _width: Math.max(ctx.canvasSize.width, 350),\n            _height: Math.max(ctx.canvasSize.height, 300),\n        };\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'alignment', label: 'Alignment', type: 'discrete', options: [\n                { value: 'left', label: 'Left (default)' },\n                { value: 'center', label: 'Center' },\n            ],\n        } as ChartPropertyDef,\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n            options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Gantt Chart — one horizontal floating bar per task, spanning\n * [start, end] (mirror vegalite/templates/gantt.ts).\n *\n * Channels:\n *   - y      task / activity label (the category axis)\n *   - x      start of the interval (temporal or quantitative)\n *   - x2     end of the interval (shares x's scale)\n *   - color  optional grouping (phase, owner, resource)\n *\n * Chart.js bars accept a `[start, end]` tuple natively (floating bars), so a\n * Gantt is a horizontal bar (`indexAxis: 'y'`) whose data are the intervals.\n * Tasks are sorted by start so the timeline reads chronologically top-to-bottom\n * (Chart.js draws category index 0 at the top of a horizontal bar). Temporal\n * intervals are positioned on a linear epoch-ms axis with a date tick callback,\n * avoiding a date-adapter dependency.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    coerceGanttEndpoint,\n    formatGanttLabel,\n    ganttLabelReservePx,\n    GANTT_PROPERTIES,\n    isGanttTemporal,\n    sortGanttRows,\n} from '../../chart-types/gantt';\nimport { DEFAULT_COLORS, DEFAULT_BG_COLORS } from './utils';\n\nfunction fmtDate(ms: number): string {\n    if (!Number.isFinite(ms)) return '';\n    return new Date(ms).toISOString().slice(0, 10);\n}\n\nexport const cjsGanttChartDef: ChartTemplateDef = {\n    chart: 'Gantt Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'x2', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, semanticTypes } = ctx;\n        const taskField = channelSemantics.y?.field;\n        const startField = channelSemantics.x?.field;\n        const endField = channelSemantics.x2?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!taskField || !startField || !endField || table.length === 0) return;\n\n        const temporal = isGanttTemporal(channelSemantics.x?.type, semanticTypes[startField]);\n        const num = (v: unknown) => coerceGanttEndpoint(v, temporal);\n\n        const rows = sortGanttRows(table\n            .map((r: any, inputIndex: number) => ({\n                task: String(r[taskField] ?? ''),\n                start: num(r[startField]),\n                end: num(r[endField]),\n                group: colorField != null ? String(r[colorField] ?? '') : undefined,\n                inputIndex,\n            }))\n            .filter((r) => r.task && Number.isFinite(r.start) && Number.isFinite(r.end)));\n        const taskHeight = chartProperties?.taskHeight ?? 70;\n        const cornerRadius = chartProperties?.cornerRadius ?? 2;\n        const intervalLabels = chartProperties?.intervalLabels === true;\n        const labelReserve = ganttLabelReservePx(rows, temporal);\n\n        const groups = colorField\n            ? Array.from(new Set(rows.map((r) => r.group ?? '')))\n            : [];\n        const groupIndex = new Map<string, number>();\n        groups.forEach((g, i) => groupIndex.set(g, i));\n\n        const colorFor = (group: string | undefined): { bg: string; border: string } => {\n            const i = group != null ? (groupIndex.get(group) ?? 0) : 0;\n            return {\n                bg: DEFAULT_BG_COLORS[i % DEFAULT_BG_COLORS.length],\n                border: DEFAULT_COLORS[i % DEFAULT_COLORS.length],\n            };\n        };\n\n        const labels = rows.map((r) => r.task);\n        const data = rows.map((r) => [r.start, r.end] as [number, number]);\n        const bg = rows.map((r) => colorFor(r.group).bg);\n        const border = rows.map((r) => colorFor(r.group).border);\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels,\n                datasets: [{\n                    label: taskField,\n                    data,\n                    backgroundColor: bg,\n                    borderColor: border,\n                    borderWidth: 1,\n                    borderRadius: cornerRadius,\n                    borderSkipped: false,\n                    barPercentage: taskHeight / 100,\n                }],\n            },\n            options: {\n                indexAxis: 'y',\n                responsive: true,\n                maintainAspectRatio: false,\n                ...(intervalLabels\n                    ? { layout: { padding: { right: labelReserve } } }\n                    : {}),\n                scales: {\n                    x: {\n                        beginAtZero: false,\n                        title: { display: !temporal, text: startField },\n                        ...(temporal\n                            ? { ticks: { callback: (v: number) => fmtDate(Number(v)) } }\n                            : {}),\n                    },\n                    y: { title: { display: false } },\n                },\n                plugins: {\n                    legend: colorField && groups.length > 1\n                        ? {\n                            display: true,\n                            labels: {\n                                generateLabels: () => groups.map((g) => {\n                                    const c = colorFor(g);\n                                    return {\n                                        text: g,\n                                        fillStyle: c.bg,\n                                        strokeStyle: c.border,\n                                        lineWidth: 1,\n                                    };\n                                }),\n                            },\n                        }\n                        : { display: false },\n                    tooltip: {\n                        callbacks: {\n                            label: (item: any) => {\n                                const [s, e] = item.raw as [number, number];\n                                const fs = temporal ? fmtDate(s) : s;\n                                const fe = temporal ? fmtDate(e) : e;\n                                return `${fs} → ${fe}`;\n                            },\n                        },\n                    },\n                },\n            },\n        };\n\n        if (intervalLabels) {\n            config.plugins = [{\n                id: 'ganttLabels',\n                afterDatasetsDraw: (chart: any) => {\n                    const { ctx: canvasContext } = chart;\n                    canvasContext.save();\n                    canvasContext.fillStyle = '#333333';\n                    canvasContext.font = '10px sans-serif';\n                    canvasContext.textAlign = 'left';\n                    canvasContext.textBaseline = 'middle';\n                    chart.getDatasetMeta(0).data.forEach((bar: any, index: number) => {\n                        const row = rows[index];\n                        if (!row) return;\n                        canvasContext.fillText(\n                            formatGanttLabel(row.start, row.end, temporal),\n                            bar.x + 4,\n                            bar.y,\n                        );\n                    });\n                    canvasContext.restore();\n                },\n            }];\n        }\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: GANTT_PROPERTIES,\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js Waterfall Chart — cumulative bars with start / delta / end\n * (mirror vegalite/templates/waterfall.ts and echarts/templates/waterfall.ts).\n *\n * Channels:\n *   - x      category / step label (the banded axis)\n *   - y      signed amount for the step\n *   - color  optional explicit type column (start / increase / decrease / end)\n *\n * Each bar floats between the running total before and after its step, which\n * Chart.js expresses natively as a `[base, top]` bar value. The first and last\n * bars are anchored at zero (totals); the middle bars float from the previous\n * cumulative value. Bars are colored start/end blue, increase green, decrease\n * red.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { resolveTotalsMode } from '../../chart-types/waterfall';\nimport { extractCategories } from './utils';\n\nconst COLOR = {\n    startEnd: { bg: 'rgba(84, 112, 198, 0.65)', border: 'rgba(84, 112, 198, 1)' },\n    increase: { bg: 'rgba(145, 204, 117, 0.65)', border: 'rgba(145, 204, 117, 1)' },\n    decrease: { bg: 'rgba(238, 102, 102, 0.65)', border: 'rgba(238, 102, 102, 1)' },\n};\n\nexport const cjsWaterfallChartDef: ChartTemplateDef = {\n    chart: 'Waterfall Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { x: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const catField = channelSemantics.x?.field;\n        const valField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!catField || !valField || table.length === 0) return;\n\n        const categories = extractCategories(table, catField, channelSemantics.x?.ordinalSortOrder);\n        const rows = categories\n            .map((cat) => table.find((r: any) => String(r[catField]) === cat))\n            .filter(Boolean) as any[];\n        const values = rows.map((r) => Number(r[valField]) || 0);\n\n        // Data-aware totals default (see chart-types/waterfall.ts): first is a start\n        // total, last is a total only when it reconciles with the prior\n        // cumulative. The user's `totals` property overrides this; an explicit\n        // color/type column is authoritative. Mirror vegalite/echarts templates.\n        const totalsMode = resolveTotalsMode(values, ctx.chartProperties?.totals);\n        const wantFirst = totalsMode === 'first' || totalsMode === 'both';\n        const wantLast = totalsMode === 'last' || totalsMode === 'both';\n        const types: string[] = colorField\n            ? rows.map((r) => String(r[colorField] ?? 'delta'))\n            : values.map((_, i) =>\n                wantFirst && i === 0 ? 'start'\n                    : wantLast && i === values.length - 1 ? 'end'\n                        : 'delta');\n\n        // Cumulative running total including the current row.\n        const cumulative: number[] = [];\n        let acc = 0;\n        for (const v of values) { acc += v; cumulative.push(acc); }\n\n        const data: Array<[number, number]> = [];\n        const bg: string[] = [];\n        const border: string[] = [];\n        for (let i = 0; i < values.length; i++) {\n            const v = values[i];\n            const t = types[i];\n            const isTotal = t === 'start' || t === 'end';\n            const top = t === 'end' ? cumulative[i] - v : cumulative[i];\n            const prev = isTotal ? 0 : cumulative[i] - v;\n            const lo = Math.min(prev, top);\n            const hi = Math.max(prev, top);\n            data.push([lo, hi]);\n            const c = isTotal ? COLOR.startEnd : top >= prev ? COLOR.increase : COLOR.decrease;\n            bg.push(c.bg);\n            border.push(c.border);\n        }\n\n        const legendItems = [\n            { text: 'Start/End', color: COLOR.startEnd },\n            { text: 'Increase', color: COLOR.increase },\n            { text: 'Decrease', color: COLOR.decrease },\n        ];\n\n        const config: any = {\n            type: 'bar',\n            data: {\n                labels: categories,\n                datasets: [{\n                    label: valField,\n                    data,\n                    backgroundColor: bg,\n                    borderColor: border,\n                    borderWidth: 1,\n                    borderSkipped: false,\n                }],\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: { title: { display: true, text: catField } },\n                    y: { beginAtZero: true, title: { display: true, text: valField } },\n                },\n                plugins: {\n                    legend: {\n                        display: true,\n                        labels: {\n                            generateLabels: () => legendItems.map((it) => ({\n                                text: it.text,\n                                fillStyle: it.color.bg,\n                                strokeStyle: it.color.border,\n                                lineWidth: 1,\n                            })),\n                        },\n                    },\n                    tooltip: {\n                        callbacks: {\n                            label: (item: any) => {\n                                const [lo, hi] = item.raw as [number, number];\n                                return `${valField}: ${Math.round((hi - lo) * 100) / 100}`;\n                            },\n                        },\n                    },\n                },\n            },\n        };\n\n        Object.assign(spec, config);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js template registry.\n *\n * Mirrors the structure of echarts/templates/index.ts and\n * vegalite/templates/index.ts but with Chart.js template definitions.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { cjsScatterPlotDef } from './scatter';\nimport { cjsConnectedScatterDef } from './connected-scatter';\nimport { cjsBubbleChartDef } from './bubble';\nimport { cjsStripPlotDef } from './jitter';\nimport { cjsBarChartDef, cjsStackedBarChartDef, cjsGroupedBarChartDef } from './bar';\nimport { cjsComboChartDef } from './combo';\nimport { cjsLineChartDef } from './line';\nimport { cjsBumpChartDef } from './bump';\nimport { cjsSlopeChartDef } from './slope';\nimport { cjsAreaChartDef } from './area';\nimport { cjsRangeAreaChartDef } from './range-area';\nimport { cjsPieChartDef } from './pie';\nimport { cjsDoughnutChartDef } from './doughnut';\nimport { cjsHistogramDef } from './histogram';\nimport { cjsEcdfPlotDef } from './ecdf';\nimport { cjsRadarChartDef } from './radar';\nimport { cjsRoseChartDef } from './rose';\nimport { cjsGanttChartDef } from './gantt';\nimport { cjsWaterfallChartDef } from './waterfall';\n\n/**\n * Chart.js chart template definitions, grouped by category.\n */\nexport const cjsTemplateDefs: { [key: string]: ChartTemplateDef[] } = {\n    'Scatter & Point': [cjsScatterPlotDef, cjsConnectedScatterDef, cjsBubbleChartDef, cjsStripPlotDef],\n    'Bar':             [cjsBarChartDef, cjsGroupedBarChartDef, cjsStackedBarChartDef, cjsComboChartDef, cjsHistogramDef, cjsWaterfallChartDef, cjsGanttChartDef],\n    'Line & Area':     [cjsLineChartDef, cjsBumpChartDef, cjsSlopeChartDef, cjsAreaChartDef, cjsRangeAreaChartDef, cjsEcdfPlotDef],\n    'Part-to-Whole':   [cjsPieChartDef, cjsDoughnutChartDef],\n    'Polar':           [cjsRadarChartDef, cjsRoseChartDef],\n};\n\n/**\n * Flat list of all Chart.js chart template definitions.\n */\nexport const cjsAllTemplateDefs: ChartTemplateDef[] = Object.values(cjsTemplateDefs).flat();\n\n/**\n * Look up a Chart.js chart template definition by chart type name.\n */\nexport function cjsGetTemplateDef(chartType: string): ChartTemplateDef | undefined {\n    return cjsAllTemplateDefs.find(t => t.chart === chartType);\n}\n\n/**\n * Get the available channels for a Chart.js chart type.\n */\nexport function cjsGetTemplateChannels(chartType: string): string[] {\n    return cjsGetTemplateDef(chartType)?.channels || [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * PHASE 2: INSTANTIATE SPEC — Chart.js backend\n * =============================================================================\n *\n * Translates semantic decisions (Phase 0) and layout dimensions (Phase 1)\n * into Chart.js-specific config properties.\n *\n * Key differences from ECharts/Vega-Lite instantiation:\n *   - CJS uses { type, data: { labels, datasets[] }, options: { scales } }\n *   - CJS scales use 'x'/'y' keys (not xAxis/yAxis)\n *   - CJS sizing via canvas element dimensions + responsive: false\n *   - CJS label rotation via scales[axis].ticks.maxRotation\n *   - CJS stacking via stacked property on scales\n *   - CJS bar sizing via barPercentage and categoryPercentage\n *\n * CJS dependency: **Yes — this is where Chart.js-specific syntax lives**\n * =============================================================================\n */\n\nimport type {\n    InstantiateContext,\n    ChartWarning,\n} from '../core/types';\n\n/**\n * Phase 2: Apply layout and semantic decisions to the Chart.js config object.\n *\n * Handles common Chart.js plumbing across all templates:\n *   - Canvas sizing (_width, _height)\n *   - Axis label rotation and font sizing\n *   - Bar sizing (barPercentage, categoryPercentage)\n *   - Overflow truncation warnings\n */\nexport function cjsApplyLayoutToSpec(\n    config: any,\n    context: InstantiateContext,\n    warnings: ChartWarning[],\n): void {\n    const { channelSemantics, layout, canvasSize } = context;\n\n    // ── Axis-less chart types (pie, radar, doughnut) ─────────────────────\n    const hasAxes = !!(config.options?.scales?.x || config.options?.scales?.y);\n    const isRadar = config.type === 'radar';\n\n    // ── Canvas dimensions ────────────────────────────────────────────────\n    // Chart.js uses the canvas element dimensions.\n    // For non-axis charts (pie, radar), templates set their own _width/_height.\n    if (hasAxes && !config._width) {\n        // Axes + optional right legend column (see legend block below for extra gutter).\n        const PADDING = 80; // approximate space for axes, labels\n\n        const xIsDiscrete = layout.xNominalCount > 0 || layout.xContinuousAsDiscrete > 0;\n        const yIsDiscrete = layout.yNominalCount > 0 || layout.yContinuousAsDiscrete > 0;\n\n        let plotWidth: number;\n        let plotHeight: number;\n\n        if (xIsDiscrete && layout.xStepUnit !== 'group') {\n            const xItemCount = layout.xNominalCount || layout.xContinuousAsDiscrete || 0;\n            plotWidth = xItemCount > 0 ? layout.xStep * xItemCount : (layout.subplotWidth || canvasSize.width);\n        } else {\n            plotWidth = layout.subplotWidth || canvasSize.width;\n        }\n\n        if (yIsDiscrete && layout.yStepUnit !== 'group') {\n            const yItemCount = layout.yNominalCount || layout.yContinuousAsDiscrete || 0;\n            plotHeight = yItemCount > 0 ? layout.yStep * yItemCount : (layout.subplotHeight || canvasSize.height);\n        } else {\n            plotHeight = layout.subplotHeight || canvasSize.height;\n        }\n\n        const legendGutter = cjsLegendLikelyVisible(config) ? 96 : 0;\n        config._width = plotWidth + PADDING + legendGutter;\n        config._height = plotHeight + PADDING;\n    }\n\n    // ── Bar sizing ───────────────────────────────────────────────────────\n    if (config.data?.datasets) {\n        const barDatasets = config.data.datasets.filter(\n            (ds: any) => config.type === 'bar' || ds.type === 'bar'\n        );\n        if (barDatasets.length > 0 && hasAxes) {\n            const bandPadding = layout.stepPadding;\n            // Chart.js uses:\n            //   categoryPercentage: fraction of available space per category (default 0.8)\n            //   barPercentage: fraction of category space per bar (default 0.9)\n            // Total bar space = categoryPercentage × barPercentage\n            const categoryPct = 1 - bandPadding;\n            for (const ds of barDatasets) {\n                if (ds.categoryPercentage == null) {\n                    ds.categoryPercentage = categoryPct;\n                }\n            }\n        }\n    }\n\n    // ── X-axis label sizing ──────────────────────────────────────────────\n    if (hasAxes && config.options?.scales?.x && layout.xLabel) {\n        if (!config.options.scales.x.ticks) config.options.scales.x.ticks = {};\n\n        if (layout.xLabel.labelAngle && layout.xLabel.labelAngle !== 0) {\n            config.options.scales.x.ticks.maxRotation = Math.abs(layout.xLabel.labelAngle);\n            config.options.scales.x.ticks.minRotation = Math.abs(layout.xLabel.labelAngle);\n        }\n\n        if (layout.xLabel.fontSize) {\n            config.options.scales.x.ticks.font = {\n                ...(config.options.scales.x.ticks.font || {}),\n                size: layout.xLabel.fontSize,\n            };\n        }\n        // Axis title (scale title) font — canvas-adaptive header size.\n        if (config.options.scales.x.title?.display) {\n            config.options.scales.x.title.font = {\n                ...(config.options.scales.x.title.font || {}),\n                size: layout.titleFontSize,\n            };\n        }\n    }\n\n    // ── Y-axis label sizing ──────────────────────────────────────────────\n    if (hasAxes && config.options?.scales?.y && layout.yLabel) {\n        if (!config.options.scales.y.ticks) config.options.scales.y.ticks = {};\n\n        if (layout.yLabel.fontSize) {\n            config.options.scales.y.ticks.font = {\n                ...(config.options.scales.y.ticks.font || {}),\n                size: layout.yLabel.fontSize,\n            };\n        }\n        if (config.options.scales.y.title?.display) {\n            config.options.scales.y.title.font = {\n                ...(config.options.scales.y.title.font || {}),\n                size: layout.titleFontSize,\n            };\n        }\n    }\n\n    // ── Legend / chart title font — canvas-adaptive header sizes ──────────\n    if (config.options?.plugins?.legend) {\n        const legend = config.options.plugins.legend;\n        if (!legend.labels) legend.labels = {};\n        legend.labels.font = { ...(legend.labels.font || {}), size: layout.legendFontSize };\n    }\n    if (config.options?.plugins?.title?.display) {\n        config.options.plugins.title.font = {\n            ...(config.options.plugins.title.font || {}),\n            size: layout.titleFontSize,\n        };\n    }\n\n    // ── Overflow truncation warnings ─────────────────────────────────────\n    if (layout.truncations && layout.truncations.length > 0) {\n        for (const trunc of layout.truncations) {\n            warnings.push({\n                severity: 'warning',\n                code: 'overflow',\n                message: trunc.message,\n                channel: trunc.channel,\n                field: trunc.field,\n            });\n            // Chart.js: append placeholder to labels\n            if (config.data?.labels && Array.isArray(config.data.labels)) {\n                config.data.labels.push(trunc.placeholder);\n            }\n        }\n    }\n\n    // ── Legend: right side (Chart.js stacks items vertically for position 'right') ──\n    cjsApplyLegendRightColumn(config);\n}\n\n/** Whether the Chart.js legend is expected to show (respects display:false; default is show when multiple datasets). */\nfunction cjsLegendLikelyVisible(config: any): boolean {\n    const legend = config.options?.plugins?.legend;\n    if (legend?.display === false) return false;\n    if (legend?.display === true) return true;\n    const n = config.data?.datasets?.length ?? 0;\n    return n > 1;\n}\n\n/** How many legend rows we expect (pie/doughnut: slice labels; else: one per dataset). */\nfunction cjsLegendEntryCount(config: any): number {\n    const t = config.type;\n    if (t === 'pie' || t === 'doughnut') {\n        return config.data?.labels?.length ?? 0;\n    }\n    return config.data?.datasets?.length ?? 0;\n}\n\n/**\n * Place legend on the right in a vertical column; match EC/VL legend text size so labels fit the canvas.\n * (Chart.js defaults ~12px; VL labelFontSize 8, EC textStyle 11 or 8 when high-cardinality.)\n */\nfunction cjsApplyLegendRightColumn(config: any): void {\n    if (!cjsLegendLikelyVisible(config)) return;\n    if (!config.options) config.options = {};\n    if (!config.options.plugins) config.options.plugins = {};\n    const prev = config.options.plugins.legend ?? {};\n    const prevLabels = prev.labels ?? {};\n    const prevFont = prevLabels.font ?? {};\n    const entryCount = cjsLegendEntryCount(config);\n    const highCardinality = entryCount >= 16;\n    const fontSize = prevFont.size ?? (highCardinality ? 8 : 10);\n    const boxW = prevLabels.boxWidth ?? (highCardinality ? 8 : 10);\n    const boxH = prevLabels.boxHeight ?? (highCardinality ? 8 : 10);\n    config.options.plugins.legend = {\n        ...prev,\n        position: 'right' as const,\n        labels: {\n            ...prevLabels,\n            font: {\n                ...prevFont,\n                size: fontSize,\n            },\n            boxWidth: boxW,\n            boxHeight: boxH,\n        },\n    };\n}\n\n/**\n * Apply tooltips to a Chart.js config.\n * Chart.js tooltips are configured under options.plugins.tooltip.\n */\nexport function cjsApplyTooltips(config: any): void {\n    if (!config.options) config.options = {};\n    if (!config.options.plugins) config.options.plugins = {};\n    if (!config.options.plugins.tooltip) {\n        config.options.plugins.tooltip = { enabled: true };\n    }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js chart assembly — Two-Stage Pipeline Coordinator.\n *\n * Reuses the **same core analysis pipeline** as Vega-Lite and ECharts:\n *   Phase 0:  resolveChannelSemantics  → ChannelSemantics\n *   Step 0a:  declareLayoutMode    → LayoutDeclaration\n *   Step 0b:  convertTemporalData  → converted data\n *   Step 0c:  filterOverflow       → filtered data, nominalCounts\n *   Phase 1:  computeLayout        → LayoutResult\n *\n * Then diverges for Phase 2 (Chart.js-specific):\n *   template.instantiate → builds Chart.js config structure\n *   cjsApplyLayoutToSpec → applies layout decisions to config\n *\n * Key structural differences from ECharts / VL output:\n *   VL: { mark, encoding, data: {values}, width, height }\n *   EC: { xAxis, yAxis, series: [{type, data}], tooltip, legend, grid }\n *   CJS: { type, data: { labels, datasets[] }, options: { scales, plugins } }\n *\n * This module has NO React, Redux, or UI framework dependencies.\n */\n\nimport {\n    ChartEncoding,\n    ChartTemplateDef,\n    ChartAssemblyInput,\n    AssembleOptions,\n    LayoutDeclaration,\n    InstantiateContext,\n} from '../core/types';\nimport type { ChartWarning } from '../core/types';\nimport { applyEncodingOverrides } from '../core/encoding-overrides';\nimport { applyAggregation } from '../core/aggregate';\nimport { applyPivot, applyTransform, type PivotSurface, type TransformSurface } from '../core/pivot';\nimport { cjsGetTemplateDef } from './templates';\nimport { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics';\nimport { computeZeroDecision } from '../core/semantic-types';\nimport { filterOverflow } from '../core/filter-overflow';\nimport { computeLayout, computeChannelBudgets, deriveStretchCaps, resolveBaseSize, resolveFacetColumnsOption } from '../core/compute-layout';\nimport { decideColorMaps } from '../core/color-decisions';\nimport { cjsApplyLayoutToSpec, cjsApplyTooltips } from './instantiate-spec';\nimport { normalizeStaticSeries } from '../core/static-series';\nimport { normalizeChartProperties } from '../core/normalize-properties';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n/**\n * Assemble a Chart.js config object.\n *\n * ```ts\n * const config = assembleChartjs({\n *   data: { values: myRows },\n *   semantic_types: { weight: 'Quantity' },\n *   chart_spec: { chartType: 'Bar Chart', encodings: { x: { field: 'category' }, y: { field: 'value' } } },\n *   options: { addTooltips: true },\n * });\n * ```\n *\n * @returns A Chart.js config object with optional `_warnings` and `_width`/`_height` hints\n */\nexport function assembleChartjs(input: ChartAssemblyInput): any {\n    const chartType = input.chart_spec.chartType;\n    const semanticTypes = input.semantic_types ?? {};\n    // Internal layout targets the base (target) size; the optional canvasSize\n    // ceiling is applied as per-dimension stretch caps once options resolve.\n    // The base is clamped to the ceiling so a smaller canvasSize shrinks the\n    // chart to fit rather than overflowing it.\n    const sizeCeiling = input.chart_spec.canvasSize;\n    const baseSize = resolveBaseSize(input.chart_spec.baseSize, sizeCeiling);\n    const canvasSize = baseSize;\n    const options = input.options ?? {};\n    let chartTemplate = cjsGetTemplateDef(chartType) as ChartTemplateDef;\n    if (!chartTemplate) {\n        throw new Error(`Unknown Chart.js chart type: ${chartType}. Use cjsAllTemplateDefs to see available types.`);\n    }\n\n    const warnings: ChartWarning[] = [];\n\n    // Validate discrete property values against the template's options before\n    // they reach `instantiate` (map known labels → values, drop unknowns).\n    const normalizedProps = normalizeChartProperties(\n        chartTemplate.properties, input.chart_spec.chartProperties,\n    );\n    const chartProperties = normalizedProps.chartProperties;\n    warnings.push(...normalizedProps.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PRE-PHASE: Static Series Normalization\n    // ═══════════════════════════════════════════════════════════════════════\n    const rawData = input.data.values ?? [];\n    const normalized = normalizeStaticSeries(\n        input.chart_spec.encodings, rawData, semanticTypes,\n    );\n    let data = normalized.data;\n    const staticSeries = normalized.staticSeries;\n\n    const prelimConvertedData = convertTemporalData(data, semanticTypes);\n    const prelimSemantics = resolveChannelSemantics(\n        normalized.encodings, data, semanticTypes, prelimConvertedData,\n    );\n    const typedRawEncodings: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(normalized.encodings)) {\n        typedRawEncodings[ch] = enc.type\n            ? enc\n            : { ...enc, type: prelimSemantics[ch]?.type };\n    }\n\n    // Transform (derived Category-B operator): same two-control model as VL —\n    // chartProperties.chartType (θ) + chartProperties.arrange (τ/σ/γ). Legacy\n    // composed `pivot` ids are migrated inside applyTransform. See\n    // design-docs/chart-transform-two-axes.md.\n    const authoredTemplate = chartTemplate;\n    const transformed = applyTransform(chartTemplate, typedRawEncodings, data, chartProperties, cjsGetTemplateDef);\n    if (transformed.chartType && transformed.chartType !== chartType) {\n        const swapped = cjsGetTemplateDef(transformed.chartType) as ChartTemplateDef | undefined;\n        if (swapped) chartTemplate = swapped;\n    }\n\n    // Compose Category-B encoding-action overrides (stored by the host in\n    // chartProperties, keyed by action key) onto the post-transform encodings\n    // before any pipeline phase runs. Flint owns the transform; the host only\n    // stores the override value. See applyEncodingOverrides / EncodingActionDef.\n    const encodings = applyEncodingOverrides(chartTemplate, transformed.encodings, chartProperties);\n\n    // Optional aggregation transform — see vegalite/assemble for rationale.\n    data = applyAggregation(encodings, data);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 0: Resolve Semantics (shared with VL + EC — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const tplMark = chartTemplate.template?.mark;\n    const templateMarkType = typeof tplMark === 'string' ? tplMark : tplMark?.type;\n\n    // Convert temporal data once — feeds semantic resolution and all downstream stages\n    const convertedData = convertTemporalData(data, semanticTypes);\n\n    const channelSemantics = resolveChannelSemantics(\n        encodings, data, semanticTypes, convertedData,\n    );\n\n    // Finalize zero-baseline (requires template mark knowledge)\n    const effectiveMarkType = templateMarkType || 'point';\n    for (const [channel, cs] of Object.entries(channelSemantics)) {\n        if ((channel === 'x' || channel === 'y') && cs.type === 'quantitative') {\n            const numericValues = data\n                .map(r => r[cs.field])\n                .filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            cs.zero = computeZeroDecision(\n                cs.semanticAnnotation.semanticType, channel, effectiveMarkType, numericValues,\n            );\n        }\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0a: declareLayoutMode (shared hook)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const declaration: LayoutDeclaration = chartTemplate.declareLayoutMode\n        ? chartTemplate.declareLayoutMode(channelSemantics, data, chartProperties)\n        : {};\n\n    const effectiveOptions: AssembleOptions = {\n        // Chart.js fills its canvas natively — a wider default band size\n        // matches its generous category spacing behavior.\n        defaultBandSize: 30,\n        // Chart.js has no default maxBarThickness, so sparse bars fill the\n        // canvas. Allow bands to expand past the base to match, capped so a\n        // couple of bars don't span the whole canvas.\n        maxBandSize: 100,\n        // Chart.js native font default (12 for ticks, legend, and title).\n        baseLabelFontSize: 12,\n        baseTitleFontSize: 12,\n        ...options,\n        ...(declaration.paramOverrides || {}),\n    };\n\n    // Resolve the optional canvasSize ceiling into per-dimension stretch caps\n    // (βx, βy). Falls back to maxStretch when no ceiling is set.\n    Object.assign(effectiveOptions, deriveStretchCaps(baseSize, sizeCeiling, effectiveOptions));\n    effectiveOptions.facetColumns = resolveFacetColumnsOption(input.chart_spec.chartProperties);\n\n    const {\n        addTooltips: addTooltipsOpt = false,\n    } = effectiveOptions;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0b: filterOverflow (shared)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const allMarkTypes = new Set<string>();\n    if (templateMarkType) allMarkTypes.add(templateMarkType);\n\n    // ── Channel budgets (shared, in layout module) ─────────────────────\n    const budgets = computeChannelBudgets(\n        channelSemantics, declaration, convertedData, canvasSize, effectiveOptions,\n    );\n    const facetGridResult = budgets.facetGrid;\n\n    const overflowResult = filterOverflow(\n        channelSemantics, declaration, encodings, convertedData,\n        budgets, allMarkTypes,\n    );\n\n    const values = overflowResult.filteredData;\n    warnings.push(...overflowResult.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 1: Compute Layout (shared — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const layoutResult = computeLayout(\n        channelSemantics,\n        declaration,\n        values,\n        canvasSize,\n        effectiveOptions,\n        facetGridResult,\n    );\n\n    layoutResult.truncations = overflowResult.truncations;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 2: Instantiate Chart.js Config (CJS-specific)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    // Build resolved encodings for interface compatibility\n    const resolvedEncodings: Record<string, any> = {};\n    for (const [channel, encoding] of Object.entries(encodings)) {\n        const cs = channelSemantics[channel];\n        if (cs) {\n            resolvedEncodings[channel] = {\n                field: cs.field,\n                type: cs.type,\n                aggregate: encoding.aggregate,\n            };\n        }\n    }\n\n    // Template instantiate\n    const instantiateContext: InstantiateContext = {\n        channelSemantics,\n        layout: layoutResult,\n        table: values,\n        fullTable: convertedData,\n        resolvedEncodings,\n        encodings,\n        chartProperties,\n        staticSeries,\n        canvasSize,\n        semanticTypes,\n        chartType,\n        assembleOptions: effectiveOptions,\n        colorDecisions: decideColorMaps({\n            chartType,\n            encodings,\n            channelSemantics,\n            table: values,\n            background: 'light',\n        }),\n    };\n\n    const colField = channelSemantics.column?.field;\n    const rowField = channelSemantics.row?.field;\n    const hasFacet = !!(colField || rowField);\n    const hasAxes = chartTemplate.channels.includes('x') || chartTemplate.channels.includes('y');\n\n    let cjsConfig: any;\n    if (hasFacet && hasAxes) {\n        const colValues = colField ? [...new Set(values.map((r: any) => String(r[colField])))] : [''];\n        const rowValues = rowField ? [...new Set(values.map((r: any) => String(r[rowField])))] : [''];\n        const facetLegend: Array<{ label: string; color: string }> = [];\n\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        let sharedYDomain: { min: number; max: number } | undefined;\n        if (yField) {\n            const nums = values\n                .map((r: any) => r[yField])\n                .filter((v: any) => typeof v === 'number' && Number.isFinite(v)) as number[];\n            if (nums.length > 0) {\n                const rawMin = Math.min(...nums);\n                const rawMax = Math.max(...nums);\n                const forceZero = !!channelSemantics.y?.zero?.zero;\n                const min = forceZero ? Math.min(0, rawMin) : rawMin;\n                const max = forceZero ? Math.max(0, rawMax) : rawMax;\n                // Round to \"nice\" bounds so the shared top/bottom land on round\n                // tick values. Otherwise Chart.js draws an extra tick at the\n                // exact data extreme (e.g. 517 or 169,877) that overlaps the\n                // adjacent round tick — Vega-Lite always uses nice bounds here.\n                sharedYDomain = niceBounds(min, max);\n            }\n        }\n\n        // Only the leftmost column reserves room for the shared y-axis; inner\n        // columns drop it and reclaim that width (see estimateYAxisGutter).\n        const axisGutter = sharedYDomain ? estimateYAxisGutter(sharedYDomain) : 0;\n\n        // Column wrapping: a column-only facet with more categories than fit in\n        // one row wraps into a 2D grid (matching Vega-Lite / ECharts). The wrap\n        // width comes from the shared facet-grid budget. computeLayout already\n        // sized the panels for this column count, so we only need to restructure\n        // the flat column list into rows. (2D col+row facets never wrap.)\n        const maxColsPerRow = (colField && !rowField)\n            ? (facetGridResult?.columns ?? colValues.length)\n            : colValues.length;\n        const wrapColumnOnly = !!colField && !rowField && maxColsPerRow < colValues.length;\n\n        const gridRows: Array<Array<{ colVal: string; rowVal: string }>> = [];\n        if (wrapColumnOnly) {\n            for (let i = 0; i < colValues.length; i += maxColsPerRow) {\n                gridRows.push(\n                    colValues.slice(i, i + maxColsPerRow).map((cv) => ({ colVal: cv, rowVal: '' })),\n                );\n            }\n        } else {\n            for (let ri = 0; ri < rowValues.length; ri++) {\n                gridRows.push(colValues.map((cv) => ({ colVal: cv, rowVal: rowValues[ri] })));\n            }\n        }\n\n        const panelRows: any[][] = [];\n        for (let ri = 0; ri < gridRows.length; ri++) {\n            const rowPanels: any[] = [];\n            const cells = gridRows[ri];\n            for (let ci = 0; ci < cells.length; ci++) {\n                const { colVal, rowVal } = cells[ci];\n                const panelData = values.filter((r: any) => {\n                    if (colField && String(r[colField]) !== colVal) return false;\n                    if (rowField && String(r[rowField]) !== rowVal) return false;\n                    return true;\n                });\n\n                const panelConfig: any = structuredClone(chartTemplate.template);\n                const panelContext: InstantiateContext = {\n                    ...instantiateContext,\n                    table: panelData,\n                    layout: layoutResult,\n                };\n                chartTemplate.instantiate(panelConfig, panelContext);\n                // Keep all facet panels the same plot size: disable per-panel built-in legend.\n                // A shared legend is rendered by the gallery host.\n                if (!panelConfig.options) panelConfig.options = {};\n                if (!panelConfig.options.plugins) panelConfig.options.plugins = {};\n                panelConfig.options.plugins.legend = {\n                    ...(panelConfig.options.plugins.legend || {}),\n                    display: false,\n                    position: 'right',\n                };\n                cjsApplyLayoutToSpec(panelConfig, panelContext, []);\n                if (addTooltipsOpt) cjsApplyTooltips(panelConfig);\n                if (chartTemplate.postProcess) chartTemplate.postProcess(panelConfig, panelContext);\n\n                // Shared y-axis across a facet row: only the leftmost column\n                // draws the y tick labels and axis title. Inner columns hide\n                // them entirely (display:false) and shrink their panel width by\n                // the reclaimed gutter, so panels pack tightly and the layout\n                // scales with the canvas. The renderer pins the leftmost axis\n                // width to `axisGutter` so every panel's plot area stays equal\n                // and the lines line up across the row.\n                if (ci > 0 && panelConfig.options?.scales?.y) {\n                    const yScale = panelConfig.options.scales.y;\n                    yScale.ticks = { ...(yScale.ticks || {}), display: false };\n                    yScale.title = { ...(yScale.title || {}), display: false };\n                    yScale.border = { ...(yScale.border || {}), display: false };\n                    if (typeof panelConfig._width === 'number') {\n                        panelConfig._width = Math.max(40, panelConfig._width - axisGutter);\n                    }\n                }\n\n                // Consistent x-axis labels across facet columns. Faceted small\n                // multiples are narrow, and a continuous/temporal x-axis places\n                // its first tick at the panel's left edge. On the leftmost panel\n                // the y-axis gutter gives the leading label room, but inner\n                // panels (no left gutter) clip it, so Chart.js drops it — leaving\n                // each facet with a different set of date labels. `align: 'inner'`\n                // pulls the first/last tick labels inside the chart area so they\n                // render on every panel, keeping the labels consistent across the\n                // row. Detect a continuous x-axis via the template's tick callback.\n                const xScale = panelConfig.options?.scales?.x;\n                if (xScale && typeof xScale.ticks?.callback === 'function') {\n                    xScale.ticks = { ...(xScale.ticks || {}), align: 'inner' };\n                }\n\n                if (facetLegend.length === 0 && colorField && Array.isArray(panelConfig.data?.datasets)) {\n                    for (const ds of panelConfig.data.datasets) {\n                        const label = String(ds?.label ?? '').trim();\n                        if (!label) continue;\n                        const color = String(ds?.borderColor ?? ds?.backgroundColor ?? '#666');\n                        facetLegend.push({ label, color });\n                    }\n                }\n\n                rowPanels.push({\n                    key: `${ri}:${ci}`,\n                    rowIndex: ri,\n                    colIndex: ci,\n                    rowHeader: rowField ? rowVal : undefined,\n                    colHeader: colField ? colVal : undefined,\n                    config: panelConfig,\n                });\n            }\n            panelRows.push(rowPanels);\n        }\n\n        cjsConfig = cjsCombineFacetPanels(\n            panelRows,\n            !!colField,\n            !!rowField,\n            sharedYDomain,\n            axisGutter,\n            wrapColumnOnly,\n        );\n        cjsConfig._facetLegend = facetLegend;\n    } else {\n        cjsConfig = structuredClone(chartTemplate.template);\n        chartTemplate.instantiate(cjsConfig, instantiateContext);\n        cjsApplyLayoutToSpec(cjsConfig, instantiateContext, warnings);\n        if (addTooltipsOpt) cjsApplyTooltips(cjsConfig);\n        if (chartTemplate.postProcess) chartTemplate.postProcess(cjsConfig, instantiateContext);\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // RESULT\n    // ═══════════════════════════════════════════════════════════════════════\n\n    if (warnings.length > 0) {\n        cjsConfig._warnings = warnings;\n    }\n\n    cjsConfig._dataLength = values.length;\n\n    if (transformed.surface) {\n        cjsConfig._transform = transformed.surface;\n    }\n    // Legacy single-control surface for getChartjsPivot — enumerated from the\n    // authored template so ids/labels match the pre-split contract.\n    const legacyPivot = applyPivot(authoredTemplate, typedRawEncodings, data, chartProperties, cjsGetTemplateDef);\n    if (legacyPivot.surface) {\n        cjsConfig._pivot = legacyPivot.surface;\n    }\n\n    return cjsConfig;\n}\n\n/** Inspect the Chart.js legacy (composed) view transformation surface for an input. */\nexport function getChartjsPivot(input: ChartAssemblyInput): PivotSurface | undefined {\n    const spec = assembleChartjs(input);\n    return spec && spec._pivot ? (spec._pivot as PivotSurface) : undefined;\n}\n\n/** Inspect the Chart.js two-control transform surface for an input. */\nexport function getChartjsTransform(input: ChartAssemblyInput): TransformSurface | undefined {\n    const spec = assembleChartjs(input);\n    return spec && spec._transform ? (spec._transform as TransformSurface) : undefined;\n}\n\n/**\n * Round a [min, max] interval outward to \"nice\" round numbers so a shared facet\n * axis lands its endpoints on clean tick values (mirrors Vega-Lite's default\n * `nice: true`). Without this, Chart.js adds a tick at the exact data extreme,\n * which overlaps the neighbouring round tick.\n */\nfunction niceBounds(min: number, max: number, targetTicks = 5): { min: number; max: number } {\n    if (!(Number.isFinite(min) && Number.isFinite(max)) || max <= min) {\n        return { min, max };\n    }\n    const niceNum = (range: number, round: boolean): number => {\n        const exp = Math.floor(Math.log10(range));\n        const frac = range / 10 ** exp;\n        let niceFrac: number;\n        if (round) {\n            niceFrac = frac < 1.5 ? 1 : frac < 3 ? 2 : frac < 7 ? 5 : 10;\n        } else {\n            niceFrac = frac <= 1 ? 1 : frac <= 2 ? 2 : frac <= 5 ? 5 : 10;\n        }\n        return niceFrac * 10 ** exp;\n    };\n    const step = niceNum(niceNum(max - min, false) / Math.max(1, targetTicks - 1), true);\n    return {\n        min: Math.floor(min / step) * step,\n        max: Math.ceil(max / step) * step,\n    };\n}\n\n/**\n * Estimate the horizontal space (px) a faceted line/bar y-axis needs for its\n * tick labels plus the rotated axis title. Only the leftmost facet column draws\n * this axis; inner columns reclaim the space, so the figure packs tightly and\n * stays responsive to the canvas size (instead of every panel paying a fixed\n * ~70px gutter).\n */\nfunction estimateYAxisGutter(domain: { min: number; max: number }): number {\n    const fmt = (v: number) => {\n        const r = Math.round(v);\n        return Math.abs(r) >= 1000 ? r.toLocaleString() : String(r);\n    };\n    const chars = Math.max(fmt(domain.min).length, fmt(domain.max).length);\n    // ~6.5px per label char + tick padding (~12) + rotated axis title (~18).\n    return Math.ceil(chars * 6.5) + 30;\n}\n\nfunction cjsCombineFacetPanels(\n    panelRows: any[][],\n    hasColHeader: boolean,\n    hasRowHeader: boolean,\n    sharedYDomain?: { min: number; max: number },\n    axisGutter = 0,\n    colHeaderPerRow = false,\n): any {\n    const rows = panelRows.length;\n    const cols = Math.max(1, ...panelRows.map(r => r.length));\n    const ref = panelRows[0]?.[0]?.config;\n    const panelH = ref?._height || 300;\n    const gap = 16;\n    const colHeaderH = hasColHeader ? 22 : 0;\n    const rowHeaderW = hasRowHeader ? 28 : 0;\n\n    // Column widths vary: the leftmost column keeps the y-axis gutter; the rest\n    // are narrower. Sum the first row's actual panel widths for the figure size.\n    const colWidths = Array.from({ length: cols }, (_, ci) =>\n        (panelRows[0]?.[ci]?.config?._width as number) || ref?._width || 400,\n    );\n    const totalPanelsW = colWidths.reduce((a, b) => a + b, 0);\n\n    // Wrapped column-only facets repeat the column-header band above every row;\n    // otherwise there is a single header band across the top.\n    const headerBands = colHeaderPerRow ? rows : (hasColHeader ? 1 : 0);\n\n    return {\n        _facet: true,\n        _facetPanels: panelRows,\n        _facetRows: rows,\n        _facetCols: cols,\n        _facetSharedYDomain: sharedYDomain,\n        _facetAxisGutter: axisGutter,\n        _facetColHeaderPerRow: colHeaderPerRow,\n        _width: rowHeaderW + totalPanelsW + (cols - 1) * gap,\n        _height: headerBands * colHeaderH + rows * panelH + (rows - 1) * gap,\n    };\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Chart.js recommendation & adaptation wrappers.\n */\n\nimport { adaptChannels, recommendChannels } from '../core/recommendation';\nimport {\n    recommendChartTypes,\n    type RecommendChartTypesOptions,\n    type RecommendedChart,\n} from '../core/chart-type-recommendation';\nimport { cjsGetTemplateChannels, cjsAllTemplateDefs } from './templates';\n\nexport function cjsAdaptChart(\n    sourceType: string,\n    targetType: string,\n    encodings: Record<string, string>,\n    data?: any[],\n    semanticTypes?: Record<string, string>,\n): Record<string, string> {\n    const targetChannels = cjsGetTemplateChannels(targetType);\n    return adaptChannels(sourceType, targetType, targetChannels, encodings, data, semanticTypes);\n}\n\nexport function cjsRecommendEncodings(\n    chartType: string,\n    data: any[],\n    semanticTypes: Record<string, string>,\n): Record<string, string> {\n    const rec = recommendChannels(chartType, data, semanticTypes);\n    const validChannels = cjsGetTemplateChannels(chartType);\n    const result: Record<string, string> = {};\n    for (const [ch, field] of Object.entries(rec)) {\n        if (validChannels.includes(ch)) result[ch] = field;\n    }\n    return result;\n}\n\n/** Chart-type names Chart.js can render (its template catalog). */\nconst CJS_SUPPORTED_TYPES = cjsAllTemplateDefs.map(d => d.chart);\n\n/**\n * Recommend a ranked list of Chart.js chart types for a dataset, restricted to\n * chart types Chart.js can render. See {@link cjsRecommendCharts} for the\n * one-step variant that also fills channels.\n */\nexport function cjsRecommendChartTypes(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): string[] {\n    return recommendChartTypes(data, semanticTypes, { ...options, supportedTypes: CJS_SUPPORTED_TYPES });\n}\n\n/**\n * One-step recommendation: rank Chart.js chart types for the data, then populate\n * each with {@link cjsRecommendEncodings}. Suggestions whose required channels\n * cannot be filled are dropped, so every returned chart is renderable.\n */\nexport function cjsRecommendCharts(\n    data: any[],\n    semanticTypes: Record<string, string>,\n    options: Omit<RecommendChartTypesOptions, 'supportedTypes'> = {},\n): RecommendedChart[] {\n    const { max, ...rest } = options;\n    const charts = cjsRecommendChartTypes(data, semanticTypes, rest)\n        .map(chartType => ({ chartType, encodings: cjsRecommendEncodings(chartType, data, semanticTypes) }))\n        .filter(s => Object.keys(s.encodings).length > 0);\n    return max != null ? charts.slice(0, max) : charts;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// Plotly 专用调色板定义。\n// 承接 core/color-decisions.ts 中的抽象 colormap 信息（schemeType / schemeId / categoryCount），\n// 但真正的颜色数组与选盘策略完全在 Plotly backend 本地实现，并尽量贴近 Plotly 默认配色。\n\nimport type { ColorDecision, ColorMapType } from '../core/color-decisions';\n\nexport type PlotlyPaletteId = 'plotly10' | 'light24' | 'viridis' | 'RdBu' | string;\n\nexport interface PlotlyColorMapDef {\n    id: PlotlyPaletteId;\n    type: ColorMapType;\n    supportsDiscrete: boolean;\n    supportsContinuous: boolean;\n    background: 'light' | 'dark' | 'any';\n    colorblindSafe?: boolean;\n    maxCategories?: number;\n    diverging?: boolean;\n    preferredMidpoint?: number;\n    colors: string[];\n}\n\n/**\n * Plotly 常用的基础配色。plotly10 即 plotly.js 默认 `layout.colorway`；\n * light24 对应 px.colors.qualitative.Light24 的前 20 色，用于高基数类别。\n */\nconst PLOTLY_COLOR_MAPS: PlotlyColorMapDef[] = [\n    {\n        id: 'plotly10',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'any',\n        maxCategories: 10,\n        colorblindSafe: false,\n        colors: [\n            '#636efa', // blue-violet\n            '#EF553B', // red-orange\n            '#00cc96', // green\n            '#ab63fa', // purple\n            '#FFA15A', // orange\n            '#19d3f3', // cyan\n            '#FF6692', // pink\n            '#B6E880', // light green\n            '#FF97FF', // magenta\n            '#FECB52', // yellow\n        ],\n    },\n    {\n        id: 'light24',\n        type: 'categorical',\n        supportsDiscrete: true,\n        supportsContinuous: false,\n        background: 'light',\n        maxCategories: 24,\n        colorblindSafe: false,\n        colors: [\n            '#FD3216', '#00FE35', '#6A76FC', '#FED4C4', '#FE00CE',\n            '#0DF9FF', '#F6F926', '#FF9616', '#479B55', '#EEA6FB',\n            '#DC587D', '#D626FF', '#6E899C', '#00B5F7', '#B68E00',\n            '#C9FBE5', '#FF0092', '#22FFA7', '#E3EE9E', '#86CE00',\n            '#BC7196', '#7E7DCD', '#FC6955', '#E48F72',\n        ],\n    },\n    {\n        id: 'viridis',\n        type: 'sequential',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        colorblindSafe: true,\n        colors: [\n            '#440154', '#46327e', '#365c8d', '#277f8e',\n            '#1fa187', '#4ac16d', '#a0da39', '#fde725',\n        ],\n    },\n    {\n        id: 'RdBu',\n        type: 'diverging',\n        supportsDiscrete: true,\n        supportsContinuous: true,\n        background: 'any',\n        diverging: true,\n        preferredMidpoint: 0,\n        colors: [\n            '#b2182b', '#d6604d', '#f4a582', '#fddbc7',\n            '#f7f7f7',\n            '#d1e5f0', '#92c5de', '#4393c3', '#2166ac',\n        ],\n    },\n];\n\nfunction getMapById(id: PlotlyPaletteId | undefined): PlotlyColorMapDef | undefined {\n    if (!id) return undefined;\n    const key = String(id).toLowerCase();\n    return PLOTLY_COLOR_MAPS.find(m => m.id.toLowerCase() === key);\n}\n\nexport function getPaletteForScheme(id: PlotlyPaletteId): string[] | undefined {\n    const entry = getMapById(id);\n    return entry?.colors;\n}\n\n/**\n * Plotly 侧的「选盘」函数：等价于 chartjs/colormap.ts 的 pickChartJsPalette。\n *\n * 策略：\n *   1）若用户显式指定了 schemeId，则优先按该 id 取 palette。\n *   2）否则根据 schemeType + categoryCount 自动挑选合适的盘：\n *        - categorical：按类别数量在 plotly10 / light24 之间选；\n *        - sequential：优先 viridis；\n *        - diverging ：优先 RdBu。\n *   3）若都无法命中，回退到 Plotly 默认 categorical palette（plotly10）。\n */\nexport function pickPlotlyPalette(decision: ColorDecision | undefined): string[] {\n    if (!decision) {\n        const fallback = getPaletteForScheme('plotly10');\n        return fallback && fallback.length ? fallback : [];\n    }\n\n    const { schemeType, schemeId, categoryCount } = decision;\n\n    if (schemeId) {\n        const fromId = getPaletteForScheme(schemeId);\n        if (fromId && fromId.length > 0) {\n            return fromId;\n        }\n    }\n\n    const mapsOfType = PLOTLY_COLOR_MAPS.filter(m => m.type === schemeType);\n\n    if (schemeType === 'categorical') {\n        const k = categoryCount ?? 0;\n        const candidates = mapsOfType.filter(m => m.supportsDiscrete);\n        if (candidates.length) {\n            const byCapacity = candidates\n                .filter(m => m.maxCategories == null || m.maxCategories >= k)\n                .sort((a, b) => (a.maxCategories ?? Infinity) - (b.maxCategories ?? Infinity));\n            const picked = byCapacity[0] ?? candidates[0];\n            if (picked.colors.length) {\n                return picked.colors;\n            }\n        }\n    } else if (schemeType === 'sequential') {\n        const seq = mapsOfType.find(m => m.supportsContinuous) ?? getMapById('viridis');\n        if (seq && seq.colors.length) {\n            return seq.colors;\n        }\n    } else if (schemeType === 'diverging') {\n        const divergingFirst = mapsOfType.find(m => m.diverging) ?? getMapById('RdBu');\n        if (divergingFirst && divergingFirst.colors.length) {\n            return divergingFirst.colors;\n        }\n    }\n\n    const fallback = getPaletteForScheme('plotly10');\n    return fallback && fallback.length ? fallback : [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Shared helper functions for Plotly template hooks.\n * Pure logic — no UI dependencies.\n */\n\nimport type { ChannelSemantics, InstantiateContext } from '../../core/types';\nimport { pickPlotlyPalette } from '../colormap';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** Exported alias so templates can share the same discrete-type predicate. */\nexport const isDiscreteType = isDiscrete;\n\n/** True if every category label parses as a number (used to decide label rotation). */\nexport function areCategoriesNumeric(cats: string[]): boolean {\n    if (cats.length === 0) return true;\n    return cats.every((c) => {\n        const s = String(c).trim();\n        if (s === '') return false;\n        const n = Number(s);\n        return !isNaN(n) && isFinite(n);\n    });\n}\n\n/**\n * Extract unique category values from data for a given field, preserving order.\n * If `ordinalSortOrder` is provided, returns values sorted in that canonical order.\n */\nexport function extractCategories(data: any[], field: string, ordinalSortOrder?: string[]): string[] {\n    const seen = new Set<string>();\n    const result: string[] = [];\n    for (const row of data) {\n        const val = row[field];\n        if (val != null) {\n            const key = String(val);\n            if (!seen.has(key)) {\n                seen.add(key);\n                result.push(key);\n            }\n        }\n    }\n\n    if (ordinalSortOrder && ordinalSortOrder.length > 0) {\n        const orderMap = new Map(ordinalSortOrder.map((v, i) => [v, i]));\n        result.sort((a, b) => {\n            const ia = orderMap.get(a);\n            const ib = orderMap.get(b);\n            if (ia !== undefined && ib !== undefined) return ia - ib;\n            if (ia !== undefined) return -1;\n            if (ib !== undefined) return 1;\n            return 0;\n        });\n    }\n\n    return result;\n}\n\n/**\n * Resolve the display order of a categorical axis, honoring either a canonical\n * `ordinalSortOrder` (months, weekdays, …) or a sort-by-measure request\n * (`sortBy` + `sortOrder` from the shared \"Sort\" control). Plotly has no native\n * \"order a categorical axis by another field\" (Vega-Lite's `sort` op), so we\n * aggregate the measure per category (sum) and order ascending/descending here.\n */\nexport function resolveCategoryOrder(\n    data: any[],\n    catField: string,\n    opts?: { ordinalSortOrder?: string[]; sortBy?: string; sortOrder?: 'ascending' | 'descending' },\n): string[] {\n    const base = extractCategories(data, catField, opts?.ordinalSortOrder);\n    if (!opts?.sortBy) return base;\n    const agg = new Map<string, number>();\n    for (const row of data) {\n        const cat = String(row[catField] ?? '');\n        const v = Number(row[opts.sortBy]);\n        if (Number.isFinite(v)) agg.set(cat, (agg.get(cat) ?? 0) + v);\n    }\n    const dir = opts.sortOrder === 'ascending' ? 1 : -1;\n    return [...base].sort((a, b) => dir * ((agg.get(a) ?? 0) - (agg.get(b) ?? 0)));\n}\n\n/**\n * Group data by a categorical field.\n * Returns a map: seriesName → rows[].\n */\nexport function groupBy(data: any[], field: string): Map<string, any[]> {\n    const groups = new Map<string, any[]>();\n    for (const row of data) {\n        const key = String(row[field] ?? '');\n        if (!groups.has(key)) groups.set(key, []);\n        groups.get(key)!.push(row);\n    }\n    return groups;\n}\n\n/**\n * Build category-aligned value array for a subset of rows.\n * Returns values indexed by category position (null for missing).\n */\nexport function buildCategoryAlignedData(\n    rows: any[],\n    catField: string,\n    valField: string,\n    categories: string[],\n): (number | null)[] {\n    const map = new Map<string, number>();\n    for (const row of rows) {\n        const key = String(row[catField] ?? '');\n        const val = row[valField];\n        if (val != null && !isNaN(val)) {\n            map.set(key, (map.get(key) ?? 0) + Number(val));\n        }\n    }\n    return categories.map(cat => map.get(cat) ?? null);\n}\n\n/**\n * Detect which axis is the category (banded) axis and which is the value axis.\n *\n * A bar's length is encoded on the **quantitative** axis; the band axis is the\n * other one — which may be discrete (nominal/ordinal) *or* temporal (a bar over\n * time is banded per period). Checking only for discreteness misses the temporal\n * case and leaves dates on the value axis (→ empty bars).\n */\nexport function detectAxes(\n    channelSemantics: Record<string, ChannelSemantics>,\n): { categoryAxis: 'x' | 'y'; valueAxis: 'x' | 'y' } {\n    const xCS = channelSemantics.x;\n    const yCS = channelSemantics.y;\n    const xQuant = !!xCS && xCS.type === 'quantitative';\n    const yQuant = !!yCS && yCS.type === 'quantitative';\n\n    // Bar length lives on the quantitative axis; the band is the other axis.\n    if (yQuant && !xQuant) return { categoryAxis: 'x', valueAxis: 'y' }; // vertical\n    if (xQuant && !yQuant) return { categoryAxis: 'y', valueAxis: 'x' }; // horizontal\n\n    // Fallbacks (both discrete, both quantitative, or missing): discrete-first.\n    if (xCS && isDiscrete(xCS.type)) {\n        return { categoryAxis: 'x', valueAxis: 'y' };\n    }\n    if (yCS && isDiscrete(yCS.type)) {\n        return { categoryAxis: 'y', valueAxis: 'x' };\n    }\n    return { categoryAxis: 'x', valueAxis: 'y' };\n}\n\n/**\n * Coerce a temporal value to an ISO-8601 string for Plotly's native `date`\n * axis. Numbers below 1e12 are treated as Unix seconds; strings and Dates are\n * parsed directly. Returns null when unparseable.\n */\nexport function coerceIsoDateForPlotly(raw: unknown): string | null {\n    if (raw == null) return null;\n    let ms: number;\n    if (typeof raw === 'number' && Number.isFinite(raw)) {\n        ms = raw < 1e12 ? Math.round(raw * 1000) : raw;\n    } else if (raw instanceof Date) {\n        ms = raw.getTime();\n    } else {\n        ms = new Date(String(raw)).getTime();\n    }\n    return Number.isFinite(ms) ? new Date(ms).toISOString() : null;\n}\n\n/**\n * Plotly's default qualitative palette (plotly.js `layout.colorway` defaults).\n * Fallback when no color decision is available; the decision-aware path lives\n * in ../colormap.ts (mirroring chartjs/colormap.ts).\n */\nexport const PLOTLY_COLORS = [\n    '#636efa', // blue-violet\n    '#EF553B', // red-orange\n    '#00cc96', // green\n    '#ab63fa', // purple\n    '#FFA15A', // orange\n    '#19d3f3', // cyan\n    '#FF6692', // pink\n    '#B6E880', // light green\n    '#FF97FF', // magenta\n    '#FECB52', // yellow\n];\n\n/**\n * 从 color-decisions 解析调色板；若没有决策则回退到 Plotly 默认 plotly10。\n * (Mirror of chartjs/templates/utils.ts getChartJsPalette.)\n */\nexport function getPlotlyPalette(ctx: InstantiateContext, preferred: 'color' | 'group' = 'color'): string[] {\n    const decisions = ctx.colorDecisions;\n    const decision =\n        preferred === 'color'\n            ? decisions?.color ?? decisions?.group\n            : decisions?.group ?? decisions?.color;\n\n    const palette = pickPlotlyPalette(decision);\n    if (palette.length > 0) {\n        return palette;\n    }\n    return PLOTLY_COLORS;\n}\n\n/** Series color by index from a resolved palette. */\nexport function getSeriesColor(palette: string[], index: number): string {\n    if (!palette.length) {\n        return PLOTLY_COLORS[index % PLOTLY_COLORS.length];\n    }\n    return palette[index % palette.length];\n}\n\n/** Hex → rgba with alpha, for translucent fills (area/violin/density/range-area). */\nexport function fillColor(hex: string, alpha: number): string {\n    const m = /^#?([0-9a-f]{6})$/i.exec(String(hex ?? '').trim());\n    if (!m) return hex;\n    const v = parseInt(m[1], 16);\n    const a = Math.max(0, Math.min(1, alpha));\n    return `rgba(${(v >> 16) & 255}, ${(v >> 8) & 255}, ${v & 255}, ${a})`;\n}\n\n/**\n * Bandwidth for Gaussian KDE — matches vega-statistics (bandwidth.js), shared\n * with the equivalent Vega-Lite/ECharts density templates so curves line up.\n */\nexport function estimateBandwidth(values: number[]): number {\n    const n = values.length;\n    if (n < 2) return 1;\n    const sorted = [...values].sort((a, b) => a - b);\n    const mean = values.reduce((a, b) => a + b, 0) / n;\n    const variance = values.reduce((s, v) => s + (v - mean) ** 2, 0) / n;\n    const d = Math.sqrt(variance);\n    const q1 = sorted[Math.floor((n - 1) * 0.25)];\n    const q3 = sorted[Math.floor((n - 1) * 0.75)];\n    const iqr = (q3 != null && q1 != null) ? q3 - q1 : 0;\n    const h = iqr / 1.34;\n    const v = Math.min(d, h || d) || d || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n}\n\n/** One-dimensional Gaussian KDE over an extent. */\nexport function kde(\n    values: number[], steps: number, bandwidthMultiplier: number,\n    extent?: { min: number; max: number },\n): { x: number[]; y: number[] } {\n    if (values.length === 0) return { x: [], y: [] };\n    const lo = extent ? extent.min : Math.min(...values);\n    const hi = extent ? extent.max : Math.max(...values);\n    const range = hi - lo || 1;\n    const h = estimateBandwidth(values) * bandwidthMultiplier;\n    const n = values.length;\n    const x: number[] = [];\n    const y: number[] = [];\n    for (let i = 0; i <= steps; i++) {\n        const t = lo + (i / steps) * (hi - lo || range);\n        let sum = 0;\n        for (const v of values) {\n            const z = (t - v) / h;\n            sum += Math.exp(-0.5 * z * z);\n        }\n        const density = sum / (n * h * Math.sqrt(2 * Math.PI));\n        x.push(t);\n        y.push(density);\n    }\n    return { x, y };\n}\n\n/**\n * Sorted distinct (value, cumulative-proportion) pairs for an ECDF, using the\n * \"≤ x\" convention (ties collapse to the last occurrence's proportion).\n */\nexport function ecdfPairs(values: number[]): [number, number][] {\n    const sorted = values.filter(v => Number.isFinite(v)).sort((a, b) => a - b);\n    const n = sorted.length;\n    const pairs: [number, number][] = [];\n    if (n === 0) return pairs;\n    let i = 0;\n    while (i < n) {\n        let j = i;\n        while (j + 1 < n && sorted[j + 1] === sorted[i]) j++;\n        pairs.push([sorted[i], (j + 1) / n]);\n        i = j + 1;\n    }\n    return pairs;\n}\n\n/** Deterministic pseudo-random generator (LCG) for reproducible jitter. */\nexport function seededJitter(seed: number): () => number {\n    let s = seed;\n    return () => {\n        s = (s * 1103515245 + 12345) & 0x7fffffff;\n        return (s / 0x7fffffff) * 2 - 1;\n    };\n}\n\n/** Round up to a \"nice\" ceiling (radar/gauge axis maxima). */\nexport function niceMax(v: number): number {\n    if (v <= 0) return 1;\n    const pow = Math.pow(10, Math.floor(Math.log10(v)));\n    const mantissa = v / pow;\n    const nice = mantissa <= 1 ? 1\n        : mantissa <= 2 ? 2\n        : mantissa <= 2.5 ? 2.5\n        : mantissa <= 5 ? 5\n        : 10;\n    return nice * pow;\n}\n\n/**\n * Stable sort of `rows` by a sequence field: numeric when every present value\n * parses as a number, chronological when every value parses as a date,\n * lexical otherwise. Ties keep their original row order.\n */\nexport function sortByOrder(rows: any[], field: string | undefined): any[] {\n    if (!field) return rows;\n    const tagged = rows.map((row, idx) => ({ row, idx, key: row[field] }));\n    const present = tagged.filter(t => t.key != null && t.key !== '');\n    const allNumeric = present.length > 0 &&\n        present.every(t => typeof t.key === 'number' ||\n            (typeof t.key === 'string' && t.key.trim() !== '' && !isNaN(Number(t.key))));\n    const allDates = !allNumeric && present.length > 0 &&\n        present.every(t => !isNaN(Date.parse(String(t.key))));\n    const rank = (k: any): number | string => {\n        if (allNumeric) return Number(k);\n        if (allDates) return Date.parse(String(k));\n        return String(k);\n    };\n    return [...tagged].sort((a, b) => {\n        const ra = rank(a.key);\n        const rb = rank(b.key);\n        if (ra < rb) return -1;\n        if (ra > rb) return 1;\n        return a.idx - b.idx;\n    }).map(t => t.row);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Bar Chart template.\n *\n * Mirrors the Chart.js Bar template's decisions (category detection,\n * ordinal sort order, zero baseline, horizontal transposition), expressed\n * as a Plotly `bar` trace:\n *   CJS: { type: 'bar', data: { labels, datasets[] }, options: { indexAxis } }\n *   PL:  { data: [{ type: 'bar', x, y, orientation }], layout: { xaxis, yaxis } }\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport { extractCategories, resolveCategoryOrder, buildCategoryAlignedData, detectAxes, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { detectBandedAxisFromSemantics, detectBandedAxisForceDiscrete } from '../../core/axis-detection';\nimport { planBandDodge } from '../../core/band-dodge';\nimport { makeSortAction } from '../../core/encoding-actions';\nimport { makeCartesianPivot } from '../../core/pivot';\n\n/** Corner-radius property shared by the Plotly bar templates (px, matches VL). */\nconst BAR_CORNER_RADIUS: ChartPropertyDef = {\n    key: 'cornerRadius', label: 'Corners', type: 'continuous',\n    min: 0, max: 15, step: 1, defaultValue: 0,\n};\n\nexport const plBarChartDef: ChartTemplateDef = {\n    chart: 'Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        // `sortBy` from the Sort action is the measure CHANNEL ('x'|'y'); map it\n        // to its field so we can order categories by that measure.\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder,\n            sortBy: sortByField,\n            sortOrder: catEnc?.sortOrder,\n        });\n        const values = buildCategoryAlignedData(table, catField, valField, categories);\n\n        const isHorizontal = categoryAxis === 'y';\n        const palette = getPlotlyPalette(ctx);\n        const cornerRadius = Number(chartProperties?.cornerRadius ?? 0);\n\n        const catAxisSpec = {\n            type: 'category' as const,\n            categoryorder: 'array' as const,\n            categoryarray: categories,\n            title: { text: catField },\n        };\n        const valCS = channelSemantics[valueAxis];\n        // Bars encode length — include zero unless the semantic decision says otherwise.\n        const includeZero = valCS?.zero ? valCS.zero.zero !== false : true;\n        const valAxisSpec = {\n            title: { text: valField },\n            rangemode: (includeZero ? 'tozero' : 'normal') as 'tozero' | 'normal',\n        };\n\n        const figure: any = {\n            data: [{\n                type: 'bar',\n                name: valField,\n                ...(isHorizontal\n                    ? { x: values, y: categories, orientation: 'h' }\n                    : { x: categories, y: values }),\n                marker: {\n                    color: getSeriesColor(palette, 0),\n                    ...(cornerRadius > 0 ? { cornerradius: cornerRadius } : {}),\n                },\n            }],\n            layout: {\n                bargap: 0.2,\n                ...(isHorizontal\n                    ? { xaxis: valAxisSpec, yaxis: catAxisSpec }\n                    : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: false,\n            },\n        };\n\n        Object.assign(spec, figure);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [BAR_CORNER_RADIUS],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'column', 'row'],\n    }),\n};\n\n// ─── Stacked Bar Chart ──────────────────────────────────────────────────────\n\n/**\n * Plotly Stacked Bar Chart — one trace per `color` group, `layout.barmode:\n * 'stack'`. Plotly stacks traces natively by matching x/category positions,\n * so (unlike Chart.js/ECharts) no manual per-band accumulation is needed.\n */\nexport const plStackedBarChartDef: ChartTemplateDef = {\n    chart: 'Stacked Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const colorField = channelSemantics.color?.field;\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder, sortBy: sortByField, sortOrder: catEnc?.sortOrder,\n        });\n        const isHorizontal = categoryAxis === 'y';\n        const palette = getPlotlyPalette(ctx, 'color');\n        // 100%-stacked toggle (Stack property): Plotly normalizes each band to\n        // 100% via `barnorm: 'percent'`; the value-axis title then reflects %.\n        const normalize = colorField && chartProperties?.stackMode === 'normalize';\n\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                const values = buildCategoryAlignedData(rows, catField, valField, categories);\n                traces.push({\n                    type: 'bar',\n                    name,\n                    ...(isHorizontal ? { x: values, y: categories, orientation: 'h' } : { x: categories, y: values }),\n                    marker: { color: getSeriesColor(palette, i) },\n                });\n                i++;\n            }\n        } else {\n            const values = buildCategoryAlignedData(table, catField, valField, categories);\n            traces.push({\n                type: 'bar',\n                name: valField,\n                ...(isHorizontal ? { x: values, y: categories, orientation: 'h' } : { x: categories, y: values }),\n                marker: { color: getSeriesColor(palette, 0) },\n            });\n        }\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const valCS = channelSemantics[valueAxis];\n        const includeZero = valCS?.zero ? valCS.zero.zero !== false : true;\n        const valAxisSpec = { title: { text: valField }, rangemode: (includeZero ? 'tozero' : 'normal') as 'tozero' | 'normal' };\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                barmode: 'stack',\n                ...(normalize ? { barnorm: 'percent' } : {}),\n                bargap: 0.2,\n                ...(isHorizontal ? { xaxis: valAxisSpec, yaxis: catAxisSpec } : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'stackMode', label: 'Stack', type: 'discrete',\n          check: (ctx) => ({ applicable: !!ctx.encodings.color?.field }),\n          options: [\n            { value: undefined, label: 'Stacked (default)' },\n            { value: 'normalize', label: 'Normalize (100%)' },\n          ] } as ChartPropertyDef,\n    ],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n\n// ─── Grouped Bar Chart ──────────────────────────────────────────────────────\n\n/**\n * Plotly Grouped Bar Chart — one trace per `group`/`color` value,\n * `layout.barmode: 'group'`. Plotly dodges the bars natively within each\n * category band (equal-width lanes), the native equivalent of the Chart.js/\n * ECharts manual band-dodge planner.\n */\nexport const plGroupedBarChartDef: ChartTemplateDef = {\n    chart: 'Grouped Bar Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'group', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n            paramOverrides: { continuousMarkCrossSection: { x: 20, y: 20, seriesCountAxis: 'auto' } },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const groupField = channelSemantics.group?.field || channelSemantics.color?.field;\n\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        if (!catField || !valField) return;\n\n        const catCS = channelSemantics[categoryAxis];\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: catCS?.ordinalSortOrder, sortBy: sortByField, sortOrder: catEnc?.sortOrder,\n        });\n        const isHorizontal = categoryAxis === 'y';\n        const palette = getPlotlyPalette(ctx, 'group');\n\n        // When the group is redundant/nested with the category axis (group == x,\n        // or a 1:1 pairing), no band holds more than one group value — there is\n        // nothing to dodge. Plotly's native `barmode: 'group'` would still\n        // reserve a lane per group and leave each real bar as a shifted sliver.\n        // Fall back to `barmode: 'overlay'` so each band shows one centered,\n        // full-width colored bar (like a colored bar chart), keeping the legend.\n        const degenerateGroup = !!groupField && planBandDodge(table, catField, groupField).maxPerBand <= 1;\n\n        const traces: any[] = [];\n        if (groupField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, groupField)) {\n                const values = buildCategoryAlignedData(rows, catField, valField, categories);\n                traces.push({\n                    type: 'bar',\n                    name,\n                    ...(isHorizontal ? { x: values, y: categories, orientation: 'h' } : { x: categories, y: values }),\n                    marker: { color: getSeriesColor(palette, i) },\n                });\n                i++;\n            }\n        } else {\n            const values = buildCategoryAlignedData(table, catField, valField, categories);\n            traces.push({\n                type: 'bar',\n                name: valField,\n                ...(isHorizontal ? { x: values, y: categories, orientation: 'h' } : { x: categories, y: values }),\n                marker: { color: getSeriesColor(palette, 0) },\n            });\n        }\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const valCS = channelSemantics[valueAxis];\n        const includeZero = valCS?.zero ? valCS.zero.zero !== false : true;\n        const valAxisSpec = { title: { text: valField }, rangemode: (includeZero ? 'tozero' : 'normal') as 'tozero' | 'normal' };\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                barmode: degenerateGroup ? 'overlay' : 'group',\n                bargap: 0.2,\n                ...(isHorizontal ? { xaxis: valAxisSpec, yaxis: catAxisSpec } : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: !!groupField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n\n/**\n * Plotly Pyramid Chart (population pyramid) — two mirrored horizontal bar\n * traces sharing one category axis, one side negated so the bars extend left\n * and right from a shared zero (`barmode: 'overlay'`; `x` axis ticks show\n * absolute values via `tickformat`/hover text so negative bars still read as\n * positive magnitudes).\n */\nexport const plPyramidChartDef: ChartTemplateDef = {\n    chart: 'Pyramid Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        if (!xField || !yField) return;\n\n        const yDiscrete = yCS?.type === 'nominal' || yCS?.type === 'ordinal';\n        const catField = yDiscrete ? yField : xField;\n        const valField = yDiscrete ? xField : yField;\n        const colorField = channelSemantics.color?.field || channelSemantics.group?.field;\n\n        const catCS = yDiscrete ? yCS : xCS;\n        const categories = extractCategories(table, catField!, catCS?.ordinalSortOrder);\n\n        const sumPerCategory = (predicate?: (row: any) => boolean): number[] => {\n            const valueMap = new Map<string, number>();\n            for (const row of table) {\n                if (predicate && !predicate(row)) continue;\n                const cat = String(row[catField!] ?? '');\n                const v = row[valField!];\n                if (v != null && !isNaN(Number(v))) valueMap.set(cat, (valueMap.get(cat) ?? 0) + Number(v));\n            }\n            return categories.map(cat => valueMap.get(cat) ?? 0);\n        };\n\n        let leftPos: number[];\n        let rightPos: number[];\n        let leftName: string | undefined;\n        let rightName: string | undefined;\n\n        if (colorField && table.length > 0) {\n            const groups = [...new Set(table.map(r => r[colorField]))];\n            const leftGroup = groups[0];\n            const rightGroup = groups.length > 1 ? groups[1] : groups[0];\n            leftPos = sumPerCategory(row => String(row[colorField] ?? '') === String(leftGroup ?? ''));\n            rightPos = sumPerCategory(row => String(row[colorField] ?? '') === String(rightGroup ?? ''));\n            leftName = String(leftGroup);\n            rightName = String(rightGroup);\n        } else {\n            const values = sumPerCategory();\n            leftPos = values;\n            rightPos = values;\n        }\n\n        const leftData = leftPos.map(v => -v);\n        const maxAbs = Math.max(0, ...leftPos, ...rightPos);\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        Object.assign(spec, {\n            data: [\n                {\n                    type: 'bar', orientation: 'h', name: leftName,\n                    x: leftData, y: categories,\n                    customdata: leftPos,\n                    hovertemplate: `%{y}<br />${leftName ?? catField}: %{customdata}<extra></extra>`,\n                    marker: { color: getSeriesColor(palette, 0) },\n                },\n                {\n                    type: 'bar', orientation: 'h', name: rightName,\n                    x: rightPos, y: categories,\n                    hovertemplate: `%{y}<br />${rightName ?? catField}: %{x}<extra></extra>`,\n                    marker: { color: getSeriesColor(palette, 1) },\n                },\n            ],\n            layout: {\n                barmode: 'overlay',\n                bargap: 0.15,\n                xaxis: {\n                    title: { text: valField },\n                    range: maxAbs > 0 ? [-maxAbs * 1.05, maxAbs * 1.05] : undefined,\n                    tickformat: undefined,\n                    // Show absolute values on the tick labels (both sides read as magnitude).\n                    tickvals: undefined,\n                },\n                yaxis: { type: 'category', categoryorder: 'array', categoryarray: categories, title: { text: catField } },\n                showlegend: leftName !== rightName,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    postProcess: (figure) => {\n        // Absolute-value tick labels: compute explicit tickvals/ticktext so the\n        // negated left side still reads as a positive magnitude.\n        const xaxis = figure.layout?.xaxis;\n        if (xaxis?.range) {\n            const maxAbs = Math.max(Math.abs(xaxis.range[0]), Math.abs(xaxis.range[1]));\n            const step = maxAbs > 0 ? niceStep(maxAbs) : 1;\n            const vals: number[] = [];\n            for (let v = -Math.floor(maxAbs / step) * step; v <= maxAbs + 1e-9; v += step) vals.push(Math.round(v * 1e6) / 1e6);\n            xaxis.tickvals = vals;\n            xaxis.ticktext = vals.map(v => String(Math.abs(v)));\n        }\n    },\n    properties: [] as ChartPropertyDef[],\n};\n\nfunction niceStep(maxAbs: number): number {\n    const target = maxAbs / 4;\n    const pow = Math.pow(10, Math.floor(Math.log10(Math.max(target, 1e-9))));\n    const frac = target / pow;\n    const nice = frac <= 1 ? 1 : frac <= 2 ? 2 : frac <= 5 ? 5 : 10;\n    return nice * pow;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Line Chart template (single + multi-series).\n *\n * Mirrors the Chart.js Line template's decisions. Plotly differences:\n *   - temporal x uses Plotly's native `date` axis (ISO strings), no tick\n *     callback needed — figures stay pure JSON\n *   - one trace per series; the legend comes from trace `name`s\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    coerceIsoDateForPlotly,\n    getPlotlyPalette,\n    getSeriesColor,\n} from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** Map the shared `interpolate` property onto Plotly's `line.shape`. */\nfunction lineShape(interpolate: unknown): 'linear' | 'spline' | 'hv' | 'vh' | 'hvh' {\n    switch (interpolate) {\n        case 'monotone':\n        case 'basis':\n        case 'cardinal':\n        case 'catmull-rom':\n            return 'spline';\n        case 'step':\n            return 'hvh';\n        case 'step-before':\n            return 'vh';\n        case 'step-after':\n            return 'hv';\n        default:\n            return 'linear';\n    }\n}\n\nexport const plLineChartDef: ChartTemplateDef = {\n    chart: 'Line Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n\n        const mapX = (raw: unknown) => (xIsTemporal ? coerceIsoDateForPlotly(raw) : raw);\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        const shape = lineShape(chartProperties?.interpolate);\n        const showPoints = chartProperties?.showPoints === true;\n        const mode = showPoints ? 'lines+markers' : 'lines';\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const traces: any[] = [];\n        const makeTrace = (name: string, rows: any[], colorIndex: number) => {\n            const xVals = xIsDiscrete\n                ? categories!\n                : rows.map(r => mapX(r[xField]));\n            const yVals = xIsDiscrete\n                ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                : rows.map(r => (r[yField] == null ? null : r[yField]));\n            return {\n                type: 'scatter',\n                mode,\n                name,\n                x: xVals,\n                y: yVals,\n                line: { color: getSeriesColor(palette, colorIndex), shape },\n            };\n        };\n\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push(makeTrace(name, rows, i));\n                i++;\n            }\n        } else {\n            traces.push(makeTrace(yField, table, 0));\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        if (xIsDiscrete) {\n            xAxisSpec.type = 'category';\n            xAxisSpec.categoryorder = 'array';\n            xAxisSpec.categoryarray = categories;\n        } else if (xIsTemporal) {\n            xAxisSpec.type = 'date';\n        }\n\n        const yAxisSpec: any = { title: { text: yField } };\n        if (yCS.zero) {\n            yAxisSpec.rangemode = yCS.zero.zero !== false ? 'tozero' : 'normal';\n        }\n\n        const figure: any = {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: yAxisSpec,\n                showlegend: !!colorField,\n            },\n        };\n\n        Object.assign(spec, figure);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'showPoints', label: 'Show points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n    pivot: makeCartesianPivot({\n        permute: [['y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Area Chart template (single + multi-series).\n *\n * Mirrors the Chart.js Area template's decisions. Plotly renders areas as\n * scatter traces with `fill`; multi-series stacking uses `stackgroup`\n * (the Plotly-native equivalent of Chart.js `fill: 'stack'`).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    extractCategories,\n    groupBy,\n    buildCategoryAlignedData,\n    coerceIsoDateForPlotly,\n    getPlotlyPalette,\n    getSeriesColor,\n} from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst isDiscrete = (type: string | undefined) => type === 'nominal' || type === 'ordinal';\n\n/** Map the shared `interpolate` property onto Plotly's `line.shape`. */\nfunction lineShape(interpolate: unknown): 'linear' | 'spline' | 'hv' | 'vh' | 'hvh' {\n    switch (interpolate) {\n        case 'monotone':\n        case 'basis':\n        case 'cardinal':\n        case 'catmull-rom':\n            return 'spline';\n        case 'step':\n            return 'hvh';\n        case 'step-before':\n            return 'vh';\n        case 'step-after':\n            return 'hv';\n        default:\n            return 'linear';\n    }\n}\n\n/** Hex → rgba with alpha, for translucent area fills. */\nfunction fillColor(hex: string, alpha: number): string {\n    const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n    if (!m) return hex;\n    const v = parseInt(m[1], 16);\n    const a = Math.max(0, Math.min(1, alpha));\n    return `rgba(${(v >> 16) & 255}, ${(v >> 8) & 255}, ${v & 255}, ${a})`;\n}\n\nexport const plAreaChartDef: ChartTemplateDef = {\n    chart: 'Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'color', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.5 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xIsDiscrete = isDiscrete(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapX = (raw: unknown) => (xIsTemporal ? coerceIsoDateForPlotly(raw) : raw);\n\n        const categories = xIsDiscrete\n            ? extractCategories(table, xField, xCS.ordinalSortOrder)\n            : undefined;\n\n        const opacity = Number(chartProperties?.opacity ?? 0.4);\n        const stackMode = chartProperties?.stackMode;\n        const stacked = stackMode !== 'layered';\n        const shape = lineShape(chartProperties?.interpolate);\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const traces: any[] = [];\n        const makeTrace = (name: string, rows: any[], colorIndex: number) => {\n            const xVals = xIsDiscrete ? categories! : rows.map(r => mapX(r[xField]));\n            const yVals = xIsDiscrete\n                ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                : rows.map(r => (r[yField] == null ? null : r[yField]));\n            const color = getSeriesColor(palette, colorIndex);\n            const trace: any = {\n                type: 'scatter',\n                mode: 'lines',\n                name,\n                x: xVals,\n                y: yVals,\n                line: { color, shape },\n                fillcolor: fillColor(color, opacity),\n            };\n            if (colorField && stacked) {\n                trace.stackgroup = 'one';\n            } else {\n                trace.fill = 'tozeroy';\n            }\n            return trace;\n        };\n\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push(makeTrace(name, rows, i));\n                i++;\n            }\n        } else {\n            traces.push(makeTrace(yField, table, 0));\n        }\n\n        // 100%-stacked: Plotly normalizes a stackgroup when the FIRST trace in\n        // the group carries `groupnorm: 'percent'`.\n        if (colorField && stacked && stackMode === 'normalize' && traces.length > 0) {\n            traces[0].groupnorm = 'percent';\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        if (xIsDiscrete) {\n            xAxisSpec.type = 'category';\n            xAxisSpec.categoryorder = 'array';\n            xAxisSpec.categoryarray = categories;\n        } else if (xIsTemporal) {\n            xAxisSpec.type = 'date';\n        }\n\n        const yAxisSpec: any = { title: { text: yField } };\n        if (yCS.zero) {\n            yAxisSpec.rangemode = yCS.zero.zero !== false ? 'tozero' : 'normal';\n        }\n\n        const figure: any = {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: yAxisSpec,\n                showlegend: !!colorField,\n            },\n        };\n\n        Object.assign(spec, figure);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'interpolate', label: 'Curve', type: 'discrete', options: [\n                { value: undefined, label: 'Default (linear)' },\n                { value: 'linear', label: 'Linear' },\n                { value: 'monotone', label: 'Monotone (smooth)' },\n                { value: 'step', label: 'Step' },\n                { value: 'step-before', label: 'Step Before' },\n                { value: 'step-after', label: 'Step After' },\n                { value: 'basis', label: 'Basis (smooth)' },\n                { value: 'cardinal', label: 'Cardinal' },\n                { value: 'catmull-rom', label: 'Catmull-Rom' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 0.4 } as ChartPropertyDef,\n        {\n            key: 'stackMode', label: 'Stack', type: 'discrete',\n            check: (ctx) => ({ applicable: !!ctx.encodings.color?.field }),\n            options: [\n                { value: undefined, label: 'Stacked (default)' },\n                { value: 'normalize', label: 'Normalize (100%)' },\n                { value: 'layered', label: 'Layered (overlap)' },\n            ],\n        } as ChartPropertyDef,\n    ],\n    pivot: makeCartesianPivot({\n        permute: [['y', 'color']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Scatter Plot template.\n *\n * Mirrors the Chart.js Scatter template's decisions (color grouping, zero\n * baseline per axis, canvas-aware point radius) as Plotly `scatter` traces\n * in `markers` mode.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\n/** Compute a reasonable marker diameter based on canvas area and point count. */\nfunction computeMarkerSize(width: number, height: number, pointCount: number): number {\n    const canvasArea = width * height;\n    const areaPerPoint = canvasArea / Math.max(1, pointCount);\n    const idealRadius = Math.sqrt(areaPerPoint * 0.05) / 2;\n    const radius = Math.max(2, Math.min(6, Math.round(idealRadius)));\n    return radius * 2;\n}\n\nexport const plScatterPlotDef: ChartTemplateDef = {\n    chart: 'Scatter Plot',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'color', 'size', 'opacity', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, colorDecisions } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        const isTemporalColor = colorType === 'temporal';\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || isTemporalColor);\n\n        if (!xField || !yField) return;\n\n        const opacity = Number(chartProperties?.opacity ?? 1);\n        const traces: any[] = [];\n\n        if (isContinuousColor && colorField) {\n            // A quantitative/temporal color channel is a numeric scale, not a\n            // set of legend groups — one trace with `marker.color` as a\n            // per-point array plus a native colorscale/colorbar (Plotly's\n            // built-in continuous-color support), not a group-by split.\n            const toColorVal = isTemporalColor\n                ? (v: any) => (v != null ? new Date(v).getTime() : NaN)\n                : (v: any) => (v != null ? Number(v) : NaN);\n            const colorVals = table.map((r: any) => toColorVal(r[colorField])).filter((v: number) => !isNaN(v));\n            const cmin = colorVals.length ? Math.min(...colorVals) : 0;\n            const cmax = colorVals.length ? Math.max(...colorVals) : 1;\n            const decision = colorDecisions?.color ?? colorDecisions?.group;\n            const diverging = decision?.schemeType === 'diverging';\n            traces.push({\n                type: 'scatter',\n                mode: 'markers',\n                name: colorField,\n                x: table.map((r: any) => r[xField]),\n                y: table.map((r: any) => r[yField]),\n                marker: {\n                    color: table.map((r: any) => toColorVal(r[colorField])),\n                    colorscale: diverging ? 'RdBu' : 'Viridis',\n                    cmin, cmax,\n                    showscale: true,\n                    colorbar: { title: { text: colorField } },\n                    opacity,\n                    line: { color: '#ffffff', width: 0.5 },\n                },\n            });\n        } else {\n            const palette = getPlotlyPalette(ctx, 'color');\n            const makeTrace = (name: string | undefined, rows: any[], colorIndex: number) => ({\n                type: 'scatter',\n                mode: 'markers',\n                ...(name != null ? { name } : {}),\n                x: rows.map(r => r[xField]),\n                y: rows.map(r => r[yField]),\n                marker: {\n                    color: getSeriesColor(palette, colorIndex),\n                    opacity,\n                    line: { color: '#ffffff', width: 0.5 },\n                },\n            });\n\n            if (colorField) {\n                let i = 0;\n                for (const [name, rows] of groupBy(table, colorField)) {\n                    traces.push(makeTrace(name, rows, i));\n                    i++;\n                }\n            } else {\n                traces.push(makeTrace(undefined, table, 0));\n            }\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        const yAxisSpec: any = { title: { text: yField } };\n        if (channelSemantics.x?.zero) {\n            xAxisSpec.rangemode = channelSemantics.x.zero.zero !== false ? 'tozero' : 'normal';\n        }\n        if (channelSemantics.y?.zero) {\n            yAxisSpec.rangemode = channelSemantics.y.zero.zero !== false ? 'tozero' : 'normal';\n        }\n\n        const figure: any = {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: yAxisSpec,\n                showlegend: !!colorField && !isContinuousColor,\n            },\n        };\n\n        Object.assign(spec, figure);\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 1 } as ChartPropertyDef,\n    ],\n    pivot: makeCartesianPivot({\n        transpose: [['x', 'y']],\n        permute: [['x', 'y', 'color', 'size']],\n        shift: ['color', 'group', 'column', 'row'],\n    }),\n    postProcess: (figure, ctx) => {\n        if (!Array.isArray(figure.data)) return;\n        const w = figure._width || ctx.canvasSize.width;\n        const h = figure._height || ctx.canvasSize.height;\n        const size = computeMarkerSize(w, h, ctx.table.length);\n        for (const trace of figure.data) {\n            if (trace?.marker && trace.marker.size == null) {\n                trace.marker.size = size;\n            }\n        }\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Histogram template.\n *\n * Plotly has a native `histogram` trace: pass raw numeric values and\n * `nbinsx` and Plotly computes the bins client-side (matching Vega-Lite's\n * `bin: true` transform) — no manual bin-counting like Chart.js/ECharts need.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor } from './utils';\n\nexport const plHistogramDef: ChartTemplateDef = {\n    chart: 'Histogram',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField) return;\n\n        const binCount = chartProperties?.binCount || 10;\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push({\n                    type: 'histogram',\n                    name,\n                    x: rows.map((r: any) => Number(r[xField])).filter((v: number) => isFinite(v)),\n                    nbinsx: binCount,\n                    marker: { color: getSeriesColor(palette, i) },\n                    opacity: 0.75,\n                });\n                i++;\n            }\n        } else {\n            traces.push({\n                type: 'histogram',\n                x: table.map((r: any) => Number(r[xField])).filter((v: number) => isFinite(v)),\n                nbinsx: binCount,\n                marker: { color: getSeriesColor(palette, 0) },\n            });\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                barmode: colorField ? 'stack' : undefined,\n                bargap: 0.02,\n                xaxis: { title: { text: xField } },\n                yaxis: { title: { text: 'Count' }, rangemode: 'tozero' },\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'binCount', label: 'Max Bins', type: 'continuous', min: 5, max: 50, step: 1, defaultValue: 10 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Pie Chart + Donut Chart templates.\n *\n * Native `pie` trace: `hole` produces a donut with no extra geometry.\n * Pie charts have no cartesian axes, so this template sets `figure._width` /\n * `_height` itself and `plApplyLayoutToSpec` (which only fills in unset\n * sizes) leaves them alone.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, getPlotlyPalette } from './utils';\nimport { computeCircumferencePressure, computeEffectiveBarCount } from '../../core/decisions';\n\nfunction buildPieOption(spec: any, ctx: any, hole: number): void {\n    const { channelSemantics, table, chartProperties } = ctx;\n    const colorField = channelSemantics.color?.field;\n    const sizeField = channelSemantics.size?.field;\n\n    const labels: string[] = [];\n    const values: number[] = [];\n\n    if (colorField && sizeField) {\n        const agg = new Map<string, number>();\n        for (const row of table) {\n            const cat = String(row[colorField] ?? '');\n            agg.set(cat, (agg.get(cat) ?? 0) + (Number(row[sizeField]) || 0));\n        }\n        const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n        for (const cat of categories) { labels.push(cat); values.push(agg.get(cat) ?? 0); }\n    } else if (colorField) {\n        const counts = new Map<string, number>();\n        for (const row of table) {\n            const cat = String(row[colorField] ?? '');\n            counts.set(cat, (counts.get(cat) ?? 0) + 1);\n        }\n        const categories = extractCategories(table, colorField, channelSemantics.color?.ordinalSortOrder);\n        for (const cat of categories) { labels.push(cat); values.push(counts.get(cat) ?? 0); }\n    } else if (sizeField) {\n        for (const row of table) {\n            const v = Number(row[sizeField]) || 0;\n            labels.push(String(v));\n            values.push(v);\n        }\n    }\n    if (labels.length === 0) return;\n\n    const sortSlices = chartProperties?.sortSlices;\n    const order = labels.map((_l, i) => i);\n    if (sortSlices === 'descending') order.sort((a, b) => values[b] - values[a]);\n    else if (sortSlices === 'ascending') order.sort((a, b) => values[a] - values[b]);\n    const sortedLabels = order.map(i => labels[i]);\n    const sortedValues = order.map(i => values[i]);\n\n    const labelType = chartProperties?.labelType ?? 'categoryPercent';\n    const textinfo: Record<string, string> = {\n        none: 'none', category: 'label', value: 'value', percent: 'percent', categoryPercent: 'label+percent',\n    };\n\n    const palette = getPlotlyPalette(ctx, 'color');\n\n    // Canvas sizing: a native Plotly pie fills the largest circle that fits\n    // in the canvas AND auto-reserves horizontal room for the legend on the\n    // right — so we deliberately DON'T pin an explicit `domain`. The previous\n    // centered domain (with an 80px radius margin) shrank the circle to ~half\n    // its natural size and wasted matching space on the left. We keep only the\n    // circumference-pressure model to GROW the canvas when a dense pie (many\n    // thin slices) needs a bigger circle to give each slice its minimum arc.\n    const effectiveCount = computeEffectiveBarCount(sortedValues);\n    const { canvasW, canvasH } = computeCircumferencePressure(effectiveCount, ctx.canvasSize, {\n        minArcPx: 45,\n        minRadius: 60,\n        maxStretch: ctx.assembleOptions?.maxStretch,\n        maxStretchX: ctx.assembleOptions?.maxStretchX,\n        maxStretchY: ctx.assembleOptions?.maxStretchY,\n        margin: 24,\n    });\n\n    // Symmetric margin leaves room for the outside slice callouts (thin slices\n    // draw their label + connector just beyond the ring); Plotly grows the\n    // legend within its own reserved right gutter, so no vertical padding hack\n    // is needed.\n    const n = sortedLabels.length;\n    const hasOutsideLabels = labelType !== 'none';\n    const labelMargin = hasOutsideLabels ? Math.min(48, 20 + n) : 12;\n\n    Object.assign(spec, {\n        data: [{\n            type: 'pie',\n            labels: sortedLabels,\n            values: sortedValues,\n            hole,\n            textinfo: textinfo[labelType] ?? 'label+percent',\n            // Let outside slice labels push the margins so a cluster of thin\n            // slices (many tiny wedges crowded together) doesn't clip its\n            // stacked callouts against the canvas edge.\n            automargin: true,\n            marker: { colors: palette, line: { color: '#ffffff', width: 1 } },\n        }],\n        layout: {\n            showlegend: true,\n            margin: { t: labelMargin, b: labelMargin, l: 12, r: 12 },\n        },\n        _width: canvasW,\n        _height: canvasH,\n    });\n    delete spec.mark;\n    delete spec.encoding;\n}\n\nconst PIE_PROPERTIES: ChartPropertyDef[] = [\n    {\n        key: 'sortSlices', label: 'Sort slices', type: 'discrete',\n        options: [\n            { value: 'none', label: 'Data order' },\n            { value: 'descending', label: 'Largest first' },\n            { value: 'ascending', label: 'Smallest first' },\n        ],\n        defaultValue: 'none',\n    },\n    {\n        key: 'labelType', label: 'Labels', type: 'discrete',\n        options: [\n            { value: 'categoryPercent', label: 'Name + %' },\n            { value: 'category', label: 'Name' },\n            { value: 'value', label: 'Value' },\n            { value: 'percent', label: 'Percent' },\n            { value: 'none', label: 'None' },\n        ],\n        defaultValue: 'categoryPercent',\n    },\n];\n\nexport const plPieChartDef: ChartTemplateDef = {\n    chart: 'Pie Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['size', 'color'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => buildPieOption(spec, ctx, 0),\n    properties: PIE_PROPERTIES,\n};\n\nexport const plDonutChartDef: ChartTemplateDef = {\n    chart: 'Donut Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['size', 'color'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => buildPieOption(spec, ctx, (ctx.chartProperties?.innerRadius ?? 55) / 100),\n    properties: [\n        { key: 'innerRadius', label: 'Donut', type: 'continuous', min: 20, max: 80, step: 5, defaultValue: 55 } as ChartPropertyDef,\n        ...PIE_PROPERTIES,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Radar Chart template.\n *\n * Native `scatterpolar` trace with `fill: 'toself'` — Plotly handles the\n * polar projection, axis spokes, and grid rings natively (no manual trig\n * like the Vega-Lite template needs).\n *\n * Data model (long format): x = metric name, y = value, color = entity/group.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getPlotlyPalette, getSeriesColor, fillColor, niceMax } from './utils';\nimport { computeCircumferencePressure } from '../../core/decisions';\n\nexport const plRadarChartDef: ChartTemplateDef = {\n    chart: 'Radar Chart',\n    template: { mark: 'point', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    // Radar is POLAR, not cartesian. The generic facet combiner (facet.ts)\n    // only stitches cartesian xaxis/yaxis panels, so it collapses every\n    // facet's `scatterpolar` traces into the single default `polar` subplot\n    // (all regions overlaid in one radar). Opt out and lay one polar subplot\n    // per facet cell out internally — mirrors the Gauge template.\n    selfManagesFacets: true,\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const axisField = channelSemantics.x?.field;\n        const valueField = channelSemantics.y?.field;\n        const groupField = channelSemantics.color?.field;\n        const columnField = channelSemantics.column?.field;\n        const rowField = channelSemantics.row?.field;\n        if (!axisField || !valueField) return;\n\n        const metrics = extractCategories(table, axisField, channelSemantics.x?.ordinalSortOrder);\n        if (metrics.length < 2) return;\n\n        // Close the loop: repeat the first metric at the end so the polygon closes.\n        const closedMetrics = [...metrics, metrics[0]];\n\n        const meanPerMetric = (rows: any[]) => {\n            const sums = new Map<string, { sum: number; count: number }>();\n            for (const row of rows) {\n                const m = String(row[axisField] ?? '');\n                const v = Number(row[valueField]) || 0;\n                const e = sums.get(m) ?? { sum: 0, count: 0 };\n                e.sum += v; e.count++;\n                sums.set(m, e);\n            }\n            return metrics.map(m => {\n                const e = sums.get(m);\n                return e ? Math.round((e.sum / e.count) * 100) / 100 : 0;\n            });\n        };\n\n        const filled = chartProperties?.filled !== false;\n        const fillOpacity = Number(chartProperties?.fillOpacity ?? 0.3);\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        // Global radial max across ALL data so facets share one comparable\n        // scale (a per-facet max would make regions visually incomparable).\n        const allVals = table.map((r: any) => Number(r[valueField])).filter((v: number) => isFinite(v));\n        const radialMax = niceMax(allVals.length > 0 ? Math.max(...allVals) : 1);\n\n        // Consistent color per group across every facet cell.\n        const groupOrder = groupField\n            ? extractCategories(table, groupField, channelSemantics.color?.ordinalSortOrder)\n            : [];\n        const groupIdx = (name: string) => {\n            const k = groupOrder.indexOf(name);\n            return k >= 0 ? k : 0;\n        };\n\n        const makeTrace = (\n            name: string | undefined, rows: any[], idx: number,\n            polarKey: string, showlegend: boolean,\n        ) => {\n            const values = meanPerMetric(rows);\n            const closedValues = [...values, values[0]];\n            const color = getSeriesColor(palette, idx);\n            return {\n                type: 'scatterpolar',\n                mode: 'lines+markers',\n                ...(name != null ? { name, legendgroup: name } : {}),\n                showlegend,\n                r: closedValues,\n                theta: closedMetrics,\n                subplot: polarKey,\n                line: { color },\n                marker: { color },\n                fill: filled ? ('toself' as const) : undefined,\n                fillcolor: filled ? fillColor(color, fillOpacity) : undefined,\n            };\n        };\n\n        // ── Facet grid ────────────────────────────────────────────────\n        const colCats = columnField\n            ? extractCategories(table, columnField, channelSemantics.column?.ordinalSortOrder)\n            : [''];\n        const rowCats = rowField\n            ? extractCategories(table, rowField, channelSemantics.row?.ordinalSortOrder)\n            : [''];\n        const faceted = !!(columnField || rowField);\n        const cols = Math.max(1, colCats.length);\n        const gridRows = Math.max(1, rowCats.length);\n\n        const traces: any[] = [];\n        const annotations: any[] = [];\n        const layout: any = { showlegend: !!groupField };\n\n        // Canvas size first — needed to convert fixed-px label margins into\n        // domain fractions below.\n        let width: number;\n        let height: number;\n        if (faceted) {\n            // One radar per cell; grow the canvas so each stays legible.\n            width = Math.max(ctx.canvasSize.width, cols * 240);\n            height = Math.max(ctx.canvasSize.height, gridRows * 250);\n        } else {\n            const p = computeCircumferencePressure(metrics.length, ctx.canvasSize, {\n                minArcPx: 60,\n                minRadius: 80,\n                maxStretch: ctx.assembleOptions?.maxStretch,\n                maxStretchX: ctx.assembleOptions?.maxStretchX,\n                maxStretchY: ctx.assembleOptions?.maxStretchY,\n            });\n            width = p.canvasW;\n            height = p.canvasH;\n        }\n\n        const gapFrac = faceted ? 0.05 : 0;\n        const cellW = (1 - gapFrac * (cols - 1)) / cols;\n        const cellH = (1 - gapFrac * (gridRows - 1)) / gridRows;\n        const titlePad = faceted ? 26 / height : 0;\n        // The angular (metric) labels sit just outside the circle on all four\n        // sides. Inset the polar domain inside each cell so a side label\n        // (\"Retention\"/\"Profit\") stays within its OWN cell instead of colliding\n        // with the neighbouring radar's label across the gap.\n        const insetXFrac = faceted ? 40 / width : 0;\n        const insetYFrac = faceted ? 16 / height : 0;\n\n        const legendShown = new Set<string>();\n        let cellIndex = 0;\n        for (let r = 0; r < gridRows; r++) {\n            for (let c = 0; c < cols; c++) {\n                const x0 = c * (cellW + gapFrac);\n                const x1 = x0 + cellW;\n                const yTop = 1 - r * (cellH + gapFrac);\n                const y0 = yTop - cellH;\n                const polarKey = cellIndex === 0 ? 'polar' : `polar${cellIndex + 1}`;\n\n                const cellRows = table.filter((row: any) => {\n                    if (columnField && String(row[columnField] ?? '') !== colCats[c]) return false;\n                    if (rowField && String(row[rowField] ?? '') !== rowCats[r]) return false;\n                    return true;\n                });\n\n                if (faceted) {\n                    const label = [columnField ? colCats[c] : null, rowField ? rowCats[r] : null]\n                        .filter(Boolean).join(' · ');\n                    annotations.push({\n                        text: label, xref: 'paper', yref: 'paper',\n                        x: (x0 + x1) / 2, y: yTop, xanchor: 'center', yanchor: 'top',\n                        showarrow: false, font: { size: 12, color: '#374151' },\n                    });\n                }\n\n                layout[polarKey] = {\n                    domain: {\n                        x: [x0 + insetXFrac, x1 - insetXFrac],\n                        y: [y0 + insetYFrac, yTop - titlePad - insetYFrac],\n                    },\n                    radialaxis: {\n                        visible: true, range: [0, radialMax],\n                        showticklabels: !faceted, tickfont: { size: 9 },\n                    },\n                    angularaxis: {\n                        rotation: 90, direction: 'clockwise',\n                        tickfont: { size: faceted ? 10 : 12 },\n                    },\n                };\n\n                if (groupField) {\n                    for (const [name, rows] of groupBy(cellRows, groupField)) {\n                        const show = !legendShown.has(name);\n                        legendShown.add(name);\n                        traces.push(makeTrace(name, rows, groupIdx(name), polarKey, show));\n                    }\n                } else {\n                    traces.push(makeTrace(undefined, cellRows, 0, polarKey, false));\n                }\n                cellIndex++;\n            }\n        }\n\n        if (faceted) layout.annotations = annotations;\n\n        Object.assign(spec, {\n            data: traces,\n            layout,\n            _width: width,\n            _height: height,\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'filled', label: 'Fill', type: 'discrete', options: [\n                { value: true, label: 'Filled (default)' },\n                { value: false, label: 'Outline only' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'fillOpacity', label: 'Opacity', type: 'continuous', min: 0.05, max: 0.8, step: 0.05, defaultValue: 0.3 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Rose Chart (Nightingale / Coxcomb) template.\n *\n * Native `barpolar` trace: bars in polar coordinates, one wedge per angular\n * category. `layout.barmode: 'stack'` stacks color groups radially — Plotly\n * handles the polar stacking natively.\n *\n * NOTE on area-truth: the Vega-Lite/ECharts Rose templates map value → sqrt(value)\n * so wedge AREA is proportional to value (matching a true rose/Nightingale\n * chart). Plotly's native polar bar stacking sums raw `r` values, and undoing\n * that to preserve sqrt-area-truth under stacking would require reimplementing\n * the stacking arithmetic by hand. This template uses linear radius (radius ∝\n * value, area not strictly ∝ value) to keep Plotly's native stacking — a\n * documented behavioral difference from the other backends, flagged here for\n * anyone who needs strict area-truth parity.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { computeCircumferencePressure } from '../../core/decisions';\n\nexport const plRoseChartDef: ChartTemplateDef = {\n    chart: 'Rose Chart',\n    template: { mark: 'arc', encoding: {} },\n    channels: ['x', 'y', 'color'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const catField = channelSemantics.x?.field;\n        const valField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!catField || !valField) return;\n\n        let categories = extractCategories(table, catField, channelSemantics.x?.ordinalSortOrder);\n        if (categories.length === 0) return;\n\n        const sortSlices = chartProperties?.sortSlices;\n        if (sortSlices === 'descending' || sortSlices === 'ascending') {\n            const totals = new Map<string, number>();\n            for (const c of categories) totals.set(c, 0);\n            for (const row of table) {\n                const c = String(row[catField] ?? '');\n                if (totals.has(c)) totals.set(c, totals.get(c)! + (Number(row[valField]) || 0));\n            }\n            categories = [...categories].sort((a, b) =>\n                sortSlices === 'descending' ? (totals.get(b) ?? 0) - (totals.get(a) ?? 0) : (totals.get(a) ?? 0) - (totals.get(b) ?? 0));\n        }\n\n        const sumPerCategory = (rows: any[]) => {\n            const agg = new Map<string, number>();\n            for (const row of rows) {\n                const c = String(row[catField] ?? '');\n                agg.set(c, (agg.get(c) ?? 0) + (Number(row[valField]) || 0));\n            }\n            return categories.map(c => agg.get(c) ?? 0);\n        };\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push({\n                    type: 'barpolar',\n                    name,\n                    r: sumPerCategory(rows),\n                    theta: categories,\n                    marker: { color: getSeriesColor(palette, i) },\n                });\n                i++;\n            }\n        } else {\n            traces.push({\n                type: 'barpolar',\n                r: sumPerCategory(table),\n                theta: categories,\n                marker: { color: categories.map((_c, i) => getSeriesColor(palette, i)) },\n                showlegend: false,\n            });\n        }\n\n        const { canvasW, canvasH } = computeCircumferencePressure(categories.length, ctx.canvasSize, {\n            minArcPx: 45,\n            minRadius: 80,\n            maxStretch: ctx.assembleOptions?.maxStretch,\n            maxStretchX: ctx.assembleOptions?.maxStretchX,\n            maxStretchY: ctx.assembleOptions?.maxStretchY,\n        });\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                barmode: colorField ? 'stack' : undefined,\n                polar: { angularaxis: { rotation: 90, direction: 'clockwise' }, radialaxis: { rangemode: 'tozero' } },\n                showlegend: !!colorField,\n            },\n            _width: canvasW,\n            _height: canvasH,\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'sortSlices', label: 'Sort slices', type: 'discrete', options: [\n                { value: 'none', label: 'Data order' },\n                { value: 'descending', label: 'Largest first' },\n                { value: 'ascending', label: 'Smallest first' },\n            ],\n            defaultValue: 'none',\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Boxplot template.\n *\n * Native `box` trace: pass raw y-values with a matching category `x` array\n * and Plotly computes the five-number summary (quartiles, whiskers, outliers)\n * itself — like Vega-Lite's `mark: \"boxplot\"`, unlike ECharts/Chart.js which\n * must precompute the summary client-side.\n *\n * Grouped boxplots (a `color` field subdividing the category axis) use\n * `layout.boxmode: 'group'` — Plotly's native per-category dodge, the\n * equivalent of the other backends' manual band-dodge planner.\n *\n * NOTE: Plotly's box trace does not expose a native \"extend whiskers to\n * min/max\" mode (only its quartile-computation algorithm is configurable);\n * unlike the Vega-Lite/ECharts boxplot templates this template always uses\n * Tukey (1.5×IQR) whiskers. `showOutliers` toggles the outlier points.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { isDiscreteType, extractCategories, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { detectBandedAxisForceDiscrete } from '../../core/axis-detection';\nimport { planBandDodge } from '../../core/band-dodge';\n\nexport const plBoxplotDef: ChartTemplateDef = {\n    chart: 'Boxplot',\n    template: { mark: 'boxplot', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: (cs, table) => {\n        if (!cs.x?.field || !cs.y?.field) return {};\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        if (!result) return {};\n        return {\n            axisFlags: { [result.axis]: { banded: true } },\n            resolvedTypes: result.resolvedTypes,\n            paramOverrides: { defaultBandSize: 28 },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        if (!xCS?.field || !yCS?.field) return;\n\n        const xIsDiscrete = isDiscreteType(xCS.type);\n        const yIsDiscrete = isDiscreteType(yCS.type);\n        const catAxis: 'x' | 'y' = (yIsDiscrete && !xIsDiscrete) ? 'y' : 'x';\n        const valAxis: 'x' | 'y' = catAxis === 'x' ? 'y' : 'x';\n        const catField = channelSemantics[catAxis]!.field!;\n        const valField = channelSemantics[valAxis]!.field!;\n        const isHorizontal = catAxis === 'y';\n\n        const categories = extractCategories(table, catField, channelSemantics[catAxis]?.ordinalSortOrder);\n        const showOutliers = chartProperties?.showOutliers !== false;\n        const boxpoints = showOutliers ? 'outliers' : false;\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const makeTrace = (name: string | undefined, rows: any[], colorIdx: number) => {\n            const cats = rows.map((r: any) => String(r[catField] ?? ''));\n            const vals = rows.map((r: any) => Number(r[valField]));\n            return {\n                type: 'box',\n                ...(name != null ? { name } : {}),\n                ...(isHorizontal ? { y: cats, x: vals } : { x: cats, y: vals }),\n                boxpoints,\n                marker: { color: getSeriesColor(palette, colorIdx), size: 3 },\n                line: { color: getSeriesColor(palette, colorIdx) },\n            };\n        };\n\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) { traces.push(makeTrace(name, rows, i)); i++; }\n        } else {\n            traces.push(makeTrace(undefined, table, 0));\n        }\n\n        // Degenerate color (color re-encodes the category axis, or a 1:1 /\n        // sparse mapping where every band holds at most one colour) must NOT\n        // dodge into per-lane slivers with a redundant legend — collapse to\n        // one full-width box per band. `boxmode: 'group'` reserves a lane per\n        // trace, so drop it (default overlay) and hide the redundant legend;\n        // the boxes stay colour-coded but sit one per band. Genuine sub-group\n        // colour (maxPerBand > 1) keeps the native grouped dodge.\n        const redundantColor = !!colorField\n            && planBandDodge(table, catField, colorField).maxPerBand <= 1;\n        // Collapsed boxes sit one per band, so widen them to fill the band\n        // (Plotly's default overlay box is only ~40% of the band).\n        if (redundantColor) for (const t of traces) t.width = 0.8;\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const valAxisSpec = { title: { text: valField }, zeroline: false };\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                boxmode: (colorField && !redundantColor) ? 'group' : undefined,\n                ...(isHorizontal ? { yaxis: catAxisSpec, xaxis: valAxisSpec } : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: !!colorField && !redundantColor,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showOutliers', label: 'Outliers', type: 'binary', defaultValue: true } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Violin Plot template.\n *\n * Native `violin` trace: pass raw y-values per category and Plotly computes\n * the KDE + box overlay itself (matching Vega-Lite's `mark: \"violin\"` /\n * density transform, unlike ECharts which has no native violin and needs a\n * custom render item).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { isDiscreteType, extractCategories, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { detectBandedAxisForceDiscrete } from '../../core/axis-detection';\n\nexport const plViolinPlotDef: ChartTemplateDef = {\n    chart: 'Violin Plot',\n    template: { mark: 'violin', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: (cs, table) => {\n        if (!cs.x?.field || !cs.y?.field) return {};\n        const result = detectBandedAxisForceDiscrete(cs, table, { preferAxis: 'x' });\n        if (!result) return {};\n        return {\n            axisFlags: { [result.axis]: { banded: true } },\n            resolvedTypes: result.resolvedTypes,\n            paramOverrides: { defaultBandSize: 40 },\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        if (!xCS?.field || !yCS?.field) return;\n\n        const xIsDiscrete = isDiscreteType(xCS.type);\n        const yIsDiscrete = isDiscreteType(yCS.type);\n        const catAxis: 'x' | 'y' = (yIsDiscrete && !xIsDiscrete) ? 'y' : 'x';\n        const valAxis: 'x' | 'y' = catAxis === 'x' ? 'y' : 'x';\n        const catField = channelSemantics[catAxis]!.field!;\n        const valField = channelSemantics[valAxis]!.field!;\n        const isHorizontal = catAxis === 'y';\n\n        const categories = extractCategories(table, catField, channelSemantics[catAxis]?.ordinalSortOrder);\n        const showBox = chartProperties?.showBox !== false;\n        const showPoints = chartProperties?.showPoints === true;\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const makeTrace = (name: string | undefined, rows: any[], colorIdx: number) => {\n            const cats = rows.map((r: any) => String(r[catField] ?? ''));\n            const vals = rows.map((r: any) => Number(r[valField]));\n            const color = getSeriesColor(palette, colorIdx);\n            return {\n                type: 'violin',\n                ...(name != null ? { name } : {}),\n                ...(isHorizontal ? { y: cats, x: vals } : { x: cats, y: vals }),\n                orientation: isHorizontal ? 'h' as const : 'v' as const,\n                box: { visible: showBox },\n                meanline: { visible: true },\n                points: showPoints ? 'all' as const : false,\n                line: { color },\n                fillcolor: color,\n                opacity: 0.6,\n            };\n        };\n\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) { traces.push(makeTrace(name, rows, i)); i++; }\n        } else {\n            traces.push(makeTrace(undefined, table, 0));\n        }\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const valAxisSpec = { title: { text: valField }, zeroline: false };\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                violinmode: colorField ? 'group' : undefined,\n                ...(isHorizontal ? { yaxis: catAxisSpec, xaxis: valAxisSpec } : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showBox', label: 'Inner box', type: 'binary', defaultValue: true } as ChartPropertyDef,\n        { key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Density Plot template (KDE area).\n *\n * Plotly has no native density transform; the curve is computed here\n * (Gaussian KDE, same bandwidth rule as the Vega-Lite/ECharts templates) and\n * drawn as a filled `scatter` line — mirroring `ecDensityPlotDef`.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor, fillColor, kde } from './utils';\n\nexport const plDensityPlotDef: ChartTemplateDef = {\n    chart: 'Density Plot',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField) return;\n\n        const steps = 200;\n        const bandwidthMultiplier = (chartProperties?.bandwidth != null && chartProperties.bandwidth > 0)\n            ? chartProperties.bandwidth : 1;\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const traces: any[] = [];\n        if (colorField) {\n            const allValues = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            const sharedExtent = allValues.length > 0\n                ? { min: Math.min(...allValues), max: Math.max(...allValues) } : undefined;\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                const values = rows.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n                const { x, y } = kde(values, steps, bandwidthMultiplier, sharedExtent);\n                const color = getSeriesColor(palette, i);\n                traces.push({\n                    type: 'scatter', mode: 'lines', name, x, y,\n                    line: { color }, fill: 'tozeroy', fillcolor: fillColor(color, 0.4),\n                });\n                i++;\n            }\n        } else {\n            const values = table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v));\n            const { x, y } = kde(values, steps, bandwidthMultiplier);\n            const color = getSeriesColor(palette, 0);\n            traces.push({\n                type: 'scatter', mode: 'lines', x, y,\n                line: { color }, fill: 'tozeroy', fillcolor: fillColor(color, 0.4),\n            });\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: { title: { text: xField } },\n                yaxis: { title: { text: 'Density' }, rangemode: 'tozero' },\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'bandwidth', label: 'Bandwidth', type: 'continuous', min: 0.05, max: 2, step: 0.05, defaultValue: 0 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly ECDF Plot template.\n *\n * Plotly has no cumulative-distribution transform; the step curve is\n * precomputed (mirroring `ecEcdfPlotDef`) and drawn as a `scatter` trace with\n * `line.shape: 'hv'` (step-after — Plotly's equivalent of ECharts' `step:\n * 'end'`).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor, ecdfPairs } from './utils';\n\nexport const plEcdfPlotDef: ChartTemplateDef = {\n    chart: 'ECDF Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField) return;\n\n        const showPoints = !!chartProperties?.showPoints;\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const makeTrace = (name: string | undefined, values: number[], idx: number) => {\n            const pairs = ecdfPairs(values);\n            return {\n                type: 'scatter',\n                mode: showPoints ? 'lines+markers' as const : 'lines' as const,\n                ...(name != null ? { name } : {}),\n                x: pairs.map(p => p[0]),\n                y: pairs.map(p => p[1]),\n                line: { shape: 'hv' as const, color: getSeriesColor(palette, idx), width: 2 },\n                marker: { size: 6 },\n            };\n        };\n\n        const traces: any[] = [];\n        if (groupField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, groupField)) {\n                traces.push(makeTrace(name, rows.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v)), i));\n                i++;\n            }\n        } else {\n            traces.push(makeTrace(undefined, table.map((r: any) => Number(r[xField])).filter((v: number) => !isNaN(v)), 0));\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: { title: { text: xField } },\n                yaxis: { title: { text: 'Cumulative proportion' }, range: [0, 1] },\n                showlegend: !!groupField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showPoints', label: 'Points', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Strip Plot (categorical scatter with jitter) template.\n *\n * The jittered category axis is a numeric axis with explicit `tickvals` /\n * `ticktext` at integer positions (Plotly has no native \"jittered category\"\n * axis), so fractional jitter offsets can be plotted directly — mirroring\n * `ecStripPlotDef`'s hidden-value-axis trick.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { isDiscreteType, extractCategories, groupBy, getPlotlyPalette, getSeriesColor, seededJitter } from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nexport const plStripPlotDef: ChartTemplateDef = {\n    chart: 'Strip Plot',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'color', 'size', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { defaultBandSize: 50, minStep: 16 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, colorDecisions } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const xField = xCS?.field;\n        const yField = yCS?.field;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n        if (!xField || !yField) return;\n\n        const xIsDiscrete = isDiscreteType(xCS?.type);\n        const yIsDiscrete = isDiscreteType(yCS?.type);\n        const catAxis: 'x' | 'y' = xIsDiscrete ? 'x' : yIsDiscrete ? 'y' : 'x';\n        const catField = catAxis === 'x' ? xField : yField;\n        const contField = catAxis === 'x' ? yField : xField;\n\n        const categories = extractCategories(table, catField!, channelSemantics[catAxis]?.ordinalSortOrder);\n        const catIndex = new Map(categories.map((c, i) => [c, i]));\n        const rand = seededJitter(42);\n        const jitterHalfWidth = 0.3;\n\n        const catCoord = (row: any) => {\n            const idx = catIndex.get(String(row[catField!] ?? '')) ?? 0;\n            return idx + rand() * jitterHalfWidth;\n        };\n\n        const catAxisSpec = {\n            tickmode: 'array' as const,\n            tickvals: categories.map((_c, i) => i),\n            ticktext: categories,\n            range: [-0.5, categories.length - 0.5],\n            title: { text: catField },\n            zeroline: false,\n        };\n        const contAxisSpec = { title: { text: contField } };\n\n        const traces: any[] = [];\n        const buildXY = (row: any) => {\n            const cv = catCoord(row);\n            return catAxis === 'x' ? [cv, row[contField!]] : [row[contField!], cv];\n        };\n\n        if (isContinuousColor && colorField) {\n            const colorVals = table.map((r: any) => Number(r[colorField])).filter((v: number) => isFinite(v));\n            const cmin = colorVals.length ? Math.min(...colorVals) : 0;\n            const cmax = colorVals.length ? Math.max(...colorVals) : 1;\n            traces.push({\n                type: 'scatter',\n                mode: 'markers',\n                name: colorField,\n                x: table.map((r: any) => buildXY(r)[0]),\n                y: table.map((r: any) => buildXY(r)[1]),\n                marker: {\n                    color: table.map((r: any) => Number(r[colorField])),\n                    colorscale: 'Viridis',\n                    cmin, cmax,\n                    showscale: true,\n                    colorbar: { title: { text: colorField } },\n                    opacity: 0.75,\n                    size: 8,\n                },\n            });\n        } else if (colorField) {\n            const palette = getPlotlyPalette(ctx, 'color');\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push({\n                    type: 'scatter',\n                    mode: 'markers',\n                    name,\n                    x: rows.map((r: any) => buildXY(r)[0]),\n                    y: rows.map((r: any) => buildXY(r)[1]),\n                    marker: { color: getSeriesColor(palette, i), opacity: 0.75, size: 8 },\n                });\n                i++;\n            }\n        } else {\n            const palette = getPlotlyPalette(ctx, 'color');\n            traces.push({\n                type: 'scatter',\n                mode: 'markers',\n                x: table.map((r: any) => buildXY(r)[0]),\n                y: table.map((r: any) => buildXY(r)[1]),\n                marker: { color: getSeriesColor(palette, 0), opacity: 0.75, size: 8 },\n            });\n        }\n        void colorDecisions;\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                ...(catAxis === 'x' ? { xaxis: catAxisSpec, yaxis: contAxisSpec } : { xaxis: contAxisSpec, yaxis: catAxisSpec }),\n                showlegend: !!colorField && !isContinuousColor,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    pivot: makeCartesianPivot({}),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Connected Scatter Plot template.\n *\n * Points in 2-D (x, y both quantitative) connected by a straight line in a\n * defined `order` — a trajectory, not a trend line. Mirrors\n * `ecConnectedScatterDef`: one `scatter` trace per group, `mode:\n * 'lines+markers'`, straight segments (never smoothed).\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor, sortByOrder } from './utils';\n\nexport const plConnectedScatterDef: ChartTemplateDef = {\n    chart: 'Connected Scatter Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'order', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const orderField = channelSemantics.order?.field;\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField || !yField) return;\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const makeTrace = (name: string | undefined, rows: any[], idx: number) => {\n            const sorted = sortByOrder(rows, orderField);\n            const color = getSeriesColor(palette, idx);\n            return {\n                type: 'scatter',\n                mode: 'lines+markers',\n                ...(name != null ? { name } : {}),\n                x: sorted.map((r: any) => r[xField]),\n                y: sorted.map((r: any) => r[yField]),\n                line: { color, shape: 'linear' as const },\n                marker: { color, size: 7 },\n            };\n        };\n\n        const traces: any[] = [];\n        if (groupField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, groupField)) { traces.push(makeTrace(name, rows, i)); i++; }\n        } else {\n            traces.push(makeTrace(undefined, table, 0));\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        const yAxisSpec: any = { title: { text: yField } };\n        // A trajectory reads its shape, not its distance from zero.\n        if (channelSemantics.x?.zero) xAxisSpec.rangemode = channelSemantics.x.zero.zero !== false ? 'tozero' : 'normal';\n        if (channelSemantics.y?.zero) yAxisSpec.rangemode = channelSemantics.y.zero.zero !== false ? 'tozero' : 'normal';\n\n        Object.assign(spec, {\n            data: traces,\n            layout: { xaxis: xAxisSpec, yaxis: yAxisSpec, showlegend: !!groupField },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Range Area Chart (band / high–low ribbon) template.\n *\n * A filled band between a lower (`y`) and upper (`y2`) bound at each x.\n * Plotly's native `fill: 'tonexty'` fills the region between two\n * consecutive traces sharing the same x — the idiomatic Plotly ribbon,\n * simpler than the other backends' transparent-base + delta-stack trick.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { isDiscreteType, extractCategories, groupBy, coerceIsoDateForPlotly, getPlotlyPalette, getSeriesColor, fillColor } from './utils';\n\nexport const plRangeAreaChartDef: ChartTemplateDef = {\n    chart: 'Range Area Chart',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'y2', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const y2CS = channelSemantics.y2;\n        const colorField = channelSemantics.color?.field;\n        if (!xCS?.field || !yCS?.field || !y2CS?.field) return;\n\n        const xField = xCS.field;\n        const lowField = yCS.field;\n        const highField = y2CS.field;\n        const xIsDiscrete = isDiscreteType(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapX = (raw: unknown) => (xIsTemporal ? coerceIsoDateForPlotly(raw) : raw);\n\n        const opacity = Number(chartProperties?.opacity ?? 0.35);\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        // Sort each group by x so the polygon traces a clean band (unsorted\n        // data would zig-zag the fill).\n        const sortRows = (rows: any[]) => xIsDiscrete ? rows : [...rows].sort((a, b) => {\n            const av = xIsTemporal ? new Date(a[xField]).getTime() : Number(a[xField]);\n            const bv = xIsTemporal ? new Date(b[xField]).getTime() : Number(b[xField]);\n            return av - bv;\n        });\n\n        const makeBand = (name: string | undefined, rows: any[], idx: number) => {\n            const sorted = sortRows(rows);\n            const xs = xIsDiscrete ? sorted.map((r: any) => r[xField]) : sorted.map((r: any) => mapX(r[xField]));\n            const color = getSeriesColor(palette, idx);\n            return [\n                {\n                    type: 'scatter', mode: 'lines', showlegend: false,\n                    name: name != null ? `${name} (low)` : 'low',\n                    x: xs, y: sorted.map((r: any) => r[lowField]),\n                    line: { width: 0, color },\n                    hoverinfo: 'skip' as const,\n                },\n                {\n                    type: 'scatter', mode: 'lines',\n                    ...(name != null ? { name } : {}),\n                    x: xs, y: sorted.map((r: any) => r[highField]),\n                    line: { width: 1.5, color },\n                    fill: 'tonexty' as const,\n                    fillcolor: fillColor(color, opacity),\n                },\n            ];\n        };\n\n        const traces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) { traces.push(...makeBand(name, rows, i)); i++; }\n        } else {\n            traces.push(...makeBand(undefined, table, 0));\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        if (xIsDiscrete) {\n            xAxisSpec.type = 'category';\n            xAxisSpec.categoryorder = 'array';\n            xAxisSpec.categoryarray = extractCategories(table, xField, xCS.ordinalSortOrder);\n        } else if (xIsTemporal) {\n            xAxisSpec.type = 'date';\n        }\n        const valueTitle = lowField === highField ? lowField : `${lowField}, ${highField}`;\n\n        Object.assign(spec, {\n            data: traces,\n            layout: { xaxis: xAxisSpec, yaxis: { title: { text: valueTitle } }, showlegend: !!colorField },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 0.35 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Streamgraph template.\n *\n * A \"center-offset\" stacked area (Vega-Lite's `y.stack: 'center'` / ECharts'\n * native `themeRiver`). Plotly has no native wiggle/center stacking, so the\n * baseline is precomputed here (silhouette offset: `-totalAtX / 2`) and each\n * series is drawn as a cumulative line with `fill: 'tonexty'` against the\n * previous series' cumulative line — the same successive-ribbon technique\n * `plRangeAreaChartDef` uses for a single band, chained across N series.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, coerceIsoDateForPlotly, getPlotlyPalette, getSeriesColor } from './utils';\n\nexport const plStreamgraphDef: ChartTemplateDef = {\n    chart: 'Streamgraph',\n    template: { mark: 'area', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 100, y: 20, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const colorField = channelSemantics.color?.field;\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapX = (raw: unknown) => (xIsTemporal ? coerceIsoDateForPlotly(raw) : raw);\n\n        // Shared x categories across all series (temporal/ordinal x, sorted).\n        const xKeys = extractCategories(table, xField, xCS.ordinalSortOrder);\n        const orderedKeys = xIsTemporal\n            ? [...xKeys].sort((a, b) => new Date(a).getTime() - new Date(b).getTime())\n            : (xCS.type === 'quantitative' ? [...xKeys].sort((a, b) => Number(a) - Number(b)) : xKeys);\n\n        const seriesNames = colorField\n            ? [...new Set(table.map((r: any) => String(r[colorField] ?? '')))]\n            : [yField];\n\n        // value(seriesName, xKey)\n        const valMap = new Map<string, number>();\n        for (const row of table) {\n            const xk = String(row[xField]);\n            const sn = colorField ? String(row[colorField] ?? '') : yField;\n            const v = Number(row[yField]);\n            valMap.set(`${xk}\\u0000${sn}`, (Number.isFinite(v) ? v : 0));\n        }\n\n        // Per-x total → silhouette baseline (centers the stack around zero).\n        const totals = orderedKeys.map(xk =>\n            seriesNames.reduce((sum, sn) => sum + (valMap.get(`${xk}\\u0000${sn}`) ?? 0), 0));\n        const baseline = totals.map(t => -t / 2);\n\n        const xVals = orderedKeys.map(k => (xIsTemporal ? mapX(k) : (xCS.type === 'quantitative' ? Number(k) : k)));\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const traces: any[] = [{\n            type: 'scatter', mode: 'lines', showlegend: false,\n            x: xVals, y: baseline,\n            line: { width: 0 }, hoverinfo: 'skip',\n        }];\n        let cumulative = [...baseline];\n        seriesNames.forEach((sn, i) => {\n            cumulative = cumulative.map((c, xi) => c + (valMap.get(`${orderedKeys[xi]}\\u0000${sn}`) ?? 0));\n            const color = getSeriesColor(palette, i);\n            traces.push({\n                type: 'scatter', mode: 'lines',\n                name: sn,\n                x: xVals, y: [...cumulative],\n                line: { width: 0.5, color },\n                fill: 'tonexty',\n                fillcolor: color,\n            });\n        });\n\n        const xAxisSpec: any = { title: { text: xField } };\n        if (xIsTemporal) xAxisSpec.type = 'date';\n        else if (xCS.type !== 'quantitative') {\n            xAxisSpec.type = 'category';\n            xAxisSpec.categoryorder = 'array';\n            xAxisSpec.categoryarray = orderedKeys;\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: { title: { text: yField }, showticklabels: false, zeroline: false },\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Slope Chart (slopegraph) template.\n *\n * One straight line per category connecting its value at two periods, with\n * markers at both ends. Mirrors `ecSlopeChartDef`: the period axis is always\n * a two-band category axis; the value axis fits the data (a slope chart\n * reads the *change*, not the distance from zero) unless the zero decision\n * says otherwise.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories, groupBy, buildCategoryAlignedData, getPlotlyPalette, getSeriesColor } from './utils';\n\n/** Order period categories naturally: numeric, then chronological, else data order. */\nfunction orderPeriods(categories: string[]): string[] {\n    if (categories.length <= 1) return categories;\n    if (categories.every(c => c.trim() !== '' && !isNaN(Number(c)))) {\n        return [...categories].sort((a, b) => Number(a) - Number(b));\n    }\n    if (categories.every(c => !isNaN(Date.parse(c)))) {\n        return [...categories].sort((a, b) => Date.parse(a) - Date.parse(b));\n    }\n    return categories;\n}\n\nexport const plSlopeChartDef: ChartTemplateDef = {\n    chart: 'Slope Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        axisFlags: { x: { banded: true } },\n        paramOverrides: { defaultBandSize: 120, continuousMarkCrossSection: { x: 0, y: 0, seriesCountAxis: 'auto' } },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField || !yField) return;\n\n        const categories = orderPeriods(extractCategories(table, xField, undefined));\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const makeTrace = (name: string | undefined, rows: any[], idx: number) => {\n            const values = buildCategoryAlignedData(rows, xField, yField, categories);\n            const color = getSeriesColor(palette, idx);\n            return {\n                type: 'scatter',\n                mode: 'lines+markers',\n                ...(name != null ? { name } : {}),\n                x: categories, y: values,\n                line: { color, shape: 'linear' as const },\n                marker: { color, size: 7 },\n                connectgaps: false,\n            };\n        };\n\n        const traces: any[] = [];\n        if (groupField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, groupField)) { traces.push(makeTrace(name, rows, i)); i++; }\n        } else {\n            traces.push(makeTrace(undefined, table, 0));\n        }\n\n        const yAxisSpec: any = { title: { text: yField } };\n        if (channelSemantics.y?.zero) yAxisSpec.rangemode = channelSemantics.y.zero.zero !== false ? 'tozero' : 'normal';\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: { type: 'category', categoryorder: 'array', categoryarray: categories, title: { text: xField } },\n                yaxis: yAxisSpec,\n                showlegend: !!groupField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Bump Chart template.\n *\n * A rank-over-time line chart: one line per entity, y = rank (reversed so\n * rank 1 sits at the top). Reuses the same trace-building shape as\n * `plLineChartDef`; the only structural difference is the reversed rank axis.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    isDiscreteType, extractCategories, groupBy, buildCategoryAlignedData,\n    coerceIsoDateForPlotly, getPlotlyPalette, getSeriesColor, sortByOrder,\n} from './utils';\nimport { toTypeString } from '../../core/field-semantics';\n\nconst RANK_SEMANTIC_TYPES = new Set(['Rank', 'Score', 'Level']);\n\nexport const plBumpChartDef: ChartTemplateDef = {\n    chart: 'Bump Chart',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({\n        paramOverrides: { continuousMarkCrossSection: { x: 80, y: 20, seriesCountAxis: 'auto' }, facetAspectRatioResistance: 0.4 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, semanticTypes } = ctx;\n        const xCS = channelSemantics.x;\n        const yCS = channelSemantics.y;\n        const groupField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xCS?.field || !yCS?.field) return;\n        const xField = xCS.field;\n        const yField = yCS.field;\n\n        const xSemType = (xField && toTypeString(semanticTypes?.[xField])) || '';\n        const ySemType = (yField && toTypeString(semanticTypes?.[yField])) || '';\n        const xIsRank = RANK_SEMANTIC_TYPES.has(xSemType);\n        const yIsRank = RANK_SEMANTIC_TYPES.has(ySemType);\n        let rankAxis: 'x' | 'y';\n        if (yIsRank && !xIsRank) rankAxis = 'y';\n        else if (xIsRank && !yIsRank) rankAxis = 'x';\n        else if (isDiscreteType(xCS.type) && !isDiscreteType(yCS.type)) rankAxis = 'y';\n        else if (isDiscreteType(yCS.type) && !isDiscreteType(xCS.type)) rankAxis = 'x';\n        else rankAxis = 'y';\n\n        const xIsDiscrete = isDiscreteType(xCS.type);\n        const xIsTemporal = xCS.type === 'temporal';\n        const mapX = (raw: unknown) => (xIsTemporal ? coerceIsoDateForPlotly(raw) : raw);\n        const categories = xIsDiscrete ? extractCategories(table, xField, xCS.ordinalSortOrder) : undefined;\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const traces: any[] = [];\n        const makeTrace = (name: string, rows: any[], idx: number) => {\n            // x is rank → the line must follow y's order, not x's raw order.\n            const orderedRows = (rankAxis === 'x') ? sortByOrder(rows, yField) : rows;\n            const xVals = xIsDiscrete ? categories! : orderedRows.map(r => mapX(r[xField]));\n            const yVals = xIsDiscrete\n                ? buildCategoryAlignedData(rows, xField, yField, categories!)\n                : orderedRows.map(r => (r[yField] == null ? null : r[yField]));\n            const color = getSeriesColor(palette, idx);\n            return {\n                type: 'scatter',\n                mode: 'lines+markers',\n                name,\n                x: xVals, y: yVals,\n                line: { color, shape: 'spline' as const, smoothing: 0.4 },\n                marker: { color, size: 7 },\n            };\n        };\n\n        if (groupField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, groupField)) { traces.push(makeTrace(name, rows, i)); i++; }\n        } else {\n            traces.push(makeTrace(yField, table, 0));\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        if (xIsDiscrete) { xAxisSpec.type = 'category'; xAxisSpec.categoryorder = 'array'; xAxisSpec.categoryarray = categories; }\n        else if (xIsTemporal) xAxisSpec.type = 'date';\n\n        const yAxisSpec: any = { title: { text: yField } };\n        if (rankAxis === 'y') yAxisSpec.autorange = 'reversed';\n\n        const figXAxis = rankAxis === 'x' ? { ...xAxisSpec, autorange: 'reversed' } : xAxisSpec;\n\n        Object.assign(spec, {\n            data: traces,\n            layout: { xaxis: figXAxis, yaxis: yAxisSpec, showlegend: !!groupField },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Waterfall Chart template.\n *\n * Native `waterfall` trace: pass `x`, `y` (signed deltas) and a `measure`\n * array (`'relative'` | `'total'`) and Plotly computes the floating bars,\n * connector lines, and running totals itself — no manual cumulative-sum /\n * custom-render-item bookkeeping like the ECharts template needs.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories } from './utils';\nimport { resolveTotalsMode } from '../../chart-types/waterfall';\n\nexport const plWaterfallChartDef: ChartTemplateDef = {\n    chart: 'Waterfall Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { x: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field || 'Category';\n        const yField = channelSemantics.y?.field || 'Amount';\n        const colorField = channelSemantics.color?.field;\n\n        const categories = extractCategories(table, xField, undefined);\n        const rows = categories.map(cat => table.find((r: any) => String(r[xField]) === cat)).filter(Boolean);\n        const values = rows.map((r: any) => Number(r[yField]) || 0);\n\n        const hasTypeCol = !!colorField;\n        const totalsMode = resolveTotalsMode(values, chartProperties?.totals);\n        const wantFirst = totalsMode === 'first' || totalsMode === 'both';\n        const wantLast = totalsMode === 'last' || totalsMode === 'both';\n        const types: string[] = hasTypeCol\n            ? rows.map((r: any) => String(r[colorField] ?? 'delta'))\n            : values.map((_v, i) =>\n                wantFirst && i === 0 ? 'start' : wantLast && i === values.length - 1 ? 'end' : 'delta');\n        // Plotly's native `measure: 'total'` does NOT anchor the bar at the\n        // row's own value — it re-derives the bar height as the cumulative\n        // sum of every 'relative' row since the previous checkpoint (or since\n        // the start, for the first checkpoint), ignoring the supplied `y`.\n        // That is exactly right for a genuine reconciling subtotal/end-total\n        // (its value was chosen — via `resolveTotalsMode`/`waterfallLastReconciles`\n        // — BECAUSE it already equals that running sum). But at row 0 there is\n        // no preceding cumulative to show (Plotly renders a zero-height bar),\n        // so a \"start\" anchor MUST be a 'relative' delta from the implicit\n        // zero baseline instead — numerically identical to the value the\n        // other backends draw, just colored increase/decrease rather than the\n        // dedicated \"total\" hue.\n        const measure = types.map((t, i) => {\n            if (i === 0) return 'relative';\n            return (t === 'start' || t === 'end') ? 'total' : 'relative';\n        }) as Array<'total' | 'relative'>;\n\n        const showLabels = !!chartProperties?.showTextLabels;\n\n        // Value labels sit OUTSIDE the bars (above a rise, below a fall). Plotly's\n        // auto-range only fits the bar extents, not the outside text, so the\n        // labels on the tallest/deepest bars get clipped at the plot edge. When\n        // labels are on, pad the y-range past the running-total envelope so the\n        // callouts have room, and set `cliponaxis: false` so a label that still\n        // reaches the edge is drawn into the margin rather than cut off.\n        let yRange: [number, number] | undefined;\n        if (showLabels) {\n            const extents = [0];\n            let run = 0;\n            for (const v of values) { run += v; extents.push(run); }\n            const lo = Math.min(...extents);\n            const hi = Math.max(...extents);\n            const pad = (hi - lo || Math.abs(hi) || 1) * 0.15;\n            yRange = [lo - pad, hi + pad];\n        }\n\n        Object.assign(spec, {\n            data: [{\n                type: 'waterfall',\n                x: categories,\n                y: values,\n                measure,\n                // Plotly's native waterfall palette (its default template):\n                // teal-green rises, red falls, blue totals, dark-grey\n                // connectors — rather than borrowing the ECharts hues, so the\n                // Plotly output looks native.\n                connector: { line: { color: '#444', width: 1 } },\n                increasing: { marker: { color: '#3D9970' } },\n                decreasing: { marker: { color: '#FF4136' } },\n                totals: { marker: { color: '#4499FF' } },\n                text: showLabels ? values.map(v => (v > 0 ? '+' : '') + v) : undefined,\n                textposition: showLabels ? 'outside' as const : undefined,\n                ...(showLabels ? { cliponaxis: false } : {}),\n            }],\n            layout: {\n                xaxis: { type: 'category', categoryorder: 'array', categoryarray: categories, title: { text: xField } },\n                yaxis: { title: { text: yField }, ...(yRange ? { range: yRange } : {}) },\n                showlegend: false,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'totals', label: 'Totals', type: 'discrete', defaultValue: 'auto',\n            options: [\n                { value: 'auto', label: 'Auto' },\n                { value: 'none', label: 'None' },\n                { value: 'first', label: 'First only' },\n                { value: 'last', label: 'Last only' },\n                { value: 'both', label: 'First and last' },\n            ],\n        } as ChartPropertyDef,\n        { key: 'showTextLabels', label: 'Value labels', type: 'binary', defaultValue: false } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Candlestick Chart template.\n *\n * Native `candlestick` trace: pass `x`, `open`, `high`, `low`, `close` and\n * Plotly draws the OHLC bars with built-in up/down coloring — one of\n * Plotly's strongest native chart types (the Vega-Lite equivalent is a\n * layered rule+bar spec; ECharts needs a manual `[open, close, low, high]`\n * reordering).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { isDiscreteType } from './utils';\n\nexport const plCandlestickChartDef: ChartTemplateDef = {\n    chart: 'Candlestick Chart',\n    template: { mark: 'candlestick', encoding: {} },\n    channels: ['x', 'open', 'high', 'low', 'close', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({ axisFlags: { x: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xCS = channelSemantics.x;\n        const openField = channelSemantics.open?.field;\n        const highField = channelSemantics.high?.field;\n        const lowField = channelSemantics.low?.field;\n        const closeField = channelSemantics.close?.field;\n        if (!xCS?.field || !openField || !closeField) return;\n        const xField = xCS.field;\n        const xIsTemporal = xCS.type === 'temporal';\n        const xIsDiscrete = isDiscreteType(xCS.type);\n\n        const xVals = table.map((r: any) => r[xField]);\n        const open = table.map((r: any) => Number(r[openField]));\n        const close = table.map((r: any) => Number(r[closeField]));\n        const high = highField ? table.map((r: any) => Number(r[highField])) : open.map((o, i) => Math.max(o, close[i]));\n        const low = lowField ? table.map((r: any) => Number(r[lowField])) : open.map((o, i) => Math.min(o, close[i]));\n\n        const traces: any[] = [{\n            type: 'candlestick',\n            x: xVals, open, high, low, close,\n            increasing: { line: { color: '#06982d' } },\n            decreasing: { line: { color: '#ae1325' } },\n        }];\n\n        if (chartProperties?.showMA) {\n            const maWindow = Number(chartProperties.maWindow) || 5;\n            const ma = computeMA(close, maWindow);\n            traces.push({\n                type: 'scatter', mode: 'lines', name: `MA${maWindow}`,\n                x: xVals, y: ma,\n                line: { width: 1.5, shape: 'spline' as const },\n            });\n        }\n\n        const xAxisSpec: any = { title: { text: xField }, rangeslider: { visible: table.length > 60 } };\n        if (xIsTemporal) xAxisSpec.type = 'date';\n        else if (xIsDiscrete) { xAxisSpec.type = 'category'; }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: { title: { text: 'Price' } },\n                showlegend: !!chartProperties?.showMA,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'showMA', label: 'Moving average', type: 'binary', defaultValue: false } as ChartPropertyDef,\n        { key: 'maWindow', label: 'Average window', type: 'continuous', min: 3, max: 30, step: 1, defaultValue: 5 } as ChartPropertyDef,\n    ],\n};\n\nfunction computeMA(prices: number[], window: number): (number | null)[] {\n    const result: (number | null)[] = [];\n    for (let i = 0; i < prices.length; i++) {\n        if (i < window - 1) { result.push(null); continue; }\n        let sum = 0;\n        for (let j = i - window + 1; j <= i; j++) sum += prices[j];\n        result.push(Math.round((sum / window) * 100) / 100);\n    }\n    return result;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Heatmap template.\n *\n * Native `heatmap` trace: pass `x`, `y` category arrays and a `z` matrix and\n * Plotly draws the grid + colorbar itself — no manual index-mapping like the\n * ECharts template (`data: [[xIdx, yIdx, value], ...]`) needs.\n */\n\nimport { ChartTemplateDef, EncodingActionDef } from '../../core/types';\nimport { extractCategories } from './utils';\nimport { makeCartesianPivot } from '../../core/pivot';\n\nconst SCHEME_COLORSCALES: Record<string, string> = {\n    viridis: 'Viridis', inferno: 'Hot', magma: 'Magma', plasma: 'Plasma', turbo: 'Turbo',\n    blues: 'Blues', reds: 'Reds', greens: 'Greens', oranges: 'Oranges', purples: 'Purples', greys: 'Greys',\n    blueorange: 'RdBu', redblue: 'RdBu',\n};\nconst DEFAULT_SCHEME = 'Blues';\n\nexport const plHeatmapDef: ChartTemplateDef = {\n    chart: 'Heatmap',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'color',\n    declareLayoutMode: () => ({ axisFlags: { x: { banded: true }, y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, colorDecisions, encodings } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField || !yField) return;\n\n        const xCategories = extractCategories(table, xField, channelSemantics.x?.ordinalSortOrder);\n        const yCategories = extractCategories(table, yField, channelSemantics.y?.ordinalSortOrder);\n\n        const cellMap = new Map<string, number>();\n        for (const row of table) {\n            const key = `${row[xField]}\\u0000${row[yField]}`;\n            const val = colorField ? (Number(row[colorField]) || 0) : 1;\n            cellMap.set(key, (cellMap.get(key) ?? 0) + val);\n        }\n        const z = yCategories.map(yc => xCategories.map(xc => {\n            const v = cellMap.get(`${xc}\\u0000${yc}`);\n            return v ?? null;\n        }));\n\n        const encScheme = (encodings?.color as any)?.scheme;\n        const userScheme = (encScheme && encScheme !== 'default') ? encScheme : undefined;\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        const semanticIsDiverging = decision?.schemeType === 'diverging';\n        const schemeName = userScheme || (semanticIsDiverging ? 'redblue' : DEFAULT_SCHEME.toLowerCase());\n        const colorscale = SCHEME_COLORSCALES[schemeName] ?? DEFAULT_SCHEME;\n\n        Object.assign(spec, {\n            data: [{\n                type: 'heatmap',\n                x: xCategories, y: yCategories, z,\n                colorscale,\n                hoverongaps: false,\n                colorbar: { title: { text: colorField ?? 'Value' } },\n            }],\n            layout: {\n                xaxis: { type: 'category', categoryorder: 'array', categoryarray: xCategories, title: { text: xField } },\n                yaxis: { type: 'category', categoryorder: 'array', categoryarray: yCategories, title: { text: yField } },\n                showlegend: false,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    encodingActions: [\n        {\n            key: 'colorScheme',\n            label: 'Scheme',\n            isApplicable: (c) => !!c.encodings.color?.field,\n            dependencies: ['color'],\n            control: {\n                type: 'discrete', options: [\n                    { value: undefined, label: 'Default (Blues)' },\n                    { value: 'viridis', label: 'Viridis' },\n                    { value: 'inferno', label: 'Inferno' },\n                    { value: 'magma', label: 'Magma' },\n                    { value: 'plasma', label: 'Plasma' },\n                    { value: 'turbo', label: 'Turbo' },\n                    { value: 'blues', label: 'Blues' },\n                    { value: 'reds', label: 'Reds' },\n                    { value: 'greens', label: 'Greens' },\n                    { value: 'oranges', label: 'Oranges' },\n                    { value: 'purples', label: 'Purples' },\n                    { value: 'greys', label: 'Greys' },\n                    { value: 'blueorange', label: 'Blue-Orange (diverging)' },\n                    { value: 'redblue', label: 'Red-Blue (diverging)' },\n                ],\n            },\n            get: (enc) => (enc.color as any)?.scheme,\n            set: (enc, value) => ({ ...enc, color: { ...(enc.color as any), scheme: value } }),\n        },\n    ] as EncodingActionDef[],\n    pivot: makeCartesianPivot({ transpose: [['x', 'y']] }),\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Lollipop Chart template.\n *\n * A thin `bar` trace (the stem, zero → value) plus a `scatter` marker trace\n * (the dot) sharing the same category axis — mirrors `ecLollipopChartDef`.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\nimport { resolveCategoryOrder, buildCategoryAlignedData, detectAxes, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\nimport { detectBandedAxisFromSemantics } from '../../core/axis-detection';\nimport { makeSortAction } from '../../core/encoding-actions';\n\nconst STEM_COLOR = '#9aa0a6';\n\nexport const plLollipopChartDef: ChartTemplateDef = {\n    chart: 'Lollipop Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['x', 'y', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: (cs, table) => {\n        const result = detectBandedAxisFromSemantics(cs, table, { preferAxis: 'x' });\n        return {\n            axisFlags: result ? { [result.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: result?.resolvedTypes,\n        };\n    },\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const { categoryAxis, valueAxis } = detectAxes(channelSemantics);\n        const catField = channelSemantics[categoryAxis]?.field;\n        const valField = channelSemantics[valueAxis]?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!catField || !valField) return;\n\n        const catEnc = ctx.encodings?.[categoryAxis];\n        const sortByField = catEnc?.sortBy ? channelSemantics[catEnc.sortBy]?.field : undefined;\n        const categories = resolveCategoryOrder(table, catField, {\n            ordinalSortOrder: channelSemantics[categoryAxis]?.ordinalSortOrder,\n            sortBy: sortByField, sortOrder: catEnc?.sortOrder,\n        });\n        const values = buildCategoryAlignedData(table, catField, valField, categories);\n        const isHorizontal = categoryAxis === 'y';\n        const dotSize = Number(chartProperties?.dotSize ?? 80);\n        const symbolSizePx = Math.max(6, Math.min(10 + (dotSize - 80) / 40, 16));\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const stemTrace: any = {\n            type: 'bar',\n            name: '__stem',\n            showlegend: false,\n            hoverinfo: 'skip',\n            width: 0.06,\n            ...(isHorizontal ? { x: values, y: categories, orientation: 'h' } : { x: categories, y: values }),\n            marker: { color: STEM_COLOR },\n        };\n\n        const dotTraces: any[] = [];\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                const pts = categories.map(cat => rows.find((r: any) => String(r[catField] ?? '') === cat));\n                dotTraces.push({\n                    type: 'scatter', mode: 'markers', name,\n                    ...(isHorizontal\n                        ? { x: pts.map(r => r?.[valField] ?? null), y: categories }\n                        : { x: categories, y: pts.map(r => r?.[valField] ?? null) }),\n                    marker: { color: getSeriesColor(palette, i), size: symbolSizePx, line: { color: '#fff', width: 1 } },\n                });\n                i++;\n            }\n        } else {\n            dotTraces.push({\n                type: 'scatter', mode: 'markers', showlegend: false,\n                ...(isHorizontal ? { x: values, y: categories } : { x: categories, y: values }),\n                marker: { color: getSeriesColor(palette, 0), size: symbolSizePx, line: { color: '#fff', width: 1 } },\n            });\n        }\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const valCS = channelSemantics[valueAxis];\n        const includeZero = valCS?.zero ? valCS.zero.zero !== false : true;\n        const valAxisSpec = { title: { text: valField }, rangemode: (includeZero ? 'tozero' : 'normal') as 'tozero' | 'normal' };\n\n        Object.assign(spec, {\n            data: [stemTrace, ...dotTraces],\n            layout: {\n                ...(isHorizontal ? { xaxis: valAxisSpec, yaxis: catAxisSpec } : { xaxis: catAxisSpec, yaxis: valAxisSpec }),\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'dotSize', label: 'Dot Size', type: 'continuous', min: 20, max: 300, step: 10, defaultValue: 80 } as ChartPropertyDef,\n    ],\n    encodingActions: [makeSortAction()] as EncodingActionDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Bullet Chart template.\n *\n * One row per KPI: qualitative gray zones (quarters of that row's own goal),\n * a value bar colored by goal attainment, and a target tick. Plotly has no\n * native bullet mark, so each element is drawn with an explicit `base` (the\n * bar's start offset, independent of any stacking mode) and\n * `layout.barmode: 'overlay'` so the zones and the value bar sit concentric\n * rather than dodged — the target tick is a `scatter` trace with\n * `marker.symbol: 'line-ns'`, Plotly's built-in vertical-tick glyph.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { extractCategories } from './utils';\n\nconst ZONE_GRAYS = ['#e2e2e2', '#ececec', '#f5f5f5'];\n// Plotly's native \"good/bad\" semantics: the indicator delta uses #3D9970\n// (positive) and #FF4136 (negative). Reusing that pair for bullet attainment\n// keeps the value bar consistent with Plotly's own palette (and the waterfall).\nconst STATUS_COLORS = { below: '#FF4136', met: '#3D9970' };\n\nexport const plBulletChartDef: ChartTemplateDef = {\n    chart: 'Bullet Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'goal', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const labelField = channelSemantics.y?.field;\n        const valueField = channelSemantics.x?.field;\n        const goalField = channelSemantics.goal?.field;\n        if (!labelField || !valueField || table.length === 0) return;\n\n        const categories = extractCategories(table, labelField, channelSemantics.y?.ordinalSortOrder);\n        const byCat = new Map<string, any>();\n        for (const r of table) byCat.set(String(r[labelField] ?? ''), r);\n        const valueOf = (cat: string) => Number(byCat.get(cat)?.[valueField]);\n        const goalOf = (cat: string) => goalField != null ? Number(byCat.get(cat)?.[goalField]) : NaN;\n\n        const quarter = categories.map(cat => {\n            const g = goalOf(cat);\n            return Number.isFinite(g) && g > 0 ? g / 4 : 0;\n        });\n\n        const zoneTraces = [0, 1, 2].map(i => ({\n            type: 'bar',\n            name: `__zone${i}`,\n            orientation: 'h' as const,\n            showlegend: false,\n            hoverinfo: 'skip' as const,\n            base: quarter.map(q => q * i),\n            x: quarter,\n            y: categories,\n            width: 0.62,\n            marker: { color: ZONE_GRAYS[i] },\n        }));\n\n        const valueTrace = {\n            type: 'bar',\n            name: 'value',\n            orientation: 'h' as const,\n            showlegend: false,\n            base: categories.map(() => 0),\n            x: categories.map(cat => { const v = valueOf(cat); return Number.isFinite(v) ? v : 0; }),\n            y: categories,\n            width: 0.32,\n            marker: {\n                color: categories.map(cat => {\n                    const v = valueOf(cat); const g = goalOf(cat);\n                    const met = Number.isFinite(g) ? v >= g : true;\n                    return met ? STATUS_COLORS.met : STATUS_COLORS.below;\n                }),\n            },\n            hovertemplate: `%{y}<br />${valueField}: %{x}<extra></extra>`,\n        };\n\n        const traces: any[] = [...zoneTraces, valueTrace];\n\n        if (goalField) {\n            // Target tick scales with the band height (yStep) so it stays\n            // proportional to the bars across canvas sizes, instead of a fixed\n            // 22px that looks tiny on a tall chart and huge on a short one.\n            const bandPx = ctx.layout.yStep || 30;\n            const tickSize = Math.max(14, Math.min(48, Math.round(bandPx * 0.4)));\n            traces.push({\n                type: 'scatter',\n                mode: 'markers',\n                name: 'Target',\n                x: categories.map(cat => goalOf(cat)),\n                y: categories,\n                showlegend: false,\n                marker: { symbol: 'line-ns', size: tickSize, line: { color: '#1a1a1a', width: 2.5 } },\n                hovertemplate: `%{y}<br />${goalField}: %{x}<extra></extra>`,\n            });\n            // No legend entry for the target tick: the mark itself is the\n            // universally understood bullet-chart target line, and its\n            // `line-ns` glyph renders as an oversized black bar in the legend\n            // regardless of marker size. Only the attainment colors below\n            // need explaining.\n            // Legend-only swatches for the value bar's attainment colors\n            // (the bar itself carries a per-point color array, which Plotly's\n            // legend cannot summarize on its own). A single zero-width,\n            // zero-opacity bar at an existing category — a truly empty trace\n            // (`x: []`) does not render a legend entry at all.\n            traces.push(\n                { type: 'bar', name: 'Meets target', x: [0], y: [categories[0]], width: 0, hoverinfo: 'skip', marker: { color: STATUS_COLORS.met } },\n                { type: 'bar', name: 'Below target', x: [0], y: [categories[0]], width: 0, hoverinfo: 'skip', marker: { color: STATUS_COLORS.below } },\n            );\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                barmode: 'overlay',\n                xaxis: { title: { text: valueField }, rangemode: 'tozero' },\n                yaxis: { type: 'category', categoryorder: 'array', categoryarray: categories, title: { text: labelField } },\n                showlegend: !!goalField,\n                // Vertical (default) legend layout needs plot-height room per\n                // entry; a bullet chart is often short and wide (few rows), so\n                // a horizontal legend below the plot fits these 3 longer\n                // labels (\"Target\" / \"Meets target\" / \"Below target\") more\n                // reliably than trying to widen a narrow side gutter.\n                legend: { orientation: 'h', font: { size: 11 }, x: 0.5, xanchor: 'center', y: -0.32, yanchor: 'top' },\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    postProcess: (figure) => {\n        // Reserve room below the plot for the horizontal legend row instead of\n        // the shared side gutter (sized for a typical short color legend,\n        // too narrow for these longer labels).\n        if (figure.layout?.showlegend) {\n            if (typeof figure._width === 'number') {\n                figure._width = Math.max(figure._width - 60, 320);\n                figure.layout.width = figure._width;\n            }\n            if (typeof figure._height === 'number') {\n                figure._height += 72;\n                figure.layout.height = figure._height;\n            }\n            if (figure.layout.margin) figure.layout.margin.b = (figure.layout.margin.b ?? 0) + 72;\n        }\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Gantt Chart template.\n *\n * One horizontal bar per task, `base: start`, `x: end − start` — Plotly's\n * `base` property natively floats a bar off zero, so no transparent-base\n * trick (unlike the ECharts template, which must stack a silent base series\n * to fake a floating interval bar).\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport {\n    coerceGanttEndpoint, formatGanttLabel, GANTT_PROPERTIES, isGanttTemporal, sortGanttRows,\n} from '../../chart-types/gantt';\nimport { getPlotlyPalette, getSeriesColor } from './utils';\n\nexport const plGanttChartDef: ChartTemplateDef = {\n    chart: 'Gantt Chart',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'x2', 'color', 'detail', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    declareLayoutMode: () => ({ axisFlags: { y: { banded: true } } }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, semanticTypes } = ctx;\n        const taskField = channelSemantics.y?.field;\n        const startField = channelSemantics.x?.field;\n        const endField = channelSemantics.x2?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!taskField || !startField || !endField || table.length === 0) return;\n\n        const temporal = isGanttTemporal(channelSemantics.x?.type, semanticTypes[startField]);\n        const rows = sortGanttRows(table\n            .map((r: any, inputIndex: number) => ({\n                task: String(r[taskField] ?? ''),\n                start: coerceGanttEndpoint(r[startField], temporal),\n                end: coerceGanttEndpoint(r[endField], temporal),\n                group: colorField != null ? String(r[colorField] ?? '') : undefined,\n                inputIndex,\n            }))\n            .filter((r) => r.task && Number.isFinite(r.start) && Number.isFinite(r.end)));\n        if (rows.length === 0) return;\n\n        const taskHeight = Number(chartProperties?.taskHeight ?? 70) / 100;\n        const cornerRadius = Number(chartProperties?.cornerRadius ?? 2);\n        const intervalLabels = chartProperties?.intervalLabels === true;\n        const tasks = rows.map(r => r.task);\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const groups = colorField ? Array.from(new Set(rows.map(r => r.group ?? ''))) : [];\n        const groupColorIdx = new Map(groups.map((g, i) => [g, i]));\n\n        const dateLabel = (ms: number) => temporal ? new Date(ms).toISOString().slice(0, 10) : String(ms);\n\n        const traces: any[] = [];\n        if (colorField && groups.length > 0) {\n            for (const g of groups) {\n                const groupRows = rows.filter(r => (r.group ?? '') === g);\n                traces.push({\n                    type: 'bar',\n                    name: g,\n                    orientation: 'h',\n                    base: groupRows.map(r => r.start),\n                    x: groupRows.map(r => r.end - r.start),\n                    y: groupRows.map(r => r.task),\n                    width: taskHeight,\n                    marker: { color: getSeriesColor(palette, groupColorIdx.get(g) ?? 0) },\n                    text: intervalLabels ? groupRows.map(r => formatGanttLabel(r.start, r.end, temporal)) : undefined,\n                    textposition: intervalLabels ? 'outside' as const : undefined,\n                    customdata: groupRows.map(r => [dateLabel(r.start), dateLabel(r.end)]),\n                });\n            }\n        } else {\n            traces.push({\n                type: 'bar',\n                orientation: 'h',\n                showlegend: false,\n                base: rows.map(r => r.start),\n                x: rows.map(r => r.end - r.start),\n                y: tasks,\n                width: taskHeight,\n                marker: { color: getSeriesColor(palette, 0) },\n                text: intervalLabels ? rows.map(r => formatGanttLabel(r.start, r.end, temporal)) : undefined,\n                textposition: intervalLabels ? 'outside' as const : undefined,\n                customdata: rows.map(r => [dateLabel(r.start), dateLabel(r.end)]),\n            });\n        }\n        for (const t of traces) {\n            t.hovertemplate = `%{y}<br />${startField}: %{customdata[0]}<br />${endField}: %{customdata[1]}<extra></extra>`;\n            t.marker.line = { width: 0 };\n            if (cornerRadius) t.marker.cornerradius = cornerRadius;\n        }\n\n        const xAxisSpec: any = { title: { text: temporal ? '' : startField } };\n        if (temporal) xAxisSpec.type = 'date';\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                xaxis: xAxisSpec,\n                yaxis: { type: 'category', categoryorder: 'array', categoryarray: tasks, autorange: 'reversed', title: { text: taskField } },\n                showlegend: !!colorField && groups.length > 1,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: GANTT_PROPERTIES,\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Ranged Dot Plot template.\n *\n * A thin connector line per category plus colored point markers — typically\n * used for min/max-style ranges (e.g. one line per country spanning its\n * lowest to highest reading, with markers colored by reading type). Mirrors\n * `ecRangedDotPlotDef`.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { isDiscreteType, extractCategories, groupBy, getPlotlyPalette, getSeriesColor } from './utils';\n\nexport const plRangedDotPlotDef: ChartTemplateDef = {\n    chart: 'Ranged Dot Plot',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField || !yField) return;\n\n        const xIsDiscrete = isDiscreteType(channelSemantics.x?.type);\n        const yIsDiscrete = isDiscreteType(channelSemantics.y?.type);\n        // The categorical axis carries one connector segment; the continuous\n        // axis carries the range extent.\n        const catAxis: 'x' | 'y' = yIsDiscrete ? 'y' : xIsDiscrete ? 'x' : 'y';\n        const catField = catAxis === 'y' ? yField : xField;\n        const contField = catAxis === 'y' ? xField : yField;\n\n        const categories = extractCategories(table, catField, channelSemantics[catAxis]?.ordinalSortOrder);\n        const byCat = groupBy(table, catField);\n\n        // Connector segments: one [min, max] line per category, drawn behind the points.\n        const segX: (number | string | null)[] = [];\n        const segY: (number | string | null)[] = [];\n        for (const cat of categories) {\n            const rows = byCat.get(cat) ?? [];\n            const vals = rows.map((r: any) => Number(r[contField])).filter((v: number) => isFinite(v));\n            if (vals.length === 0) continue;\n            const lo = Math.min(...vals);\n            const hi = Math.max(...vals);\n            if (catAxis === 'y') { segX.push(lo, hi, null); segY.push(cat, cat, null); }\n            else { segX.push(cat, cat, null); segY.push(lo, hi, null); }\n        }\n\n        const traces: any[] = [{\n            type: 'scatter', mode: 'lines', name: '', showlegend: false,\n            x: segX, y: segY,\n            line: { color: '#999', width: 2 },\n            hoverinfo: 'skip',\n        }];\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) {\n                traces.push({\n                    type: 'scatter', mode: 'markers', name,\n                    x: catAxis === 'y' ? rows.map((r: any) => r[contField]) : rows.map((r: any) => r[catField]),\n                    y: catAxis === 'y' ? rows.map((r: any) => r[catField]) : rows.map((r: any) => r[contField]),\n                    marker: { color: getSeriesColor(palette, i), size: 9 },\n                });\n                i++;\n            }\n        } else {\n            traces.push({\n                type: 'scatter', mode: 'markers', showlegend: false,\n                x: catAxis === 'y' ? table.map((r: any) => r[contField]) : table.map((r: any) => r[catField]),\n                y: catAxis === 'y' ? table.map((r: any) => r[catField]) : table.map((r: any) => r[contField]),\n                marker: { color: getSeriesColor(palette, 0), size: 9 },\n            });\n        }\n\n        const catAxisSpec = { type: 'category' as const, categoryorder: 'array' as const, categoryarray: categories, title: { text: catField } };\n        const contAxisSpec = { title: { text: contField } };\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                ...(catAxis === 'y' ? { yaxis: catAxisSpec, xaxis: contAxisSpec } : { xaxis: catAxisSpec, yaxis: contAxisSpec }),\n                showlegend: !!colorField,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Regression template — scatter + fitted trend line.\n *\n * Plotly has no built-in regression transform (Vega-Lite's `transform:\n * [{regression}]` runs in the Vega runtime); the fit is computed here,\n * mirroring `ecRegressionDef`.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { groupBy, getPlotlyPalette, getSeriesColor } from './utils';\n\n/** Simple linear regression: slope and intercept. */\nfunction linearRegression(data: number[][]): { slope: number; intercept: number; xMin: number; xMax: number } {\n    const n = data.length;\n    if (n === 0) return { slope: 0, intercept: 0, xMin: 0, xMax: 0 };\n    let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n    let xMin = data[0][0], xMax = data[0][0];\n    for (const [x, y] of data) {\n        sumX += x; sumY += y; sumXY += x * y; sumXX += x * x;\n        if (x < xMin) xMin = x;\n        if (x > xMax) xMax = x;\n    }\n    const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX) || 0;\n    const intercept = (sumY - slope * sumX) / n;\n    return { slope, intercept, xMin, xMax };\n}\n\n/** Polynomial regression via least-squares normal equations. */\nfunction polyRegression(data: number[][], order: number): { coeffs: number[]; xMin: number; xMax: number } {\n    const n = data.length;\n    if (n === 0) return { coeffs: [0], xMin: 0, xMax: 0 };\n    let xMin = data[0][0], xMax = data[0][0];\n    for (const [x] of data) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n    const k = order + 1;\n    const xtx: number[][] = Array.from({ length: k }, () => new Array(k).fill(0));\n    const xty: number[] = new Array(k).fill(0);\n    for (const [x, y] of data) {\n        const xp: number[] = new Array(2 * order + 1);\n        xp[0] = 1;\n        for (let p = 1; p < xp.length; p++) xp[p] = xp[p - 1] * x;\n        for (let i = 0; i < k; i++) {\n            xty[i] += y * xp[i];\n            for (let j = 0; j < k; j++) xtx[i][j] += xp[i + j];\n        }\n    }\n    const aug: number[][] = xtx.map((row, i) => [...row, xty[i]]);\n    for (let col = 0; col < k; col++) {\n        let maxRow = col;\n        for (let row = col + 1; row < k; row++) if (Math.abs(aug[row][col]) > Math.abs(aug[maxRow][col])) maxRow = row;\n        if (maxRow !== col) [aug[col], aug[maxRow]] = [aug[maxRow], aug[col]];\n        const pivot = aug[col][col];\n        if (Math.abs(pivot) < 1e-12) continue;\n        for (let j = col; j <= k; j++) aug[col][j] /= pivot;\n        for (let row = 0; row < k; row++) {\n            if (row === col) continue;\n            const factor = aug[row][col];\n            for (let j = col; j <= k; j++) aug[row][j] -= factor * aug[col][j];\n        }\n    }\n    return { coeffs: aug.map(row => row[k]), xMin, xMax };\n}\n\nfunction polyEval(coeffs: number[], x: number): number {\n    let result = 0, xp = 1;\n    for (const c of coeffs) { result += c * xp; xp *= x; }\n    return result;\n}\n\n/** Generate regression curve points for a given method. */\nfunction regressionCurvePoints(data: number[][], method: string, order: number, numPoints = 50): number[][] {\n    if (data.length === 0) return [];\n    if (method === 'linear' || !method) {\n        const reg = linearRegression(data);\n        return [[reg.xMin, reg.slope * reg.xMin + reg.intercept], [reg.xMax, reg.slope * reg.xMax + reg.intercept]];\n    }\n    if (method === 'log') {\n        const filtered = data.filter(([x]) => x > 0);\n        if (filtered.length < 2) return [];\n        const reg = linearRegression(filtered.map(([x, y]) => [Math.log(x), y]));\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        return Array.from({ length: numPoints }, (_v, i) => {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            return [x, reg.intercept + reg.slope * Math.log(x)];\n        });\n    }\n    if (method === 'exp') {\n        const filtered = data.filter(([, y]) => y > 0);\n        if (filtered.length < 2) return [];\n        const reg = linearRegression(filtered.map(([x, y]) => [x, Math.log(y)]));\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        return Array.from({ length: numPoints }, (_v, i) => {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            return [x, Math.exp(reg.intercept + reg.slope * x)];\n        });\n    }\n    if (method === 'pow') {\n        const filtered = data.filter(([x, y]) => x > 0 && y > 0);\n        if (filtered.length < 2) return [];\n        const reg = linearRegression(filtered.map(([x, y]) => [Math.log(x), Math.log(y)]));\n        let xMin = Infinity, xMax = -Infinity;\n        for (const [x] of filtered) { if (x < xMin) xMin = x; if (x > xMax) xMax = x; }\n        return Array.from({ length: numPoints }, (_v, i) => {\n            const x = xMin + (xMax - xMin) * i / (numPoints - 1);\n            return [x, Math.exp(reg.intercept) * Math.pow(x, reg.slope)];\n        });\n    }\n    if (method === 'quad' || method === 'poly') {\n        const reg = polyRegression(data, method === 'quad' ? 2 : order);\n        return Array.from({ length: numPoints }, (_v, i) => {\n            const x = reg.xMin + (reg.xMax - reg.xMin) * i / (numPoints - 1);\n            return [x, polyEval(reg.coeffs, x)];\n        });\n    }\n    const reg = linearRegression(data);\n    return [[reg.xMin, reg.slope * reg.xMin + reg.intercept], [reg.xMax, reg.slope * reg.xMax + reg.intercept]];\n}\n\nexport const plRegressionDef: ChartTemplateDef = {\n    chart: 'Regression',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['x', 'y', 'size', 'color', 'column', 'row'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const colorField = channelSemantics.color?.field;\n        if (!xField || !yField) return;\n\n        const method = String(chartProperties?.regressionMethod ?? 'linear');\n        const polyOrder = Number(chartProperties?.polyOrder ?? 3);\n        const opacity = Number(chartProperties?.opacity ?? 1);\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const traces: any[] = [];\n        const pushGroup = (name: string | undefined, rows: any[], idx: number) => {\n            const data = rows.map((r: any) => [Number(r[xField]), Number(r[yField])]).filter(([x, y]) => isFinite(x) && isFinite(y));\n            const lineData = regressionCurvePoints(data, method, polyOrder);\n            const color = getSeriesColor(palette, idx);\n            traces.push({\n                type: 'scatter', mode: 'markers',\n                ...(name != null ? { name } : {}),\n                x: data.map(d => d[0]), y: data.map(d => d[1]),\n                marker: { color, opacity },\n            });\n            traces.push({\n                type: 'scatter', mode: 'lines',\n                name: name != null ? `${name} (trend)` : 'Trend',\n                x: lineData.map(d => d[0]), y: lineData.map(d => d[1]),\n                line: { color: name != null ? color : '#ee6666', width: 2, shape: method !== 'linear' ? 'spline' : 'linear' },\n            });\n        };\n\n        if (colorField) {\n            let i = 0;\n            for (const [name, rows] of groupBy(table, colorField)) { pushGroup(name, rows, i); i++; }\n        } else {\n            pushGroup(undefined, table, 0);\n        }\n\n        const xAxisSpec: any = { title: { text: xField } };\n        const yAxisSpec: any = { title: { text: yField } };\n        if (channelSemantics.x?.zero) xAxisSpec.rangemode = channelSemantics.x.zero.zero !== false ? 'tozero' : 'normal';\n        if (channelSemantics.y?.zero) yAxisSpec.rangemode = channelSemantics.y.zero.zero !== false ? 'tozero' : 'normal';\n\n        Object.assign(spec, { data: traces, layout: { xaxis: xAxisSpec, yaxis: yAxisSpec, showlegend: !!colorField } });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'regressionMethod', label: 'Method', type: 'discrete',\n            options: [\n                { value: 'linear', label: 'Linear' },\n                { value: 'log', label: 'Logarithmic' },\n                { value: 'exp', label: 'Exponential' },\n                { value: 'pow', label: 'Power' },\n                { value: 'quad', label: 'Quadratic' },\n                { value: 'poly', label: 'Polynomial' },\n            ],\n            defaultValue: 'linear',\n        } as ChartPropertyDef,\n        { key: 'polyOrder', label: 'Poly Order', type: 'continuous', min: 2, max: 10, step: 1, defaultValue: 3 } as ChartPropertyDef,\n        { key: 'opacity', label: 'Opacity', type: 'continuous', min: 0.1, max: 1, step: 0.05, defaultValue: 1 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly KPI Card template.\n *\n * Native `indicator` trace (`mode: 'number+delta'`): Plotly renders the big\n * number, the caption (`title`), and — when a `goal` is bound — a delta\n * arrow/percentage against it, all natively. This is a much simpler mapping\n * than the Vega-Lite template, which hand-draws each card (rect + text marks)\n * because Vega-Lite has no indicator primitive.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\n\ntype Layout = 'horizontal' | 'vertical' | 'grid';\n\nexport const plKpiCardDef: ChartTemplateDef = {\n    chart: 'KPI Card',\n    template: { layer: [] },\n    channels: ['metric', 'value', 'goal'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const metricField = channelSemantics.metric?.field;\n        const valueField = channelSemantics.value?.field;\n        const goalField = channelSemantics.goal?.field;\n        if (!valueField) return;\n\n        const rows = (ctx.fullTable ?? table ?? []).filter((r: any) => r && r[valueField] != null);\n        if (rows.length === 0) return;\n\n        const layout: Layout = (chartProperties?.layout as Layout) ?? (rows.length > 4 ? 'grid' : 'horizontal');\n        const n = rows.length;\n        let cols: number, gridRows: number;\n        if (layout === 'vertical') { cols = 1; gridRows = n; }\n        else if (layout === 'horizontal') { cols = n; gridRows = 1; }\n        else { cols = Math.ceil(Math.sqrt(n)); gridRows = Math.ceil(n / cols); }\n\n        const gapFrac = 0.02;\n        const cellW = (1 - gapFrac * (cols - 1)) / cols;\n        const cellH = (1 - gapFrac * (gridRows - 1)) / gridRows;\n\n        // KPI cards are content-sized tiles, NOT full-canvas charts — stretching\n        // a single card to the whole requested canvas width (e.g. 480px) strands\n        // the caption + number in a sea of whitespace. Size each tile to a\n        // compact fixed footprint and let the grid grow with the tile COUNT\n        // instead of filling the canvas.\n        const TILE_W = 220;\n        const TILE_H = 150;\n        const figWidth = Math.round(cols * TILE_W + gapFrac * (cols - 1) * TILE_W);\n        const figHeight = Math.round(gridRows * TILE_H + gapFrac * (gridRows - 1) * TILE_H);\n        // Font sizes scale with each cell's actual pixel height so a dense\n        // grid of many tiles doesn't overflow its row with fixed-size text.\n        const captionFontPx = Math.max(10, Math.min(14, cellH * figHeight * 0.16));\n        const valueFontPx = Math.max(16, Math.min(30, cellH * figHeight * 0.32));\n        const goalFontPx = Math.max(9, Math.min(12, cellH * figHeight * 0.12));\n\n        const traces: any[] = [];\n        const annotations: any[] = [];\n        rows.forEach((row: any, i: number) => {\n            const col = i % cols;\n            const gridRow = Math.floor(i / cols);\n            const x0 = col * (cellW + gapFrac);\n            const y1 = 1 - gridRow * (cellH + gapFrac);\n            const y0 = y1 - cellH;\n            const rawValue = row[valueField];\n            const value = Number(rawValue);\n            const isNumeric = rawValue != null && rawValue !== '' && Number.isFinite(value);\n            const goal = goalField != null ? Number(row[goalField]) : undefined;\n            const hasGoal = goal != null && Number.isFinite(goal);\n            const caption = metricField ? String(row[metricField] ?? '') : valueField;\n\n            if (isNumeric) {\n                const indicator: any = {\n                    type: 'indicator',\n                    mode: hasGoal ? 'number+delta' : 'number',\n                    value,\n                    title: { text: caption, font: { size: captionFontPx } },\n                    number: { font: { size: valueFontPx } },\n                    domain: { x: [x0, x0 + cellW], y: [y0, y1] },\n                };\n                if (hasGoal) {\n                    indicator.delta = { reference: goal, relative: false, increasing: { color: '#2f855a' }, decreasing: { color: '#c44e52' } };\n                }\n                traces.push(indicator);\n            } else {\n                // Plotly's `indicator` trace requires a numeric `value` — it has\n                // no text-display mode. A pre-formatted display string (e.g.\n                // \"$1.2M\", a unit already baked in upstream) is rendered as a\n                // plain annotation pair instead, positioned at the same\n                // fractional domain the numeric tiles use (offsets scaled by\n                // this cell's own height) so every tile still lines up in the\n                // grid regardless of row count.\n                const cx = (x0 + x0 + cellW) / 2;\n                const cy = (y0 + y1) / 2;\n                annotations.push(\n                    { text: caption, x: cx, y: cy + cellH * 0.32, xref: 'paper', yref: 'paper', xanchor: 'center', yanchor: 'middle', showarrow: false, font: { size: captionFontPx, color: '#6b7280' } },\n                    { text: String(rawValue ?? ''), x: cx, y: cy - cellH * 0.06, xref: 'paper', yref: 'paper', xanchor: 'center', yanchor: 'middle', showarrow: false, font: { size: valueFontPx, color: '#111827' } },\n                    ...(hasGoal\n                        ? [{ text: `Goal: ${goal}`, x: cx, y: cy - cellH * 0.36, xref: 'paper' as const, yref: 'paper' as const, xanchor: 'center' as const, yanchor: 'middle' as const, showarrow: false, font: { size: goalFontPx, color: '#9ca3af' } }]\n                        : []),\n                );\n            }\n        });\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                annotations,\n                // Indicator traces suppress Plotly's default cartesian axes on\n                // their own; a card row with only text annotations (a\n                // pre-formatted string value) has no trace to do that, so the\n                // axes must be hidden explicitly or a stray 0–1 grid shows\n                // through behind the text.\n                xaxis: { visible: false },\n                yaxis: { visible: false },\n            },\n            _width: figWidth,\n            _height: figHeight,\n        });\n        delete spec.layer;\n    },\n    properties: [\n        {\n            key: 'layout', label: 'Layout', type: 'discrete',\n            options: [\n                { value: 'horizontal', label: 'Horizontal (default)' },\n                { value: 'vertical', label: 'Vertical' },\n                { value: 'grid', label: 'Grid' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Funnel Chart template — Plotly opportunity chart.\n *\n * Native `funnel` trace: Plotly draws the descending trapezoids, stage\n * labels, and percent-of-initial/-previous annotations itself. Matches the\n * ECharts-only `Funnel Chart` chart type (no Vega-Lite equivalent).\n *\n * Data model:\n *   y    (nominal): stage name\n *   size (quantitative): value for each stage (rows aggregated by sum)\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, getPlotlyPalette } from './utils';\n\nexport const plFunnelChartDef: ChartTemplateDef = {\n    chart: 'Funnel Chart',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['y', 'size'],\n    markCognitiveChannel: 'area',\n    declareLayoutMode: () => ({\n        axisFlags: { y: { banded: true } },\n        paramOverrides: { defaultBandSize: 50 },\n    }),\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const stageField = channelSemantics.y?.field;\n        const valField = channelSemantics.size?.field;\n        if (!stageField) return;\n\n        const stages = extractCategories(table, stageField, channelSemantics.y?.ordinalSortOrder);\n        if (stages.length === 0) return;\n\n        const values: number[] = [];\n        if (valField) {\n            const agg = new Map<string, number>();\n            for (const row of table) {\n                const s = String(row[stageField] ?? '');\n                agg.set(s, (agg.get(s) ?? 0) + (Number(row[valField]) || 0));\n            }\n            for (const s of stages) values.push(agg.get(s) ?? 0);\n        } else {\n            const counts = new Map<string, number>();\n            for (const row of table) {\n                const s = String(row[stageField] ?? '');\n                counts.set(s, (counts.get(s) ?? 0) + 1);\n            }\n            for (const s of stages) values.push(counts.get(s) ?? 0);\n        }\n\n        // Sort stages largest-first by default (a funnel reads top-down as a\n        // narrowing pipeline).\n        const sortOrder = chartProperties?.sort ?? 'descending';\n        const order = stages.map((_s, i) => i);\n        if (sortOrder === 'descending') order.sort((a, b) => values[b] - values[a]);\n        else if (sortOrder === 'ascending') order.sort((a, b) => values[a] - values[b]);\n        const sortedStages = order.map(i => stages[i]);\n        const sortedValues = order.map(i => values[i]);\n\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        Object.assign(spec, {\n            data: [{\n                type: 'funnel',\n                y: sortedStages,\n                x: sortedValues,\n                textinfo: 'value+percent initial',\n                marker: { color: palette.slice(0, sortedStages.length) },\n                connector: { line: { color: '#e5e7eb', width: 1 } },\n            }],\n            layout: { showlegend: false },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        {\n            key: 'sort', label: 'Sort', type: 'discrete', defaultValue: 'descending',\n            options: [\n                { value: 'descending', label: 'Descending (default)' },\n                { value: 'ascending', label: 'Ascending' },\n                { value: 'none', label: 'Original order' },\n            ],\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Gauge Chart template — Plotly opportunity chart.\n *\n * Native `indicator` trace with `mode: 'gauge+number'`: Plotly draws the\n * dial, needle, and colored range bands itself. Matches the ECharts-only\n * `Gauge Chart` chart type (no Vega-Lite equivalent) with a genuinely\n * native, purpose-built primitive (ECharts hand-computes dial geometry).\n *\n * Data model:\n *   size   (quantitative): the value to display\n *   column (nominal, optional): one gauge per distinct value (grid layout)\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { extractCategories, groupBy, getPlotlyPalette, getSeriesColor, niceMax } from './utils';\n\nexport const plGaugeChartDef: ChartTemplateDef = {\n    chart: 'Gauge Chart',\n    template: { mark: 'point', encoding: {} },\n    channels: ['size', 'column'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties } = ctx;\n        const valueField = channelSemantics.size?.field;\n        const columnField = channelSemantics.column?.field;\n        if (!valueField) return;\n\n        const allValues = table.map((r: any) => Number(r[valueField])).filter((v: number) => isFinite(v));\n        const dataMax = allValues.length > 0 ? Math.max(...allValues) : 100;\n        const scaleMin = Number(chartProperties?.min ?? 0);\n        const scaleMax = Number(chartProperties?.max ?? niceMax(dataMax));\n        const palette = getPlotlyPalette(ctx, 'color');\n\n        const items: { name: string; value: number }[] = [];\n        if (columnField) {\n            const categories = extractCategories(table, columnField, channelSemantics.column?.ordinalSortOrder);\n            const groups = groupBy(table, columnField);\n            for (const cat of categories) {\n                const vals = (groups.get(cat) ?? []).map((r: any) => Number(r[valueField])).filter((v: number) => isFinite(v));\n                items.push({ name: cat, value: vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 0 });\n            }\n        } else {\n            const avg = allValues.length ? allValues.reduce((a, b) => a + b, 0) / allValues.length : 0;\n            items.push({ name: valueField, value: avg });\n        }\n\n        const n = items.length;\n        const cols = Math.ceil(Math.sqrt(n));\n        const gridRows = Math.ceil(n / cols);\n        // A gauge's semicircular dial carries axis end-labels (\"0\"/\"max\") just\n        // beyond its left/right tips and a title above it. With a tiny gap the\n        // neighbouring dials' end-labels collide horizontally and a lower row's\n        // title crowds the row above. Reserve a generous gap on each axis —\n        // wider horizontally (end-labels) and taller vertically (title band).\n        const gapX = cols > 1 ? 0.14 : 0;\n        const gapY = gridRows > 1 ? 0.18 : 0;\n        const cellW = (1 - gapX * (cols - 1)) / cols;\n        const cellH = (1 - gapY * (gridRows - 1)) / gridRows;\n\n        const traces = items.map((item, i) => {\n            const col = i % cols;\n            const row = Math.floor(i / cols);\n            const x0 = col * (cellW + gapX);\n            const y1 = 1 - row * (cellH + gapY);\n            const y0 = y1 - cellH;\n            const color = getSeriesColor(palette, i);\n            return {\n                type: 'indicator',\n                mode: 'gauge+number',\n                value: Math.round(item.value * 100) / 100,\n                title: { text: item.name, font: { size: 13 } },\n                domain: { x: [x0, x0 + cellW], y: [y0, y1] },\n                gauge: {\n                    axis: { range: [scaleMin, scaleMax] },\n                    bar: { color },\n                    bgcolor: 'white',\n                    borderwidth: 1,\n                    bordercolor: '#d1d5db',\n                },\n            };\n        });\n\n        const canvas = ctx.canvasSize ?? { width: 400, height: 300 };\n        Object.assign(spec, {\n            data: traces,\n            layout: {},\n            _width: Math.max(canvas.width, cols * 240),\n            _height: Math.max(canvas.height, gridRows * 230),\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'min', label: 'Min', type: 'continuous', min: 0, max: 1000, step: 10, defaultValue: 0 } as ChartPropertyDef,\n        { key: 'max', label: 'Max', type: 'continuous', min: 0, max: 10000, step: 100, defaultValue: 100 } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Map (bubble) template.\n *\n * Native `scattergeo` trace + `layout.geo`: Plotly ships its own built-in\n * world/US basemap (land, country/state borders, oceans) so — unlike the\n * Vega-Lite template, which layers a `geoshape` TopoJSON base under a\n * `circle` mark — no external topology needs to be fetched or joined.\n *\n * Data contract (unchanged from Vega-Lite): `longitude`/`latitude` place each\n * point; `size`/`color` optionally scale/hue it. Scope (US vs World) is\n * decided the same way as the Vega-Lite Map — `region` property, else infer\n * from whether every point falls inside the US bounding box\n * (`chart-types/geo.ts`, shared by both backends so the same dataset picks\n * the same base map regardless of backend).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, OptionEvalContext } from '../../core/types';\nimport { inferBubbleScope, pickMapScope } from '../../chart-types/geo';\nimport { getPlotlyPalette, getSeriesColor, groupBy } from './utils';\n\n// ---------------------------------------------------------------------------\n// Projection mapping (Vega-Lite d3 projection name → Plotly geo projection type)\n// ---------------------------------------------------------------------------\n\nconst mapProjections = [\n    { value: 'mercator', label: 'Mercator' },\n    { value: 'equalEarth', label: 'Equal Earth' },\n    { value: 'orthographic', label: 'Orthographic (Globe)' },\n    { value: 'stereographic', label: 'Stereographic' },\n    { value: 'conicEqualArea', label: 'Conic Equal Area' },\n    { value: 'conicEquidistant', label: 'Conic Equidistant' },\n    { value: 'azimuthalEquidistant', label: 'Azimuthal Equidistant' },\n    { value: 'mollweide', label: 'Mollweide' },\n] as const;\n\n// Plotly has no exact \"Equal Earth\" projection; \"natural earth\" is the\n// closest available compromise pseudo-cylindrical projection.\nconst PROJECTION_TYPE_MAP: Record<string, string> = {\n    mercator: 'mercator',\n    equalEarth: 'natural earth',\n    orthographic: 'orthographic',\n    stereographic: 'stereographic',\n    conicEqualArea: 'conic equal area',\n    conicEquidistant: 'conic equidistant',\n    azimuthalEquidistant: 'azimuthal equidistant',\n    mollweide: 'mollweide',\n};\n\nfunction plotlyProjectionType(vlProjection: unknown): string {\n    if (typeof vlProjection === 'string' && PROJECTION_TYPE_MAP[vlProjection]) {\n        return PROJECTION_TYPE_MAP[vlProjection];\n    }\n    return 'natural earth'; // default world projection (mirrors VL's equalEarth default)\n}\n\nconst projectionCenterPresets: { label: string; center: [number, number] }[] = [\n    { label: 'World (Atlantic)', center: [0, 0] },\n    { label: 'World (Pacific)', center: [150, 0] },\n    { label: 'China', center: [105, 35] },\n    { label: 'USA', center: [-98, 39] },\n    { label: 'Europe', center: [10, 50] },\n    { label: 'Japan', center: [138, 36] },\n    { label: 'India', center: [78, 22] },\n    { label: 'Brazil', center: [-52, -14] },\n    { label: 'Australia', center: [134, -25] },\n    { label: 'Russia', center: [100, 60] },\n    { label: 'Africa', center: [20, 0] },\n    { label: 'Middle East', center: [45, 28] },\n    { label: 'Southeast Asia', center: [115, 5] },\n    { label: 'South America', center: [-60, -15] },\n    { label: 'North America', center: [-100, 45] },\n    { label: 'UK', center: [-2, 54] },\n    { label: 'Germany', center: [10, 51] },\n    { label: 'France', center: [2, 47] },\n    { label: 'Korea', center: [128, 36] },\n];\n\n/** Would this spec render as a world map? (Drives world-only property gating.) */\nfunction wouldBeWorld(ctx: OptionEvalContext): boolean {\n    const choice = ctx.chartProperties?.region;\n    if (choice === 'us') return false;\n    if (choice === 'world') return true;\n    const rows = ctx.data ?? [];\n    const lonField = ctx.encodings?.longitude?.field;\n    const latField = ctx.encodings?.latitude?.field;\n    return inferBubbleScope(rows, lonField, latField) === 'world';\n}\n\nconst regionProperty: ChartPropertyDef = {\n    key: 'region',\n    label: 'Region',\n    type: 'discrete',\n    options: [\n        { value: 'auto', label: 'Auto-detect' },\n        { value: 'us', label: 'United States' },\n        { value: 'world', label: 'World' },\n    ],\n    defaultValue: 'auto',\n};\n\nconst projectionProperty: ChartPropertyDef = {\n    key: 'projection',\n    label: 'Projection',\n    type: 'discrete',\n    options: [\n        { value: 'default', label: 'Default' },\n        ...mapProjections.map(p => ({ value: p.value, label: p.label })),\n    ],\n    defaultValue: 'default',\n    check: (ctx) => ({ applicable: wouldBeWorld(ctx) }),\n};\n\nconst projectionCenterProperty: ChartPropertyDef = {\n    key: 'projectionCenter',\n    label: 'Center',\n    type: 'discrete',\n    options: [\n        { value: undefined, label: 'Default' },\n        ...projectionCenterPresets.map(p => ({\n            value: p.center,\n            label: `${p.label} [${p.center[0]}, ${p.center[1]}]`,\n        })),\n    ],\n    defaultValue: undefined,\n    check: (ctx) => ({ applicable: wouldBeWorld(ctx) }),\n};\n\n/** Configure `layout.geo` for the chosen scope + (world-only) projection/center. */\nfunction buildGeoLayout(scope: 'us' | 'world', chartProperties: any): any {\n    if (scope === 'us') {\n        return {\n            scope: 'usa',\n            projection: { type: 'albers usa' },\n            showland: true, landcolor: '#eef0f2',\n            showlakes: true, lakecolor: '#ffffff',\n            subunitcolor: '#ffffff',\n            countrycolor: '#ffffff',\n        };\n    }\n    const geo: any = {\n        scope: 'world',\n        projection: { type: plotlyProjectionType(chartProperties?.projection) },\n        showland: true, landcolor: '#eef0f2',\n        showocean: true, oceancolor: '#ffffff',\n        showcountries: true, countrycolor: '#c7ccd1',\n        showcoastlines: false,\n    };\n    const center = chartProperties?.projectionCenter;\n    if (Array.isArray(center) && center.length === 2) {\n        geo.projection.rotation = { lon: -Number(center[0]), lat: -Number(center[1]) };\n    }\n    return geo;\n}\n\n/** Sqrt (area-truth) scale from data values to marker pixel diameters. */\nfunction bubbleDiameters(values: number[], minPx = 6, maxPx = 34): number[] {\n    const finite = values.filter(v => Number.isFinite(v));\n    const lo = finite.length ? Math.min(...finite, 0) : 0;\n    const hi = finite.length ? Math.max(...finite) : 1;\n    const sLo = Math.sqrt(Math.max(0, lo));\n    const sHi = Math.sqrt(Math.max(sLo + 1e-9, hi));\n    return values.map(v => {\n        if (!Number.isFinite(v)) return minPx;\n        const s = Math.sqrt(Math.max(0, v));\n        const t = (s - sLo) / (sHi - sLo || 1);\n        return minPx + t * (maxPx - minPx);\n    });\n}\n\nexport const plMapDef: ChartTemplateDef = {\n    chart: 'Map',\n    template: { mark: 'circle', encoding: {} },\n    channels: ['longitude', 'latitude', 'color', 'size', 'opacity'],\n    markCognitiveChannel: 'position',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, chartProperties, colorDecisions } = ctx;\n        const lonField = channelSemantics.longitude?.field;\n        const latField = channelSemantics.latitude?.field;\n        const sizeField = channelSemantics.size?.field;\n        const colorField = channelSemantics.color?.field;\n        const colorType = channelSemantics.color?.type;\n        if (!lonField || !latField) return;\n\n        const rows = (ctx.fullTable ?? ctx.table ?? []).filter((r: any) =>\n            Number.isFinite(Number(r[lonField])) && Number.isFinite(Number(r[latField])));\n        if (rows.length === 0) return;\n\n        const scope = pickMapScope(chartProperties, undefined, () => inferBubbleScope(rows, lonField, latField));\n        const geo = buildGeoLayout(scope, chartProperties);\n\n        const isContinuousColor = !!colorField && (colorType === 'quantitative' || colorType === 'temporal');\n        const sizeValues = sizeField ? rows.map((r: any) => Number(r[sizeField])) : undefined;\n        const diameters = sizeValues ? bubbleDiameters(sizeValues) : rows.map(() => 10);\n\n        const opacity = 0.85;\n        const traces: any[] = [];\n\n        if (isContinuousColor && colorField) {\n            const toColorVal = colorType === 'temporal'\n                ? (v: any) => (v != null ? new Date(v).getTime() : NaN)\n                : (v: any) => (v != null ? Number(v) : NaN);\n            const colorVals = rows.map((r: any) => toColorVal(r[colorField])).filter((v: number) => !isNaN(v));\n            const cmin = colorVals.length ? Math.min(...colorVals) : 0;\n            const cmax = colorVals.length ? Math.max(...colorVals) : 1;\n            const decision = colorDecisions?.color ?? colorDecisions?.group;\n            const diverging = decision?.schemeType === 'diverging';\n            traces.push({\n                type: 'scattergeo',\n                mode: 'markers',\n                name: colorField,\n                lon: rows.map((r: any) => Number(r[lonField])),\n                lat: rows.map((r: any) => Number(r[latField])),\n                marker: {\n                    size: diameters,\n                    color: rows.map((r: any) => toColorVal(r[colorField])),\n                    colorscale: diverging ? 'RdBu' : 'Viridis',\n                    cmin, cmax,\n                    showscale: true,\n                    colorbar: { title: { text: colorField } },\n                    opacity,\n                    line: { color: '#ffffff', width: 0.5 },\n                },\n                hovertemplate: `Lon: %{lon}<br>Lat: %{lat}<br>${colorField}: %{marker.color}`\n                    + (sizeField ? `<br>${sizeField}: %{customdata}` : '') + '<extra></extra>',\n                customdata: sizeField ? sizeValues : undefined,\n            });\n        } else if (colorField) {\n            // Nominal/ordinal color: one trace per group (legend by group name).\n            // Bubble diameters come from the SAME global sqrt scale computed\n            // above (over every row) so sizes stay comparable across groups —\n            // index into `diameters` by each row's position in `rows`.\n            const palette = getPlotlyPalette(ctx, 'color');\n            const idxByRow = new Map(rows.map((r: any, idx: number) => [r, idx]));\n            let i = 0;\n            for (const [name, groupRows] of groupBy(rows, colorField)) {\n                const groupSizes = sizeField ? groupRows.map((r: any) => Number(r[sizeField])) : undefined;\n                const sizesForGroup = groupRows.map((r: any) => diameters[idxByRow.get(r) ?? 0]);\n                traces.push({\n                    type: 'scattergeo',\n                    mode: 'markers',\n                    name,\n                    lon: groupRows.map((r: any) => Number(r[lonField])),\n                    lat: groupRows.map((r: any) => Number(r[latField])),\n                    marker: {\n                        size: sizesForGroup,\n                        color: getSeriesColor(palette, i),\n                        opacity,\n                        line: { color: '#ffffff', width: 0.5 },\n                    },\n                    hovertemplate: `Lon: %{lon}<br>Lat: %{lat}<br>${colorField}: ${name}`\n                        + (sizeField ? `<br>${sizeField}: %{customdata}` : '') + '<extra></extra>',\n                    customdata: groupSizes,\n                });\n                i++;\n            }\n        } else {\n            traces.push({\n                type: 'scattergeo',\n                mode: 'markers',\n                showlegend: false,\n                lon: rows.map((r: any) => Number(r[lonField])),\n                lat: rows.map((r: any) => Number(r[latField])),\n                marker: {\n                    size: diameters,\n                    color: getSeriesColor(getPlotlyPalette(ctx, 'color'), 0),\n                    opacity,\n                    line: { color: '#ffffff', width: 0.5 },\n                },\n                hovertemplate: 'Lon: %{lon}<br>Lat: %{lat}'\n                    + (sizeField ? `<br>${sizeField}: %{customdata}` : '') + '<extra></extra>',\n                customdata: sizeValues,\n            });\n        }\n\n        const width = scope === 'us' ? 520 : 620;\n        const height = scope === 'us' ? 320 : 360;\n\n        Object.assign(spec, {\n            data: traces,\n            layout: {\n                geo,\n                showlegend: !!colorField && !isContinuousColor,\n                margin: { t: 24, b: 24, l: 8, r: 8 },\n            },\n            _width: width + (colorField ? 120 : 0),\n            _height: height,\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [regionProperty, projectionProperty, projectionCenterProperty],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Choropleth template.\n *\n * Native `choropleth` trace: Plotly resolves `locations` through its own\n * built-in atlas (US states / world countries) keyed by a short code\n * (`locationmode`), so — unlike the Vega-Lite template, which joins the\n * user's rows into a fetched TopoJSON via a `lookup` transform — no external\n * geometry needs to be fetched or joined here.\n *\n * Data contract (unchanged from Vega-Lite): `id` carries the region name/\n * code, `color` the measure, optional `detail` a display label. Values are\n * resolved through the SAME gazetteer as the Vega-Lite choropleth\n * (`chart-types/geo.ts`) — just to a USPS/ISO-3 code instead of a numeric\n * TopoJSON feature id — so a dataset that renders as a US or World map on\n * one backend renders the same way on the other.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport {\n    resolveUsStateCode, resolveCountryCode, GeoCodeResolver,\n    inferChoroplethScope, semanticScope, pickMapScope,\n} from '../../chart-types/geo';\nimport { toTypeString } from '../../core/field-semantics';\n\n// Plotly's own built-in named `'Blues'` colorscale runs dark→light as the\n// value increases (z=0 → \"rgb(5,10,172)\" dark blue, z=1 → \"rgb(220,220,220)\"\n// light gray) — the OPPOSITE of the light→dark sequential convention used\n// everywhere else in this codebase (and by every other backend's default\n// choropleth/heatmap ramp). For a choropleth that's actively misleading (the\n// highest-value region reads as the *palest*), so this template uses an\n// explicit ColorBrewer-style light→dark stop array instead of the `'Blues'`\n// string. Plotly's stock `'RdBu'` (used for the diverging case below) is NOT\n// affected — its low→mid→high stops already run blue→gray→red, matching the\n// diverging convention — so it's used as-is.\nconst SEQUENTIAL_BLUES: Array<[number, string]> = [\n    [0, '#eff3ff'], [0.25, '#bdd7e7'], [0.5, '#6baed6'], [0.75, '#3182bd'], [1, '#08519c'],\n];\n\nconst regionProperty: ChartPropertyDef = {\n    key: 'region',\n    label: 'Region',\n    type: 'discrete',\n    options: [\n        { value: 'auto', label: 'Auto-detect' },\n        { value: 'us', label: 'United States' },\n        { value: 'world', label: 'World' },\n    ],\n    defaultValue: 'auto',\n};\n\n/** Configure `layout.geo` for the chosen scope (no projection controls — mirrors the VL Choropleth). */\nfunction buildGeoLayout(scope: 'us' | 'world'): any {\n    if (scope === 'us') {\n        return {\n            scope: 'usa',\n            projection: { type: 'albers usa' },\n            showlakes: true, lakecolor: '#ffffff',\n        };\n    }\n    return {\n        scope: 'world',\n        projection: { type: 'natural earth' },\n        showframe: false,\n        showcoastlines: false,\n        showcountries: false, // borders drawn by the choropleth fill itself\n    };\n}\n\nexport const plChoroplethDef: ChartTemplateDef = {\n    chart: 'Choropleth',\n    template: { mark: 'geoshape', encoding: {} },\n    channels: ['id', 'color', 'detail'],\n    markCognitiveChannel: 'color',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, chartProperties, colorDecisions } = ctx;\n        const idField = channelSemantics.id?.field;\n        const colorField = channelSemantics.color?.field;\n        const labelField = channelSemantics.detail?.field ?? idField;\n        if (!idField) return;\n\n        const rows = ctx.fullTable ?? ctx.table ?? [];\n        const semType = toTypeString(ctx.semanticTypes?.[idField]);\n        const semScope = semanticScope(semType);\n        const scope = pickMapScope(chartProperties, semScope, () => inferChoroplethScope(rows, idField));\n        const codeResolver: GeoCodeResolver = scope === 'us' ? resolveUsStateCode : resolveCountryCode;\n        const locationmode = scope === 'us' ? 'USA-states' : 'ISO-3';\n\n        const locations: string[] = [];\n        const z: number[] = [];\n        const labels: string[] = [];\n        for (const r of rows) {\n            const code = codeResolver(r[idField]);\n            if (!code) continue;\n            const raw = colorField ? Number(r[colorField]) : undefined;\n            if (colorField && !Number.isFinite(raw)) continue;\n            locations.push(code);\n            z.push(colorField ? (raw as number) : 1);\n            labels.push(labelField ? String(r[labelField] ?? r[idField]) : String(r[idField]));\n        }\n        if (locations.length === 0) return;\n\n        const decision = colorDecisions?.color ?? colorDecisions?.group;\n        const diverging = decision?.schemeType === 'diverging';\n\n        const geo = buildGeoLayout(scope);\n        const valueLabel = colorField ?? 'Value';\n\n        Object.assign(spec, {\n            data: [{\n                type: 'choropleth',\n                locations,\n                locationmode,\n                z,\n                text: labels,\n                colorscale: diverging ? 'RdBu' : SEQUENTIAL_BLUES,\n                colorbar: { title: { text: valueLabel } },\n                marker: { line: { color: '#ffffff', width: 0.5 } },\n                hovertemplate: `%{text}<br>${valueLabel}: %{z}<extra></extra>`,\n            }],\n            layout: {\n                geo,\n                showlegend: false,\n                margin: { t: 24, b: 24, l: 8, r: 8 },\n            },\n            _width: scope === 'us' ? 520 : 620,\n            _height: scope === 'us' ? 320 : 360,\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [regionProperty],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Sparkline template.\n *\n * A compact \"sparkline table\" — one row per series: its name, a small trend\n * line with a dashed reference rule, and an aggregate value — mirroring the\n * Vega-Lite Sparkline's visual pattern (Tufte's \"dataword\": drop the precise\n * scale, keep shape-at-a-glance so dozens of series fit in one Line Chart's\n * footprint).\n *\n * Composite layout, built directly on the Plotly figure rather than forced\n * through the generic column/row facet combiner (`../facet.ts`, which only\n * supports one cartesian axis pair per panel): each row gets its OWN hidden\n * axis pair (`xaxis{n}`/`yaxis{n}`) domain-positioned as a horizontal strip,\n * hosting the trend line + reference-rule traces; the category name and\n * aggregate value are `layout.annotations` in paper coordinates alongside it\n * — the same domain-grid + annotation technique `kpi-card.ts` uses for its\n * own per-tile grid. `selfManagesFacets` keeps the assembler from pre-\n * splitting this template by `column`/`row` (see `../assemble.ts`).\n *\n * The series field is the bound `color` (kept as the trend/value hue) or,\n * failing that, `detail` (monochrome) — same remap rule as the Vega-Lite\n * template's `normalizeEncodings`, applied here directly inside `instantiate`\n * since Plotly doesn't yet wire that hook (see `ChartTemplateDef.normalizeEncodings`).\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { getPlotlyPalette, getSeriesColor } from './utils';\n\nconst DEFAULT_TREND_W = 240;\n\nconst baselineProperty: ChartPropertyDef = {\n    key: 'baseline', label: 'Reference line', type: 'discrete',\n    defaultValue: 'mean',\n    options: [\n        { value: 'mean', label: 'Average' },\n        { value: 'zero', label: 'Zero' },\n        { value: 'median', label: 'Median' },\n        { value: 'none', label: 'None' },\n    ],\n};\n\nconst trendWidthProperty: ChartPropertyDef = {\n    key: 'trendWidth', label: 'Sparkline width', type: 'continuous',\n    min: 80, max: 600, step: 10, defaultValue: DEFAULT_TREND_W,\n};\n\nconst isCJK = (ch: string): boolean =>\n    /[\\u3000-\\u303F\\u3400-\\u9FFF\\uF900-\\uFAFF\\uFF00-\\uFFEF]/.test(ch);\nconst textWidth = (s: unknown): number =>\n    [...String(s ?? '')].reduce((a, ch) => a + (isCJK(ch) ? 2 : 1), 0);\nconst mean = (a: number[]): number => (a.length ? a.reduce((s, x) => s + x, 0) / a.length : NaN);\nconst median = (a: number[]): number => {\n    if (!a.length) return NaN;\n    const s = [...a].sort((x, y) => x - y);\n    const n = s.length;\n    return n % 2 ? s[(n - 1) / 2] : (s[n / 2 - 1] + s[n / 2]) / 2;\n};\n/** Compact \"$1.2M\"-style approximation — the display value AND the width budget. */\nfunction approxNum(v: number): string {\n    if (!Number.isFinite(v)) return '';\n    const a = Math.abs(v);\n    if (a >= 1e9) return (v / 1e9).toFixed(1) + 'B';\n    if (a >= 1e6) return (v / 1e6).toFixed(1) + 'M';\n    if (a >= 1e3) return (v / 1e3).toFixed(1) + 'k';\n    return String(Math.round(v * 10) / 10);\n}\n\nexport const plSparklineDef: ChartTemplateDef = {\n    chart: 'Sparkline',\n    template: { mark: 'line', encoding: {} },\n    channels: ['x', 'y', 'color', 'detail'],\n    markCognitiveChannel: 'position',\n    // See file docstring — a hand-built multi-axis-pair grid, not a single\n    // cartesian panel the generic facet combiner could safely split/recombine.\n    selfManagesFacets: true,\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, chartProperties, canvasSize } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        const hasColor = !!channelSemantics.color?.field;\n        const seriesField = channelSemantics.color?.field ?? channelSemantics.detail?.field;\n        if (!xField || !yField) return;\n\n        const baseline = (chartProperties?.baseline as string) ?? 'mean';\n        const useMedian = baseline === 'median';\n\n        const table = (ctx.fullTable ?? ctx.table ?? []) as Array<Record<string, any>>;\n        const facetField = seriesField ?? '__pl_spark_series';\n        const rows = seriesField ? table : table.map(r => ({ ...r, [facetField]: '' }));\n\n        // Row order = first appearance, stable.\n        const series: any[] = [];\n        const seen = new Set<any>();\n        for (const r of rows) {\n            const v = r[facetField];\n            if (!seen.has(v)) { seen.add(v); series.push(v); }\n        }\n        if (series.length === 0) return;\n\n        const bySeries = new Map<any, Array<Record<string, any>>>();\n        for (const r of rows) {\n            const k = r[facetField];\n            const arr = bySeries.get(k);\n            if (arr) arr.push(r); else bySeries.set(k, [r]);\n        }\n\n        const aggOf = (vals: number[]) => useMedian ? median(vals) : mean(vals);\n\n        const categoryTitle = String(seriesField ?? '');\n        const trendTitle = String(yField ?? '');\n        const avgTitle = useMedian ? 'Median' : 'Average';\n\n        // ── Sizing (manual — mirrors the Vega-Lite template's hand-rolled\n        // hconcat sizing; the shared layout engine's faceted sizing doesn't\n        // apply to a hand-built multi-axis grid). ─────────────────────────\n        const canvas = canvasSize ?? { width: 480, height: 320 };\n        const N = series.length;\n        const HEADER_H = 20;\n        const STRIP_GAP = 6;\n        const INTER_GAP = 10;\n        const CHAR_PX = 6.6;\n        const fontSize = N > 12 ? 10 : 11;\n        const stripH = Math.min(64, Math.max(16,\n            Math.floor((canvas.height - HEADER_H - (N - 1) * STRIP_GAP) / N)));\n\n        const seriesAgg = new Map<any, number>();\n        for (const s of series) {\n            const vals = (bySeries.get(s) ?? [])\n                .map(r => Number(r[yField])).filter(v => Number.isFinite(v));\n            seriesAgg.set(s, aggOf(vals));\n        }\n\n        const maxCatChars = Math.max(textWidth(categoryTitle), 4, ...series.map(s => textWidth(s)));\n        const maxAvgChars = Math.max(textWidth(avgTitle), 4,\n            ...Array.from(seriesAgg.values()).map(v => textWidth(approxNum(v))));\n        const catW = Math.min(200, Math.max(40, Math.round(maxCatChars * CHAR_PX) + 10));\n        const avgW = Math.min(96, Math.max(34, Math.round(maxAvgChars * CHAR_PX) + 8));\n        const avail = canvas.width - catW - avgW - 2 * INTER_GAP;\n        const tunedTrendW = Number(chartProperties?.trendWidth) || DEFAULT_TREND_W;\n        const trendW = Math.max(90, Math.min(tunedTrendW, avail));\n\n        const totalW = catW + INTER_GAP + trendW + INTER_GAP + avgW;\n        const totalH = HEADER_H + N * stripH + (N - 1) * STRIP_GAP;\n\n        const palette = getPlotlyPalette(ctx, 'color');\n        const seriesColorIdx = new Map(series.map((s, i) => [s, i]));\n\n        const traces: any[] = [];\n        const annotations: any[] = [];\n        const layout: any = { showlegend: false, margin: { t: 4, b: 4, l: 4, r: 4 } };\n\n        // Column headers. Anchored `yanchor: 'top'` at paper y=1 so the text\n        // renders DOWNWARD into the reserved `HEADER_H` band at the very top\n        // of the figure — an `yanchor: 'bottom'` anchor at y=1 needs headroom\n        // ABOVE the plot area (the figure's own top margin), which is too\n        // thin here to avoid clipping the label against the image edge.\n        const headerStyle = { size: 11, color: '#999' };\n        annotations.push(\n            { text: categoryTitle, x: 0, y: 1, xref: 'paper', yref: 'paper', xanchor: 'left', yanchor: 'top', showarrow: false, font: headerStyle },\n            { text: trendTitle, x: (catW + INTER_GAP + trendW / 2) / totalW, y: 1, xref: 'paper', yref: 'paper', xanchor: 'center', yanchor: 'top', showarrow: false, font: headerStyle },\n            { text: avgTitle, x: 1, y: 1, xref: 'paper', yref: 'paper', xanchor: 'right', yanchor: 'top', showarrow: false, font: headerStyle },\n        );\n\n        series.forEach((s, i) => {\n            const seriesRows = (bySeries.get(s) ?? [])\n                .map(r => ({ x: r[xField], y: Number(r[yField]) }))\n                .filter(p => p.y != null && Number.isFinite(p.y));\n            const yVals = seriesRows.map(p => p.y);\n            const agg = seriesAgg.get(s);\n\n            const rowTop = HEADER_H + i * (stripH + STRIP_GAP);\n            const rowMidYFrac = 1 - (rowTop + stripH / 2) / totalH;\n\n            annotations.push(\n                { text: String(s), x: 0, y: rowMidYFrac, xref: 'paper', yref: 'paper', xanchor: 'left', yanchor: 'middle', showarrow: false, font: { size: fontSize, color: '#333' } },\n                {\n                    text: Number.isFinite(agg) ? approxNum(agg as number) : '',\n                    x: 1, y: rowMidYFrac, xref: 'paper', yref: 'paper', xanchor: 'right', yanchor: 'middle', showarrow: false,\n                    font: { size: fontSize, color: hasColor ? getSeriesColor(palette, seriesColorIdx.get(s) ?? 0) : '#333' },\n                },\n            );\n\n            if (yVals.length === 0) return;\n\n            const n = i + 1;\n            const xName = n === 1 ? 'xaxis' : `xaxis${n}`;\n            const yName = n === 1 ? 'yaxis' : `yaxis${n}`;\n            const xRef = n === 1 ? 'x' : `x${n}`;\n            const yRef = n === 1 ? 'y' : `y${n}`;\n\n            const x0 = (catW + INTER_GAP) / totalW;\n            const x1 = (catW + INTER_GAP + trendW) / totalW;\n            const y1 = 1 - rowTop / totalH;\n            const y0 = 1 - (rowTop + stripH) / totalH;\n            layout[xName] = { domain: [x0, x1], anchor: yRef, visible: false, showgrid: false, zeroline: false };\n            layout[yName] = { domain: [y0, y1], anchor: xRef, visible: false, showgrid: false, zeroline: false };\n\n            traces.push({\n                type: 'scatter', mode: 'lines',\n                xaxis: xRef, yaxis: yRef,\n                x: seriesRows.map(p => p.x), y: yVals,\n                line: { width: 1.5, color: hasColor ? getSeriesColor(palette, i) : '#555' },\n                hoverinfo: 'x+y',\n                showlegend: false,\n            });\n\n            if (baseline !== 'none') {\n                const refY = baseline === 'zero' ? 0 : (Number.isFinite(agg) ? agg : undefined);\n                if (refY != null) {\n                    traces.push({\n                        type: 'scatter', mode: 'lines',\n                        xaxis: xRef, yaxis: yRef,\n                        x: [seriesRows[0].x, seriesRows[seriesRows.length - 1].x],\n                        y: [refY, refY],\n                        line: { width: 1, color: '#9a9a9a', dash: 'dot' },\n                        hoverinfo: 'skip',\n                        showlegend: false,\n                    });\n                }\n            }\n        });\n\n        Object.assign(spec, {\n            data: traces,\n            layout: { ...layout, annotations },\n            _width: Math.round(totalW),\n            _height: Math.round(totalH),\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [baselineProperty, trendWidthProperty],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Bar Table template.\n *\n * A ranked horizontal \"data bar table\" (category | gradient bar | % share |\n * value), matching the Vega-Lite Bar Table's visual pattern — common in\n * Chinese BI dashboards (FineBI, Quick BI) and Excel/Power BI conditional-\n * formatting \"Data Bars\".\n *\n * Composite layout, built directly on the Plotly figure rather than forced\n * through the generic column/row facet combiner (`../facet.ts`, which only\n * supports one cartesian axis pair per panel): each facet cell (or the whole\n * table, when unfaceted) gets its own hidden-margin axis pair whose `xaxis`\n * domain is narrowed to just the bar column; the category name comes for\n * free from the axis's own (native) y tick labels, and the %/value columns\n * are `layout.annotations` anchored to that SAME y-axis (so they line up\n * with each bar's row) at a fixed paper-x position — the same domain-grid +\n * mixed paper/data-axis annotation technique `sparkline.ts` and `kpi-card.ts`\n * use for their own composite grids. `selfManagesFacets` keeps the assembler\n * from pre-splitting this template by `column`/`row` (see `../assemble.ts`);\n * facets are instead built as additional cells in the same hand-rolled grid.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef } from '../../core/types';\nimport { getRegistryEntry } from '../../core/type-registry';\n\nconst HEADER_H = 16;\nconst FACET_HEADER_H = 20;\nconst INTER_GAP = 8;\nconst CELL_GAP_X = 28;\nconst CELL_GAP_Y = 20;\nconst OTHERS_GRAY = '#bdbdbd';\n\nconst isCJK = (ch: string): boolean =>\n    /[\\u3000-\\u303F\\u3400-\\u9FFF\\uF900-\\uFAFF\\uFF00-\\uFFEF]/.test(ch);\nconst textWidth = (s: unknown): number =>\n    [...String(s ?? '')].reduce((a, ch) => a + (isCJK(ch) ? 2 : 1), 0);\n\n/**\n * Truncate to an ellipsis so the text fits within `maxUnits` character-width\n * units (see `textWidth` — a CJK character counts as 2). Mirrors the effect\n * of the Vega-Lite template's `axis.labelLimit`, which Plotly's category axis\n * has no equivalent for — an over-length native tick label would otherwise\n * overflow past the figure's own left edge instead of ellipsizing.\n */\nfunction truncateToWidth(s: string, maxUnits: number): string {\n    if (textWidth(s) <= maxUnits) return s;\n    const chars = [...s];\n    let out = '';\n    let w = 1; // reserve 1 unit for the ellipsis\n    for (const ch of chars) {\n        const cw = isCJK(ch) ? 2 : 1;\n        if (w + cw > maxUnits) break;\n        out += ch;\n        w += cw;\n    }\n    return out.replace(/\\s+$/, '') + '…';\n}\n\n/** Compact approximate number format — mirrors the Vega-Lite template's sizing/display helper. */\nfunction approxFormat(v: number, pctPattern?: string): string {\n    if (!Number.isFinite(v)) return '';\n    if (pctPattern) return `${(v * 100).toFixed(1)}%`;\n    const a = Math.abs(v);\n    if (a >= 1e9) return (v / 1e9).toFixed(1) + 'B';\n    if (a >= 1e6) return (v / 1e6).toFixed(1) + 'M';\n    if (a >= 1e3) return (v / 1e3).toFixed(1) + 'K';\n    if (Number.isInteger(v)) return String(v);\n    if (a > 0 && a < 1) {\n        // Adaptive precision for sub-1 magnitudes — a fixed 2-decimal round\n        // (e.g. toward \"0.00\") would silently collapse a genuinely tiny but\n        // meaningful value (0.0004) down to \"0\". Show enough significant\n        // digits to keep the value distinguishable from zero.\n        const decimals = Math.min(6, Math.max(2, -Math.floor(Math.log10(a)) + 1));\n        return v.toFixed(decimals).replace(/0+$/, '').replace(/\\.$/, '');\n    }\n    return (Math.round(v * 100) / 100).toLocaleString('en-US');\n}\n\n/** Linear interpolation between two hex colors (sequential gradient-by-value). */\nfunction lerpHex(c0: string, c1: string, t: number): string {\n    const hex = (h: string) => {\n        const m = /^#?([0-9a-f]{6})$/i.exec(h.trim());\n        const v = m ? parseInt(m[1], 16) : 0;\n        return [(v >> 16) & 255, (v >> 8) & 255, v & 255];\n    };\n    const [r0, g0, b0] = hex(c0);\n    const [r1, g1, b1] = hex(c1);\n    const clamp = Math.max(0, Math.min(1, t));\n    const r = Math.round(r0 + (r1 - r0) * clamp);\n    const g = Math.round(g0 + (g1 - g0) * clamp);\n    const b = Math.round(b0 + (b1 - b0) * clamp);\n    return `rgb(${r}, ${g}, ${b})`;\n}\nconst SEQ_LOW = '#cdebd3', SEQ_HIGH = '#41a25f';\nconst DIV_LOW = '#c0392b', DIV_MID = '#f2f2f2', DIV_HIGH = '#2e7d46';\n\n/** One aggregated row: category, its ranked value, and (optional) per-color-group breakdown. */\ninterface AggRow {\n    cat: string;\n    value: number;\n    isOthers: boolean;\n    byColor?: Map<string, number>;\n}\n\n/** Aggregate raw rows into ranked-and-topN'd category rows for one facet scope. */\nfunction buildScopeRows(\n    rows: any[], yField: string, xField: string, colorField: string | undefined,\n    useMean: boolean, maxRows: number, reversed: boolean,\n): AggRow[] {\n    const byCat = new Map<string, { sum: number; n: number; byColor: Map<string, number> }>();\n    for (const r of rows) {\n        const v = Number(r[xField]);\n        if (!Number.isFinite(v)) continue;\n        const cat = String(r[yField] ?? '');\n        const g = byCat.get(cat) ?? { sum: 0, n: 0, byColor: new Map() };\n        g.sum += v; g.n += 1;\n        if (colorField) {\n            const cv = String(r[colorField] ?? '');\n            g.byColor.set(cv, (g.byColor.get(cv) ?? 0) + v);\n        }\n        byCat.set(cat, g);\n    }\n    const agg = (g: { sum: number; n: number }) => useMean ? g.sum / Math.max(1, g.n) : g.sum;\n    const ranked = Array.from(byCat.entries())\n        .map(([cat, g]) => ({ cat, value: agg(g), byColor: colorField ? g.byColor : undefined }))\n        .sort((a, b) => reversed ? a.value - b.value : b.value - a.value);\n\n    if (maxRows <= 0 || ranked.length <= maxRows) {\n        return ranked.map(r => ({ ...r, isOthers: false }));\n    }\n    const keepN = Math.max(1, maxRows - 1);\n    const kept = ranked.slice(0, keepN).map(r => ({ ...r, isOthers: false }));\n    const rest = ranked.slice(keepN);\n    const restSum = rest.reduce((s, r) => s + r.value, 0);\n    const restValue = useMean && rest.length > 0 ? restSum / rest.length : restSum;\n    const restByColor = new Map<string, number>();\n    if (colorField) {\n        for (const r of rest) {\n            for (const [cv, v] of (r.byColor ?? new Map())) {\n                restByColor.set(cv, (restByColor.get(cv) ?? 0) + v);\n            }\n        }\n    }\n    kept.push({\n        cat: `Others (+${rest.length})`, value: restValue, isOthers: true,\n        byColor: colorField ? restByColor : undefined,\n    });\n    return kept;\n}\n\nexport const plBarTableDef: ChartTemplateDef = {\n    chart: 'Bar Table',\n    template: { mark: 'bar', encoding: {} },\n    channels: ['y', 'x', 'color', 'column', 'row'],\n    markCognitiveChannel: 'length',\n    // See file docstring — a hand-built per-cell axis-pair grid (bar + %/value\n    // annotation columns), not a single cartesian panel the generic facet\n    // combiner could safely split/recombine; column/row facets are built as\n    // additional cells in this template's own grid instead.\n    selfManagesFacets: true,\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, chartProperties, canvasSize } = ctx;\n        const yField = channelSemantics.y?.field;\n        const xField = channelSemantics.x?.field;\n        const colorField = channelSemantics.color?.field;\n        const colField = channelSemantics.column?.field;\n        const rowField = channelSemantics.row?.field;\n        if (!yField || !xField) return;\n\n        const table = (ctx.fullTable ?? ctx.table ?? []) as any[];\n        if (table.length === 0) return;\n\n        const maxRows = Math.max(0, Number(chartProperties?.maxRows ?? 20));\n        const showPercent = chartProperties?.showPercent === true;\n        const useMean = channelSemantics.x?.aggregationDefault === 'average';\n        const reversed = !!channelSemantics.y?.reversed;\n\n        const xEntry = getRegistryEntry(channelSemantics.x?.semanticAnnotation?.semanticType ?? 'Unknown');\n        let hasNegative = false, hasPositive = false;\n        for (const r of table) {\n            const v = Number(r[xField]);\n            if (Number.isFinite(v)) { if (v < 0) hasNegative = true; else if (v > 0) hasPositive = true; }\n        }\n        const isDiverging = !colorField && (\n            xEntry.diverging === 'inherent'\n            || (xEntry.diverging === 'conditional' && hasNegative && hasPositive)\n        );\n\n        // ── Facet grid: column/row values in first-appearance order. ─────\n        //\n        // Column-only facets wrap into a 2D grid when there are more panels\n        // than comfortably fit at this template's own (wider-than-usual,\n        // 3-sub-column) minimum panel width — the shared layout engine's\n        // facet-grid decision assumes a much narrower single-axis panel, so\n        // it under-wraps for this template; we make the wrap call ourselves\n        // from our own minimum-width estimate instead.\n        const colValues = colField ? [...new Set(table.map(r => String(r[colField])))] : [''];\n        const rowValues = rowField ? [...new Set(table.map(r => String(r[rowField])))] : [''];\n        const MIN_CELL_W = showPercent ? 280 : 230;\n        const maxStretchW = (canvasSize ?? { width: 480 }).width * 3;\n        const maxColsFit = Math.max(1, Math.floor(maxStretchW / MIN_CELL_W));\n        const gridColsWanted = colField\n            ? (colValues.length <= maxColsFit\n                ? colValues.length\n                : Math.ceil(colValues.length / Math.ceil(colValues.length / maxColsFit)))\n            : 1;\n        const wrapColumnOnly = !!colField && !rowField && gridColsWanted < colValues.length;\n\n        type Cell = { colVal: string; rowVal: string; rows: any[] };\n        const cells: Cell[][] = [];\n        if (wrapColumnOnly) {\n            for (let i = 0; i < colValues.length; i += gridColsWanted) {\n                cells.push(colValues.slice(i, i + gridColsWanted).map(cv => ({\n                    colVal: cv, rowVal: '',\n                    rows: table.filter(r => String(r[colField!]) === cv),\n                })));\n            }\n        } else {\n            for (const rv of rowValues) {\n                cells.push(colValues.map(cv => ({\n                    colVal: cv, rowVal: rv,\n                    rows: table.filter(r =>\n                        (!colField || String(r[colField]) === cv) && (!rowField || String(r[rowField]) === rv)),\n                })));\n            }\n        }\n        const gridRows = cells.length;\n        const gridCols = Math.max(1, ...cells.map(r => r.length));\n        const hasFacet = gridRows > 1 || gridCols > 1;\n\n        // ── Per-cell aggregation (Top-N rollup within each facet scope). ──\n        const scoped = cells.map(row => row.map(cell =>\n            buildScopeRows(cell.rows, yField, xField, colorField, useMean, maxRows, reversed)));\n\n        const allColorValues = colorField\n            ? [...new Set(scoped.flat().flatMap(sr => sr.filter(r => !r.isOthers).flatMap(r => [...(r.byColor?.keys() ?? [])])))]\n            : [];\n\n        // ── Sizing (manual — mirrors the Vega-Lite template's hand-rolled\n        // panel sizing; the shared layout engine's faceted sizing doesn't\n        // apply to a hand-built multi-axis grid). ─────────────────────────\n        const canvas = canvasSize ?? { width: 480, height: 320 };\n        const maxRowsPerCell = Math.max(1, ...scoped.flat().map(sr => sr.length));\n        const density = Math.min(1, Math.max(0, (maxRowsPerCell - 12) / 40));\n        const lerp = (a: number, b: number) => Math.round(a + (b - a) * density);\n        const fontSize = Math.max(9, lerp(12, 10) - (hasFacet ? 2 : 0));\n        const barPx = Math.max(6, lerp(16, 8));\n        const gapPx = Math.max(2, Math.round(barPx * 0.2));\n        const rowStep = barPx + gapPx;\n\n        const allAggValues = scoped.flat().flatMap(sr => sr.map(r => r.value));\n        const pctValuesForSizing = scoped.flat().flatMap(sr => {\n            const total = sr.reduce((s, r) => s + r.value, 0);\n            return Math.abs(total) > 1e-9 ? sr.map(r => r.value / total) : [];\n        });\n        const pctPattern = showPercent ? '%' : undefined;\n        const measure = (strs: string[], minPx: number, maxPx: number) => {\n            const maxChars = strs.reduce((m, s) => Math.max(m, s.length), 0);\n            return Math.min(maxPx, Math.max(minPx, Math.round(maxChars * fontSize * 0.62 + 12)));\n        };\n        const catW = Math.min(180, Math.max(50, Math.round(\n            Math.max(4, textWidth(yField), ...scoped.flat().flatMap(sr => sr.map(r => textWidth(r.cat)))) * fontSize * 0.6 + 12)));\n        const catMaxUnits = Math.max(4, Math.floor((catW - 12) / (fontSize * 0.6)));\n        const valW = measure([...allAggValues.map(v => approxFormat(v)), xField], 40, 110);\n        const pctW = showPercent ? measure([...pctValuesForSizing.map(v => approxFormat(v, pctPattern)), '%'], 40, 70) : 0;\n        const barMinW = 90;\n        const cellContentW = Math.max(\n            catW + barMinW + INTER_GAP + valW + (showPercent ? pctW + INTER_GAP : 0),\n            Math.round((canvas.width - (gridCols - 1) * CELL_GAP_X) / gridCols),\n        );\n        const cellW = cellContentW;\n        const barW = Math.max(barMinW, cellW - catW - valW - (showPercent ? pctW + INTER_GAP : 0) - INTER_GAP);\n\n        const facetColHeaderBand = colField ? FACET_HEADER_H : 0;\n        const facetRowHeaderW = rowField ? 18 : 0;\n        const cellHeights = cells.map((row, ri) => Math.max(1, ...row.map((_, ci) => {\n            const sr = scoped[ri][ci];\n            return HEADER_H + (sr?.length ?? 1) * rowStep;\n        })));\n        const rowTotalHeights = cellHeights.map(h => h + facetColHeaderBand);\n        const totalW = gridCols * cellW + (gridCols - 1) * CELL_GAP_X + facetRowHeaderW;\n        // Floor the figure height so a very small row count (e.g. a single\n        // row) still leaves enough vertical room for the header band and the\n        // row to render legibly — otherwise the (fixed-size) header/row text\n        // can visually collide in an unrealistically short image.\n        const MIN_TOTAL_H = 70;\n        const totalH = Math.max(\n            MIN_TOTAL_H,\n            rowTotalHeights.reduce((s, h) => s + h, 0) + (gridRows - 1) * CELL_GAP_Y,\n        );\n\n        const palette: string[] = ['#4C78A8', '#F58518', '#54A24B', '#B279A2', '#E45756', '#72B7B2', '#EECA3B', '#9D755D'];\n        const colorIdx = new Map(allColorValues.map((v, i) => [v, i]));\n\n        const traces: any[] = [];\n        const annotations: any[] = [];\n        const layout: any = { showlegend: !!colorField, margin: { t: 8, b: 8, l: 8, r: 8 } };\n        const legendSeen = new Set<string>();\n\n        let yTop = 0;\n        for (let ri = 0; ri < gridRows; ri++) {\n            const row = cells[ri];\n            const cellTop = yTop + facetColHeaderBand;\n            for (let ci = 0; ci < row.length; ci++) {\n                const cell = row[ci];\n                const sr = scoped[ri][ci];\n                const n = ri * gridCols + ci + 1;\n                const xName = n === 1 ? 'xaxis' : `xaxis${n}`;\n                const yName = n === 1 ? 'yaxis' : `yaxis${n}`;\n                const xRef = n === 1 ? 'x' : `x${n}`;\n                const yRef = n === 1 ? 'y' : `y${n}`;\n\n                const cellLeft = ci * (cellW + CELL_GAP_X);\n                const barX0 = cellLeft + catW;\n                const barX1 = barX0 + barW;\n                const catNames = sr.map(r => r.cat);\n                const yDomainTop = cellTop + HEADER_H;\n                const yDomainBottom = yDomainTop + sr.length * rowStep;\n\n                layout[xName] = {\n                    domain: [barX0 / totalW, barX1 / totalW],\n                    anchor: yRef,\n                    rangemode: isDiverging ? 'normal' : 'tozero',\n                    zeroline: true, zerolinecolor: '#ddd',\n                    showgrid: false, showticklabels: false,\n                };\n                layout[yName] = {\n                    domain: [1 - yDomainBottom / totalH, 1 - yDomainTop / totalH],\n                    anchor: xRef,\n                    type: 'category',\n                    categoryorder: 'array', categoryarray: catNames,\n                    autorange: 'reversed',\n                    showgrid: false,\n                    tickfont: { size: fontSize },\n                    // Category names render as our OWN annotations (below),\n                    // not native tick labels: Plotly's category axis has no\n                    // `labelLimit`-style truncation, so a name longer than\n                    // `catW` would just overflow past the figure's own left\n                    // edge (clipped by the canvas) instead of ellipsizing —\n                    // annotations let us truncate deterministically to fit.\n                    showticklabels: false,\n                    automargin: false,\n                    ticklen: 0,\n                };\n\n                if (colorField && allColorValues.length > 0) {\n                    for (const cv of allColorValues) {\n                        const xs = sr.map(r => r.isOthers ? 0 : (r.byColor?.get(cv) ?? 0));\n                        if (xs.every(v => v === 0)) continue;\n                        traces.push({\n                            type: 'bar', orientation: 'h',\n                            xaxis: xRef, yaxis: yRef,\n                            name: cv,\n                            legendgroup: cv,\n                            showlegend: !legendSeen.has(cv),\n                            x: xs, y: catNames,\n                            marker: { color: palette[(colorIdx.get(cv) ?? 0) % palette.length] },\n                            hovertemplate: `%{y}<br>${cv}: %{x}<extra></extra>`,\n                        });\n                        legendSeen.add(cv);\n                    }\n                    const othersXs = sr.map(r => r.isOthers ? r.value : 0);\n                    if (othersXs.some(v => v !== 0)) {\n                        traces.push({\n                            type: 'bar', orientation: 'h',\n                            xaxis: xRef, yaxis: yRef,\n                            name: 'Others', legendgroup: 'Others', showlegend: false,\n                            x: othersXs, y: catNames,\n                            marker: { color: OTHERS_GRAY },\n                            hoverinfo: 'skip',\n                        });\n                    }\n                } else {\n                    const vals = sr.map(r => r.value);\n                    const finite = vals.filter(Number.isFinite);\n                    const vmin = finite.length ? Math.min(...finite, 0) : 0;\n                    const vmax = finite.length ? Math.max(...finite) : 1;\n                    const colors = sr.map(r => {\n                        if (r.isOthers) return OTHERS_GRAY;\n                        if (isDiverging) {\n                            const span = Math.max(Math.abs(vmin), Math.abs(vmax)) || 1;\n                            const t = r.value / span; // -1..1\n                            return t >= 0 ? lerpHex(DIV_MID, DIV_HIGH, t) : lerpHex(DIV_MID, DIV_LOW, -t);\n                        }\n                        const t = (r.value - vmin) / ((vmax - vmin) || 1);\n                        return lerpHex(SEQ_LOW, SEQ_HIGH, t);\n                    });\n                    traces.push({\n                        type: 'bar', orientation: 'h',\n                        xaxis: xRef, yaxis: yRef,\n                        showlegend: false,\n                        x: vals, y: catNames,\n                        marker: { color: colors },\n                        hovertemplate: `%{y}<br>${xField}: %{x}<extra></extra>`,\n                    });\n                }\n\n                // ── Category / %/value text columns (annotations anchored\n                // to this cell's own category axis so each row lines up with\n                // its bar; see the `showticklabels: false` note above for\n                // why the category name is an annotation too). ──\n                const total = sr.reduce((s, r) => s + r.value, 0);\n                sr.forEach((r) => {\n                    const color = r.isOthers ? OTHERS_GRAY : '#666';\n                    annotations.push({\n                        text: truncateToWidth(r.cat, catMaxUnits),\n                        x: cellLeft / totalW, y: r.cat,\n                        xref: 'paper', yref: yRef,\n                        xanchor: 'left', yanchor: 'middle', showarrow: false,\n                        font: { size: fontSize, color: r.isOthers ? OTHERS_GRAY : '#333' },\n                    });\n                    if (showPercent) {\n                        const pct = Math.abs(total) > 1e-9 ? r.value / total : NaN;\n                        annotations.push({\n                            text: Number.isFinite(pct) ? approxFormat(pct, '%') : '',\n                            x: (barX1 + INTER_GAP + pctW) / totalW, y: r.cat,\n                            xref: 'paper', yref: yRef,\n                            xanchor: 'right', yanchor: 'middle', showarrow: false,\n                            font: { size: fontSize, color: r.isOthers ? OTHERS_GRAY : '#41a25f' },\n                        });\n                    }\n                    const valueX = showPercent ? barX1 + INTER_GAP + pctW + INTER_GAP + valW : barX1 + INTER_GAP + valW;\n                    annotations.push({\n                        text: approxFormat(r.value),\n                        x: valueX / totalW, y: r.cat,\n                        xref: 'paper', yref: yRef,\n                        xanchor: 'right', yanchor: 'middle', showarrow: false,\n                        font: { size: fontSize, color },\n                    });\n                });\n\n                // Sub-column headers (Category / % / Value), repeated per\n                // cell. `yanchor: 'top'` renders the label DOWNWARD from the\n                // cell's own top edge (into the reserved `HEADER_H` band) —\n                // `yanchor: 'bottom'` at the same y would need headroom above\n                // the plot area itself, clipping the very first row's headers\n                // against the image's top edge.\n                const headerY = 1 - cellTop / totalH;\n                annotations.push({\n                    text: yField, x: cellLeft / totalW, y: headerY,\n                    xref: 'paper', yref: 'paper', xanchor: 'left', yanchor: 'top', showarrow: false,\n                    font: { size: 10, color: '#999' },\n                });\n                if (showPercent) {\n                    annotations.push({\n                        text: '%', x: (barX1 + INTER_GAP + pctW) / totalW, y: headerY,\n                        xref: 'paper', yref: 'paper', xanchor: 'right', yanchor: 'top', showarrow: false,\n                        font: { size: 10, color: '#999' },\n                    });\n                }\n                annotations.push({\n                    text: xField,\n                    x: (showPercent ? barX1 + INTER_GAP + pctW + INTER_GAP + valW : barX1 + INTER_GAP + valW) / totalW,\n                    y: headerY,\n                    xref: 'paper', yref: 'paper', xanchor: 'right', yanchor: 'top', showarrow: false,\n                    font: { size: 10, color: '#999' },\n                });\n\n                // Facet column header (top row of each grid row only).\n                if (colField && cell.colVal !== '') {\n                    annotations.push({\n                        text: cell.colVal,\n                        x: (cellLeft + cellW / 2) / totalW, y: 1 - yTop / totalH,\n                        xref: 'paper', yref: 'paper', xanchor: 'center', yanchor: 'top', showarrow: false,\n                        font: { size: 12, color: '#333' },\n                    });\n                }\n                // Facet row header (rightmost cell in the row).\n                if (rowField && ci === row.length - 1 && cell.rowVal !== '') {\n                    annotations.push({\n                        text: cell.rowVal,\n                        x: (totalW - facetRowHeaderW / 2) / totalW, y: 1 - (cellTop + (yDomainBottom - yDomainTop) / 2) / totalH,\n                        xref: 'paper', yref: 'paper', xanchor: 'center', yanchor: 'middle', textangle: 90, showarrow: false,\n                        font: { size: 12, color: '#333' },\n                    });\n                }\n            }\n            yTop += rowTotalHeights[ri] + CELL_GAP_Y;\n        }\n\n        Object.assign(spec, {\n            data: traces,\n            layout: { ...layout, annotations, barmode: colorField ? 'stack' : undefined },\n            _width: Math.round(totalW),\n            _height: Math.round(totalH),\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'maxRows', label: 'Max Rows', type: 'continuous', min: 5, max: 100, step: 1, defaultValue: 20 } as ChartPropertyDef,\n        {\n            key: 'showPercent', label: '% of total', type: 'binary', defaultValue: false,\n            check: (ctx) => {\n                const mcs = ctx.channelSemantics?.x;\n                if (!mcs?.field || mcs.type !== 'quantitative' || mcs.aggregationDefault === 'average') {\n                    return { applicable: false };\n                }\n                let sum = 0, hasNeg = false, hasPos = false, count = 0;\n                for (const row of ctx.data ?? []) {\n                    const v = row[mcs.field];\n                    if (typeof v !== 'number' || !isFinite(v)) continue;\n                    count++;\n                    if (v < 0) hasNeg = true; else if (v > 0) hasPos = true;\n                    sum += v;\n                }\n                return { applicable: count > 0 && !(hasNeg && hasPos) && Math.abs(sum) > 0 };\n            },\n        } as ChartPropertyDef,\n    ],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly Density Contour (2D density) template.\n *\n * Native `histogram2dcontour` trace: bins two raw numeric arrays (`x`, `y`) and\n * draws smoothed density contour lines. Vega-Lite has **no** contour mark, so\n * this is a Plotly-only statistical chart. See design-docs/plotly-stats-charts.md.\n */\n\nimport { ChartTemplateDef, ChartPropertyDef, EncodingActionDef } from '../../core/types';\n\nconst SCHEME_COLORSCALES: Record<string, string> = {\n    viridis: 'Viridis', inferno: 'Hot', magma: 'Magma', plasma: 'Plasma', turbo: 'Turbo',\n    blues: 'Blues', reds: 'Reds', greens: 'Greens', oranges: 'Oranges', purples: 'Purples', greys: 'Greys',\n};\nconst DEFAULT_SCHEME = 'Blues';\n\nexport const plDensityContourDef: ChartTemplateDef = {\n    chart: 'Density Contour',\n    template: { mark: 'rect', encoding: {} },\n    channels: ['x', 'y', 'column', 'row'],\n    markCognitiveChannel: 'color',\n    instantiate: (spec, ctx) => {\n        const { channelSemantics, table, chartProperties, encodings } = ctx;\n        const xField = channelSemantics.x?.field;\n        const yField = channelSemantics.y?.field;\n        if (!xField || !yField) return;\n\n        const binCount = (chartProperties?.binCount as number) || 20;\n        const showPoints = chartProperties?.showPoints !== false;\n        const encScheme = (encodings?.color as any)?.scheme;\n        const userScheme = (encScheme && encScheme !== 'default') ? encScheme : undefined;\n        const colorscale = SCHEME_COLORSCALES[userScheme ?? DEFAULT_SCHEME.toLowerCase()] ?? DEFAULT_SCHEME;\n\n        const xs: number[] = [];\n        const ys: number[] = [];\n        for (const r of table) {\n            const xv = Number(r[xField]);\n            const yv = Number(r[yField]);\n            if (isFinite(xv) && isFinite(yv)) { xs.push(xv); ys.push(yv); }\n        }\n\n        const data: any[] = [{\n            type: 'histogram2dcontour',\n            x: xs, y: ys,\n            nbinsx: binCount, nbinsy: binCount,\n            colorscale,\n            contours: { coloring: 'fill' },\n            colorbar: { title: { text: 'Density' } },\n            line: { width: 0.5 },\n        }];\n        if (showPoints) {\n            data.push({\n                type: 'scatter', mode: 'markers',\n                x: xs, y: ys,\n                marker: { color: 'rgba(0,0,0,0.35)', size: 3 },\n                hoverinfo: 'skip', showlegend: false,\n            });\n        }\n\n        Object.assign(spec, {\n            data,\n            layout: {\n                xaxis: { title: { text: xField } },\n                yaxis: { title: { text: yField } },\n                showlegend: false,\n            },\n        });\n        delete spec.mark;\n        delete spec.encoding;\n    },\n    properties: [\n        { key: 'binCount', label: 'Bins', type: 'continuous', min: 5, max: 50, step: 1, defaultValue: 20 } as ChartPropertyDef,\n        { key: 'showPoints', label: 'Show points', type: 'binary', defaultValue: true } as ChartPropertyDef,\n    ],\n    encodingActions: [\n        {\n            key: 'colorScheme',\n            label: 'Scheme',\n            isApplicable: () => true,\n            dependencies: [],\n            control: {\n                type: 'discrete', options: [\n                    { value: undefined, label: 'Default (Blues)' },\n                    { value: 'viridis', label: 'Viridis' },\n                    { value: 'inferno', label: 'Inferno' },\n                    { value: 'magma', label: 'Magma' },\n                    { value: 'plasma', label: 'Plasma' },\n                    { value: 'turbo', label: 'Turbo' },\n                    { value: 'greens', label: 'Greens' },\n                    { value: 'reds', label: 'Reds' },\n                ],\n            },\n            get: (enc) => (enc.color as any)?.scheme,\n            set: (enc, value) => ({ ...enc, color: { ...(enc.color as any), scheme: value } }),\n        },\n    ] as EncodingActionDef[],\n};\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly template registry.\n *\n * Mirrors the structure of chartjs/templates/index.ts, echarts/templates/index.ts\n * and vegalite/templates/index.ts but with Plotly template definitions.\n *\n * Coverage: the four original acceptance templates (Bar, Line, Area, Scatter)\n * plus an expressive tranche mirroring most of the Vega-Lite catalog (grouped/\n * stacked bar, distributions, circular charts, specialized native-trace charts),\n * two Plotly opportunity charts (Funnel, Gauge) that showcase native\n * `indicator`/`funnel` traces ECharts otherwise hand-builds, native geo charts\n * (Map, Choropleth — Plotly's own `scattergeo`/`choropleth` built-in atlas, no\n * TopoJSON fetch/join needed), and two composite table/strip layouts\n * (Sparkline, Bar Table) built as self-contained Plotly figures (own axis\n * grid + paper-anchored annotations) rather than forced through the generic\n * cartesian column/row facet combiner (`facet.ts`), which only supports one\n * axis pair per panel. See `sparkline.ts` / `bar-table.ts` for the composite\n * layout technique and `selfManagesFacets` in `../assemble.ts`.\n */\n\nimport { ChartTemplateDef } from '../../core/types';\nimport { plBarChartDef, plGroupedBarChartDef, plStackedBarChartDef, plPyramidChartDef } from './bar';\nimport { plLineChartDef } from './line';\nimport { plAreaChartDef } from './area';\nimport { plScatterPlotDef } from './scatter';\nimport { plHistogramDef } from './histogram';\nimport { plPieChartDef, plDonutChartDef } from './pie';\nimport { plRadarChartDef } from './radar';\nimport { plRoseChartDef } from './rose';\nimport { plBoxplotDef } from './boxplot';\nimport { plViolinPlotDef } from './violin';\nimport { plDensityPlotDef } from './density';\nimport { plEcdfPlotDef } from './ecdf';\nimport { plStripPlotDef } from './jitter';\nimport { plConnectedScatterDef } from './connected-scatter';\nimport { plRangeAreaChartDef } from './range-area';\nimport { plStreamgraphDef } from './streamgraph';\nimport { plSlopeChartDef } from './slope';\nimport { plBumpChartDef } from './bump';\nimport { plWaterfallChartDef } from './waterfall';\nimport { plCandlestickChartDef } from './candlestick';\nimport { plHeatmapDef } from './heatmap';\nimport { plLollipopChartDef } from './lollipop';\nimport { plBulletChartDef } from './bullet';\nimport { plGanttChartDef } from './gantt';\nimport { plRangedDotPlotDef } from './ranged-dot';\nimport { plRegressionDef } from './regression';\nimport { plKpiCardDef } from './kpi-card';\nimport { plFunnelChartDef } from './funnel';\nimport { plGaugeChartDef } from './gauge';\nimport { plMapDef } from './map';\nimport { plChoroplethDef } from './choropleth';\nimport { plSparklineDef } from './sparkline';\nimport { plBarTableDef } from './bar-table';\nimport { plDensityContourDef } from './density-contour';\n\n/**\n * Plotly chart template definitions, grouped by category.\n */\nexport const plTemplateDefs: { [key: string]: ChartTemplateDef[] } = {\n    'Scatter & Point': [plScatterPlotDef, plRegressionDef, plConnectedScatterDef, plRangedDotPlotDef, plStripPlotDef],\n    'Bar':             [plBarChartDef, plGroupedBarChartDef, plStackedBarChartDef, plLollipopChartDef, plWaterfallChartDef, plPyramidChartDef],\n    'Distributions':   [plHistogramDef, plBoxplotDef, plViolinPlotDef, plDensityPlotDef, plEcdfPlotDef, plCandlestickChartDef, plDensityContourDef],\n    'Line & Area':     [plLineChartDef, plAreaChartDef, plBumpChartDef, plSlopeChartDef, plStreamgraphDef, plRangeAreaChartDef],\n    'Circular':        [plPieChartDef, plDonutChartDef, plRadarChartDef, plRoseChartDef],\n    'Tables & KPIs':   [plHeatmapDef, plGanttChartDef, plBulletChartDef, plKpiCardDef, plSparklineDef, plBarTableDef],\n    'Maps':            [plMapDef, plChoroplethDef],\n    'Opportunity':     [plFunnelChartDef, plGaugeChartDef],\n};\n\n/**\n * Flat list of all Plotly chart template definitions.\n */\nexport const plAllTemplateDefs: ChartTemplateDef[] = Object.values(plTemplateDefs).flat();\n\n/**\n * Look up a Plotly chart template definition by chart type name.\n */\nexport function plGetTemplateDef(chartType: string): ChartTemplateDef | undefined {\n    return plAllTemplateDefs.find(t => t.chart === chartType);\n}\n\n/**\n * Get the available channels for a Plotly chart type.\n */\nexport function plGetTemplateChannels(chartType: string): string[] {\n    return plGetTemplateDef(chartType)?.channels || [];\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * =============================================================================\n * PHASE 2: INSTANTIATE SPEC — Plotly backend\n * =============================================================================\n *\n * Translates semantic decisions (Phase 0) and layout dimensions (Phase 1)\n * into Plotly-specific figure properties.\n *\n * Key differences from the other backends:\n *   - PL figures are `{ data: traces[], layout }` and stay pure JSON — axis\n *     tick formatting uses declarative `tickformat`/axis types, never\n *     callback functions\n *   - PL sizing via `layout.width` / `layout.height`\n *   - PL label rotation via `layout.xaxis.tickangle`\n *\n * PL dependency: **Yes — this is where Plotly-specific syntax lives**\n * =============================================================================\n */\n\nimport type {\n    InstantiateContext,\n    ChartWarning,\n} from '../core/types';\n\nconst AXIS_TITLE_STANDOFF = 16;\n// Plotly places tick labels ~1px from the axis by default — much tighter than\n// the other renderers (ECharts axisLabel.margin 8, Vega-Lite labelPadding+tick\n// ~7). Nudge them out to a comparable, comfortable gap. `ticklabelstandoff` is\n// the purpose-built property (Plotly ≥ 2.34 / 3.x); harmlessly ignored on older\n// builds, which keeps the current behavior rather than regressing.\nconst TICK_LABEL_STANDOFF = 7;\n\nfunction reserveCartesianMargins(figure: any, context: InstantiateContext): void {\n    const { layout } = context;\n    const hasXAxis = !!figure.layout.xaxis;\n    const hasYAxis = !!figure.layout.yaxis;\n    if (!hasXAxis && !hasYAxis) return;\n\n    const xCategories = figure.layout.xaxis?.categoryarray;\n    const xFontSize = layout.xLabel?.fontSize ?? 10;\n    const maxXLabelWidth = Array.isArray(xCategories)\n        ? Math.min(layout.xLabel?.labelLimit ?? 100, Math.max(0, ...xCategories.map((value: unknown) => String(value).length * xFontSize * 0.6)))\n        : 0;\n    const xBandWidth = Array.isArray(xCategories) && xCategories.length > 0\n        ? layout.subplotWidth / xCategories.length\n        : Number.POSITIVE_INFINITY;\n    if (figure.layout.xaxis && Array.isArray(xCategories) && xCategories.length <= 6) {\n        figure.layout.xaxis.tickangle = 0;\n        const desiredPlotWidth = xCategories.length * Math.max(48, maxXLabelWidth + 16);\n        figure._width += Math.max(0, desiredPlotWidth - layout.subplotWidth);\n    } else if (figure.layout.xaxis && figure.layout.xaxis.tickangle == null && maxXLabelWidth > xBandWidth) {\n        figure.layout.xaxis.tickangle = 45;\n    }\n    const xAngle = Math.abs(figure.layout.xaxis?.tickangle ?? layout.xLabel?.labelAngle ?? 0) * Math.PI / 180;\n    const rotatedXDepth = Math.ceil(maxXLabelWidth * Math.sin(xAngle));\n    const bottom = hasXAxis ? Math.max(xAngle > 0 ? 96 : 56, 40 + rotatedXDepth) : 24;\n\n    const yCategories = figure.layout.yaxis?.categoryarray;\n    const yFontSize = layout.yLabel?.fontSize ?? 10;\n    const maxYLabelWidth = Array.isArray(yCategories)\n        ? Math.min(layout.yLabel?.labelLimit ?? 100, Math.max(0, ...yCategories.map((value: unknown) => String(value).length * yFontSize * 0.6)))\n        : 28;\n    const left = hasYAxis ? Math.max(64, 36 + maxYLabelWidth) : 24;\n    const hasColorbar = (figure.data ?? []).some((trace: any) => trace.colorbar || trace.marker?.colorbar);\n    const right = hasColorbar ? 96 : 32;\n\n    figure.layout.margin = { t: 24, r: right, b: bottom, l: left };\n}\n\nexport function plApplyCartesianAxisSpacing(figure: any): void {\n    for (const [key, axis] of Object.entries(figure.layout ?? {})) {\n        if (!/^[xy]axis\\d*$/.test(key) || !axis || typeof axis !== 'object') continue;\n        const cartesianAxis = axis as any;\n        cartesianAxis.automargin = true;\n        if (cartesianAxis.ticklabelstandoff == null) {\n            cartesianAxis.ticklabelstandoff = TICK_LABEL_STANDOFF;\n        }\n        if (cartesianAxis.title?.text) {\n            cartesianAxis.title = { ...cartesianAxis.title, standoff: AXIS_TITLE_STANDOFF };\n        }\n    }\n}\n\n/**\n * Apply the cross-cutting per-axis chart properties (`logScale_x/y`,\n * `includeZero_x/y`) to every cartesian axis of the figure. These are surfaced\n * on many charts by the shared VL option set; implementing them here lets ALL\n * Plotly cartesian charts honor them natively (`axis.type: 'log'`,\n * `axis.rangemode: 'tozero'`). A category axis is skipped (log/zero are\n * meaningless there); a log axis never also forces zero (log 0 is undefined).\n */\nexport function plApplyAxisProperties(figure: any, context: InstantiateContext): void {\n    const cp = context.chartProperties;\n    if (!cp || !figure.layout) return;\n    const applyAxis = (re: RegExp, logKey: string, zeroKey: string) => {\n        const log = cp[logKey];\n        const zero = cp[zeroKey];\n        if (log == null && zero == null) return;\n        for (const [k, ax] of Object.entries(figure.layout)) {\n            if (!re.test(k) || !ax || typeof ax !== 'object') continue;\n            const a = ax as any;\n            if (a.type === 'category') continue;\n            if (log === true) {\n                a.type = 'log';\n                if (a.rangemode === 'tozero') delete a.rangemode;\n            } else if (log === false && a.type === 'log') {\n                delete a.type;\n            }\n            if (a.type !== 'log') {\n                if (zero === true) a.rangemode = 'tozero';\n                else if (zero === false && a.rangemode === 'tozero') a.rangemode = 'normal';\n            }\n        }\n    };\n    applyAxis(/^xaxis\\d*$/, 'logScale_x', 'includeZero_x');\n    applyAxis(/^yaxis\\d*$/, 'logScale_y', 'includeZero_y');\n}\n\n/**\n * Phase 2: Apply layout and semantic decisions to the Plotly figure.\n *\n * Handles common Plotly plumbing across all templates:\n *   - Figure sizing (_width, _height + layout.width/height)\n *   - Axis label rotation and font sizing\n *   - Overflow truncation warnings\n */\nexport function plApplyLayoutToSpec(\n    figure: any,\n    context: InstantiateContext,\n    warnings: ChartWarning[],\n): void {\n    const { layout, canvasSize } = context;\n\n    if (!figure.layout) figure.layout = {};\n\n    // ── Figure dimensions ────────────────────────────────────────────────\n    let usedDefaultDimensions = false;\n    if (!figure._width) {\n        usedDefaultDimensions = true;\n        const PADDING = 80; // approximate space for axes, labels\n\n        const xIsDiscrete = layout.xNominalCount > 0 || layout.xContinuousAsDiscrete > 0;\n        const yIsDiscrete = layout.yNominalCount > 0 || layout.yContinuousAsDiscrete > 0;\n\n        let plotWidth: number;\n        let plotHeight: number;\n\n        if (xIsDiscrete && layout.xStepUnit !== 'group') {\n            const xItemCount = layout.xNominalCount || layout.xContinuousAsDiscrete || 0;\n            plotWidth = xItemCount > 0 ? layout.xStep * xItemCount : (layout.subplotWidth || canvasSize.width);\n        } else {\n            plotWidth = layout.subplotWidth || canvasSize.width;\n        }\n\n        if (yIsDiscrete && layout.yStepUnit !== 'group') {\n            const yItemCount = layout.yNominalCount || layout.yContinuousAsDiscrete || 0;\n            plotHeight = yItemCount > 0 ? layout.yStep * yItemCount : (layout.subplotHeight || canvasSize.height);\n        } else {\n            plotHeight = layout.subplotHeight || canvasSize.height;\n        }\n\n        const legendGutter = figure.layout.showlegend ? 96 : 0;\n        figure._width = plotWidth + PADDING + legendGutter;\n        figure._height = plotHeight + PADDING;\n    }\n\n    // ── X-axis label rotation and font sizing ────────────────────────────\n    if (layout.xLabel) {\n        if (!figure.layout.xaxis) figure.layout.xaxis = {};\n        if (layout.xLabel.labelAngle && layout.xLabel.labelAngle !== 0) {\n            figure.layout.xaxis.tickangle = Math.abs(layout.xLabel.labelAngle);\n        }\n        if (layout.xLabel.fontSize) {\n            figure.layout.xaxis.tickfont = {\n                ...(figure.layout.xaxis.tickfont || {}),\n                size: layout.xLabel.fontSize,\n            };\n        }\n    }\n\n    // ── Y-axis label font sizing ─────────────────────────────────────────\n    if (layout.yLabel?.fontSize) {\n        if (!figure.layout.yaxis) figure.layout.yaxis = {};\n        figure.layout.yaxis.tickfont = {\n            ...(figure.layout.yaxis.tickfont || {}),\n            size: layout.yLabel.fontSize,\n        };\n    }\n\n    // ── Axis title + legend fonts — canvas-adaptive header sizes ─────────\n    for (const key of Object.keys(figure.layout)) {\n        if (!/^[xy]axis\\d*$/.test(key)) continue;\n        const axis = figure.layout[key];\n        if (axis?.title) {\n            axis.title = typeof axis.title === 'string' ? { text: axis.title } : axis.title;\n            axis.title.font = { ...(axis.title.font || {}), size: layout.titleFontSize };\n        }\n    }\n    if (figure.layout.legend) {\n        figure.layout.legend.font = {\n            ...(figure.layout.legend.font || {}),\n            size: layout.legendFontSize,\n        };\n    }\n\n    if (figure.layout.margin == null) {\n        reserveCartesianMargins(figure, context);\n        if (usedDefaultDimensions) {\n            const margin = figure.layout.margin;\n            figure._width += Math.max(0, margin.l + margin.r - 80);\n            figure._height += Math.max(0, margin.t + margin.b - 80);\n        }\n    }\n    plApplyCartesianAxisSpacing(figure);\n    figure.layout.width = figure._width;\n    figure.layout.height = figure._height;\n\n    // ── Overflow truncation warnings ─────────────────────────────────────\n    if (layout.truncations && layout.truncations.length > 0) {\n        for (const trunc of layout.truncations) {\n            warnings.push({\n                severity: 'warning',\n                code: 'overflow',\n                message: trunc.message,\n                channel: trunc.channel,\n                field: trunc.field,\n            });\n        }\n    }\n}\n\n/**\n * Apply tooltips to a Plotly figure. Plotly hover is on by default; this\n * pins an explicit unified hover mode so tooltips read across series.\n */\nexport function plApplyTooltips(figure: any): void {\n    if (!figure.layout) figure.layout = {};\n    if (figure.layout.hovermode == null) {\n        figure.layout.hovermode = 'closest';\n    }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly facet grid assembly.\n *\n * Combines per-panel figures (one template instantiation per column/row cell)\n * into a single Plotly figure using per-panel axis pairs (`xaxis`/`xaxis2`/…)\n * with explicit domains — the Plotly-native equivalent of the Chart.js\n * backend's facet panel grid (chartjs/assemble.ts), mirroring its decisions:\n *   - shared, nice-rounded y-domain across all panels\n *   - only the leftmost column draws y tick labels and the y-axis title\n *   - column-only facets wrap into a 2D grid using the shared facet budget\n *   - column headers above panels, row headers rotated on the left\n *   - one legend entry per series (deduped across panels via legendgroup)\n */\n\n/** One instantiated facet cell. */\nexport interface PlotlyFacetPanel {\n    rowIndex: number;\n    colIndex: number;\n    rowHeader?: string;\n    colHeader?: string;\n    /** The per-panel figure produced by template.instantiate ({ data, layout }). */\n    figure: any;\n}\n\n/**\n * Round a [min, max] interval outward to \"nice\" round numbers so the shared\n * facet axis lands its endpoints on clean tick values (same rule as the\n * Chart.js backend / Vega-Lite `nice: true`).\n */\nexport function niceBounds(min: number, max: number, targetTicks = 5): { min: number; max: number } {\n    if (!(Number.isFinite(min) && Number.isFinite(max)) || max <= min) {\n        return { min, max };\n    }\n    const niceNum = (range: number, round: boolean): number => {\n        const exp = Math.floor(Math.log10(range));\n        const frac = range / 10 ** exp;\n        let niceFrac: number;\n        if (round) {\n            niceFrac = frac < 1.5 ? 1 : frac < 3 ? 2 : frac < 7 ? 5 : 10;\n        } else {\n            niceFrac = frac <= 1 ? 1 : frac <= 2 ? 2 : frac <= 5 ? 5 : 10;\n        }\n        return niceFrac * 10 ** exp;\n    };\n    const step = niceNum(niceNum(max - min, false) / Math.max(1, targetTicks - 1), true);\n    return {\n        min: Math.floor(min / step) * step,\n        max: Math.ceil(max / step) * step,\n    };\n}\n\nconst FACET_GAP_PX = 16;\nconst COL_HEADER_H = 22;\nconst ROW_HEADER_W = 28;\nconst MARGIN = { l: 64, r: 24, t: 16, b: 48 };\nconst LEGEND_GUTTER = 96;\n\n/**\n * Combine instantiated facet panels into one Plotly figure.\n *\n * Each panel's own `layout.xaxis` / `layout.yaxis` (category arrays, titles,\n * range modes) is copied onto that panel's axis pair; traces are re-pointed at\n * the pair. Domains are computed from the designed pixel grid so the figure\n * scales exactly like the other backends' facet output.\n */\nexport function plCombineFacetPanels(\n    panels: PlotlyFacetPanel[],\n    opts: {\n        rows: number;\n        cols: number;\n        panelWidth: number;\n        panelHeight: number;\n        sharedYDomain?: { min: number; max: number };\n        hasColHeader: boolean;\n        hasRowHeader: boolean;\n        /** Wrapped column-only facets repeat the header band above every row. */\n        colHeaderPerRow: boolean;\n        showLegend: boolean;\n    },\n): any {\n    const {\n        rows, cols, panelWidth, panelHeight, sharedYDomain,\n        hasColHeader, hasRowHeader, colHeaderPerRow, showLegend,\n    } = opts;\n\n    // Row headers sit on the RIGHT (Vega-Lite style): the left edge is already\n    // occupied by y tick labels + the y-axis title, so a left-side header would\n    // collide with them in a single combined figure.\n    const rowHeaderW = hasRowHeader ? ROW_HEADER_W : 0;\n    const headerBands = colHeaderPerRow ? rows : (hasColHeader ? 1 : 0);\n\n    const plotW = cols * panelWidth + (cols - 1) * FACET_GAP_PX;\n    const plotH = rows * panelHeight + (rows - 1) * FACET_GAP_PX\n        + headerBands * COL_HEADER_H;\n    const totalW = MARGIN.l + plotW + rowHeaderW + MARGIN.r + (showLegend ? LEGEND_GUTTER : 0);\n    const totalH = MARGIN.t + plotH + MARGIN.b;\n\n    // Paper-fraction geometry (Plotly domains live inside the margins).\n    const paperW = plotW + rowHeaderW;\n    const paperH = plotH;\n    const xFrac = (px: number) => px / paperW;\n    const yFrac = (px: number) => px / paperH;\n\n    const colX0 = (ci: number) => ci * (panelWidth + FACET_GAP_PX);\n    // Row band top (px from paper top), accounting for header bands.\n    const rowY0 = (ri: number) => (colHeaderPerRow\n        ? ri * (COL_HEADER_H + panelHeight + FACET_GAP_PX) + COL_HEADER_H\n        : (hasColHeader ? COL_HEADER_H : 0) + ri * (panelHeight + FACET_GAP_PX));\n\n    const figure: any = {\n        data: [],\n        layout: {\n            margin: { ...MARGIN },\n            showlegend: showLegend,\n            annotations: [],\n        },\n        _facet: true,\n        _facetRows: rows,\n        _facetCols: cols,\n        _width: totalW,\n        _height: totalH,\n    };\n    figure.layout.width = totalW;\n    figure.layout.height = totalH;\n\n    const seenLegend = new Set<string>();\n\n    for (const panel of panels) {\n        const { rowIndex: ri, colIndex: ci } = panel;\n        const n = ri * cols + ci + 1;\n        const xName = n === 1 ? 'xaxis' : `xaxis${n}`;\n        const yName = n === 1 ? 'yaxis' : `yaxis${n}`;\n        const xRef = n === 1 ? 'x' : `x${n}`;\n        const yRef = n === 1 ? 'y' : `y${n}`;\n\n        const x0 = xFrac(colX0(ci));\n        const x1 = xFrac(colX0(ci) + panelWidth);\n        // Plotly y-domain runs bottom-up; our rows run top-down.\n        const yTopPx = rowY0(ri);\n        const y1 = 1 - yFrac(yTopPx);\n        const y0 = 1 - yFrac(yTopPx + panelHeight);\n\n        const panelLayout = panel.figure?.layout ?? {};\n        const xAxis: any = { ...(panelLayout.xaxis ?? {}), domain: [x0, x1], anchor: yRef };\n        const yAxis: any = { ...(panelLayout.yaxis ?? {}), domain: [y0, y1], anchor: xRef };\n\n        // Shared y-domain across panels (mirror CJS: fixed nice range, no\n        // per-panel autorange). Rangemode would fight an explicit range.\n        if (sharedYDomain) {\n            yAxis.range = [sharedYDomain.min, sharedYDomain.max];\n            delete yAxis.rangemode;\n        }\n        // Only the leftmost column shows y tick labels + title.\n        if (ci > 0) {\n            yAxis.showticklabels = false;\n            delete yAxis.title;\n        }\n        // X-axis titles only on the bottom row (a per-panel title would\n        // collide with the next row's column headers in a single figure).\n        if (ri < rows - 1) {\n            delete xAxis.title;\n        }\n\n        figure.layout[xName] = xAxis;\n        figure.layout[yName] = yAxis;\n\n        for (const trace of panel.figure?.data ?? []) {\n            const placed: any = { ...trace, xaxis: xRef, yaxis: yRef };\n            const legendKey = String(placed.name ?? '');\n            if (legendKey) {\n                placed.legendgroup = legendKey;\n                placed.showlegend = !seenLegend.has(legendKey);\n                seenLegend.add(legendKey);\n            } else {\n                placed.showlegend = false;\n            }\n            figure.data.push(placed);\n        }\n\n        // Column header annotation (per wrapped row, or once on the top row).\n        if (panel.colHeader != null && (colHeaderPerRow || ri === 0)) {\n            figure.layout.annotations.push({\n                text: String(panel.colHeader),\n                showarrow: false,\n                xref: 'paper', yref: 'paper',\n                x: (x0 + x1) / 2,\n                y: 1 - yFrac(yTopPx - COL_HEADER_H / 2),\n                xanchor: 'center', yanchor: 'middle',\n                font: { size: 12 },\n            });\n        }\n\n        // Row header annotation (rightmost side, Vega-Lite style), rotated.\n        if (panel.rowHeader != null && ci === cols - 1) {\n            figure.layout.annotations.push({\n                text: String(panel.rowHeader),\n                showarrow: false,\n                textangle: 90,\n                xref: 'paper', yref: 'paper',\n                x: xFrac(plotW + rowHeaderW / 2),\n                y: (y0 + y1) / 2,\n                xanchor: 'center', yanchor: 'middle',\n                font: { size: 12 },\n            });\n        }\n    }\n\n    if (!showLegend) {\n        figure.layout.showlegend = false;\n    }\n\n    return figure;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Plotly chart assembly — Two-Stage Pipeline Coordinator.\n *\n * Reuses the **same core analysis pipeline** as the other backends:\n *   Phase 0:  resolveChannelSemantics  → ChannelSemantics\n *   Step 0a:  declareLayoutMode    → LayoutDeclaration\n *   Step 0b:  convertTemporalData  → converted data\n *   Step 0c:  filterOverflow       → filtered data, nominalCounts\n *   Phase 1:  computeLayout        → LayoutResult\n *\n * Then diverges for Phase 2 (Plotly-specific):\n *   template.instantiate → builds the Plotly figure structure\n *   plApplyLayoutToSpec  → applies layout decisions to the figure\n *\n * Key structural difference from the other backends' output:\n *   PL: { data: [{ type, x, y, … }], layout: { xaxis, yaxis, … } }\n *   Figures are pure JSON — no callback functions anywhere — so compiled\n *   specs survive serialization across process boundaries.\n *\n * column/row facets render as a subplot grid (see facet.ts), mirroring the\n * Chart.js backend's facet decisions (shared nice y-domain, leftmost-only\n * y labels, column wrapping).\n *\n * This module has NO React, Redux, or UI framework dependencies.\n */\n\nimport {\n    ChartTemplateDef,\n    ChartAssemblyInput,\n    AssembleOptions,\n    LayoutDeclaration,\n    InstantiateContext,\n} from '../core/types';\nimport type { ChartWarning, ChartEncoding } from '../core/types';\nimport { applyEncodingOverrides } from '../core/encoding-overrides';\nimport { applyAggregation } from '../core/aggregate';\nimport { applyPivot, applyTransform, type PivotSurface, type TransformSurface } from '../core/pivot';\nimport { plGetTemplateDef } from './templates';\nimport { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics';\nimport { computeZeroDecision } from '../core/semantic-types';\nimport { filterOverflow } from '../core/filter-overflow';\nimport { computeLayout, computeChannelBudgets, deriveStretchCaps, resolveBaseSize, resolveFacetColumnsOption } from '../core/compute-layout';\nimport { decideColorMaps } from '../core/color-decisions';\nimport { plApplyCartesianAxisSpacing, plApplyLayoutToSpec, plApplyTooltips, plApplyAxisProperties } from './instantiate-spec';\nimport { plCombineFacetPanels, niceBounds, type PlotlyFacetPanel } from './facet';\nimport { normalizeStaticSeries } from '../core/static-series';\nimport { normalizeChartProperties } from '../core/normalize-properties';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n/**\n * Assemble a Plotly figure object (`{ data, layout }`).\n *\n * ```ts\n * const figure = assemblePlotly({\n *   data: { values: myRows },\n *   semantic_types: { weight: 'Quantity' },\n *   chart_spec: { chartType: 'Bar Chart', encodings: { x: { field: 'category' }, y: { field: 'value' } } },\n * });\n * ```\n *\n * @returns A Plotly figure with optional `_warnings` and `_width`/`_height` hints\n */\nexport function assemblePlotly(input: ChartAssemblyInput): any {\n    const chartType = input.chart_spec.chartType;\n    const semanticTypes = input.semantic_types ?? {};\n    const sizeCeiling = input.chart_spec.canvasSize;\n    const baseSize = resolveBaseSize(input.chart_spec.baseSize, sizeCeiling);\n    const canvasSize = baseSize;\n    const options = input.options ?? {};\n    let chartTemplate = plGetTemplateDef(chartType) as ChartTemplateDef;\n    if (!chartTemplate) {\n        throw new Error(`Unknown Plotly chart type: ${chartType}. Use plAllTemplateDefs to see available types.`);\n    }\n\n    const warnings: ChartWarning[] = [];\n\n    const normalizedProps = normalizeChartProperties(\n        chartTemplate.properties, input.chart_spec.chartProperties,\n    );\n    const chartProperties = normalizedProps.chartProperties;\n    warnings.push(...normalizedProps.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PRE-PHASE: Static Series Normalization\n    // ═══════════════════════════════════════════════════════════════════════\n    const rawData = input.data.values ?? [];\n    const normalized = normalizeStaticSeries(\n        input.chart_spec.encodings, rawData, semanticTypes,\n    );\n    let data = normalized.data;\n    const staticSeries = normalized.staticSeries;\n\n    // Enrich raw encodings with their resolved semantic `type` BEFORE applying\n    // encoding actions (Sort, …) — an action like Sort must know which position\n    // channel is the measure (quantitative), which lives in the resolved\n    // semantics, not the bare field binding. Mirrors the VL assembler's\n    // `typedRawEncodings` step (a cheap preliminary semantics pass).\n    const prelimConverted = convertTemporalData(data, semanticTypes);\n    const prelimSemantics = resolveChannelSemantics(\n        normalized.encodings, data, semanticTypes, prelimConverted,\n    );\n    const typedRawEncodings: Record<string, ChartEncoding> = {};\n    for (const [ch, enc] of Object.entries(normalized.encodings)) {\n        typedRawEncodings[ch] = enc.type ? enc : { ...enc, type: prelimSemantics[ch]?.type };\n    }\n\n    // Transform (derived Category-B operator): same two-control model as VL —\n    // chartProperties.chartType (θ) + chartProperties.arrange (τ/σ/γ). Legacy\n    // composed `pivot` ids are migrated inside applyTransform. See\n    // design-docs/chart-transform-two-axes.md.\n    const authoredTemplate = chartTemplate;\n    const transformed = applyTransform(chartTemplate, typedRawEncodings, data, chartProperties, plGetTemplateDef);\n    if (transformed.chartType && transformed.chartType !== chartType) {\n        const swapped = plGetTemplateDef(transformed.chartType) as ChartTemplateDef | undefined;\n        if (swapped) chartTemplate = swapped;\n    }\n    const encodings = applyEncodingOverrides(chartTemplate, transformed.encodings, chartProperties);\n\n    // Optional aggregation transform — see vegalite/assemble for rationale.\n    data = applyAggregation(encodings, data);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 0: Resolve Semantics (shared — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const tplMark = chartTemplate.template?.mark;\n    const templateMarkType = typeof tplMark === 'string' ? tplMark : tplMark?.type;\n\n    const convertedData = convertTemporalData(data, semanticTypes);\n\n    const channelSemantics = resolveChannelSemantics(\n        encodings, data, semanticTypes, convertedData,\n    );\n\n    // Finalize zero-baseline (requires template mark knowledge)\n    const effectiveMarkType = templateMarkType || 'point';\n    for (const [channel, cs] of Object.entries(channelSemantics)) {\n        if ((channel === 'x' || channel === 'y') && cs.type === 'quantitative') {\n            const numericValues = data\n                .map(r => r[cs.field])\n                .filter((v: any) => v != null && typeof v === 'number' && !isNaN(v));\n            cs.zero = computeZeroDecision(\n                cs.semanticAnnotation.semanticType, channel, effectiveMarkType, numericValues,\n            );\n        }\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0a: declareLayoutMode (shared hook)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const declaration: LayoutDeclaration = chartTemplate.declareLayoutMode\n        ? chartTemplate.declareLayoutMode(channelSemantics, data, chartProperties)\n        : {};\n\n    const effectiveOptions: AssembleOptions = {\n        // Plotly fills its plot area natively (bars sized by `bargap`), so sparse\n        // categories spread out. Allow bands to expand well past the base size,\n        // matching Plotly's official low-cardinality bar style, but cap it so one\n        // or two bars don't span the whole canvas.\n        maxBandSize: 100,\n        // Plotly native font defaults (ticks/legend 12, axis titles 14).\n        baseLabelFontSize: 12,\n        baseTitleFontSize: 14,\n        ...options,\n        ...(declaration.paramOverrides || {}),\n    };\n\n    Object.assign(effectiveOptions, deriveStretchCaps(baseSize, sizeCeiling, effectiveOptions));\n    effectiveOptions.facetColumns = resolveFacetColumnsOption(input.chart_spec.chartProperties);\n\n    const {\n        addTooltips: addTooltipsOpt = false,\n    } = effectiveOptions;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // STEP 0b: filterOverflow (shared)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const allMarkTypes = new Set<string>();\n    if (templateMarkType) allMarkTypes.add(templateMarkType);\n\n    const budgets = computeChannelBudgets(\n        channelSemantics, declaration, convertedData, canvasSize, effectiveOptions,\n    );\n    const facetGridResult = budgets.facetGrid;\n\n    const overflowResult = filterOverflow(\n        channelSemantics, declaration, encodings, convertedData,\n        budgets, allMarkTypes,\n    );\n\n    const values = overflowResult.filteredData;\n    warnings.push(...overflowResult.warnings);\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 1: Compute Layout (shared — completely target-agnostic)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const layoutResult = computeLayout(\n        channelSemantics,\n        declaration,\n        values,\n        canvasSize,\n        effectiveOptions,\n        facetGridResult,\n    );\n\n    layoutResult.truncations = overflowResult.truncations;\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // PHASE 2: Instantiate Plotly Figure (PL-specific)\n    // ═══════════════════════════════════════════════════════════════════════\n\n    const resolvedEncodings: Record<string, any> = {};\n    for (const [channel, encoding] of Object.entries(encodings)) {\n        const cs = channelSemantics[channel];\n        if (cs) {\n            resolvedEncodings[channel] = {\n                field: cs.field,\n                type: cs.type,\n                aggregate: encoding.aggregate,\n            };\n        }\n    }\n\n    const instantiateContext: InstantiateContext = {\n        channelSemantics,\n        layout: layoutResult,\n        table: values,\n        fullTable: convertedData,\n        resolvedEncodings,\n        encodings,\n        chartProperties,\n        staticSeries,\n        canvasSize,\n        semanticTypes,\n        chartType,\n        assembleOptions: effectiveOptions,\n        colorDecisions: decideColorMaps({\n            chartType,\n            encodings,\n            channelSemantics,\n            table: values,\n            background: 'light',\n        }),\n    };\n\n    const colField = channelSemantics.column?.field;\n    const rowField = channelSemantics.row?.field;\n    // Multi-panel faceting only applies to axis-based (cartesian) templates.\n    // Axis-less charts (Pie, Donut, Radar, Rose, Gauge, Funnel, KPI Card) use\n    // `column` (when they declare it at all) for their own internal grouping\n    // — e.g. one gauge dial per column value — and lay that out themselves,\n    // exactly mirroring the ECharts backend's `hasAxes` gate.\n    const hasAxes = chartTemplate.channels.includes('x') || chartTemplate.channels.includes('y');\n    // A template can also opt out explicitly (`selfManagesFacets`) even though\n    // it DOES declare x/y — composite multi-panel layouts (Sparkline, Bar\n    // Table) already span several internal axis pairs of their own, so the\n    // generic single-axis-pair-per-panel combiner (`facet.ts`) cannot safely\n    // recombine N pre-split instantiations of them. These templates read\n    // `column`/`row` straight off `channelSemantics` themselves instead.\n    const hasFacet = !!(colField || rowField) && hasAxes && !chartTemplate.selfManagesFacets;\n\n    let figure: any;\n    if (hasFacet) {\n        const colValues = colField ? [...new Set(values.map((r: any) => String(r[colField])))] : [''];\n        const rowValues = rowField ? [...new Set(values.map((r: any) => String(r[rowField])))] : [''];\n\n        // Shared y-domain across panels (mirror the Chart.js backend): nice\n        // bounds so the shared top/bottom land on round tick values.\n        const yField = channelSemantics.y?.field;\n        let sharedYDomain: { min: number; max: number } | undefined;\n        if (yField) {\n            const nums = values\n                .map((r: any) => r[yField])\n                .filter((v: any) => typeof v === 'number' && Number.isFinite(v)) as number[];\n            if (nums.length > 0) {\n                const rawMin = Math.min(...nums);\n                const rawMax = Math.max(...nums);\n                const forceZero = !!channelSemantics.y?.zero?.zero;\n                const min = forceZero ? Math.min(0, rawMin) : rawMin;\n                const max = forceZero ? Math.max(0, rawMax) : rawMax;\n                sharedYDomain = niceBounds(min, max);\n            }\n        }\n\n        // Column wrapping: a column-only facet with more categories than fit\n        // in one row wraps into a 2D grid (matching the other backends). The\n        // wrap width comes from the shared facet-grid budget.\n        const maxColsPerRow = (colField && !rowField)\n            ? (facetGridResult?.columns ?? colValues.length)\n            : colValues.length;\n        const wrapColumnOnly = !!colField && !rowField && maxColsPerRow < colValues.length;\n\n        const gridRows: Array<Array<{ colVal: string; rowVal: string }>> = [];\n        if (wrapColumnOnly) {\n            for (let i = 0; i < colValues.length; i += maxColsPerRow) {\n                gridRows.push(\n                    colValues.slice(i, i + maxColsPerRow).map((cv) => ({ colVal: cv, rowVal: '' })),\n                );\n            }\n        } else {\n            for (let ri = 0; ri < rowValues.length; ri++) {\n                gridRows.push(colValues.map((cv) => ({ colVal: cv, rowVal: rowValues[ri] })));\n            }\n        }\n        const gridCols = Math.max(1, ...gridRows.map(r => r.length));\n\n        // Panel plot size — same discrete/continuous rules as plApplyLayoutToSpec.\n        const xIsDiscrete = layoutResult.xNominalCount > 0 || layoutResult.xContinuousAsDiscrete > 0;\n        const yIsDiscrete = layoutResult.yNominalCount > 0 || layoutResult.yContinuousAsDiscrete > 0;\n        let panelWidth: number;\n        let panelHeight: number;\n        if (xIsDiscrete && layoutResult.xStepUnit !== 'group') {\n            const n = layoutResult.xNominalCount || layoutResult.xContinuousAsDiscrete || 0;\n            panelWidth = n > 0 ? layoutResult.xStep * n : (layoutResult.subplotWidth || canvasSize.width);\n        } else {\n            panelWidth = layoutResult.subplotWidth || canvasSize.width;\n        }\n        if (yIsDiscrete && layoutResult.yStepUnit !== 'group') {\n            const n = layoutResult.yNominalCount || layoutResult.yContinuousAsDiscrete || 0;\n            panelHeight = n > 0 ? layoutResult.yStep * n : (layoutResult.subplotHeight || canvasSize.height);\n        } else {\n            panelHeight = layoutResult.subplotHeight || canvasSize.height;\n        }\n\n        const panels: PlotlyFacetPanel[] = [];\n        for (let ri = 0; ri < gridRows.length; ri++) {\n            const cells = gridRows[ri];\n            for (let ci = 0; ci < cells.length; ci++) {\n                const { colVal, rowVal } = cells[ci];\n                const panelData = values.filter((r: any) => {\n                    if (colField && String(r[colField]) !== colVal) return false;\n                    if (rowField && String(r[rowField]) !== rowVal) return false;\n                    return true;\n                });\n\n                const panelFigure: any = structuredClone(chartTemplate.template);\n                const panelContext: InstantiateContext = {\n                    ...instantiateContext,\n                    table: panelData,\n                };\n                chartTemplate.instantiate(panelFigure, panelContext);\n                if (chartTemplate.postProcess) chartTemplate.postProcess(panelFigure, panelContext);\n\n                panels.push({\n                    rowIndex: ri,\n                    colIndex: ci,\n                    rowHeader: rowField ? rowVal : undefined,\n                    colHeader: colField ? colVal : undefined,\n                    figure: panelFigure,\n                });\n            }\n        }\n\n        figure = plCombineFacetPanels(panels, {\n            rows: gridRows.length,\n            cols: gridCols,\n            panelWidth,\n            panelHeight,\n            sharedYDomain,\n            hasColHeader: !!colField,\n            hasRowHeader: !!rowField,\n            colHeaderPerRow: wrapColumnOnly,\n            showLegend: !!channelSemantics.color?.field,\n        });\n\n        // Apply the shared x-label rotation / font decisions to every panel axis.\n        if (layoutResult.xLabel) {\n            for (const key of Object.keys(figure.layout)) {\n                if (!/^xaxis\\d*$/.test(key)) continue;\n                const ax = figure.layout[key];\n                if (layoutResult.xLabel.labelAngle) {\n                    ax.tickangle = Math.abs(layoutResult.xLabel.labelAngle);\n                }\n                if (layoutResult.xLabel.fontSize) {\n                    ax.tickfont = { ...(ax.tickfont || {}), size: layoutResult.xLabel.fontSize };\n                }\n            }\n        }\n        plApplyCartesianAxisSpacing(figure);\n        plApplyAxisProperties(figure, instantiateContext);\n        if (addTooltipsOpt) plApplyTooltips(figure);\n    } else {\n        figure = structuredClone(chartTemplate.template);\n        chartTemplate.instantiate(figure, instantiateContext);\n        plApplyLayoutToSpec(figure, instantiateContext, warnings);\n        plApplyAxisProperties(figure, instantiateContext);\n        if (addTooltipsOpt) plApplyTooltips(figure);\n        if (chartTemplate.postProcess) chartTemplate.postProcess(figure, instantiateContext);\n    }\n\n    // ═══════════════════════════════════════════════════════════════════════\n    // RESULT\n    // ═══════════════════════════════════════════════════════════════════════\n\n    if (warnings.length > 0) {\n        figure._warnings = warnings;\n    }\n\n    figure._dataLength = values.length;\n\n    if (transformed.surface) {\n        figure._transform = transformed.surface;\n    }\n    // Legacy single-control surface for getPlotlyPivot — enumerated from the\n    // authored template so ids/labels match the pre-split contract.\n    const legacyPivot = applyPivot(authoredTemplate, typedRawEncodings, data, chartProperties, plGetTemplateDef);\n    if (legacyPivot.surface) {\n        figure._pivot = legacyPivot.surface;\n    }\n\n    return figure;\n}\n\n/** Inspect the Plotly legacy (composed) view transformation surface for an input. */\nexport function getPlotlyPivot(input: ChartAssemblyInput): PivotSurface | undefined {\n    const spec = assemblePlotly(input);\n    return spec && spec._pivot ? (spec._pivot as PivotSurface) : undefined;\n}\n\n/** Inspect the Plotly two-control transform surface for an input. */\nexport function getPlotlyTransform(input: ChartAssemblyInput): TransformSurface | undefined {\n    const spec = assemblePlotly(input);\n    return spec && spec._transform ? (spec._transform as TransformSurface) : undefined;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Excel chart-type mapping + FormatSpec → Excel number format.\n *\n * Excel's native chart types are a fixed enum (`Excel.ChartType`), so a Flint\n * chart type maps to the closest native Excel chart. Orientation (vertical vs\n * horizontal) is decided by the assembler from channel semantics and selects\n * the Column* vs Bar* family.\n */\n\nimport type { FormatSpec } from '../core/field-semantics';\n\n/** Which native Excel family a Flint chart maps to. */\nexport interface ExcelTypeMapping {\n    /** Vertical (category on x) Excel.ChartType. */\n    vertical: string;\n    /** Horizontal (category on y) Excel.ChartType, when the family supports it. */\n    horizontal?: string;\n    /** True for pie/doughnut/… charts that have no value/category axes. */\n    noAxes?: boolean;\n    /** True for XY (both-measure) charts. */\n    xy?: boolean;\n}\n\n/** Flint chart type (display name) → Excel chart family. */\nexport const EXCEL_TYPE_MAP: Record<string, ExcelTypeMapping> = {\n    'Bar Chart': { vertical: 'ColumnClustered', horizontal: 'BarClustered' },\n    'Grouped Bar Chart': { vertical: 'ColumnClustered', horizontal: 'BarClustered' },\n    'Stacked Bar Chart': { vertical: 'ColumnStacked', horizontal: 'BarStacked' },\n    'Pyramid Chart': { vertical: 'BarStacked', horizontal: 'BarStacked' },\n    'Histogram': { vertical: 'ColumnClustered' },\n    'Line Chart': { vertical: 'Line' },\n    'Area Chart': { vertical: 'Area', horizontal: undefined },\n    'Scatter Plot': { vertical: 'XYScatter', xy: true },\n    'Connected Scatter Plot': { vertical: 'XYScatterLines', xy: true },\n    'Pie Chart': { vertical: 'Pie', noAxes: true },\n    'Donut Chart': { vertical: 'Doughnut', noAxes: true },\n    'Boxplot': { vertical: 'BoxWhisker' },\n    'Candlestick Chart': { vertical: 'StockOHLC' },\n    'Waterfall Chart': { vertical: 'Waterfall' },\n    'Radar Chart': { vertical: 'RadarMarkers' },\n    'Funnel Chart': { vertical: 'Funnel', noAxes: true },\n    'Treemap': { vertical: 'Treemap', noAxes: true },\n    'Sunburst Chart': { vertical: 'Sunburst', noAxes: true },\n};\n\n/** Chart types this backend can render natively in Excel. */\nexport function isExcelSupported(flintChartType: string): boolean {\n    return flintChartType in EXCEL_TYPE_MAP;\n}\n\n/**\n * Map a Flint {@link FormatSpec} to an Excel number-format string.\n *\n * Excel formats are pattern strings (`\"$#,##0\"`, `\"0.0%\"`, `\"#,##0\"`), distinct\n * from d3/Vega patterns, so we translate from the FormatSpec's intent (prefix,\n * suffix, abbreviate) rather than its d3 `pattern`.\n */\nexport function formatSpecToExcel(fmt: FormatSpec | undefined): string | undefined {\n    if (!fmt) return undefined;\n    const prefix = fmt.prefix ?? '';\n    const suffix = fmt.suffix ?? '';\n    const pat = fmt.pattern ?? '';\n\n    // percent\n    if (suffix === '%' || pat.includes('%')) {\n        const decimals = decimalsFromPattern(pat);\n        return decimals > 0 ? `0.${'0'.repeat(decimals)}%` : '0%';\n    }\n\n    // decide the numeric core\n    const decimals = decimalsFromPattern(pat);\n    let core = decimals > 0 ? `#,##0.${'0'.repeat(decimals)}` : '#,##0';\n    if (fmt.abbreviate) core = '#,##0,\"K\"'; // thousands abbreviation (approx)\n\n    const pre = prefix ? escapeLiteral(prefix) : '';\n    const suf = suffix ? escapeLiteral(suffix) : '';\n    if (!pre && !suf && !fmt.abbreviate && decimals === 0) return 'General';\n    return `${pre}${core}${suf}`;\n}\n\n/** Number of fractional digits requested by a d3-ish pattern (best-effort). */\nfunction decimalsFromPattern(pat: string): number {\n    const m = pat.match(/\\.(\\d+)/);\n    return m ? Number(m[1]) : 0;\n}\n\n/** Wrap non-numeric literal text so Excel treats it literally in a format. */\nfunction escapeLiteral(s: string): string {\n    // A leading/trailing currency symbol is fine bare; wrap other text in quotes.\n    if (s === '$' || s === '€' || s === '£' || s === '¥') return s;\n    return `\"${s}\"`;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelAreaChartDef: ExcelTemplateDef = {\n    chart: 'Area Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'Area' },\n    validate: ({ typeOf }) => typeOf('y') !== 'quantitative'\n        ? 'requires a quantitative y field for a native Excel area chart'\n        : undefined,\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelBarChartDef: ExcelTemplateDef = {\n    chart: 'Bar Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'ColumnClustered', horizontal: 'BarClustered' },\n    validate: ({ typeOf }) => typeOf('x') !== 'quantitative' && typeOf('y') !== 'quantitative'\n        ? 'requires one quantitative measure axis for a native Excel bar chart'\n        : undefined,\n};\n\nexport const excelGroupedBarChartDef: ExcelTemplateDef = {\n    chart: 'Grouped Bar Chart',\n    channels: ['x', 'y', 'group'],\n    typeMapping: { vertical: 'ColumnClustered', horizontal: 'BarClustered' },\n    validate: (context) => excelBarChartDef.validate?.(context)\n        ?? (context.typeOf('group') === 'quantitative' || context.typeOf('group') === 'temporal'\n            ? 'does not support continuous grouping in a native Excel grouped bar chart'\n            : undefined),\n};\n\nexport const excelStackedBarChartDef: ExcelTemplateDef = {\n    chart: 'Stacked Bar Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'ColumnStacked', horizontal: 'BarStacked' },\n    validate: (context) => excelBarChartDef.validate?.(context)\n        ?? (context.typeOf('color') === 'quantitative' || context.typeOf('color') === 'temporal'\n            ? 'does not support continuous color in a native Excel stacked bar chart'\n            : undefined),\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { formatSpecToExcel } from '../chart-types';\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelBoxplotDef: ExcelTemplateDef = {\n    chart: 'Boxplot',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'BoxWhisker' },\n    validate: ({ input, fieldOf, typeOf }) => {\n        if (!fieldOf('x') || typeOf('x') === 'temporal') {\n            return 'requires a categorical x field for a native Excel box and whisker chart';\n        }\n        if (!fieldOf('y') || typeOf('y') !== 'quantitative') {\n            return 'requires a quantitative y field for a native Excel box and whisker chart';\n        }\n        if (fieldOf('color')) {\n            return 'does not yet support color-grouped native Excel box and whisker charts';\n        }\n        if (fieldOf('column') || fieldOf('row')) {\n            return 'does not support faceting in one native Excel box and whisker chart';\n        }\n        if (input.chart_spec.chartProperties?.whiskerMethod === 'minmax') {\n            return 'does not support min-max whiskers because Office.js exposes no native BoxWhisker whisker-method control';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, semantics, fieldOf }) => {\n        const categoryField = fieldOf('x')!;\n        const valueField = fieldOf('y')!;\n        const rows = table.filter((row) => row[categoryField] != null && Number.isFinite(Number(row[valueField])));\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        const properties = input.chart_spec.chartProperties;\n\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'BoxWhisker',\n            title: `${valueField} by ${categoryField}`,\n            seriesBy: 'Columns',\n            data: [\n                [categoryField, valueField],\n                ...rows.map((row) => [String(row[categoryField]), Number(row[valueField])]),\n            ],\n            categoryAxis: { title: categoryField },\n            valueAxis: {\n                title: valueField,\n                numberFormat: formatSpecToExcel(semantics.y?.format),\n            },\n            legend: { visible: false },\n            boxWhiskerOptions: {\n                quartileCalculation: 'Inclusive',\n                showInnerPoints: false,\n                showMeanLine: false,\n                showMeanMarker: false,\n                showOutlierPoints: properties?.showOutliers !== false,\n            },\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Boxplot', categoryField, valueField, rawObservations: rows.length },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { formatSpecToExcel } from '../chart-types';\nimport type { ExcelTemplateDef } from './types';\n\nconst PRICE_CHANNELS = ['open', 'high', 'low', 'close'] as const;\nconst EXCEL_EPOCH = Date.UTC(1899, 11, 30);\nconst DAY_MILLISECONDS = 24 * 60 * 60 * 1000;\n\nfunction excelDateSerial(value: unknown): number {\n    return (new Date(value as string | number | Date).getTime() - EXCEL_EPOCH) / DAY_MILLISECONDS;\n}\n\nfunction niceStep(span: number): number {\n    const rough = span / 5;\n    const power = 10 ** Math.floor(Math.log10(rough));\n    const fraction = rough / power;\n    return (fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10) * power;\n}\n\nexport const excelCandlestickDef: ExcelTemplateDef = {\n    chart: 'Candlestick Chart',\n    channels: ['x', 'open', 'high', 'low', 'close'],\n    typeMapping: { vertical: 'StockOHLC' },\n    validate: ({ table, fieldOf, typeOf }) => {\n        const xField = fieldOf('x');\n        if (!xField || !['temporal', 'ordinal'].includes(typeOf('x') ?? '')) {\n            return 'requires a temporal or ordered x field for a native Excel stock chart';\n        }\n        for (const channel of PRICE_CHANNELS) {\n            if (!fieldOf(channel) || typeOf(channel) !== 'quantitative') {\n                return `requires a quantitative ${channel} field for a native Excel stock chart`;\n            }\n        }\n        if (fieldOf('color') || fieldOf('group') || fieldOf('detail')) {\n            return 'does not support color, group, or detail encodings in a native Excel stock chart';\n        }\n        if (table.length === 0) {\n            return 'requires at least one OHLC row for a native Excel stock chart';\n        }\n\n        let previousTime = Number.NEGATIVE_INFINITY;\n        for (const [index, row] of table.entries()) {\n            const time = new Date(row[xField]).getTime();\n            if (!Number.isFinite(time)) {\n                return `requires a valid date at row ${index + 1} for a native Excel stock chart`;\n            }\n            if (time <= previousTime) {\n                return 'requires x values sorted in strictly increasing chronological order for a native Excel stock chart';\n            }\n            previousTime = time;\n\n            const rawPrices = PRICE_CHANNELS.map((channel) => row[fieldOf(channel)!]);\n            const [open, high, low, close] = rawPrices.map(Number);\n            if (rawPrices.some((value) => value == null || value === '') || ![open, high, low, close].every(Number.isFinite)) {\n                return `requires finite open, high, low, and close values at row ${index + 1} for a native Excel stock chart`;\n            }\n            if (high < Math.max(open, low, close) || low > Math.min(open, high, close)) {\n                return `requires coherent OHLC values at row ${index + 1} (high >= open/close/low and low <= open/close/high)`;\n            }\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, semantics, fieldOf }) => {\n        const xField = fieldOf('x')!;\n        const fields = PRICE_CHANNELS.map((channel) => fieldOf(channel)!);\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        const labelBudget = Math.max(12, Math.floor((base.width - 90) / 14));\n        const tickLabelSpacing = table.length > labelBudget ? Math.ceil(table.length / labelBudget) : undefined;\n        const lows = table.map((row) => Number(row[fields[2]]));\n        const highs = table.map((row) => Number(row[fields[1]]));\n        const minimum = Math.min(...lows);\n        const maximum = Math.max(...highs);\n        const majorUnit = niceStep(Math.max(maximum - minimum, Math.abs(maximum) * 0.1, 1));\n        const minimumScale = Math.floor(minimum / majorUnit) * majorUnit;\n        const maximumScale = Math.ceil(maximum / majorUnit) * majorUnit;\n\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'StockOHLC',\n            title: `${fields[3]} by ${xField}`,\n            seriesBy: 'Columns',\n            data: [\n                [xField, ...fields],\n                ...table.map((row) => [\n                    excelDateSerial(row[xField]),\n                    ...fields.map((field) => Number(row[field])),\n                ]),\n            ],\n            categoryAxis: { title: xField, numberFormat: 'yyyy-mm-dd', tickLabelSpacing },\n            valueAxis: {\n                title: 'Price',\n                numberFormat: formatSpecToExcel(semantics.close?.format),\n                minimumScale,\n                maximumScale: maximumScale === maximum ? maximumScale + majorUnit : maximumScale,\n                majorUnit,\n            },\n            legend: { visible: false },\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Candlestick Chart', xField, priceFields: fields },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { formatSpecToExcel } from '../chart-types';\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelFunnelChartDef: ExcelTemplateDef = {\n    chart: 'Funnel Chart',\n    channels: ['y', 'size'],\n    typeMapping: { vertical: 'Funnel', noAxes: true },\n    validate: ({ table, fieldOf, typeOf }) => {\n        if (!fieldOf('y') || typeOf('y') === 'quantitative') {\n            return 'requires a categorical y stage field for a native Excel funnel chart';\n        }\n        if (typeOf('size') !== 'quantitative') {\n            return 'requires a quantitative size field for a native Excel funnel chart';\n        }\n        const valueField = fieldOf('size')!;\n        if (table.some((row) => Number.isFinite(Number(row[valueField])) && Number(row[valueField]) < 0)) {\n            return 'requires non-negative values for a native Excel funnel chart';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, semantics, fieldOf }) => {\n        const stageField = fieldOf('y')!;\n        const valueField = fieldOf('size')!;\n        const stageValues = new Map<string, number>();\n        for (const row of table) {\n            const stage = row[stageField];\n            const value = Number(row[valueField]);\n            if (stage == null || !Number.isFinite(value)) continue;\n            const label = String(stage);\n            stageValues.set(label, (stageValues.get(label) ?? 0) + value);\n        }\n\n        const rows = [...stageValues.entries()];\n        const sort = input.chart_spec.chartProperties?.sort ?? 'descending';\n        if (sort === 'descending') rows.sort((left, right) => right[1] - left[1]);\n        if (sort === 'ascending') rows.sort((left, right) => left[1] - right[1]);\n\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'Funnel',\n            title: `${valueField} by ${stageField}`,\n            seriesBy: 'Columns',\n            data: [[stageField, valueField], ...rows],\n            legend: { visible: false },\n            dataLabels: {\n                visible: true,\n                numberFormat: formatSpecToExcel(semantics.size?.format),\n                fontColor: '#FFFFFF',\n                fontSize: 11,\n            },\n            seriesFormats: [{ color: '#4472C4' }],\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: {\n                flintType: 'Funnel Chart',\n                stageField,\n                valueField,\n                sort,\n                valueNumberFormat: formatSpecToExcel(semantics.size?.format),\n            },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nfunction niceBinStep(minimum: number, maximum: number, maxBins: number): number {\n    const raw = Math.max(Number.EPSILON, maximum - minimum) / Math.max(1, maxBins);\n    const power = 10 ** Math.floor(Math.log10(raw));\n    const error = raw / power;\n    const factor = error >= 5 ? 10 : error >= 2 ? 5 : error >= 1 ? 2 : 1;\n    return factor * power;\n}\n\nexport const excelHistogramDef: ExcelTemplateDef = {\n    chart: 'Histogram',\n    channels: ['x', 'color'],\n    typeMapping: { vertical: 'ColumnClustered' },\n    validate: ({ fieldOf, typeOf }) => {\n        const valueChannel = fieldOf('x') ? 'x' : 'y';\n        return !fieldOf(valueChannel) || typeOf(valueChannel) !== 'quantitative'\n            ? 'requires a quantitative value field for a native Excel histogram'\n            : undefined;\n    },\n    instantiate: ({ input, table, fieldOf }) => {\n        const valueField = fieldOf('x') ?? fieldOf('y')!;\n        const values = table.map((row) => Number(row[valueField])).filter(Number.isFinite);\n        if (values.length === 0) throw new Error('Excel histogram requires finite numeric values.');\n\n        const requestedBins = Number(input.chart_spec.chartProperties?.binCount);\n        const maxBins = Number.isFinite(requestedBins) && requestedBins > 0\n            ? Math.max(1, Math.round(requestedBins))\n            : 10;\n        const minimum = Math.min(...values);\n        const maximum = Math.max(...values);\n        const binWidth = maximum > minimum ? niceBinStep(minimum, maximum, maxBins) : 1;\n        const binMinimum = Math.floor(minimum / binWidth) * binWidth;\n        const binMaximum = Math.ceil(maximum / binWidth) * binWidth;\n        const binCount = Math.max(1, Math.round((binMaximum - binMinimum) / binWidth));\n        const labels = Array.from({ length: binCount }, (_value, index) => {\n            const lower = binMinimum + index * binWidth;\n            const upper = binMinimum + (index + 1) * binWidth;\n            return `${Number(lower.toFixed(2))}-${Number(upper.toFixed(2))}`;\n        });\n        const colorField = fieldOf('color');\n        const seriesKeys = colorField\n            ? [...new Set(table.map((row) => String(row[colorField])))]\n            : ['Count'];\n        const seriesCounts = seriesKeys.map(() => new Array(binCount).fill(0));\n        for (const row of table) {\n            const value = Number(row[valueField]);\n            if (!Number.isFinite(value)) continue;\n            const binIndex = Math.min(\n                binCount - 1,\n                Math.max(0, Math.floor((value - binMinimum) / binWidth)),\n            );\n            const seriesIndex = colorField ? seriesKeys.indexOf(String(row[colorField])) : 0;\n            if (seriesIndex >= 0) seriesCounts[seriesIndex][binIndex] += 1;\n        }\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: colorField ? 'ColumnStacked' : 'ColumnClustered',\n            title: `Distribution of ${valueField}`,\n            seriesBy: 'Columns',\n            data: [\n                [valueField, ...seriesKeys],\n                ...labels.map((label, index) => [label, ...seriesCounts.map((series) => series[index])]),\n            ],\n            categoryAxis: { title: valueField },\n            valueAxis: { title: 'Count', numberFormat: '0' },\n            legend: { visible: Boolean(colorField), position: 'Bottom' },\n            gapWidth: 0,\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Histogram', valueField, colorField, binCount, binMinimum, binMaximum },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelLineChartDef: ExcelTemplateDef = {\n    chart: 'Line Chart',\n    channels: ['x', 'y', 'color', 'strokeDash'],\n    typeMapping: { vertical: 'Line' },\n    validate: ({ typeOf }) => {\n        if (typeOf('y') !== 'quantitative') {\n            return 'requires a quantitative y field for a native Excel line chart';\n        }\n        if (typeOf('color') === 'quantitative' || typeOf('color') === 'temporal') {\n            return 'does not support continuous color on a native Excel line chart';\n        }\n        return undefined;\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelPieChartDef: ExcelTemplateDef = {\n    chart: 'Pie Chart',\n    channels: ['color', 'size', 'theta'],\n    typeMapping: { vertical: 'Pie', noAxes: true },\n};\n\nexport const excelDonutChartDef: ExcelTemplateDef = {\n    chart: 'Donut Chart',\n    channels: ['color', 'size', 'theta'],\n    typeMapping: { vertical: 'Doughnut', noAxes: true },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { formatSpecToExcel } from '../chart-types';\nimport type { ExcelTemplateDef } from './types';\n\nfunction niceMaximum(value: number): { maximum: number; majorUnit: number } {\n    const roughStep = Math.max(value, 1) / 5;\n    const power = 10 ** Math.floor(Math.log10(roughStep));\n    const fraction = roughStep / power;\n    const majorUnit = (fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10) * power;\n    return { maximum: Math.ceil(value / majorUnit) * majorUnit, majorUnit };\n}\n\nfunction absoluteNumberFormat(format: string | undefined): string {\n    const positive = !format || format === 'General' ? '#,##0' : format;\n    return `${positive};${positive};0`;\n}\n\nexport const excelPyramidChartDef: ExcelTemplateDef = {\n    chart: 'Pyramid Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'BarStacked', horizontal: 'BarStacked' },\n    validate: ({ table, fieldOf, typeOf }) => {\n        const xIsMeasure = typeOf('x') === 'quantitative';\n        const yIsMeasure = typeOf('y') === 'quantitative';\n        if (xIsMeasure === yIsMeasure) {\n            return 'requires exactly one quantitative measure axis for a native Excel pyramid chart';\n        }\n        const categoryChannel = xIsMeasure ? 'y' : 'x';\n        if (!fieldOf(categoryChannel) || typeOf(categoryChannel) === 'quantitative') {\n            return 'requires a discrete category axis for a native Excel pyramid chart';\n        }\n        const groupField = fieldOf('color');\n        if (!groupField || ['quantitative', 'temporal'].includes(typeOf('color') ?? '')) {\n            return 'requires a discrete color field for a native Excel pyramid chart';\n        }\n        const groups = [...new Set(table.map((row) => row[groupField]).filter((value) => value != null))];\n        if (groups.length !== 2) {\n            return `requires exactly two groups for a native Excel pyramid chart (found ${groups.length})`;\n        }\n        const measureField = fieldOf(xIsMeasure ? 'x' : 'y')!;\n        if (table.some((row) => Number.isFinite(Number(row[measureField])) && Number(row[measureField]) < 0)) {\n            return 'requires non-negative values for a native Excel pyramid chart';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, semantics, fieldOf, typeOf }) => {\n        const measureChannel = typeOf('x') === 'quantitative' ? 'x' : 'y';\n        const categoryChannel = measureChannel === 'x' ? 'y' : 'x';\n        const measureField = fieldOf(measureChannel)!;\n        const categoryField = fieldOf(categoryChannel)!;\n        const groupField = fieldOf('color')!;\n        const categories = [...new Set(table.map((row) => row[categoryField]).filter((value) => value != null))];\n        const groups = [...new Set(table.map((row) => row[groupField]).filter((value) => value != null))];\n        const totals = new Map<string, number>();\n        for (const row of table) {\n            const category = row[categoryField];\n            const group = row[groupField];\n            const value = Number(row[measureField]);\n            if (category == null || group == null || !Number.isFinite(value)) continue;\n            const key = `${String(category)}\\u0000${String(group)}`;\n            totals.set(key, (totals.get(key) ?? 0) + value);\n        }\n        const valueAt = (category: unknown, group: unknown): number | null => {\n            const value = totals.get(`${String(category)}\\u0000${String(group)}`);\n            return value === undefined ? null : value;\n        };\n        const maximumValue = Math.max(0, ...totals.values());\n        const { maximum, majorUnit } = niceMaximum(maximumValue);\n        const numberFormat = formatSpecToExcel(semantics[measureChannel]?.format);\n        const base = input.chart_spec.baseSize ?? { width: 560, height: 360 };\n\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'BarStacked',\n            title: `${measureField} by ${categoryField} and ${groupField}`,\n            seriesBy: 'Columns',\n            data: [\n                [categoryField, ...groups.map(String)],\n                ...categories.map((category) => {\n                    const leftValue = valueAt(category, groups[0]);\n                    return [\n                        String(category),\n                        leftValue === null ? null : -leftValue,\n                        valueAt(category, groups[1]),\n                    ];\n                }),\n            ],\n            categoryAxis: { title: categoryField, reversePlotOrder: true },\n            valueAxis: {\n                title: measureField,\n                numberFormat: absoluteNumberFormat(numberFormat),\n                minimumScale: -maximum,\n                maximumScale: maximum,\n                majorUnit,\n            },\n            legend: { visible: true, position: 'Bottom' },\n            seriesFormats: [{ color: '#4472C4' }, { color: '#C55A5A' }],\n            gapWidth: 45,\n            overlap: 100,\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: {\n                flintType: 'Pyramid Chart',\n                categoryField,\n                measureField,\n                groupField,\n                groups: groups.map(String),\n            },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nfunction niceMaximum(value: number): number {\n    if (!(value > 0)) return 1;\n    const power = 10 ** Math.floor(Math.log10(value));\n    const fraction = value / power;\n    const niceFraction = fraction <= 1 ? 1\n        : fraction <= 2 ? 2\n        : fraction <= 2.5 ? 2.5\n        : fraction <= 5 ? 5\n        : 10;\n    return niceFraction * power;\n}\n\nexport const excelRadarChartDef: ExcelTemplateDef = {\n    chart: 'Radar Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'RadarMarkers' },\n    validate: ({ table, fieldOf, typeOf }) => {\n        if (!fieldOf('x') || typeOf('x') === 'quantitative' || typeOf('x') === 'temporal') {\n            return 'requires a categorical metric x field for a native Excel radar chart';\n        }\n        if (!fieldOf('y') || typeOf('y') !== 'quantitative') {\n            return 'requires a quantitative y field for a native Excel radar chart';\n        }\n        if (fieldOf('color') && (typeOf('color') === 'quantitative' || typeOf('color') === 'temporal')) {\n            return 'requires a discrete color field for native Excel radar series';\n        }\n        if (fieldOf('column') || fieldOf('row')) {\n            return 'does not support faceting in one native Excel radar chart';\n        }\n        const valueField = fieldOf('y')!;\n        if (table.some((row) => Number(row[valueField]) < 0)) {\n            return 'requires non-negative values for a native Excel radar chart';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, fieldOf }) => {\n        const metricField = fieldOf('x')!;\n        const valueField = fieldOf('y')!;\n        const seriesField = fieldOf('color');\n        const metrics = [...new Set(table.map((row) => String(row[metricField])))];\n        if (metrics.length < 3) {\n            throw new Error('Excel radar chart requires at least three metric axes.');\n        }\n        const seriesKeys = seriesField\n            ? [...new Set(table.map((row) => String(row[seriesField])))]\n            : [valueField];\n        const metricMaximums = new Map(metrics.map((metric) => {\n            const values = table\n                .filter((row) => String(row[metricField]) === metric)\n                .map((row) => Number(row[valueField]))\n                .filter(Number.isFinite);\n            return [metric, niceMaximum(values.length > 0 ? Math.max(...values) : 1)] as const;\n        }));\n        const accumulators = new Map<string, { sum: number; count: number }>();\n        for (const row of table) {\n            const metric = String(row[metricField]);\n            const series = seriesField ? String(row[seriesField]) : valueField;\n            const value = Number(row[valueField]);\n            if (!Number.isFinite(value)) continue;\n            const key = `${series}\\u0000${metric}`;\n            const accumulator = accumulators.get(key) ?? { sum: 0, count: 0 };\n            accumulator.sum += value;\n            accumulator.count += 1;\n            accumulators.set(key, accumulator);\n        }\n        const normalizedValue = (series: string, metric: string): number => {\n            const accumulator = accumulators.get(`${series}\\u0000${metric}`);\n            if (!accumulator) return 0;\n            return (accumulator.sum / accumulator.count) / metricMaximums.get(metric)!;\n        };\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 400 };\n        const filledRequested = input.chart_spec.chartProperties?.filled !== false;\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'RadarMarkers',\n            title: `${valueField} by ${metricField}`,\n            seriesBy: 'Columns',\n            data: [\n                [metricField, ...seriesKeys],\n                ...metrics.map((metric) => [\n                    `${metric} (${metricMaximums.get(metric)})`,\n                    ...seriesKeys.map((series) => normalizedValue(series, metric)),\n                ]),\n            ],\n            valueAxis: { minimumScale: 0, maximumScale: 1, majorUnit: 0.25 },\n            legend: { visible: Boolean(seriesField), position: 'Bottom' },\n            width: base.width,\n            height: base.height,\n            warnings: filledRequested ? [{\n                severity: 'info',\n                code: 'excel-radar-fill-unsupported',\n                message: 'Excel Radar uses outlines and markers because Office.js does not expose translucent chart-series fills.',\n            }] : [],\n            _flint: {\n                flintType: 'Radar Chart',\n                metricField,\n                valueField,\n                seriesField,\n                metricMaximums: Object.fromEntries(metricMaximums),\n                normalized: true,\n                filledRequested,\n            },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChartAssemblyInput, SemanticResult } from '../../core/types';\nimport type { ExcelTypeMapping } from '../chart-types';\nimport type { ExcelNativeChartSpec } from '../types';\n\nexport interface ExcelTemplateContext {\n    input: ChartAssemblyInput;\n    table: any[];\n    semantics: SemanticResult;\n    fieldOf: (channel: string) => string | undefined;\n    typeOf: (channel: string) => string | undefined;\n}\n\nexport interface ExcelTemplateDef {\n    chart: string;\n    channels: string[];\n    typeMapping: ExcelTypeMapping;\n    validate?: (context: ExcelTemplateContext) => string | undefined;\n    instantiate?: (context: ExcelTemplateContext) => ExcelNativeChartSpec;\n}\n\nexport function requireQuantitativeAxes(context: ExcelTemplateContext): string | undefined {\n    if (context.typeOf('x') !== 'quantitative' || context.typeOf('y') !== 'quantitative') {\n        return 'requires quantitative x and y fields for a native Excel XY chart';\n    }\n    if (context.fieldOf('shape')) {\n        return 'does not support a shape encoding in native Excel charts';\n    }\n    return undefined;\n}","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\nimport { requireQuantitativeAxes } from './types';\n\nexport const excelScatterPlotDef: ExcelTemplateDef = {\n    chart: 'Scatter Plot',\n    channels: ['x', 'y', 'color', 'size'],\n    typeMapping: { vertical: 'XYScatter', xy: true },\n    validate: (context) => requireQuantitativeAxes(context)\n        ?? (context.typeOf('color') === 'quantitative' || context.typeOf('color') === 'temporal'\n            ? 'does not support continuous color in a native Excel Scatter or Bubble chart'\n            : undefined),\n};\n\nexport const excelConnectedScatterPlotDef: ExcelTemplateDef = {\n    chart: 'Connected Scatter Plot',\n    channels: ['x', 'y', 'order', 'color', 'detail'],\n    typeMapping: { vertical: 'XYScatterLines', xy: true },\n    validate: (context) => requireQuantitativeAxes(context)\n        ?? (!context.fieldOf('order')\n            ? 'requires an explicit order field for a native Excel connected scatter chart'\n            : context.fieldOf('detail')\n                ? 'does not support an unlegended detail series in a native Excel connected scatter chart'\n                : context.typeOf('color') === 'quantitative' || context.typeOf('color') === 'temporal'\n                    ? 'does not support continuous color in a native Excel connected scatter chart'\n                    : undefined),\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelSunburstChartDef: ExcelTemplateDef = {\n    chart: 'Sunburst Chart',\n    channels: ['color', 'size', 'group', 'detail'],\n    typeMapping: { vertical: 'Sunburst', noAxes: true },\n    validate: ({ table, fieldOf, typeOf }) => {\n        if (!fieldOf('color') || typeOf('color') === 'quantitative') {\n            return 'requires a categorical color field for a native Excel sunburst chart';\n        }\n        if (typeOf('size') !== 'quantitative') {\n            return 'requires a quantitative size field for a native Excel sunburst chart';\n        }\n        if (fieldOf('group') && typeOf('group') === 'quantitative') {\n            return 'requires a categorical group field for a native Excel sunburst hierarchy';\n        }\n        if (fieldOf('detail') && !fieldOf('group')) {\n            return 'requires a group field before detail in a native Excel sunburst hierarchy';\n        }\n        if (fieldOf('detail') && typeOf('detail') === 'quantitative') {\n            return 'requires a categorical detail field for a native Excel sunburst hierarchy';\n        }\n        const valueField = fieldOf('size')!;\n        if (table.some((row) => Number.isFinite(Number(row[valueField])) && Number(row[valueField]) < 0)) {\n            return 'requires non-negative values for a native Excel sunburst chart';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, fieldOf }) => {\n        const categoryField = fieldOf('color')!;\n        const groupField = fieldOf('group');\n        const detailField = fieldOf('detail');\n        const valueField = fieldOf('size')!;\n        const hierarchyFields = [categoryField, groupField, detailField].filter((field): field is string => Boolean(field));\n        const leaves = new Map<string, { path: string[]; value: number }>();\n        for (const row of table) {\n            const path = hierarchyFields.map((field) => row[field]);\n            const value = Number(row[valueField]);\n            if (path.some((part) => part == null) || !Number.isFinite(value)) continue;\n            const labels = path.map(String);\n            const key = labels.join('\\u0000');\n            const existing = leaves.get(key);\n            leaves.set(key, { path: labels, value: (existing?.value ?? 0) + value });\n        }\n\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'Sunburst',\n            title: `${valueField} by ${hierarchyFields[hierarchyFields.length - 1]}`,\n            seriesBy: 'Columns',\n            data: [\n                [...hierarchyFields, valueField],\n                ...[...leaves.values()].map((leaf) => [...leaf.path, leaf.value]),\n            ],\n            legend: { visible: false },\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Sunburst Chart', hierarchyFields, valueField },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelTreemapDef: ExcelTemplateDef = {\n    chart: 'Treemap',\n    channels: ['color', 'size', 'detail'],\n    typeMapping: { vertical: 'Treemap', noAxes: true },\n    validate: ({ table, fieldOf, typeOf }) => {\n        if (!fieldOf('color') || typeOf('color') === 'quantitative') {\n            return 'requires a categorical color field for a native Excel treemap';\n        }\n        if (typeOf('size') !== 'quantitative') {\n            return 'requires a quantitative size field for a native Excel treemap';\n        }\n        if (fieldOf('detail') && typeOf('detail') === 'quantitative') {\n            return 'requires a categorical detail field for a native Excel treemap hierarchy';\n        }\n        const valueField = fieldOf('size')!;\n        if (table.some((row) => Number.isFinite(Number(row[valueField])) && Number(row[valueField]) < 0)) {\n            return 'requires non-negative values for a native Excel treemap';\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, fieldOf }) => {\n        const categoryField = fieldOf('color')!;\n        const detailField = fieldOf('detail');\n        const valueField = fieldOf('size')!;\n        const leaves = new Map<string, { category: string; detail?: string; value: number }>();\n        for (const row of table) {\n            const category = row[categoryField];\n            const detail = detailField ? row[detailField] : undefined;\n            const value = Number(row[valueField]);\n            if (category == null || (detailField && detail == null) || !Number.isFinite(value)) continue;\n            const categoryLabel = String(category);\n            const detailLabel = detailField ? String(detail) : undefined;\n            const key = `${categoryLabel}\\u0000${detailLabel ?? ''}`;\n            const existing = leaves.get(key);\n            leaves.set(key, {\n                category: categoryLabel,\n                detail: detailLabel,\n                value: (existing?.value ?? 0) + value,\n            });\n        }\n\n        const rows = [...leaves.values()];\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'Treemap',\n            title: `${valueField} by ${detailField ?? categoryField}`,\n            seriesBy: 'Columns',\n            data: detailField\n                ? [[categoryField, detailField, valueField], ...rows.map((row) => [row.category, row.detail!, row.value])]\n                : [[categoryField, valueField], ...rows.map((row) => [row.category, row.value])],\n            legend: { visible: false },\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Treemap', categoryField, detailField, valueField },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { resolveTotalsMode } from '../../chart-types/waterfall';\nimport { formatSpecToExcel } from '../chart-types';\nimport type { ExcelTemplateDef } from './types';\n\nexport const excelWaterfallChartDef: ExcelTemplateDef = {\n    chart: 'Waterfall Chart',\n    channels: ['x', 'y', 'color'],\n    typeMapping: { vertical: 'Waterfall' },\n    validate: ({ input, table, fieldOf, typeOf }) => {\n        if (!fieldOf('x')) return 'requires a category x field for a native Excel waterfall chart';\n        if (typeOf('y') !== 'quantitative') {\n            return 'requires a quantitative y field for a native Excel waterfall chart';\n        }\n        if (fieldOf('color') && typeOf('color') === 'quantitative') {\n            return 'requires color to contain start/delta/end roles for a native Excel waterfall chart';\n        }\n        const valueField = fieldOf('y')!;\n        const typeField = fieldOf('color');\n        const values = table.map((row) => Number(row[valueField])).filter(Number.isFinite);\n        if (typeField) {\n            const unsupportedTotal = table.findIndex((row, index) => {\n                const role = String(row[typeField] ?? '').toLowerCase();\n                return index > 0 && (role === 'start' || role === 'end' || role === 'total');\n            });\n            if (unsupportedTotal >= 0) {\n                return 'cannot mark non-initial total points because Office.js does not expose Waterfall total-point semantics';\n            }\n        } else {\n            const totals = resolveTotalsMode(values, input.chart_spec.chartProperties?.totals);\n            if (totals === 'last' || totals === 'both') {\n                return 'cannot mark a final total because Office.js does not expose Waterfall total-point semantics';\n            }\n        }\n        return undefined;\n    },\n    instantiate: ({ input, table, semantics, fieldOf }) => {\n        const categoryField = fieldOf('x')!;\n        const valueField = fieldOf('y')!;\n        const rows = table.filter((row) => row[categoryField] != null && Number.isFinite(Number(row[valueField])));\n\n        const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n        return {\n            schema: 'flint.excel.chart/v1',\n            kind: 'chart',\n            chartType: 'Waterfall',\n            title: `${valueField} by ${categoryField}`,\n            seriesBy: 'Columns',\n            data: [\n                [categoryField, valueField],\n                ...rows.map((row) => [String(row[categoryField]), Number(row[valueField])]),\n            ],\n            categoryAxis: { title: categoryField },\n            valueAxis: {\n                title: valueField,\n                numberFormat: formatSpecToExcel(semantics.y?.format),\n            },\n            legend: { visible: false },\n            showConnectorLines: true,\n            width: base.width,\n            height: base.height,\n            warnings: [],\n            _flint: { flintType: 'Waterfall Chart', categoryField, valueField },\n        };\n    },\n};","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExcelTemplateDef } from './types';\nimport { excelAreaChartDef } from './area';\nimport { excelBarChartDef, excelGroupedBarChartDef, excelStackedBarChartDef } from './bar';\nimport { excelBoxplotDef } from './boxplot';\nimport { excelCandlestickDef } from './candlestick';\nimport { excelFunnelChartDef } from './funnel';\nimport { excelHistogramDef } from './histogram';\nimport { excelLineChartDef } from './line';\nimport { excelDonutChartDef, excelPieChartDef } from './pie';\nimport { excelPyramidChartDef } from './pyramid';\nimport { excelRadarChartDef } from './radar';\nimport { excelConnectedScatterPlotDef, excelScatterPlotDef } from './scatter';\nimport { excelSunburstChartDef } from './sunburst';\nimport { excelTreemapDef } from './treemap';\nimport { excelWaterfallChartDef } from './waterfall';\n\nexport const excelAllTemplateDefs: ExcelTemplateDef[] = [\n    excelBarChartDef,\n    excelGroupedBarChartDef,\n    excelStackedBarChartDef,\n    excelPyramidChartDef,\n    excelLineChartDef,\n    excelAreaChartDef,\n    excelScatterPlotDef,\n    excelConnectedScatterPlotDef,\n    excelPieChartDef,\n    excelDonutChartDef,\n    excelHistogramDef,\n    excelBoxplotDef,\n    excelCandlestickDef,\n    excelWaterfallChartDef,\n    excelRadarChartDef,\n    excelFunnelChartDef,\n    excelTreemapDef,\n    excelSunburstChartDef,\n];\n\nexport function excelGetTemplateDef(chartType: string): ExcelTemplateDef | undefined {\n    return excelAllTemplateDefs.find((template) => template.chart === chartType);\n}\n\nexport function excelGetTemplateChannels(chartType: string): string[] {\n    return excelGetTemplateDef(chartType)?.channels ?? [];\n}\n\nexport type { ExcelTemplateContext, ExcelTemplateDef } from './types';","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Excel chart assembly — Stage-3 code generator for Office.js Excel charts.\n *\n * Reuses the SAME core analysis pipeline as the other backends:\n *   Phase 0:  convertTemporalData + resolveChannelSemantics → ChannelSemantics\n *             (this decides each channel's role: quantitative = MEASURE,\n *              nominal/ordinal/temporal = CATEGORY — no heuristics)\n *   Stage 3:  pivot the long/tidy rows into Excel's WIDE matrix and emit an\n *             ExcelChartSpec (native Office.js chart description).\n *\n * Excel charts consume a rectangular range (`charts.add(type, range, seriesBy)`),\n * so the long/tidy data is pivoted: category field → first column, series field\n * → series columns, measure → cells. Visual STYLE stays native to Excel (its\n * own palette/gridlines); only Flint's LAYOUT decisions (which field is the\n * category, number format, legend, orientation) are carried over.\n */\n\nimport type {\n    ChartAssemblyInput,\n    ChartEncoding,\n    ChartWarning,\n    LayoutDeclaration,\n    SemanticResult,\n} from '../core/types';\nimport { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics';\nimport { detectBandedAxisFromSemantics } from '../core/axis-detection';\nimport { computeChannelBudgets, deriveStretchCaps, resolveBaseSize } from '../core/compute-layout';\nimport { filterOverflow } from '../core/filter-overflow';\nimport { formatSpecToExcel } from './chart-types';\nimport { excelGetTemplateDef } from './templates';\nimport type {\n    ExcelAxisSpec,\n    ExcelChartSpec,\n    ExcelNativeChartSpec,\n    ExcelNativeSeriesSpec,\n    ExcelSeriesBy,\n} from './types';\n\ntype Cell = string | number | null;\n\nconst EXCEL_SERIES_COLORS = ['#4472C4', '#ED7D31', '#70AD47', '#FFC000', '#5B9BD5', '#A5A5A5'];\n\nfunction niceStep(span: number, targetTicks = 5): number {\n    if (!(span > 0)) return 1;\n    const rough = span / targetTicks;\n    const power = 10 ** Math.floor(Math.log10(rough));\n    const fraction = rough / power;\n    const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n    return niceFraction * power;\n}\n\nfunction focusedNumericAxis(values: number[]): Partial<Pick<ExcelAxisSpec, 'minimumScale' | 'maximumScale' | 'majorUnit'>> {\n    const finite = values.filter(Number.isFinite);\n    if (finite.length === 0) return {};\n    const dataMinimum = Math.min(...finite);\n    const dataMaximum = Math.max(...finite);\n    const dataSpan = dataMaximum - dataMinimum;\n    const referenceSpan = dataSpan > 0 ? dataSpan : Math.max(1, Math.abs(dataMaximum) * 0.1);\n    const majorUnit = niceStep(referenceSpan);\n    const precision = 10 ** Math.max(0, -Math.floor(Math.log10(majorUnit)) + 1);\n    const round = (value: number) => Math.round(value * precision) / precision;\n    if (dataSpan === 0) {\n        return {\n            minimumScale: round(dataMinimum - majorUnit),\n            maximumScale: round(dataMaximum + majorUnit),\n            majorUnit,\n        };\n    }\n    const onMajorTick = (value: number) => Math.abs(value / majorUnit - Math.round(value / majorUnit)) < 1e-9;\n    const minimumScale = dataMinimum >= 0 && dataMinimum <= referenceSpan * 0.1\n        ? 0\n        : round(Math.floor(dataMinimum / majorUnit) * majorUnit);\n    const nextMajorTick = Math.ceil(dataMaximum / majorUnit) * majorUnit;\n    const maximumScale = onMajorTick(dataMaximum)\n        ? dataMaximum + majorUnit * 0.25\n        : nextMajorTick;\n    return {\n        minimumScale,\n        maximumScale: round(maximumScale),\n        majorUnit,\n    };\n}\n\nfunction temporalLabelSpacing(categoryCount: number, width: number): number | undefined {\n    const labelBudget = Math.max(12, Math.floor((width - 90) / 14));\n    return categoryCount > labelBudget ? Math.ceil(categoryCount / labelBudget) : undefined;\n}\n\n/** Normalize shorthand (`\"x\": \"field\"`) to `{ field }`. */\nfunction normalizeEncodings(\n    raw: Record<string, unknown>,\n): Record<string, ChartEncoding> {\n    const out: Record<string, ChartEncoding> = {};\n    for (const [ch, v] of Object.entries(raw ?? {})) {\n        if (v == null) continue;\n        out[ch] = typeof v === 'string' ? { field: v } : (v as ChartEncoding);\n    }\n    return out;\n}\n\n/** Distinct values of a field, first-seen order. */\nfunction distinct(rows: any[], field: string): Cell[] {\n    const seen = new Set<unknown>();\n    const out: Cell[] = [];\n    for (const r of rows) {\n        const v = r[field];\n        if (!seen.has(v)) { seen.add(v); out.push(v as Cell); }\n    }\n    return out;\n}\n\nfunction interpolateMissing(values: Cell[]): Cell[] {\n    const output = [...values];\n    for (let index = 0; index < output.length; index += 1) {\n        if (output[index] != null) continue;\n        let previous = index - 1;\n        let next = index + 1;\n        while (previous >= 0 && output[previous] == null) previous -= 1;\n        while (next < output.length && output[next] == null) next += 1;\n        if (previous < 0 || next >= output.length) continue;\n        const start = Number(output[previous]);\n        const end = Number(output[next]);\n        if (!Number.isFinite(start) || !Number.isFinite(end)) continue;\n        output[index] = start + ((end - start) * (index - previous)) / (next - previous);\n    }\n    return output;\n}\n\nfunction normalizedBubbleSizes(\n    rows: any[],\n    field: string,\n    type: string | undefined,\n    width: number,\n    height: number,\n): Map<any, number> {\n    const values = rows.map((row) => row[field]).filter((value) => value != null);\n    const unique = [...new Set(values)];\n    const maximumArea = Math.round(Math.max(16, Math.min(361, (width * height / Math.max(1, rows.length)) * 0.6)));\n    const minimumArea = type === 'quantitative' || type === 'temporal'\n        ? 9\n        : Math.round(maximumArea / 4);\n    const output = new Map<any, number>();\n    if (type !== 'quantitative' && type !== 'temporal') {\n        unique.forEach((value, index) => {\n            const t = unique.length > 1 ? index / (unique.length - 1) : 0.5;\n            output.set(value, minimumArea + t * (maximumArea - minimumArea));\n        });\n        return output;\n    }\n\n    const numeric = values.map(Number).filter(Number.isFinite);\n    const maximum = numeric.length > 0 ? Math.max(...numeric) : 1;\n    const sqrtMaximum = Math.sqrt(Math.max(0, maximum));\n    unique.forEach((value) => {\n        const numericValue = Number(value);\n        const t = sqrtMaximum > 0 && Number.isFinite(numericValue)\n            ? Math.sqrt(Math.max(0, numericValue)) / sqrtMaximum\n            : 0;\n        output.set(value, minimumArea + t * (maximumArea - minimumArea));\n    });\n    return output;\n}\n\nfunction interpolateColor(start: string, end: string, t: number): string {\n    const channel = (color: string, offset: number) => Number.parseInt(color.slice(offset, offset + 2), 16);\n    const hex = (value: number) => Math.round(value).toString(16).padStart(2, '0');\n    return `#${hex(channel(start, 1) + (channel(end, 1) - channel(start, 1)) * t)}${hex(channel(start, 3) + (channel(end, 3) - channel(start, 3)) * t)}${hex(channel(start, 5) + (channel(end, 5) - channel(start, 5)) * t)}`;\n}\n\n/**\n * Assemble an {@link ExcelChartSpec} from a {@link ChartAssemblyInput}.\n *\n * @throws if the chart type has no native Excel equivalent (e.g. Heatmap).\n */\nexport function assembleExcel(input: ChartAssemblyInput): ExcelChartSpec {\n    const flintType = input.chart_spec.chartType;\n    const semanticTypes = input.semantic_types ?? {};\n    const rawData: any[] = input.data.values ?? [];\n    const encodings = normalizeEncodings(input.chart_spec.encodings);\n\n    // ── Phase 0 (reused core): resolve per-channel semantics ────────────────\n    let convertedData = convertTemporalData(rawData, semanticTypes);\n    const sem: SemanticResult = resolveChannelSemantics(\n        encodings, rawData, semanticTypes, convertedData,\n    );\n    const typeOf = (ch: string) => sem[ch]?.type;\n    const isMeasure = (ch: string) => typeOf(ch) === 'quantitative';\n    const fieldOf = (ch: string) => encodings[ch]?.field;\n    const overflowOrder = new Map<string, Cell[]>();\n    const chartTemplate = excelGetTemplateDef(flintType);\n    if (!chartTemplate) {\n        throw new Error(`Excel backend does not support chart type \"${flintType}\" as a native Office.js chart.`);\n    }\n    if (fieldOf('column') || fieldOf('row')) {\n        throw new Error(`Excel backend does not support faceting in one native Excel chart: \"${flintType}\".`);\n    }\n    const templateContext = { input, table: convertedData, semantics: sem, fieldOf, typeOf };\n    const unsupportedReason = chartTemplate.validate?.(templateContext);\n    if (unsupportedReason) {\n        throw new Error(`Excel backend ${unsupportedReason}: \"${flintType}\".`);\n    }\n\n    if (chartTemplate.instantiate) {\n        return chartTemplate.instantiate(templateContext);\n    }\n\n    if (flintType === 'Bar Chart' || flintType === 'Grouped Bar Chart' || flintType === 'Stacked Bar Chart') {\n        const detected = detectBandedAxisFromSemantics(sem, convertedData, { preferAxis: 'x' });\n        const declaration: LayoutDeclaration = {\n            axisFlags: detected ? { [detected.axis]: { banded: true } } : { x: { banded: true } },\n            resolvedTypes: detected?.resolvedTypes,\n        };\n        const baseSize = resolveBaseSize(input.chart_spec.baseSize, input.chart_spec.canvasSize);\n        const options = {\n            facetFixedPadding: { width: 50, height: 40 },\n            facetGap: 10,\n            targetBandAR: 10,\n            ...deriveStretchCaps(baseSize, input.chart_spec.canvasSize, {}),\n        };\n        const budgets = computeChannelBudgets(sem, declaration, convertedData, baseSize, options);\n        const overflowResult = filterOverflow(\n            sem,\n            declaration,\n            encodings,\n            convertedData,\n            budgets,\n            new Set(['bar']),\n        );\n        convertedData = overflowResult.filteredData;\n        overflowResult.truncations.forEach((truncation) => {\n            overflowOrder.set(truncation.field, truncation.keptValues as Cell[]);\n        });\n    }\n\n    const mapping = chartTemplate.typeMapping;\n\n    // ── Resolve roles (category / measure / series) from semantics ──────────\n    let catCh: string | undefined;\n    let measCh: string | undefined;\n    let seriesCh: string | undefined;\n    let orientation: 'vertical' | 'horizontal' = 'vertical';\n    let isXY = false;\n\n    // categorical series candidate (group preferred, else categorical color)\n    const seriesCand = encodings.group\n        ? 'group'\n        : encodings.color && !isMeasure('color')\n            ? 'color'\n            : undefined;\n    const seriesField0 = seriesCand;\n\n    if (mapping.noAxes) {\n        // pie/doughnut: color = slices (category), size/theta/y = value\n        catCh = encodings.color ? 'color' : encodings.x ? 'x' : undefined;\n        measCh = encodings.size ? 'size' : encodings.theta ? 'theta' : encodings.y ? 'y' : undefined;\n        seriesCh = undefined;\n    } else if (mapping.xy) {\n        catCh = 'x'; measCh = 'y'; isXY = true; seriesCh = seriesField0;\n    } else if (isMeasure('x') && !isMeasure('y')) {\n        catCh = 'y'; measCh = 'x'; orientation = 'horizontal'; seriesCh = seriesField0;\n    } else {\n        catCh = 'x'; measCh = 'y'; seriesCh = seriesField0;\n    }\n\n    const catField = catCh ? fieldOf(catCh) : undefined;\n    const measField = measCh ? fieldOf(measCh) : undefined;\n    const seriesField = seriesCh ? fieldOf(seriesCh) : undefined;\n    const dashField = fieldOf('strokeDash');\n    const orderField = fieldOf('order');\n    const sizeField = fieldOf('size');\n    const base = input.chart_spec.baseSize ?? { width: 480, height: 320 };\n    const bubbleSizes = sizeField\n        ? normalizedBubbleSizes(convertedData, sizeField, typeOf('size'), base.width, base.height)\n        : undefined;\n    const warnings: ChartWarning[] = [];\n\n    if (!catField || !measField) {\n        throw new Error(\n            `Excel backend could not resolve category/measure for \"${flintType}\" ` +\n            `(category=${catField}, measure=${measField}).`,\n        );\n    }\n\n    const numericXLine = flintType === 'Line Chart' && isMeasure('x') && isMeasure('y');\n    if (numericXLine) {\n        isXY = true;\n        catCh = 'x';\n        measCh = 'y';\n    }\n\n    // ── Stage 3: pivot long → wide matrix ───────────────────────────────────\n    const data: Array<Array<Cell>> = [];\n    let explicitSeries: ExcelNativeSeriesSpec[] | undefined;\n    let seriesFormats: ExcelNativeChartSpec['seriesFormats'];\n    if (isXY) {\n        const seriesKeys = seriesField ? distinct(convertedData, seriesField) : [measField];\n        const needsExplicitSeries = Boolean(seriesField || sizeField);\n        if (needsExplicitSeries) {\n            const columnsPerSeries = sizeField ? 3 : 2;\n            const groupedRows = seriesKeys.map((seriesKey) => {\n                const rows = convertedData.filter((row) => !seriesField || row[seriesField] === seriesKey);\n                if (!orderField) return rows;\n                return [...rows].sort((left, right) => {\n                    const leftValue = left[orderField];\n                    const rightValue = right[orderField];\n                    const leftNumber = Number(leftValue);\n                    const rightNumber = Number(rightValue);\n                    if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) return leftNumber - rightNumber;\n                    const leftTime = new Date(String(leftValue)).getTime();\n                    const rightTime = new Date(String(rightValue)).getTime();\n                    if (Number.isFinite(leftTime) && Number.isFinite(rightTime)) return leftTime - rightTime;\n                    return String(leftValue).localeCompare(String(rightValue), undefined, { numeric: true });\n                });\n            });\n            const rowCount = Math.max(0, ...groupedRows.map((rows) => rows.length));\n            explicitSeries = seriesKeys.map((seriesKey, index) => ({\n                name: String(seriesKey),\n                xColumn: index * columnsPerSeries,\n                yColumn: index * columnsPerSeries + 1,\n                rowCount: groupedRows[index].length,\n                bubbleSizeColumn: sizeField ? index * columnsPerSeries + 2 : undefined,\n            }));\n            data.push(seriesKeys.flatMap((seriesKey) => [\n                `${String(seriesKey)} ${catField}`,\n                `${String(seriesKey)} ${measField}`,\n                ...(sizeField ? [`${String(seriesKey)} ${sizeField}`] : []),\n            ]));\n            for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {\n                data.push(groupedRows.flatMap((rows) => {\n                    const row = rows[rowIndex];\n                    if (!row) return new Array(columnsPerSeries).fill(null);\n                    return [\n                        row[catField] as Cell,\n                        Number(row[measField]),\n                        ...(sizeField ? [bubbleSizes?.get(row[sizeField]) ?? 9] : []),\n                    ];\n                }));\n            }\n        } else {\n            data.push([catField, measField]);\n            const rows = orderField\n                ? [...convertedData].sort((left, right) => {\n                    const leftValue = left[orderField];\n                    const rightValue = right[orderField];\n                    const leftNumber = Number(leftValue);\n                    const rightNumber = Number(rightValue);\n                    if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) return leftNumber - rightNumber;\n                    const leftTime = new Date(String(leftValue)).getTime();\n                    const rightTime = new Date(String(rightValue)).getTime();\n                    if (Number.isFinite(leftTime) && Number.isFinite(rightTime)) return leftTime - rightTime;\n                    return String(leftValue).localeCompare(String(rightValue), undefined, { numeric: true });\n                })\n                : convertedData;\n            for (const r of rows) {\n                const x = r[catField];\n                const y = r[measField];\n                if (x == null || y == null) continue;\n                data.push([x as Cell, Number(y)]);\n            }\n        }\n    } else {\n        let categories = distinct(convertedData, catField);\n        const rankedCategories = overflowOrder.get(catField);\n        if (rankedCategories) categories = rankedCategories;\n        if (flintType === 'Line Chart' || flintType === 'Area Chart') {\n            if (typeOf(catCh!) === 'temporal') {\n                categories = [...categories].sort((a, b) => new Date(String(a)).getTime() - new Date(String(b)).getTime());\n            } else if (typeOf(catCh!) === 'quantitative') {\n                categories = [...categories].sort((a, b) => Number(a) - Number(b));\n            }\n        }\n        let seriesKeys = seriesField ? distinct(convertedData, seriesField) : [measField];\n        if (seriesField && (flintType === 'Stacked Bar Chart' || flintType === 'Bar Chart')) {\n            seriesKeys = [...seriesKeys].sort((a, b) => String(a).localeCompare(String(b), undefined, { numeric: true }));\n            if (orientation === 'vertical') seriesKeys.reverse();\n        }\n        const dashValues = dashField ? distinct(convertedData, dashField) : [];\n        const seriesDescriptors = dashField\n            ? convertedData.reduce<Array<{ key: string; label: string; seriesValue: Cell; dashValue: Cell }>>((output, row) => {\n                const seriesValue = (seriesField ? row[seriesField] : measField) as Cell;\n                const dashValue = row[dashField] as Cell;\n                const key = `${String(seriesValue)}\\u0001${String(dashValue)}`;\n                if (!output.some((descriptor) => descriptor.key === key)) {\n                    output.push({\n                        key,\n                        label: seriesField ? `${String(seriesValue)} — ${String(dashValue)}` : String(dashValue),\n                        seriesValue,\n                        dashValue,\n                    });\n                }\n                return output;\n            }, [])\n            : seriesKeys.map((seriesValue) => ({\n                key: String(seriesValue),\n                label: String(seriesValue),\n                seriesValue,\n                dashValue: null,\n            }));\n        const orderedSeries = Boolean(seriesField)\n            && typeOf(seriesCh!) === 'ordinal';\n        const numericSeriesValues = orderedSeries\n            ? seriesKeys.map(Number).filter(Number.isFinite)\n            : [];\n        const seriesMinimum = numericSeriesValues.length > 0 ? Math.min(...numericSeriesValues) : 0;\n        const seriesMaximum = numericSeriesValues.length > 0 ? Math.max(...numericSeriesValues) : 1;\n        const orderedSeriesColor = (value: Cell) => {\n            const numericValue = Number(value);\n            const t = Number.isFinite(numericValue) && seriesMaximum !== seriesMinimum\n                ? (numericValue - seriesMinimum) / (seriesMaximum - seriesMinimum)\n                : 0.5;\n            return interpolateColor('#D9E2F3', '#2F5597', t);\n        };\n        if (orderedSeries) {\n            seriesFormats = seriesDescriptors.map((descriptor) => ({\n                color: orderedSeriesColor(descriptor.seriesValue),\n            }));\n        }\n        if (dashField) {\n            seriesFormats = seriesDescriptors.map((descriptor) => ({\n                color: EXCEL_SERIES_COLORS[Math.max(0, seriesKeys.indexOf(descriptor.seriesValue)) % EXCEL_SERIES_COLORS.length],\n                lineStyle: dashValues.indexOf(descriptor.dashValue) === 0 ? 'Continuous' : 'Dash',\n            }));\n        }\n\n        // aggregate duplicates per (category × series) using the measure's default\n        const agg = sem[measCh!]?.aggregationDefault ?? 'sum';\n        const acc = new Map<string, { sum: number; count: number }>();\n        for (const r of convertedData) {\n            const cv = r[catField];\n            if (cv == null) continue;\n            const seriesValue = seriesField ? r[seriesField] : measField;\n            const sv = dashField\n                ? `${String(seriesValue)}\\u0001${String(r[dashField])}`\n                : seriesValue;\n            const num = Number(r[measField]);\n            if (!Number.isFinite(num)) continue;\n            const key = `${String(cv)}\\u0000${String(sv)}`;\n            const e = acc.get(key) ?? { sum: 0, count: 0 };\n            e.sum += num; e.count += 1; acc.set(key, e);\n        }\n        const valueAt = (cv: Cell, sv: Cell): Cell => {\n            const e = acc.get(`${String(cv)}\\u0000${String(sv)}`);\n            if (!e) return null;\n            return agg === 'average' ? e.sum / e.count : e.sum;\n        };\n\n        let seriesValues = seriesDescriptors.map((descriptor) => categories.map((category) => valueAt(category, descriptor.key)));\n        if (flintType === 'Line Chart' || flintType === 'Area Chart') {\n            seriesValues = seriesValues.map(interpolateMissing);\n        }\n        if (flintType === 'Area Chart' && typeOf(catCh!) === 'quantitative' && categories.length > 1) {\n            const sourceX = categories.map(Number);\n            const sampleCount = Math.min(97, Math.max(49, categories.length));\n            const minimum = sourceX[0];\n            const maximum = sourceX[sourceX.length - 1];\n            const targetX = Array.from(\n                { length: sampleCount },\n                (_value, index) => minimum + (index / (sampleCount - 1)) * (maximum - minimum),\n            );\n            seriesValues = seriesValues.map((values) => {\n                let right = 1;\n                return targetX.map((x) => {\n                    while (right < sourceX.length - 1 && sourceX[right] < x) right += 1;\n                    const left = Math.max(0, right - 1);\n                    const span = sourceX[right] - sourceX[left];\n                    const t = span === 0 ? 0 : (x - sourceX[left]) / span;\n                    const leftValue = Number(values[left]);\n                    const rightValue = Number(values[right]);\n                    if (!Number.isFinite(leftValue)) return Number.isFinite(rightValue) ? rightValue : null;\n                    if (!Number.isFinite(rightValue)) return leftValue;\n                    return leftValue + (rightValue - leftValue) * t;\n                });\n            });\n            const tickLabels = new Map(Array.from(\n                { length: 5 },\n                (_value, index) => [\n                    Math.round((index / 4) * (sampleCount - 1)),\n                    Number((minimum + (index / 4) * (maximum - minimum)).toPrecision(4)),\n                ] as const,\n            ));\n            categories = targetX.map((_value, index) => tickLabels.get(index) ?? '');\n        }\n        data.push([catField, ...seriesDescriptors.map((descriptor) => descriptor.label)]);\n        for (let categoryIndex = 0; categoryIndex < categories.length; categoryIndex += 1) {\n            data.push([\n                String(categories[categoryIndex]),\n                ...seriesValues.map((values) => values[categoryIndex]),\n            ]);\n        }\n    }\n\n    // ── Chart type + styling (native Excel) ─────────────────────────────────\n    let excelChartType = orientation === 'horizontal' && mapping.horizontal\n        ? mapping.horizontal\n        : mapping.vertical;\n    if (numericXLine) excelChartType = 'XYScatterLines';\n    if (flintType === 'Connected Scatter Plot') excelChartType = 'XYScatterLines';\n    if (flintType === 'Scatter Plot' && sizeField) excelChartType = 'Bubble';\n    if (flintType === 'Area Chart' && seriesField) excelChartType = 'AreaStacked';\n    if (flintType === 'Bar Chart' && seriesField) {\n        excelChartType = orientation === 'horizontal' ? 'BarStacked' : 'ColumnStacked';\n    }\n    const isBarFamily = /Column|Bar/.test(excelChartType);\n    const hasNumericAxes = /XYScatter|Bubble/.test(excelChartType);\n    const numberFormat = formatSpecToExcel(measCh ? sem[measCh]?.format : undefined);\n    const seriesBy: ExcelSeriesBy = 'Columns';\n\n    const spec: ExcelNativeChartSpec = {\n        schema: 'flint.excel.chart/v1',\n        kind: 'chart',\n        chartType: excelChartType,\n        title: `${measField} by ${catField}`,\n        seriesBy,\n        series: explicitSeries,\n        seriesFormats,\n        bubbleScale: flintType === 'Scatter Plot' && sizeField ? 20 : undefined,\n        doughnutHoleSize: flintType === 'Donut Chart'\n            ? Math.max(10, Math.min(90, Number(input.chart_spec.chartProperties?.innerRadius ?? 50)))\n            : undefined,\n        data,\n        width: base.width,\n        height: base.height,\n        warnings,\n        _flint: { flintType, catField, measField, seriesField, orientation, isXY },\n    };\n\n    if (!mapping.noAxes) {\n        const measureValues = convertedData\n            .map((row) => Number(row[measField]))\n            .filter(Number.isFinite);\n        const measureMinimum = measureValues.length > 0 ? Math.min(...measureValues) : undefined;\n        const measureMaximum = measureValues.length > 0 ? Math.max(...measureValues) : undefined;\n        const focusedLineMinimum = flintType === 'Line Chart' && measureMinimum !== undefined && measureMaximum !== undefined\n            ? Math.max(0, measureMinimum - (measureMaximum - measureMinimum) * 0.05)\n            : undefined;\n        const numericXScale = hasNumericAxes\n            ? focusedNumericAxis(convertedData.map((row) => Number(row[catField])))\n            : {};\n        const numericYScale = hasNumericAxes\n            ? focusedNumericAxis(measureValues)\n            : {};\n        spec.categoryAxis = {\n            title: catField,\n            labelFontSize: orientation === 'horizontal' && data.length > 25\n                ? Math.max(5, Math.min(10, ((base.height - 80) / (data.length - 1)) * 0.72))\n                : undefined,\n            tickLabelSpacing: orientation === 'vertical' && typeOf(catCh!) === 'temporal'\n                ? temporalLabelSpacing(data.length - 1, base.width)\n                : undefined,\n            reversePlotOrder: orientation === 'horizontal' && typeOf(catCh!) !== 'temporal',\n            ...numericXScale,\n        };\n        spec.valueAxis = {\n            title: measField,\n            numberFormat,\n            minimumScale: flintType === 'Area Chart' ? 0 : focusedLineMinimum,\n            ...numericYScale,\n        };\n    }\n    spec.legend = mapping.noAxes\n        ? { visible: true, position: 'Right' }\n        : seriesField || dashField\n            ? { visible: true, position: 'Bottom' }\n            : { visible: false };\n    if (isBarFamily) spec.gapWidth = 60;\n    if (flintType === 'Grouped Bar Chart') {\n        const seriesCount = Math.max(1, data[0].length - 1);\n        spec.gapWidth = Math.min(500, (excelChartType.startsWith('Column') ? 60 : 40) * seriesCount);\n        spec.overlap = 0;\n    }\n\n    return spec;\n}\n","import type { ExcelNativeChartSpec } from './types';\n\nexport const EXCEL_ARTIFACT_SCHEMA = 'flint.excel.chart/v1' as const;\n\nexport const SUPPORTED_EXCEL_CHART_TYPES = [\n    'Area',\n    'AreaStacked',\n    'BarClustered',\n    'BarStacked',\n    'BoxWhisker',\n    'Bubble',\n    'ColumnClustered',\n    'ColumnStacked',\n    'Doughnut',\n    'Funnel',\n    'Line',\n    'Pie',\n    'RadarMarkers',\n    'StockOHLC',\n    'Sunburst',\n    'Treemap',\n    'Waterfall',\n    'XYScatter',\n    'XYScatterLines',\n] as const;\n\nconst supportedChartTypes = new Set<string>(SUPPORTED_EXCEL_CHART_TYPES);\n\nexport interface PreparedExcelArtifact {\n    spec: ExcelNativeChartSpec;\n    data: Array<Array<string | number | null>>;\n    rows: number;\n    columns: number;\n    rangeA1: string;\n    chartType: string;\n    numericAxis: boolean;\n    dateAxis: boolean;\n    hasAxes: boolean;\n    isBar: boolean;\n    isLine: boolean;\n    seriesCount: number;\n}\n\nexport function excelColumnLetter(index: number): string {\n    if (!Number.isInteger(index) || index < 0) {\n        throw new Error('Column index must be a non-negative integer.');\n    }\n    let result = '';\n    let remaining = index + 1;\n    while (remaining > 0) {\n        const digit = (remaining - 1) % 26;\n        result = String.fromCharCode(65 + digit) + result;\n        remaining = Math.floor((remaining - 1) / 26);\n    }\n    return result;\n}\n\nexport function prepareExcelArtifact(value: unknown): PreparedExcelArtifact {\n    if (!value || typeof value !== 'object') {\n        throw new Error('Excel artifact must be an object.');\n    }\n    const spec = value as Partial<ExcelNativeChartSpec>;\n    if (spec.schema !== EXCEL_ARTIFACT_SCHEMA || spec.kind !== 'chart') {\n        throw new Error(`Expected a ${EXCEL_ARTIFACT_SCHEMA} chart artifact.`);\n    }\n    const chartType = spec.chartType;\n    if (typeof chartType !== 'string' || !supportedChartTypes.has(chartType)) {\n        throw new Error(`Unsupported Excel chart type: ${String(spec.chartType)}.`);\n    }\n    if (spec.seriesBy !== 'Columns' && spec.seriesBy !== 'Rows') {\n        throw new Error('Excel artifact seriesBy must be Columns or Rows.');\n    }\n    if (!Array.isArray(spec.data) || spec.data.length < 2 || spec.data.some((row) => !Array.isArray(row))) {\n        throw new Error('Excel artifact data must contain a header and at least one data row.');\n    }\n    const columns = Math.max(...spec.data.map((row) => row.length));\n    if (columns < 2) {\n        throw new Error('Excel artifact data must contain at least two columns.');\n    }\n    const rows = spec.data.length;\n    const data = spec.data.map((row) => {\n        const padded = row.slice();\n        while (padded.length < columns) padded.push(null);\n        return padded;\n    });\n    const seriesCount = /Treemap|Sunburst/i.test(chartType)\n        ? 1\n        : spec.series?.length ?? (spec.seriesBy === 'Rows' ? rows - 1 : columns - 1);\n\n    return {\n        spec: spec as ExcelNativeChartSpec,\n        data,\n        rows,\n        columns,\n        rangeA1: `A1:${excelColumnLetter(columns - 1)}${rows}`,\n        chartType,\n        numericAxis: /XYScatter|Bubble/i.test(chartType),\n        dateAxis: /Stock/i.test(chartType),\n        hasAxes: !/Pie|Doughnut|Treemap|Sunburst|Funnel/i.test(chartType),\n        isBar: /Bar|Column/i.test(chartType),\n        isLine: /Line/i.test(chartType),\n        seriesCount,\n    };\n}\n","import { prepareExcelArtifact } from './artifact';\nimport type { ExcelAxisSpec, ExcelNativeChartSpec } from './types';\n\nexport interface OfficeJsCodegenOptions {\n    scale?: number;\n    cleanWorksheet?: boolean;\n    functionName?: string;\n}\n\nexport interface GeneratedOfficeJs {\n    code: string;\n    meta: {\n        schema: ExcelNativeChartSpec['schema'];\n        rangeA1: string;\n        chartType: string;\n        rows: number;\n        columns: number;\n    };\n}\n\nfunction axisCode(axisName: 'categoryAxis' | 'valueAxis', axis: ExcelAxisSpec): string[] {\n    const target = `chart.axes.${axisName}`;\n    const lines: string[] = [];\n    if (axis.title) {\n        lines.push(`  ${target}.title.text = ${JSON.stringify(axis.title)};`);\n        lines.push(`  ${target}.title.visible = true;`);\n    }\n    if (axis.numberFormat) lines.push(`  ${target}.numberFormat = ${JSON.stringify(axis.numberFormat)};`);\n    if (axis.labelFontSize !== undefined) lines.push(`  ${target}.format.font.size = ${axis.labelFontSize};`);\n    if (axis.tickLabelSpacing !== undefined) lines.push(`  ${target}.tickLabelSpacing = ${axis.tickLabelSpacing};`);\n    if (axis.reversePlotOrder !== undefined) lines.push(`  ${target}.reversePlotOrder = ${axis.reversePlotOrder};`);\n    if (axis.minimumScale !== undefined) lines.push(`  ${target}.minimum = ${axis.minimumScale};`);\n    if (axis.maximumScale !== undefined) lines.push(`  ${target}.maximum = ${axis.maximumScale};`);\n    if (axis.majorUnit !== undefined) lines.push(`  ${target}.majorUnit = ${axis.majorUnit};`);\n    return lines;\n}\n\nfunction positiveScale(value: number | undefined): number {\n    const scale = value ?? 3;\n    if (!Number.isFinite(scale) || scale <= 0) throw new Error('Office.js image scale must be positive.');\n    return scale;\n}\n\nexport function generateOfficeJs(value: unknown, options: OfficeJsCodegenOptions = {}): GeneratedOfficeJs {\n    const prepared = prepareExcelArtifact(value);\n    const { spec } = prepared;\n    const functionName = options.functionName ?? 'renderFlintChart';\n    if (!/^[$A-Z_a-z][$\\w]*$/.test(functionName)) {\n        throw new Error('Office.js functionName must be a valid JavaScript identifier.');\n    }\n    const width = spec.width ?? 400;\n    const height = spec.height ?? 300;\n    const scale = positiveScale(options.scale);\n    const imageWidth = Math.round(width * (96 / 72) * scale);\n    const imageHeight = Math.round(height * (96 / 72) * scale);\n    const lines = [\n        `async function ${functionName}(context) {`,\n        '  const sheet = context.workbook.worksheets.getActiveWorksheet();',\n    ];\n\n    if (options.cleanWorksheet) {\n        lines.push(\n            \"  sheet.charts.load('items/name');\",\n            '  const previousRange = sheet.getUsedRangeOrNullObject();',\n            '  await context.sync();',\n            '  sheet.charts.items.forEach((existingChart) => existingChart.delete());',\n            '  if (!previousRange.isNullObject) previousRange.clear();',\n        );\n    }\n\n    lines.push(\n        `  const values = ${JSON.stringify(prepared.data)};`,\n        `  const dataRange = sheet.getRange(${JSON.stringify(prepared.rangeA1)});`,\n        '  dataRange.numberFormat = values.map((row, rowIndex) =>',\n        `    row.map((_cell, columnIndex) => rowIndex === 0 ? '@' : columnIndex === 0 && ${prepared.dateAxis} ? 'yyyy-mm-dd' : columnIndex === 0 && ${!prepared.numericAxis} ? '@' : 'General'),`,\n        '  );',\n        '  dataRange.values = values;',\n        `  const chart = sheet.charts.add(${JSON.stringify(prepared.chartType)}, dataRange, ${JSON.stringify(spec.seriesBy)});`,\n    );\n\n    if (spec.series?.length) {\n        lines.push(\"  chart.series.load('items');\", '  await context.sync();');\n        lines.push(`  if (chart.series.items.length < ${spec.series.length}) throw new Error('Excel inferred too few series.');`);\n        spec.series.forEach((binding, index) => {\n            lines.push(\n                `  chart.series.items[${index}].name = ${JSON.stringify(binding.name)};`,\n                `  chart.series.items[${index}].setXAxisValues(sheet.getRangeByIndexes(1, ${binding.xColumn}, ${binding.rowCount}, 1));`,\n                `  chart.series.items[${index}].setValues(sheet.getRangeByIndexes(1, ${binding.yColumn}, ${binding.rowCount}, 1));`,\n            );\n            if (binding.bubbleSizeColumn !== undefined) {\n                lines.push(`  chart.series.items[${index}].setBubbleSizes(sheet.getRangeByIndexes(1, ${binding.bubbleSizeColumn}, ${binding.rowCount}, 1));`);\n            }\n        });\n        lines.push(\n            `  for (let index = chart.series.items.length - 1; index >= ${spec.series.length}; index -= 1) {`,\n            '    chart.series.getItemAt(index).delete();',\n            '    await context.sync();',\n            '  }',\n        );\n    }\n\n    lines.push(`  chart.width = ${width};`, `  chart.height = ${height};`);\n    if (spec.title) {\n        lines.push(`  chart.title.text = ${JSON.stringify(spec.title)};`, '  chart.title.visible = true;');\n    }\n    if (spec.legend) {\n        lines.push(`  chart.legend.visible = ${spec.legend.visible};`);\n        if (spec.legend.visible && spec.legend.position) {\n            lines.push(`  chart.legend.position = ${JSON.stringify(spec.legend.position)};`);\n        }\n    }\n    if (spec.dataLabels) {\n        lines.push(`  chart.dataLabels.visible = ${spec.dataLabels.visible};`);\n        if (spec.dataLabels.position) lines.push(`  chart.dataLabels.position = ${JSON.stringify(spec.dataLabels.position)};`);\n        if (spec.dataLabels.numberFormat) lines.push(`  chart.dataLabels.numberFormat = ${JSON.stringify(spec.dataLabels.numberFormat)};`);\n        if (spec.dataLabels.fontColor) lines.push(`  chart.dataLabels.format.font.color = ${JSON.stringify(spec.dataLabels.fontColor)};`);\n        if (spec.dataLabels.fontSize !== undefined) lines.push(`  chart.dataLabels.format.font.size = ${spec.dataLabels.fontSize};`);\n    }\n    if (prepared.hasAxes) {\n        if (spec.categoryAxis) lines.push(...axisCode('categoryAxis', spec.categoryAxis));\n        if (spec.valueAxis) lines.push(...axisCode('valueAxis', spec.valueAxis));\n    }\n\n    lines.push(`  const seriesFormats = ${JSON.stringify(spec.seriesFormats ?? [])};`);\n    lines.push(`  for (let index = 0; index < ${prepared.seriesCount}; index += 1) {`, '    const series = chart.series.getItemAt(index);', '    const format = seriesFormats[index];');\n    if (prepared.isBar && spec.gapWidth !== undefined) lines.push(`    series.gapWidth = ${spec.gapWidth};`);\n    if (prepared.isBar && spec.overlap !== undefined) lines.push(`    series.overlap = ${spec.overlap};`);\n    if (/Bubble/i.test(prepared.chartType) && spec.bubbleScale !== undefined) lines.push(`    series.bubbleScale = ${spec.bubbleScale};`);\n    if (/Doughnut/i.test(prepared.chartType) && spec.doughnutHoleSize !== undefined) lines.push(`    series.doughnutHoleSize = ${spec.doughnutHoleSize};`);\n    if (/BoxWhisker/i.test(prepared.chartType) && spec.boxWhiskerOptions) lines.push(`    series.boxwhiskerOptions.set(${JSON.stringify(spec.boxWhiskerOptions)});`);\n    if (/Waterfall/i.test(prepared.chartType) && spec.showConnectorLines !== undefined) lines.push(`    series.showConnectorLines = ${spec.showConnectorLines};`);\n    lines.push('    if (format?.color) {');\n    if (!prepared.isLine) lines.push('      series.format.fill.setSolidColor(format.color);');\n    lines.push('      series.format.line.color = format.color;', '    }', '    if (format?.lineStyle) series.format.line.lineStyle = format.lineStyle;', '  }');\n    lines.push(\n        `  const image = chart.getImage(${imageWidth}, ${imageHeight}, Excel.ImageFittingMode.fit);`,\n        '  await context.sync();',\n        '  return image.value;',\n        '}',\n        '',\n        'async function main() {',\n        `  return Excel.run(${functionName});`,\n        '}',\n        '',\n    );\n\n    return {\n        code: lines.join('\\n'),\n        meta: {\n            schema: spec.schema,\n            rangeA1: prepared.rangeA1,\n            chartType: prepared.chartType,\n            rows: prepared.rows,\n            columns: prepared.columns,\n        },\n    };\n}\n","import { prepareExcelArtifact, type PreparedExcelArtifact } from './artifact';\n\nexport interface OfficeJsExcelApi {\n    run<T>(callback: (context: any) => Promise<T>): Promise<T>;\n    ImageFittingMode: { fit: any };\n}\n\nexport interface ExcelRenderOptions {\n    scale?: number;\n    cleanWorksheet?: boolean;\n    inspectNativeChart?: boolean;\n}\n\nexport interface ExcelRenderResult {\n    pngBase64: string;\n    inspection: unknown | null;\n}\n\nfunction applyChartFormat(chart: any, prepared: PreparedExcelArtifact): void {\n    const { spec } = prepared;\n    if (spec.legend) {\n        chart.legend.visible = spec.legend.visible;\n        if (spec.legend.visible && spec.legend.position) chart.legend.position = spec.legend.position;\n    }\n    if (prepared.hasAxes) {\n        const axes = [\n            [chart.axes.categoryAxis, spec.categoryAxis],\n            [chart.axes.valueAxis, spec.valueAxis],\n        ] as const;\n        for (const [axis, format] of axes) {\n            if (!format) continue;\n            if (format.title) {\n                axis.title.text = format.title;\n                axis.title.visible = true;\n            }\n            if (format.numberFormat) axis.numberFormat = format.numberFormat;\n            if (format.labelFontSize !== undefined) axis.format.font.size = format.labelFontSize;\n            if (format.tickLabelSpacing !== undefined) axis.tickLabelSpacing = format.tickLabelSpacing;\n            if (format.reversePlotOrder !== undefined) axis.reversePlotOrder = format.reversePlotOrder;\n            if (format.minimumScale !== undefined) axis.minimum = format.minimumScale;\n            if (format.maximumScale !== undefined) axis.maximum = format.maximumScale;\n            if (format.majorUnit !== undefined) axis.majorUnit = format.majorUnit;\n        }\n    }\n    if (spec.dataLabels) {\n        chart.dataLabels.visible = spec.dataLabels.visible;\n        if (spec.dataLabels.position) chart.dataLabels.position = spec.dataLabels.position;\n        if (spec.dataLabels.numberFormat) chart.dataLabels.numberFormat = spec.dataLabels.numberFormat;\n        if (spec.dataLabels.fontColor) chart.dataLabels.format.font.color = spec.dataLabels.fontColor;\n        if (spec.dataLabels.fontSize !== undefined) chart.dataLabels.format.font.size = spec.dataLabels.fontSize;\n    }\n    for (let index = 0; index < prepared.seriesCount; index += 1) {\n        const series = chart.series.getItemAt(index);\n        const format = spec.seriesFormats?.[index];\n        if (format?.color) {\n            if (!prepared.isLine) series.format.fill.setSolidColor(format.color);\n            series.format.line.color = format.color;\n        }\n        if (format?.lineStyle) series.format.line.lineStyle = format.lineStyle;\n        if (prepared.isBar && spec.gapWidth !== undefined) series.gapWidth = spec.gapWidth;\n        if (prepared.isBar && spec.overlap !== undefined) series.overlap = spec.overlap;\n        if (/Bubble/i.test(prepared.chartType) && spec.bubbleScale !== undefined) series.bubbleScale = spec.bubbleScale;\n        if (/Doughnut/i.test(prepared.chartType) && spec.doughnutHoleSize !== undefined) series.doughnutHoleSize = spec.doughnutHoleSize;\n        if (/BoxWhisker/i.test(prepared.chartType) && spec.boxWhiskerOptions) series.boxwhiskerOptions.set(spec.boxWhiskerOptions);\n        if (/Waterfall/i.test(prepared.chartType) && spec.showConnectorLines !== undefined) series.showConnectorLines = spec.showConnectorLines;\n    }\n}\n\nasync function inspectChart(context: any, sheet: any, dataRange: any, chart: any): Promise<unknown> {\n    try {\n        dataRange.load('address,values,numberFormat');\n        const usedRange = sheet.getUsedRangeOrNullObject();\n        usedRange.load('isNullObject,address,values');\n        chart.load('name,chartType');\n        chart.series.load('items/name,items/chartType,items/axisGroup,items/formula');\n        await context.sync();\n        for (const series of chart.series.items) {\n            series.binOptions.load('type,count,width,allowOverflow,overflowValue,allowUnderflow,underflowValue');\n        }\n        const primaryCategoryAxis = chart.axes.getItemOrNullObject('Category', 'Primary');\n        const primaryValueAxis = chart.axes.getItemOrNullObject('Value', 'Primary');\n        const secondaryValueAxis = chart.axes.getItemOrNullObject('Value', 'Secondary');\n        for (const axis of [primaryCategoryAxis, primaryValueAxis, secondaryValueAxis]) {\n            axis.load('isNullObject,axisType,axisGroup,visible,minimum,maximum,numberFormat');\n            axis.title.load('text,visible');\n        }\n        await context.sync();\n        const describeAxis = (axis: any) => axis.isNullObject ? null : { ...axis.toJSON(), title: axis.title.toJSON() };\n        return {\n            sourceRange: {\n                address: dataRange.address,\n                values: dataRange.values,\n                numberFormat: dataRange.numberFormat,\n            },\n            usedRange: usedRange.isNullObject ? null : {\n                address: usedRange.address,\n                values: usedRange.values,\n            },\n            chart: {\n                name: chart.name,\n                chartType: chart.chartType,\n                series: chart.series.items.map((series: any) => ({\n                    ...series.toJSON(),\n                    binOptions: series.binOptions.toJSON(),\n                })),\n                axes: {\n                    primaryCategory: describeAxis(primaryCategoryAxis),\n                    primaryValue: describeAxis(primaryValueAxis),\n                    secondaryValue: describeAxis(secondaryValueAxis),\n                },\n            },\n        };\n    } catch (error) {\n        return { error: error instanceof Error ? error.message : String(error) };\n    }\n}\n\nfunction imageScale(value: number | undefined): number {\n    const scale = value ?? 3;\n    if (!Number.isFinite(scale) || scale <= 0) throw new Error('Office.js image scale must be positive.');\n    return scale;\n}\n\nexport async function renderExcelChart(\n    excelApi: OfficeJsExcelApi,\n    value: unknown,\n    options: ExcelRenderOptions = {},\n): Promise<ExcelRenderResult> {\n    const prepared = prepareExcelArtifact(value);\n    const { spec } = prepared;\n    const scale = imageScale(options.scale);\n    return excelApi.run(async (context) => {\n        const sheet = context.workbook.worksheets.getActiveWorksheet();\n        if (options.cleanWorksheet !== false) {\n            sheet.charts.load('items/name');\n            const previousRange = sheet.getUsedRangeOrNullObject();\n            await context.sync();\n            sheet.charts.items.forEach((existingChart: any) => existingChart.delete());\n            if (!previousRange.isNullObject) previousRange.clear();\n        }\n\n        const dataRange = sheet.getRange(prepared.rangeA1);\n        dataRange.numberFormat = prepared.data.map((row, rowIndex) => row.map((_cell, columnIndex) =>\n            rowIndex === 0\n                ? '@'\n                : columnIndex === 0 && prepared.dateAxis\n                    ? 'yyyy-mm-dd'\n                    : columnIndex === 0 && !prepared.numericAxis ? '@' : 'General',\n        ));\n        dataRange.values = prepared.data;\n        const chart = sheet.charts.add(prepared.chartType, dataRange, spec.seriesBy);\n\n        if (spec.series?.length) {\n            chart.series.load('items');\n            await context.sync();\n            if (chart.series.items.length < spec.series.length) {\n                throw new Error(`Excel inferred ${chart.series.items.length} series; ${spec.series.length} required.`);\n            }\n            for (const [index, binding] of spec.series.entries()) {\n                const series = chart.series.items[index];\n                series.name = binding.name;\n                series.setXAxisValues(sheet.getRangeByIndexes(1, binding.xColumn, binding.rowCount, 1));\n                series.setValues(sheet.getRangeByIndexes(1, binding.yColumn, binding.rowCount, 1));\n                if (binding.bubbleSizeColumn !== undefined) {\n                    series.setBubbleSizes(sheet.getRangeByIndexes(1, binding.bubbleSizeColumn, binding.rowCount, 1));\n                }\n            }\n            for (let index = chart.series.items.length - 1; index >= spec.series.length; index -= 1) {\n                chart.series.getItemAt(index).delete();\n                await context.sync();\n            }\n        }\n\n        const width = spec.width ?? 400;\n        const height = spec.height ?? 300;\n        chart.width = width;\n        chart.height = height;\n        if (spec.title) {\n            chart.title.text = spec.title;\n            chart.title.visible = true;\n        }\n        applyChartFormat(chart, prepared);\n        await context.sync();\n        const image = chart.getImage(\n            Math.round(width * (96 / 72) * scale),\n            Math.round(height * (96 / 72) * scale),\n            excelApi.ImageFittingMode.fit,\n        );\n        await context.sync();\n        const inspection = options.inspectNativeChart\n            ? await inspectChart(context, sheet, dataRange, chart)\n            : null;\n        return { pngBase64: image.value, inspection };\n    });\n}\n"]}