@x12i/charts 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +514 -23
- package/dist/chunk-U3U6ZV7A.js +5040 -0
- package/dist/chunk-U3U6ZV7A.js.map +1 -0
- package/dist/echarts-option-DHFfEvN1.d.ts +1251 -0
- package/dist/index.d.ts +262 -154
- package/dist/index.js +537 -27
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +251 -0
- package/dist/react.js +1271 -0
- package/dist/react.js.map +1 -0
- package/dist/styles.css +821 -0
- package/package.json +64 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/downsample.ts","../src/format.ts","../src/messages.ts","../src/stats.ts","../src/data.ts","../src/expr.ts","../src/bin.ts","../src/palette.ts","../src/model.ts","../src/renderer.ts","../src/stack.ts","../src/scales.ts","../src/formatters.ts","../src/layout/cartesian.ts","../src/layout/heatmap.ts","../src/layout/radial.ts","../src/layout/index.ts","../src/interaction.ts","../src/a11y.ts","../src/table.ts","../src/echarts-option.ts"],"sourcesContent":["/**\n * Downsampling for long series. Both methods keep the first and last point and\n * return indices into the input, so callers can pick rows or points.\n */\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/**\n * Largest-Triangle-Three-Buckets (Steinarsson, 2013). Keeps the visual shape of\n * a line while reducing it to `threshold` points. The input must be sorted by x.\n * Returns the kept indices in ascending order. When `threshold` is at least the\n * input length, or under 3, every index (or just the ends) is returned.\n */\nexport function lttbIndices(points: ReadonlyArray<XY>, threshold: number): number[] {\n const length = points.length;\n const target = Math.floor(threshold);\n if (target >= length || length === 0) return points.map((_, i) => i);\n if (target < 3) return length === 1 ? [0] : [0, length - 1];\n\n const kept: number[] = [0];\n const bucketSize = (length - 2) / (target - 2);\n let anchor = 0;\n\n for (let bucket = 0; bucket < target - 2; bucket += 1) {\n // Average of the next bucket is the third corner of the triangle.\n const nextStart = Math.floor((bucket + 1) * bucketSize) + 1;\n const nextEnd = Math.min(Math.floor((bucket + 2) * bucketSize) + 1, length);\n let avgX = 0;\n let avgY = 0;\n const nextCount = Math.max(1, nextEnd - nextStart);\n for (let i = nextStart; i < nextEnd; i += 1) {\n const p = points[i] as XY;\n avgX += p.x;\n avgY += p.y;\n }\n if (nextEnd <= nextStart) {\n const last = points[length - 1] as XY;\n avgX = last.x;\n avgY = last.y;\n } else {\n avgX /= nextCount;\n avgY /= nextCount;\n }\n\n const start = Math.floor(bucket * bucketSize) + 1;\n const end = Math.min(Math.floor((bucket + 1) * bucketSize) + 1, length - 1);\n const a = points[anchor] as XY;\n let bestArea = -1;\n let bestIndex = start;\n for (let i = start; i < end; i += 1) {\n const p = points[i] as XY;\n const area = Math.abs((a.x - avgX) * (p.y - a.y) - (a.x - p.x) * (avgY - a.y)) / 2;\n if (area > bestArea) {\n bestArea = area;\n bestIndex = i;\n }\n }\n kept.push(bestIndex);\n anchor = bestIndex;\n }\n\n kept.push(length - 1);\n return kept;\n}\n\n/** LTTB over any items, with accessors for x and y. Items with a non-finite x or y are dropped first. */\nexport function lttb<T>(\n items: ReadonlyArray<T>,\n getX: (item: T) => number,\n getY: (item: T) => number,\n threshold: number,\n): T[] {\n const usable = items.filter((item) => Number.isFinite(getX(item)) && Number.isFinite(getY(item)));\n const indices = lttbIndices(\n usable.map((item) => ({ x: getX(item), y: getY(item) })),\n threshold,\n );\n return indices.map((index) => usable[index] as T);\n}\n\n/**\n * Min/max bucket downsampling. Splits the input into `buckets` equal runs and\n * keeps the lowest and highest point of each, so spikes always survive. Output\n * has at most `2 * buckets` points, in input order. The input must be sorted by x.\n */\nexport function minMaxIndices(points: ReadonlyArray<XY>, buckets: number): number[] {\n const count = Math.max(1, Math.floor(buckets));\n if (points.length <= count * 2) return points.map((_, i) => i);\n const kept = new Set<number>([0, points.length - 1]);\n const size = points.length / count;\n for (let bucket = 0; bucket < count; bucket += 1) {\n const start = Math.floor(bucket * size);\n const end = Math.min(points.length, Math.floor((bucket + 1) * size));\n let low = start;\n let high = start;\n for (let i = start; i < end; i += 1) {\n const y = (points[i] as XY).y;\n if (y < (points[low] as XY).y) low = i;\n if (y > (points[high] as XY).y) high = i;\n }\n kept.add(low);\n kept.add(high);\n }\n return [...kept].sort((a, b) => a - b);\n}\n\nexport function minMax<T>(\n items: ReadonlyArray<T>,\n getX: (item: T) => number,\n getY: (item: T) => number,\n buckets: number,\n): T[] {\n const usable = items.filter((item) => Number.isFinite(getX(item)) && Number.isFinite(getY(item)));\n const indices = minMaxIndices(\n usable.map((item) => ({ x: getX(item), y: getY(item) })),\n buckets,\n );\n return indices.map((index) => usable[index] as T);\n}\n","/**\n * Number, date and list formatting through `Intl`, with d3-format and\n * d3-time-format specifiers as an escape hatch. Pure and server-safe.\n */\nimport { format as d3Format } from \"d3-format\";\nimport { utcFormat } from \"d3-time-format\";\n\n/**\n * The locale used when none is given. It is fixed rather than read from the\n * runtime, so a chart renders the same text on the server, in the browser and\n * in tests. The default messages are English, so English formats match them.\n */\nexport const DEFAULT_LOCALE = \"en\";\n\nconst RTL_LANGUAGES = new Set([\"ar\", \"he\", \"fa\", \"ur\", \"ps\", \"sd\", \"ug\", \"yi\", \"dv\", \"ckb\", \"iw\"]);\n\n/** True when the locale's language is written right to left (Arabic, Hebrew, Persian, Urdu and others). */\nexport function isRtlLocale(locale: string | undefined): boolean {\n if (!locale) return false;\n const language = locale.toLowerCase().split(/[-_]/)[0] ?? \"\";\n return RTL_LANGUAGES.has(language);\n}\n\n/** Upper-cases the first letter, using the locale's rules. */\nexport function capitalize(text: string, locale?: string): string {\n if (!text) return text;\n const first = text.charAt(0);\n try {\n return first.toLocaleUpperCase(locale ?? DEFAULT_LOCALE) + text.slice(1);\n } catch {\n return first.toUpperCase() + text.slice(1);\n }\n}\n\n/** Joins items with the locale's list rules (\"a, b, and c\"). */\nexport function formatList(items: ReadonlyArray<string>, locale?: string): string {\n if (items.length === 0) return \"\";\n try {\n return new Intl.ListFormat(locale ?? DEFAULT_LOCALE, { style: \"long\", type: \"conjunction\" }).format(items);\n } catch {\n return items.join(\", \");\n }\n}\n\nexport type Formatter<T> = (value: T) => string;\n\nconst numberCache = new Map<string, Intl.NumberFormat>();\n\nfunction intlNumber(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const resolved = locale ?? DEFAULT_LOCALE;\n const key = `${resolved}|${JSON.stringify(options)}`;\n let formatter = numberCache.get(key);\n if (!formatter) {\n try {\n formatter = new Intl.NumberFormat(resolved, options);\n } catch {\n formatter = new Intl.NumberFormat(DEFAULT_LOCALE, options);\n }\n numberCache.set(key, formatter);\n }\n return formatter;\n}\n\n/** Fraction digits needed to show a tick step without rounding it away (0.25 needs 2). */\nexport function fractionDigitsForStep(step: number | undefined, max = 6): number {\n if (step === undefined || !Number.isFinite(step) || step === 0) return 2;\n const abs = Math.abs(step);\n for (let digits = 0; digits <= max; digits += 1) {\n const scaled = abs * 10 ** digits;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-9 * Math.max(1, scaled)) return digits;\n }\n return max;\n}\n\nexport interface NumberFormatOptions {\n /** Tick spacing, used to pick the fraction digits so ticks never repeat a label. */\n step?: number;\n}\n\nconst D3_SPECIFIER = /^(?:.?[<>=^])?[+\\-( ]?[$#]?0?\\d*,?(?:\\.\\d+)?~?[a-zA-Z%]?$/;\n\n/**\n * Builds a number formatter from a named format, a d3-format specifier, or\n * nothing (a sensible default). Named formats: `auto`, `compact`, `percent`\n * (the value is a fraction: 0.25 is 25%), `integer`, `decimal`,\n * `currency:USD`, `currency:USD:compact`, `unit:kilometer`.\n */\nexport function createNumberFormatter(\n format: string | undefined,\n locale?: string,\n { step }: NumberFormatOptions = {},\n): Formatter<number> {\n const digits = fractionDigitsForStep(step);\n const auto = (): Formatter<number> => {\n const maximumFractionDigits = step === undefined ? 2 : digits;\n const formatter = intlNumber(locale, { maximumFractionDigits });\n return (value) => formatter.format(value);\n };\n\n if (format === undefined || format === \"\" || format === \"auto\" || format === \"number\") return auto();\n\n if (format === \"compact\") {\n const formatter = intlNumber(locale, { notation: \"compact\", maximumFractionDigits: 1 });\n return (value) => formatter.format(value);\n }\n if (format === \"percent\") {\n const maximumFractionDigits = step === undefined ? 1 : Math.max(0, digits - 2);\n const formatter = intlNumber(locale, { style: \"percent\", maximumFractionDigits });\n return (value) => formatter.format(value);\n }\n if (format === \"integer\") {\n const formatter = intlNumber(locale, { maximumFractionDigits: 0 });\n return (value) => formatter.format(value);\n }\n if (format === \"decimal\") {\n const formatter = intlNumber(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return (value) => formatter.format(value);\n }\n if (format.startsWith(\"currency:\")) {\n const [, currency, flavor] = format.split(\":\");\n if (currency) {\n try {\n const compact = flavor === \"compact\";\n const wholeSteps = step !== undefined && Number.isInteger(step);\n const formatter = intlNumber(locale, {\n style: \"currency\",\n currency,\n ...(compact ? { notation: \"compact\" as const, maximumFractionDigits: 1 } : {}),\n ...(wholeSteps && !compact ? { maximumFractionDigits: 0, minimumFractionDigits: 0 } : {}),\n });\n return (value) => formatter.format(value);\n } catch {\n return auto();\n }\n }\n return auto();\n }\n if (format.startsWith(\"unit:\")) {\n const unit = format.slice(5);\n try {\n const formatter = intlNumber(locale, { style: \"unit\", unit, maximumFractionDigits: step === undefined ? 2 : digits });\n return (value) => formatter.format(value);\n } catch {\n return auto();\n }\n }\n if (D3_SPECIFIER.test(format)) {\n try {\n const formatter = d3Format(format);\n return (value) => formatter(value);\n } catch {\n return auto();\n }\n }\n return auto();\n}\n\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n date: { dateStyle: \"medium\" },\n datetime: { dateStyle: \"medium\", timeStyle: \"short\" },\n time: { timeStyle: \"short\" },\n month: { month: \"short\", year: \"numeric\" },\n year: { year: \"numeric\" },\n day: { month: \"short\", day: \"numeric\" },\n weekday: { weekday: \"short\" },\n};\n\nconst dateCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction intlDate(\n locale: string | undefined,\n timeZone: string,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat {\n const resolved = locale ?? DEFAULT_LOCALE;\n const key = `${resolved}|${timeZone}|${JSON.stringify(options)}`;\n let formatter = dateCache.get(key);\n if (!formatter) {\n try {\n formatter = new Intl.DateTimeFormat(resolved, { ...options, timeZone });\n } catch {\n formatter = new Intl.DateTimeFormat(DEFAULT_LOCALE, { ...options, timeZone: \"UTC\" });\n }\n dateCache.set(key, formatter);\n }\n return formatter;\n}\n\n/** True when every timestamp (epoch milliseconds) is exactly midnight UTC. */\nexport function isMidnightUtc(values: ReadonlyArray<number>): boolean {\n return values.every((value) => value % 86_400_000 === 0);\n}\n\n/**\n * Builds a date formatter for epoch milliseconds. `format` is a named format\n * (`date`, `datetime`, `time`, `month`, `year`, `day`, `weekday`, `iso`) or a\n * d3-time-format pattern starting with `%` (patterns are UTC). Without a\n * format, whole days print as dates and anything else as date and time.\n */\nexport function createDateFormatter(\n format: string | undefined,\n locale?: string,\n timeZone = \"UTC\",\n hasTimeOfDay = false,\n): Formatter<number> {\n if (format === \"iso\") return (value) => new Date(value).toISOString();\n if (format && format.includes(\"%\")) {\n const formatter = utcFormat(format);\n return (value) => formatter(new Date(value));\n }\n const named = format ? DATE_STYLES[format] : undefined;\n const options = named ?? (hasTimeOfDay ? (DATE_STYLES.datetime as Intl.DateTimeFormatOptions) : (DATE_STYLES.date as Intl.DateTimeFormatOptions));\n const formatter = intlDate(locale, timeZone, options);\n return (value) => formatter.format(new Date(value));\n}\n\nconst MINUTE = 60_000;\nconst DAY = 86_400_000;\n\n/**\n * Picks a compact label for a run of time ticks: years when ticks are a year\n * apart, short months, day and month, or clock times, depending on the spacing.\n */\nexport function createTimeTickFormatter(\n ticks: ReadonlyArray<number>,\n locale?: string,\n timeZone = \"UTC\",\n): Formatter<number> {\n let minGap = Infinity;\n for (let i = 1; i < ticks.length; i += 1) {\n minGap = Math.min(minGap, Math.abs((ticks[i] as number) - (ticks[i - 1] as number)));\n }\n let options: Intl.DateTimeFormatOptions;\n if (!Number.isFinite(minGap) || minGap >= 365 * DAY * 0.9) {\n options = { year: \"numeric\" };\n } else if (minGap >= 28 * DAY) {\n const years = new Set(ticks.map((tick) => new Date(tick).getUTCFullYear()));\n options = years.size > 1 ? { month: \"short\", year: \"numeric\" } : { month: \"short\" };\n } else if (minGap >= DAY) {\n options = { month: \"short\", day: \"numeric\" };\n } else if (minGap >= MINUTE) {\n options = { hour: \"numeric\", minute: \"2-digit\" };\n } else {\n options = { hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\" };\n }\n const formatter = intlDate(locale, timeZone, options);\n return (value) => formatter.format(new Date(value));\n}\n\n/** Formats a share (0 to 1) as a percentage. */\nexport function formatShare(value: number, locale?: string): string {\n return intlNumber(locale, { style: \"percent\", maximumFractionDigits: value < 0.1 ? 1 : 0 }).format(value);\n}\n","/**\n * Message catalog for everything a chart says in words: states, controls,\n * generated descriptions and point announcements. Components contain no\n * user-facing strings; pass `messages` to translate or reword.\n *\n * Templates use an ICU MessageFormat subset: `{name}`, `{n, number}`,\n * `{n, plural, =0 {none} one {# item} other {# items}}` (with `#` standing for\n * the number) and `{kind, select, a {..} other {..}}`.\n */\nimport { DEFAULT_LOCALE } from \"./format\";\nimport type { ChartType } from \"./spec\";\n\nexport interface ChartMessages {\n /* States */\n loading: string;\n empty: string;\n error: string;\n retry: string;\n /** `{mark}` is the chart type name. */\n unsupportedMark: string;\n /** `{ref}` is the dataset name. */\n missingDataset: string;\n invalidSpec: string;\n /** Shown when `echarts` cannot be loaded and the chart falls back to SVG. */\n canvasMissing: string;\n /** Shown when `echarts` loads but cannot draw this chart (for example a waterfall that crosses zero). */\n canvasUnsupported: string;\n canvasLoading: string;\n allSeriesHidden: string;\n\n /* Names and roles */\n /** Role description of the interactive plot, for example \"chart\". */\n chartRoleDescription: string;\n /** Accessible name. `{title}` and `{type}` (lower case, such as \"bar chart\"). */\n chartName: string;\n\n /* Legend, toolbar, table */\n legend: string;\n viewAsTable: string;\n viewAsChart: string;\n downloadCsv: string;\n toolbar: string;\n /** `{title}` is the chart title. */\n tableCaption: string;\n /** `{shown}` and `{total}` are row counts. */\n tableTruncated: string;\n dualAxisWarning: string;\n other: string;\n total: string;\n noValue: string;\n /** Waterfall legend keys. */\n increase: string;\n decrease: string;\n\n /* Axis names used in descriptions */\n axisX: string;\n axisY: string;\n axisY2: string;\n /** `{axis}` and `{title}`. */\n axisWithTitle: string;\n\n /* Table column headers */\n columnSeries: string;\n columnX: string;\n columnY: string;\n columnSize: string;\n columnValue: string;\n columnShare: string;\n columnFrom: string;\n columnTo: string;\n columnCount: string;\n columnChange: string;\n columnRunningTotal: string;\n columnMetric: string;\n columnMinimum: string;\n columnMaximum: string;\n columnTarget: string;\n columnCategory: string;\n columnRow: string;\n\n /* Generated descriptions. `{type}` is capitalized in sentences. */\n describeSummary: string;\n describeCategories: string;\n describeRange: string;\n describeSeries: string;\n trendRising: string;\n trendFalling: string;\n trendFlat: string;\n trendRisingChange: string;\n trendFallingChange: string;\n describeSlices: string;\n describeLargestSlice: string;\n describeGauge: string;\n describeGaugeTarget: string;\n describeHeatmap: string;\n describeHistogram: string;\n describeThreshold: string;\n describeBreaches: string;\n describeHiddenSeries: string;\n /** Pie and donut: `{type}`, `{count}`. */\n describePieSummary: string;\n /** `{start}`, `{end}`. */\n describeWaterfall: string;\n /** `{label}`, `{value}`. */\n describeWaterfallUp: string;\n describeWaterfallDown: string;\n /** `{r}`: the correlation coefficient. */\n describeCorrelationPositive: string;\n describeCorrelationNegative: string;\n describeCorrelationNone: string;\n\n /* Point announcements and tooltips */\n pointCategory: string;\n pointSingle: string;\n pointSlice: string;\n pointXY: string;\n pointBubble: string;\n pointCell: string;\n pointBin: string;\n pointWaterfall: string;\n pointWaterfallTotal: string;\n /** `{text}`, `{index}`, `{count}`. */\n pointPosition: string;\n breachAbove: string;\n breachBelow: string;\n /** Text under a gauge value. `{min}` and `{max}`. */\n gaugeRange: string;\n\n /** Lower-case name of each chart type, for names and descriptions. */\n markNames: Record<ChartType, string>;\n}\n\nexport type ChartMessagesInput = Partial<Omit<ChartMessages, \"markNames\">> & {\n markNames?: Partial<Record<ChartType, string>>;\n};\n\nexport const defaultMessages: ChartMessages = {\n loading: \"Loading chart\",\n empty: \"No data to show\",\n error: \"This chart could not be drawn\",\n retry: \"Try again\",\n unsupportedMark: \"The {mark} chart type is not available in this renderer.\",\n missingDataset: \"Data for “{ref}” was not provided.\",\n invalidSpec: \"This chart’s definition is not valid.\",\n canvasMissing:\n \"The canvas renderer needs the optional echarts package. Install it or use the SVG renderer.\",\n canvasUnsupported: \"The canvas renderer cannot draw this chart, so the SVG renderer is used instead.\",\n canvasLoading: \"Loading the canvas renderer\",\n allSeriesHidden: \"All series are hidden. Use the legend to show them.\",\n\n chartRoleDescription: \"chart\",\n chartName: \"{title} ({type})\",\n\n legend: \"Legend\",\n viewAsTable: \"View as table\",\n viewAsChart: \"View as chart\",\n downloadCsv: \"Download CSV\",\n toolbar: \"Chart actions\",\n tableCaption: \"Data for {title}\",\n tableTruncated: \"Showing the first {shown} of {total} rows. Download the CSV for every row.\",\n dualAxisWarning: \"Two scales: read each series against its own axis.\",\n other: \"Other\",\n total: \"Total\",\n noValue: \"no value\",\n increase: \"Increase\",\n decrease: \"Decrease\",\n\n axisX: \"X axis\",\n axisY: \"Y axis\",\n axisY2: \"Second Y axis\",\n axisWithTitle: \"{axis} ({title})\",\n\n columnSeries: \"Series\",\n columnX: \"X\",\n columnY: \"Y\",\n columnSize: \"Size\",\n columnValue: \"Value\",\n columnShare: \"Share\",\n columnFrom: \"From\",\n columnTo: \"To\",\n columnCount: \"Count\",\n columnChange: \"Change\",\n columnRunningTotal: \"Running total\",\n columnMetric: \"Metric\",\n columnMinimum: \"Minimum\",\n columnMaximum: \"Maximum\",\n columnTarget: \"Target\",\n columnCategory: \"Category\",\n columnRow: \"Row\",\n\n describeSummary:\n \"{type} with {series, plural, one {# series} other {# series}} and {points, plural, one {# data point} other {# data points}}.\",\n describeCategories:\n \"{axis}: {count, plural, one {# category} other {# categories}}, from {first} to {last}.\",\n describeRange: \"{axis}: from {min} to {max}.\",\n describeSeries: \"{series}: lowest {min} at {minAt}, highest {max} at {maxAt}.\",\n trendRising: \"Overall rising, from {first} to {last}.\",\n trendFalling: \"Overall falling, from {first} to {last}.\",\n trendFlat: \"Overall flat, from {first} to {last}.\",\n trendRisingChange: \"Overall rising, up {change} from {first} to {last}.\",\n trendFallingChange: \"Overall falling, down {change} from {first} to {last}.\",\n describeSlices: \"Slices: {list}.\",\n describeLargestSlice: \"{label} is the largest slice at {share}.\",\n describeGauge: \"{value} on a scale from {min} to {max}.\",\n describeGaugeTarget: \"Target: {target}.\",\n describeHeatmap:\n \"{rows, plural, one {# row} other {# rows}} by {columns, plural, one {# column} other {# columns}}. Highest value {max} at {maxAt}, lowest {min} at {minAt}.\",\n describeHistogram:\n \"{bins, plural, one {# bin} other {# bins}} from {min} to {max}. Most common range: {from} to {to}, with {count, plural, one {# value} other {# values}}.\",\n describeThreshold: \"{label}: {value}.\",\n describeBreaches:\n \"{count, plural, one {# point breaches} other {# points breach}} {label}.\",\n describeHiddenSeries: \"Hidden: {list}.\",\n describePieSummary: \"{type} with {count, plural, one {# slice} other {# slices}}.\",\n describeWaterfall: \"The running total goes from {start} to {end}.\",\n describeWaterfallUp: \"Largest increase: {label}, {value}.\",\n describeWaterfallDown: \"Largest decrease: {label}, {value}.\",\n describeCorrelationPositive: \"The values rise together (correlation {r}).\",\n describeCorrelationNegative: \"One falls as the other rises (correlation {r}).\",\n describeCorrelationNone: \"There is no clear relationship (correlation {r}).\",\n\n pointCategory: \"{x}, {series}: {value}\",\n pointSingle: \"{x}: {value}\",\n pointSlice: \"{label}: {value}, {share}\",\n pointXY: \"{series}: {x}, {y}\",\n pointBubble: \"{series}: {x}, {y}, size {size}\",\n pointCell: \"{x}, {y}: {value}\",\n pointBin: \"{from} to {to}: {value}\",\n pointWaterfall: \"{x}: {change}, running total {total}\",\n pointWaterfallTotal: \"{x}: total {total}\",\n pointPosition: \"{text}. {index} of {count}.\",\n breachAbove: \"above {label}\",\n breachBelow: \"below {label}\",\n gaugeRange: \"{min} to {max}\",\n\n markNames: {\n bar: \"bar chart\",\n lollipop: \"lollipop chart\",\n \"dot-plot\": \"dot plot\",\n bullet: \"bullet chart\",\n slope: \"slope chart\",\n dumbbell: \"dumbbell chart\",\n line: \"line chart\",\n area: \"area chart\",\n step: \"step chart\",\n sparkline: \"sparkline\",\n \"range-band\": \"range band chart\",\n candlestick: \"candlestick chart\",\n ohlc: \"OHLC chart\",\n histogram: \"histogram\",\n \"box-plot\": \"box plot\",\n density: \"density plot\",\n strip: \"strip plot\",\n beeswarm: \"beeswarm plot\",\n violin: \"violin plot\",\n ecdf: \"ECDF chart\",\n donut: \"donut chart\",\n pie: \"pie chart\",\n treemap: \"treemap\",\n waterfall: \"waterfall chart\",\n funnel: \"funnel chart\",\n waffle: \"waffle chart\",\n sunburst: \"sunburst chart\",\n marimekko: \"Marimekko chart\",\n scatter: \"scatter plot\",\n bubble: \"bubble chart\",\n \"connected-scatter\": \"connected scatter plot\",\n heatmap: \"heatmap\",\n hexbin: \"hexbin plot\",\n contour: \"contour plot\",\n stat: \"statistic\",\n gauge: \"gauge\",\n \"progress-ring\": \"progress ring\",\n sankey: \"Sankey diagram\",\n chord: \"chord diagram\",\n alluvial: \"alluvial diagram\",\n choropleth: \"choropleth map\",\n \"point-map\": \"point map\",\n \"heat-layer\": \"heat map layer\",\n \"flow-map\": \"flow map\",\n gantt: \"Gantt chart\",\n timeline: \"timeline\",\n burndown: \"burndown chart\",\n \"cumulative-flow\": \"cumulative flow diagram\",\n \"calendar-heatmap\": \"calendar heatmap\",\n combo: \"combination chart\",\n },\n};\n\n/** Merges partial messages over the English defaults. */\nexport function resolveMessages(input?: ChartMessagesInput | undefined): ChartMessages {\n if (!input) return defaultMessages;\n const { markNames, ...rest } = input;\n const merged: ChartMessages = { ...defaultMessages };\n for (const key of Object.keys(rest) as Array<Exclude<keyof ChartMessages, \"markNames\">>) {\n const value = rest[key];\n if (typeof value === \"string\") merged[key] = value;\n }\n merged.markNames = { ...defaultMessages.markNames, ...markNames } as ChartMessages[\"markNames\"];\n return merged;\n}\n\n/* ------------------------------------------------------------------ */\n/* ICU subset */\n/* ------------------------------------------------------------------ */\n\ntype Node =\n | string\n | { arg: string; kind?: string; options?: Record<string, Node[]> };\n\nfunction parse(input: string): Node[] {\n let i = 0;\n\n function parseNodes(nested: boolean): Node[] {\n const nodes: Node[] = [];\n let text = \"\";\n while (i < input.length) {\n const ch = input[i] as string;\n if (ch === \"{\") {\n if (text) nodes.push(text);\n text = \"\";\n i += 1;\n nodes.push(parseArg());\n } else if (ch === \"}\" && nested) {\n break;\n } else {\n text += ch;\n i += 1;\n }\n }\n if (text) nodes.push(text);\n return nodes;\n }\n\n function readUntil(stops: string): string {\n let out = \"\";\n while (i < input.length && !stops.includes(input[i] as string)) {\n out += input[i];\n i += 1;\n }\n return out.trim();\n }\n\n function parseArg(): Node {\n const arg = readUntil(\",}\");\n if (input[i] === \"}\") {\n i += 1;\n return { arg };\n }\n i += 1; // comma\n const kind = readUntil(\",}\");\n if (input[i] === \"}\") {\n i += 1;\n return { arg, kind };\n }\n i += 1; // comma\n const options: Record<string, Node[]> = {};\n while (i < input.length) {\n while (i < input.length && /\\s/.test(input[i] as string)) i += 1;\n if (input[i] === \"}\") {\n i += 1;\n break;\n }\n let key = \"\";\n while (i < input.length && input[i] !== \"{\" && !/\\s/.test(input[i] as string)) {\n key += input[i];\n i += 1;\n }\n while (i < input.length && /\\s/.test(input[i] as string)) i += 1;\n if (input[i] === \"{\") {\n i += 1;\n options[key] = parseNodes(true);\n i += 1; // closing brace\n } else {\n break;\n }\n }\n return { arg, kind, options };\n }\n\n return parseNodes(false);\n}\n\nconst parsed = new Map<string, Node[]>();\n\nfunction safeLocale(locale: string | undefined): string {\n if (!locale) return DEFAULT_LOCALE;\n try {\n return Intl.NumberFormat.supportedLocalesOf(locale)[0] ?? DEFAULT_LOCALE;\n } catch {\n return DEFAULT_LOCALE;\n }\n}\n\nfunction render(\n nodes: Node[],\n values: Record<string, string | number | undefined>,\n locale: string,\n pluralNumber?: number,\n): string {\n let out = \"\";\n for (const node of nodes) {\n if (typeof node === \"string\") {\n out += pluralNumber === undefined ? node : node.replaceAll(\"#\", formatNumberPlain(pluralNumber, locale));\n continue;\n }\n const raw = values[node.arg];\n if (node.kind === \"plural\" && node.options) {\n const n = Number(raw);\n const exact = node.options[`=${n}`];\n const category = new Intl.PluralRules(locale).select(Number.isFinite(n) ? n : 0);\n const chosen = exact ?? node.options[category] ?? node.options.other ?? [];\n out += render(chosen, values, locale, Number.isFinite(n) ? n : 0);\n } else if (node.kind === \"select\" && node.options) {\n const chosen = node.options[String(raw)] ?? node.options.other ?? [];\n out += render(chosen, values, locale, pluralNumber);\n } else if (node.kind === \"number\") {\n out += typeof raw === \"number\" ? formatNumberPlain(raw, locale) : String(raw ?? \"\");\n } else {\n out += raw === undefined ? \"\" : String(raw);\n }\n }\n return out;\n}\n\nfunction formatNumberPlain(value: number, locale: string): string {\n try {\n return new Intl.NumberFormat(locale).format(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Fills an ICU-subset template. Unknown arguments render as empty text.\n * Numbers passed as `number` are used for plural rules; pass already formatted\n * text as `string` for display.\n */\nexport function formatMessage(\n template: string,\n values: Record<string, string | number | undefined> = {},\n locale?: string,\n): string {\n let nodes = parsed.get(template);\n if (!nodes) {\n nodes = parse(template);\n parsed.set(template, nodes);\n }\n return render(nodes, values, safeLocale(locale));\n}\n","/**\n * Statistics helpers. Pure functions over plain arrays; no DOM and no React.\n * Missing values are `null` or `undefined` and are skipped unless noted.\n */\nimport { quantile as d3Quantile } from \"d3-array\";\n\nexport type MaybeNumber = number | null | undefined;\n\nfunction finite(values: ReadonlyArray<MaybeNumber>): number[] {\n const out: number[] = [];\n for (const value of values) {\n if (typeof value === \"number\" && Number.isFinite(value)) out.push(value);\n }\n return out;\n}\n\nexport function sum(values: ReadonlyArray<MaybeNumber>): number {\n let total = 0;\n for (const value of finite(values)) total += value;\n return total;\n}\n\n/** Arithmetic mean, or `null` when there are no values. */\nexport function mean(values: ReadonlyArray<MaybeNumber>): number | null {\n const list = finite(values);\n return list.length === 0 ? null : sum(list) / list.length;\n}\n\n/** Linear-interpolated quantile for `p` in [0, 1] (the R-7 method), or `null` when empty. */\nexport function quantile(values: ReadonlyArray<MaybeNumber>, p: number): number | null {\n const list = finite(values).sort((a, b) => a - b);\n if (list.length === 0) return null;\n return d3Quantile(list, Math.min(1, Math.max(0, p))) ?? null;\n}\n\nexport function median(values: ReadonlyArray<MaybeNumber>): number | null {\n return quantile(values, 0.5);\n}\n\n/** Sample variance (n - 1 denominator), or `null` with fewer than two values. */\nexport function variance(values: ReadonlyArray<MaybeNumber>): number | null {\n const list = finite(values);\n if (list.length < 2) return null;\n const average = sum(list) / list.length;\n let squares = 0;\n for (const value of list) squares += (value - average) ** 2;\n return squares / (list.length - 1);\n}\n\nexport function standardDeviation(values: ReadonlyArray<MaybeNumber>): number | null {\n const result = variance(values);\n return result === null ? null : Math.sqrt(result);\n}\n\n/** Smallest and largest finite value, or `null` when empty. */\nexport function extent(values: ReadonlyArray<MaybeNumber>): [number, number] | null {\n let low = Infinity;\n let high = -Infinity;\n for (const value of finite(values)) {\n if (value < low) low = value;\n if (value > high) high = value;\n }\n return low === Infinity ? null : [low, high];\n}\n\nexport interface LinearRegression {\n slope: number;\n intercept: number;\n /** Coefficient of determination, from 0 to 1. 1 when all y values are equal. */\n r2: number;\n /** Number of points used. */\n count: number;\n predict: (x: number) => number;\n}\n\n/** Ordinary least squares over `[x, y]` pairs. Returns `null` with fewer than two distinct x values. */\nexport function linearRegression(\n points: ReadonlyArray<readonly [number, number]>,\n): LinearRegression | null {\n const valid = points.filter(([x, y]) => Number.isFinite(x) && Number.isFinite(y));\n const n = valid.length;\n if (n < 2) return null;\n let sumX = 0;\n let sumY = 0;\n for (const [x, y] of valid) {\n sumX += x;\n sumY += y;\n }\n const meanX = sumX / n;\n const meanY = sumY / n;\n let covariance = 0;\n let varianceX = 0;\n let totalSquares = 0;\n for (const [x, y] of valid) {\n covariance += (x - meanX) * (y - meanY);\n varianceX += (x - meanX) ** 2;\n totalSquares += (y - meanY) ** 2;\n }\n if (varianceX === 0) return null;\n const slope = covariance / varianceX;\n const intercept = meanY - slope * meanX;\n let residualSquares = 0;\n for (const [x, y] of valid) residualSquares += (y - (slope * x + intercept)) ** 2;\n const r2 = totalSquares === 0 ? 1 : Math.max(0, 1 - residualSquares / totalSquares);\n return { slope, intercept, r2, count: n, predict: (x) => slope * x + intercept };\n}\n\n/** Pearson correlation of paired values, or `null` when it is undefined. */\nexport function correlation(\n xs: ReadonlyArray<MaybeNumber>,\n ys: ReadonlyArray<MaybeNumber>,\n): number | null {\n const pairs: Array<[number, number]> = [];\n const length = Math.min(xs.length, ys.length);\n for (let i = 0; i < length; i += 1) {\n const x = xs[i];\n const y = ys[i];\n if (typeof x === \"number\" && typeof y === \"number\" && Number.isFinite(x) && Number.isFinite(y)) {\n pairs.push([x, y]);\n }\n }\n if (pairs.length < 2) return null;\n const meanX = sum(pairs.map(([x]) => x)) / pairs.length;\n const meanY = sum(pairs.map(([, y]) => y)) / pairs.length;\n let covariance = 0;\n let varX = 0;\n let varY = 0;\n for (const [x, y] of pairs) {\n covariance += (x - meanX) * (y - meanY);\n varX += (x - meanX) ** 2;\n varY += (y - meanY) ** 2;\n }\n if (varX === 0 || varY === 0) return null;\n return covariance / Math.sqrt(varX * varY);\n}\n\nexport interface MovingAverageOptions {\n /** `trailing` averages the current and earlier values; `centered` looks both ways. Defaults to `trailing`. */\n align?: \"trailing\" | \"centered\";\n /**\n * When true (default), the first `window - 1` outputs are `null` instead of\n * partial averages, so the line never starts with a misleading short window.\n */\n strict?: boolean;\n}\n\n/**\n * Moving average over `window` values. The output has the same length as the\n * input. Missing values inside a window are skipped; a window with no values\n * gives `null`.\n */\nexport function movingAverage(\n values: ReadonlyArray<MaybeNumber>,\n window: number,\n { align = \"trailing\", strict = true }: MovingAverageOptions = {},\n): Array<number | null> {\n const size = Math.max(1, Math.floor(window));\n const out: Array<number | null> = [];\n for (let i = 0; i < values.length; i += 1) {\n let from: number;\n let to: number;\n if (align === \"centered\") {\n const before = Math.floor((size - 1) / 2);\n from = i - before;\n to = from + size - 1;\n } else {\n to = i;\n from = i - size + 1;\n }\n if (strict && (from < 0 || to >= values.length)) {\n out.push(null);\n continue;\n }\n out.push(mean(values.slice(Math.max(0, from), Math.min(values.length, to + 1))));\n }\n return out;\n}\n\n/** Running total. Missing values add nothing and keep the previous total. */\nexport function cumulativeSum(values: ReadonlyArray<MaybeNumber>): number[] {\n let total = 0;\n return values.map((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) total += value;\n return total;\n });\n}\n\n/**\n * Change from `from` to `to` as a fraction (0.25 means +25%), or `null` when\n * the starting value is zero or missing. Negative starting values use the\n * absolute value so that an increase is always positive.\n */\nexport function percentChange(from: MaybeNumber, to: MaybeNumber): number | null {\n if (typeof from !== \"number\" || typeof to !== \"number\") return null;\n if (!Number.isFinite(from) || !Number.isFinite(to) || from === 0) return null;\n return (to - from) / Math.abs(from);\n}\n\n/** Period-over-period change as fractions. The first `periods` entries are `null`. */\nexport function periodChange(values: ReadonlyArray<MaybeNumber>, periods = 1): Array<number | null> {\n const lag = Math.max(1, Math.floor(periods));\n return values.map((value, index) => (index < lag ? null : percentChange(values[index - lag], value)));\n}\n\nexport type Trend = \"rising\" | \"falling\" | \"flat\";\n\n/**\n * Overall direction of a series. Fits a line through the values; the trend is\n * `flat` when the fitted change over the whole series is under `tolerance`\n * (default 5%) of the value range.\n */\nexport function trendDirection(values: ReadonlyArray<MaybeNumber>, tolerance = 0.05): Trend {\n const points: Array<[number, number]> = [];\n values.forEach((value, index) => {\n if (typeof value === \"number\" && Number.isFinite(value)) points.push([index, value]);\n });\n const fit = linearRegression(points);\n const range = extent(points.map(([, y]) => y));\n if (!fit || !range) return \"flat\";\n const spread = range[1] - range[0];\n if (spread === 0) return \"flat\";\n const lastIndex = points[points.length - 1]?.[0] ?? 0;\n const firstIndex = points[0]?.[0] ?? 0;\n const change = fit.slope * (lastIndex - firstIndex);\n if (Math.abs(change) < tolerance * spread) return \"flat\";\n return change > 0 ? \"rising\" : \"falling\";\n}\n\nexport interface RegressionBand {\n x: number;\n y: number;\n lower: number;\n upper: number;\n}\n\n/**\n * Confidence band around a linear fit, using the standard error of the\n * estimate and a normal critical value (`z`, default 1.96 for about 95%).\n * `at` lists the x values to evaluate, so the band can extend past the data\n * for a forecast overlay.\n */\nexport function regressionBand(\n points: ReadonlyArray<readonly [number, number]>,\n at: ReadonlyArray<number>,\n z = 1.96,\n): RegressionBand[] {\n const fit = linearRegression(points);\n if (!fit || fit.count < 3) return [];\n const valid = points.filter(([x, y]) => Number.isFinite(x) && Number.isFinite(y));\n const meanX = sum(valid.map(([x]) => x)) / valid.length;\n let sxx = 0;\n let residuals = 0;\n for (const [x, y] of valid) {\n sxx += (x - meanX) ** 2;\n residuals += (y - fit.predict(x)) ** 2;\n }\n const standardError = Math.sqrt(residuals / (valid.length - 2));\n return at.map((x) => {\n const y = fit.predict(x);\n const margin = z * standardError * Math.sqrt(1 + 1 / valid.length + (x - meanX) ** 2 / sxx);\n return { x, y, lower: y - margin, upper: y + margin };\n });\n}\n\n/**\n * Linear forecast: continues the fitted line for `steps` more points spaced\n * `step` apart, starting after the last x. Returns `[]` when no line can be fit.\n */\nexport function forecastLinear(\n points: ReadonlyArray<readonly [number, number]>,\n steps: number,\n step = 1,\n): Array<[number, number]> {\n const fit = linearRegression(points);\n if (!fit) return [];\n const lastX = Math.max(...points.map(([x]) => x));\n const out: Array<[number, number]> = [];\n for (let i = 1; i <= steps; i += 1) {\n const x = lastX + i * step;\n out.push([x, fit.predict(x)]);\n }\n return out;\n}\n","/**\n * Row access, value coercion and the transform pipeline. Pure and server-safe.\n */\nimport { bin as d3Bin } from \"d3-array\";\nimport { lttbIndices } from \"./downsample\";\nimport { defaultMessages } from \"./messages\";\nimport { cumulativeSum, mean, movingAverage, percentChange } from \"./stats\";\nimport type { ChartSpec, Row, StackMode, Transform } from \"./spec\";\n\nexport type Datasets = Readonly<Record<string, ReadonlyArray<Row>>>;\n\n/** Rows for a spec: inline values, or the named dataset from `datasets`. `undefined` when a `ref` is not provided. */\nexport function resolveRows(spec: ChartSpec, datasets?: Datasets): ReadonlyArray<Row> | undefined {\n if (\"values\" in spec.data) return Array.isArray(spec.data.values) ? spec.data.values : [];\n return datasets?.[spec.data.ref];\n}\n\n/** Total number of data points a spec would draw, for choosing a renderer. */\nexport function countPoints(spec: ChartSpec, datasets?: Datasets): number {\n let total = 0;\n const rows = resolveRows(spec, datasets);\n if (spec.series && spec.series.length > 0) {\n for (const series of spec.series) {\n if (series.points) total += series.points.length;\n else if (series.field) total += rows?.length ?? 0;\n }\n return total;\n }\n return rows?.length ?? 0;\n}\n\n/** Reads a field, allowing dotted paths into nested objects. */\nexport function readField(row: Row, field: string): unknown {\n if (field in row) return row[field];\n if (!field.includes(\".\")) return undefined;\n let value: unknown = row;\n for (const part of field.split(\".\")) {\n if (value === null || typeof value !== \"object\") return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n return value;\n}\n\n/** A finite number, or `null`. Numeric strings are accepted; booleans and blanks are not. */\nexport function toNumber(value: unknown): number | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.getTime();\n return null;\n}\n\n/**\n * Epoch milliseconds from a Date, a number (already milliseconds), or a date\n * string. Date-only strings and strings with an offset parse as written;\n * strings without an offset are read as UTC so output does not depend on the\n * machine's time zone.\n */\nexport function toTime(value: unknown): number | null {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value !== \"string\" || value.trim() === \"\") return null;\n const text = value.trim();\n const hasZone = /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(text);\n const normalized = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}/.test(text) && !hasZone ? `${text.replace(\" \", \"T\")}Z` : text;\n const parsed = Date.parse(normalized);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\n/** Display key for a category value. Booleans and numbers become strings; blanks become an empty string. */\nexport function toCategory(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nexport interface TransformContext {\n /** Field that names categories (the x field), used by `top-n` and `downsample`. */\n categoryField?: string | undefined;\n /** Field that splits rows into series (the color field); window transforms run per group. */\n groupField?: string | undefined;\n /** Whether x holds times or numbers (for sorting and downsampling). */\n xKind?: \"category\" | \"number\" | \"time\" | undefined;\n /** Label for the merged \"Other\" row of `top-n`. */\n otherLabel?: string | undefined;\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const x = toNumber(a);\n const y = toNumber(b);\n if (x !== null && y !== null) return x - y;\n return String(a ?? \"\").localeCompare(String(b ?? \"\"));\n}\n\nfunction groupKey(row: Row, fields: ReadonlyArray<string>): string {\n return JSON.stringify(fields.map((field) => readField(row, field) ?? null));\n}\n\nfunction perGroup(rows: ReadonlyArray<Row>, groupField: string | undefined, run: (group: Row[]) => Row[]): Row[] {\n if (!groupField) return run([...rows]);\n const groups = new Map<string, Row[]>();\n for (const row of rows) {\n const key = String(readField(row, groupField) ?? \"\");\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n return [...groups.values()].flatMap((group) => run(group));\n}\n\nfunction applyOne(rows: Row[], transform: Transform, context: TransformContext): Row[] {\n switch (transform.type) {\n case \"aggregate\": {\n const groups = new Map<string, Row[]>();\n for (const row of rows) {\n const key = groupKey(row, transform.groupBy);\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n return [...groups.values()].map((group) => {\n const first = group[0] as Row;\n const out: Row = {};\n for (const field of transform.groupBy) out[field] = readField(first, field);\n const numbers = transform.field\n ? group.map((row) => toNumber(readField(row, transform.field as string))).filter((v): v is number => v !== null)\n : [];\n switch (transform.op) {\n case \"count\":\n out[transform.as] = group.length;\n break;\n case \"sum\":\n out[transform.as] = numbers.reduce((total, value) => total + value, 0);\n break;\n case \"mean\":\n out[transform.as] = mean(numbers);\n break;\n case \"min\":\n out[transform.as] = numbers.length ? Math.min(...numbers) : null;\n break;\n case \"max\":\n out[transform.as] = numbers.length ? Math.max(...numbers) : null;\n break;\n }\n return out;\n });\n }\n case \"bin\": {\n const values = rows.map((row) => toNumber(readField(row, transform.field)));\n const numbers = values.filter((value): value is number => value !== null);\n if (numbers.length === 0) return rows.map((row) => ({ ...row, [transform.as]: null, [`${transform.as}_end`]: null }));\n const generator = d3Bin<number, number>().value((value) => value);\n if (transform.maxBins && transform.maxBins > 0) generator.thresholds(Math.floor(transform.maxBins));\n const buckets = generator(numbers);\n return rows.map((row, index) => {\n const value = values[index];\n if (value === null || value === undefined) return { ...row, [transform.as]: null, [`${transform.as}_end`]: null };\n const bucket = buckets.find((candidate, bucketIndex) => {\n const lower = candidate.x0 ?? 0;\n const upper = candidate.x1 ?? 0;\n return value >= lower && (value < upper || (bucketIndex === buckets.length - 1 && value <= upper));\n });\n return { ...row, [transform.as]: bucket?.x0 ?? null, [`${transform.as}_end`]: bucket?.x1 ?? null };\n });\n }\n case \"stack\":\n // Stacking is a layout step controlled by `spec.stack`; rows pass through.\n return rows;\n case \"percent-of-total\": {\n const total = rows.reduce((acc, row) => acc + (toNumber(readField(row, transform.field)) ?? 0), 0);\n return rows.map((row) => {\n const value = toNumber(readField(row, transform.field));\n return { ...row, [transform.as]: value === null || total === 0 ? null : value / total };\n });\n }\n case \"sort\": {\n const direction = transform.order === \"desc\" ? -1 : 1;\n return rows\n .map((row, index) => ({ row, index }))\n .sort((a, b) => direction * compareValues(readField(a.row, transform.field), readField(b.row, transform.field)) || a.index - b.index)\n .map((entry) => entry.row);\n }\n case \"top-n\": {\n const category = context.categoryField;\n if (!category || transform.n < 1) return rows;\n const totals = new Map<string, { total: number; rows: Row[] }>();\n for (const row of rows) {\n const key = toCategory(readField(row, category));\n const entry = totals.get(key) ?? { total: 0, rows: [] };\n entry.total += toNumber(readField(row, transform.field)) ?? 0;\n entry.rows.push(row);\n totals.set(key, entry);\n }\n const ranked = [...totals.entries()].sort((a, b) => b[1].total - a[1].total);\n if (ranked.length <= transform.n) return rows;\n const kept = ranked.slice(0, transform.n);\n const rest = ranked.slice(transform.n);\n const other: Row = {\n [category]: transform.otherLabel ?? context.otherLabel ?? defaultMessages.other,\n [transform.field]: rest.reduce((acc, [, entry]) => acc + entry.total, 0),\n };\n return [...kept.flatMap(([, entry]) => entry.rows), other];\n }\n case \"rolling-average\":\n return perGroup(rows, context.groupField, (group) => {\n const averages = movingAverage(\n group.map((row) => toNumber(readField(row, transform.field))),\n transform.window,\n );\n return group.map((row, index) => ({ ...row, [transform.as]: averages[index] ?? null }));\n });\n case \"cumulative-sum\":\n return perGroup(rows, context.groupField, (group) => {\n const totals = cumulativeSum(group.map((row) => toNumber(readField(row, transform.field))));\n return group.map((row, index) => ({ ...row, [transform.as]: totals[index] ?? null }));\n });\n case \"period-change\": {\n const lag = Math.max(1, Math.floor(transform.periods ?? 1));\n return perGroup(rows, context.groupField, (group) => {\n const values = group.map((row) => toNumber(readField(row, transform.field)));\n return group.map((row, index) => ({\n ...row,\n [transform.as]: index < lag ? null : percentChange(values[index - lag], values[index]),\n }));\n });\n }\n case \"downsample\": {\n const xField = context.categoryField;\n return perGroup(rows, context.groupField, (group) => {\n if (group.length <= transform.threshold) return group;\n const points = group.map((row, index) => ({\n x: xField ? (context.xKind === \"time\" ? toTime(readField(row, xField)) : toNumber(readField(row, xField))) ?? index : index,\n y: toNumber(readField(row, transform.field)) ?? 0,\n }));\n return lttbIndices(points, transform.threshold).map((index) => group[index] as Row);\n });\n }\n }\n}\n\n/** Runs transforms in order. Unknown or invalid parameters leave the rows unchanged. */\nexport function applyTransforms(\n rows: ReadonlyArray<Row>,\n transforms: ReadonlyArray<Transform> | undefined,\n context: TransformContext = {},\n): Row[] {\n let current: Row[] = [...rows];\n for (const transform of transforms ?? []) current = applyOne(current, transform, context);\n return current;\n}\n\n/** The stack mode a spec asks for: `spec.stack`, else implied by a `stack` transform, else `none`. */\nexport function effectiveStack(spec: ChartSpec): StackMode {\n if (spec.stack) return spec.stack;\n const transform = spec.transforms?.find((candidate) => candidate.type === \"stack\");\n if (!transform || transform.type !== \"stack\") return \"none\";\n return transform.offset === \"normalize\" ? \"normalized\" : \"stacked\";\n}\n","/**\n * A tiny, safe expression language for `highlight.where`, for example\n * `week == 'W4'` or `revenue > 100 && region in ['EU', 'US']`.\n *\n * Grammar: literals (numbers, quoted strings, true, false, null), field names,\n * `== != < <= > >=`, `in [..]`, `!`, `&&`, `||` and parentheses. It never calls\n * `eval` or `Function`, so specs from untrusted sources are safe to evaluate.\n */\nimport type { Row } from \"./spec\";\n\ntype Token =\n | { type: \"number\"; value: number }\n | { type: \"string\"; value: string }\n | { type: \"ident\"; value: string }\n | { type: \"op\"; value: string };\n\ntype Expr =\n | { kind: \"literal\"; value: unknown }\n | { kind: \"field\"; name: string }\n | { kind: \"array\"; items: Expr[] }\n | { kind: \"not\"; operand: Expr }\n | { kind: \"binary\"; op: string; left: Expr; right: Expr };\n\nexport class ExpressionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExpressionError\";\n }\n}\n\nconst OPERATORS = [\"==\", \"!=\", \"<=\", \">=\", \"&&\", \"||\", \"<\", \">\", \"!\", \"(\", \")\", \"[\", \"]\", \",\"];\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i] as string;\n if (/\\s/.test(ch)) {\n i += 1;\n continue;\n }\n if (ch === \"'\" || ch === '\"') {\n let value = \"\";\n i += 1;\n while (i < input.length && input[i] !== ch) {\n if (input[i] === \"\\\\\" && i + 1 < input.length) i += 1;\n value += input[i];\n i += 1;\n }\n if (input[i] !== ch) throw new ExpressionError(\"Unterminated string\");\n i += 1;\n tokens.push({ type: \"string\", value });\n continue;\n }\n const numberMatch = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?/i.exec(input.slice(i));\n const previous = tokens[tokens.length - 1];\n const startsOperand = !previous || previous.type === \"op\";\n if (numberMatch && (ch !== \"-\" || startsOperand) && /[\\d-]/.test(ch)) {\n tokens.push({ type: \"number\", value: Number(numberMatch[0]) });\n i += numberMatch[0].length;\n continue;\n }\n const op = OPERATORS.find((candidate) => input.startsWith(candidate, i));\n if (op) {\n tokens.push({ type: \"op\", value: op });\n i += op.length;\n continue;\n }\n const identMatch = /^[\\p{L}_$][\\p{L}\\p{N}_$.]*/u.exec(input.slice(i));\n if (identMatch) {\n tokens.push({ type: \"ident\", value: identMatch[0] });\n i += identMatch[0].length;\n continue;\n }\n throw new ExpressionError(`Unexpected character \"${ch}\"`);\n }\n return tokens;\n}\n\nfunction parseExpression(tokens: Token[]): Expr {\n let position = 0;\n\n const peek = (): Token | undefined => tokens[position];\n const isOp = (value: string): boolean => {\n const token = peek();\n return token?.type === \"op\" && token.value === value;\n };\n const isWord = (value: string): boolean => {\n const token = peek();\n return token?.type === \"ident\" && token.value === value;\n };\n\n function parseOr(): Expr {\n let left = parseAnd();\n while (isOp(\"||\")) {\n position += 1;\n left = { kind: \"binary\", op: \"||\", left, right: parseAnd() };\n }\n return left;\n }\n function parseAnd(): Expr {\n let left = parseComparison();\n while (isOp(\"&&\")) {\n position += 1;\n left = { kind: \"binary\", op: \"&&\", left, right: parseComparison() };\n }\n return left;\n }\n function parseComparison(): Expr {\n const left = parseUnary();\n const token = peek();\n if (token?.type === \"op\" && [\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"].includes(token.value)) {\n position += 1;\n return { kind: \"binary\", op: token.value, left, right: parseUnary() };\n }\n if (isWord(\"in\")) {\n position += 1;\n return { kind: \"binary\", op: \"in\", left, right: parseUnary() };\n }\n return left;\n }\n function parseUnary(): Expr {\n if (isOp(\"!\")) {\n position += 1;\n return { kind: \"not\", operand: parseUnary() };\n }\n return parsePrimary();\n }\n function parsePrimary(): Expr {\n const token = peek();\n if (!token) throw new ExpressionError(\"Unexpected end of expression\");\n position += 1;\n if (token.type === \"number\" || token.type === \"string\") return { kind: \"literal\", value: token.value };\n if (token.type === \"ident\") {\n if (token.value === \"true\") return { kind: \"literal\", value: true };\n if (token.value === \"false\") return { kind: \"literal\", value: false };\n if (token.value === \"null\") return { kind: \"literal\", value: null };\n return { kind: \"field\", name: token.value };\n }\n if (token.value === \"(\") {\n const inner = parseOr();\n if (!isOp(\")\")) throw new ExpressionError(\"Missing closing parenthesis\");\n position += 1;\n return inner;\n }\n if (token.value === \"[\") {\n const items: Expr[] = [];\n while (!isOp(\"]\")) {\n if (!peek()) throw new ExpressionError(\"Missing closing bracket\");\n items.push(parseOr());\n if (isOp(\",\")) position += 1;\n }\n position += 1;\n return { kind: \"array\", items };\n }\n throw new ExpressionError(`Unexpected \"${token.value}\"`);\n }\n\n const result = parseOr();\n if (position < tokens.length) throw new ExpressionError(\"Unexpected trailing input\");\n return result;\n}\n\nfunction looseEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || a === undefined || b === null || b === undefined) {\n return (a === null || a === undefined) && (b === null || b === undefined);\n }\n if (typeof a === \"number\" || typeof b === \"number\") {\n const x = Number(a);\n const y = Number(b);\n return Number.isFinite(x) && Number.isFinite(y) && x === y;\n }\n return String(a) === String(b);\n}\n\nfunction compare(a: unknown, b: unknown): number | null {\n if (a === null || a === undefined || b === null || b === undefined) return null;\n if (typeof a === \"number\" || typeof b === \"number\") {\n const x = Number(a);\n const y = Number(b);\n return Number.isFinite(x) && Number.isFinite(y) ? x - y : null;\n }\n return String(a) < String(b) ? -1 : String(a) > String(b) ? 1 : 0;\n}\n\nfunction evaluate(expr: Expr, row: Row): unknown {\n switch (expr.kind) {\n case \"literal\":\n return expr.value;\n case \"field\": {\n // Dotted names read nested values: `user.region`.\n let value: unknown = row;\n for (const part of expr.name.split(\".\")) {\n if (value === null || typeof value !== \"object\") return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n return value;\n }\n case \"array\":\n return expr.items.map((item) => evaluate(item, row));\n case \"not\":\n return !evaluate(expr.operand, row);\n case \"binary\": {\n if (expr.op === \"&&\") return Boolean(evaluate(expr.left, row)) && Boolean(evaluate(expr.right, row));\n if (expr.op === \"||\") return Boolean(evaluate(expr.left, row)) || Boolean(evaluate(expr.right, row));\n const left = evaluate(expr.left, row);\n const right = evaluate(expr.right, row);\n if (expr.op === \"==\") return looseEquals(left, right);\n if (expr.op === \"!=\") return !looseEquals(left, right);\n if (expr.op === \"in\") return Array.isArray(right) && right.some((item) => looseEquals(left, item));\n const order = compare(left, right);\n if (order === null) return false;\n if (expr.op === \"<\") return order < 0;\n if (expr.op === \"<=\") return order <= 0;\n if (expr.op === \">\") return order > 0;\n return order >= 0;\n }\n }\n}\n\nconst compiled = new Map<string, Expr | ExpressionError>();\n\nfunction compileCached(expression: string): Expr | ExpressionError {\n let entry = compiled.get(expression);\n if (!entry) {\n try {\n entry = parseExpression(tokenize(expression));\n } catch (error) {\n entry = error instanceof ExpressionError ? error : new ExpressionError(\"Invalid expression\");\n }\n compiled.set(expression, entry);\n }\n return entry;\n}\n\n/** Returns an error message when the expression does not parse, otherwise `null`. */\nexport function checkWhere(expression: string): string | null {\n const entry = compileCached(expression);\n return entry instanceof ExpressionError ? entry.message : null;\n}\n\n/**\n * Compiles an expression into a row predicate. An expression that does not\n * parse matches nothing, so a typo never highlights the wrong marks; use\n * `checkWhere` (or `validateChartSpec`) to report the problem.\n */\nexport function compileWhere(expression: string): (row: Row) => boolean {\n const entry = compileCached(expression);\n if (entry instanceof ExpressionError) return () => false;\n return (row) => Boolean(evaluate(entry, row));\n}\n\n/** Evaluates `expression` against one row. */\nexport function evaluateWhere(expression: string, row: Row): boolean {\n return compileWhere(expression)(row);\n}\n","import { bin as d3Bin } from \"d3-array\";\n\nexport interface HistogramBin {\n /** Inclusive lower edge. */\n x0: number;\n /** Exclusive upper edge (inclusive for the last bin). */\n x1: number;\n count: number;\n}\n\nexport interface HistogramOptions {\n /** Approximate number of bins; boundaries land on nice values. */\n count?: number;\n /** Explicit boundaries, which override `count`. */\n thresholds?: ReadonlyArray<number>;\n /** Fixed range. Defaults to the data extent. */\n domain?: readonly [number, number];\n}\n\n/**\n * Bins numbers for a histogram. Non-finite values are ignored. Boundaries come\n * from d3-array: nice values near the requested count, or the explicit list.\n * Returns `[]` for empty input.\n */\nexport function histogramBins(\n values: ReadonlyArray<number | null | undefined>,\n options: HistogramOptions = {},\n): HistogramBin[] {\n const numbers = values.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value),\n );\n if (numbers.length === 0) return [];\n\n const generator = d3Bin<number, number>().value((value) => value);\n if (options.domain) generator.domain([options.domain[0], options.domain[1]]);\n if (options.thresholds && options.thresholds.length > 0) {\n generator.thresholds([...options.thresholds].sort((a, b) => a - b));\n } else if (options.count !== undefined && options.count > 0) {\n generator.thresholds(Math.floor(options.count));\n }\n\n return generator(numbers)\n .filter((bucket) => bucket.x0 !== undefined && bucket.x1 !== undefined)\n .map((bucket) => ({ x0: bucket.x0 as number, x1: bucket.x1 as number, count: bucket.length }));\n}\n","/**\n * Series styling: which tone, marker shape and dash pattern each series gets.\n * Colors are never constants here; tones map to `--kit-*` variables, so charts\n * theme through CSS (light, dark, high contrast) without any JavaScript.\n *\n * Color is never the only channel: every series also gets its own marker\n * shape and dash pattern, so series stay distinguishable in grayscale and for\n * color-blind readers.\n */\nimport { cssVar, cssVarName, type TokenPath } from \"@x12i/tokens\";\nimport type { AnnotationTone, DashStyle, MarkerShape, SeriesSpec, SeriesTone } from \"./spec\";\n\n/** The categorical palette has eight hues; further series reuse them with new shapes and dashes. */\nexport const MAX_HUES = 8;\n\nexport const markerShapes: ReadonlyArray<MarkerShape> = [\n \"circle\",\n \"square\",\n \"triangle\",\n \"diamond\",\n \"cross\",\n \"triangle-down\",\n \"plus\",\n];\n\nexport const dashStyles: ReadonlyArray<DashStyle> = [\"solid\", \"dashed\", \"dotted\", \"dash-dot\"];\n\n/** SVG `stroke-dasharray` for each dash style (undefined means a solid line). */\nexport const dashArrays: Readonly<Record<DashStyle, string | undefined>> = {\n solid: undefined,\n dashed: \"6 4\",\n dotted: \"1 4\",\n \"dash-dot\": \"8 3 1 3\",\n};\n\nexport const categoricalTones: ReadonlyArray<SeriesTone> = [\n \"categorical-1\",\n \"categorical-2\",\n \"categorical-3\",\n \"categorical-4\",\n \"categorical-5\",\n \"categorical-6\",\n \"categorical-7\",\n \"categorical-8\",\n];\n\nexport interface SeriesStyle {\n /** Position in the series list, for hatch patterns and `data-series`. */\n index: number;\n tone: SeriesTone;\n marker: MarkerShape;\n dash: DashStyle;\n}\n\n/**\n * The style of series `index` out of `count`. A lone series uses the accent\n * (\"grey first, one accent\"); several series use the categorical palette.\n * Explicit `tone`, `marker` and `dash` on the series win.\n */\nexport function seriesStyle(index: number, count: number, series?: Pick<SeriesSpec, \"tone\" | \"marker\" | \"dash\">): SeriesStyle {\n const tone: SeriesTone = series?.tone ?? (count <= 1 ? \"accent\" : (categoricalTones[index % MAX_HUES] as SeriesTone));\n // Dashes cycle every 4 series, but only after the hues have run out of distinctness.\n const dash = series?.dash ?? (dashStyles[index % dashStyles.length] as DashStyle);\n const marker = series?.marker ?? (markerShapes[index % markerShapes.length] as MarkerShape);\n return { index, tone, marker, dash };\n}\n\n/** Token path for a tone, such as `color.chart.categorical.3` or `color.accent.default`. */\nexport function toneTokenPath(tone: SeriesTone): TokenPath {\n switch (tone) {\n case \"accent\":\n return \"color.accent.default\";\n case \"muted\":\n return \"color.chart.muted\";\n case \"reference\":\n return \"color.chart.reference\";\n case \"good\":\n return \"color.chart.good\";\n case \"warning\":\n return \"color.chart.warning\";\n case \"critical\":\n return \"color.chart.critical\";\n default: {\n const slot = tone.slice(\"categorical-\".length);\n return `color.chart.categorical.${slot}` as TokenPath;\n }\n }\n}\n\n/** `var(--kit-color-chart-categorical-3)` and friends. */\nexport function toneCssVar(tone: SeriesTone): string {\n return cssVar(toneTokenPath(tone));\n}\n\n/** The bare custom property name (`--kit-color-chart-good`), for runtime lookups. */\nexport function toneVarName(tone: SeriesTone): string {\n return cssVarName(toneTokenPath(tone));\n}\n\n/** Maps an annotation tone to a series tone. Neutral annotations are grey reference marks. */\nexport function annotationTone(tone: AnnotationTone | undefined): SeriesTone {\n switch (tone) {\n case \"good\":\n return \"good\";\n case \"warning\":\n return \"warning\";\n case \"critical\":\n return \"critical\";\n default:\n return \"reference\";\n }\n}\n\nconst SEQUENTIAL_STEPS = 9;\n\nfunction ramp(prefix: \"sequential\" | \"diverging\", t: number): string {\n const clamped = Math.min(1, Math.max(0, Number.isFinite(t) ? t : 0));\n const position = clamped * (SEQUENTIAL_STEPS - 1);\n const lower = Math.min(SEQUENTIAL_STEPS - 2, Math.floor(position));\n const fraction = position - lower;\n const from = cssVar(`color.${prefix}.${lower + 1}` as TokenPath);\n const to = cssVar(`color.${prefix}.${lower + 2}` as TokenPath);\n if (fraction < 0.001) return from;\n if (fraction > 0.999) return to;\n const share = Math.round((1 - fraction) * 100);\n return `color-mix(in srgb, ${from} ${share}%, ${to})`;\n}\n\n/** CSS color for a value `t` (0 to 1) along the sequential ramp, interpolated between ramp steps. */\nexport function sequentialColor(t: number): string {\n return ramp(\"sequential\", t);\n}\n\n/** CSS color for `t` (0 to 1) along the diverging ramp; 0.5 is the neutral midpoint. */\nexport function divergingColor(t: number): string {\n return ramp(\"diverging\", t);\n}\n\n/** CSS gradient covering a whole ramp, for color scale legends. */\nexport function rampGradient(kind: \"sequential\" | \"diverging\"): string {\n const stops = Array.from({ length: SEQUENTIAL_STEPS }, (_, i) => cssVar(`color.${kind}.${i + 1}` as TokenPath));\n return `linear-gradient(to right, ${stops.join(\", \")})`;\n}\n\n/** Marker shapes drawn as open strokes (an X and a plus) instead of filled areas. */\nexport function isOpenMarker(shape: MarkerShape): boolean {\n return shape === \"cross\" || shape === \"plus\";\n}\n\n/**\n * SVG path data for a marker centered on (cx, cy) with \"radius\" r. All shapes\n * are paths so one element type renders every series marker.\n */\nexport function markerPath(shape: MarkerShape, cx: number, cy: number, r: number): string {\n const f = (value: number): string => String(Math.round(value * 100) / 100);\n switch (shape) {\n case \"circle\":\n return `M${f(cx - r)},${f(cy)}a${f(r)},${f(r)} 0 1,0 ${f(2 * r)},0a${f(r)},${f(r)} 0 1,0 ${f(-2 * r)},0Z`;\n case \"square\":\n return `M${f(cx - r)},${f(cy - r)}h${f(2 * r)}v${f(2 * r)}h${f(-2 * r)}Z`;\n case \"diamond\": {\n const d = r * 1.25;\n return `M${f(cx)},${f(cy - d)}L${f(cx + d)},${f(cy)}L${f(cx)},${f(cy + d)}L${f(cx - d)},${f(cy)}Z`;\n }\n case \"triangle\": {\n const h = r * 1.2;\n return `M${f(cx)},${f(cy - h)}L${f(cx + h)},${f(cy + h * 0.8)}L${f(cx - h)},${f(cy + h * 0.8)}Z`;\n }\n case \"triangle-down\": {\n const h = r * 1.2;\n return `M${f(cx)},${f(cy + h)}L${f(cx + h)},${f(cy - h * 0.8)}L${f(cx - h)},${f(cy - h * 0.8)}Z`;\n }\n case \"cross\": {\n const a = r * 0.9;\n return `M${f(cx - a)},${f(cy - a)}L${f(cx + a)},${f(cy + a)}M${f(cx - a)},${f(cy + a)}L${f(cx + a)},${f(cy - a)}`;\n }\n case \"plus\": {\n const a = r * 1.1;\n return `M${f(cx - a)},${f(cy)}H${f(cx + a)}M${f(cx)},${f(cy - a)}V${f(cy + a)}`;\n }\n }\n}\n","/**\n * Turns a `ChartSpec` plus rows into a `ChartModel`: typed series and points,\n * categories, slices, bins and gauge values. Pure and server-safe. Everything\n * downstream (layout, descriptions, tables, the canvas mapping) reads the model.\n */\nimport { histogramBins, type HistogramBin } from \"./bin\";\nimport {\n applyTransforms,\n effectiveStack,\n readField,\n resolveRows,\n toCategory,\n toNumber,\n toTime,\n type Datasets,\n} from \"./data\";\nimport { compileWhere } from \"./expr\";\nimport { resolveMessages, type ChartMessagesInput } from \"./messages\";\nimport { seriesStyle, type SeriesStyle } from \"./palette\";\nimport type {\n AnnotationTone,\n ChartSpec,\n ChartType,\n Row,\n SeriesMark,\n SeriesSpec,\n StackMode,\n} from \"./spec\";\n\nexport type XKind = \"category\" | \"number\" | \"time\";\n\n/** Chart types the SVG renderer draws. */\nexport const supportedMarks: ReadonlyArray<ChartType> = [\n \"bar\",\n \"lollipop\",\n \"line\",\n \"area\",\n \"step\",\n \"sparkline\",\n \"combo\",\n \"scatter\",\n \"bubble\",\n \"histogram\",\n \"waterfall\",\n \"donut\",\n \"pie\",\n \"heatmap\",\n \"gauge\",\n \"progress-ring\",\n];\n\nexport function isSupportedMark(mark: ChartType): boolean {\n return supportedMarks.includes(mark);\n}\n\nexport interface ModelPoint {\n /** Position within the series. */\n index: number;\n /** Position of this point's x among the model's categories. */\n categoryIndex: number;\n /** Stable key for x: the category text, or the number or timestamp as text. */\n key: string;\n /** The x value: a category label, a number, or epoch milliseconds. */\n x: string | number;\n /** Upper edge of a histogram bin. */\n x1?: number;\n /** Row category of a heatmap cell. */\n group?: string;\n y: number | null;\n size: number | null;\n /** Label from the data, which replaces the formatted x in tooltips and tables. */\n label?: string;\n row: Row;\n highlighted: boolean;\n}\n\nexport interface ModelSeries {\n id: string;\n label: string;\n mark: SeriesMark;\n axis: \"y\" | \"y2\";\n style: SeriesStyle;\n stackKey: string;\n format?: string;\n /** Starts hidden. */\n hidden: boolean;\n points: ModelPoint[];\n}\n\nexport interface ModelSlice {\n id: string;\n label: string;\n value: number;\n /** Fraction of the total, 0 to 1. */\n share: number;\n style: SeriesStyle;\n highlighted: boolean;\n /** True for the merged \"Other\" slice. */\n other?: boolean;\n row: Row | null;\n}\n\nexport interface ModelGauge {\n value: number;\n min: number;\n max: number;\n target: number | undefined;\n bands: ReadonlyArray<{ from: number; to: number; tone: AnnotationTone; label?: string | undefined }>;\n format: string | undefined;\n}\n\nexport interface WaterfallStep {\n key: string;\n label: string;\n delta: number;\n start: number;\n end: number;\n total: boolean;\n}\n\nexport type ModelStatus = \"ok\" | \"empty\" | \"missing-data\" | \"unsupported\";\n\nexport interface ChartModel {\n spec: ChartSpec;\n mark: ChartType;\n status: ModelStatus;\n /** The dataset name that was not provided, when `status` is `missing-data`. */\n missingRef?: string;\n xKind: XKind;\n /** Ordered union of x values across series, as keys. */\n categories: string[];\n /** Raw x value for each category key. */\n categoryValues: Array<string | number>;\n series: ModelSeries[];\n /** Pie and donut slices; empty for other types. */\n slices: ModelSlice[];\n heatmap?: { columns: string[]; rows: string[]; min: number; max: number };\n histogram?: { bins: HistogramBin[] };\n gauge?: ModelGauge;\n waterfall?: { steps: WaterfallStep[] };\n stack: StackMode;\n orientation: \"vertical\" | \"horizontal\";\n /** True when the plot has a second value axis. */\n dualAxis: boolean;\n pointCount: number;\n /** Rows dropped because x or y could not be read. */\n droppedPoints: number;\n xTitle: string | undefined;\n yTitle: string | undefined;\n y2Title: string | undefined;\n timeZone: string;\n /** True when time values carry a time of day. */\n hasTimeOfDay: boolean;\n hasHighlight: boolean;\n}\n\nexport interface BuildModelOptions {\n datasets?: Datasets | undefined;\n messages?: ChartMessagesInput | undefined;\n}\n\nconst BAND_MARKS: ReadonlySet<ChartType> = new Set<ChartType>([\"bar\", \"lollipop\", \"waterfall\", \"combo\"]);\n\n/** True for chart types whose x axis has one slot per category. */\nexport function usesBandX(mark: ChartType): boolean {\n return BAND_MARKS.has(mark);\n}\n\nfunction defaultSeriesMark(mark: ChartType): SeriesMark {\n switch (mark) {\n case \"line\":\n case \"sparkline\":\n return \"line\";\n case \"area\":\n return \"area\";\n case \"step\":\n return \"step\";\n case \"scatter\":\n case \"bubble\":\n return \"scatter\";\n default:\n return \"bar\";\n }\n}\n\nfunction xKindOf(spec: ChartSpec, sample: unknown): XKind {\n if (spec.mark === \"pie\" || spec.mark === \"donut\" || spec.mark === \"heatmap\" || spec.mark === \"gauge\" || spec.mark === \"progress-ring\") {\n return \"category\";\n }\n if (spec.mark === \"histogram\") return \"number\";\n const declared = spec.x?.type;\n if (declared === \"time\") return \"time\";\n if (declared === \"number\") return \"number\";\n if (declared === \"category\" || declared === \"boolean\") return \"category\";\n if (typeof sample === \"number\") return \"number\";\n if (sample instanceof Date) return \"time\";\n return \"category\";\n}\n\nfunction readX(raw: unknown, kind: XKind): string | number | null {\n if (kind === \"category\") {\n const text = toCategory(raw);\n return text === \"\" && (raw === null || raw === undefined) ? null : text;\n }\n return kind === \"time\" ? toTime(raw) : toNumber(raw);\n}\n\ninterface RawPoint {\n x: string | number;\n y: number | null;\n size: number | null;\n label?: string | undefined;\n group?: string | undefined;\n row: Row;\n}\n\nexport function buildChartModel(spec: ChartSpec, options: BuildModelOptions = {}): ChartModel {\n const messages = resolveMessages(options.messages);\n const stack = effectiveStack(spec);\n const orientation = spec.orientation ?? \"vertical\";\n const timeZone = spec.timeZone ?? \"UTC\";\n\n const base: ChartModel = {\n spec,\n mark: spec.mark,\n status: \"ok\",\n xKind: \"category\",\n categories: [],\n categoryValues: [],\n series: [],\n slices: [],\n stack,\n orientation,\n dualAxis: false,\n pointCount: 0,\n droppedPoints: 0,\n xTitle: spec.axes?.x?.title ?? spec.x?.title,\n yTitle: spec.axes?.y?.title ?? spec.y?.title,\n y2Title: spec.axes?.y2?.title,\n timeZone,\n hasTimeOfDay: false,\n hasHighlight: false,\n };\n\n if (!isSupportedMark(spec.mark)) return { ...base, status: \"unsupported\" };\n\n const rows = resolveRows(spec, options.datasets);\n const usesRows = !spec.series || spec.series.some((series) => !series.points);\n if (rows === undefined && usesRows && \"ref\" in spec.data) {\n return { ...base, status: \"missing-data\", missingRef: spec.data.ref };\n }\n\n // Probe x to decide its kind before transforms need it.\n const probeField = spec.x?.field;\n const probeRow = probeField ? rows?.find((row) => readField(row, probeField) !== undefined && readField(row, probeField) !== null) : undefined;\n const probeSample =\n probeRow && probeField\n ? readField(probeRow, probeField)\n : spec.series?.find((series) => series.points && series.points.length > 0)?.points?.[0]?.x;\n const xKind = xKindOf(spec, probeSample);\n\n const transformed = applyTransforms(rows ?? [], spec.transforms, {\n categoryField: spec.x?.field,\n groupField: spec.color?.field,\n xKind,\n otherLabel: messages.other,\n });\n\n const where = spec.highlight?.where ? compileWhere(spec.highlight.where) : undefined;\n let dropped = 0;\n\n const toPoints = (\n source: ReadonlyArray<Row>,\n xField: string | undefined,\n yField: string | undefined,\n sizeField: string | undefined,\n ): RawPoint[] => {\n const points: RawPoint[] = [];\n for (const row of source) {\n const x = xField ? readX(readField(row, xField), xKind) : null;\n if (x === null) {\n dropped += 1;\n continue;\n }\n points.push({\n x,\n y: yField ? toNumber(readField(row, yField)) : null,\n size: sizeField ? toNumber(readField(row, sizeField)) : null,\n row,\n });\n }\n return points;\n };\n\n interface Draft {\n spec: SeriesSpec | undefined;\n id: string;\n label: string;\n points: RawPoint[];\n }\n const drafts: Draft[] = [];\n const xField = spec.x?.field;\n const yField = spec.y?.field;\n const sizeField = spec.size?.field;\n let histogramBinsResult: HistogramBin[] | undefined;\n let heatmap: ChartModel[\"heatmap\"];\n\n if (spec.mark === \"heatmap\") {\n const valueField = (spec.value ?? spec.color)?.field;\n const columns: string[] = [];\n const rowKeys: string[] = [];\n const points: RawPoint[] = [];\n for (const row of transformed) {\n const column = xField ? toCategory(readField(row, xField)) : \"\";\n const rowKey = yField ? toCategory(readField(row, yField)) : \"\";\n if (!columns.includes(column)) columns.push(column);\n if (!rowKeys.includes(rowKey)) rowKeys.push(rowKey);\n points.push({\n x: column,\n group: rowKey,\n y: valueField ? toNumber(readField(row, valueField)) : null,\n size: null,\n row,\n });\n }\n const values = points.map((point) => point.y).filter((value): value is number => value !== null);\n heatmap = {\n columns,\n rows: rowKeys,\n min: values.length ? Math.min(...values) : 0,\n max: values.length ? Math.max(...values) : 0,\n };\n drafts.push({\n spec: undefined,\n id: \"value\",\n label: (spec.value ?? spec.color)?.title ?? (spec.value ?? spec.color)?.field ?? messages.columnValue,\n points,\n });\n } else if (spec.mark === \"gauge\" || spec.mark === \"progress-ring\") {\n const valueEncoding = spec.value ?? spec.y;\n const first = transformed[0];\n const fromData = first && valueEncoding ? toNumber(readField(first, valueEncoding.field)) : null;\n const value = spec.gauge?.value ?? fromData;\n if (value !== null && value !== undefined) {\n drafts.push({\n spec: undefined,\n id: \"value\",\n label: valueEncoding?.title ?? valueEncoding?.field ?? messages.columnValue,\n points: [{ x: valueEncoding?.title ?? valueEncoding?.field ?? messages.columnValue, y: value, size: null, row: first ?? {} }],\n });\n }\n } else if (spec.mark === \"histogram\") {\n const groups = new Map<string, Row[]>();\n for (const row of transformed) {\n const key = spec.color ? toCategory(readField(row, spec.color.field)) : \"\";\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n const allValues = transformed.map((row) => (xField ? toNumber(readField(row, xField)) : null));\n const binOptions = {\n ...(spec.bins?.count !== undefined ? { count: spec.bins.count } : {}),\n ...(spec.bins?.thresholds ? { thresholds: spec.bins.thresholds } : {}),\n };\n const shared = histogramBins(allValues, binOptions);\n histogramBinsResult = shared;\n const thresholds = shared.length > 0 ? [...shared.slice(1).map((bin) => bin.x0)] : [];\n const domain: [number, number] | undefined = shared.length\n ? [(shared[0] as HistogramBin).x0, (shared[shared.length - 1] as HistogramBin).x1]\n : undefined;\n for (const [key, groupRows] of groups) {\n const bins = histogramBins(\n groupRows.map((row) => (xField ? toNumber(readField(row, xField)) : null)),\n { thresholds, ...(domain ? { domain } : {}) },\n );\n drafts.push({\n spec: undefined,\n id: key === \"\" ? \"count\" : key,\n label: key === \"\" ? (spec.y?.title ?? messages.columnCount) : key,\n points: bins.map((bin) => ({\n x: bin.x0,\n y: bin.count,\n size: null,\n row: { [xField ?? \"x\"]: bin.x0, [`${xField ?? \"x\"}_end`]: bin.x1, count: bin.count },\n group: String(bin.x1),\n })),\n });\n }\n } else if (spec.series && spec.series.length > 0) {\n for (const series of spec.series) {\n if (series.points) {\n const points: RawPoint[] = [];\n for (const point of series.points) {\n const x = readX(point.x, xKind);\n if (x === null) {\n dropped += 1;\n continue;\n }\n points.push({\n x,\n y: point.y === null ? null : toNumber(point.y),\n size: point.size === undefined ? null : toNumber(point.size),\n label: point.label,\n row: { [xField ?? \"x\"]: point.x, [yField ?? \"y\"]: point.y, series: series.id },\n });\n }\n drafts.push({ spec: series, id: series.id, label: series.label ?? series.id, points });\n } else {\n drafts.push({\n spec: series,\n id: series.id,\n label: series.label ?? series.id,\n points: toPoints(transformed, xField, series.field ?? yField, sizeField),\n });\n }\n }\n } else if (spec.color) {\n const groups = new Map<string, Row[]>();\n for (const row of transformed) {\n const key = toCategory(readField(row, spec.color.field));\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n for (const [key, groupRows] of groups) {\n drafts.push({ spec: undefined, id: key, label: key, points: toPoints(groupRows, xField, yField, sizeField) });\n }\n } else if (yField || xField) {\n drafts.push({\n spec: undefined,\n id: yField ?? \"y\",\n label: spec.y?.title ?? yField ?? \"\",\n points: toPoints(transformed, xField, yField, sizeField),\n });\n }\n\n // Order of x values across series.\n const keyOf = (x: string | number): string => String(x);\n const categoryMap = new Map<string, string | number>();\n for (const draft of drafts) {\n for (const point of draft.points) {\n if (!categoryMap.has(keyOf(point.x))) categoryMap.set(keyOf(point.x), point.x);\n }\n }\n let categoryKeys = [...categoryMap.keys()];\n if (spec.mark === \"histogram\") {\n // Bins are already in order.\n } else if (xKind !== \"category\") {\n categoryKeys.sort((a, b) => (categoryMap.get(a) as number) - (categoryMap.get(b) as number));\n } else if (spec.scales?.x?.domain && spec.scales.x.domain.length > 0 && spec.mark !== \"heatmap\") {\n const wanted = spec.scales.x.domain.map(String);\n categoryKeys = [...wanted.filter((key) => categoryMap.has(key)), ...categoryKeys.filter((key) => !wanted.includes(key))];\n }\n if (spec.mark === \"heatmap\" && heatmap) categoryKeys = heatmap.columns;\n const categoryIndex = new Map(categoryKeys.map((key, index) => [key, index]));\n\n const seriesCount = drafts.length;\n const sortContinuous = xKind !== \"category\" && !usesBandX(spec.mark) && spec.mark !== \"histogram\" && spec.mark !== \"scatter\" && spec.mark !== \"bubble\";\n const isBand = usesBandX(spec.mark);\n\n const modelSeries: ModelSeries[] = drafts.map((draft, seriesIndex) => {\n let raw = draft.points;\n if (isBand) raw = mergeDuplicates(raw, keyOf);\n if (sortContinuous) raw = [...raw].sort((a, b) => (a.x as number) - (b.x as number));\n const points: ModelPoint[] = raw.map((point, index) => {\n const key = spec.mark === \"heatmap\" ? String(point.x) : keyOf(point.x);\n const highlighted = where ? where(point.row) : false;\n return {\n index,\n categoryIndex: categoryIndex.get(key) ?? 0,\n key,\n x: point.x,\n ...(spec.mark === \"histogram\" && point.group !== undefined ? { x1: Number(point.group) } : {}),\n ...(spec.mark === \"heatmap\" && point.group !== undefined ? { group: point.group } : {}),\n y: point.y,\n size: point.size,\n ...(point.label !== undefined ? { label: point.label } : {}),\n row: point.row,\n highlighted,\n };\n });\n const seriesSpec = draft.spec;\n const mark = seriesSpec?.mark ?? defaultSeriesMark(spec.mark);\n return {\n id: draft.id,\n label: draft.label,\n mark,\n axis: seriesSpec?.axis === \"y2\" && spec.dualAxis === true ? \"y2\" : \"y\",\n style: seriesStyle(seriesIndex, seriesCount, seriesSpec),\n stackKey: seriesSpec?.stack ?? \"default\",\n ...(seriesSpec?.format !== undefined ? { format: seriesSpec.format } : {}),\n hidden: seriesSpec?.hidden === true,\n points,\n };\n });\n\n const hasHighlight = modelSeries.some((series) => series.points.some((point) => point.highlighted));\n\n const hasTimeOfDay =\n xKind === \"time\" &&\n modelSeries.some((series) => series.points.some((point) => typeof point.x === \"number\" && point.x % 86_400_000 !== 0));\n\n const pointCount = modelSeries.reduce((total, series) => total + series.points.length, 0);\n\n const model: ChartModel = {\n ...base,\n xKind,\n categories: categoryKeys,\n categoryValues: categoryKeys.map((key) => categoryMap.get(key) ?? key),\n series: modelSeries,\n dualAxis: modelSeries.some((series) => series.axis === \"y2\"),\n // A second axis without a title is unreadable, so it is named after its series.\n y2Title:\n base.y2Title ??\n (modelSeries.some((series) => series.axis === \"y2\")\n ? modelSeries\n .filter((series) => series.axis === \"y2\")\n .map((series) => series.label)\n .join(\", \")\n : undefined),\n pointCount,\n droppedPoints: dropped,\n hasTimeOfDay,\n hasHighlight,\n ...(heatmap ? { heatmap } : {}),\n ...(histogramBinsResult ? { histogram: { bins: histogramBinsResult } } : {}),\n };\n\n if (spec.mark === \"pie\" || spec.mark === \"donut\") {\n model.slices = buildSlices(model, messages.other);\n }\n if (spec.mark === \"gauge\" || spec.mark === \"progress-ring\") {\n const value = modelSeries[0]?.points[0]?.y;\n if (value !== null && value !== undefined) {\n const declaredMax = spec.gauge?.max;\n const min = spec.gauge?.min ?? 0;\n const format = spec.gauge?.format ?? spec.value?.format ?? spec.y?.format;\n // A percent gauge with a value from 0 to 1 is a fraction, so its range ends at 1.\n const fractionOfOne = format === \"percent\" && min === 0 && value >= 0 && value <= 1;\n const max = declaredMax ?? (fractionOfOne ? 1 : value > 100 ? niceCeil(value) : 100);\n model.gauge = {\n value,\n min,\n max: max > min ? max : min + 1,\n target: spec.gauge?.target,\n bands: spec.gauge?.bands ?? [],\n format,\n };\n }\n }\n if (spec.mark === \"waterfall\") {\n model.waterfall = { steps: buildWaterfall(model) };\n }\n\n if (spec.mark === \"gauge\" || spec.mark === \"progress-ring\") {\n if (!model.gauge) model.status = \"empty\";\n } else if (spec.mark === \"pie\" || spec.mark === \"donut\") {\n if (model.slices.length === 0) model.status = \"empty\";\n } else if (pointCount === 0 || !modelSeries.some((series) => series.points.some((point) => point.y !== null || spec.mark === \"histogram\"))) {\n model.status = \"empty\";\n }\n return model;\n}\n\nfunction niceCeil(value: number): number {\n const magnitude = 10 ** Math.floor(Math.log10(Math.abs(value)));\n return Math.ceil(value / magnitude) * magnitude;\n}\n\nfunction mergeDuplicates(points: RawPoint[], keyOf: (x: string | number) => string): RawPoint[] {\n const seen = new Map<string, RawPoint>();\n const out: RawPoint[] = [];\n for (const point of points) {\n const key = keyOf(point.x);\n const existing = seen.get(key);\n if (!existing) {\n const copy = { ...point };\n seen.set(key, copy);\n out.push(copy);\n } else if (point.y !== null) {\n existing.y = (existing.y ?? 0) + point.y;\n }\n }\n return out;\n}\n\nfunction buildSlices(model: ChartModel, otherLabel: string): ModelSlice[] {\n const spec = model.spec;\n const maxSlices = Math.max(2, Math.floor(spec.donut?.maxSlices ?? 5));\n interface Entry {\n id: string;\n label: string;\n value: number;\n row: Row | null;\n highlighted: boolean;\n }\n let entries: Entry[] = [];\n if (model.series.length === 1) {\n const only = model.series[0] as ModelSeries;\n for (const point of only.points) {\n if (point.y !== null && point.y > 0) {\n entries.push({ id: point.key, label: point.label ?? point.key, value: point.y, row: point.row, highlighted: point.highlighted });\n }\n }\n } else {\n for (const series of model.series) {\n const total = series.points.reduce((acc, point) => acc + (point.y !== null && point.y > 0 ? point.y : 0), 0);\n if (total > 0) {\n entries.push({\n id: series.id,\n label: series.label,\n value: total,\n row: series.points[0]?.row ?? null,\n highlighted: series.points.some((point) => point.highlighted),\n });\n }\n }\n }\n let mergedOther = false;\n if (entries.length > maxSlices) {\n const ranked = [...entries].sort((a, b) => b.value - a.value);\n const keep = new Set(ranked.slice(0, maxSlices - 1).map((entry) => entry.id));\n const kept = entries.filter((entry) => keep.has(entry.id));\n const rest = entries.filter((entry) => !keep.has(entry.id));\n kept.push({\n id: \"other\",\n label: otherLabel,\n value: rest.reduce((acc, entry) => acc + entry.value, 0),\n row: null,\n highlighted: false,\n });\n entries = kept;\n mergedOther = true;\n }\n const total = entries.reduce((acc, entry) => acc + entry.value, 0);\n const count = entries.length;\n return entries.map((entry, index) => {\n const isOther = mergedOther && index === entries.length - 1;\n return {\n id: entry.id,\n label: entry.label,\n value: entry.value,\n share: total === 0 ? 0 : entry.value / total,\n style: isOther ? seriesStyle(index, count, { tone: \"muted\" }) : seriesStyle(index, count),\n highlighted: entry.highlighted,\n ...(isOther ? { other: true } : {}),\n row: entry.row,\n };\n });\n}\n\nfunction buildWaterfall(model: ChartModel): WaterfallStep[] {\n const series = model.series[0];\n if (!series) return [];\n const totals = new Set(model.spec.waterfall?.totals ?? []);\n const steps: WaterfallStep[] = [];\n let running = 0;\n for (const point of series.points) {\n const label = point.label ?? point.key;\n if (totals.has(point.key)) {\n steps.push({ key: point.key, label, delta: running, start: 0, end: running, total: true });\n } else {\n const delta = point.y ?? 0;\n steps.push({ key: point.key, label, delta, start: running, end: running + delta, total: false });\n running += delta;\n }\n }\n return steps;\n}\n","import type { ChartType, RendererChoice } from \"./spec\";\r\n\r\n/**\r\n * The SVG renderer is comfortable up to roughly this many points per chart\r\n * (spec section 8: about 1,000 to 5,000). Beyond it, auto mode uses canvas.\r\n */\r\nexport const SVG_POINT_LIMIT = 5000;\r\n\r\n/** Chart types that only the canvas renderer draws. */\r\nconst CANVAS_ONLY: ReadonlySet<ChartType> = new Set<ChartType>([\r\n \"candlestick\",\r\n \"ohlc\",\r\n \"sunburst\",\r\n \"marimekko\",\r\n \"hexbin\",\r\n \"contour\",\r\n \"sankey\",\r\n \"chord\",\r\n \"alluvial\",\r\n]);\r\n\r\nexport type RenderTarget = \"screen\" | \"print\" | \"report\";\r\n\r\nexport interface ResolveRendererInput {\r\n renderer?: RendererChoice;\r\n mark: ChartType;\r\n pointCount: number;\r\n target?: RenderTarget;\r\n}\r\n\r\n/**\r\n * Picks a renderer for a chart. Reports and print always use SVG so the output\r\n * stays vector; on screen, `auto` switches to canvas by point count and type.\r\n */\r\nexport function resolveRenderer({\r\n renderer = \"auto\",\r\n mark,\r\n pointCount,\r\n target = \"screen\",\r\n}: ResolveRendererInput): \"svg\" | \"canvas\" {\r\n if (target !== \"screen\") return \"svg\";\r\n if (renderer !== \"auto\") return renderer;\r\n if (CANVAS_ONLY.has(mark)) return \"canvas\";\r\n return pointCount > SVG_POINT_LIMIT ? \"canvas\" : \"svg\";\r\n}\r\n","import { stack as d3Stack, stackOffsetDiverging, stackOffsetExpand, stackOffsetNone } from \"d3-shape\";\nimport type { StackMode } from \"./spec\";\n\nexport interface StackedValue {\n /** Lower edge of the segment. */\n y0: number;\n /** Upper edge of the segment. */\n y1: number;\n}\n\n/**\n * Stacks values per category. `values[s][c]` is series `s` at category `c`\n * (`null` counts as zero). Returns the same shape with a `[y0, y1]` segment\n * for each cell.\n *\n * - `none`: every segment starts at zero.\n * - `stacked`: segments add up.\n * - `normalized`: each category adds up to 1 (so format as percent).\n * - `diverging`: positives stack above zero and negatives below it.\n */\nexport function stackValues(\n values: ReadonlyArray<ReadonlyArray<number | null>>,\n mode: StackMode,\n): StackedValue[][] {\n const seriesCount = values.length;\n const categoryCount = Math.max(0, ...values.map((series) => series.length));\n if (mode === \"none\" || seriesCount === 0) {\n return values.map((series) =>\n Array.from({ length: categoryCount }, (_, c) => ({ y0: 0, y1: series[c] ?? 0 })),\n );\n }\n\n const rows: number[][] = Array.from({ length: categoryCount }, (_, c) =>\n values.map((series) => {\n const value = series[c];\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n }),\n );\n const generator = d3Stack<number[], number>()\n .keys(values.map((_, index) => index))\n .value((row, key) => row[key] ?? 0)\n .offset(\n mode === \"normalized\" ? stackOffsetExpand : mode === \"diverging\" ? stackOffsetDiverging : stackOffsetNone,\n );\n const layers = generator(rows);\n return layers.map((layer) =>\n Array.from({ length: categoryCount }, (_, c) => {\n const cell = layer[c];\n const y0 = cell?.[0] ?? 0;\n const y1 = cell?.[1] ?? 0;\n return { y0: Number.isFinite(y0) ? y0 : 0, y1: Number.isFinite(y1) ? y1 : 0 };\n }),\n );\n}\n","/**\n * Scales, ticks, tick-label fitting and margins. Thin, typed wrappers over\n * d3-scale and d3-array that return plain numbers, so layout code never\n * touches d3 types. Pure and server-safe.\n */\nimport { extent as d3Extent, ticks as d3Ticks } from \"d3-array\";\nimport { scaleBand, scaleLinear, scaleLog, scalePoint, scaleSqrt, scaleUtc } from \"d3-scale\";\nimport type { ScaleSpec } from \"./spec\";\n\n/** Type size the layout assumes for axis text. It matches the caption token (12). */\nexport const AXIS_FONT_SIZE = 12;\n/** Length of a tick mark. */\nexport const TICK_SIZE = 6;\n/** Gap between a tick mark and its label. */\nexport const TICK_PADDING = 4;\n\nexport type ContinuousKind = \"linear\" | \"log\" | \"sqrt\" | \"time\";\n\nexport interface ContinuousScale {\n kind: ContinuousKind;\n /** The final domain, after nice rounding. Time domains are epoch milliseconds. */\n domain: [number, number];\n range: [number, number];\n (value: number): number;\n /** About `count` tick values inside the domain. */\n ticks(count: number): number[];\n}\n\nexport interface ContinuousScaleOptions {\n kind: ContinuousKind;\n domain: readonly [number, number];\n range: readonly [number, number];\n nice?: boolean;\n /** Tick count that `nice` rounds towards. */\n niceCount?: number;\n base?: number;\n}\n\n/** A linear, log, square-root or UTC time scale as a plain function with a domain and ticks. */\nexport function createContinuousScale({\n kind,\n domain,\n range,\n nice = false,\n niceCount = 6,\n base = 10,\n}: ContinuousScaleOptions): ContinuousScale {\n let apply: (value: number) => number;\n let tickFn: (count: number) => number[];\n let finalDomain: [number, number];\n\n if (kind === \"time\") {\n const scale = scaleUtc()\n .domain([new Date(domain[0]), new Date(domain[1])])\n .range([range[0], range[1]]);\n if (nice) scale.nice(niceCount);\n apply = (value) => scale(new Date(value));\n tickFn = (count) => scale.ticks(count).map((date) => date.getTime());\n finalDomain = [scale.domain()[0]?.getTime() ?? domain[0], scale.domain()[1]?.getTime() ?? domain[1]];\n } else if (kind === \"log\") {\n const scale = scaleLog().base(base).domain([domain[0], domain[1]]).range([range[0], range[1]]);\n if (nice) scale.nice();\n apply = (value) => scale(value);\n tickFn = (count) => scale.ticks(count);\n finalDomain = [scale.domain()[0] as number, scale.domain()[1] as number];\n } else if (kind === \"sqrt\") {\n const scale = scaleSqrt().domain([domain[0], domain[1]]).range([range[0], range[1]]);\n if (nice) scale.nice(niceCount);\n apply = (value) => scale(value);\n tickFn = (count) => scale.ticks(count);\n finalDomain = [scale.domain()[0] as number, scale.domain()[1] as number];\n } else {\n const scale = scaleLinear().domain([domain[0], domain[1]]).range([range[0], range[1]]);\n if (nice) scale.nice(niceCount);\n apply = (value) => scale(value);\n tickFn = (count) => scale.ticks(count);\n finalDomain = [scale.domain()[0] as number, scale.domain()[1] as number];\n }\n\n const result = ((value: number) => apply(value)) as ContinuousScale;\n result.kind = kind;\n result.domain = finalDomain;\n result.range = [range[0], range[1]];\n result.ticks = (count: number) => tickFn(count);\n return result;\n}\n\nexport interface DomainOptions {\n kind?: ContinuousKind | undefined;\n /** Include zero (bars, areas and histograms always do). */\n includeZero?: boolean | undefined;\n /** Extra values the domain must cover, such as thresholds and reference lines. */\n include?: ReadonlyArray<number> | undefined;\n spec?: ScaleSpec | undefined;\n}\n\n/**\n * Picks a numeric domain from data. An explicit `scale.domain` wins. Otherwise\n * the domain covers the data (plus `include` and zero when asked), is widened\n * when it would be a single value, and for log scales stays positive.\n */\nexport function valueDomain(\n data: readonly [number, number] | null,\n { kind = \"linear\", includeZero = false, include = [], spec }: DomainOptions = {},\n): [number, number] {\n const explicit = spec?.domain;\n if (explicit && explicit.length >= 2) {\n const low = Number(explicit[0]);\n const high = Number(explicit[1]);\n if (Number.isFinite(low) && Number.isFinite(high) && low !== high) return low < high ? [low, high] : [high, low];\n }\n const values = [...include.filter(Number.isFinite)];\n if (data) values.push(data[0], data[1]);\n if (values.length === 0) return kind === \"log\" ? [1, 10] : [0, 1];\n let [low, high] = d3Extent(values) as [number, number];\n if (kind === \"log\") {\n const positive = values.filter((value) => value > 0);\n low = positive.length ? Math.min(...positive) : 1;\n high = positive.length ? Math.max(...positive) : 10;\n if (low === high) return [low / 10, high * 10];\n return [low, high];\n }\n const zero = spec?.zero ?? includeZero;\n if (zero) {\n low = Math.min(low, 0);\n high = Math.max(high, 0);\n }\n if (low === high) {\n if (low === 0) return [0, 1];\n const pad = Math.abs(low) * 0.1 || 1;\n return kind === \"time\" ? [low - 86_400_000, high + 86_400_000] : [low - pad, high + pad];\n }\n return [low, high];\n}\n\nexport interface BandScale {\n (key: string): number | undefined;\n bandwidth: number;\n step: number;\n domain: string[];\n range: [number, number];\n}\n\n/** One slot per key. `padding` is the fraction of each step left empty (inner), with half of it outside. */\nexport function createBandScale(\n keys: ReadonlyArray<string>,\n range: readonly [number, number],\n padding = 0.2,\n): BandScale {\n const scale = scaleBand<string>()\n .domain([...keys])\n .range([range[0], range[1]])\n .paddingInner(padding)\n .paddingOuter(padding / 2);\n const result = ((key: string) => scale(key)) as BandScale;\n result.bandwidth = scale.bandwidth();\n result.step = scale.step();\n result.domain = [...keys];\n result.range = [range[0], range[1]];\n return result;\n}\n\nexport interface PointScale {\n (key: string): number | undefined;\n step: number;\n domain: string[];\n}\n\n/** One position per key, with half a step of padding at each end. */\nexport function createPointScale(keys: ReadonlyArray<string>, range: readonly [number, number]): PointScale {\n const scale = scalePoint<string>()\n .domain([...keys])\n .range([range[0], range[1]])\n .padding(0.5);\n const result = ((key: string) => scale(key)) as PointScale;\n result.step = scale.step();\n result.domain = [...keys];\n return result;\n}\n\n/** Nice tick values for a numeric domain. */\nexport function niceTicks(domain: readonly [number, number], count = 6): number[] {\n return d3Ticks(domain[0], domain[1], Math.max(1, count));\n}\n\n/** Rough width of text in pixels, from per-character class widths. Good enough to reserve margins and fit labels. */\nexport function estimateTextWidth(text: string, fontSize = AXIS_FONT_SIZE): number {\n let units = 0;\n for (const char of text) {\n const code = char.codePointAt(0) ?? 0;\n if (\n (code >= 0x2e80 && code <= 0x9fff) ||\n (code >= 0xac00 && code <= 0xd7af) ||\n (code >= 0xff00 && code <= 0xffef)\n ) {\n units += 1;\n } else if (/[il.,:;'|!()[\\]jtfI ]/.test(char)) {\n units += 0.32;\n } else if (/[mwMW@%]/.test(char)) {\n units += 0.9;\n } else if (/\\d/.test(char)) {\n units += 0.58;\n } else if (/\\p{Lu}/u.test(char)) {\n units += 0.68;\n } else {\n units += 0.56;\n }\n }\n return units * fontSize;\n}\n\n/** Shortens text to `maxLength` characters with an ellipsis. */\nexport function truncateLabel(text: string, maxLength: number): string {\n const chars = [...text];\n if (maxLength < 2 || chars.length <= maxLength) return text;\n return `${chars.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\nexport interface FittedLabel {\n text: string;\n /** The untruncated text, for titles and tooltips. */\n full: string;\n /** False when the label is skipped to avoid overlap. */\n visible: boolean;\n}\n\nexport interface LabelFit {\n labels: FittedLabel[];\n /** Rotation in degrees (0, or negative in left-to-right layouts). */\n angle: number;\n anchor: \"start\" | \"middle\" | \"end\";\n /** Height the labels need below the axis line, in pixels. */\n height: number;\n /** Every Nth label is shown. */\n step: number;\n}\n\nexport interface FitLabelsOptions {\n fontSize?: number;\n /** A fixed angle in degrees, or `auto` to rotate only when needed. */\n angle?: number | \"auto\" | undefined;\n /** Longest label in characters before truncation. Defaults to 24 (16 when rotated). */\n maxLength?: number | undefined;\n /** Mirrored axes rotate the other way, so labels still end at their tick. */\n rtl?: boolean | undefined;\n}\n\n/**\n * Decides how to draw category tick labels in `slotWidth` pixels each: flat if\n * they fit, otherwise rotated 45 degrees, then 90 degrees, and finally skipping\n * every Nth label. Long labels are truncated with an ellipsis.\n */\nexport function fitTickLabels(\n texts: ReadonlyArray<string>,\n slotWidth: number,\n { fontSize = AXIS_FONT_SIZE, angle = \"auto\", maxLength, rtl = false }: FitLabelsOptions = {},\n): LabelFit {\n const lineHeight = fontSize * 1.25;\n const measure = (list: ReadonlyArray<string>): number => Math.max(0, ...list.map((text) => estimateTextWidth(text, fontSize)));\n\n const withLength = (limit: number | undefined): FittedLabel[] =>\n texts.map((full) => ({ full, text: limit === undefined ? full : truncateLabel(full, limit), visible: true }));\n\n let chosenAngle: number;\n let step = 1;\n let labels = withLength(maxLength ?? 24);\n\n if (angle !== \"auto\") {\n chosenAngle = Math.max(-90, Math.min(90, angle));\n labels = withLength(maxLength ?? (chosenAngle === 0 ? 24 : 16));\n } else {\n const flatWidth = measure(labels.map((label) => label.text));\n if (flatWidth + 6 <= slotWidth) {\n chosenAngle = 0;\n } else if (slotWidth >= lineHeight * 1.5) {\n chosenAngle = -45;\n labels = withLength(maxLength ?? 16);\n } else if (slotWidth >= lineHeight) {\n chosenAngle = -90;\n labels = withLength(maxLength ?? 16);\n } else {\n chosenAngle = -90;\n labels = withLength(maxLength ?? 16);\n step = Math.max(2, Math.ceil(lineHeight / Math.max(1, slotWidth)));\n }\n }\n\n if (chosenAngle === 0 && angle === \"auto\") {\n // Flat labels that fit never skip.\n step = 1;\n } else if (chosenAngle === 0) {\n const needed = measure(labels.map((label) => label.text)) + 6;\n step = Math.max(1, Math.ceil(needed / Math.max(1, slotWidth)));\n }\n\n const flipped = rtl ? -chosenAngle : chosenAngle;\n const radians = (Math.abs(chosenAngle) * Math.PI) / 180;\n const widest = measure(labels.map((label) => label.text));\n const height = chosenAngle === 0 ? lineHeight : widest * Math.sin(radians) + lineHeight * Math.cos(radians);\n\n return {\n labels: labels.map((label, index) => ({ ...label, visible: index % step === 0 })),\n angle: flipped,\n anchor: flipped === 0 ? \"middle\" : flipped < 0 ? \"end\" : \"start\",\n height,\n step,\n };\n}\n\nexport interface Margin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/** Smallest margin on any side, in pixels. */\nexport const EDGE_MARGIN = 12;\n\nexport interface AxisMarginInput {\n /** Width of the widest tick label on the vertical axis (zero when it has no axis). */\n verticalTickWidth: number;\n /** Height the horizontal axis labels need (from `fitTickLabels`). Zero when there is no axis. */\n horizontalTickHeight: number;\n verticalTitle: boolean;\n horizontalTitle: boolean;\n /** Side of the vertical axis. Mirrored (right-to-left) charts put it on the `right`. */\n verticalAxisSide: \"left\" | \"right\";\n /** Width of the tick labels of a second vertical axis, drawn on the opposite side. Zero for none. */\n secondTickWidth?: number;\n secondTitle?: boolean;\n /** Space for direct labels past the end of lines, on the side opposite the vertical axis. */\n directLabelWidth?: number;\n fontSize?: number;\n}\n\n/**\n * Space around the plot for axes, titles and direct labels. Every side keeps\n * at least `EDGE_MARGIN` so marks and glyphs never touch the border.\n */\nexport function computeAxisMargins({\n verticalTickWidth,\n horizontalTickHeight,\n verticalTitle,\n horizontalTitle,\n verticalAxisSide,\n secondTickWidth = 0,\n secondTitle = false,\n directLabelWidth = 0,\n fontSize = AXIS_FONT_SIZE,\n}: AxisMarginInput): Margin {\n const titleSpace = fontSize * 1.5;\n const axisSide = (tickWidth: number, title: boolean): number =>\n tickWidth > 0 ? tickWidth + TICK_SIZE + TICK_PADDING + (title ? titleSpace : 0) + 4 : 0;\n const first = Math.max(EDGE_MARGIN, axisSide(verticalTickWidth, verticalTitle));\n const opposite = Math.max(\n EDGE_MARGIN,\n axisSide(secondTickWidth, secondTitle),\n directLabelWidth > 0 ? directLabelWidth + EDGE_MARGIN : 0,\n );\n const bottom =\n horizontalTickHeight > 0\n ? horizontalTickHeight + TICK_SIZE + TICK_PADDING + (horizontalTitle ? titleSpace : 0) + 6\n : 0;\n return {\n top: EDGE_MARGIN,\n bottom: Math.max(EDGE_MARGIN, bottom),\n left: verticalAxisSide === \"left\" ? first : opposite,\n right: verticalAxisSide === \"left\" ? opposite : first,\n };\n}\n\n/**\n * Spreads label positions apart so they never overlap, keeping order and\n * staying inside `[min, max]`. Used for direct labels at the end of lines.\n */\nexport function dodgePositions(positions: ReadonlyArray<number>, gap: number, min: number, max: number): number[] {\n const order = positions.map((position, index) => ({ position, index })).sort((a, b) => a.position - b.position);\n const placed = order.map((entry) => Math.min(max, Math.max(min, entry.position)));\n for (let i = 1; i < placed.length; i += 1) {\n const previous = placed[i - 1] as number;\n if ((placed[i] as number) - previous < gap) placed[i] = previous + gap;\n }\n const overflow = (placed[placed.length - 1] ?? 0) - max;\n if (overflow > 0) {\n placed[placed.length - 1] = max;\n for (let i = placed.length - 2; i >= 0; i -= 1) {\n const next = placed[i + 1] as number;\n if (next - (placed[i] as number) < gap) placed[i] = next - gap;\n }\n }\n const out = new Array<number>(positions.length);\n order.forEach((entry, i) => {\n out[entry.index] = placed[i] as number;\n });\n return out;\n}\n","import {\n createDateFormatter,\n createNumberFormatter,\n formatShare,\n type Formatter,\n} from \"./format\";\nimport { resolveMessages, type ChartMessages, type ChartMessagesInput } from \"./messages\";\nimport { usesBandX, type ChartModel, type ModelPoint } from \"./model\";\n\nexport interface ChartFormatters {\n locale: string | undefined;\n messages: ChartMessages;\n /** Label for an x value: category text, a date, or a number. */\n x: Formatter<string | number>;\n /** Label for a point: its own label, else the formatted x. */\n point: (point: ModelPoint) => string;\n /** Value formatter for series `index`. */\n value: (seriesIndex: number) => Formatter<number>;\n /** Value-axis formatters (for tooltips; axes build their own from tick steps). */\n y: Formatter<number>;\n /**\n * Formatter for gauge and progress ring values. `percent` shows the share of\n * the min to max range, so 64 of 100 and 0.64 of 1 both read \"64%\".\n */\n gauge: Formatter<number>;\n size: Formatter<number>;\n share: Formatter<number>;\n noValue: string;\n}\n\n/** Formatters for a chart's values, shared by tooltips, descriptions and tables. */\nexport function createFormatters(\n model: ChartModel,\n { locale, messages }: { locale?: string | undefined; messages?: ChartMessagesInput | undefined } = {},\n): ChartFormatters {\n const resolved = resolveMessages(messages);\n const spec = model.spec;\n const xFormat = spec.axes?.x?.format ?? spec.x?.format;\n\n let x: Formatter<string | number>;\n if (model.xKind === \"time\") {\n const dates = createDateFormatter(xFormat, locale, model.timeZone, model.hasTimeOfDay);\n x = (value) => (typeof value === \"number\" ? dates(value) : String(value));\n } else if (model.xKind === \"number\") {\n const plain = !xFormat && usesBandX(model.mark);\n const numbers = plain\n ? (value: number) => String(value)\n : createNumberFormatter(xFormat, locale);\n x = (value) => (typeof value === \"number\" ? numbers(value) : String(value));\n } else {\n x = (value) => String(value);\n }\n\n const yFormat = spec.axes?.y?.format ?? spec.y?.format ?? (spec.mark === \"heatmap\" ? (spec.value ?? spec.color)?.format : undefined);\n const yFormatter = createNumberFormatter(yFormat, locale);\n const valueFormatters = new Map<number, Formatter<number>>();\n\n let gauge: Formatter<number> = yFormatter;\n if (model.gauge?.format === \"percent\") {\n const { min, max } = model.gauge;\n const percent = createNumberFormatter(\"percent\", locale);\n gauge = (value) => percent((value - min) / (max - min));\n } else if (model.gauge?.format) {\n gauge = createNumberFormatter(model.gauge.format, locale);\n }\n\n return {\n locale,\n messages: resolved,\n x,\n point: (point) => point.label ?? x(point.x),\n value: (seriesIndex) => {\n let formatter = valueFormatters.get(seriesIndex);\n if (!formatter) {\n const series = model.series[seriesIndex];\n formatter = series?.format ? createNumberFormatter(series.format, locale) : yFormatter;\n valueFormatters.set(seriesIndex, formatter);\n }\n return formatter;\n },\n y: yFormatter,\n gauge,\n size: createNumberFormatter(spec.size?.format, locale),\n share: (value) => formatShare(value, locale),\n noValue: resolved.noValue,\n };\n}\n","/**\n * Layout for charts on two axes: line, area, step, sparkline, bar (vertical,\n * horizontal, grouped, stacked, normalized), lollipop, combo, scatter, bubble,\n * histogram and waterfall. Produces plain geometry in SVG coordinates; the\n * React renderer only draws it. Pure and server-safe.\n */\nimport { scaleSqrt } from \"d3-scale\";\nimport { area as d3Area, curveLinear, curveStepAfter, line as d3Line } from \"d3-shape\";\nimport { toNumber, toTime } from \"../data\";\nimport { createDateFormatter, createNumberFormatter, createTimeTickFormatter } from \"../format\";\nimport { createFormatters } from \"../formatters\";\nimport { usesBandX, type ChartModel, type ModelPoint, type ModelSeries } from \"../model\";\nimport { annotationTone, dashArrays } from \"../palette\";\nimport {\n AXIS_FONT_SIZE,\n EDGE_MARGIN,\n computeAxisMargins,\n createBandScale,\n createContinuousScale,\n createPointScale,\n dodgePositions,\n estimateTextWidth,\n fitTickLabels,\n truncateLabel,\n valueDomain,\n type BandScale,\n type ContinuousKind,\n type ContinuousScale,\n type PointScale,\n} from \"../scales\";\nimport { stackValues } from \"../stack\";\nimport type { AnnotationTone, Annotation, Threshold } from \"../spec\";\nimport type {\n AnnotationLayout,\n AxisLayout,\n AxisTick,\n Box,\n ChartLayout,\n HitTarget,\n LayoutMark,\n LayoutOptions,\n LegendEntry,\n Margin,\n TextLabel,\n} from \"./types\";\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\nconst HATCH_PATTERNS = 8;\nconst MARKER_RADIUS = 3.5;\nconst MAX_MARKED_POINTS = 24;\n\n/**\n * Hatch pattern for the series at `styleIndex`: none for the first series, then\n * a different pattern for each further one (all of them with `all`, for print).\n * The palette repeats its eight hues, so each pass shifts the patterns, which\n * keeps every hue and pattern pair unique for up to 64 series.\n */\nexport function patternIndex(styleIndex: number, all = false): number {\n const cycle = Math.floor(styleIndex / HATCH_PATTERNS);\n if (all) return (styleIndex + cycle) % HATCH_PATTERNS;\n return styleIndex === 0 ? -1 : (styleIndex - 1 + cycle) % HATCH_PATTERNS;\n}\n\ninterface Segment {\n y0: number;\n y1: number;\n}\n\ntype XMode = \"band\" | \"point\" | \"continuous\";\n\ninterface CategoryAxisPlan {\n mode: XMode;\n band?: BandScale;\n point?: PointScale;\n continuous?: ContinuousScale;\n ticks: AxisTick[];\n angle: number;\n anchor: \"start\" | \"middle\" | \"end\";\n /** Height (horizontal axis) or width (vertical axis) the tick labels need. */\n extent: number;\n}\n\ninterface ValueAxisPlan {\n scale: ContinuousScale;\n ticks: AxisTick[];\n width: number;\n}\n\ninterface Plan {\n category: CategoryAxisPlan;\n y: ValueAxisPlan | undefined;\n y2: ValueAxisPlan | undefined;\n}\n\nexport function layoutCartesian(model: ChartModel, options: LayoutOptions): ChartLayout {\n const { width, height } = options;\n const spec = model.spec;\n const mark = model.mark;\n const rtl = options.rtl === true;\n const hidden = options.hidden ?? EMPTY_SET;\n const fmts = createFormatters(model, options);\n const messages = fmts.messages;\n const locale = options.locale;\n\n const sparkline = mark === \"sparkline\";\n const barFamily = mark === \"bar\" || mark === \"lollipop\" || mark === \"waterfall\";\n const horizontal = model.orientation === \"horizontal\" && barFamily;\n const stackMode = model.stack;\n\n const entries = model.series\n .map((series, index) => ({ series, index }))\n .filter((entry) => !hidden.has(entry.series.id));\n const allHidden = model.series.length > 0 && entries.length === 0;\n\n /* ----------------------------------------------------------- x mode */\n const declaredX = spec.scales?.x?.type;\n let xMode: XMode;\n if (horizontal || declaredX === \"band\") xMode = \"band\";\n else if (declaredX === \"ordinal\") xMode = \"point\";\n else if (usesBandX(mark)) xMode = \"band\";\n else if (mark === \"histogram\") xMode = \"continuous\";\n else xMode = model.xKind === \"category\" ? \"point\" : \"continuous\";\n const xContinuousKind: ContinuousKind =\n model.xKind === \"time\" ? \"time\" : declaredX === \"log\" ? \"log\" : declaredX === \"sqrt\" ? \"sqrt\" : \"linear\";\n\n const mirrored = rtl && (horizontal || xMode !== \"continuous\" || model.xKind === \"time\");\n\n /* ------------------------------------------------------ points index */\n const byCategory = model.series.map((series) => {\n const map = new Map<number, ModelPoint>();\n for (const point of series.points) if (!map.has(point.categoryIndex)) map.set(point.categoryIndex, point);\n return map;\n });\n\n /* ------------------------------------------------------------ stacks */\n const segments = new Map<number, Array<Segment | undefined>>();\n if (stackMode !== \"none\") {\n const groups = new Map<string, number[]>();\n for (const { series, index } of entries) {\n if (series.mark !== \"bar\" && series.mark !== \"area\") continue;\n const key = `${series.axis}|${series.mark}|${series.stackKey}`;\n const list = groups.get(key);\n if (list) list.push(index);\n else groups.set(key, [index]);\n }\n for (const indices of groups.values()) {\n const values = indices.map((seriesIndex) =>\n model.categories.map((_, c) => byCategory[seriesIndex]?.get(c)?.y ?? null),\n );\n const stacked = stackValues(values, stackMode);\n indices.forEach((seriesIndex, i) => segments.set(seriesIndex, stacked[i] ?? []));\n }\n }\n\n /* ----------------------------------------------- annotations helpers */\n const annotations: ReadonlyArray<Annotation> = spec.annotations ?? [];\n const thresholds: ReadonlyArray<Threshold> = spec.thresholds ?? [];\n const numericOn = (axis: \"y\" | \"y2\"): number[] => {\n const out: number[] = [];\n const push = (value: unknown): void => {\n const n = toNumber(value);\n if (n !== null) out.push(n);\n };\n for (const a of annotations) {\n if (a.type === \"reference-line\" && a.y !== undefined && (a.axis ?? \"y\") === axis) push(a.y);\n if (a.type === \"reference-band\" && a.axis === \"y\" && axis === \"y\") {\n push(a.from);\n push(a.to);\n }\n if ((a.type === \"point\" || a.type === \"text\") && axis === \"y\") push(a.y);\n }\n for (const t of thresholds) if ((t.axis ?? \"y\") === axis) push(t.value);\n return out;\n };\n\n /* ----------------------------------------------------- value domains */\n const extents: Record<\"y\" | \"y2\", [number, number]> = {\n y: [Infinity, -Infinity],\n y2: [Infinity, -Infinity],\n };\n const add = (axis: \"y\" | \"y2\", value: number): void => {\n const range = extents[axis];\n if (value < range[0]) range[0] = value;\n if (value > range[1]) range[1] = value;\n };\n if (mark === \"waterfall\" && model.waterfall) {\n for (const step of model.waterfall.steps) {\n add(\"y\", step.start);\n add(\"y\", step.end);\n }\n } else {\n for (const { series, index } of entries) {\n const stacked = segments.get(index);\n if (stacked) {\n for (const segment of stacked) {\n if (segment) {\n add(series.axis, segment.y0);\n add(series.axis, segment.y1);\n }\n }\n } else {\n for (const point of series.points) if (point.y !== null) add(series.axis, point.y);\n }\n }\n }\n const hasSecond = model.dualAxis && entries.some((entry) => entry.series.axis === \"y2\");\n const includeZero =\n mark === \"bar\" ||\n mark === \"lollipop\" ||\n mark === \"waterfall\" ||\n mark === \"area\" ||\n mark === \"histogram\" ||\n entries.some((entry) => entry.series.mark === \"bar\" || entry.series.mark === \"area\");\n\n const valueKindOf = (axis: \"y\" | \"y2\"): ContinuousKind => {\n const type = spec.scales?.[axis]?.type;\n return type === \"log\" ? \"log\" : type === \"sqrt\" ? \"sqrt\" : \"linear\";\n };\n const domainOf = (axis: \"y\" | \"y2\"): [number, number] => {\n if (stackMode === \"normalized\" && axis === \"y\") return [0, 1];\n const raw = extents[axis];\n return valueDomain(raw[0] === Infinity ? null : raw, {\n kind: valueKindOf(axis),\n includeZero: valueKindOf(axis) === \"log\" ? false : includeZero,\n include: numericOn(axis),\n spec: spec.scales?.[axis],\n });\n };\n const domains = { y: domainOf(\"y\"), y2: domainOf(\"y2\") };\n\n /* --------------------------------------------------------- baselines */\n const baselineOf = (axis: \"y\" | \"y2\"): number => {\n const [low, high] = domains[axis];\n return Math.min(high, Math.max(low, 0));\n };\n\n /* -------------------------------------------------------- axis plans */\n const axisTitles = {\n x: spec.axes?.x?.title ?? model.xTitle,\n y: spec.axes?.y?.title ?? model.yTitle,\n y2: spec.axes?.y2?.title ?? model.y2Title,\n };\n const showAxis = (id: \"x\" | \"y\" | \"y2\"): boolean => !sparkline && spec.axes?.[id]?.show !== false;\n const valueFormat = (axis: \"y\" | \"y2\"): string | undefined => {\n const explicit = spec.axes?.[axis]?.format;\n if (explicit) return explicit;\n if (stackMode === \"normalized\" && axis === \"y\") return \"percent\";\n if (axis === \"y\") return spec.y?.format;\n return entries.find((entry) => entry.series.axis === \"y2\")?.series.format;\n };\n\n const valueTicksFor = (axis: \"y\" | \"y2\", scale: ContinuousScale, count: number): ValueAxisPlan => {\n const explicit = spec.axes?.[axis]?.tickValues\n ?.map((value) => toNumber(value))\n .filter((value): value is number => value !== null);\n const values = explicit && explicit.length > 0 ? explicit : scale.ticks(spec.axes?.[axis]?.ticks ?? count);\n const positives = values.filter((value) => value > 0);\n const step =\n scale.kind === \"log\"\n ? positives.length\n ? Math.min(...positives)\n : undefined\n : values.length > 1\n ? Math.abs((values[1] as number) - (values[0] as number))\n : undefined;\n const format = createNumberFormatter(valueFormat(axis), locale, step === undefined ? {} : { step });\n const ticks = values.map((value): AxisTick => {\n const label = format(value);\n return { value, position: scale(value), label, full: label, visible: true };\n });\n return { scale, ticks, width: Math.max(0, ...ticks.map((tick) => estimateTextWidth(tick.label))) };\n };\n\n const planFor = (plot: Box): Plan => {\n /* category axis */\n const catRange: [number, number] = horizontal\n ? [plot.y, plot.y + plot.height]\n : mirrored\n ? [plot.x + plot.width, plot.x]\n : [plot.x, plot.x + plot.width];\n const timeCategoryFormat =\n model.xKind === \"time\" && !(spec.axes?.x?.format ?? spec.x?.format)\n ? createTimeTickFormatter(\n model.categoryValues.filter((value): value is number => typeof value === \"number\"),\n locale,\n model.timeZone,\n )\n : undefined;\n const labelOf = (index: number): { text: string } => {\n const raw = model.categoryValues[index] ?? \"\";\n return { text: timeCategoryFormat && typeof raw === \"number\" ? timeCategoryFormat(raw) : fmts.x(raw) };\n };\n const customAngle = spec.axes?.x?.labelAngle;\n let category: CategoryAxisPlan;\n if (xMode === \"band\" || xMode === \"point\") {\n const band = xMode === \"band\" ? createBandScale(model.categories, catRange, spec.scales?.x?.padding ?? 0.2) : undefined;\n const point = xMode === \"point\" ? createPointScale(model.categories, catRange) : undefined;\n const step = band?.step ?? point?.step ?? 0;\n const texts = model.categories.map((_, index) => labelOf(index).text);\n let ticks: AxisTick[];\n let angle = 0;\n let anchor: \"start\" | \"middle\" | \"end\";\n let extent: number;\n if (horizontal) {\n const lineHeight = AXIS_FONT_SIZE * 1.25;\n const skip = Math.max(1, Math.ceil(lineHeight / Math.max(1, step)));\n const maxLength = spec.axes?.x?.maxLabelLength ?? 24;\n ticks = model.categories.map((key, index) => {\n const text = truncateLabel(texts[index] ?? key, maxLength);\n const position = (band?.(key) ?? 0) + (band?.bandwidth ?? 0) / 2;\n return { value: key, position, label: text, full: texts[index] ?? key, visible: index % skip === 0 };\n });\n extent = Math.max(0, ...ticks.filter((tick) => tick.visible).map((tick) => estimateTextWidth(tick.label)));\n anchor = mirrored ? \"start\" : \"end\";\n } else {\n const fit = fitTickLabels(texts, step, {\n angle: customAngle ?? \"auto\",\n maxLength: spec.axes?.x?.maxLabelLength,\n rtl: mirrored,\n });\n ticks = model.categories.map((key, index) => {\n const fitted = fit.labels[index];\n const position = band ? (band(key) ?? 0) + band.bandwidth / 2 : (point?.(key) ?? 0);\n return {\n value: key,\n position,\n label: fitted?.text ?? key,\n full: fitted?.full ?? key,\n visible: fitted?.visible ?? true,\n };\n });\n angle = fit.angle;\n anchor = fit.anchor;\n extent = fit.height;\n }\n category = {\n mode: xMode,\n ...(band ? { band } : {}),\n ...(point ? { point } : {}),\n ticks,\n angle,\n anchor,\n extent,\n };\n } else {\n // Continuous x: numbers or time.\n const xs: number[] = [];\n for (const { series } of entries) {\n for (const point of series.points) {\n if (typeof point.x === \"number\") xs.push(point.x);\n if (point.x1 !== undefined) xs.push(point.x1);\n }\n }\n const raw: [number, number] | null = xs.length ? [Math.min(...xs), Math.max(...xs)] : null;\n const kind = xContinuousKind;\n const niceDefault = (mark === \"scatter\" || mark === \"bubble\") && kind !== \"time\" && kind !== \"log\";\n const domain = valueDomain(raw, { kind: kind === \"time\" ? \"time\" : kind, spec: spec.scales?.x });\n const scale = createContinuousScale({\n kind,\n domain,\n range: catRange,\n nice: spec.scales?.x?.nice ?? niceDefault,\n niceCount: Math.max(2, Math.round(plot.width / 90)),\n ...(spec.scales?.x?.base !== undefined ? { base: spec.scales.x.base } : {}),\n });\n const count = spec.axes?.x?.ticks ?? Math.max(2, Math.round(plot.width / 90));\n const explicit = spec.axes?.x?.tickValues\n ?.map((value) => (kind === \"time\" ? toTime(value) : toNumber(value)))\n .filter((value): value is number => value !== null);\n const values = explicit && explicit.length > 0 ? explicit : scale.ticks(count);\n const xFormat = spec.axes?.x?.format ?? spec.x?.format;\n let format: (value: number) => string;\n if (kind === \"time\") {\n format = xFormat\n ? createDateFormatter(xFormat, locale, model.timeZone, model.hasTimeOfDay)\n : createTimeTickFormatter(values, locale, model.timeZone);\n } else {\n const step = values.length > 1 ? Math.abs((values[1] as number) - (values[0] as number)) : undefined;\n format = createNumberFormatter(xFormat, locale, step === undefined ? {} : { step });\n }\n const ticks = values.map((value): AxisTick => {\n const label = format(value);\n return { value, position: scale(value), label, full: label, visible: true };\n });\n category = {\n mode: \"continuous\",\n continuous: scale,\n ticks,\n angle: 0,\n anchor: \"middle\",\n extent: AXIS_FONT_SIZE * 1.25,\n };\n }\n\n /* value axes */\n const valueRange: [number, number] = horizontal\n ? mirrored\n ? [plot.x + plot.width, plot.x]\n : [plot.x, plot.x + plot.width]\n : [plot.y + plot.height, plot.y];\n const tickCount = horizontal ? Math.max(2, Math.round(plot.width / 80)) : Math.max(2, Math.round(plot.height / 44));\n const makeValue = (axis: \"y\" | \"y2\"): ValueAxisPlan => {\n const scale = createContinuousScale({\n kind: valueKindOf(axis),\n domain: domains[axis],\n range: valueRange,\n nice: spec.scales?.[axis]?.nice ?? (stackMode === \"normalized\" && axis === \"y\" ? false : spec.scales?.[axis]?.domain ? false : true),\n niceCount: tickCount,\n ...(spec.scales?.[axis]?.base !== undefined ? { base: spec.scales[axis]?.base as number } : {}),\n });\n return valueTicksFor(axis, scale, tickCount);\n };\n return {\n category,\n y: sparkline ? undefined : makeValue(\"y\"),\n y2: hasSecond && !sparkline && !horizontal ? makeValue(\"y2\") : undefined,\n };\n };\n\n /* -------------------------------------------- margins, two-pass fit */\n const directMode = spec.labels?.direct ?? \"auto\";\n const directEntries = entries.filter((entry) => entry.series.mark === \"line\" || entry.series.mark === \"area\" || entry.series.mark === \"step\");\n const useDirectLabels =\n !sparkline &&\n !horizontal &&\n barFamily === false &&\n mark !== \"scatter\" &&\n mark !== \"bubble\" &&\n mark !== \"histogram\" &&\n directEntries.length > 0 &&\n (directMode === true || (directMode === \"auto\" && entries.length >= 2 && entries.length <= 5));\n const directLabelWidth = useDirectLabels\n ? Math.min(\n 120,\n Math.max(...directEntries.map((entry) => estimateTextWidth(truncateLabel(entry.series.label, 18)))) + 8,\n )\n : 0;\n\n const neededMargin = (plan: Plan): Margin => {\n if (sparkline) return { top: EDGE_MARGIN / 3, right: EDGE_MARGIN / 3, bottom: EDGE_MARGIN / 3, left: EDGE_MARGIN / 3 };\n const side = mirrored ? \"right\" : \"left\";\n if (horizontal) {\n return computeAxisMargins({\n verticalTickWidth: showAxis(\"x\") ? plan.category.extent : 0,\n horizontalTickHeight: showAxis(\"y\") ? AXIS_FONT_SIZE * 1.25 : 0,\n verticalTitle: showAxis(\"x\") && Boolean(axisTitles.x),\n horizontalTitle: showAxis(\"y\") && Boolean(axisTitles.y),\n verticalAxisSide: side,\n });\n }\n return computeAxisMargins({\n verticalTickWidth: showAxis(\"y\") ? (plan.y?.width ?? 0) : 0,\n horizontalTickHeight: showAxis(\"x\") ? plan.category.extent : 0,\n verticalTitle: showAxis(\"y\") && Boolean(axisTitles.y),\n horizontalTitle: showAxis(\"x\") && Boolean(axisTitles.x),\n verticalAxisSide: side,\n secondTickWidth: showAxis(\"y2\") ? (plan.y2?.width ?? 0) : 0,\n secondTitle: Boolean(axisTitles.y2),\n directLabelWidth,\n });\n };\n\n const boxFor = (margin: Margin): Box => ({\n x: margin.left,\n y: margin.top,\n width: Math.max(1, width - margin.left - margin.right),\n height: Math.max(1, height - margin.top - margin.bottom),\n });\n\n let margin: Margin = sparkline\n ? neededMargin({ category: { mode: \"band\", ticks: [], angle: 0, anchor: \"middle\", extent: 0 }, y: undefined, y2: undefined })\n : { top: EDGE_MARGIN, right: EDGE_MARGIN, bottom: AXIS_FONT_SIZE * 3, left: AXIS_FONT_SIZE * 4 };\n let plot = boxFor(margin);\n let plan = planFor(plot);\n for (let pass = 0; pass < 3; pass += 1) {\n const next = neededMargin(plan);\n const settled =\n Math.abs(next.left - margin.left) < 1 &&\n Math.abs(next.right - margin.right) < 1 &&\n Math.abs(next.bottom - margin.bottom) < 1 &&\n Math.abs(next.top - margin.top) < 1;\n margin = next;\n plot = boxFor(margin);\n plan = planFor(plot);\n if (settled) break;\n }\n\n /* ----------------------------------------------------------- scales */\n const category = plan.category;\n const catCenter = (point: ModelPoint): number | null => {\n if (category.band) {\n const start = category.band(point.key);\n return start === undefined ? null : start + category.band.bandwidth / 2;\n }\n if (category.point) return category.point(point.key) ?? null;\n if (category.continuous && typeof point.x === \"number\") return category.continuous(point.x);\n return null;\n };\n const valuePos = (axis: \"y\" | \"y2\", value: number): number => {\n const scale = (axis === \"y2\" ? plan.y2 : plan.y)?.scale ?? plan.y?.scale;\n return scale ? scale(value) : 0;\n };\n\n const marks: LayoutMark[] = [];\n const targets: HitTarget[] = [];\n const labels: TextLabel[] = [];\n const patternsInUse = new Set<number>();\n\n // Judged on all series, so hiding one in the legend never changes how another looks.\n const wantPatterns = options.patterns === true || model.series.length > 1;\n const patternFor = (styleIndex: number): number => {\n if (!wantPatterns) return -1;\n const pattern = patternIndex(styleIndex, options.patterns === true);\n if (pattern >= 0) patternsInUse.add(pattern);\n return pattern;\n };\n\n const breachFor = (series: ModelSeries, value: number | null): number | undefined => {\n if (value === null) return undefined;\n for (let i = 0; i < thresholds.length; i += 1) {\n const threshold = thresholds[i] as Threshold;\n if (!threshold.breach || (threshold.axis ?? \"y\") !== series.axis) continue;\n const limit = toNumber(threshold.value);\n if (limit === null) continue;\n if (threshold.breach === \"above\" ? value > limit : value < limit) return i;\n }\n return undefined;\n };\n\n const mutedFor = (point: ModelPoint): boolean => model.hasHighlight && !point.highlighted;\n\n /* ------------------------------------------------------------ marks */\n const showAllValues = spec.labels?.values === true;\n const valueLabel = (id: string, seriesIndex: number, text: string, x: number, y: number, anchor: TextLabel[\"anchor\"], baseline: NonNullable<TextLabel[\"baseline\"]>): void => {\n labels.push({ id, text, x, y, anchor, baseline, kind: \"value\", series: seriesIndex, numeric: true });\n };\n\n const addBar = (\n seriesIndex: number,\n series: ModelSeries,\n point: ModelPoint,\n slot: number,\n slotCount: number,\n segment: Segment,\n tone = series.style.tone,\n patternOverride?: number,\n ): void => {\n const band = category.band;\n if (!band) return;\n const start = band(point.key);\n if (start === undefined) return;\n const slotSize = band.bandwidth / slotCount;\n const gap = slotCount > 1 ? Math.min(2, slotSize * 0.15) : 0;\n const along = start + slot * slotSize + gap / 2;\n const size = Math.max(1, slotSize - gap);\n const v0 = valuePos(series.axis, segment.y0);\n const v1 = valuePos(series.axis, segment.y1);\n const low = Math.min(v0, v1);\n const span = Math.abs(v0 - v1);\n const rect = horizontal\n ? { x: low, y: along, width: span, height: size }\n : { x: along, y: low, width: size, height: span };\n const breach = breachFor(series, point.y);\n const id = `bar-${seriesIndex}-${point.index}`;\n marks.push({\n id,\n kind: \"bar\",\n series: seriesIndex,\n seriesId: series.id,\n point: point.index,\n tone,\n styleIndex: series.style.index,\n pattern: patternOverride ?? patternFor(series.style.index),\n ...rect,\n muted: mutedFor(point),\n highlighted: point.highlighted,\n ...(breach !== undefined ? { breach: true } : {}),\n });\n const anchorX = horizontal ? v1 : along + size / 2;\n const anchorY = horizontal ? along + size / 2 : v1;\n targets.push({\n id: `${seriesIndex}:${point.index}`,\n series: seriesIndex,\n point: point.index,\n group: point.categoryIndex,\n x: anchorX,\n y: anchorY,\n focus: { kind: \"rect\", ...rect },\n kind: \"point\",\n bounds: rect,\n ...(breach !== undefined ? { breach } : {}),\n });\n if (showAllValues && point.y !== null) {\n const text = fmts.value(seriesIndex)(point.y);\n const stackedHere = stackMode !== \"none\";\n if (stackedHere) {\n if ((horizontal ? rect.width : rect.height) >= 18) {\n valueLabel(`${id}-label`, seriesIndex, text, rect.x + rect.width / 2, rect.y + rect.height / 2, \"middle\", \"middle\");\n }\n } else if (horizontal) {\n const outward = (segment.y1 >= segment.y0) !== mirrored;\n valueLabel(`${id}-label`, seriesIndex, text, outward ? rect.x + rect.width + 4 : rect.x - 4, rect.y + rect.height / 2, outward ? \"start\" : \"end\", \"middle\");\n } else {\n const up = segment.y1 >= segment.y0;\n valueLabel(`${id}-label`, seriesIndex, text, rect.x + rect.width / 2, up ? rect.y - 4 : rect.y + rect.height + 4, \"middle\", up ? \"above\" : \"below\");\n }\n }\n };\n\n const baselineFor = (axis: \"y\" | \"y2\"): number => baselineOf(axis);\n\n /* bars */\n if (mark === \"waterfall\" && model.waterfall) {\n const series = model.series[0];\n const steps = model.waterfall.steps;\n if (series && !hidden.has(series.id)) {\n const band = category.band;\n let previousEnd: { x: number; y: number } | undefined;\n steps.forEach((step, i) => {\n const point = series.points[i];\n if (!point || !band) return;\n const tone = step.total ? \"accent\" : step.delta >= 0 ? \"good\" : \"critical\";\n const pattern = step.total ? -1 : step.delta >= 0 ? -1 : 0;\n if (pattern >= 0) patternsInUse.add(pattern);\n addBar(0, series, point, 0, 1, { y0: step.start, y1: step.end }, tone, pattern);\n const bar = marks[marks.length - 1];\n if (bar && bar.kind === \"bar\") {\n const startEdge = horizontal ? (bar.y ?? 0) : (bar.x ?? 0);\n if (previousEnd) {\n marks.push({\n id: `connector-${i}`,\n kind: \"connector\",\n series: 0,\n seriesId: series.id,\n point: -1,\n tone: \"reference\",\n styleIndex: 0,\n pattern: -1,\n ...(horizontal\n ? { x1: previousEnd.x, y1: previousEnd.y, x2: valuePos(\"y\", step.start), y2: startEdge }\n : { x1: previousEnd.x, y1: previousEnd.y, x2: startEdge, y2: valuePos(\"y\", step.start) }),\n });\n }\n const endEdge = horizontal ? (bar.y ?? 0) + (bar.height ?? 0) : (bar.x ?? 0) + (bar.width ?? 0);\n previousEnd = horizontal ? { x: valuePos(\"y\", step.end), y: endEdge } : { x: endEdge, y: valuePos(\"y\", step.end) };\n const signed = step.total\n ? fmts.value(0)(step.end)\n : `${step.delta > 0 ? \"+\" : step.delta < 0 ? \"\\u2212\" : \"\"}${fmts.value(0)(Math.abs(step.delta))}`;\n const above = step.end >= step.start;\n if (horizontal) {\n const outward = above !== mirrored;\n valueLabel(`bar-${0}-${point.index}-label`, 0, signed, outward ? (bar.x ?? 0) + (bar.width ?? 0) + 4 : (bar.x ?? 0) - 4, (bar.y ?? 0) + (bar.height ?? 0) / 2, outward ? \"start\" : \"end\", \"middle\");\n } else {\n valueLabel(`bar-${0}-${point.index}-label`, 0, signed, (bar.x ?? 0) + (bar.width ?? 0) / 2, above ? (bar.y ?? 0) - 4 : (bar.y ?? 0) + (bar.height ?? 0) + 4, \"middle\", above ? \"above\" : \"below\");\n }\n }\n });\n }\n } else if (mark === \"bar\" || mark === \"lollipop\" || (mark === \"combo\" && entries.some((e) => e.series.mark === \"bar\"))) {\n const barEntries = entries.filter((entry) => entry.series.mark === \"bar\");\n const slotKeys: string[] = [];\n const slotOf = new Map<number, number>();\n for (const entry of barEntries) {\n const key = stackMode === \"none\" ? `s${entry.index}` : `${entry.series.axis}|${entry.series.stackKey}`;\n let slot = slotKeys.indexOf(key);\n if (slot < 0) {\n slot = slotKeys.length;\n slotKeys.push(key);\n }\n slotOf.set(entry.index, slot);\n }\n const slotCount = Math.max(1, slotKeys.length);\n for (const { series, index } of barEntries) {\n for (const point of series.points) {\n if (point.y === null) continue;\n const stacked = segments.get(index)?.[point.categoryIndex];\n const base = baselineFor(series.axis);\n const segment = stacked ?? { y0: base, y1: point.y };\n if (mark === \"lollipop\") {\n const band = category.band;\n const start = band?.(point.key);\n if (!band || start === undefined) continue;\n const center = start + band.bandwidth / 2;\n const v0 = valuePos(series.axis, base);\n const v1 = valuePos(series.axis, point.y);\n const breach = breachFor(series, point.y);\n marks.push({\n id: `stem-${index}-${point.index}`,\n kind: \"stem\",\n series: index,\n seriesId: series.id,\n point: point.index,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: -1,\n ...(horizontal ? { x1: v0, y1: center, x2: v1, y2: center } : { x1: center, y1: v0, x2: center, y2: v1 }),\n muted: mutedFor(point),\n });\n const cx = horizontal ? v1 : center;\n const cy = horizontal ? center : v1;\n marks.push({\n id: `point-${index}-${point.index}`,\n kind: \"point\",\n series: index,\n seriesId: series.id,\n point: point.index,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: -1,\n cx,\n cy,\n r: 5,\n shape: series.style.marker,\n muted: mutedFor(point),\n highlighted: point.highlighted,\n ...(breach !== undefined ? { breach: true } : {}),\n });\n targets.push({\n id: `${index}:${point.index}`,\n series: index,\n point: point.index,\n group: point.categoryIndex,\n x: cx,\n y: cy,\n focus: { kind: \"circle\", cx, cy, r: 9 },\n kind: \"point\",\n ...(breach !== undefined ? { breach } : {}),\n });\n if (showAllValues) {\n const text = fmts.value(index)(point.y);\n if (horizontal) valueLabel(`point-${index}-${point.index}-label`, index, text, cx + (mirrored ? -9 : 9), cy, mirrored ? \"end\" : \"start\", \"middle\");\n else valueLabel(`point-${index}-${point.index}-label`, index, text, cx, cy - 9, \"middle\", \"above\");\n }\n } else {\n addBar(index, series, point, slotOf.get(index) ?? 0, slotCount, segment);\n }\n }\n }\n } else if (mark === \"histogram\") {\n const scale = category.continuous;\n if (scale) {\n for (const { series, index } of entries) {\n for (const point of series.points) {\n if (point.y === null || point.x1 === undefined || typeof point.x !== \"number\") continue;\n const a = scale(point.x);\n const b = scale(point.x1);\n const x = Math.min(a, b) + 0.5;\n const widthPx = Math.max(1, Math.abs(b - a) - 1);\n const top = valuePos(\"y\", point.y);\n const base = valuePos(\"y\", baselineFor(\"y\"));\n const rect = { x, y: Math.min(top, base), width: widthPx, height: Math.abs(base - top) };\n marks.push({\n id: `bar-${index}-${point.index}`,\n kind: \"bar\",\n series: index,\n seriesId: series.id,\n point: point.index,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: patternFor(series.style.index),\n ...rect,\n muted: false,\n highlighted: false,\n });\n targets.push({\n id: `${index}:${point.index}`,\n series: index,\n point: point.index,\n group: point.categoryIndex,\n x: x + widthPx / 2,\n y: top,\n focus: { kind: \"rect\", ...rect },\n kind: \"point\",\n bounds: rect,\n });\n if (showAllValues) valueLabel(`bar-${index}-${point.index}-label`, index, fmts.value(index)(point.y), x + widthPx / 2, top - 4, \"middle\", \"above\");\n }\n }\n }\n }\n\n /* lines, areas, steps (and markers) */\n const lineLike = entries.filter((entry) => entry.series.mark === \"line\" || entry.series.mark === \"area\" || entry.series.mark === \"step\");\n if (mark !== \"waterfall\" && mark !== \"histogram\" && mark !== \"lollipop\") {\n for (const { series, index } of lineLike) {\n const stacked = segments.get(index);\n const base = baselineFor(series.axis);\n interface Pt {\n x: number;\n y: number | null;\n y0: number;\n point: ModelPoint;\n }\n const pts: Pt[] = [];\n for (const point of series.points) {\n const x = catCenter(point);\n if (x === null) continue;\n const segment = stacked?.[point.categoryIndex];\n const top = point.y === null ? null : valuePos(series.axis, segment ? segment.y1 : point.y);\n const bottom = valuePos(series.axis, segment ? segment.y0 : base);\n pts.push({ x, y: top, y0: bottom, point });\n }\n const curve = series.mark === \"step\" ? curveStepAfter : curveLinear;\n if (series.mark === \"area\") {\n const d = d3Area<Pt>()\n .defined((p) => p.y !== null)\n .x((p) => p.x)\n .y0((p) => p.y0)\n .y1((p) => p.y as number)\n .curve(curve)(pts);\n if (d) {\n marks.push({\n id: `area-${index}`,\n kind: \"area\",\n series: index,\n seriesId: series.id,\n point: -1,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: patternFor(series.style.index),\n d,\n });\n }\n }\n const lineD = d3Line<Pt>()\n .defined((p) => p.y !== null)\n .x((p) => p.x)\n .y((p) => p.y as number)\n .curve(curve)(pts);\n if (lineD) {\n const dash = dashArrays[series.style.dash];\n marks.push({\n id: `line-${index}`,\n kind: \"line\",\n series: index,\n seriesId: series.id,\n point: -1,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: -1,\n d: lineD,\n ...(dash ? { dash } : {}),\n });\n }\n const drawMarkers = series.points.length <= MAX_MARKED_POINTS;\n for (const p of pts) {\n if (p.y === null) continue;\n const breach = breachFor(series, p.point.y);\n if (drawMarkers || breach !== undefined || p.point.highlighted) {\n marks.push({\n id: `point-${index}-${p.point.index}`,\n kind: \"point\",\n series: index,\n seriesId: series.id,\n point: p.point.index,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: -1,\n cx: p.x,\n cy: p.y,\n r: MARKER_RADIUS,\n shape: series.style.marker,\n muted: false,\n highlighted: p.point.highlighted,\n ...(breach !== undefined ? { breach: true } : {}),\n });\n }\n targets.push({\n id: `${index}:${p.point.index}`,\n series: index,\n point: p.point.index,\n group: p.point.categoryIndex,\n x: p.x,\n y: p.y,\n focus: { kind: \"circle\", cx: p.x, cy: p.y, r: 7 },\n kind: \"point\",\n ...(breach !== undefined ? { breach } : {}),\n });\n if (showAllValues && p.point.y !== null) {\n valueLabel(`point-${index}-${p.point.index}-label`, index, fmts.value(index)(p.point.y), p.x, p.y - 8, \"middle\", \"above\");\n }\n }\n }\n }\n\n /* scatter and bubble */\n if (mark === \"scatter\" || mark === \"bubble\") {\n const sizes: number[] = [];\n for (const { series } of entries) for (const point of series.points) if (point.size !== null) sizes.push(point.size);\n const maxSize = sizes.length ? Math.max(...sizes) : 0;\n const maxRadius = Math.max(8, Math.min(24, Math.min(plot.width, plot.height) / 10));\n const radiusScale = scaleSqrt().domain([0, maxSize || 1]).range([3, maxRadius]);\n let order = 0;\n for (const { series, index } of entries) {\n for (const point of series.points) {\n if (point.y === null) continue;\n const x = catCenter(point);\n if (x === null) continue;\n const y = valuePos(series.axis, point.y);\n const r = mark === \"bubble\" && point.size !== null ? radiusScale(Math.max(0, point.size)) : 4.5;\n const breach = breachFor(series, point.y);\n marks.push({\n id: `point-${index}-${point.index}`,\n kind: \"point\",\n series: index,\n seriesId: series.id,\n point: point.index,\n tone: series.style.tone,\n styleIndex: series.style.index,\n pattern: -1,\n cx: x,\n cy: y,\n r,\n shape: series.style.marker,\n muted: mutedFor(point),\n highlighted: point.highlighted,\n ...(breach !== undefined ? { breach: true } : {}),\n });\n targets.push({\n id: `${index}:${point.index}`,\n series: index,\n point: point.index,\n group: order,\n x,\n y,\n focus: { kind: \"circle\", cx: x, cy: y, r: r + 4 },\n kind: \"point\",\n ...(breach !== undefined ? { breach } : {}),\n });\n order += 1;\n }\n }\n }\n\n /* ----------------------------------------------------- direct labels */\n if (useDirectLabels) {\n const anchors = directEntries\n .map((entry) => {\n const last = [...marks].reverse().find((m) => m.kind === \"line\" && m.series === entry.index);\n const pts = targets.filter((t) => t.series === entry.index);\n const end = pts.reduce<HitTarget | undefined>((best, t) => (!best || t.group > best.group ? t : best), undefined);\n return last && end ? { entry, end } : undefined;\n })\n .filter((anchor): anchor is { entry: (typeof directEntries)[number]; end: HitTarget } => anchor !== undefined);\n const ys = dodgePositions(\n anchors.map((anchor) => anchor.end.y),\n AXIS_FONT_SIZE * 1.3,\n plot.y + AXIS_FONT_SIZE / 2,\n plot.y + plot.height - AXIS_FONT_SIZE / 2,\n );\n anchors.forEach((anchor, i) => {\n labels.push({\n id: `direct-${anchor.entry.index}`,\n text: truncateLabel(anchor.entry.series.label, 18),\n x: anchor.end.x + (mirrored ? -8 : 8),\n y: ys[i] ?? anchor.end.y,\n anchor: mirrored ? \"end\" : \"start\",\n kind: \"direct\",\n baseline: \"middle\",\n tone: anchor.entry.series.style.tone,\n series: anchor.entry.index,\n });\n });\n }\n\n /* ------------------------------------------------------ annotations */\n const notes: AnnotationLayout[] = [];\n const clampInside = (value: number, a: number, b: number): boolean => value >= Math.min(a, b) - 0.5 && value <= Math.max(a, b) + 0.5;\n const catPosOf = (value: number | string): number | null => {\n if (category.mode === \"continuous\" && category.continuous) {\n const n = model.xKind === \"time\" ? toTime(value) : toNumber(value);\n if (n === null) return null;\n const position = category.continuous(n);\n return Number.isFinite(position) && clampInside(position, category.continuous.range[0], category.continuous.range[1]) ? position : null;\n }\n const key = model.xKind === \"time\" ? String(toTime(value)) : String(value);\n const scaleStart = category.band?.(key);\n if (scaleStart !== undefined && category.band) return scaleStart + category.band.bandwidth / 2;\n return category.point?.(key) ?? null;\n };\n const valPosOf = (value: number | string, axis: \"y\" | \"y2\"): number | null => {\n const n = toNumber(value);\n const scale = (axis === \"y2\" ? plan.y2 : plan.y)?.scale;\n if (n === null || !scale) return null;\n const position = scale(n);\n return Number.isFinite(position) && clampInside(position, scale.range[0], scale.range[1]) ? position : null;\n };\n const valueIsHorizontal = horizontal; // value axis runs left to right for horizontal bars\n const noteLabels: Array<{ note: AnnotationLayout; along: number }> = [];\n\n const addLine = (\n id: string,\n toneName: AnnotationTone | undefined,\n label: string,\n position: number,\n onValueAxis: boolean,\n isThreshold: boolean,\n ): void => {\n // A line on the value axis runs across the plot at constant value.\n const verticalOnScreen = onValueAxis ? valueIsHorizontal : !horizontal;\n const tone = annotationTone(toneName);\n const note: AnnotationLayout = {\n id,\n kind: \"line\",\n tone,\n toneName: toneName ?? \"neutral\",\n threshold: isThreshold,\n ...(verticalOnScreen\n ? { x1: position, x2: position, y1: plot.y, y2: plot.y + plot.height }\n : { y1: position, y2: position, x1: plot.x, x2: plot.x + plot.width }),\n };\n note.label = {\n id: `${id}-label`,\n text: label,\n kind: \"annotation\",\n tone,\n x: verticalOnScreen ? position + (position > plot.x + plot.width * 0.7 ? -4 : 4) : mirrored ? plot.x + 4 : plot.x + plot.width - 4,\n y: verticalOnScreen ? plot.y + 4 : position - 4,\n anchor: verticalOnScreen ? (position > plot.x + plot.width * 0.7 ? \"end\" : \"start\") : mirrored ? \"start\" : \"end\",\n baseline: verticalOnScreen ? \"below\" : \"above\",\n };\n notes.push(note);\n if (!verticalOnScreen) noteLabels.push({ note, along: position });\n };\n\n annotations.forEach((annotation, i) => {\n const id = `annotation-${i}`;\n switch (annotation.type) {\n case \"reference-line\": {\n if (annotation.y !== undefined) {\n const position = valPosOf(annotation.y, annotation.axis ?? \"y\");\n if (position !== null) addLine(`${id}-y`, annotation.tone, annotation.label, position, true, false);\n }\n if (annotation.x !== undefined) {\n const position = catPosOf(annotation.x);\n if (position !== null) addLine(`${id}-x`, annotation.tone, annotation.label, position, false, false);\n }\n break;\n }\n case \"reference-band\": {\n const tone = annotationTone(annotation.tone);\n const onValue = annotation.axis === \"y\";\n const a = onValue ? valPosOf(annotation.from, \"y\") : catPosOf(annotation.from);\n const b = onValue ? valPosOf(annotation.to, \"y\") : catPosOf(annotation.to);\n if (a === null || b === null) break;\n const verticalBand = onValue ? valueIsHorizontal : !horizontal;\n const low = Math.min(a, b);\n const span = Math.abs(a - b);\n const box: Box = verticalBand\n ? { x: low, y: plot.y, width: span, height: plot.height }\n : { x: plot.x, y: low, width: plot.width, height: span };\n notes.push({\n id,\n kind: \"band\",\n tone,\n toneName: annotation.tone ?? \"neutral\",\n threshold: false,\n box,\n label: {\n id: `${id}-label`,\n text: annotation.label,\n kind: \"annotation\",\n tone,\n x: box.x + (mirrored && verticalBand ? box.width - 4 : 4),\n y: box.y + 4,\n anchor: mirrored && verticalBand ? \"end\" : \"start\",\n baseline: \"below\",\n },\n });\n break;\n }\n case \"forecast\": {\n const from = catPosOf(annotation.from);\n if (from === null || horizontal) break;\n const end = mirrored ? plot.x : plot.x + plot.width;\n const box: Box = { x: Math.min(from, end), y: plot.y, width: Math.abs(end - from), height: plot.height };\n notes.push({\n id,\n kind: \"forecast\",\n tone: \"reference\",\n toneName: \"neutral\",\n threshold: false,\n box,\n label: {\n id: `${id}-label`,\n text: annotation.label,\n kind: \"annotation\",\n tone: \"reference\",\n x: mirrored ? box.x + box.width - 4 : box.x + 4,\n y: box.y + 4,\n anchor: mirrored ? \"end\" : \"start\",\n baseline: \"below\",\n },\n });\n break;\n }\n case \"point\":\n case \"text\": {\n const cx = horizontal ? valPosOf(annotation.y, \"y\") : catPosOf(annotation.x);\n const cy = horizontal ? catPosOf(annotation.x) : valPosOf(annotation.y, \"y\");\n if (cx === null || cy === null) break;\n const text = annotation.type === \"point\" ? annotation.label : annotation.text;\n const tone = annotationTone(annotation.type === \"point\" ? annotation.tone : undefined);\n notes.push({\n id,\n kind: annotation.type === \"point\" ? \"point\" : \"text\",\n tone,\n toneName: annotation.type === \"point\" ? (annotation.tone ?? \"neutral\") : \"neutral\",\n threshold: false,\n cx,\n cy,\n label: {\n id: `${id}-label`,\n text,\n kind: \"annotation\",\n tone,\n x: annotation.type === \"point\" ? cx + (mirrored ? -8 : 8) : cx,\n y: annotation.type === \"point\" ? cy - 8 : cy,\n anchor: annotation.type === \"point\" ? (mirrored ? \"end\" : \"start\") : \"middle\",\n baseline: annotation.type === \"point\" ? \"above\" : \"middle\",\n },\n });\n break;\n }\n }\n });\n thresholds.forEach((threshold, i) => {\n const axis = threshold.axis ?? \"y\";\n const position = axis === \"x\" ? catPosOf(threshold.value) : valPosOf(threshold.value, axis);\n if (position === null) return;\n addLine(`threshold-${i}`, threshold.tone, `${threshold.label}`, position, axis !== \"x\", true);\n });\n // Keep stacked line labels from overlapping.\n if (noteLabels.length > 1) {\n const ys = dodgePositions(\n noteLabels.map((entry) => (entry.note.label?.y ?? 0)),\n AXIS_FONT_SIZE * 1.3,\n plot.y + AXIS_FONT_SIZE,\n plot.y + plot.height,\n );\n noteLabels.forEach((entry, i) => {\n if (entry.note.label) entry.note.label.y = ys[i] ?? entry.note.label.y;\n });\n }\n\n /* ------------------------------------------------------------- axes */\n const axes: AxisLayout[] = [];\n const catOrient: AxisLayout[\"orient\"] = horizontal ? (mirrored ? \"right\" : \"left\") : \"bottom\";\n const place = (orient: AxisLayout[\"orient\"]): AxisLayout[\"line\"] => {\n switch (orient) {\n case \"bottom\":\n return { x1: plot.x, y1: plot.y + plot.height, x2: plot.x + plot.width, y2: plot.y + plot.height };\n case \"top\":\n return { x1: plot.x, y1: plot.y, x2: plot.x + plot.width, y2: plot.y };\n case \"left\":\n return { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height };\n case \"right\":\n return { x1: plot.x + plot.width, y1: plot.y, x2: plot.x + plot.width, y2: plot.y + plot.height };\n }\n };\n const titlePos = (orient: AxisLayout[\"orient\"]): { x: number; y: number; rotate: number } => {\n switch (orient) {\n case \"bottom\":\n return { x: plot.x + plot.width / 2, y: height - AXIS_FONT_SIZE * 0.5 - 2, rotate: 0 };\n case \"top\":\n return { x: plot.x + plot.width / 2, y: AXIS_FONT_SIZE, rotate: 0 };\n case \"left\":\n return { x: AXIS_FONT_SIZE * 0.75, y: plot.y + plot.height / 2, rotate: -90 };\n case \"right\":\n return { x: width - AXIS_FONT_SIZE * 0.75, y: plot.y + plot.height / 2, rotate: 90 };\n }\n };\n if (!sparkline) {\n if (showAxis(\"x\")) {\n const title = horizontal ? axisTitles.x : axisTitles.x;\n axes.push({\n id: \"x\",\n orient: catOrient,\n line: place(catOrient),\n ...(title ? { title, titlePosition: titlePos(catOrient) } : {}),\n ticks: category.ticks,\n labelAngle: category.angle,\n labelAnchor: category.anchor,\n grid: spec.axes?.x?.grid ?? false,\n numeric: category.mode === \"continuous\" && model.xKind !== \"time\",\n });\n }\n const valueOrient: AxisLayout[\"orient\"] = horizontal ? \"bottom\" : mirrored ? \"right\" : \"left\";\n if (plan.y && showAxis(\"y\")) {\n axes.push({\n id: \"y\",\n orient: valueOrient,\n line: place(valueOrient),\n ...(axisTitles.y ? { title: axisTitles.y, titlePosition: titlePos(valueOrient) } : {}),\n ticks: plan.y.ticks,\n labelAngle: 0,\n labelAnchor: horizontal ? \"middle\" : mirrored ? \"start\" : \"end\",\n grid: spec.axes?.y?.grid ?? true,\n numeric: true,\n });\n }\n if (plan.y2 && showAxis(\"y2\")) {\n const orient: AxisLayout[\"orient\"] = mirrored ? \"left\" : \"right\";\n axes.push({\n id: \"y2\",\n orient,\n line: place(orient),\n ...(axisTitles.y2 ? { title: axisTitles.y2, titlePosition: titlePos(orient) } : {}),\n ticks: plan.y2.ticks,\n labelAngle: 0,\n labelAnchor: mirrored ? \"end\" : \"start\",\n grid: spec.axes?.y2?.grid ?? false,\n numeric: true,\n });\n }\n }\n\n /* ----------------------------------------------------------- legend */\n const legend: LegendEntry[] = [];\n if (mark === \"waterfall\") {\n legend.push(\n { id: \"key-increase\", label: messages.increase, series: null, tone: \"good\", marker: \"square\", dash: undefined, glyph: \"bar\", pattern: -1, visible: true, toggle: false },\n { id: \"key-decrease\", label: messages.decrease, series: null, tone: \"critical\", marker: \"square\", dash: undefined, glyph: \"bar\", pattern: 0, visible: true, toggle: false },\n { id: \"key-total\", label: messages.total, series: null, tone: \"accent\", marker: \"square\", dash: undefined, glyph: \"bar\", pattern: -1, visible: true, toggle: false },\n );\n } else {\n model.series.forEach((series, index) => {\n const glyph: LegendEntry[\"glyph\"] =\n mark === \"scatter\" || mark === \"bubble\" || mark === \"lollipop\"\n ? \"point\"\n : series.mark === \"bar\"\n ? \"bar\"\n : series.mark === \"area\"\n ? \"area\"\n : series.mark === \"scatter\"\n ? \"point\"\n : \"line\";\n const filled = glyph === \"bar\" || glyph === \"area\";\n const pattern =\n filled && (options.patterns === true || model.series.length > 1) ? patternIndex(series.style.index, options.patterns === true) : -1;\n if (pattern >= 0) patternsInUse.add(pattern);\n legend.push({\n id: series.id,\n label: series.label,\n series: index,\n tone: series.style.tone,\n marker: series.style.marker,\n dash: dashArrays[series.style.dash],\n glyph,\n pattern,\n visible: !hidden.has(series.id),\n toggle: true,\n });\n });\n }\n\n const categoryAligned = mark !== \"scatter\" && mark !== \"bubble\";\n return {\n mark,\n width,\n height,\n margin,\n plot,\n orientation: horizontal ? \"horizontal\" : \"vertical\",\n mirrored,\n axes,\n marks,\n labels,\n annotations: notes,\n targets: sortTargets(targets, categoryAligned),\n legend,\n hit: categoryAligned ? (horizontal ? \"category-y\" : \"category-x\") : \"nearest\",\n navigation: categoryAligned ? (horizontal ? \"category-y\" : \"category-x\") : \"spatial\",\n crosshair: !categoryAligned || sparkline ? \"none\" : horizontal ? \"y\" : \"x\",\n allHidden,\n patterns: [...patternsInUse].sort((a, b) => a - b),\n };\n}\n\n/** Orders targets by category position, then series, so reading order matches the visual order. */\nfunction sortTargets(targets: HitTarget[], categoryAligned: boolean): HitTarget[] {\n if (!categoryAligned) return targets;\n return [...targets].sort((a, b) => a.group - b.group || a.series - b.series);\n}\n","/**\n * Layout for heatmaps: one rectangle per (column, row) cell, colored along the\n * sequential ramp, or the diverging ramp when values cross zero. Pure and\n * server-safe.\n */\nimport { createFormatters } from \"../formatters\";\nimport type { ChartModel } from \"../model\";\nimport {\n AXIS_FONT_SIZE,\n EDGE_MARGIN,\n computeAxisMargins,\n createBandScale,\n estimateTextWidth,\n fitTickLabels,\n truncateLabel,\n type Margin,\n} from \"../scales\";\nimport type {\n AxisLayout,\n AxisTick,\n Box,\n ChartLayout,\n HitTarget,\n LayoutMark,\n LayoutOptions,\n TextLabel,\n} from \"./types\";\n\nexport function layoutHeatmap(model: ChartModel, options: LayoutOptions): ChartLayout {\n const { width, height } = options;\n const spec = model.spec;\n const heat = model.heatmap;\n const fmts = createFormatters(model, options);\n const series = model.series[0];\n const mirrored = options.rtl === true;\n const columns = heat?.columns ?? [];\n const rows = heat?.rows ?? [];\n\n const rowLabels = rows.map((row) => truncateLabel(row, spec.axes?.y?.maxLabelLength ?? 18));\n const rowWidth = Math.max(0, ...rowLabels.map((label) => estimateTextWidth(label)));\n\n const buildMargin = (plotWidth: number): { margin: Margin; fit: ReturnType<typeof fitTickLabels> } => {\n const step = columns.length > 0 ? plotWidth / columns.length : plotWidth;\n const fit = fitTickLabels(columns, step, {\n angle: spec.axes?.x?.labelAngle ?? \"auto\",\n maxLength: spec.axes?.x?.maxLabelLength,\n rtl: mirrored,\n });\n return {\n fit,\n margin: computeAxisMargins({\n verticalTickWidth: spec.axes?.y?.show === false ? 0 : rowWidth,\n horizontalTickHeight: spec.axes?.x?.show === false ? 0 : fit.height,\n verticalTitle: Boolean(spec.axes?.y?.title ?? spec.y?.title),\n horizontalTitle: Boolean(spec.axes?.x?.title ?? spec.x?.title),\n verticalAxisSide: mirrored ? \"right\" : \"left\",\n }),\n };\n };\n\n let { margin, fit } = buildMargin(Math.max(1, width - EDGE_MARGIN - rowWidth - 12));\n for (let pass = 0; pass < 2; pass += 1) {\n ({ margin, fit } = buildMargin(Math.max(1, width - margin.left - margin.right)));\n }\n const plot: Box = {\n x: margin.left,\n y: margin.top,\n width: Math.max(1, width - margin.left - margin.right),\n height: Math.max(1, height - margin.top - margin.bottom),\n };\n\n const xRange: [number, number] = mirrored ? [plot.x + plot.width, plot.x] : [plot.x, plot.x + plot.width];\n const xScale = createBandScale(columns, xRange, 0.04);\n const yScale = createBandScale(rows, [plot.y, plot.y + plot.height], 0.04);\n\n const min = heat?.min ?? 0;\n const max = heat?.max ?? 0;\n const diverging = min < 0 && max > 0;\n const maxAbs = Math.max(Math.abs(min), Math.abs(max)) || 1;\n const toRatio = (value: number): number => {\n if (diverging) return 0.5 + value / (2 * maxAbs);\n return max === min ? 0.5 : (value - min) / (max - min);\n };\n\n const marks: LayoutMark[] = [];\n const targets: HitTarget[] = [];\n const labels: TextLabel[] = [];\n const valueFormat = fmts.value(0);\n const cellLabels = spec.labels?.values === true;\n\n if (series) {\n for (const point of series.points) {\n if (point.y === null) continue;\n const column = columns.indexOf(point.key);\n const row = rows.indexOf(point.group ?? \"\");\n const x = xScale(point.key);\n const y = yScale(point.group ?? \"\");\n if (x === undefined || y === undefined) continue;\n const rect = { x, y, width: xScale.bandwidth, height: yScale.bandwidth };\n const id = `cell-${point.index}`;\n marks.push({\n id,\n kind: \"cell\",\n series: 0,\n seriesId: series.id,\n point: point.index,\n tone: \"accent\",\n styleIndex: 0,\n pattern: -1,\n ...rect,\n t: toRatio(point.y),\n ramp: diverging ? \"diverging\" : \"sequential\",\n muted: model.hasHighlight && !point.highlighted,\n highlighted: point.highlighted,\n });\n targets.push({\n id: `0:${point.index}`,\n series: 0,\n point: point.index,\n group: column,\n x: x + rect.width / 2,\n y: y + rect.height / 2,\n focus: { kind: \"rect\", ...rect },\n kind: \"cell\",\n row,\n column,\n bounds: rect,\n });\n if (cellLabels && rect.width >= 28 && rect.height >= 16) {\n labels.push({\n id: `${id}-label`,\n text: valueFormat(point.y),\n x: x + rect.width / 2,\n y: y + rect.height / 2,\n anchor: \"middle\",\n baseline: \"middle\",\n kind: \"cell\",\n numeric: true,\n });\n }\n }\n }\n\n const axes: AxisLayout[] = [];\n const xTitle = spec.axes?.x?.title ?? spec.x?.title;\n const yTitle = spec.axes?.y?.title ?? spec.y?.title;\n if (spec.axes?.x?.show !== false) {\n const ticks: AxisTick[] = columns.map((column, index) => {\n const fitted = fit.labels[index];\n return {\n value: column,\n position: (xScale(column) ?? 0) + xScale.bandwidth / 2,\n label: fitted?.text ?? column,\n full: column,\n visible: fitted?.visible ?? true,\n };\n });\n axes.push({\n id: \"x\",\n orient: \"bottom\",\n line: { x1: plot.x, y1: plot.y + plot.height, x2: plot.x + plot.width, y2: plot.y + plot.height },\n ...(xTitle ? { title: xTitle, titlePosition: { x: plot.x + plot.width / 2, y: height - AXIS_FONT_SIZE * 0.5 - 2, rotate: 0 } } : {}),\n ticks,\n labelAngle: fit.angle,\n labelAnchor: fit.anchor,\n grid: false,\n numeric: false,\n });\n }\n if (spec.axes?.y?.show !== false) {\n const orient = mirrored ? \"right\" : \"left\";\n const skip = Math.max(1, Math.ceil((AXIS_FONT_SIZE * 1.25) / Math.max(1, yScale.step)));\n axes.push({\n id: \"y\",\n orient,\n line: mirrored\n ? { x1: plot.x + plot.width, y1: plot.y, x2: plot.x + plot.width, y2: plot.y + plot.height }\n : { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height },\n ...(yTitle\n ? { title: yTitle, titlePosition: { x: mirrored ? width - AXIS_FONT_SIZE * 0.75 : AXIS_FONT_SIZE * 0.75, y: plot.y + plot.height / 2, rotate: mirrored ? 90 : -90 } }\n : {}),\n ticks: rows.map((row, index) => ({\n value: row,\n position: (yScale(row) ?? 0) + yScale.bandwidth / 2,\n label: rowLabels[index] ?? row,\n full: row,\n visible: index % skip === 0,\n })),\n labelAngle: 0,\n labelAnchor: mirrored ? \"start\" : \"end\",\n grid: false,\n numeric: false,\n });\n }\n\n return {\n mark: model.mark,\n width,\n height,\n margin,\n plot,\n orientation: \"vertical\",\n mirrored,\n axes,\n marks,\n labels,\n annotations: [],\n targets: targets.sort((a, b) => (a.row ?? 0) - (b.row ?? 0) || (a.column ?? 0) - (b.column ?? 0)),\n legend: [],\n hit: \"cell\",\n navigation: \"grid\",\n crosshair: \"none\",\n colorScale: { kind: diverging ? \"diverging\" : \"sequential\", min, max },\n allHidden: false,\n patterns: [],\n };\n}\n","/**\n * Layout for pie, donut, gauge and progress ring. Angles are radians measured\n * clockwise from twelve o'clock, as in d3-shape. Pure and server-safe.\n */\nimport { arc as d3Arc, pie as d3Pie } from \"d3-shape\";\nimport { createFormatters } from \"../formatters\";\nimport { formatShare } from \"../format\";\nimport { formatMessage } from \"../messages\";\nimport type { ChartModel } from \"../model\";\nimport { annotationTone } from \"../palette\";\nimport { EDGE_MARGIN, AXIS_FONT_SIZE, dodgePositions, estimateTextWidth, truncateLabel } from \"../scales\";\nimport { patternIndex } from \"./cartesian\";\nimport type { ChartLayout, HitTarget, LayoutMark, LayoutOptions, LegendEntry, TextLabel } from \"./types\";\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\nconst TAU = Math.PI * 2;\n\nfunction emptyLayout(model: ChartModel, options: LayoutOptions, extra: Partial<ChartLayout>): ChartLayout {\n const { width, height } = options;\n return {\n mark: model.mark,\n width,\n height,\n margin: { top: EDGE_MARGIN, right: EDGE_MARGIN, bottom: EDGE_MARGIN, left: EDGE_MARGIN },\n plot: { x: EDGE_MARGIN, y: EDGE_MARGIN, width: Math.max(1, width - EDGE_MARGIN * 2), height: Math.max(1, height - EDGE_MARGIN * 2) },\n orientation: \"vertical\",\n mirrored: false,\n axes: [],\n marks: [],\n labels: [],\n annotations: [],\n targets: [],\n legend: [],\n hit: \"none\",\n navigation: \"none\",\n crosshair: \"none\",\n allHidden: false,\n patterns: [],\n ...extra,\n };\n}\n\n/** Pie and donut. */\nexport function layoutPie(model: ChartModel, options: LayoutOptions): ChartLayout {\n const { width, height } = options;\n const hidden = options.hidden ?? EMPTY_SET;\n const fmts = createFormatters(model, options);\n const messages = fmts.messages;\n const spec = model.spec;\n const slices = model.slices;\n const visible = slices.map((slice, index) => ({ slice, index })).filter((entry) => !hidden.has(entry.slice.id));\n const total = visible.reduce((sum, entry) => sum + entry.slice.value, 0);\n const isDonut = model.mark === \"donut\";\n const innerFraction = Math.min(0.9, Math.max(0, spec.donut?.innerRadius ?? (isDonut ? 0.62 : 0)));\n\n // Direct labels for few slices; they need room beside the ring.\n const directMode = spec.labels?.direct ?? \"auto\";\n const direct = directMode === true || (directMode === \"auto\" && slices.length <= 5 && width >= 280);\n const labelTexts = visible.map((entry) =>\n `${truncateLabel(entry.slice.label, 16)} ${formatShare(total === 0 ? 0 : entry.slice.value / total, options.locale)}`,\n );\n const labelRoom = direct && visible.length > 0 ? Math.min(width * 0.3, Math.max(...labelTexts.map((text) => estimateTextWidth(text))) + 16) : 0;\n\n const cx = width / 2;\n const cy = height / 2;\n const outerRadius = Math.max(8, Math.min(height / 2 - EDGE_MARGIN, width / 2 - EDGE_MARGIN - labelRoom));\n const innerRadius = outerRadius * innerFraction;\n\n const generator = d3Pie<{ value: number }>().value((d) => d.value).sort(null).padAngle(visible.length > 1 ? 0.012 : 0);\n const arcs = generator(visible.map((entry) => ({ value: entry.slice.value })));\n const arcPath = d3Arc<{ startAngle: number; endAngle: number; padAngle: number }>().innerRadius(innerRadius).outerRadius(outerRadius);\n\n const marks: LayoutMark[] = [];\n const targets: HitTarget[] = [];\n const labels: TextLabel[] = [];\n const patterns = new Set<number>();\n const wantPatterns = options.patterns === true || slices.length > 1;\n\n const leftLabels: Array<{ id: string; text: string; x: number; y: number; tone: TextLabel[\"tone\"] }> = [];\n const rightLabels: Array<{ id: string; text: string; x: number; y: number; tone: TextLabel[\"tone\"] }> = [];\n\n visible.forEach((entry, i) => {\n const arcData = arcs[i];\n if (!arcData) return;\n const d = arcPath(arcData) ?? \"\";\n const [mx, my] = arcPath.centroid(arcData);\n const mid = (arcData.startAngle + arcData.endAngle) / 2;\n const pattern = wantPatterns ? patternIndex(entry.slice.style.index, options.patterns === true) : -1;\n if (pattern >= 0) patterns.add(pattern);\n marks.push({\n id: `arc-${entry.index}`,\n kind: \"arc\",\n series: -1,\n seriesId: entry.slice.id,\n point: entry.index,\n tone: entry.slice.style.tone,\n styleIndex: entry.slice.style.index,\n pattern,\n d,\n cx,\n cy,\n muted: model.hasHighlight && !entry.slice.highlighted,\n highlighted: entry.slice.highlighted,\n });\n const anchorRadius = (innerRadius + outerRadius) / 2;\n const ax = cx + Math.sin(mid) * anchorRadius;\n const ay = cy - Math.cos(mid) * anchorRadius;\n targets.push({\n id: `0:${entry.index}`,\n series: 0,\n point: entry.index,\n group: i,\n x: ax,\n y: ay,\n focus: { kind: \"path\", d, tx: cx, ty: cy },\n kind: \"slice\",\n arc: { cx, cy, innerRadius, outerRadius, start: arcData.startAngle, end: arcData.endAngle },\n });\n const share = total === 0 ? 0 : entry.slice.value / total;\n const arcLength = (arcData.endAngle - arcData.startAngle) * anchorRadius;\n if (!direct && (spec.labels?.values === true || share >= 0.08) && arcLength > 28 && outerRadius - innerRadius > 20) {\n labels.push({\n id: `arc-${entry.index}-label`,\n text: formatShare(share, options.locale),\n x: cx + mx,\n y: cy + my,\n anchor: \"middle\",\n baseline: \"middle\",\n kind: \"value\",\n numeric: true,\n });\n }\n if (direct) {\n const radius = outerRadius + 10;\n const lx = cx + Math.sin(mid) * radius;\n const ly = cy - Math.cos(mid) * radius;\n const text = labelTexts[i] ?? \"\";\n (Math.sin(mid) >= 0 ? rightLabels : leftLabels).push({ id: `arc-${entry.index}-direct`, text, x: lx, y: ly, tone: entry.slice.style.tone });\n }\n });\n\n for (const [group, anchor] of [\n [rightLabels, \"start\"],\n [leftLabels, \"end\"],\n ] as const) {\n const ys = dodgePositions(group.map((label) => label.y), AXIS_FONT_SIZE * 1.3, EDGE_MARGIN, height - EDGE_MARGIN);\n group.forEach((label, i) => {\n labels.push({\n id: label.id,\n text: label.text,\n x: label.x + (anchor === \"start\" ? 2 : -2),\n y: ys[i] ?? label.y,\n anchor,\n baseline: \"middle\",\n kind: \"direct\",\n });\n });\n }\n\n if (isDonut && innerRadius > 24) {\n const centerText = spec.donut?.centerLabel ?? fmts.value(0)(total);\n labels.push({ id: \"center-value\", text: centerText, x: cx, y: cy - 2, anchor: \"middle\", baseline: \"middle\", kind: \"center\", numeric: spec.donut?.centerLabel === undefined });\n labels.push({\n id: \"center-caption\",\n text: spec.donut?.centerCaption ?? messages.total,\n x: cx,\n y: cy + AXIS_FONT_SIZE * 1.4,\n anchor: \"middle\",\n baseline: \"middle\",\n kind: \"caption\",\n });\n }\n\n const legend: LegendEntry[] = slices.map((slice) => {\n const pattern = wantPatterns ? patternIndex(slice.style.index, options.patterns === true) : -1;\n if (pattern >= 0) patterns.add(pattern);\n return {\n id: slice.id,\n label: slice.label,\n series: null,\n tone: slice.style.tone,\n marker: slice.style.marker,\n dash: undefined,\n glyph: \"slice\",\n pattern,\n visible: !hidden.has(slice.id),\n toggle: true,\n };\n });\n\n return emptyLayout(model, options, {\n marks,\n labels,\n targets,\n legend,\n hit: \"arc\",\n navigation: \"sequence\",\n radial: { cx, cy, outerRadius, innerRadius },\n allHidden: slices.length > 0 && visible.length === 0,\n patterns: [...patterns].sort((a, b) => a - b),\n });\n}\n\n/** Gauge (a half ring) and progress ring (a full ring). */\nexport function layoutGauge(model: ChartModel, options: LayoutOptions): ChartLayout {\n const { width, height } = options;\n const gauge = model.gauge;\n const fmts = createFormatters(model, options);\n const messages = fmts.messages;\n if (!gauge) return emptyLayout(model, options, {});\n const ring = model.mark === \"progress-ring\";\n const format = fmts.gauge;\n\n const startAngle = ring ? 0 : -Math.PI / 2;\n const sweep = ring ? TAU : Math.PI;\n const range = gauge.max - gauge.min;\n const fraction = (value: number): number => Math.min(1, Math.max(0, (value - gauge.min) / range));\n const angleAt = (value: number): number => startAngle + fraction(value) * sweep;\n\n const available = Math.max(16, Math.min(width - EDGE_MARGIN * 2, ring ? height - EDGE_MARGIN * 2 : (height - EDGE_MARGIN * 2) * 2));\n const outerRadius = ring ? available / 2 : Math.min(available / 2, width / 2 - EDGE_MARGIN);\n const innerRadius = outerRadius * (ring ? 0.78 : 0.72);\n const cx = width / 2;\n const cy = ring ? height / 2 : Math.min(height - EDGE_MARGIN - AXIS_FONT_SIZE * 1.8, height / 2 + outerRadius / 2);\n\n const arcGen = d3Arc<{ startAngle: number; endAngle: number }>().innerRadius(innerRadius).outerRadius(outerRadius);\n const arcD = (from: number, to: number): string => arcGen({ startAngle: from, endAngle: to }) ?? \"\";\n\n const marks: LayoutMark[] = [];\n const labels: TextLabel[] = [];\n marks.push({\n id: \"track\",\n kind: \"arc\",\n series: 0,\n seriesId: model.series[0]?.id ?? \"value\",\n point: -1,\n tone: \"muted\",\n styleIndex: 0,\n pattern: -1,\n role: \"track\",\n d: arcD(startAngle, startAngle + sweep),\n cx,\n cy,\n });\n gauge.bands.forEach((band, i) => {\n const from = Math.max(gauge.min, Math.min(band.from, band.to));\n const to = Math.min(gauge.max, Math.max(band.from, band.to));\n if (to <= from) return;\n marks.push({\n id: `band-${i}`,\n kind: \"arc\",\n series: 0,\n seriesId: model.series[0]?.id ?? \"value\",\n point: -1,\n tone: annotationTone(band.tone),\n styleIndex: 0,\n pattern: -1,\n role: \"band\",\n d: arcD(angleAt(from), angleAt(to)),\n cx,\n cy,\n });\n });\n const activeBand = gauge.bands.find((band) => gauge.value >= Math.min(band.from, band.to) && gauge.value <= Math.max(band.from, band.to));\n const valueTone = activeBand ? annotationTone(activeBand.tone) : \"accent\";\n const valueEnd = angleAt(gauge.value);\n const valuePath = fraction(gauge.value) > 0 ? arcD(startAngle, ring && fraction(gauge.value) >= 1 ? startAngle + TAU - 0.0001 : valueEnd) : \"\";\n const outerGuard = outerRadius + 2;\n if (valuePath) {\n marks.push({\n id: \"value\",\n kind: \"arc\",\n series: 0,\n seriesId: model.series[0]?.id ?? \"value\",\n point: 0,\n tone: valueTone,\n styleIndex: 0,\n pattern: -1,\n role: \"value\",\n d: valuePath,\n cx,\n cy,\n });\n }\n if (gauge.target !== undefined) {\n const targetAngle = angleAt(gauge.target);\n marks.push({\n id: \"target\",\n kind: \"stem\",\n series: 0,\n seriesId: model.series[0]?.id ?? \"value\",\n point: -1,\n tone: \"reference\",\n styleIndex: 0,\n pattern: -1,\n role: \"target\",\n x1: cx + Math.sin(targetAngle) * (innerRadius - 4),\n y1: cy - Math.cos(targetAngle) * (innerRadius - 4),\n x2: cx + Math.sin(targetAngle) * outerGuard,\n y2: cy - Math.cos(targetAngle) * outerGuard,\n });\n }\n\n const caption =\n activeBand?.label ??\n (ring ? undefined : formatMessage(messages.gaugeRange, { min: format(gauge.min), max: format(gauge.max) }, options.locale));\n labels.push({ id: \"center-value\", text: format(gauge.value), x: cx, y: ring ? cy - 2 : cy - outerRadius * 0.18, anchor: \"middle\", baseline: \"middle\", kind: \"center\", numeric: true });\n if (caption) {\n labels.push({ id: \"center-caption\", text: caption, x: cx, y: (ring ? cy : cy - outerRadius * 0.18) + AXIS_FONT_SIZE * 1.5, anchor: \"middle\", baseline: \"middle\", kind: \"caption\" });\n }\n if (!ring) {\n const mid = (innerRadius + outerRadius) / 2;\n labels.push({ id: \"min\", text: format(gauge.min), x: cx - mid, y: cy + AXIS_FONT_SIZE * 1.2, anchor: \"middle\", baseline: \"below\", kind: \"caption\", numeric: true });\n labels.push({ id: \"max\", text: format(gauge.max), x: cx + mid, y: cy + AXIS_FONT_SIZE * 1.2, anchor: \"middle\", baseline: \"below\", kind: \"caption\", numeric: true });\n }\n\n const anchorAngle = (startAngle + valueEnd) / 2;\n const radius = (innerRadius + outerRadius) / 2;\n const target: HitTarget = {\n id: \"0:0\",\n series: 0,\n point: 0,\n group: 0,\n x: cx + Math.sin(anchorAngle) * radius,\n y: cy - Math.cos(anchorAngle) * radius,\n focus: valuePath ? { kind: \"path\", d: valuePath, tx: 0, ty: 0 } : { kind: \"circle\", cx, cy, r: outerRadius },\n kind: \"gauge\",\n };\n\n const legend: LegendEntry[] = gauge.bands\n .filter((band) => band.label)\n .map((band, i) => ({\n id: `band-${i}`,\n label: `${band.label}: ${format(band.from)} \\u2013 ${format(band.to)}`,\n series: null,\n tone: annotationTone(band.tone),\n marker: \"square\" as const,\n dash: undefined,\n glyph: \"bar\" as const,\n pattern: -1,\n visible: true,\n toggle: false,\n }));\n\n return emptyLayout(model, options, {\n marks,\n labels,\n targets: [target],\n legend,\n hit: \"none\",\n navigation: \"single\",\n radial: { cx, cy, outerRadius, innerRadius },\n });\n}\n","import type { ChartModel } from \"../model\";\nimport { layoutCartesian } from \"./cartesian\";\nimport { layoutHeatmap } from \"./heatmap\";\nimport { layoutGauge, layoutPie } from \"./radial\";\nimport type { ChartLayout, LayoutOptions } from \"./types\";\n\nexport { patternIndex } from \"./cartesian\";\nexport type {\n AnnotationLayout,\n AxisLayout,\n AxisTick,\n Box,\n ChartLayout,\n ColorScale,\n FocusShape,\n HitStrategy,\n HitTarget,\n LayoutMark,\n LayoutOptions,\n LegendEntry,\n MarkKind,\n Margin,\n NavigationMode,\n TextLabel,\n} from \"./types\";\n\n/**\n * Lays a model out in `width` by `height` pixels: axes with ticks, marks as\n * plain geometry, text labels, annotations, legend entries and the keyboard and\n * pointer targets. All coordinates are SVG user units. The result is plain\n * data, so it can be rendered on a server, snapshot-tested, or drawn by\n * something other than the bundled React renderer.\n */\nexport function layoutChart(model: ChartModel, options: LayoutOptions): ChartLayout {\n switch (model.mark) {\n case \"pie\":\n case \"donut\":\n return layoutPie(model, options);\n case \"gauge\":\n case \"progress-ring\":\n return layoutGauge(model, options);\n case \"heatmap\":\n return layoutHeatmap(model, options);\n default:\n return layoutCartesian(model, options);\n }\n}\n","/**\n * Pointer hit testing, keyboard navigation, tooltip content and point\n * announcements, all as pure functions over a `ChartLayout`. The React renderer\n * wires these to events; they can be unit-tested and reused without a DOM.\n */\nimport { formatMessage } from \"./messages\";\nimport type { ChartFormatters } from \"./formatters\";\nimport type { ChartLayout, HitTarget } from \"./layout\";\nimport type { ChartModel, ModelPoint, ModelSeries, ModelSlice } from \"./model\";\nimport type { Row, SeriesTone } from \"./spec\";\n\nexport type NavKey = \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\" | \"Home\" | \"End\" | \"PageUp\" | \"PageDown\";\n\nexport const navKeys: ReadonlyArray<NavKey> = [\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n];\n\nexport function isNavKey(key: string): key is NavKey {\n return (navKeys as ReadonlyArray<string>).includes(key);\n}\n\nexport function targetById(layout: ChartLayout, id: string | null | undefined): HitTarget | undefined {\n if (!id) return undefined;\n return layout.targets.find((target) => target.id === id);\n}\n\n/* ------------------------------------------------------------------ */\n/* Pointer */\n/* ------------------------------------------------------------------ */\n\nconst NEAREST_RADIUS = 36;\n\n/**\n * Finds the target under a pointer position (layout coordinates), using the\n * layout's strategy: nearest category along the category axis for most charts,\n * nearest mark for scatter plots, angle and radius for pies, containment for\n * heatmap cells. Returns `null` when the pointer is not over the plot.\n */\nexport function hitTest(layout: ChartLayout, x: number, y: number): HitTarget | null {\n const { targets, plot } = layout;\n if (targets.length === 0) return null;\n switch (layout.hit) {\n case \"category-x\":\n case \"category-y\": {\n const inside = x >= plot.x && x <= plot.x + plot.width && y >= plot.y && y <= plot.y + plot.height;\n if (!inside) return null;\n const alongX = layout.hit === \"category-x\";\n const primary = (target: HitTarget): number => Math.abs((alongX ? target.x : target.y) - (alongX ? x : y));\n const secondary = (target: HitTarget): number => Math.abs((alongX ? target.y : target.x) - (alongX ? y : x));\n let best = Infinity;\n for (const target of targets) best = Math.min(best, primary(target));\n let chosen: HitTarget | null = null;\n for (const target of targets) {\n if (primary(target) <= best + 0.5 && (!chosen || secondary(target) < secondary(chosen))) chosen = target;\n }\n return chosen;\n }\n case \"nearest\": {\n let chosen: HitTarget | null = null;\n let best = Infinity;\n for (const target of targets) {\n const distance = Math.hypot(target.x - x, target.y - y);\n if (distance < best) {\n best = distance;\n chosen = target;\n }\n }\n return chosen && best <= NEAREST_RADIUS ? chosen : null;\n }\n case \"arc\": {\n for (const target of targets) {\n const arc = target.arc;\n if (!arc) continue;\n const dx = x - arc.cx;\n const dy = y - arc.cy;\n const radius = Math.hypot(dx, dy);\n if (radius < arc.innerRadius || radius > arc.outerRadius) continue;\n let angle = Math.atan2(dx, -dy);\n if (angle < 0) angle += Math.PI * 2;\n if (angle >= arc.start && angle < arc.end) return target;\n // The final slice includes the end angle.\n if (angle === arc.end && arc.end >= Math.PI * 2 - 1e-9) return target;\n }\n return null;\n }\n case \"cell\": {\n for (const target of targets) {\n const box = target.bounds;\n if (box && x >= box.x && x <= box.x + box.width && y >= box.y && y <= box.y + box.height) return target;\n }\n return null;\n }\n default:\n return null;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Keyboard */\n/* ------------------------------------------------------------------ */\n\nconst PAGE_STEP = 10;\n\n/**\n * The id of the target a navigation key moves to, or the current id when\n * there is nowhere to go. With no current target, keys enter the plot at the\n * first (or, for End, last) target.\n *\n * - Category charts: Left and Right move along the category axis (swapped when\n * the axis is mirrored), Up and Down move between series at the same category\n * in screen order. Home and End jump to the first and last category, and Page\n * Up and Page Down move ten categories.\n * - Scatter plots: arrows move to the nearest point in that direction.\n * - Heatmaps: arrows move by cell; Page Up and Page Down jump to the first and\n * last row.\n * - Pies: arrows step through slices.\n */\nexport function navigate(layout: ChartLayout, currentId: string | null, key: NavKey): string | null {\n const { targets } = layout;\n if (targets.length === 0) return null;\n const first = targets[0] as HitTarget;\n const last = targets[targets.length - 1] as HitTarget;\n const current = targets.find((target) => target.id === currentId);\n if (!current) return key === \"End\" ? last.id : first.id;\n\n switch (layout.navigation) {\n case \"none\":\n return current.id;\n case \"single\":\n return current.id;\n case \"sequence\": {\n const index = targets.indexOf(current);\n const forward = key === \"ArrowRight\" || key === \"ArrowDown\" || key === \"PageDown\";\n const backward = key === \"ArrowLeft\" || key === \"ArrowUp\" || key === \"PageUp\";\n if (key === \"Home\") return first.id;\n if (key === \"End\") return last.id;\n if (forward) return (targets[Math.min(targets.length - 1, index + 1)] as HitTarget).id;\n if (backward) return (targets[Math.max(0, index - 1)] as HitTarget).id;\n return current.id;\n }\n case \"category-x\":\n case \"category-y\": {\n const alongX = layout.navigation === \"category-x\";\n const groups = [...new Set(targets.map((target) => target.group))].sort((a, b) => a - b);\n const position = groups.indexOf(current.group);\n const mirror = alongX && layout.mirrored;\n // \"Forward\" in reading order along the category axis.\n const moveGroup = (delta: number): string => {\n const nextGroup = groups[Math.min(groups.length - 1, Math.max(0, position + delta))] as number;\n if (nextGroup === current.group) return current.id;\n const candidates = targets.filter((target) => target.group === nextGroup);\n const same = candidates.find((target) => target.series === current.series);\n if (same) return same.id;\n const reference = alongX ? current.y : current.x;\n const pick = [...candidates].sort(\n (a, b) => Math.abs((alongX ? a.y : a.x) - reference) - Math.abs((alongX ? b.y : b.x) - reference),\n )[0];\n return (pick ?? current).id;\n };\n const moveSeries = (towardsStart: boolean): string => {\n const sameGroup = targets\n .filter((target) => target.group === current.group)\n .sort((a, b) => (alongX ? a.y - b.y : a.x - b.x));\n const index = sameGroup.findIndex((target) => target.id === current.id);\n const next = sameGroup[Math.min(sameGroup.length - 1, Math.max(0, index + (towardsStart ? -1 : 1)))];\n return (next ?? current).id;\n };\n switch (key) {\n case \"Home\": {\n const firstGroup = groups[0] as number;\n const candidates = targets.filter((target) => target.group === firstGroup);\n return (candidates.find((target) => target.series === current.series) ?? candidates[0] ?? current).id;\n }\n case \"End\": {\n const lastGroup = groups[groups.length - 1] as number;\n const candidates = targets.filter((target) => target.group === lastGroup);\n return (candidates.find((target) => target.series === current.series) ?? candidates[0] ?? current).id;\n }\n case \"PageUp\":\n return moveGroup(-PAGE_STEP * (mirror ? -1 : 1));\n case \"PageDown\":\n return moveGroup(PAGE_STEP * (mirror ? -1 : 1));\n case \"ArrowRight\":\n return alongX ? moveGroup(mirror ? -1 : 1) : moveSeries(false);\n case \"ArrowLeft\":\n return alongX ? moveGroup(mirror ? 1 : -1) : moveSeries(true);\n case \"ArrowDown\":\n return alongX ? moveSeries(false) : moveGroup(1);\n case \"ArrowUp\":\n return alongX ? moveSeries(true) : moveGroup(-1);\n }\n return current.id;\n }\n case \"grid\": {\n const columns = Math.max(...targets.map((target) => target.column ?? 0)) + 1;\n const rows = Math.max(...targets.map((target) => target.row ?? 0)) + 1;\n const at = (row: number, column: number): HitTarget | undefined =>\n targets.find((target) => target.row === row && target.column === column);\n const row = current.row ?? 0;\n const column = current.column ?? 0;\n const mirror = layout.mirrored;\n const step = (dRow: number, dColumn: number): string => {\n let r = row + dRow;\n let c = column + dColumn;\n while (r >= 0 && r < rows && c >= 0 && c < columns) {\n const found = at(r, c);\n if (found) return found.id;\n r += dRow;\n c += dColumn;\n }\n return current.id;\n };\n switch (key) {\n case \"ArrowRight\":\n return step(0, mirror ? -1 : 1);\n case \"ArrowLeft\":\n return step(0, mirror ? 1 : -1);\n case \"ArrowDown\":\n return step(1, 0);\n case \"ArrowUp\":\n return step(-1, 0);\n case \"Home\": {\n const inRow = targets.filter((target) => target.row === row).sort((a, b) => (a.column ?? 0) - (b.column ?? 0));\n return (inRow[0] ?? current).id;\n }\n case \"End\": {\n const inRow = targets.filter((target) => target.row === row).sort((a, b) => (a.column ?? 0) - (b.column ?? 0));\n return (inRow[inRow.length - 1] ?? current).id;\n }\n case \"PageUp\": {\n const inColumn = targets.filter((target) => target.column === column).sort((a, b) => (a.row ?? 0) - (b.row ?? 0));\n return (inColumn[0] ?? current).id;\n }\n case \"PageDown\": {\n const inColumn = targets.filter((target) => target.column === column).sort((a, b) => (a.row ?? 0) - (b.row ?? 0));\n return (inColumn[inColumn.length - 1] ?? current).id;\n }\n }\n return current.id;\n }\n case \"spatial\": {\n if (key === \"Home\" || key === \"End\") {\n const ordered = [...targets].sort((a, b) => a.x - b.x || a.y - b.y);\n const mirror = layout.mirrored;\n const toStart = (key === \"Home\") !== mirror;\n return ((toStart ? ordered[0] : ordered[ordered.length - 1]) ?? current).id;\n }\n const direction =\n key === \"ArrowRight\" ? [1, 0] : key === \"ArrowLeft\" ? [-1, 0] : key === \"ArrowDown\" ? [0, 1] : key === \"ArrowUp\" ? [0, -1] : null;\n if (!direction) return current.id;\n const [dx, dy] = direction as [number, number];\n let best: HitTarget | undefined;\n let bestScore = Infinity;\n for (const target of targets) {\n if (target === current) continue;\n const vx = target.x - current.x;\n const vy = target.y - current.y;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = target;\n }\n }\n return (best ?? current).id;\n }\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Tooltip and announcement */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipRow {\n id: string;\n label: string;\n value: string;\n tone: SeriesTone;\n glyph: \"line\" | \"area\" | \"bar\" | \"point\" | \"slice\";\n marker: string;\n pattern: number;\n dash: string | undefined;\n /** The row of the focused or hovered mark. */\n active: boolean;\n note?: string;\n}\n\nexport interface TooltipContent {\n title: string;\n rows: TooltipRow[];\n}\n\nfunction seriesOf(model: ChartModel, index: number): ModelSeries | undefined {\n return model.series[index];\n}\n\nfunction breachNote(model: ChartModel, fmts: ChartFormatters, breach: number | undefined): string | undefined {\n if (breach === undefined) return undefined;\n const threshold = model.spec.thresholds?.[breach];\n if (!threshold) return undefined;\n const key = threshold.breach === \"below\" ? fmts.messages.breachBelow : fmts.messages.breachAbove;\n return formatMessage(key, { label: threshold.label }, fmts.locale);\n}\n\nfunction legendFor(layout: ChartLayout, series: number | null, sliceId?: string) {\n return layout.legend.find((entry) => (series !== null ? entry.series === series : entry.id === sliceId));\n}\n\n/** What a tooltip shows for a target: the category title and one row per series at that category. */\nexport function tooltipFor(\n model: ChartModel,\n layout: ChartLayout,\n target: HitTarget,\n fmts: ChartFormatters,\n): TooltipContent | null {\n const messages = fmts.messages;\n const spec = model.spec;\n\n if (target.kind === \"slice\") {\n const slice = model.slices[target.point];\n if (!slice) return null;\n const legend = layout.legend.find((entry) => entry.id === slice.id);\n return {\n title: slice.label,\n rows: [\n {\n id: slice.id,\n label: messages.columnValue,\n value: fmts.value(0)(slice.value),\n tone: slice.style.tone,\n glyph: \"slice\",\n marker: slice.style.marker,\n pattern: legend?.pattern ?? -1,\n dash: undefined,\n active: true,\n },\n {\n id: `${slice.id}-share`,\n label: messages.columnShare,\n value: fmts.share(slice.share),\n tone: slice.style.tone,\n glyph: \"slice\",\n marker: slice.style.marker,\n pattern: -1,\n dash: undefined,\n active: false,\n },\n ],\n };\n }\n\n if (target.kind === \"gauge\") return null;\n\n const series = seriesOf(model, target.series);\n const point = series?.points[target.point];\n if (!series || !point) return null;\n\n if (target.kind === \"cell\") {\n return {\n title: `${fmts.point(point)} \\u00b7 ${point.group ?? \"\"}`,\n rows: [\n {\n id: series.id,\n label: series.label,\n value: point.y === null ? fmts.noValue : fmts.value(target.series)(point.y),\n tone: series.style.tone,\n glyph: \"bar\",\n marker: series.style.marker,\n pattern: -1,\n dash: undefined,\n active: true,\n },\n ],\n };\n }\n\n if (model.mark === \"scatter\" || model.mark === \"bubble\") {\n const rows: TooltipRow[] = [];\n const base = {\n tone: series.style.tone,\n glyph: \"point\" as const,\n marker: series.style.marker,\n pattern: -1,\n dash: undefined,\n active: false,\n };\n rows.push({ ...base, id: `${series.id}-x`, label: model.xTitle ?? messages.columnX, value: fmts.x(point.x) });\n rows.push({\n ...base,\n id: `${series.id}-y`,\n label: model.yTitle ?? messages.columnY,\n value: point.y === null ? fmts.noValue : fmts.value(target.series)(point.y),\n active: true,\n ...(breachNote(model, fmts, target.breach) ? { note: breachNote(model, fmts, target.breach) as string } : {}),\n });\n if (point.size !== null) {\n rows.push({ ...base, id: `${series.id}-size`, label: spec.size?.title ?? messages.columnSize, value: fmts.size(point.size) });\n }\n return { title: series.label, rows };\n }\n\n if (model.mark === \"histogram\") {\n return {\n title: point.x1 === undefined ? fmts.point(point) : `${fmts.x(point.x)}\\u2013${fmts.x(point.x1)}`,\n rows: layout.targets\n .filter((candidate) => candidate.group === target.group)\n .map((candidate) => {\n const s = seriesOf(model, candidate.series);\n const p = s?.points[candidate.point];\n return {\n id: s?.id ?? \"\",\n label: s?.label ?? \"\",\n value: p?.y === null || !p ? fmts.noValue : fmts.value(candidate.series)(p.y as number),\n tone: s?.style.tone ?? \"accent\",\n glyph: \"bar\" as const,\n marker: s?.style.marker ?? \"circle\",\n pattern: legendFor(layout, candidate.series)?.pattern ?? -1,\n dash: undefined,\n active: candidate.id === target.id,\n };\n }),\n };\n }\n\n if (model.mark === \"waterfall\" && model.waterfall) {\n const step = model.waterfall.steps[target.point];\n if (!step) return null;\n const format = fmts.value(0);\n return {\n title: step.label,\n rows: [\n {\n id: \"change\",\n label: step.total ? messages.total : messages.columnChange,\n value: step.total ? format(step.end) : `${step.delta > 0 ? \"+\" : step.delta < 0 ? \"\\u2212\" : \"\"}${format(Math.abs(step.delta))}`,\n tone: step.total ? \"accent\" : step.delta >= 0 ? \"good\" : \"critical\",\n glyph: \"bar\",\n marker: \"square\",\n pattern: step.total || step.delta >= 0 ? -1 : 0,\n dash: undefined,\n active: true,\n },\n ...(step.total\n ? []\n : [\n {\n id: \"running\",\n label: messages.columnRunningTotal,\n value: format(step.end),\n tone: \"reference\" as const,\n glyph: \"bar\" as const,\n marker: \"square\",\n pattern: -1,\n dash: undefined,\n active: false,\n },\n ]),\n ],\n };\n }\n\n // Category-aligned charts: one row per series at this category.\n const rows: TooltipRow[] = layout.targets\n .filter((candidate) => candidate.group === target.group)\n .sort((a, b) => a.y - b.y || a.series - b.series)\n .map((candidate) => {\n const s = seriesOf(model, candidate.series) as ModelSeries;\n const p = s.points[candidate.point] as ModelPoint;\n const legend = legendFor(layout, candidate.series);\n const note = breachNote(model, fmts, candidate.breach);\n return {\n id: s.id,\n label: s.label,\n value: p.y === null ? fmts.noValue : fmts.value(candidate.series)(p.y),\n tone: s.style.tone,\n glyph: legend?.glyph ?? \"line\",\n marker: s.style.marker,\n pattern: legend?.pattern ?? -1,\n dash: legend?.dash,\n active: candidate.id === target.id,\n ...(note ? { note } : {}),\n };\n });\n return { title: fmts.point(point), rows };\n}\n\n/** The sentence a screen reader hears when a mark gets focus. */\nexport function describeTarget(\n model: ChartModel,\n layout: ChartLayout,\n target: HitTarget,\n fmts: ChartFormatters,\n { position = true }: { position?: boolean } = {},\n): string {\n const messages = fmts.messages;\n const locale = fmts.locale;\n let text = \"\";\n\n if (target.kind === \"slice\") {\n const slice: ModelSlice | undefined = model.slices[target.point];\n if (slice) {\n text = formatMessage(messages.pointSlice, { label: slice.label, value: fmts.value(0)(slice.value), share: fmts.share(slice.share) }, locale);\n }\n } else if (target.kind === \"gauge\" && model.gauge) {\n const g = model.gauge;\n text = formatMessage(messages.describeGauge, { value: fmts.gauge(g.value), min: fmts.gauge(g.min), max: fmts.gauge(g.max) }, locale);\n const band = g.bands.find((b) => g.value >= Math.min(b.from, b.to) && g.value <= Math.max(b.from, b.to));\n if (band?.label) text += ` ${band.label}.`;\n } else {\n const series = seriesOf(model, target.series);\n const point = series?.points[target.point];\n if (series && point) {\n const format = fmts.value(target.series);\n const value = point.y === null ? fmts.noValue : format(point.y);\n const visibleSeries = layout.legend.filter((entry) => entry.series !== null && entry.visible).length;\n if (target.kind === \"cell\") {\n text = formatMessage(messages.pointCell, { x: fmts.point(point), y: point.group ?? \"\", value }, locale);\n } else if (model.mark === \"scatter\" || model.mark === \"bubble\") {\n text =\n point.size !== null && model.mark === \"bubble\"\n ? formatMessage(messages.pointBubble, { series: series.label, x: fmts.x(point.x), y: value, size: fmts.size(point.size) }, locale)\n : formatMessage(messages.pointXY, { series: series.label, x: fmts.x(point.x), y: value }, locale);\n } else if (model.mark === \"histogram\" && point.x1 !== undefined) {\n text = formatMessage(messages.pointBin, { from: fmts.x(point.x), to: fmts.x(point.x1), value }, locale);\n } else if (model.mark === \"waterfall\" && model.waterfall?.steps[target.point]) {\n const step = model.waterfall.steps[target.point] as NonNullable<ChartModel[\"waterfall\"]>[\"steps\"][number];\n const signed = `${step.delta > 0 ? \"+\" : step.delta < 0 ? \"\\u2212\" : \"\"}${format(Math.abs(step.delta))}`;\n text = step.total\n ? formatMessage(messages.pointWaterfallTotal, { x: step.label, total: format(step.end) }, locale)\n : formatMessage(messages.pointWaterfall, { x: step.label, change: signed, total: format(step.end) }, locale);\n } else if (visibleSeries > 1 || model.series.length > 1) {\n text = formatMessage(messages.pointCategory, { x: fmts.point(point), series: series.label, value }, locale);\n } else {\n text = formatMessage(messages.pointSingle, { x: fmts.point(point), value }, locale);\n }\n const note = breachNote(model, fmts, target.breach);\n if (note) text = `${text}, ${note}`;\n }\n }\n\n // A lone target (a gauge) needs no \"1 of 1\".\n if (!position || layout.targets.length <= 1) return text;\n const index = layout.targets.indexOf(target) + 1;\n // The position suffix supplies its own full stop; do not double it.\n return formatMessage(messages.pointPosition, { text: text.replace(/\\.+$/, \"\"), index, count: layout.targets.length }, locale);\n}\n\nexport interface ChartPointInfo {\n /** Series id, or the slice id for pies and donuts. */\n seriesId: string;\n seriesLabel: string;\n /** Index into the model's series (0 for slices). */\n seriesIndex: number;\n /** Index of the point within its series (the slice index for pies). */\n pointIndex: number;\n /** The x value: category label, number, or epoch milliseconds. */\n x: string | number | null;\n /** The x value as text. */\n xLabel: string;\n y: number | null;\n size: number | null;\n /** The source row (or a synthetic one for series with own points). */\n row: Row | null;\n /** Share of the total for slices, from 0 to 1. */\n share?: number;\n /** Row category of a heatmap cell. */\n group?: string;\n}\n\n/** The payload of `onPointActivate` for a target. */\nexport function pointInfo(model: ChartModel, target: HitTarget, fmts: ChartFormatters): ChartPointInfo | null {\n if (target.kind === \"slice\") {\n const slice = model.slices[target.point];\n if (!slice) return null;\n return {\n seriesId: slice.id,\n seriesLabel: slice.label,\n seriesIndex: 0,\n pointIndex: target.point,\n x: slice.label,\n xLabel: slice.label,\n y: slice.value,\n size: null,\n row: slice.row,\n share: slice.share,\n };\n }\n const series = seriesOf(model, target.series);\n const point = series?.points[target.point];\n if (!series || !point) return null;\n return {\n seriesId: series.id,\n seriesLabel: series.label,\n seriesIndex: target.series,\n pointIndex: target.point,\n x: point.x,\n xLabel: fmts.point(point),\n y: point.y,\n size: point.size,\n row: point.row,\n ...(point.group !== undefined ? { group: point.group } : {}),\n };\n}\n","/**\n * Generated text alternatives: an accessible name and a long description built\n * from the data (type, series, ranges, extremes, overall trend, thresholds).\n * Authors still write `a11y.description` (the finding); this adds the facts a\n * screen reader user would otherwise read off the plot. Pure and server-safe.\n */\nimport type { Datasets } from \"./data\";\nimport { capitalize, DEFAULT_LOCALE, formatList } from \"./format\";\nimport { createFormatters, type ChartFormatters } from \"./formatters\";\nimport { formatMessage, type ChartMessagesInput } from \"./messages\";\nimport { buildChartModel, type ChartModel, type ModelSeries } from \"./model\";\nimport { correlation, percentChange, trendDirection } from \"./stats\";\nimport type { ChartSpec } from \"./spec\";\n\nexport interface ChartDescription {\n /** The accessible name: the title and the chart type, for example \"Revenue (line chart)\". */\n name: string;\n /** Type, series count and point count in one sentence. */\n summary: string;\n /** Sentences about axes, series extremes, trends, thresholds and breaches. */\n details: string[];\n /** The author's description, the summary and the details, in reading order. */\n text: string;\n}\n\nexport interface DescribeOptions {\n datasets?: Datasets | undefined;\n locale?: string | undefined;\n messages?: ChartMessagesInput | undefined;\n /** Ids of hidden series, which are mentioned but not described. */\n hidden?: ReadonlySet<string> | undefined;\n /** At most this many series get their own sentences. Defaults to 6. */\n maxSeries?: number | undefined;\n}\n\nfunction axisName(fmts: ChartFormatters, id: \"x\" | \"y\" | \"y2\", title: string | undefined): string {\n const messages = fmts.messages;\n const name = id === \"x\" ? messages.axisX : id === \"y\" ? messages.axisY : messages.axisY2;\n return title ? formatMessage(messages.axisWithTitle, { axis: name, title }, fmts.locale) : name;\n}\n\nfunction describeSeriesFacts(\n fmts: ChartFormatters,\n series: ModelSeries,\n index: number,\n showTrend: boolean,\n): string[] {\n const messages = fmts.messages;\n const locale = fmts.locale;\n const format = fmts.value(index);\n const valued = series.points.filter((point) => point.y !== null);\n if (valued.length === 0) return [];\n let low = valued[0] as (typeof valued)[number];\n let high = low;\n for (const point of valued) {\n if ((point.y as number) < (low.y as number)) low = point;\n if ((point.y as number) > (high.y as number)) high = point;\n }\n const sentences = [\n formatMessage(\n messages.describeSeries,\n {\n series: series.label,\n min: format(low.y as number),\n max: format(high.y as number),\n minAt: fmts.point(low),\n maxAt: fmts.point(high),\n },\n locale,\n ),\n ];\n if (showTrend && valued.length >= 3) {\n const first = valued[0]?.y as number;\n const last = valued[valued.length - 1]?.y as number;\n const trend = trendDirection(valued.map((point) => point.y));\n const change = percentChange(first, last);\n const params = { first: format(first), last: format(last) };\n if (trend === \"flat\") {\n sentences.push(formatMessage(messages.trendFlat, params, locale));\n } else {\n const formatted =\n change === null\n ? undefined\n : new Intl.NumberFormat(locale ?? DEFAULT_LOCALE, { style: \"percent\", maximumFractionDigits: 0 }).format(Math.abs(change));\n const template =\n trend === \"rising\"\n ? formatted\n ? messages.trendRisingChange\n : messages.trendRising\n : formatted\n ? messages.trendFallingChange\n : messages.trendFalling;\n sentences.push(formatMessage(template, { ...params, change: formatted }, locale));\n }\n }\n return sentences;\n}\n\n/** Describes a built model. Prefer this when you already have one. */\nexport function describeModel(model: ChartModel, options: DescribeOptions = {}): ChartDescription {\n const spec = model.spec;\n const fmts = createFormatters(model, options);\n const messages = fmts.messages;\n const locale = fmts.locale;\n const markName = messages.markNames[model.mark] ?? model.mark;\n const name = formatMessage(messages.chartName, { title: spec.title, type: markName }, locale);\n const details: string[] = [];\n let summary: string;\n\n if (model.status === \"unsupported\") {\n summary = formatMessage(messages.unsupportedMark, { mark: markName }, locale);\n } else if (model.status === \"missing-data\") {\n summary = formatMessage(messages.missingDataset, { ref: model.missingRef ?? \"\" }, locale);\n } else if (model.status === \"empty\") {\n summary = messages.empty;\n } else if (model.mark === \"pie\" || model.mark === \"donut\") {\n summary = formatMessage(messages.describePieSummary, { type: capitalize(markName, locale), count: model.slices.length }, locale);\n const entries = model.slices.map((slice) => `${slice.label} ${fmts.share(slice.share)}`);\n details.push(formatMessage(messages.describeSlices, { list: formatList(entries, locale) }, locale));\n const largest = [...model.slices].sort((a, b) => b.value - a.value)[0];\n if (largest) {\n details.push(formatMessage(messages.describeLargestSlice, { label: largest.label, share: fmts.share(largest.share) }, locale));\n }\n } else if ((model.mark === \"gauge\" || model.mark === \"progress-ring\") && model.gauge) {\n const g = model.gauge;\n const format = fmts.gauge;\n summary = formatMessage(messages.describeGauge, { value: format(g.value), min: format(g.min), max: format(g.max) }, locale);\n if (g.target !== undefined) details.push(formatMessage(messages.describeGaugeTarget, { target: format(g.target) }, locale));\n const band = g.bands.find((b) => g.value >= Math.min(b.from, b.to) && g.value <= Math.max(b.from, b.to));\n if (band?.label) details.push(`${band.label}.`);\n } else if (model.mark === \"heatmap\" && model.heatmap) {\n const heat = model.heatmap;\n const points = model.series[0]?.points.filter((point) => point.y !== null) ?? [];\n summary = formatMessage(messages.describeSummary, { type: capitalize(markName, locale), series: 1, points: points.length }, locale);\n if (points.length > 0) {\n let low = points[0] as (typeof points)[number];\n let high = low;\n for (const point of points) {\n if ((point.y as number) < (low.y as number)) low = point;\n if ((point.y as number) > (high.y as number)) high = point;\n }\n const format = fmts.value(0);\n details.push(\n formatMessage(\n messages.describeHeatmap,\n {\n rows: heat.rows.length,\n columns: heat.columns.length,\n max: format(high.y as number),\n maxAt: `${fmts.point(high)}, ${high.group ?? \"\"}`,\n min: format(low.y as number),\n minAt: `${fmts.point(low)}, ${low.group ?? \"\"}`,\n },\n locale,\n ),\n );\n }\n } else {\n const visible = model.series.filter((series) => !options.hidden?.has(series.id));\n summary = formatMessage(\n messages.describeSummary,\n { type: capitalize(markName, locale), series: visible.length, points: model.pointCount },\n locale,\n );\n\n // Axes.\n if (model.xKind === \"category\" || model.mark === \"bar\" || model.mark === \"waterfall\" || model.mark === \"lollipop\") {\n if (model.categories.length > 0) {\n details.push(\n formatMessage(\n messages.describeCategories,\n {\n axis: axisName(fmts, \"x\", model.xTitle),\n count: model.categories.length,\n first: fmts.x(model.categoryValues[0] ?? \"\"),\n last: fmts.x(model.categoryValues[model.categoryValues.length - 1] ?? \"\"),\n },\n locale,\n ),\n );\n }\n } else if (model.mark !== \"histogram\") {\n const xs = model.series.flatMap((series) => series.points.map((point) => point.x)).filter((x): x is number => typeof x === \"number\");\n if (xs.length > 0) {\n details.push(\n formatMessage(\n messages.describeRange,\n { axis: axisName(fmts, \"x\", model.xTitle), min: fmts.x(Math.min(...xs)), max: fmts.x(Math.max(...xs)) },\n locale,\n ),\n );\n }\n }\n for (const axis of [\"y\", \"y2\"] as const) {\n if (model.mark === \"waterfall\") break;\n let values = model.series\n .filter((series) => series.axis === axis)\n .flatMap((series) => series.points.map((point) => point.y))\n .filter((value): value is number => value !== null);\n if (values.length === 0) continue;\n if ((model.stack === \"stacked\" || model.stack === \"diverging\") && axis === \"y\") {\n // Stacked segments add up, so the axis runs from zero to the tallest stack.\n const totals = new Map<string, number>();\n for (const series of model.series) {\n if (series.axis !== axis) continue;\n for (const point of series.points) {\n if (point.y !== null) totals.set(point.key, (totals.get(point.key) ?? 0) + point.y);\n }\n }\n values = [0, ...totals.values()];\n }\n const index = model.series.findIndex((series) => series.axis === axis);\n const format = model.stack === \"normalized\" && axis === \"y\" ? fmts.share : fmts.value(index);\n if (model.stack === \"normalized\" && axis === \"y\") continue;\n details.push(\n formatMessage(\n messages.describeRange,\n { axis: axisName(fmts, axis, axis === \"y\" ? model.yTitle : model.y2Title), min: format(Math.min(...values)), max: format(Math.max(...values)) },\n locale,\n ),\n );\n }\n\n // Histogram: the mode.\n if (model.mark === \"histogram\" && model.histogram && model.histogram.bins.length > 0) {\n const bins = model.histogram.bins;\n const top = bins.reduce((best, bin) => (bin.count > best.count ? bin : best), bins[0] as (typeof bins)[number]);\n details.push(\n formatMessage(\n messages.describeHistogram,\n {\n bins: bins.length,\n min: fmts.x(bins[0]?.x0 ?? 0),\n max: fmts.x(bins[bins.length - 1]?.x1 ?? 0),\n from: fmts.x(top.x0),\n to: fmts.x(top.x1),\n count: top.count,\n },\n locale,\n ),\n );\n }\n\n // Waterfall: where the running total starts, ends and moves most.\n if (model.mark === \"waterfall\" && model.waterfall && model.waterfall.steps.length > 0) {\n const steps = model.waterfall.steps;\n const format = fmts.value(0);\n const first = steps[0];\n const last = steps[steps.length - 1];\n if (first && last) {\n details.push(formatMessage(messages.describeWaterfall, { start: format(first.start), end: format(last.end) }, locale));\n }\n const moves = steps.filter((step) => !step.total);\n const up = moves.reduce<(typeof moves)[number] | undefined>((best, step) => (step.delta > 0 && (!best || step.delta > best.delta) ? step : best), undefined);\n const down = moves.reduce<(typeof moves)[number] | undefined>((best, step) => (step.delta < 0 && (!best || step.delta < best.delta) ? step : best), undefined);\n if (up) details.push(formatMessage(messages.describeWaterfallUp, { label: up.label, value: format(up.delta) }, locale));\n if (down) details.push(formatMessage(messages.describeWaterfallDown, { label: down.label, value: format(down.delta) }, locale));\n }\n\n // Scatter and bubble: how the two measures relate.\n if (model.mark === \"scatter\" || model.mark === \"bubble\") {\n for (const series of model.series) {\n if (options.hidden?.has(series.id)) continue;\n const pairs = series.points.filter((point) => typeof point.x === \"number\" && point.y !== null);\n if (pairs.length < 3) continue;\n const r = correlation(pairs.map((point) => point.x as number), pairs.map((point) => point.y as number));\n if (r === null) continue;\n const text = r >= 0.5 ? messages.describeCorrelationPositive : r <= -0.5 ? messages.describeCorrelationNegative : messages.describeCorrelationNone;\n const sentence = formatMessage(text, { r: new Intl.NumberFormat(locale ?? DEFAULT_LOCALE, { maximumFractionDigits: 2 }).format(r) }, locale);\n details.push(model.series.length > 1 ? `${series.label}: ${sentence}` : sentence);\n }\n }\n\n // Series extremes and trend.\n const limit = options.maxSeries ?? 6;\n const trendMakesSense = model.xKind !== \"category\" || model.mark === \"line\" || model.mark === \"area\" || model.mark === \"step\";\n const factual = ![\"histogram\", \"waterfall\", \"scatter\", \"bubble\"].includes(model.mark);\n let described = 0;\n model.series.forEach((series, index) => {\n if (!factual || options.hidden?.has(series.id) || described >= limit) return;\n described += 1;\n details.push(...describeSeriesFacts(fmts, series, index, trendMakesSense));\n });\n const hiddenLabels = model.series.filter((series) => options.hidden?.has(series.id)).map((series) => series.label);\n if (hiddenLabels.length > 0) {\n details.push(formatMessage(messages.describeHiddenSeries, { list: formatList(hiddenLabels, locale) }, locale));\n }\n }\n\n // Thresholds and reference lines are always described, and breaches counted.\n const format = fmts.value(0);\n for (const annotation of spec.annotations ?? []) {\n if (annotation.type === \"reference-line\") {\n const value = annotation.y ?? annotation.x;\n if (value !== undefined) {\n details.push(\n formatMessage(\n messages.describeThreshold,\n { label: annotation.label, value: typeof value === \"number\" ? (annotation.y !== undefined ? format(value) : fmts.x(value)) : String(value) },\n locale,\n ),\n );\n }\n }\n }\n for (const threshold of spec.thresholds ?? []) {\n const numeric = typeof threshold.value === \"number\" ? threshold.value : Number(threshold.value);\n details.push(\n formatMessage(\n messages.describeThreshold,\n { label: threshold.label, value: Number.isFinite(numeric) ? format(numeric) : String(threshold.value) },\n locale,\n ),\n );\n if (threshold.breach && Number.isFinite(numeric)) {\n let count = 0;\n for (const series of model.series) {\n if (options.hidden?.has(series.id)) continue;\n for (const point of series.points) {\n if (point.y === null) continue;\n if (threshold.breach === \"above\" ? point.y > numeric : point.y < numeric) count += 1;\n }\n }\n if (count > 0) details.push(formatMessage(messages.describeBreaches, { count, label: threshold.label }, locale));\n }\n }\n\n const author = spec.a11y?.description?.trim();\n const text = [author, summary, ...details].filter((part): part is string => Boolean(part)).join(\" \");\n return { name, summary, details, text };\n}\n\n/**\n * Builds the accessible name and long description of a chart from its spec.\n * Combine with `spec.a11y.description`, which is placed first in `text`.\n */\nexport function describeChart(spec: ChartSpec, options: DescribeOptions = {}): ChartDescription {\n const model = buildChartModel(spec, {\n datasets: options.datasets,\n messages: options.messages,\n });\n return describeModel(model, options);\n}\n","/**\n * The data table alternative and CSV export. Both read the model, so they show\n * exactly the values the chart draws (after transforms), and work on the\n * server. Pure.\n */\nimport type { Datasets } from \"./data\";\nimport { createFormatters } from \"./formatters\";\nimport { formatMessage, type ChartMessagesInput } from \"./messages\";\nimport { buildChartModel, type ChartModel } from \"./model\";\nimport type { ChartSpec } from \"./spec\";\n\nexport interface TableColumn {\n key: string;\n label: string;\n /** True for number columns, which right-align (inline-end) and use tabular figures. */\n numeric: boolean;\n}\n\nexport interface TableCell {\n /** Machine value: a number, an ISO date string for times, text, or null when missing. */\n value: string | number | null;\n /** Display text, formatted for the locale. */\n text: string;\n}\n\nexport interface ChartTable {\n caption: string;\n columns: TableColumn[];\n rows: TableCell[][];\n}\n\nexport interface TableOptions {\n datasets?: Datasets | undefined;\n locale?: string | undefined;\n messages?: ChartMessagesInput | undefined;\n}\n\nfunction machineX(model: ChartModel, x: string | number): string | number {\n if (model.xKind === \"time\" && typeof x === \"number\") {\n const iso = new Date(x).toISOString();\n return model.hasTimeOfDay ? iso : iso.slice(0, 10);\n }\n return x;\n}\n\n/** The table behind a built model. */\nexport function modelToTable(model: ChartModel, options: TableOptions = {}): ChartTable {\n const fmts = createFormatters(model, options);\n const messages = fmts.messages;\n const spec = model.spec;\n const caption = formatMessage(messages.tableCaption, { title: spec.title }, fmts.locale);\n const text = (value: number | null, seriesIndex: number): TableCell => ({\n value,\n text: value === null ? \"\" : fmts.value(seriesIndex)(value),\n });\n const cellOf = (value: string | number | null): TableCell => ({ value, text: value === null ? \"\" : String(value) });\n const columns: TableColumn[] = [];\n const rows: TableCell[][] = [];\n const xLabel = model.xTitle ?? spec.x?.field ?? messages.columnX;\n const yLabel = model.yTitle ?? spec.y?.field ?? messages.columnY;\n\n if (model.mark === \"pie\" || model.mark === \"donut\") {\n columns.push(\n { key: \"category\", label: xLabel === messages.columnX ? messages.columnCategory : xLabel, numeric: false },\n { key: \"value\", label: yLabel === messages.columnY ? messages.columnValue : yLabel, numeric: true },\n { key: \"share\", label: messages.columnShare, numeric: true },\n );\n for (const slice of model.slices) {\n rows.push([cellOf(slice.label), text(slice.value, 0), { value: slice.share, text: fmts.share(slice.share) }]);\n }\n } else if (model.mark === \"gauge\" || model.mark === \"progress-ring\") {\n const g = model.gauge;\n columns.push(\n { key: \"metric\", label: messages.columnMetric, numeric: false },\n { key: \"value\", label: messages.columnValue, numeric: true },\n { key: \"min\", label: messages.columnMinimum, numeric: true },\n { key: \"max\", label: messages.columnMaximum, numeric: true },\n );\n if (g?.target !== undefined) columns.push({ key: \"target\", label: messages.columnTarget, numeric: true });\n if (g) {\n const gaugeCell = (value: number): TableCell => ({ value, text: fmts.gauge(value) });\n const row = [\n cellOf(model.series[0]?.label ?? \"\"),\n gaugeCell(g.value),\n gaugeCell(g.min),\n gaugeCell(g.max),\n ...(g.target !== undefined ? [gaugeCell(g.target)] : []),\n ];\n rows.push(row);\n }\n } else if (model.mark === \"heatmap\") {\n columns.push(\n { key: \"x\", label: xLabel, numeric: false },\n { key: \"y\", label: spec.y?.title ?? spec.y?.field ?? messages.columnRow, numeric: false },\n { key: \"value\", label: model.series[0]?.label ?? messages.columnValue, numeric: true },\n );\n for (const point of model.series[0]?.points ?? []) {\n rows.push([cellOf(point.key), cellOf(point.group ?? \"\"), text(point.y, 0)]);\n }\n } else if (model.mark === \"waterfall\" && model.waterfall) {\n columns.push(\n { key: \"category\", label: xLabel === messages.columnX ? messages.columnCategory : xLabel, numeric: false },\n { key: \"change\", label: messages.columnChange, numeric: true },\n { key: \"total\", label: messages.columnRunningTotal, numeric: true },\n );\n for (const step of model.waterfall.steps) {\n rows.push([cellOf(step.label), step.total ? { value: null, text: \"\" } : text(step.delta, 0), text(step.end, 0)]);\n }\n } else if (model.mark === \"histogram\") {\n columns.push(\n { key: \"from\", label: messages.columnFrom, numeric: true },\n { key: \"to\", label: messages.columnTo, numeric: true },\n );\n model.series.forEach((series) => columns.push({ key: `s:${series.id}`, label: series.label, numeric: true }));\n const first = model.series[0];\n first?.points.forEach((point, i) => {\n rows.push([\n { value: point.x as number, text: fmts.x(point.x) },\n { value: point.x1 ?? null, text: point.x1 === undefined ? \"\" : fmts.x(point.x1) },\n ...model.series.map((series, s) => {\n const y = series.points[i]?.y ?? null;\n return { value: y, text: y === null ? \"\" : fmts.value(s)(y) };\n }),\n ]);\n });\n } else if (model.mark === \"scatter\" || model.mark === \"bubble\") {\n const multi = model.series.length > 1;\n if (multi) columns.push({ key: \"series\", label: messages.columnSeries, numeric: false });\n columns.push(\n { key: \"x\", label: xLabel, numeric: model.xKind !== \"category\" },\n { key: \"y\", label: yLabel, numeric: true },\n );\n const hasSize = model.series.some((series) => series.points.some((point) => point.size !== null));\n if (hasSize) columns.push({ key: \"size\", label: spec.size?.title ?? spec.size?.field ?? messages.columnSize, numeric: true });\n model.series.forEach((series, s) => {\n for (const point of series.points) {\n rows.push([\n ...(multi ? [cellOf(series.label)] : []),\n { value: machineX(model, point.x), text: fmts.x(point.x) },\n text(point.y, s),\n ...(hasSize ? [{ value: point.size, text: point.size === null ? \"\" : fmts.size(point.size) }] : []),\n ]);\n }\n });\n } else {\n // Category-aligned charts: one row per x, one column per series.\n columns.push({ key: \"x\", label: xLabel, numeric: model.xKind === \"number\" && model.mark !== \"bar\" });\n model.series.forEach((series) => columns.push({ key: `s:${series.id}`, label: series.label, numeric: true }));\n const byCategory = model.series.map((series) => {\n const map = new Map<number, number | null>();\n for (const point of series.points) if (!map.has(point.categoryIndex)) map.set(point.categoryIndex, point.y);\n return map;\n });\n const labels = new Map<number, string>();\n for (const series of model.series) for (const point of series.points) if (!labels.has(point.categoryIndex)) labels.set(point.categoryIndex, fmts.point(point));\n model.categories.forEach((key, index) => {\n const raw = model.categoryValues[index] ?? key;\n rows.push([\n { value: machineX(model, raw), text: labels.get(index) ?? fmts.x(raw) },\n ...model.series.map((_, s) => text(byCategory[s]?.get(index) ?? null, s)),\n ]);\n });\n }\n\n return { caption, columns, rows };\n}\n\n/** The data table for a spec: the same rows the chart draws, as columns and cells. */\nexport function chartToTable(spec: ChartSpec, options: TableOptions = {}): ChartTable {\n return modelToTable(buildChartModel(spec, { datasets: options.datasets, messages: options.messages }), options);\n}\n\nexport interface CsvOptions extends TableOptions {\n /** Field separator. Defaults to a comma. */\n delimiter?: string;\n /** Prefix a byte order mark so Excel opens the file as UTF-8. Defaults to false. */\n bom?: boolean;\n /** Include the header row. Defaults to true. */\n header?: boolean;\n}\n\n/** Quotes a field when needed and neutralizes spreadsheet formulas in text. */\nexport function escapeCsvField(value: string | number | null, delimiter = \",\"): string {\n if (value === null) return \"\";\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"\";\n const guarded = /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value;\n return guarded.includes(delimiter) || /[\"\\r\\n]/.test(guarded) ? `\"${guarded.replaceAll('\"', '\"\"')}\"` : guarded;\n}\n\n/** CSV text (RFC 4180 quoting, CRLF line breaks) for a built table. Machine values: raw numbers, ISO dates. */\nexport function tableToCsv(table: ChartTable, { delimiter = \",\", bom = false, header = true }: CsvOptions = {}): string {\n const lines: string[] = [];\n if (header) lines.push(table.columns.map((column) => escapeCsvField(column.label, delimiter)).join(delimiter));\n for (const row of table.rows) {\n lines.push(row.map((cell) => escapeCsvField(cell.value, delimiter)).join(delimiter));\n }\n return `${bom ? \"\\ufeff\" : \"\"}${lines.join(\"\\r\\n\")}\\r\\n`;\n}\n\n/**\n * CSV export of a spec's data. Text cells that start with `=`, `+`, `-` or `@`\n * are prefixed with an apostrophe so spreadsheets never run them as formulas.\n */\nexport function chartToCsv(spec: ChartSpec, options: CsvOptions = {}): string {\n return tableToCsv(chartToTable(spec, options), options);\n}\n","/**\n * Maps a chart model to an ECharts option object, for the canvas renderer.\n * Pure and server-safe: it never imports `echarts`, and colors come in as\n * resolved values (the React layer reads them from the `--kit-*` custom\n * properties at runtime, so themes work on canvas too).\n *\n * The option contains formatter functions, so it is not JSON-serializable.\n */\nimport { base as baseTokens, themes, type ThemeName } from \"@x12i/tokens\";\nimport { createFormatters } from \"./formatters\";\nimport type { ChartMessagesInput } from \"./messages\";\nimport { dashArrays, categoricalTones } from \"./palette\";\nimport { usesBandX, type ChartModel, type ModelSeries } from \"./model\";\nimport type { Annotation, MarkerShape, SeriesTone, Threshold } from \"./spec\";\n\n/** Resolved colors for canvas drawing. */\nexport interface ChartThemeColors {\n tones: Readonly<Record<SeriesTone, string>>;\n text: string;\n textSecondary: string;\n axis: string;\n grid: string;\n surface: string;\n border: string;\n accent: string;\n /** Nine steps, light to dark. */\n sequential: ReadonlyArray<string>;\n /** Nine steps, one hue through a neutral midpoint to another. */\n diverging: ReadonlyArray<string>;\n fontFamily: string;\n}\n\n/** The theme constants from `@x12i/tokens`, for server rendering and as a runtime fallback. */\nexport function themeColorsFromTokens(theme: ThemeName = \"light\"): ChartThemeColors {\n const t = themes[theme].color;\n const c = t.chart;\n const steps = (ramp: Readonly<Record<string, string>>): string[] =>\n Array.from({ length: 9 }, (_, i) => ramp[String(i + 1)] ?? \"\");\n return {\n tones: {\n accent: t.accent.default,\n muted: c.muted,\n reference: c.reference,\n good: c.good,\n warning: c.warning,\n critical: c.critical,\n \"categorical-1\": c.categorical[\"1\"],\n \"categorical-2\": c.categorical[\"2\"],\n \"categorical-3\": c.categorical[\"3\"],\n \"categorical-4\": c.categorical[\"4\"],\n \"categorical-5\": c.categorical[\"5\"],\n \"categorical-6\": c.categorical[\"6\"],\n \"categorical-7\": c.categorical[\"7\"],\n \"categorical-8\": c.categorical[\"8\"],\n },\n text: t.text.primary,\n textSecondary: t.text.secondary,\n axis: c.axis,\n grid: c.grid,\n surface: t.bg.surface,\n border: t.border.default,\n accent: t.accent.default,\n sequential: steps(baseTokens.color.sequential),\n diverging: steps(baseTokens.color.diverging),\n fontFamily: baseTokens.font.family.sans,\n };\n}\n\nexport interface EChartsOptionInput {\n colors: ChartThemeColors;\n locale?: string | undefined;\n messages?: ChartMessagesInput | undefined;\n /** Ids of hidden series or slices. */\n hidden?: ReadonlySet<string> | undefined;\n /** Animate on first draw. Turn off for reduced motion. Defaults to false. */\n animate?: boolean | undefined;\n}\n\nexport type EChartsOptionObject = Record<string, unknown>;\n\n/** A plus sign, drawn as a path because ECharts has no built-in one. */\nconst PLUS_SYMBOL = \"path://M-1,-4L1,-4L1,-1L4,-1L4,1L1,1L1,4L-1,4L-1,1L-4,1L-4,-1L-1,-1Z\";\n\nconst SYMBOLS: Readonly<Record<MarkerShape, { symbol: string; rotate: number }>> = {\n circle: { symbol: \"circle\", rotate: 0 },\n square: { symbol: \"rect\", rotate: 0 },\n triangle: { symbol: \"triangle\", rotate: 0 },\n diamond: { symbol: \"diamond\", rotate: 0 },\n cross: { symbol: PLUS_SYMBOL, rotate: 45 },\n \"triangle-down\": { symbol: \"triangle\", rotate: 180 },\n plus: { symbol: PLUS_SYMBOL, rotate: 0 },\n};\n\nconst DIM_OPACITY = 0.3;\nconst BAND_OPACITY = 0.14;\n\nfunction dashFor(series: ModelSeries): string | number[] {\n const array = dashArrays[series.style.dash];\n return array ? array.split(\" \").map(Number) : \"solid\";\n}\n\nfunction toneColor(colors: ChartThemeColors, tone: SeriesTone): string {\n return colors.tones[tone];\n}\n\nfunction annotationColor(colors: ChartThemeColors, tone: string | undefined): string {\n switch (tone) {\n case \"good\":\n return colors.tones.good;\n case \"warning\":\n return colors.tones.warning;\n case \"critical\":\n return colors.tones.critical;\n default:\n return colors.tones.reference;\n }\n}\n\n/**\n * The ECharts option for a model, or `null` when the canvas renderer cannot\n * draw it (no data, unsupported, or a waterfall that crosses zero), in which\n * case callers use the SVG renderer.\n */\nexport function toEChartsOption(model: ChartModel, input: EChartsOptionInput): EChartsOptionObject | null {\n if (model.status !== \"ok\") return null;\n const { colors, locale, messages, animate = false } = input;\n const hidden = input.hidden ?? new Set<string>();\n const fmts = createFormatters(model, { locale, messages });\n const spec = model.spec;\n\n const common: EChartsOptionObject = {\n animation: animate,\n animationDuration: 400,\n backgroundColor: \"transparent\",\n // The wrapper supplies the accessible name, description and data table.\n aria: { enabled: false },\n color: categoricalTones.map((tone) => toneColor(colors, tone)),\n textStyle: { fontFamily: colors.fontFamily, color: colors.text },\n };\n const tooltip = (trigger: \"axis\" | \"item\"): EChartsOptionObject => ({\n trigger,\n confine: true,\n backgroundColor: colors.surface,\n borderColor: colors.border,\n textStyle: { color: colors.text },\n });\n\n /* ---------------------------------------------------------- pie/donut */\n if (model.mark === \"pie\" || model.mark === \"donut\") {\n const slices = model.slices.filter((slice) => !hidden.has(slice.id));\n const inner = spec.donut?.innerRadius ?? (model.mark === \"donut\" ? 0.62 : 0);\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const centerText = spec.donut?.centerLabel ?? (model.mark === \"donut\" ? fmts.value(0)(total) : undefined);\n return {\n ...common,\n tooltip: {\n ...tooltip(\"item\"),\n formatter: (params: { name: string; value: number; percent: number }) =>\n `${params.name}: ${fmts.value(0)(params.value)} (${fmts.share(params.percent / 100)})`,\n },\n series: [\n {\n type: \"pie\",\n radius: [`${Math.round(inner * 70)}%`, \"70%\"],\n center: [\"50%\", \"50%\"],\n selectedMode: false,\n label: {\n color: colors.text,\n formatter: (params: { name: string; percent: number }) => `${params.name} ${fmts.share(params.percent / 100)}`,\n },\n labelLine: { lineStyle: { color: colors.axis } },\n data: slices.map((slice) => ({\n name: slice.label,\n value: slice.value,\n itemStyle: {\n color: toneColor(colors, slice.style.tone),\n borderColor: colors.surface,\n borderWidth: 2,\n ...(model.hasHighlight && !slice.highlighted ? { opacity: DIM_OPACITY } : {}),\n },\n })),\n },\n ],\n ...(centerText\n ? {\n graphic: [\n {\n type: \"text\",\n left: \"center\",\n top: \"middle\",\n silent: true,\n style: { text: centerText, fill: colors.text, fontFamily: colors.fontFamily, fontSize: 20, fontWeight: 600 },\n },\n ],\n }\n : {}),\n };\n }\n\n /* -------------------------------------------------------------- gauge */\n if ((model.mark === \"gauge\" || model.mark === \"progress-ring\") && model.gauge) {\n const g = model.gauge;\n const format = fmts.gauge;\n const bands = [...g.bands].sort((a, b) => a.to - b.to);\n const span = g.max - g.min || 1;\n const track: Array<[number, string]> =\n model.mark === \"progress-ring\" || bands.length === 0\n ? [[1, colors.grid]]\n : bands.map((band) => [Math.min(1, Math.max(0, (band.to - g.min) / span)), annotationColor(colors, band.tone)]);\n const active = bands.find((band) => g.value >= band.from && g.value <= band.to);\n const progress = active && model.mark === \"gauge\" ? annotationColor(colors, active.tone) : colors.accent;\n const ring = model.mark === \"progress-ring\";\n return {\n ...common,\n series: [\n {\n type: \"gauge\",\n min: g.min,\n max: g.max,\n startAngle: ring ? 90 : 200,\n endAngle: ring ? -270 : -20,\n radius: \"90%\",\n progress: { show: ring || bands.length === 0, width: 14, itemStyle: { color: progress } },\n pointer: { show: !ring, itemStyle: { color: colors.text } },\n axisLine: { lineStyle: { width: 14, color: track } },\n axisTick: { show: !ring, lineStyle: { color: colors.axis } },\n splitLine: { show: !ring, lineStyle: { color: colors.axis } },\n axisLabel: { show: !ring, color: colors.textSecondary, formatter: (value: number) => format(value) },\n anchor: { show: !ring, itemStyle: { color: colors.text } },\n detail: { valueAnimation: animate, color: colors.text, fontFamily: colors.fontFamily, formatter: (value: number) => format(value) },\n data: [{ value: g.value }],\n },\n ],\n };\n }\n\n /* ------------------------------------------------------------ heatmap */\n if (model.mark === \"heatmap\" && model.heatmap) {\n const heat = model.heatmap;\n const columnIndex = new Map(heat.columns.map((column, index) => [column, index] as const));\n const rowIndex = new Map(heat.rows.map((row, index) => [row, index] as const));\n const points = model.series[0]?.points ?? [];\n const data = points.flatMap((point) => {\n const column = columnIndex.get(point.key);\n const row = rowIndex.get(point.group ?? \"\");\n return column === undefined || row === undefined || point.y === null ? [] : [[column, row, point.y]];\n });\n const diverging = heat.min < 0 && heat.max > 0;\n return {\n ...common,\n grid: { containLabel: true, left: 8, right: 16, top: 8, bottom: 56 },\n tooltip: { ...tooltip(\"item\"), formatter: (params: { value: number[] }) => {\n const [column = 0, row = 0, value = 0] = params.value;\n return `${heat.columns[column] ?? \"\"}, ${heat.rows[row] ?? \"\"}: ${fmts.value(0)(value)}`;\n } },\n xAxis: { type: \"category\", data: heat.columns, splitArea: { show: false }, axisLabel: { color: colors.textSecondary }, axisLine: { lineStyle: { color: colors.axis } } },\n yAxis: { type: \"category\", data: heat.rows, splitArea: { show: false }, axisLabel: { color: colors.textSecondary }, axisLine: { lineStyle: { color: colors.axis } } },\n visualMap: {\n min: heat.min,\n max: heat.max,\n calculable: false,\n orient: \"horizontal\",\n left: \"center\",\n bottom: 8,\n textStyle: { color: colors.textSecondary },\n formatter: (value: number) => fmts.value(0)(value),\n inRange: { color: [...(diverging ? colors.diverging : colors.sequential)] },\n },\n series: [\n {\n type: \"heatmap\",\n data,\n label: { show: data.length <= 100, color: colors.text, formatter: (params: { value: number[] }) => fmts.value(0)(params.value[2] ?? 0) },\n itemStyle: { borderColor: colors.surface, borderWidth: 1 },\n },\n ],\n };\n }\n\n /* ---------------------------------------------------------- cartesian */\n const horizontal = model.orientation === \"horizontal\";\n const sparkline = model.mark === \"sparkline\";\n const categoryAxis = usesBandX(model.mark) || model.xKind === \"category\" || model.mark === \"histogram\";\n const visible = model.series\n .map((series, index) => ({ series, index }))\n .filter(({ series }) => !hidden.has(series.id));\n if (visible.length === 0) return null;\n\n if (model.mark === \"waterfall\") {\n for (const step of model.waterfall?.steps ?? []) {\n if (Math.min(step.start, step.end) < 0 && Math.max(step.start, step.end) > 0) return null;\n }\n }\n\n const labels: string[] =\n model.mark === \"histogram\"\n ? (model.series[0]?.points ?? []).map((point) => (point.x1 === undefined ? fmts.x(point.x) : `${fmts.x(point.x)}\\u2013${fmts.x(point.x1)}`))\n : model.categories.map((_, i) => fmts.x(model.categoryValues[i] ?? \"\"));\n\n // Totals per category for normalized stacks.\n const totals = new Map<string, number>();\n if (model.stack === \"normalized\") {\n for (const { series } of visible) {\n for (const point of series.points) {\n const key = `${series.stackKey}|${point.categoryIndex}`;\n totals.set(key, (totals.get(key) ?? 0) + Math.abs(point.y ?? 0));\n }\n }\n }\n const stacked = model.stack !== \"none\" && (model.mark === \"bar\" || model.mark === \"area\" || model.mark === \"combo\");\n\n const seriesOption = (series: ModelSeries, index: number): EChartsOptionObject[] => {\n const kind = model.mark === \"combo\" ? (series.mark === \"scatter\" ? \"scatter\" : series.mark) : model.mark;\n const color = toneColor(colors, series.style.tone);\n const symbol = SYMBOLS[series.style.marker];\n const valueFormat = fmts.value(index);\n const scale = (point: { y: number | null; categoryIndex: number }): number | null => {\n if (point.y === null || model.stack !== \"normalized\") return point.y;\n const total = totals.get(`${series.stackKey}|${point.categoryIndex}`) ?? 0;\n return total === 0 ? 0 : point.y / total;\n };\n const dim = (highlighted: boolean): EChartsOptionObject =>\n model.hasHighlight && !highlighted ? { itemStyle: { opacity: DIM_OPACITY } } : {};\n const data: unknown[] = categoryAxis\n ? model.categories.map((_, categoryIndex) => {\n const point = series.points.find((candidate) => candidate.categoryIndex === categoryIndex);\n if (!point || point.y === null) return null;\n const value = scale(point);\n return model.hasHighlight ? { value, ...dim(point.highlighted) } : value;\n })\n : series.points\n .filter((point) => point.y !== null)\n .map((point) => {\n const value = model.mark === \"bubble\" ? [point.x, scale(point), point.size ?? 0] : [point.x, scale(point)];\n return model.hasHighlight ? { value, ...dim(point.highlighted) } : value;\n });\n const axisIndex = series.axis === \"y2\" ? 1 : 0;\n const percent = model.stack === \"normalized\";\n const entry: EChartsOptionObject = {\n id: series.id,\n name: series.label,\n data,\n yAxisIndex: horizontal ? 0 : axisIndex,\n tooltip: { valueFormatter: (value: number) => (percent ? fmts.share(value) : valueFormat(value)) },\n itemStyle: { color },\n emphasis: { focus: \"series\" },\n };\n if (stacked && series.axis === \"y\") entry.stack = series.stackKey;\n\n if (kind === \"bar\" || kind === \"lollipop\" || model.mark === \"histogram\" || model.mark === \"waterfall\") {\n entry.type = \"bar\";\n if (kind === \"lollipop\") {\n entry.barWidth = 2;\n return [entry, { ...entry, id: `${series.id}-head`, type: \"scatter\", symbolSize: 10, symbol: symbol.symbol, tooltip: { show: false } }];\n }\n if (model.mark === \"histogram\") entry.barCategoryGap = \"0%\";\n return [entry];\n }\n if (kind === \"scatter\" || kind === \"bubble\") {\n entry.type = \"scatter\";\n entry.symbol = symbol.symbol;\n entry.symbolRotate = symbol.rotate;\n if (model.mark === \"bubble\") {\n const sizes = series.points.map((point) => point.size ?? 0);\n const max = Math.max(...sizes, 1);\n entry.symbolSize = (value: number[]) => 8 + 28 * Math.sqrt(Math.max(0, value[2] ?? 0) / max);\n } else {\n entry.symbolSize = 10;\n }\n return [entry];\n }\n // Line family.\n entry.type = \"line\";\n entry.symbol = sparkline ? \"none\" : symbol.symbol;\n entry.symbolRotate = symbol.rotate;\n entry.symbolSize = 8;\n entry.showSymbol = !sparkline && series.points.length <= 40;\n entry.connectNulls = false;\n entry.lineStyle = { color, width: 2, type: dashFor(series) };\n if (kind === \"step\") entry.step = \"end\";\n if (kind === \"area\") {\n entry.areaStyle = { color, opacity: 0.18 };\n }\n if (model.mark === \"line\" || model.mark === \"area\" || model.mark === \"step\" || model.mark === \"combo\") {\n // Large series stay legible without drawing every marker.\n if (series.points.length > 40) entry.showSymbol = false;\n }\n return [entry];\n };\n\n const seriesEntries: EChartsOptionObject[] = [];\n if (model.mark === \"waterfall\" && model.waterfall) {\n const steps = model.waterfall.steps;\n const plain = (value: number | null): number | null => value;\n const tone = (name: \"good\" | \"critical\" | \"accent\"): string => toneColor(colors, name);\n const shape = (picker: (step: (typeof steps)[number]) => number | null): Array<number | null> => steps.map(picker);\n const base = shape((step) => plain(Math.min(step.start, step.end)));\n const increase = shape((step) => (!step.total && step.delta >= 0 ? step.delta : null));\n const decrease = shape((step) => (!step.total && step.delta < 0 ? -step.delta : null));\n const total = shape((step) => (step.total ? Math.abs(step.end) : null));\n const stackName = \"waterfall\";\n const bar = (id: string, name: string, data: Array<number | null>, color: string): EChartsOptionObject => ({\n id,\n name,\n type: \"bar\",\n stack: stackName,\n data,\n itemStyle: { color },\n yAxisIndex: 0,\n });\n seriesEntries.push(\n { id: \"base\", name: \"base\", type: \"bar\", stack: stackName, data: base, itemStyle: { color: \"transparent\" }, silent: true, tooltip: { show: false } },\n bar(\"increase\", fmts.messages.increase, increase, tone(\"good\")),\n bar(\"decrease\", fmts.messages.decrease, decrease, tone(\"critical\")),\n bar(\"total\", fmts.messages.total, total, tone(\"accent\")),\n );\n } else {\n for (const { series, index } of visible) seriesEntries.push(...seriesOption(series, index));\n }\n\n /* Annotations and thresholds attach to the first real series. */\n const valueKey = horizontal ? \"xAxis\" : \"yAxis\";\n const timeLike = model.xKind !== \"category\";\n const xRef = (value: number | string): number | string => {\n if (!timeLike) return typeof value === \"number\" ? (labels[value] ?? String(value)) : value;\n if (model.xKind === \"time\" && typeof value === \"string\") {\n const parsed = Date.parse(/(?:Z|[+-]\\d\\d:?\\d\\d)$/.test(value) || !value.includes(\"T\") ? value : `${value}Z`);\n return Number.isNaN(parsed) ? value : parsed;\n }\n return value;\n };\n const lineData: EChartsOptionObject[] = [];\n const areaData: unknown[] = [];\n const pointData: EChartsOptionObject[] = [];\n const numeric = (value: number | string): number => (typeof value === \"number\" ? value : Number(value));\n const addLine = (value: number | string, label: string, tone: string | undefined, onValueAxis: boolean): void => {\n const color = annotationColor(colors, tone);\n lineData.push({\n ...(onValueAxis ? { [valueKey]: numeric(value) } : { [horizontal ? \"yAxis\" : \"xAxis\"]: xRef(value) }),\n name: label,\n lineStyle: { color, type: \"dashed\", width: 1.5 },\n label: { formatter: label, color: colors.text, position: \"insideEndTop\" },\n });\n };\n for (const annotation of (spec.annotations ?? []) as ReadonlyArray<Annotation>) {\n if (annotation.type === \"reference-line\" && annotation.axis !== \"y2\") {\n if (annotation.y !== undefined) addLine(annotation.y, annotation.label, annotation.tone, true);\n else if (annotation.x !== undefined) addLine(annotation.x, annotation.label, annotation.tone, false);\n } else if (annotation.type === \"reference-band\") {\n const fill = annotationColor(colors, annotation.tone);\n const edge = (value: number | string): EChartsOptionObject =>\n annotation.axis === \"y\" ? { [valueKey]: numeric(value) } : { [horizontal ? \"yAxis\" : \"xAxis\"]: xRef(value) };\n areaData.push([{ ...edge(annotation.from), name: annotation.label, itemStyle: { color: fill, opacity: BAND_OPACITY }, label: { color: colors.text } }, edge(annotation.to)]);\n } else if (annotation.type === \"forecast\") {\n const last = labels[labels.length - 1];\n const end = categoryAxis ? last : Math.max(...visible.flatMap(({ series }) => series.points.map((point) => numeric(point.x))));\n areaData.push([\n { [horizontal ? \"yAxis\" : \"xAxis\"]: xRef(annotation.from), name: annotation.label, itemStyle: { color: colors.tones.muted, opacity: BAND_OPACITY }, label: { color: colors.text } },\n { [horizontal ? \"yAxis\" : \"xAxis\"]: end },\n ]);\n } else if (annotation.type === \"point\") {\n pointData.push({ name: annotation.label, coord: [xRef(annotation.x), numeric(annotation.y)], itemStyle: { color: annotationColor(colors, annotation.tone) }, label: { formatter: annotation.label, color: colors.text } });\n }\n }\n for (const threshold of (spec.thresholds ?? []) as ReadonlyArray<Threshold>) {\n if (threshold.axis === \"y2\") continue;\n addLine(threshold.value, threshold.label, threshold.tone, threshold.axis !== \"x\");\n }\n const target = seriesEntries.find((entry) => entry.type !== \"scatter\" || model.mark === \"scatter\" || model.mark === \"bubble\") ?? seriesEntries[0];\n if (target) {\n if (lineData.length > 0) target.markLine = { silent: true, symbol: \"none\", data: lineData };\n if (areaData.length > 0) target.markArea = { silent: true, data: areaData };\n if (pointData.length > 0) target.markPoint = { silent: true, data: pointData };\n }\n\n /* Axes. */\n const spacing = sparkline ? { left: 2, right: 2, top: 2, bottom: 2, containLabel: false } : { left: 8, right: 16, top: 16, bottom: 8, containLabel: true };\n const catAxis: EChartsOptionObject = {\n type: \"category\",\n data: labels,\n boundaryGap: model.mark === \"bar\" || model.mark === \"waterfall\" || model.mark === \"histogram\" || model.mark === \"lollipop\" || model.mark === \"combo\",\n show: !sparkline && spec.axes?.x?.show !== false,\n axisLabel: { color: colors.textSecondary, hideOverlap: true },\n axisLine: { lineStyle: { color: colors.axis } },\n axisTick: { lineStyle: { color: colors.axis } },\n name: model.xTitle,\n nameLocation: \"middle\",\n nameGap: 28,\n nameTextStyle: { color: colors.textSecondary },\n };\n const contAxis: EChartsOptionObject = {\n type: model.xKind === \"time\" ? \"time\" : \"value\",\n scale: true,\n show: !sparkline && spec.axes?.x?.show !== false,\n axisLabel: {\n color: colors.textSecondary,\n hideOverlap: true,\n formatter: (value: number) => fmts.x(value),\n },\n axisLine: { lineStyle: { color: colors.axis } },\n splitLine: { show: false },\n name: model.xTitle,\n nameLocation: \"middle\",\n nameGap: 28,\n nameTextStyle: { color: colors.textSecondary },\n };\n const secondSide = spec.direction === \"rtl\" ? \"left\" : \"right\";\n const valueAxis = (axis: \"y\" | \"y2\", index: number): EChartsOptionObject => {\n const scaleSpec = spec.scales?.[axis];\n const domain = scaleSpec?.domain;\n const percent = model.stack === \"normalized\" && axis === \"y\";\n return {\n type: scaleSpec?.type === \"log\" ? \"log\" : \"value\",\n scale: model.mark === \"scatter\" || model.mark === \"bubble\" || model.mark === \"line\" ? scaleSpec?.zero !== true : false,\n position: axis === \"y2\" ? secondSide : undefined,\n show: !sparkline && spec.axes?.[axis]?.show !== false,\n ...(domain && domain.length === 2 ? { min: numeric(domain[0] as number), max: numeric(domain[1] as number) } : {}),\n ...(percent ? { max: 1 } : {}),\n axisLabel: { color: colors.textSecondary, formatter: (value: number) => (percent ? fmts.share(value) : fmts.value(index)(value)) },\n splitLine: { show: axis === \"y\" && !sparkline, lineStyle: { color: colors.grid } },\n axisLine: { show: false },\n name: axis === \"y\" ? model.yTitle : model.y2Title,\n nameTextStyle: { color: colors.textSecondary },\n };\n };\n const y2Index = model.series.findIndex((series) => series.axis === \"y2\");\n const valueAxes = model.dualAxis && !horizontal ? [valueAxis(\"y\", 0), valueAxis(\"y2\", Math.max(0, y2Index))] : [valueAxis(\"y\", 0)];\n const xAxis = categoryAxis ? catAxis : contAxis;\n\n return {\n ...common,\n grid: spacing,\n tooltip: { ...tooltip(model.mark === \"scatter\" || model.mark === \"bubble\" ? \"item\" : \"axis\"), ...(categoryAxis ? { axisPointer: { type: \"shadow\" } } : { axisPointer: { type: \"line\" } }) },\n xAxis: horizontal ? valueAxes[0] : xAxis,\n yAxis: horizontal ? xAxis : valueAxes,\n series: seriesEntries,\n };\n}"],"mappings":"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","names":["formatter","parsed","d3Bin","xField","yField","sizeField","total","low","high","scaleSqrt","plot","category","extent","plan","margin","scaleSqrt","fit","EMPTY_SET","sum","row","column","rows","format","text","ramp","sum","parsed"]}
|