graphein 0.3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scales/band.ts","../src/ticks/numeric.ts","../src/ticks/time.ts","../src/scales/format.ts","../src/scales/linear.ts","../src/scales/log.ts","../src/scales/time.ts","../src/color/convert.ts","../src/color/parse.ts","../src/color/format.ts","../src/color/interpolate.ts","../src/color/palettes.ts","../src/color/scales.ts","../src/color/contrast.ts","../src/shape/curves.ts","../src/shape/line.ts","../src/shape/area.ts","../src/shape/arc.ts","../src/shape/roundedRect.ts","../src/rough/rng.ts","../src/rough/geom.ts","../src/rough/types.ts","../src/rough/draw.ts","../src/decimate/lttb.ts","../src/animation/easing.ts","../src/animation/animate.ts","../src/animation/entrance.ts","../src/animation/env.ts","../src/animation/interpolate.ts","../src/animation/transition.ts","../src/a11y/describe.ts","../src/a11y/table.ts","../src/a11y/apply.ts","../src/pivot/pivot.ts","../src/render/env.ts","../src/render/sizing.ts","../src/render/dom.ts","../src/render/canvasLayer.ts","../src/render/surface.ts","../src/render/text.ts","../src/theme/tokens.ts","../src/theme/sketch.ts","../src/spec/types.ts","../src/spec/infer.ts","../src/spec/validate.ts","../src/spec/sketch.ts","../src/format/number.ts","../src/format/date.ts","../src/util/data.ts","../src/format/index.ts","../src/layout/frame.ts","../src/util/math.ts","../src/axes/draw.ts","../src/runtime/cartesian.ts","../src/charts/fill.ts","../src/charts/emphasis.ts","../src/charts/line.ts","../src/charts/area.ts","../src/charts/bar.ts","../src/charts/scatter.ts","../src/charts/box.ts","../src/charts/chrome.ts","../src/charts/heatmap.ts","../src/charts/pieLabels.ts","../src/charts/pie.ts","../src/charts/funnel.ts","../src/charts/kpi.ts","../src/charts/sankey.ts","../src/charts/choropleth.ts","../src/charts/condFormat.ts","../src/charts/tableView.ts","../src/charts/table.ts","../src/charts/matrix.ts","../src/render/controls.ts","../src/charts/slicers/common.ts","../src/charts/slicers/dropdown.ts","../src/charts/slicers/search.ts","../src/charts/slicers/list.ts","../src/charts/slicers/range.ts","../src/charts/slicers/dateRange.ts","../src/charts/index.ts","../src/interaction/tooltip.ts","../src/interaction/controller.ts","../src/interaction/cartesian.ts","../src/interaction/store.ts","../src/interaction/predicate.ts","../src/interaction/select.ts","../src/render/fonts.ts","../src/runtime/render.ts","../src/runtime/wire.ts","../src/runtime/dashboard.ts","../src/index.ts"],"names":["clamp","clampValue","sign","clamp01","pad","direction","center","TAU","area","u","DISABLED","keyFields","layout","digits","formatNumber","SECOND","MINUTE","HOUR","DAY","MONTH","YEAR","looksTemporal","height","positioned","ticks","transform","finite","categoryKey","resolveTitle","drawLegend","lineHeight","inside","addText","extent","numericRaw","SKETCH_BORDER_RADIUS","tr","diverging","PATH_SEPARATOR","labelText","withAlpha","line","resolveContainer","createCard"],"mappings":"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","file":"index.js","sourcesContent":["import type { BandScale, PointScale } from './types';\r\n\r\nexport interface BandScaleOptions {\r\n domain: string[];\r\n range: [number, number];\r\n paddingInner?: number;\r\n paddingOuter?: number;\r\n align?: number;\r\n}\r\n\r\nexport interface PointScaleOptions {\r\n domain: string[];\r\n range: [number, number];\r\n padding?: number;\r\n align?: number;\r\n}\r\n\r\nfunction clamp01(value: number): number {\r\n return Math.max(0, Math.min(1, value));\r\n}\r\n\r\nfunction unique(values: string[]): string[] {\r\n return Array.from(new Set(values));\r\n}\r\n\r\nexport function bandScale(opts: BandScaleOptions): BandScale {\r\n const domain = unique(opts.domain);\r\n const range: [number, number] = [opts.range[0], opts.range[1]];\r\n const paddingInner = clamp01(opts.paddingInner ?? 0);\r\n const paddingOuter = Math.max(0, opts.paddingOuter ?? 0);\r\n const align = clamp01(opts.align ?? 0.5);\r\n const count = domain.length;\r\n const reverse = range[1] < range[0];\r\n const startRange = reverse ? range[1] : range[0];\r\n const stopRange = reverse ? range[0] : range[1];\r\n const span = stopRange - startRange;\r\n const step = count === 0 ? 0 : span / Math.max(1, count - paddingInner + 2 * paddingOuter);\r\n const bandwidth = count === 0 ? 0 : step * (1 - paddingInner);\r\n const start = startRange + (span - step * (count - paddingInner)) * align;\r\n const positions = new Map<string, number>();\r\n\r\n domain.forEach((value, index) => {\r\n const positionIndex = reverse ? count - 1 - index : index;\r\n positions.set(value, start + positionIndex * step);\r\n });\r\n\r\n return {\r\n get bandwidth() {\r\n return bandwidth;\r\n },\r\n get step() {\r\n return step;\r\n },\r\n get domain() {\r\n return domain;\r\n },\r\n get range() {\r\n return range;\r\n },\r\n map(value: string): number | undefined {\r\n return positions.get(value);\r\n },\r\n };\r\n}\r\n\r\nexport function pointScale(opts: PointScaleOptions): PointScale {\r\n const domain = unique(opts.domain);\r\n const range: [number, number] = [opts.range[0], opts.range[1]];\r\n const padding = Math.max(0, opts.padding ?? 0);\r\n const align = clamp01(opts.align ?? 0.5);\r\n const count = domain.length;\r\n const reverse = range[1] < range[0];\r\n const startRange = reverse ? range[1] : range[0];\r\n const stopRange = reverse ? range[0] : range[1];\r\n const span = stopRange - startRange;\r\n const step = count === 0 ? 0 : span / Math.max(1, count - 1 + 2 * padding);\r\n const start = startRange + (span - step * (count - 1)) * align;\r\n const positions = new Map<string, number>();\r\n\r\n domain.forEach((value, index) => {\r\n const positionIndex = reverse ? count - 1 - index : index;\r\n positions.set(value, start + positionIndex * step);\r\n });\r\n\r\n return {\r\n get step() {\r\n return step;\r\n },\r\n get domain() {\r\n return domain;\r\n },\r\n get range() {\r\n return range;\r\n },\r\n map(value: string): number | undefined {\r\n return positions.get(value);\r\n },\r\n };\r\n}\r\n","const SQRT_2 = Math.sqrt(2);\r\nconst SQRT_10 = Math.sqrt(10);\r\nconst SQRT_50 = Math.sqrt(50);\r\n\r\nfunction normalizeCount(count: number): number {\r\n return Math.max(0, Math.floor(count));\r\n}\r\n\r\nfunction decimalPlaces(step: number): number {\r\n if (!Number.isFinite(step) || step === 0) {\r\n return 0;\r\n }\r\n\r\n const exponent = Math.floor(Math.log10(Math.abs(step)));\r\n return Math.max(0, -exponent + 1);\r\n}\r\n\r\nfunction roundToStep(value: number, step: number): number {\r\n const places = decimalPlaces(step);\r\n const rounded = Number(value.toFixed(Math.min(places, 15)));\r\n return Object.is(rounded, -0) ? 0 : rounded;\r\n}\r\n\r\nexport function tickStep(start: number, stop: number, count: number): number {\r\n if (!Number.isFinite(start) || !Number.isFinite(stop) || start === stop) {\r\n return 0;\r\n }\r\n\r\n const desiredCount = normalizeCount(count);\r\n if (desiredCount === 0) {\r\n return stop > start ? Infinity : -Infinity;\r\n }\r\n\r\n const reverse = stop < start;\r\n const span = Math.abs(stop - start);\r\n const rawStep = span / desiredCount;\r\n const power = Math.floor(Math.log10(rawStep));\r\n const base = 10 ** power;\r\n const error = rawStep / base;\r\n const factor = error >= SQRT_50 ? 10 : error >= SQRT_10 ? 5 : error >= SQRT_2 ? 2 : 1;\r\n const step = factor === 10 ? 10 ** (power + 1) : factor * base;\r\n return reverse ? -step : step;\r\n}\r\n\r\nexport function tickIncrement(start: number, stop: number, count: number): number {\r\n return tickStep(start, stop, count);\r\n}\r\n\r\nexport function niceDomain(start: number, stop: number, count: number): [number, number] {\r\n if (!Number.isFinite(start) || !Number.isFinite(stop) || start === stop) {\r\n return [start, stop];\r\n }\r\n\r\n const reverse = stop < start;\r\n const min = reverse ? stop : start;\r\n const max = reverse ? start : stop;\r\n const step = Math.abs(tickStep(min, max, count));\r\n\r\n if (!Number.isFinite(step) || step === 0) {\r\n return [start, stop];\r\n }\r\n\r\n const niceMin = roundToStep(Math.floor(min / step) * step, step);\r\n const niceMax = roundToStep(Math.ceil(max / step) * step, step);\r\n return reverse ? [niceMax, niceMin] : [niceMin, niceMax];\r\n}\r\n\r\nexport function ticks(start: number, stop: number, count: number): number[] {\r\n if (!Number.isFinite(start) || !Number.isFinite(stop)) {\r\n return [];\r\n }\r\n\r\n if (start === stop) {\r\n return [start];\r\n }\r\n\r\n const reverse = stop < start;\r\n const [niceStart, niceStop] = niceDomain(start, stop, count);\r\n const min = reverse ? niceStop : niceStart;\r\n const max = reverse ? niceStart : niceStop;\r\n const step = Math.abs(tickStep(min, max, count));\r\n\r\n if (!Number.isFinite(step) || step === 0) {\r\n return [start, stop];\r\n }\r\n\r\n const first = Math.round(min / step);\r\n const last = Math.round(max / step);\r\n const result: number[] = [];\r\n\r\n for (let index = first; index <= last; index += 1) {\r\n result.push(roundToStep(index * step, step));\r\n }\r\n\r\n return reverse ? result.reverse() : result;\r\n}\r\n","type FixedUnit = 'second' | 'minute' | 'hour' | 'day' | 'week';\r\ntype CalendarUnit = 'month' | 'year';\r\n\r\ninterface TimeInterval {\r\n unit: FixedUnit | CalendarUnit;\r\n step: number;\r\n duration: number;\r\n}\r\n\r\nconst SECOND = 1_000;\r\nconst MINUTE = 60 * SECOND;\r\nconst HOUR = 60 * MINUTE;\r\nconst DAY = 24 * HOUR;\r\nconst WEEK = 7 * DAY;\r\nconst MONTH = 30 * DAY;\r\nconst YEAR = 365 * DAY;\r\n\r\nconst INTERVALS: TimeInterval[] = [\r\n { unit: 'second', step: 1, duration: SECOND },\r\n { unit: 'second', step: 5, duration: 5 * SECOND },\r\n { unit: 'second', step: 10, duration: 10 * SECOND },\r\n { unit: 'second', step: 15, duration: 15 * SECOND },\r\n { unit: 'second', step: 30, duration: 30 * SECOND },\r\n { unit: 'minute', step: 1, duration: MINUTE },\r\n { unit: 'minute', step: 5, duration: 5 * MINUTE },\r\n { unit: 'minute', step: 15, duration: 15 * MINUTE },\r\n { unit: 'minute', step: 30, duration: 30 * MINUTE },\r\n { unit: 'hour', step: 1, duration: HOUR },\r\n { unit: 'hour', step: 3, duration: 3 * HOUR },\r\n { unit: 'hour', step: 6, duration: 6 * HOUR },\r\n { unit: 'hour', step: 12, duration: 12 * HOUR },\r\n { unit: 'day', step: 1, duration: DAY },\r\n { unit: 'week', step: 1, duration: WEEK },\r\n { unit: 'month', step: 1, duration: MONTH },\r\n { unit: 'month', step: 3, duration: 3 * MONTH },\r\n { unit: 'year', step: 1, duration: YEAR },\r\n];\r\n\r\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n\r\nfunction pad2(value: number): string {\r\n return String(value).padStart(2, '0');\r\n}\r\n\r\nfunction chooseInterval(span: number, count: number): TimeInterval {\r\n const desired = Math.max(1, Math.floor(count));\r\n let best = INTERVALS[0];\r\n let bestScore = Number.POSITIVE_INFINITY;\r\n\r\n for (const interval of INTERVALS) {\r\n const produced = span / interval.duration;\r\n const score = Math.abs(produced - desired);\r\n if (score < bestScore) {\r\n best = interval;\r\n bestScore = score;\r\n }\r\n }\r\n\r\n return best;\r\n}\r\n\r\nfunction fixedDuration(interval: TimeInterval): number {\r\n switch (interval.unit) {\r\n case 'second':\r\n return interval.step * SECOND;\r\n case 'minute':\r\n return interval.step * MINUTE;\r\n case 'hour':\r\n return interval.step * HOUR;\r\n case 'day':\r\n return interval.step * DAY;\r\n case 'week':\r\n return interval.step * WEEK;\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\nfunction floorFixed(value: number, interval: TimeInterval): number {\r\n const duration = fixedDuration(interval);\r\n if (interval.unit !== 'week') {\r\n return Math.floor(value / duration) * duration;\r\n }\r\n\r\n const date = new Date(value);\r\n const midnight = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\r\n const day = new Date(midnight).getUTCDay();\r\n const weekStart = midnight - day * DAY;\r\n return weekStart - Math.floor((weekStart % duration + duration) % duration);\r\n}\r\n\r\nfunction addFixed(value: number, interval: TimeInterval): number {\r\n return value + fixedDuration(interval);\r\n}\r\n\r\nfunction floorMonth(value: number, step: number): number {\r\n const date = new Date(value);\r\n const month = Math.floor(date.getUTCMonth() / step) * step;\r\n return Date.UTC(date.getUTCFullYear(), month, 1);\r\n}\r\n\r\nfunction floorYear(value: number, step: number): number {\r\n const date = new Date(value);\r\n const year = Math.floor(date.getUTCFullYear() / step) * step;\r\n return Date.UTC(year, 0, 1);\r\n}\r\n\r\nfunction addCalendar(value: number, interval: TimeInterval): number {\r\n const date = new Date(value);\r\n if (interval.unit === 'month') {\r\n return Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + interval.step, 1);\r\n }\r\n\r\n return Date.UTC(date.getUTCFullYear() + interval.step, 0, 1);\r\n}\r\n\r\nfunction floorTime(value: number, interval: TimeInterval): number {\r\n if (interval.unit === 'month') {\r\n return floorMonth(value, interval.step);\r\n }\r\n\r\n if (interval.unit === 'year') {\r\n return floorYear(value, interval.step);\r\n }\r\n\r\n return floorFixed(value, interval);\r\n}\r\n\r\nfunction ceilTime(value: number, interval: TimeInterval): number {\r\n const floored = floorTime(value, interval);\r\n if (floored === value) {\r\n return floored;\r\n }\r\n\r\n return addTime(floored, interval);\r\n}\r\n\r\nfunction addTime(value: number, interval: TimeInterval): number {\r\n return interval.unit === 'month' || interval.unit === 'year'\r\n ? addCalendar(value, interval)\r\n : addFixed(value, interval);\r\n}\r\n\r\nexport function timeTicks(start: number, stop: number, count: number): number[] {\r\n if (!Number.isFinite(start) || !Number.isFinite(stop)) {\r\n return [];\r\n }\r\n\r\n if (start === stop) {\r\n return [start];\r\n }\r\n\r\n const reverse = stop < start;\r\n const min = reverse ? stop : start;\r\n const max = reverse ? start : stop;\r\n const interval = chooseInterval(max - min, count);\r\n const first = floorTime(min, interval);\r\n const last = ceilTime(max, interval);\r\n const result: number[] = [];\r\n\r\n for (let value = first; value <= last; value = addTime(value, interval)) {\r\n result.push(value);\r\n if (result.length > 100_000) {\r\n break;\r\n }\r\n }\r\n\r\n return reverse ? result.reverse() : result;\r\n}\r\n\r\nexport function timeTickFormat(values: number[]): (t: number) => string {\r\n const ordered = [...values].sort((a, b) => a - b);\r\n const span = ordered.length > 1 ? Math.abs(ordered[1] - ordered[0]) : 0;\r\n\r\n return (time: number): string => {\r\n const date = new Date(time);\r\n const year = date.getUTCFullYear();\r\n const month = MONTH_NAMES[date.getUTCMonth()];\r\n const day = date.getUTCDate();\r\n const hours = pad2(date.getUTCHours());\r\n const minutes = pad2(date.getUTCMinutes());\r\n const seconds = pad2(date.getUTCSeconds());\r\n\r\n if (span >= YEAR * 0.8) {\r\n return String(year);\r\n }\r\n\r\n if (span >= MONTH * 0.8) {\r\n return ordered.some((tick) => new Date(tick).getUTCFullYear() !== year) ? `${month} ${year}` : month;\r\n }\r\n\r\n if (span >= DAY * 0.8) {\r\n return `${month} ${day}`;\r\n }\r\n\r\n if (span > 0 && span < MINUTE) {\r\n return `${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n return `${hours}:${minutes}`;\r\n };\r\n}\r\n","export function formatNumber(value: number, precision = 12): string {\r\n if (!Number.isFinite(value)) {\r\n return String(value);\r\n }\r\n\r\n if (value === 0) {\r\n return '0';\r\n }\r\n\r\n const abs = Math.abs(value);\r\n if (abs >= 1e6 || abs < 1e-4) {\r\n return value.toExponential(Math.max(0, Math.min(precision, 6))).replace(/\\.?0+e/, 'e');\r\n }\r\n\r\n return value\r\n .toFixed(Math.max(0, Math.min(precision, 12)))\r\n .replace(/\\.?0+$/, '');\r\n}\r\n\r\nexport function precisionFromStep(step: number): number {\r\n if (!Number.isFinite(step) || step === 0) {\r\n return 12;\r\n }\r\n\r\n return Math.max(0, Math.min(12, -Math.floor(Math.log10(Math.abs(step))) + 2));\r\n}\r\n","import { niceDomain, tickStep, ticks } from '../ticks';\r\nimport { formatNumber, precisionFromStep } from './format';\r\nimport type { ContinuousScale } from './types';\r\n\r\nexport interface LinearScaleOptions {\r\n domain: [number, number];\r\n range: [number, number];\r\n clamp?: boolean;\r\n}\r\n\r\nfunction clampValue(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\nexport function linearScale(opts: LinearScaleOptions): ContinuousScale {\r\n const domain: [number, number] = [opts.domain[0], opts.domain[1]];\r\n const range: [number, number] = [opts.range[0], opts.range[1]];\r\n const clamp = opts.clamp === true;\r\n\r\n const scale: ContinuousScale = {\r\n get domain() {\r\n return domain;\r\n },\r\n get range() {\r\n return range;\r\n },\r\n map(value: number): number {\r\n const [d0, d1] = domain;\r\n const [r0, r1] = range;\r\n if (d0 === d1) {\r\n return r0;\r\n }\r\n\r\n const mapped = r0 + ((value - d0) / (d1 - d0)) * (r1 - r0);\r\n return clamp ? clampValue(mapped, Math.min(r0, r1), Math.max(r0, r1)) : mapped;\r\n },\r\n invert(pixel: number): number {\r\n const [d0, d1] = domain;\r\n const [r0, r1] = range;\r\n if (r0 === r1) {\r\n return d0;\r\n }\r\n\r\n const input = clamp ? clampValue(pixel, Math.min(r0, r1), Math.max(r0, r1)) : pixel;\r\n return d0 + ((input - r0) / (r1 - r0)) * (d1 - d0);\r\n },\r\n ticks(count = 10): number[] {\r\n return ticks(domain[0], domain[1], count);\r\n },\r\n tickFormat(count = 10): (v: number) => string {\r\n const step = tickStep(domain[0], domain[1], count);\r\n const precision = precisionFromStep(step);\r\n return (value: number) => formatNumber(value, precision);\r\n },\r\n nice(count = 10): ContinuousScale {\r\n return linearScale({ domain: niceDomain(domain[0], domain[1], count), range, clamp });\r\n },\r\n copy(): ContinuousScale {\r\n return linearScale({ domain, range, clamp });\r\n },\r\n };\r\n\r\n return scale;\r\n}\r\n","import { formatNumber } from './format';\r\nimport type { ContinuousScale } from './types';\r\n\r\nexport interface LogScaleOptions {\r\n domain: [number, number];\r\n range: [number, number];\r\n base?: number;\r\n clamp?: boolean;\r\n}\r\n\r\nfunction clampValue(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\nfunction assertDomain(domain: [number, number], base: number): void {\r\n if (base <= 0 || base === 1 || !Number.isFinite(base)) {\r\n throw new Error('logScale base must be a finite positive number other than 1');\r\n }\r\n\r\n if (domain[0] === 0 || domain[1] === 0 || domain[0] * domain[1] <= 0) {\r\n throw new Error('logScale domain must be strictly positive or strictly negative');\r\n }\r\n}\r\n\r\nfunction transform(value: number, sign: number, base: number): number {\r\n return sign * (Math.log(Math.abs(value)) / Math.log(base));\r\n}\r\n\r\nfunction untransform(value: number, sign: number, base: number): number {\r\n return sign > 0 ? base ** value : -(base ** -value);\r\n}\r\n\r\nfunction logTicks(domain: [number, number], base: number): number[] {\r\n const sign = domain[0] < 0 ? -1 : 1;\r\n const reverse = domain[1] < domain[0];\r\n const min = Math.min(Math.abs(domain[0]), Math.abs(domain[1]));\r\n const max = Math.max(Math.abs(domain[0]), Math.abs(domain[1]));\r\n const first = Math.ceil(Math.log(min) / Math.log(base) - 1e-12);\r\n const last = Math.floor(Math.log(max) / Math.log(base) + 1e-12);\r\n const values: number[] = [];\r\n\r\n for (let exponent = first; exponent <= last; exponent += 1) {\r\n values.push(sign * base ** exponent);\r\n }\r\n\r\n if (sign < 0) {\r\n values.reverse();\r\n }\r\n\r\n return reverse ? values.reverse() : values;\r\n}\r\n\r\nfunction niceLogDomain(domain: [number, number], base: number): [number, number] {\r\n const sign = domain[0] < 0 ? -1 : 1;\r\n const reverse = domain[1] < domain[0];\r\n const min = Math.min(Math.abs(domain[0]), Math.abs(domain[1]));\r\n const max = Math.max(Math.abs(domain[0]), Math.abs(domain[1]));\r\n const niceMin = sign * base ** Math.floor(Math.log(min) / Math.log(base) + 1e-12);\r\n const niceMax = sign * base ** Math.ceil(Math.log(max) / Math.log(base) - 1e-12);\r\n\r\n if (sign < 0) {\r\n return reverse ? [niceMin, niceMax] : [niceMax, niceMin];\r\n }\r\n\r\n return reverse ? [niceMax, niceMin] : [niceMin, niceMax];\r\n}\r\n\r\nexport function logScale(opts: LogScaleOptions): ContinuousScale {\r\n const domain: [number, number] = [opts.domain[0], opts.domain[1]];\r\n const range: [number, number] = [opts.range[0], opts.range[1]];\r\n const base = opts.base ?? 10;\r\n const clamp = opts.clamp === true;\r\n assertDomain(domain, base);\r\n\r\n const sign = domain[0] < 0 ? -1 : 1;\r\n const transformedDomain: [number, number] = [\r\n transform(domain[0], sign, base),\r\n transform(domain[1], sign, base),\r\n ];\r\n\r\n const scale: ContinuousScale = {\r\n get domain() {\r\n return domain;\r\n },\r\n get range() {\r\n return range;\r\n },\r\n map(value: number): number {\r\n const [d0, d1] = transformedDomain;\r\n const [r0, r1] = range;\r\n const transformed = transform(value, sign, base);\r\n const mapped = r0 + ((transformed - d0) / (d1 - d0)) * (r1 - r0);\r\n return clamp ? clampValue(mapped, Math.min(r0, r1), Math.max(r0, r1)) : mapped;\r\n },\r\n invert(pixel: number): number {\r\n const [d0, d1] = transformedDomain;\r\n const [r0, r1] = range;\r\n const input = clamp ? clampValue(pixel, Math.min(r0, r1), Math.max(r0, r1)) : pixel;\r\n return untransform(d0 + ((input - r0) / (r1 - r0)) * (d1 - d0), sign, base);\r\n },\r\n ticks(): number[] {\r\n return logTicks(domain, base);\r\n },\r\n tickFormat(): (v: number) => string {\r\n return (value: number) => formatNumber(value, 12);\r\n },\r\n nice(): ContinuousScale {\r\n return logScale({ domain: niceLogDomain(domain, base), range, base, clamp });\r\n },\r\n copy(): ContinuousScale {\r\n return logScale({ domain, range, base, clamp });\r\n },\r\n };\r\n\r\n return scale;\r\n}\r\n","import { timeTickFormat, timeTicks } from '../ticks';\r\nimport type { ContinuousScale } from './types';\r\n\r\nexport interface TimeScaleOptions {\r\n domain: [number, number] | [Date, Date];\r\n range: [number, number];\r\n clamp?: boolean;\r\n}\r\n\r\nfunction toMillis(value: number | Date): number {\r\n return value instanceof Date ? value.getTime() : value;\r\n}\r\n\r\nfunction clampValue(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\nexport function timeScale(opts: TimeScaleOptions): ContinuousScale {\r\n const domain: [number, number] = [toMillis(opts.domain[0]), toMillis(opts.domain[1])];\r\n const range: [number, number] = [opts.range[0], opts.range[1]];\r\n const clamp = opts.clamp === true;\r\n\r\n const scale: ContinuousScale = {\r\n get domain() {\r\n return domain;\r\n },\r\n get range() {\r\n return range;\r\n },\r\n map(value: number): number {\r\n const [d0, d1] = domain;\r\n const [r0, r1] = range;\r\n if (d0 === d1) {\r\n return r0;\r\n }\r\n\r\n const mapped = r0 + ((value - d0) / (d1 - d0)) * (r1 - r0);\r\n return clamp ? clampValue(mapped, Math.min(r0, r1), Math.max(r0, r1)) : mapped;\r\n },\r\n invert(pixel: number): number {\r\n const [d0, d1] = domain;\r\n const [r0, r1] = range;\r\n if (r0 === r1) {\r\n return d0;\r\n }\r\n\r\n const input = clamp ? clampValue(pixel, Math.min(r0, r1), Math.max(r0, r1)) : pixel;\r\n return d0 + ((input - r0) / (r1 - r0)) * (d1 - d0);\r\n },\r\n ticks(count = 10): number[] {\r\n return timeTicks(domain[0], domain[1], count);\r\n },\r\n tickFormat(count = 10): (v: number) => string {\r\n return timeTickFormat(this.ticks(count));\r\n },\r\n nice(count = 10): ContinuousScale {\r\n const values = timeTicks(domain[0], domain[1], count);\r\n if (values.length === 0) {\r\n return timeScale({ domain, range, clamp });\r\n }\r\n\r\n return timeScale({ domain: [values[0], values[values.length - 1]], range, clamp });\r\n },\r\n copy(): ContinuousScale {\r\n return timeScale({ domain, range, clamp });\r\n },\r\n };\r\n\r\n return scale;\r\n}\r\n","import type { RGBA } from '../types';\r\n\r\n/** Color-space conversions: sRGB <-> linear <-> OKLab <-> OKLCH. */\r\n\r\nexport const clamp01 = (x: number): number => (x < 0 ? 0 : x > 1 ? 1 : x);\r\nexport const clamp255 = (x: number): number => (x < 0 ? 0 : x > 255 ? 255 : x);\r\n\r\n/** sRGB channel (0..1) -> linear-light (0..1). */\r\nexport function srgbToLinear(c: number): number {\r\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n}\r\n\r\n/** linear-light (0..1) -> sRGB channel (0..1). */\r\nexport function linearToSrgb(c: number): number {\r\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\r\n}\r\n\r\nexport interface OKLab {\r\n L: number;\r\n a: number;\r\n b: number;\r\n}\r\n\r\nexport interface OKLCH {\r\n L: number;\r\n C: number;\r\n /** Hue in radians. */\r\n h: number;\r\n}\r\n\r\n/** RGBA (0..255) -> OKLab. */\r\nexport function rgbToOklab(color: RGBA): OKLab {\r\n const r = srgbToLinear(color.r / 255);\r\n const g = srgbToLinear(color.g / 255);\r\n const b = srgbToLinear(color.b / 255);\r\n\r\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\r\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\r\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\r\n\r\n const l_ = Math.cbrt(l);\r\n const m_ = Math.cbrt(m);\r\n const s_ = Math.cbrt(s);\r\n\r\n return {\r\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\r\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\r\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\r\n };\r\n}\r\n\r\n/** OKLab -> RGBA (0..255), gamut-clamped. Alpha defaults to 1. */\r\nexport function oklabToRgb(lab: OKLab, alpha = 1): RGBA {\r\n const { L, a, b } = lab;\r\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\r\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\r\n const s_ = L - 0.0894841775 * a - 1.291485548 * b;\r\n\r\n const l = l_ * l_ * l_;\r\n const m = m_ * m_ * m_;\r\n const s = s_ * s_ * s_;\r\n\r\n const r = linearToSrgb(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s);\r\n const g = linearToSrgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s);\r\n const bch = linearToSrgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s);\r\n\r\n return {\r\n r: Math.round(clamp255(r * 255)),\r\n g: Math.round(clamp255(g * 255)),\r\n b: Math.round(clamp255(bch * 255)),\r\n a: clamp01(alpha),\r\n };\r\n}\r\n\r\nexport function oklabToOklch(lab: OKLab): OKLCH {\r\n return { L: lab.L, C: Math.hypot(lab.a, lab.b), h: Math.atan2(lab.b, lab.a) };\r\n}\r\n\r\nexport function oklchToOklab(lch: OKLCH): OKLab {\r\n return { L: lch.L, a: lch.C * Math.cos(lch.h), b: lch.C * Math.sin(lch.h) };\r\n}\r\n","import type { RGBA } from '../types';\r\nimport { clamp01 } from './convert';\r\n\r\n/** A small but useful set of CSS named colors. */\r\nconst NAMED: Record<string, RGBA> = {\r\n transparent: { r: 0, g: 0, b: 0, a: 0 },\r\n white: { r: 255, g: 255, b: 255, a: 1 },\r\n black: { r: 0, g: 0, b: 0, a: 1 },\r\n red: { r: 255, g: 0, b: 0, a: 1 },\r\n green: { r: 0, g: 128, b: 0, a: 1 },\r\n blue: { r: 0, g: 0, b: 255, a: 1 },\r\n gray: { r: 128, g: 128, b: 128, a: 1 },\r\n grey: { r: 128, g: 128, b: 128, a: 1 },\r\n orange: { r: 255, g: 165, b: 0, a: 1 },\r\n purple: { r: 128, g: 0, b: 128, a: 1 },\r\n teal: { r: 0, g: 128, b: 128, a: 1 },\r\n yellow: { r: 255, g: 255, b: 0, a: 1 },\r\n};\r\n\r\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\r\n h = ((h % 360) + 360) % 360;\r\n const c = (1 - Math.abs(2 * l - 1)) * s;\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\r\n const m = l - c / 2;\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n if (h < 60) [r, g, b] = [c, x, 0];\r\n else if (h < 120) [r, g, b] = [x, c, 0];\r\n else if (h < 180) [r, g, b] = [0, c, x];\r\n else if (h < 240) [r, g, b] = [0, x, c];\r\n else if (h < 300) [r, g, b] = [x, 0, c];\r\n else [r, g, b] = [c, 0, x];\r\n return {\r\n r: Math.round((r + m) * 255),\r\n g: Math.round((g + m) * 255),\r\n b: Math.round((b + m) * 255),\r\n };\r\n}\r\n\r\nfunction parseHex(hex: string): RGBA | null {\r\n const h = hex.slice(1);\r\n const expand = (s: string) => parseInt(s.length === 1 ? s + s : s, 16);\r\n if (h.length === 3 || h.length === 4) {\r\n const r = expand(h[0]);\r\n const g = expand(h[1]);\r\n const b = expand(h[2]);\r\n const a = h.length === 4 ? expand(h[3]) / 255 : 1;\r\n return { r, g, b, a };\r\n }\r\n if (h.length === 6 || h.length === 8) {\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n const a = h.length === 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\r\n if ([r, g, b].some(Number.isNaN)) return null;\r\n return { r, g, b, a };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Parse a CSS color string into RGBA (r,g,b in 0..255, a in 0..1).\r\n * Supports hex (#rgb/#rgba/#rrggbb/#rrggbbaa), rgb()/rgba(), hsl()/hsla(),\r\n * and a small set of named colors. Returns null when unparseable.\r\n */\r\nexport function parseColor(input: string): RGBA | null {\r\n if (typeof input !== 'string') return null;\r\n const str = input.trim().toLowerCase();\r\n if (str === '') return null;\r\n\r\n if (str in NAMED) return { ...NAMED[str] };\r\n if (str.startsWith('#')) return parseHex(str);\r\n\r\n const fn = /^(rgba?|hsla?)\\(([^)]+)\\)$/.exec(str);\r\n if (!fn) return null;\r\n const kind = fn[1];\r\n const parts = fn[2]\r\n .split(/[,/\\s]+/)\r\n .map((p) => p.trim())\r\n .filter((p) => p !== '');\r\n\r\n const num = (p: string): number => (p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p));\r\n\r\n if (kind === 'rgb' || kind === 'rgba') {\r\n if (parts.length < 3) return null;\r\n const ch = (p: string) => (p.endsWith('%') ? Math.round((parseFloat(p) / 100) * 255) : Math.round(parseFloat(p)));\r\n return {\r\n r: ch(parts[0]),\r\n g: ch(parts[1]),\r\n b: ch(parts[2]),\r\n a: parts[3] !== undefined ? clamp01(num(parts[3])) : 1,\r\n };\r\n }\r\n // hsl / hsla\r\n if (parts.length < 3) return null;\r\n const h = parseFloat(parts[0]);\r\n const s = clamp01(num(parts[1]));\r\n const l = clamp01(num(parts[2]));\r\n const { r, g, b } = hslToRgb(h, s, l);\r\n return { r, g, b, a: parts[3] !== undefined ? clamp01(num(parts[3])) : 1 };\r\n}\r\n","import type { RGBA } from '../types';\r\nimport { parseColor } from './parse';\r\n\r\nconst hex2 = (n: number): string => {\r\n const v = Math.max(0, Math.min(255, Math.round(n)));\r\n return v.toString(16).padStart(2, '0');\r\n};\r\n\r\n/** Format an RGBA as a CSS rgb()/rgba() string. */\r\nexport function rgbaToCss(c: RGBA): string {\r\n const r = Math.round(c.r);\r\n const g = Math.round(c.g);\r\n const b = Math.round(c.b);\r\n if (c.a >= 1) return `rgb(${r}, ${g}, ${b})`;\r\n return `rgba(${r}, ${g}, ${b}, ${Number(c.a.toFixed(3))})`;\r\n}\r\n\r\n/**\r\n * Return `color` as a CSS rgba() string at the given alpha (0..1). Accepts any\r\n * parseable CSS color; falls back to the input string when unparseable.\r\n */\r\nexport function withAlpha(color: string, alpha: number): string {\r\n const rgba = parseColor(color);\r\n if (!rgba) return color;\r\n return rgbaToCss({ ...rgba, a: Math.max(0, Math.min(1, alpha)) });\r\n}\r\n\r\n/** Format an RGBA as a hex string (#rrggbb, or #rrggbbaa when includeAlpha). */\r\nexport function toHex(c: RGBA, includeAlpha = false): string {\r\n const base = `#${hex2(c.r)}${hex2(c.g)}${hex2(c.b)}`;\r\n if (includeAlpha) return base + hex2(c.a * 255);\r\n return base;\r\n}\r\n","import type { RGBA } from '../types';\r\nimport { clamp01, oklabToRgb, rgbToOklab } from './convert';\r\n\r\nexport type Interpolator = (t: number) => RGBA;\r\n\r\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\r\n\r\n/** Interpolate two colors in sRGB space. Endpoints are exact. */\r\nexport function interpolateRgb(a: RGBA, b: RGBA): Interpolator {\r\n return (t: number): RGBA => {\r\n if (t <= 0) return { ...a };\r\n if (t >= 1) return { ...b };\r\n return {\r\n r: Math.round(lerp(a.r, b.r, t)),\r\n g: Math.round(lerp(a.g, b.g, t)),\r\n b: Math.round(lerp(a.b, b.b, t)),\r\n a: clamp01(lerp(a.a, b.a, t)),\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Interpolate two colors through OKLab for perceptually smooth ramps.\r\n * Endpoints are returned exactly (no round-trip drift).\r\n */\r\nexport function interpolateOklab(a: RGBA, b: RGBA): Interpolator {\r\n const la = rgbToOklab(a);\r\n const lb = rgbToOklab(b);\r\n return (t: number): RGBA => {\r\n if (t <= 0) return { ...a };\r\n if (t >= 1) return { ...b };\r\n const rgb = oklabToRgb(\r\n { L: lerp(la.L, lb.L, t), a: lerp(la.a, lb.a, t), b: lerp(la.b, lb.b, t) },\r\n lerp(a.a, b.a, t),\r\n );\r\n return rgb;\r\n };\r\n}\r\n","import type { RGBA } from '../types';\r\nimport { parseColor } from './parse';\r\nimport { interpolateOklab, type Interpolator } from './interpolate';\r\n\r\n/** A vibrant, accessible categorical palette (matches the default theme). */\r\nconst CATEGORICAL: Record<string, string[]> = {\r\n graphein: [\r\n '#3b82f6',\r\n '#14b8a6',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#8b5cf6',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1',\r\n '#84cc16',\r\n ],\r\n};\r\n\r\n/** Get a categorical palette by name (defaults to the 'graphein' palette). */\r\nexport function categorical(name = 'graphein'): string[] {\r\n return [...(CATEGORICAL[name] ?? CATEGORICAL.graphein)];\r\n}\r\n\r\nconst must = (hex: string): RGBA => {\r\n const c = parseColor(hex);\r\n if (!c) throw new Error(`Graphein: invalid palette color ${hex}`);\r\n return c;\r\n};\r\n\r\n/**\r\n * Build a continuous ramp from ordered color stops, interpolating each segment\r\n * in OKLab. Endpoints (t=0,1) return the first/last stop exactly.\r\n */\r\nexport function rampFromStops(stops: string[]): Interpolator {\r\n const colors = stops.map(must);\r\n if (colors.length === 1) return () => ({ ...colors[0] });\r\n const n = colors.length - 1;\r\n const segs = colors.slice(0, n).map((c, i) => interpolateOklab(c, colors[i + 1]));\r\n return (t: number): RGBA => {\r\n if (t <= 0) return { ...colors[0] };\r\n if (t >= 1) return { ...colors[n] };\r\n const scaled = t * n;\r\n const i = Math.min(n - 1, Math.floor(scaled));\r\n return segs[i](scaled - i);\r\n };\r\n}\r\n\r\nconst SEQUENTIAL_STOPS: Record<string, string[]> = {\r\n blues: ['#f7fbff', '#c6dbef', '#6baed6', '#2171b5', '#08306b'],\r\n teal: ['#f0fdfa', '#99f6e4', '#2dd4bf', '#0d9488', '#134e4a'],\r\n viridis: ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],\r\n magma: ['#000004', '#3b0f70', '#8c2981', '#de4968', '#fe9f6d', '#fcfdbf'],\r\n greys: ['#ffffff', '#bdbdbd', '#636363', '#000000'],\r\n};\r\n\r\nconst DIVERGING_STOPS: Record<string, string[]> = {\r\n redblue: ['#b2182b', '#f7f7f7', '#2166ac'],\r\n spectral: ['#d53e4f', '#fc8d59', '#fee08b', '#ffffbf', '#99d594', '#3288bd'],\r\n bluered: ['#2166ac', '#f7f7f7', '#b2182b'],\r\n};\r\n\r\n/** A named sequential interpolator (blues, teal, viridis, magma, greys). */\r\nexport function sequential(name: string): Interpolator {\r\n return rampFromStops(SEQUENTIAL_STOPS[name.toLowerCase()] ?? SEQUENTIAL_STOPS.viridis);\r\n}\r\n\r\n/** A named diverging interpolator (redBlue, spectral, blueRed). */\r\nexport function diverging(name: string): Interpolator {\r\n return rampFromStops(DIVERGING_STOPS[name.toLowerCase()] ?? DIVERGING_STOPS.redblue);\r\n}\r\n\r\nexport const sequentialSchemes = Object.keys(SEQUENTIAL_STOPS);\r\nexport const divergingSchemes = Object.keys(DIVERGING_STOPS);\r\n","import type { RGBA } from '../types';\r\nimport { parseColor } from './parse';\r\nimport { categorical } from './palettes';\r\nimport type { Interpolator } from './interpolate';\r\n\r\nconst clamp01 = (x: number): number => (x < 0 ? 0 : x > 1 ? 1 : x);\r\n\r\nexport interface ColorScale<T> {\r\n map(value: T): RGBA;\r\n}\r\n\r\n/** Map a continuous numeric domain through a sequential interpolator. */\r\nexport function sequentialColorScale(opts: {\r\n domain: [number, number];\r\n interpolator: Interpolator;\r\n clamp?: boolean;\r\n}): ColorScale<number> {\r\n const [d0, d1] = opts.domain;\r\n const span = d1 - d0;\r\n return {\r\n map(value: number): RGBA {\r\n let t = span === 0 ? 0.5 : (value - d0) / span;\r\n if (opts.clamp !== false) t = clamp01(t);\r\n return opts.interpolator(t);\r\n },\r\n };\r\n}\r\n\r\n/** Map a [min, mid, max] domain symmetrically through a diverging interpolator. */\r\nexport function divergingColorScale(opts: {\r\n domain: [number, number, number];\r\n interpolator: Interpolator;\r\n clamp?: boolean;\r\n}): ColorScale<number> {\r\n const [d0, dm, d1] = opts.domain;\r\n return {\r\n map(value: number): RGBA {\r\n let t: number;\r\n if (value <= dm) {\r\n const lo = dm - d0;\r\n t = lo === 0 ? 0 : 0.5 * ((value - d0) / lo);\r\n } else {\r\n const hi = d1 - dm;\r\n t = hi === 0 ? 1 : 0.5 + 0.5 * ((value - dm) / hi);\r\n }\r\n if (opts.clamp !== false) t = clamp01(t);\r\n return opts.interpolator(t);\r\n },\r\n };\r\n}\r\n\r\n/** Map categorical keys to palette colors (cycled by first-seen index). */\r\nexport function ordinalColorScale(opts: {\r\n domain?: string[];\r\n palette?: string[];\r\n}): ColorScale<string> {\r\n const palette = (opts.palette ?? categorical()).map((c) => {\r\n const rgba = parseColor(c);\r\n if (!rgba) throw new Error(`Graphein: invalid palette color ${c}`);\r\n return rgba;\r\n });\r\n const index = new Map<string, number>();\r\n (opts.domain ?? []).forEach((k, i) => index.set(k, i));\r\n let next = index.size;\r\n return {\r\n map(value: string): RGBA {\r\n let i = index.get(value);\r\n if (i === undefined) {\r\n i = next++;\r\n index.set(value, i);\r\n }\r\n return palette[i % palette.length];\r\n },\r\n };\r\n}\r\n","import type { RGBA } from '../types';\r\nimport { srgbToLinear } from './convert';\r\n\r\nconst WHITE: RGBA = { r: 255, g: 255, b: 255, a: 1 };\r\nconst BLACK: RGBA = { r: 0, g: 0, b: 0, a: 1 };\r\n\r\n/** WCAG relative luminance of a color. */\r\nexport function relativeLuminance(c: RGBA): number {\r\n const r = srgbToLinear(c.r / 255);\r\n const g = srgbToLinear(c.g / 255);\r\n const b = srgbToLinear(c.b / 255);\r\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n}\r\n\r\n/** WCAG contrast ratio between two colors (1..21). */\r\nexport function contrastRatio(a: RGBA, b: RGBA): number {\r\n const la = relativeLuminance(a);\r\n const lb = relativeLuminance(b);\r\n const lighter = Math.max(la, lb);\r\n const darker = Math.min(la, lb);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/**\r\n * Pick whichever of two candidate text colors (default white/black) has the\r\n * higher contrast against the given background — for legible labels on marks.\r\n */\r\nexport function readableTextColor(\r\n bg: RGBA,\r\n options: { light?: RGBA; dark?: RGBA } = {},\r\n): RGBA {\r\n const light = options.light ?? WHITE;\r\n const dark = options.dark ?? BLACK;\r\n return contrastRatio(bg, light) >= contrastRatio(bg, dark) ? light : dark;\r\n}\r\n","import type { Point } from '../types';\nimport type { PathSink } from './sink';\n\nexport type Curve = (points: Point[], sink: PathSink) => void;\n\nconst sign = (value: number): number => (value < 0 ? -1 : value > 0 ? 1 : 0);\n\nexport function curveLinear(points: Point[], sink: PathSink): void {\n if (points.length === 0) {\n return;\n }\n\n sink.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i += 1) {\n sink.lineTo(points[i].x, points[i].y);\n }\n}\n\nexport function curveStepAfter(points: Point[], sink: PathSink): void {\n if (points.length === 0) {\n return;\n }\n\n sink.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i += 1) {\n const previous = points[i - 1];\n const current = points[i];\n sink.lineTo(current.x, previous.y);\n sink.lineTo(current.x, current.y);\n }\n}\n\nexport function curveStepBefore(points: Point[], sink: PathSink): void {\n if (points.length === 0) {\n return;\n }\n\n sink.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i += 1) {\n const previous = points[i - 1];\n const current = points[i];\n sink.lineTo(previous.x, current.y);\n sink.lineTo(current.x, current.y);\n }\n}\n\nexport const curveStep: Curve = curveStepAfter;\n\nexport function monotoneXTangents(points: Point[]): number[] {\n const n = points.length;\n if (n < 2) {\n return n === 1 ? [0] : [];\n }\n\n const slopes: number[] = [];\n for (let i = 0; i < n - 1; i += 1) {\n const dx = points[i + 1].x - points[i].x;\n slopes.push(dx === 0 ? 0 : (points[i + 1].y - points[i].y) / dx);\n }\n\n const tangents = new Array<number>(n);\n tangents[0] = slopes[0];\n tangents[n - 1] = slopes[n - 2];\n\n for (let i = 1; i < n - 1; i += 1) {\n const previousSlope = slopes[i - 1];\n const nextSlope = slopes[i];\n\n if (previousSlope === 0 || nextSlope === 0 || sign(previousSlope) !== sign(nextSlope)) {\n tangents[i] = 0;\n continue;\n }\n\n const previousWidth = points[i].x - points[i - 1].x;\n const nextWidth = points[i + 1].x - points[i].x;\n const weightedSlope = (previousSlope * nextWidth + nextSlope * previousWidth) / (previousWidth + nextWidth);\n tangents[i] = (sign(previousSlope) + sign(nextSlope)) * Math.min(\n Math.abs(previousSlope),\n Math.abs(nextSlope),\n Math.abs(weightedSlope) / 2,\n );\n }\n\n return tangents;\n}\n\nexport function curveMonotoneX(points: Point[], sink: PathSink): void {\n if (points.length === 0) {\n return;\n }\n\n sink.moveTo(points[0].x, points[0].y);\n if (points.length === 1) {\n return;\n }\n\n const tangents = monotoneXTangents(points);\n for (let i = 0; i < points.length - 1; i += 1) {\n const start = points[i];\n const end = points[i + 1];\n const dx = end.x - start.x;\n\n if (dx === 0) {\n sink.lineTo(end.x, end.y);\n continue;\n }\n\n sink.bezierCurveTo(\n start.x + dx / 3,\n start.y + (tangents[i] * dx) / 3,\n end.x - dx / 3,\n end.y - (tangents[i + 1] * dx) / 3,\n end.x,\n end.y,\n );\n }\n}\n\nexport function curveCatmullRom(points: Point[], sink: PathSink): void {\n if (points.length === 0) {\n return;\n }\n\n sink.moveTo(points[0].x, points[0].y);\n for (let i = 0; i < points.length - 1; i += 1) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n sink.bezierCurveTo(\n p1.x + (p2.x - p0.x) / 6,\n p1.y + (p2.y - p0.y) / 6,\n p2.x - (p3.x - p1.x) / 6,\n p2.y - (p3.y - p1.y) / 6,\n p2.x,\n p2.y,\n );\n }\n}\r\n","import type { Point } from '../types';\nimport { curveLinear, type Curve } from './curves';\nimport type { PathSink } from './sink';\n\nexport interface LineOptions {\n curve?: Curve;\n}\n\nconst isDefinedPoint = (point: Point): boolean => !Number.isNaN(point.x) && !Number.isNaN(point.y);\n\nexport function line(opts: LineOptions = {}): (points: Point[], sink: PathSink) => void {\n const curve = opts.curve ?? curveLinear;\n\n return (points, sink): void => {\n let segment: Point[] = [];\n\n const flush = (): void => {\n if (segment.length > 0) {\n curve(segment, sink);\n segment = [];\n }\n };\n\n for (const point of points) {\n if (isDefinedPoint(point)) {\n segment.push(point);\n } else {\n flush();\n }\n }\n\n flush();\n };\n}\r\n","import type { Point } from '../types';\nimport { curveLinear, type Curve } from './curves';\nimport type { PathSink } from './sink';\n\nexport interface AreaPoint {\n x: number;\n y0: number;\n y1: number;\n}\n\nexport interface AreaOptions {\n curve?: Curve;\n}\n\nconst isDefinedAreaPoint = (point: AreaPoint): boolean =>\n !Number.isNaN(point.x) && !Number.isNaN(point.y0) && !Number.isNaN(point.y1);\n\nfunction continuingSink(sink: PathSink): PathSink {\n let firstMove = true;\n\n return {\n moveTo(x, y): void {\n if (firstMove) {\n firstMove = false;\n sink.lineTo(x, y);\n } else {\n sink.moveTo(x, y);\n }\n },\n lineTo: sink.lineTo.bind(sink),\n bezierCurveTo: sink.bezierCurveTo.bind(sink),\n quadraticCurveTo: sink.quadraticCurveTo.bind(sink),\n arc: sink.arc.bind(sink),\n closePath: sink.closePath.bind(sink),\n };\n}\n\nexport function area(opts: AreaOptions = {}): (points: AreaPoint[], sink: PathSink) => void {\n const curve = opts.curve ?? curveLinear;\n\n return (points, sink): void => {\n let segment: AreaPoint[] = [];\n\n const flush = (): void => {\n if (segment.length === 0) {\n return;\n }\n\n const top: Point[] = segment.map((point) => ({ x: point.x, y: point.y1 }));\n const bottom: Point[] = [...segment]\n .reverse()\n .map((point) => ({ x: point.x, y: point.y0 }));\n\n curve(top, sink);\n curve(bottom, continuingSink(sink));\n sink.closePath();\n segment = [];\n };\n\n for (const point of points) {\n if (isDefinedAreaPoint(point)) {\n segment.push(point);\n } else {\n flush();\n }\n }\n\n flush();\n };\n}\r\n","import type { PathSink } from './sink';\n\nexport interface ArcOptions {\n innerRadius: number;\n outerRadius: number;\n startAngle: number;\n endAngle: number;\n cornerRadius?: number;\n padAngle?: number;\n}\n\nconst TAU = Math.PI * 2;\nconst HALF_PI = Math.PI / 2;\nconst EPSILON = 1e-12;\n\nconst polarX = (cx: number, radius: number, angle: number): number => cx + radius * Math.cos(angle - HALF_PI);\nconst polarY = (cy: number, radius: number, angle: number): number => cy + radius * Math.sin(angle - HALF_PI);\n\n/**\n * Creates a pie/donut path generator.\n *\n * Angles are radians with 0 at 12 o'clock and positive angles moving clockwise.\n * `padAngle` symmetrically trims the angular span. `cornerRadius` is accepted for\n * API compatibility and clamped, but corners remain circular arc/radial joins.\n */\nexport function arc(opts: ArcOptions): (sink: PathSink, cx: number, cy: number) => void {\n const pad = Math.max(0, opts.padAngle ?? 0) / 2;\n const rawDelta = opts.endAngle - opts.startAngle;\n const direction = rawDelta < 0 ? -1 : 1;\n const startAngle = opts.startAngle + direction * pad;\n const endAngle = opts.endAngle - direction * pad;\n const delta = endAngle - startAngle;\n const outerRadius = Math.max(0, opts.outerRadius);\n const innerRadius = Math.min(Math.max(0, opts.innerRadius), outerRadius);\n const _cornerRadius = Math.min(Math.max(0, opts.cornerRadius ?? 0), (outerRadius - innerRadius) / 2);\n\n return (sink, cx, cy): void => {\n if (outerRadius <= 0 || Math.abs(delta) <= EPSILON) {\n sink.moveTo(cx, cy);\n sink.closePath();\n return;\n }\n\n const clockwise = delta >= 0;\n const canvasStart = startAngle - HALF_PI;\n const canvasEnd = endAngle - HALF_PI;\n const isFullCircle = Math.abs(rawDelta) >= TAU - EPSILON;\n\n sink.moveTo(polarX(cx, outerRadius, startAngle), polarY(cy, outerRadius, startAngle));\n sink.arc(cx, cy, outerRadius, canvasStart, isFullCircle ? canvasStart + direction * TAU : canvasEnd, !clockwise);\n\n if (innerRadius > 0) {\n if (isFullCircle) {\n sink.moveTo(polarX(cx, innerRadius, endAngle), polarY(cy, innerRadius, endAngle));\n } else {\n sink.lineTo(polarX(cx, innerRadius, endAngle), polarY(cy, innerRadius, endAngle));\n }\n sink.arc(\n cx,\n cy,\n innerRadius,\n isFullCircle ? canvasStart + direction * TAU : canvasEnd,\n canvasStart,\n clockwise,\n );\n } else if (!isFullCircle) {\n sink.lineTo(cx, cy);\n }\n\n sink.closePath();\n };\n}\r\n","import type { PathSink } from './sink';\n\nexport function roundedRect(\n sink: PathSink,\n x: number,\n y: number,\n w: number,\n h: number,\n radii: number | [number, number, number, number],\n): void {\n let left = x;\n let top = y;\n let width = w;\n let height = h;\n\n if (width < 0) {\n left += width;\n width = -width;\n }\n\n if (height < 0) {\n top += height;\n height = -height;\n }\n\n const radiusValues = Array.isArray(radii) ? radii : [radii, radii, radii, radii];\n const maxRadius = Math.min(width, height) / 2;\n const [topLeft, topRight, bottomRight, bottomLeft] = radiusValues.map((radius) =>\n Math.min(Math.max(0, radius), maxRadius),\n ) as [number, number, number, number];\n\n const right = left + width;\n const bottom = top + height;\n\n if (topLeft === 0 && topRight === 0 && bottomRight === 0 && bottomLeft === 0) {\n sink.moveTo(left, top);\n sink.lineTo(right, top);\n sink.lineTo(right, bottom);\n sink.lineTo(left, bottom);\n sink.lineTo(left, top);\n sink.closePath();\n return;\n }\n\n sink.moveTo(left + topLeft, top);\n sink.lineTo(right - topRight, top);\n if (topRight > 0) {\n sink.quadraticCurveTo(right, top, right, top + topRight);\n }\n\n sink.lineTo(right, bottom - bottomRight);\n if (bottomRight > 0) {\n sink.quadraticCurveTo(right, bottom, right - bottomRight, bottom);\n }\n\n sink.lineTo(left + bottomLeft, bottom);\n if (bottomLeft > 0) {\n sink.quadraticCurveTo(left, bottom, left, bottom - bottomLeft);\n }\n\n sink.lineTo(left, top + topLeft);\n if (topLeft > 0) {\n sink.quadraticCurveTo(left, top, left + topLeft, top);\n }\n\n sink.closePath();\n}\r\n","/**\r\n * Deterministic randomness for the hand-drawn (\"sketch\") renderer.\r\n *\r\n * Every wobble in a sketched chart comes from this PRNG, seeded from the spec so\r\n * a given chart renders pixel-identically on every paint — a hard requirement\r\n * for the screenshot harness (which waits on a stable `data-graphein-ready`).\r\n */\r\n\r\n/** A seeded pseudo-random source returning floats in [0, 1). */\r\nexport type Rng = () => number;\r\n\r\n/**\r\n * mulberry32 — a tiny, fast, well-distributed 32-bit PRNG. Same seed ⇒ same\r\n * stream, which is exactly what deterministic sketching needs.\r\n */\r\nexport function mulberry32(seed: number): Rng {\r\n let a = seed >>> 0;\r\n return (): number => {\r\n a = (a + 0x6d2b79f5) | 0;\r\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\r\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\r\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\r\n };\r\n}\r\n\r\n/**\r\n * FNV-1a string hash → 32-bit unsigned int. Used to derive a stable seed from a\r\n * spec's identity (type/title/data size) when the author doesn't pass one.\r\n */\r\nexport function hashString(input: string): number {\r\n let h = 0x811c9dc5;\r\n for (let i = 0; i < input.length; i++) {\r\n h ^= input.charCodeAt(i);\r\n h = Math.imul(h, 0x01000193);\r\n }\r\n return h >>> 0;\r\n}\r\n","/**\r\n * Geometry helpers for the rough engine: polygon hachure (parallel fill lines)\r\n * and the rotation math it needs. Kept pure and allocation-light so fills stay\r\n * cheap even on dense charts (heatmaps, stacked bars).\r\n */\r\n\r\nimport type { Point } from '../types';\r\n\r\n/** Rotate `p` by `angle` radians around `center`. */\r\nexport function rotatePoint(p: Point, center: Point, angle: number): Point {\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n const dx = p.x - center.x;\r\n const dy = p.y - center.y;\r\n return {\r\n x: center.x + dx * cos - dy * sin,\r\n y: center.y + dx * sin + dy * cos,\r\n };\r\n}\r\n\r\nfunction bboxCenter(points: readonly Point[]): Point {\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n let maxX = -Infinity;\r\n let maxY = -Infinity;\r\n for (const p of points) {\r\n if (p.x < minX) minX = p.x;\r\n if (p.y < minY) minY = p.y;\r\n if (p.x > maxX) maxX = p.x;\r\n if (p.y > maxY) maxY = p.y;\r\n }\r\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\r\n}\r\n\r\n/** A filled hachure stroke: a single straight segment from a to b. */\r\nexport type HachureSegment = [Point, Point];\r\n\r\n/**\r\n * Generate parallel scan-line segments that fill `polygon`, angled at\r\n * `angleDeg`. The classic rough.js fill: rotate the polygon flat, sweep\r\n * horizontal scan lines spaced `gap` apart, intersect each with the edges, pair\r\n * the crossings, then rotate the resulting segments back.\r\n *\r\n * `maxLines` caps density so a huge/under-spaced shape can't explode the segment\r\n * count (it widens the step instead) — important for performance on dense charts.\r\n */\r\nexport function polygonHachureLines(\r\n polygon: readonly Point[],\r\n gap: number,\r\n angleDeg: number,\r\n maxLines = 2400,\r\n): HachureSegment[] {\r\n if (polygon.length < 3) return [];\r\n\r\n const angle = (angleDeg * Math.PI) / 180;\r\n const center = bboxCenter(polygon);\r\n const rotated = polygon.map((p) => rotatePoint(p, center, -angle));\r\n\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n for (const p of rotated) {\r\n if (p.y < minY) minY = p.y;\r\n if (p.y > maxY) maxY = p.y;\r\n }\r\n const span = maxY - minY;\r\n if (span <= 0) return [];\r\n\r\n let step = Math.max(0.5, gap);\r\n if (span / step > maxLines) step = span / maxLines;\r\n\r\n const segments: HachureSegment[] = [];\r\n const xs: number[] = [];\r\n const n = rotated.length;\r\n\r\n for (let y = minY + step / 2; y < maxY; y += step) {\r\n xs.length = 0;\r\n for (let i = 0; i < n; i++) {\r\n const a = rotated[i];\r\n const b = rotated[(i + 1) % n];\r\n const y0 = a.y;\r\n const y1 = b.y;\r\n if (y0 === y1) continue;\r\n if ((y >= y0 && y < y1) || (y >= y1 && y < y0)) {\r\n const t = (y - y0) / (y1 - y0);\r\n xs.push(a.x + t * (b.x - a.x));\r\n }\r\n }\r\n if (xs.length < 2) continue;\r\n xs.sort((m, k) => m - k);\r\n for (let i = 0; i + 1 < xs.length; i += 2) {\r\n const p0 = rotatePoint({ x: xs[i], y }, center, angle);\r\n const p1 = rotatePoint({ x: xs[i + 1], y }, center, angle);\r\n segments.push([p0, p1]);\r\n }\r\n }\r\n return segments;\r\n}\r\n\r\n/**\r\n * Sample a circular arc into a polyline. Angles use the same convention as\r\n * `shape/arc`: 0 at 12 o'clock, positive clockwise. Inclusive of both ends.\r\n */\r\nexport function sampleArc(\r\n cx: number,\r\n cy: number,\r\n radius: number,\r\n startAngle: number,\r\n endAngle: number,\r\n segments: number,\r\n): Point[] {\r\n const out: Point[] = [];\r\n const count = Math.max(1, segments);\r\n for (let i = 0; i <= count; i++) {\r\n const a = startAngle + ((endAngle - startAngle) * i) / count;\r\n out.push({\r\n x: cx + radius * Math.cos(a - Math.PI / 2),\r\n y: cy + radius * Math.sin(a - Math.PI / 2),\r\n });\r\n }\r\n return out;\r\n}\r\n","/**\r\n * Type vocabulary for the rough (hand-drawn) drawing engine.\r\n *\r\n * `RoughStyle` is the resolved set of knobs that controls how sketchy a chart\r\n * looks; it is produced once per chart (see `resolveSketch`) and handed to a\r\n * `RoughPen`. `MarkOptions` carries the per-mark colors plus any local overrides.\r\n */\r\n\r\n/** How closed shapes are filled. */\r\nexport type FillStyle = 'hachure' | 'solid' | 'cross-hatch';\r\n\r\n/** Resolved, fully-defaulted sketch knobs shared by every mark in a chart. */\r\nexport interface RoughStyle {\r\n /** Magnitude of the random wobble. 0 ≈ clean, 1 = default, >1 = wilder. */\r\n roughness: number;\r\n /** How much straight lines bow/curve between endpoints. */\r\n bowing: number;\r\n /** Fill treatment for closed shapes. */\r\n fillStyle: FillStyle;\r\n /** Spacing (px) between hachure lines. <= 0 derives from stroke width. */\r\n hachureGap: number;\r\n /** Hachure line angle in degrees. */\r\n hachureAngle: number;\r\n /** Outline width in px. */\r\n strokeWidth: number;\r\n /** PRNG seed — the source of all deterministic jitter. */\r\n seed: number;\r\n}\r\n\r\n/** Per-mark drawing options (colors + optional local style overrides). */\r\nexport interface MarkOptions extends Partial<RoughStyle> {\r\n /** Outline color. Omit to skip the outline. */\r\n stroke?: string;\r\n /** Fill color. Omit to skip the fill. */\r\n fill?: string;\r\n /** Hachure line width (defaults to a thin fraction of strokeWidth). */\r\n fillWeight?: number;\r\n /** Opacity applied to the fill only (0..1). */\r\n fillAlpha?: number;\r\n /** Opacity applied to the outline only (0..1). */\r\n strokeAlpha?: number;\r\n}\r\n\r\nexport const DEFAULT_ROUGH_STYLE: RoughStyle = {\r\n roughness: 1,\r\n bowing: 1,\r\n fillStyle: 'hachure',\r\n hachureGap: 0,\r\n hachureAngle: -41,\r\n strokeWidth: 1.4,\r\n seed: 1,\r\n};\r\n","/**\r\n * The rough (hand-drawn) drawing engine.\r\n *\r\n * A `RoughPen` wraps a Canvas2D-like context and a single seeded PRNG, exposing\r\n * the handful of primitives charts need — polylines, polygons, rects, circles,\r\n * and pie wedges — rendered as wobbly multi-pass strokes with hachure / solid /\r\n * cross-hatch fills. The shared PRNG means marks differ from one another yet the\r\n * whole chart is deterministic given its seed (call order is stable).\r\n *\r\n * The line model is a faithful port of rough.js's: each segment is a cubic with\r\n * two randomly displaced control points, drawn twice for the sketched, doubled\r\n * look; `bowing` bends the midpoint, `roughness` scales the jitter.\r\n */\r\n\r\nimport type { Point } from '../types';\r\nimport { mulberry32, type Rng } from './rng';\r\nimport { polygonHachureLines, sampleArc } from './geom';\r\nimport { DEFAULT_ROUGH_STYLE, type MarkOptions, type RoughStyle } from './types';\r\n\r\n/** The minimal Canvas2D surface the engine draws onto (CRC2D satisfies it). */\r\nexport interface RoughContext {\r\n save(): void;\r\n restore(): void;\r\n beginPath(): void;\r\n closePath(): void;\r\n moveTo(x: number, y: number): void;\r\n lineTo(x: number, y: number): void;\r\n bezierCurveTo(\r\n cp1x: number,\r\n cp1y: number,\r\n cp2x: number,\r\n cp2y: number,\r\n x: number,\r\n y: number,\r\n ): void;\r\n quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;\r\n stroke(): void;\r\n fill(): void;\r\n lineWidth: number;\r\n lineCap: CanvasLineCap;\r\n lineJoin: CanvasLineJoin;\r\n strokeStyle: string | CanvasGradient | CanvasPattern;\r\n fillStyle: string | CanvasGradient | CanvasPattern;\r\n globalAlpha: number;\r\n}\r\n\r\nconst MAX_OFFSET = 2;\r\nconst TAU = Math.PI * 2;\r\n\r\n// Trend-stroke wobble multipliers (see `RoughPen.trendStroke`). Trend lines are\r\n// many short segments where the default wobble is barely perceptible; these were\r\n// tuned so line/area/sparkline strokes read as clearly hand-drawn while still\r\n// tracking their data points closely.\r\nconst TREND_ROUGHNESS = 1.8;\r\nconst TREND_BOWING = 5;\r\n\r\nfunction isFinitePoint(p: Point): boolean {\r\n return Number.isFinite(p.x) && Number.isFinite(p.y);\r\n}\r\n\r\ninterface ResolvedMark extends RoughStyle {\r\n stroke?: string;\r\n fill?: string;\r\n fillWeight?: number;\r\n fillAlpha?: number;\r\n strokeAlpha?: number;\r\n}\r\n\r\nexport class RoughPen {\r\n private readonly ctx: RoughContext;\r\n private readonly base: RoughStyle;\r\n private readonly rng: Rng;\r\n\r\n constructor(ctx: RoughContext, style: Partial<RoughStyle> = {}) {\r\n this.ctx = ctx;\r\n this.base = { ...DEFAULT_ROUGH_STYLE, ...style };\r\n this.rng = mulberry32(this.base.seed >>> 0);\r\n }\r\n\r\n private resolve(opts: MarkOptions): ResolvedMark {\r\n return { ...this.base, ...opts };\r\n }\r\n\r\n /** A symmetric random offset in [-x, x], scaled by a length-based gain. */\r\n private off(x: number, gain: number): number {\r\n return gain * (this.rng() * 2 * x - x);\r\n }\r\n\r\n /**\r\n * Append one hand-drawn cubic from (x1,y1) to (x2,y2) to the current path.\r\n * `overlay` is the second, tighter pass that creates the doubled-stroke look.\r\n */\r\n private emitLine(\r\n x1: number,\r\n y1: number,\r\n x2: number,\r\n y2: number,\r\n m: ResolvedMark,\r\n move: boolean,\r\n overlay: boolean,\r\n ): void {\r\n const ctx = this.ctx;\r\n const len = Math.hypot(x2 - x1, y2 - y1);\r\n if (len < 0.0001) {\r\n if (move) ctx.moveTo(x1, y1);\r\n return;\r\n }\r\n\r\n let gain = 1;\r\n if (len > 500) gain = 0.4;\r\n else if (len > 200) gain = -0.0016668 * len + 1.233334;\r\n\r\n let offset = MAX_OFFSET;\r\n if (offset * 10 > len) offset = len / 10;\r\n offset *= m.roughness;\r\n\r\n const half = overlay ? offset / 2 : offset;\r\n const diverge = 0.2 + this.rng() * 0.2;\r\n\r\n let midX = (m.bowing * MAX_OFFSET * (y2 - y1)) / 200;\r\n let midY = (m.bowing * MAX_OFFSET * (x1 - x2)) / 200;\r\n midX = this.off(midX, gain);\r\n midY = this.off(midY, gain);\r\n\r\n if (move) ctx.moveTo(x1 + this.off(offset, gain), y1 + this.off(offset, gain));\r\n ctx.bezierCurveTo(\r\n midX + x1 + (x2 - x1) * diverge + this.off(half, gain),\r\n midY + y1 + (y2 - y1) * diverge + this.off(half, gain),\r\n midX + x1 + 2 * (x2 - x1) * diverge + this.off(half, gain),\r\n midY + y1 + 2 * (y2 - y1) * diverge + this.off(half, gain),\r\n x2 + this.off(half, gain),\r\n y2 + this.off(half, gain),\r\n );\r\n }\r\n\r\n /** Build a doubled hand-drawn stroke through `points` into the current path. */\r\n private tracePolyline(points: readonly Point[], m: ResolvedMark, close: boolean): void {\r\n for (let pass = 0; pass < 2; pass++) {\r\n for (let i = 0; i + 1 < points.length; i++) {\r\n const a = points[i];\r\n const b = points[i + 1];\r\n if (!isFinitePoint(a) || !isFinitePoint(b)) continue;\r\n const startsNew = i === 0 || !isFinitePoint(points[i - 1]);\r\n this.emitLine(a.x, a.y, b.x, b.y, m, startsNew, pass === 1);\r\n }\r\n if (close && points.length > 2) {\r\n const a = points[points.length - 1];\r\n const b = points[0];\r\n if (isFinitePoint(a) && isFinitePoint(b)) {\r\n this.emitLine(a.x, a.y, b.x, b.y, m, true, pass === 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Trace a smooth *closed* loop through `points` (quadratic spline through the\r\n * segment midpoints, with each point as a control). Used for circles so they\r\n * read as round hand-drawn blobs rather than angular polygons.\r\n */\r\n private traceSmoothClosed(points: readonly Point[]): void {\r\n const ctx = this.ctx;\r\n const n = points.length;\r\n if (n < 3) {\r\n points.forEach((p, i) => (i === 0 ? ctx.moveTo(p.x, p.y) : ctx.lineTo(p.x, p.y)));\r\n return;\r\n }\r\n const last = points[n - 1];\r\n const first = points[0];\r\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\r\n for (let i = 0; i < n; i++) {\r\n const curr = points[i];\r\n const next = points[(i + 1) % n];\r\n ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);\r\n }\r\n ctx.closePath();\r\n }\r\n\r\n private applyStroke(m: ResolvedMark, weight = m.strokeWidth): void {\r\n const ctx = this.ctx;\r\n ctx.lineWidth = weight;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.strokeStyle = m.stroke ?? '#000';\r\n ctx.globalAlpha = m.strokeAlpha ?? 1;\r\n ctx.stroke();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n /** Fill a closed polygon with hachure / cross-hatch / solid. */\r\n private fillPolygon(points: readonly Point[], m: ResolvedMark): void {\r\n if (!m.fill) return;\r\n const ctx = this.ctx;\r\n\r\n if (m.fillStyle === 'solid') {\r\n ctx.beginPath();\r\n this.tracePolyline(points, { ...m, roughness: m.roughness * 0.6 }, true);\r\n ctx.closePath();\r\n ctx.fillStyle = m.fill;\r\n ctx.globalAlpha = m.fillAlpha ?? 1;\r\n ctx.fill();\r\n ctx.globalAlpha = 1;\r\n return;\r\n }\r\n\r\n const gap = m.hachureGap > 0 ? m.hachureGap : Math.max(3, m.strokeWidth * 3.2);\r\n const angles =\r\n m.fillStyle === 'cross-hatch' ? [m.hachureAngle, m.hachureAngle + 90] : [m.hachureAngle];\r\n const weight = m.fillWeight ?? Math.max(0.7, m.strokeWidth * 0.55);\r\n\r\n ctx.beginPath();\r\n for (const angle of angles) {\r\n const segments = polygonHachureLines(points, gap, angle);\r\n for (const [p0, p1] of segments) {\r\n this.emitLine(p0.x, p0.y, p1.x, p1.y, m, true, false);\r\n }\r\n }\r\n ctx.lineWidth = weight;\r\n ctx.lineCap = 'round';\r\n ctx.strokeStyle = m.fill;\r\n ctx.globalAlpha = m.fillAlpha ?? 0.85;\r\n ctx.stroke();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n /** Hand-drawn open polyline (axis rules, box-plot whiskers, short features). */\r\n polyline(points: readonly Point[], opts: MarkOptions = {}): void {\r\n const m = this.resolve(opts);\r\n if (points.length < 2) return;\r\n this.ctx.beginPath();\r\n this.tracePolyline(points, m, false);\r\n this.applyStroke(m);\r\n }\r\n\r\n /**\r\n * Hand-drawn open stroke for data *trend* lines — line/area tops and KPI\r\n * sparklines. A trend line is many short segments, and both the bowing\r\n * (length-scaled) and the per-segment endpoint jitter stay tiny on short\r\n * segments, so a plain {@link polyline} reads almost ruler-straight — out of\r\n * keeping with the confidently wobbly bars/wedges. This amplifies the wobble\r\n * so trend lines read as clearly hand-drawn. Axis rules and box-plot features\r\n * keep the subtler {@link polyline} (a long axis rule would over-bow here).\r\n */\r\n trendStroke(points: readonly Point[], opts: MarkOptions = {}): void {\r\n const m = this.resolve(opts);\r\n if (points.length < 2) return;\r\n const wobbly: ResolvedMark = {\r\n ...m,\r\n roughness: m.roughness * TREND_ROUGHNESS,\r\n bowing: m.bowing * TREND_BOWING,\r\n };\r\n this.ctx.beginPath();\r\n this.tracePolyline(points, wobbly, false);\r\n this.applyStroke(m);\r\n }\r\n\r\n\r\n /** Hand-drawn closed polygon with optional fill (drawn behind the outline). */\r\n polygon(points: readonly Point[], opts: MarkOptions = {}): void {\r\n const m = this.resolve(opts);\r\n const clean = points.filter(isFinitePoint);\r\n if (clean.length < 2) return;\r\n if (m.fill) this.fillPolygon(clean, m);\r\n if (m.stroke) {\r\n this.ctx.beginPath();\r\n this.tracePolyline(clean, m, true);\r\n this.applyStroke(m);\r\n }\r\n }\r\n\r\n /** Hand-drawn rectangle (bars, cells, table chips). */\r\n rect(x: number, y: number, w: number, h: number, opts: MarkOptions = {}): void {\r\n if (w <= 0 || h <= 0) return;\r\n this.polygon(\r\n [\r\n { x, y },\r\n { x: x + w, y },\r\n { x: x + w, y: y + h },\r\n { x, y: y + h },\r\n ],\r\n opts,\r\n );\r\n }\r\n\r\n /** Hand-drawn circle (scatter points, line markers). Filled solid for clarity. */\r\n circle(cx: number, cy: number, r: number, opts: MarkOptions = {}): void {\r\n if (r <= 0) return;\r\n const m = this.resolve(opts);\r\n const ctx = this.ctx;\r\n // Enough segments (and a smooth spline) to read as round even for big bubbles;\r\n // gentle radial jitter so it wobbles like a hand-drawn circle, not a heptagon.\r\n const segs = Math.max(12, Math.min(40, Math.round(r * 1.2)));\r\n const jitter = m.roughness * Math.min(Math.max(r * 0.06, 0.3), 1.4);\r\n const start = this.rng() * TAU;\r\n const pts: Point[] = [];\r\n for (let i = 0; i < segs; i++) {\r\n const a = start + (i / segs) * TAU;\r\n const rr = r + (this.rng() * 2 - 1) * jitter;\r\n pts.push({ x: cx + rr * Math.cos(a), y: cy + rr * Math.sin(a) });\r\n }\r\n\r\n if (m.fill) {\r\n ctx.beginPath();\r\n this.traceSmoothClosed(pts);\r\n ctx.fillStyle = m.fill;\r\n ctx.globalAlpha = m.fillAlpha ?? 1;\r\n ctx.fill();\r\n ctx.globalAlpha = 1;\r\n }\r\n if (m.stroke) {\r\n ctx.beginPath();\r\n this.traceSmoothClosed(pts);\r\n this.applyStroke(m);\r\n }\r\n }\r\n\r\n /**\r\n * Hand-drawn pie/donut wedge. Angles match `shape/arc`: 0 at 12 o'clock,\r\n * positive clockwise. `innerRadius` 0 draws a full pie slice to the center.\r\n */\r\n wedge(\r\n cx: number,\r\n cy: number,\r\n innerRadius: number,\r\n outerRadius: number,\r\n startAngle: number,\r\n endAngle: number,\r\n opts: MarkOptions = {},\r\n ): void {\r\n if (outerRadius <= 0 || endAngle === startAngle) return;\r\n const span = Math.abs(endAngle - startAngle);\r\n const segs = Math.max(2, Math.min(64, Math.round((span / Math.PI) * 24)));\r\n const outer = sampleArc(cx, cy, outerRadius, startAngle, endAngle, segs);\r\n\r\n let polygon: Point[];\r\n if (innerRadius > 0.5) {\r\n const inner = sampleArc(cx, cy, innerRadius, endAngle, startAngle, segs);\r\n polygon = [...outer, ...inner];\r\n } else {\r\n polygon = [...outer, { x: cx, y: cy }];\r\n }\r\n this.polygon(polygon, opts);\r\n }\r\n}\r\n\r\n/** Convenience factory mirroring the class constructor. */\r\nexport function createRoughPen(ctx: RoughContext, style: Partial<RoughStyle> = {}): RoughPen {\r\n return new RoughPen(ctx, style);\r\n}\r\n","/**\r\n * Largest-Triangle-Three-Buckets (LTTB) downsampling.\r\n *\r\n * LTTB reduces a dense series to a target point count while preserving the\r\n * visual shape far better than naive every-Nth sampling — it keeps peaks,\r\n * troughs, and the first/last points. We run it draw-side on pixel-projected\r\n * points so a 100k-point line still strokes in ~plot-width segments.\r\n *\r\n * The decimator is generic over the point type (line uses {x,y}; area uses\r\n * {x,y0,y1}) via x/y accessors, and is gap-aware: runs separated by a\r\n * non-finite point are decimated independently and rejoined with a gap, so\r\n * missing-value breaks survive downsampling.\r\n */\r\n\r\nfunction finite(n: number): boolean {\r\n return Number.isFinite(n);\r\n}\r\n\r\n/** Core LTTB over a fully-finite run. Returns at most `threshold` points. */\r\nexport function lttbRun<T>(\r\n run: readonly T[],\r\n threshold: number,\r\n getX: (p: T) => number,\r\n getY: (p: T) => number,\r\n): T[] {\r\n const n = run.length;\r\n if (threshold >= n || threshold < 3) return run.slice();\r\n\r\n const sampled: T[] = [run[0]];\r\n const bucketSize = (n - 2) / (threshold - 2);\r\n let a = 0; // index of the last sampled point\r\n\r\n for (let i = 0; i < threshold - 2; i++) {\r\n // Average point of the *next* bucket (the triangle's far vertex).\r\n let rangeStart = Math.floor((i + 1) * bucketSize) + 1;\r\n let rangeEnd = Math.floor((i + 2) * bucketSize) + 1;\r\n rangeEnd = Math.min(rangeEnd, n);\r\n rangeStart = Math.min(rangeStart, rangeEnd);\r\n let avgX = 0;\r\n let avgY = 0;\r\n const avgCount = Math.max(1, rangeEnd - rangeStart);\r\n for (let j = rangeStart; j < rangeEnd; j++) {\r\n avgX += getX(run[j]);\r\n avgY += getY(run[j]);\r\n }\r\n avgX /= avgCount;\r\n avgY /= avgCount;\r\n\r\n // Pick the point in the *current* bucket with the largest triangle area.\r\n const curStart = Math.floor(i * bucketSize) + 1;\r\n const curEnd = Math.min(Math.floor((i + 1) * bucketSize) + 1, n - 1);\r\n const ax = getX(run[a]);\r\n const ay = getY(run[a]);\r\n let best = curStart;\r\n let bestArea = -1;\r\n for (let j = curStart; j < curEnd; j++) {\r\n const area = Math.abs(\r\n (ax - avgX) * (getY(run[j]) - ay) - (ax - getX(run[j])) * (avgY - ay),\r\n );\r\n if (area > bestArea) {\r\n bestArea = area;\r\n best = j;\r\n }\r\n }\r\n sampled.push(run[best]);\r\n a = best;\r\n }\r\n\r\n sampled.push(run[n - 1]);\r\n return sampled;\r\n}\r\n\r\nexport interface DecimateOptions<T> {\r\n getX: (p: T) => number;\r\n getY: (p: T) => number;\r\n /** Produce a gap marker placed between decimated runs. */\r\n gap: () => T;\r\n}\r\n\r\n/**\r\n * Gap-aware LTTB. Splits `points` on non-finite (x or y) markers, decimates each\r\n * finite run to a share of `threshold` proportional to its length, and rejoins\r\n * the runs with a single gap marker. When the finite total already fits within\r\n * `threshold`, the input is returned unchanged (gaps preserved).\r\n */\r\nexport function decimate<T>(\r\n points: readonly T[],\r\n threshold: number,\r\n opts: DecimateOptions<T>,\r\n): T[] {\r\n const { getX, getY, gap } = opts;\r\n if (points.length === 0) return [];\r\n\r\n const runs: T[][] = [];\r\n let cur: T[] = [];\r\n let finiteCount = 0;\r\n for (const p of points) {\r\n if (finite(getX(p)) && finite(getY(p))) {\r\n cur.push(p);\r\n finiteCount++;\r\n } else if (cur.length) {\r\n runs.push(cur);\r\n cur = [];\r\n }\r\n }\r\n if (cur.length) runs.push(cur);\r\n\r\n if (threshold < 3 || finiteCount <= threshold || runs.length === 0) {\r\n return points.slice();\r\n }\r\n\r\n const out: T[] = [];\r\n for (let r = 0; r < runs.length; r++) {\r\n if (r > 0) out.push(gap());\r\n const run = runs[r];\r\n const budget = Math.max(2, Math.round((threshold * run.length) / finiteCount));\r\n const sampled = budget >= run.length ? run : lttbRun(run, budget, getX, getY);\r\n for (const p of sampled) out.push(p);\r\n }\r\n return out;\r\n}\r\n","export type EasingFunction = (t: number) => number;\r\n\r\nconst overshoot = 1.70158;\r\n\r\nfunction endpoint(t: number): 0 | 1 | undefined {\r\n if (t === 0) {\r\n return 0;\r\n }\r\n if (t === 1) {\r\n return 1;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function linear(t: number): number {\r\n return t;\r\n}\r\n\r\nexport function quadIn(t: number): number {\r\n return t * t;\r\n}\r\n\r\nexport function quadOut(t: number): number {\r\n return t * (2 - t);\r\n}\r\n\r\nexport function quadInOut(t: number): number {\r\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\r\n}\r\n\r\nexport function cubicIn(t: number): number {\r\n return t * t * t;\r\n}\r\n\r\nexport function cubicOut(t: number): number {\r\n const u = t - 1;\r\n return u * u * u + 1;\r\n}\r\n\r\nexport function cubicInOut(t: number): number {\r\n const u = 2 * t - 2;\r\n return t < 0.5 ? 4 * t * t * t : 0.5 * u * u * u + 1;\r\n}\r\n\r\nexport function expoOut(t: number): number {\r\n const end = endpoint(t);\r\n return end ?? 1 - 2 ** (-10 * t);\r\n}\r\n\r\nexport function expoInOut(t: number): number {\r\n const end = endpoint(t);\r\n if (end !== undefined) {\r\n return end;\r\n }\r\n return t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2;\r\n}\r\n\r\nexport function sinInOut(t: number): number {\r\n const end = endpoint(t);\r\n return end ?? -(Math.cos(Math.PI * t) - 1) / 2;\r\n}\r\n\r\nexport function backOut(t: number): number {\r\n const end = endpoint(t);\r\n if (end !== undefined) {\r\n return end;\r\n }\r\n const u = t - 1;\r\n return 1 + (overshoot + 1) * u * u * u + overshoot * u * u;\r\n}\r\n\r\nexport function bounceOut(t: number): number {\r\n const end = endpoint(t);\r\n if (end !== undefined) {\r\n return end;\r\n }\r\n\r\n const n1 = 7.5625;\r\n const d1 = 2.75;\r\n\r\n if (t < 1 / d1) {\r\n return n1 * t * t;\r\n }\r\n if (t < 2 / d1) {\r\n const u = t - 1.5 / d1;\r\n return n1 * u * u + 0.75;\r\n }\r\n if (t < 2.5 / d1) {\r\n const u = t - 2.25 / d1;\r\n return n1 * u * u + 0.9375;\r\n }\r\n\r\n const u = t - 2.625 / d1;\r\n return n1 * u * u + 0.984375;\r\n}\r\n\r\nexport function elasticOut(t: number): number {\r\n const end = endpoint(t);\r\n if (end !== undefined) {\r\n return end;\r\n }\r\n\r\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1;\r\n}\r\n\r\nexport const easings: Record<string, EasingFunction> = {\r\n linear,\r\n quadIn,\r\n quadOut,\r\n quadInOut,\r\n cubicIn,\r\n cubicOut,\r\n cubicInOut,\r\n expoOut,\r\n expoInOut,\r\n sinInOut,\r\n backOut,\r\n bounceOut,\r\n elasticOut,\r\n};\r\n","import { linear } from './easing';\r\n\r\nexport interface AnimateOptions {\r\n duration: number;\r\n easing?: (t: number) => number;\r\n onUpdate: (t: number) => void;\r\n onComplete?: () => void;\r\n now?: () => number;\r\n raf?: (cb: (t: number) => void) => number;\r\n cancelRaf?: (handle: number) => void;\r\n}\r\n\r\nexport interface AnimationHandle {\r\n cancel(): void;\r\n}\r\n\r\nfunction defaultNow(): number {\r\n return globalThis.performance?.now() ?? Date.now();\r\n}\r\n\r\nfunction defaultRaf(cb: (t: number) => void): number {\r\n if (globalThis.requestAnimationFrame !== undefined) {\r\n return globalThis.requestAnimationFrame(cb);\r\n }\r\n\r\n return globalThis.setTimeout(() => cb(defaultNow()), 16) as unknown as number;\r\n}\r\n\r\nfunction defaultCancelRaf(handle: number): void {\r\n if (globalThis.cancelAnimationFrame !== undefined) {\r\n globalThis.cancelAnimationFrame(handle);\r\n return;\r\n }\r\n\r\n globalThis.clearTimeout(handle);\r\n}\r\n\r\nfunction clamp01(value: number): number {\r\n return Math.min(1, Math.max(0, value));\r\n}\r\n\r\nexport function animate(opts: AnimateOptions): AnimationHandle {\r\n const easing = opts.easing ?? linear;\r\n\r\n if (opts.duration <= 0) {\r\n opts.onUpdate(easing(1));\r\n opts.onComplete?.();\r\n return {\r\n cancel(): void {\r\n return;\r\n },\r\n };\r\n }\r\n\r\n const now = opts.now ?? defaultNow;\r\n const raf = opts.raf ?? defaultRaf;\r\n const cancelRaf = opts.cancelRaf ?? defaultCancelRaf;\r\n const start = now();\r\n let cancelled = false;\r\n let completed = false;\r\n let frame: number | undefined;\r\n\r\n const step = (): void => {\r\n if (cancelled || completed) {\r\n return;\r\n }\r\n\r\n const rawT = clamp01((now() - start) / opts.duration);\r\n opts.onUpdate(easing(rawT));\r\n\r\n if (rawT >= 1) {\r\n completed = true;\r\n opts.onComplete?.();\r\n return;\r\n }\r\n\r\n frame = raf(step);\r\n };\r\n\r\n frame = raf(step);\r\n\r\n return {\r\n cancel(): void {\r\n if (cancelled || completed) {\r\n return;\r\n }\r\n cancelled = true;\r\n if (frame !== undefined) {\r\n cancelRaf(frame);\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Entrance-animation resolution.\r\n *\r\n * Pure policy that turns a spec's `animation` field (plus environment signals:\r\n * `prefers-reduced-motion` and a global screenshot kill-switch) into concrete\r\n * `{ enabled, duration, easing }`. Kept DOM-free so it's trivially unit-tested;\r\n * the runtime drives the actual frames.\r\n */\r\n\r\nimport { cubicOut, easings, type EasingFunction } from './easing';\r\nimport type { AnimationConfig } from '../spec/types';\r\n\r\nexport interface ResolvedEntrance {\r\n enabled: boolean;\r\n /** Milliseconds. */\r\n duration: number;\r\n easing: EasingFunction;\r\n}\r\n\r\n/** Default entrance duration (ms) when a spec enables animation without one. */\r\nexport const DEFAULT_ENTRANCE_DURATION = 480;\r\n\r\nconst DISABLED: ResolvedEntrance = { enabled: false, duration: 0, easing: cubicOut };\r\n\r\nexport interface EntranceContext {\r\n /** Honor the OS \"reduce motion\" setting (disables animation). */\r\n reducedMotion?: boolean;\r\n /** Global kill-switch (e.g. screenshot/automation harnesses). */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * Resolve the effective entrance animation. Motion is suppressed when reduced\r\n * motion is requested, when globally disabled, or when the spec opts out\r\n * (`animation: false` / `{ enabled: false }` / non-positive duration).\r\n */\r\nexport function resolveEntrance(\r\n animation: AnimationConfig | boolean | undefined,\r\n ctx: EntranceContext = {},\r\n): ResolvedEntrance {\r\n if (ctx.disabled || ctx.reducedMotion) return DISABLED;\r\n if (animation === false) return DISABLED;\r\n\r\n const cfg: AnimationConfig = animation && typeof animation === 'object' ? animation : {};\r\n if (cfg.enabled === false) return DISABLED;\r\n\r\n const duration = cfg.duration ?? DEFAULT_ENTRANCE_DURATION;\r\n if (!(duration > 0)) return DISABLED;\r\n\r\n const easing = (cfg.easing ? easings[cfg.easing] : undefined) ?? cubicOut;\r\n return { enabled: true, duration, easing };\r\n}\r\n","export function prefersReducedMotion(): boolean {\r\n return globalThis.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\r\n}\r\n","export function interpolateNumber(a: number, b: number): (t: number) => number {\r\n const delta = b - a;\r\n return (t: number) => {\r\n if (t === 0) {\r\n return a;\r\n }\r\n if (t === 1) {\r\n return b;\r\n }\r\n return a + delta * t;\r\n };\r\n}\r\n\r\nexport function interpolateArray(a: number[], b: number[]): (t: number) => number[] {\r\n const interpolators = a.map((value, index) => interpolateNumber(value, b[index] ?? value));\r\n return (t: number) => interpolators.map((interpolate) => interpolate(t));\r\n}\r\n\r\nexport function interpolateObject<T extends Record<string, number>>(a: T, b: T): (t: number) => T {\r\n const keys = Object.keys(a) as (keyof T)[];\r\n const interpolators = keys.map((key) => [key, interpolateNumber(a[key], b[key])] as const);\r\n\r\n return (t: number) => {\r\n const out = {} as T;\r\n for (const [key, interpolate] of interpolators) {\r\n out[key] = interpolate(t) as T[typeof key];\r\n }\r\n return out;\r\n };\r\n}\r\n\r\nexport function interpolateNumberArray(\r\n a: ArrayLike<number>,\r\n b: ArrayLike<number>,\r\n): (t: number) => number[] {\r\n const length = a.length;\r\n const interpolators = Array.from({ length }, (_, index) => interpolateNumber(a[index], b[index] ?? a[index]));\r\n return (t: number) => interpolators.map((interpolate) => interpolate(t));\r\n}\r\n","/**\r\n * Update-transition resolution.\r\n *\r\n * Pure policy (mirrors {@link resolveEntrance}) that turns a spec's `animation`\r\n * field — plus environment signals (`prefers-reduced-motion` and the global\r\n * screenshot kill-switch) — into concrete `{ enabled, duration, easing }` for the\r\n * cross-fade played when a chart's data/config changes via `update()`. Kept\r\n * DOM-free so it's trivially unit-tested; the runtime drives the actual frames.\r\n */\r\n\r\nimport { cubicInOut, easings, type EasingFunction } from './easing';\r\nimport type { ResolvedEntrance } from './entrance';\r\nimport type { AnimationConfig } from '../spec/types';\r\n\r\n/** Default update cross-fade duration (ms). Snappier than the entrance. */\r\nexport const DEFAULT_UPDATE_DURATION = 360;\r\n\r\nconst DISABLED: ResolvedEntrance = { enabled: false, duration: 0, easing: cubicInOut };\r\n\r\nexport interface UpdateContext {\r\n /** Honor the OS \"reduce motion\" setting (disables animation). */\r\n reducedMotion?: boolean;\r\n /** Global kill-switch (e.g. screenshot/automation harnesses). */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * Resolve the effective update transition. Motion is suppressed when reduced\r\n * motion is requested, when globally disabled, or when the spec opts out\r\n * (`animation: false` / `{ enabled: false }` / non-positive duration). A custom\r\n * `easing` defaults to `cubicInOut` (symmetric — reads well for a cross-fade).\r\n */\r\nexport function resolveUpdate(\r\n animation: AnimationConfig | boolean | undefined,\r\n ctx: UpdateContext = {},\r\n): ResolvedEntrance {\r\n if (ctx.disabled || ctx.reducedMotion) return { ...DISABLED };\r\n if (animation === false) return { ...DISABLED };\r\n\r\n const cfg: AnimationConfig = animation && typeof animation === 'object' ? animation : {};\r\n if (cfg.enabled === false) return { ...DISABLED };\r\n\r\n const duration = cfg.duration ?? DEFAULT_UPDATE_DURATION;\r\n if (!(duration > 0)) return { ...DISABLED };\r\n\r\n const easing: EasingFunction = (cfg.easing ? easings[cfg.easing] : undefined) ?? cubicInOut;\r\n return { enabled: true, duration, easing };\r\n}\r\n","/**\r\n * Accessible descriptions for charts.\r\n *\r\n * Canvas marks are invisible to assistive technology, so every chart needs a\r\n * concise accessible *name* (what it is) plus, for canvas-drawn charts, a\r\n * visually-hidden data table (the numbers behind it — see `./table`). This\r\n * module owns the pure, DOM-free summarization logic.\r\n */\r\n\r\nimport type { ChartSpec } from '../spec/types';\r\n\r\nconst TYPE_LABELS: Record<string, string> = {\r\n line: 'Line chart',\r\n area: 'Area chart',\r\n bar: 'Bar chart',\r\n scatter: 'Scatter plot',\r\n pie: 'Pie chart',\r\n heatmap: 'Heatmap',\r\n kpi: 'KPI card',\r\n table: 'Data table',\r\n matrix: 'Pivot matrix',\r\n};\r\n\r\n/** Human-readable label for a chart type (e.g. `'bar'` → `'Bar chart'`). */\r\nexport function chartTypeLabel(type: string): string {\r\n return TYPE_LABELS[type] ?? 'Chart';\r\n}\r\n\r\n/** Extract the chart's title text from a `string | TitleConfig` title field. */\r\nexport function chartTitleText(spec: ChartSpec): string | undefined {\r\n const t = spec.title;\r\n if (typeof t === 'string') return t.trim() || undefined;\r\n if (t && typeof t === 'object') {\r\n const text = t.text;\r\n return typeof text === 'string' && text.trim() ? text.trim() : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport interface ChartSummary {\r\n /** Concise accessible name for the chart root (used as `aria-label`). */\r\n label: string;\r\n /** Number of data rows backing the chart. */\r\n rowCount: number;\r\n}\r\n\r\n/**\r\n * Build a concise accessible name for a chart. An explicit `spec.description`\r\n * always wins (agents can supply precise alt text); otherwise we synthesize\r\n * `\"<Type>: <title>. <n> data points.\"` from the spec.\r\n */\r\nexport function summarizeChart(spec: ChartSpec): ChartSummary {\r\n const rowCount = Array.isArray(spec.data) ? spec.data.length : 0;\r\n\r\n const description = spec.description;\r\n if (typeof description === 'string' && description.trim()) {\r\n return { label: description.trim(), rowCount };\r\n }\r\n\r\n const type = chartTypeLabel(spec.type);\r\n const title =\r\n chartTitleText(spec) ?? (spec.type === 'kpi' ? (spec as { label?: string }).label : undefined);\r\n\r\n let label = type;\r\n if (title) label += `: ${title}`;\r\n if (rowCount > 0 && spec.type !== 'kpi') {\r\n label += `. ${rowCount} data point${rowCount === 1 ? '' : 's'}.`;\r\n }\r\n return { label, rowCount };\r\n}\r\n","/**\r\n * Visually-hidden data-table fallback.\r\n *\r\n * For canvas-drawn charts (line/area/bar/scatter/pie/heatmap) the values live\r\n * only in pixels, so we mirror the chart's `data` into an off-screen semantic\r\n * `<table>`. Screen-reader users get the real numbers; sighted users see\r\n * nothing. Charts that already render real DOM text (table/matrix/kpi) don't\r\n * need this.\r\n */\r\n\r\nimport type { ChartSpec } from '../spec/types';\r\nimport type { Datum } from '../types';\r\nimport { summarizeChart } from './describe';\r\n\r\n/** Canonical \"visually hidden\" style — present to AT, invisible on screen. */\r\nexport const SR_ONLY_STYLE =\r\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;' +\r\n 'clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;';\r\n\r\n/** Cap rows so assistive tech isn't flooded by huge datasets. */\r\nconst MAX_ROWS = 100;\r\n\r\n/** Stable union of keys across (possibly heterogeneous) rows, in first-seen order. */\r\nfunction columnsOf(data: readonly Datum[]): string[] {\r\n const seen = new Set<string>();\r\n const columns: string[] = [];\r\n for (const row of data) {\r\n if (row && typeof row === 'object') {\r\n for (const key of Object.keys(row)) {\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n columns.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return columns;\r\n}\r\n\r\nfunction cellText(value: unknown): string {\r\n if (value == null) return '';\r\n if (value instanceof Date) return value.toISOString();\r\n return String(value);\r\n}\r\n\r\n/**\r\n * Build a visually-hidden `<table>` mirroring the chart's data. Returns `null`\r\n * when there is nothing useful to tabulate (no rows or no columns).\r\n */\r\nexport function buildDataTableFallback(spec: ChartSpec): HTMLTableElement | null {\r\n const data = Array.isArray(spec.data) ? spec.data : [];\r\n if (data.length === 0) return null;\r\n const columns = columnsOf(data);\r\n if (columns.length === 0) return null;\r\n\r\n const table = document.createElement('table');\r\n table.setAttribute('style', SR_ONLY_STYLE);\r\n\r\n const caption = document.createElement('caption');\r\n caption.textContent = summarizeChart(spec).label;\r\n table.appendChild(caption);\r\n\r\n const thead = document.createElement('thead');\r\n const headRow = document.createElement('tr');\r\n for (const column of columns) {\r\n const th = document.createElement('th');\r\n th.scope = 'col';\r\n th.textContent = column;\r\n headRow.appendChild(th);\r\n }\r\n thead.appendChild(headRow);\r\n table.appendChild(thead);\r\n\r\n const tbody = document.createElement('tbody');\r\n const limit = Math.min(data.length, MAX_ROWS);\r\n for (let i = 0; i < limit; i++) {\r\n const row = data[i] as Record<string, unknown>;\r\n const tr = document.createElement('tr');\r\n for (const column of columns) {\r\n const td = document.createElement('td');\r\n td.textContent = cellText(row?.[column]);\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n\r\n const hidden = data.length - limit;\r\n if (hidden > 0) {\r\n const footRow = document.createElement('tr');\r\n const td = document.createElement('td');\r\n td.colSpan = columns.length;\r\n td.textContent = `…and ${hidden} more row${hidden === 1 ? '' : 's'}`;\r\n footRow.appendChild(td);\r\n tbody.appendChild(footRow);\r\n }\r\n\r\n return table;\r\n}\r\n","/**\r\n * Apply accessibility semantics to a rendered chart Surface.\r\n *\r\n * Called by the runtime after each draw. Idempotent: safe to re-run on every\r\n * update/resize.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { ChartSpec, ChartType } from '../spec/types';\r\nimport { summarizeChart } from './describe';\r\nimport { buildDataTableFallback } from './table';\r\n\r\n/**\r\n * Chart types whose overlay already exposes their data as real DOM text\r\n * (table/matrix render a semantic `<table>`; kpi renders its value/label as\r\n * text), so they don't need a hidden data-table fallback.\r\n */\r\nconst SELF_DESCRIBING: ReadonlySet<ChartType> = new Set<ChartType>(['table', 'matrix', 'kpi']);\r\n\r\nexport function applyA11y(surface: Surface, spec: ChartSpec): void {\r\n const { root } = surface;\r\n\r\n // Present the chart as a named figure. Unlike role=\"img\", a figure keeps its\r\n // descendants (overlay text + the hidden data table) discoverable by AT.\r\n root.setAttribute('role', 'figure');\r\n root.setAttribute('aria-label', summarizeChart(spec).label);\r\n\r\n // Canvas layers are decorative — the data is conveyed via the overlay text\r\n // and/or the hidden data-table fallback.\r\n surface.marks.canvas.setAttribute('aria-hidden', 'true');\r\n surface.interaction.canvas.setAttribute('aria-hidden', 'true');\r\n\r\n // Rebuild the hidden data-table fallback (owns the a11y container).\r\n surface.a11y.replaceChildren();\r\n if (!SELF_DESCRIBING.has(spec.type)) {\r\n const table = buildDataTableFallback(spec);\r\n if (table) surface.a11y.appendChild(table);\r\n }\r\n}\r\n","import type { Datum } from '../types';\r\n\r\nexport type AggOp = 'sum' | 'mean' | 'avg' | 'min' | 'max' | 'count' | 'countDistinct' | 'median' | 'first' | 'last';\r\n\r\nexport interface PivotValueDef {\r\n field: string;\r\n op: AggOp;\r\n label?: string;\r\n}\r\n\r\nexport interface PivotOptions {\r\n rows?: string[];\r\n columns?: string[];\r\n values: PivotValueDef[];\r\n includeRowSubtotals?: boolean;\r\n includeColumnSubtotals?: boolean;\r\n includeGrandTotals?: boolean;\r\n sort?: 'asc' | 'desc' | 'none';\r\n}\r\n\r\nexport interface PivotHeaderNode {\r\n key: string;\r\n path: string[];\r\n depth: number;\r\n children: PivotHeaderNode[];\r\n isSubtotal?: boolean;\r\n isGrandTotal?: boolean;\r\n span: number;\r\n}\r\n\r\nexport interface PivotCell {\r\n values: (number | null)[];\r\n}\r\n\r\nexport interface PivotFlatRow {\r\n path: string[];\r\n depth: number;\r\n isSubtotal?: boolean;\r\n isGrandTotal?: boolean;\r\n label: string;\r\n cellsByColumnKey: Map<string, PivotCell>;\r\n}\r\n\r\nexport interface PivotResult {\r\n rowTree: PivotHeaderNode[];\r\n columnTree: PivotHeaderNode[];\r\n columnLeaves: PivotHeaderNode[];\r\n rows: PivotFlatRow[];\r\n values: PivotValueDef[];\r\n valueAt(rowPath: string[], colPath: string[], valueIndex: number): number | null;\r\n}\r\n\r\nexport type GroupedMap<T> = Map<string, GroupedMap<T> | T[]>;\r\n\r\nconst GRAND_TOTAL_LABEL = 'Grand Total';\r\nconst SUBTOTAL_LABEL = 'Total';\r\nconst PATH_SEPARATOR = '\\u0000';\r\n\r\nexport function aggregateValues(values: unknown[], op: AggOp): number | null {\r\n if (op === 'count') {\r\n return values.filter((value) => value !== null && value !== undefined).length;\r\n }\r\n\r\n if (values.length === 0) {\r\n return null;\r\n }\r\n\r\n if (op === 'countDistinct') {\r\n return new Set(values).size;\r\n }\r\n\r\n if (op === 'first') {\r\n return coerceFinite(values.find((value) => value !== null && value !== undefined));\r\n }\r\n\r\n if (op === 'last') {\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n const value = values[index];\r\n if (value !== null && value !== undefined) {\r\n return coerceFinite(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n const numbers = values.map(coerceFinite).filter((value): value is number => value !== null);\r\n if (numbers.length === 0) {\r\n return null;\r\n }\r\n\r\n switch (op) {\r\n case 'sum':\r\n return numbers.reduce((sum, value) => sum + value, 0);\r\n case 'mean':\r\n case 'avg':\r\n return numbers.reduce((sum, value) => sum + value, 0) / numbers.length;\r\n case 'min':\r\n return Math.min(...numbers);\r\n case 'max':\r\n return Math.max(...numbers);\r\n case 'median': {\r\n const sorted = [...numbers].sort((left, right) => left - right);\r\n const middle = Math.floor(sorted.length / 2);\r\n return sorted.length % 2 === 1 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function groupBy<T extends Record<string, unknown>>(rows: T[], keyFields: string[]): GroupedMap<T> {\r\n const grouped: GroupedMap<T> = new Map();\r\n\r\n for (const row of rows) {\r\n let current = grouped;\r\n for (let depth = 0; depth < keyFields.length; depth += 1) {\r\n const key = stringifyGroupKey(row[keyFields[depth]]);\r\n const isLeaf = depth === keyFields.length - 1;\r\n const existing = current.get(key);\r\n\r\n if (isLeaf) {\r\n if (Array.isArray(existing)) {\r\n existing.push(row);\r\n } else {\r\n current.set(key, [row]);\r\n }\r\n } else {\r\n if (existing instanceof Map) {\r\n current = existing;\r\n } else {\r\n const next: GroupedMap<T> = new Map();\r\n current.set(key, next);\r\n current = next;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return grouped;\r\n}\r\n\r\nexport function pivot(data: Datum[], options: PivotOptions): PivotResult {\r\n const rowFields = options.rows ?? [];\r\n const columnFields = options.columns ?? [];\r\n const sort = options.sort ?? 'asc';\r\n\r\n const rowTree = buildHeaderTree(data, rowFields, {\r\n includeSubtotals: options.includeRowSubtotals === true,\r\n includeGrandTotal: options.includeGrandTotals === true,\r\n sort,\r\n });\r\n const columnTree = buildHeaderTree(data, columnFields, {\r\n includeSubtotals: options.includeColumnSubtotals === true,\r\n includeGrandTotal: columnFields.length === 0 || options.includeGrandTotals === true,\r\n sort,\r\n });\r\n const columnLeaves = flattenColumnLeaves(columnTree);\r\n const flatRows = buildFlatRows(data, rowFields, columnLeaves, options, sort);\r\n\r\n const valueAt = (rowPath: string[], colPath: string[], valueIndex: number): number | null => {\r\n const valueDef = options.values[valueIndex];\r\n if (valueDef === undefined) {\r\n return null;\r\n }\r\n return aggregateMatching(data, rowFields, rowPath, columnFields, colPath, valueDef);\r\n };\r\n\r\n return {\r\n rowTree,\r\n columnTree,\r\n columnLeaves,\r\n rows: flatRows,\r\n values: options.values,\r\n valueAt,\r\n };\r\n}\r\n\r\nfunction buildFlatRows(\r\n data: Datum[],\r\n rowFields: string[],\r\n columnLeaves: PivotHeaderNode[],\r\n options: PivotOptions,\r\n sort: 'asc' | 'desc' | 'none',\r\n): PivotFlatRow[] {\r\n if (rowFields.length === 0) {\r\n return [makeFlatRow(data, [], 0, true, false, columnLeaves, options)];\r\n }\r\n\r\n const rows: PivotFlatRow[] = [];\r\n appendFlatRows(rows, data, rowFields, [], 0, columnLeaves, options, sort);\r\n\r\n if (options.includeGrandTotals === true) {\r\n rows.push(makeFlatRow(data, [], 0, true, false, columnLeaves, options));\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction appendFlatRows(\r\n out: PivotFlatRow[],\r\n data: Datum[],\r\n fields: string[],\r\n path: string[],\r\n depth: number,\r\n columnLeaves: PivotHeaderNode[],\r\n options: PivotOptions,\r\n sort: 'asc' | 'desc' | 'none',\r\n): void {\r\n const field = fields[depth];\r\n const groups = groupRowsAtDepth(data, field, sort);\r\n\r\n for (const [key, groupRows] of groups) {\r\n const nextPath = [...path, key];\r\n if (depth === fields.length - 1) {\r\n out.push(makeFlatRow(groupRows, nextPath, depth, false, false, columnLeaves, options));\r\n } else {\r\n appendFlatRows(out, groupRows, fields, nextPath, depth + 1, columnLeaves, options, sort);\r\n if (options.includeRowSubtotals === true) {\r\n out.push(makeFlatRow(groupRows, nextPath, depth, false, true, columnLeaves, options));\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction makeFlatRow(\r\n rowData: Datum[],\r\n path: string[],\r\n depth: number,\r\n isGrandTotal: boolean,\r\n isSubtotal: boolean,\r\n columnLeaves: PivotHeaderNode[],\r\n options: PivotOptions,\r\n): PivotFlatRow {\r\n const cellsByColumnKey = new Map<string, PivotCell>();\r\n const columnFields = options.columns ?? [];\r\n\r\n for (const columnLeaf of columnLeaves) {\r\n const columnKey = makePathKey(columnLeaf.path);\r\n cellsByColumnKey.set(columnKey, {\r\n values: options.values.map((valueDef) => aggregateMatching(rowData, [], [], columnFields, columnLeaf.path, valueDef)),\r\n });\r\n }\r\n\r\n return {\r\n path,\r\n depth,\r\n isGrandTotal: isGrandTotal || undefined,\r\n isSubtotal: isSubtotal || undefined,\r\n label: isGrandTotal ? GRAND_TOTAL_LABEL : isSubtotal ? SUBTOTAL_LABEL : path[path.length - 1] ?? GRAND_TOTAL_LABEL,\r\n cellsByColumnKey,\r\n };\r\n}\r\n\r\nfunction buildHeaderTree(\r\n data: Datum[],\r\n fields: string[],\r\n options: {\r\n includeSubtotals: boolean;\r\n includeGrandTotal: boolean;\r\n sort: 'asc' | 'desc' | 'none';\r\n },\r\n): PivotHeaderNode[] {\r\n const roots = fields.length === 0 ? [] : buildHeaderLevel(data, fields, [], 0, options);\r\n\r\n if (fields.length === 0 || options.includeGrandTotal) {\r\n roots.push({\r\n key: GRAND_TOTAL_LABEL,\r\n path: [],\r\n depth: 0,\r\n children: [],\r\n isGrandTotal: true,\r\n span: 1,\r\n });\r\n }\r\n\r\n return roots;\r\n}\r\n\r\nfunction buildHeaderLevel(\r\n data: Datum[],\r\n fields: string[],\r\n path: string[],\r\n depth: number,\r\n options: {\r\n includeSubtotals: boolean;\r\n includeGrandTotal: boolean;\r\n sort: 'asc' | 'desc' | 'none';\r\n },\r\n): PivotHeaderNode[] {\r\n const field = fields[depth];\r\n const groups = groupRowsAtDepth(data, field, options.sort);\r\n const nodes: PivotHeaderNode[] = [];\r\n\r\n for (const [key, groupRows] of groups) {\r\n const nextPath = [...path, key];\r\n const children = depth === fields.length - 1 ? [] : buildHeaderLevel(groupRows, fields, nextPath, depth + 1, options);\r\n\r\n if (children.length > 0 && options.includeSubtotals) {\r\n children.push({\r\n key: SUBTOTAL_LABEL,\r\n path: nextPath,\r\n depth: depth + 1,\r\n children: [],\r\n isSubtotal: true,\r\n span: 1,\r\n });\r\n }\r\n\r\n const span = children.length === 0 ? 1 : children.reduce((sum, child) => sum + child.span, 0);\r\n nodes.push({\r\n key,\r\n path: nextPath,\r\n depth,\r\n children,\r\n span,\r\n });\r\n }\r\n\r\n return nodes;\r\n}\r\n\r\nfunction flattenColumnLeaves(nodes: PivotHeaderNode[]): PivotHeaderNode[] {\r\n const leaves: PivotHeaderNode[] = [];\r\n for (const node of nodes) {\r\n if (node.children.length === 0) {\r\n leaves.push(node);\r\n } else {\r\n leaves.push(...flattenColumnLeaves(node.children));\r\n }\r\n }\r\n return leaves;\r\n}\r\n\r\nfunction aggregateMatching(\r\n data: Datum[],\r\n rowFields: string[],\r\n rowPath: string[],\r\n columnFields: string[],\r\n columnPath: string[],\r\n valueDef: PivotValueDef,\r\n): number | null {\r\n const matching = data.filter(\r\n (row) => pathMatches(row, rowFields, rowPath) && pathMatches(row, columnFields, columnPath),\r\n );\r\n return aggregateValues(\r\n matching.map((row) => row[valueDef.field]),\r\n valueDef.op,\r\n );\r\n}\r\n\r\nfunction pathMatches(row: Datum, fields: string[], path: string[]): boolean {\r\n if (path.length === 0) {\r\n return true;\r\n }\r\n\r\n return path.every((key, index) => stringifyGroupKey(row[fields[index]]) === key);\r\n}\r\n\r\nfunction groupRowsAtDepth(data: Datum[], field: string, sort: 'asc' | 'desc' | 'none'): Map<string, Datum[]> {\r\n const grouped = new Map<string, Datum[]>();\r\n\r\n for (const row of data) {\r\n const key = stringifyGroupKey(row[field]);\r\n const rows = grouped.get(key);\r\n if (rows === undefined) {\r\n grouped.set(key, [row]);\r\n } else {\r\n rows.push(row);\r\n }\r\n }\r\n\r\n if (sort === 'none') {\r\n return grouped;\r\n }\r\n\r\n return new Map(\r\n [...grouped.entries()].sort(([left], [right]) => {\r\n if (left === right) {\r\n return 0;\r\n }\r\n const direction = sort === 'asc' ? 1 : -1;\r\n return left < right ? -direction : direction;\r\n }),\r\n );\r\n}\r\n\r\nfunction stringifyGroupKey(value: unknown): string {\r\n if (value instanceof Date) {\r\n const time = value.getTime();\r\n return Number.isFinite(time) ? value.toISOString() : 'Invalid Date';\r\n }\r\n\r\n if (value === null) {\r\n return 'null';\r\n }\r\n\r\n if (value === undefined) {\r\n return 'undefined';\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Object.is(value, -0) ? '0' : String(value);\r\n }\r\n\r\n if (typeof value === 'string' || typeof value === 'boolean' || typeof value === 'bigint') {\r\n return String(value);\r\n }\r\n\r\n return stableStringify(value);\r\n}\r\n\r\nfunction stableStringify(value: unknown): string {\r\n if (Array.isArray(value)) {\r\n return `[${value.map(stableStringify).join(',')}]`;\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n return `{${Object.entries(value as Record<string, unknown>)\r\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\r\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableStringify(entryValue)}`)\r\n .join(',')}}`;\r\n }\r\n\r\n return String(value);\r\n}\r\n\r\nfunction coerceFinite(value: unknown): number | null {\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n const numberValue = Number(value);\r\n return Number.isFinite(numberValue) ? numberValue : null;\r\n}\r\n\r\nfunction makePathKey(path: string[]): string {\r\n return path.join(PATH_SEPARATOR);\r\n}\r\n","/** Environment helpers — safe in both browser and Node (SSR/test). */\r\n\r\nexport const isBrowser =\r\n typeof window !== 'undefined' && typeof document !== 'undefined';\r\n\r\n/** Current device pixel ratio (defaults to 1 outside the browser). */\r\nexport function getDevicePixelRatio(): number {\r\n const dpr = (globalThis as { devicePixelRatio?: number }).devicePixelRatio;\r\n return typeof dpr === 'number' && dpr > 0 ? dpr : 1;\r\n}\r\n","/**\r\n * Pure sizing math for hi-DPI canvases (no DOM — unit testable).\r\n */\r\n\r\nexport interface BackingSize {\r\n /** Logical CSS pixel width. */\r\n cssWidth: number;\r\n /** Logical CSS pixel height. */\r\n cssHeight: number;\r\n /** Backing-store (device) pixel width. */\r\n pixelWidth: number;\r\n /** Backing-store (device) pixel height. */\r\n pixelHeight: number;\r\n /** Effective device pixel ratio used. */\r\n dpr: number;\r\n}\r\n\r\n/**\r\n * Compute the backing-store pixel size for a canvas of the given CSS size at a\r\n * device pixel ratio. Backing dimensions are at least 1px so the canvas stays valid.\r\n */\r\nexport function computeBackingSize(width: number, height: number, dpr: number): BackingSize {\r\n const d = dpr > 0 ? dpr : 1;\r\n const cssWidth = Math.max(0, width);\r\n const cssHeight = Math.max(0, height);\r\n return {\r\n cssWidth,\r\n cssHeight,\r\n pixelWidth: Math.max(1, Math.round(cssWidth * d)),\r\n pixelHeight: Math.max(1, Math.round(cssHeight * d)),\r\n dpr: d,\r\n };\r\n}\r\n","/** Tiny DOM helpers (browser-only). */\r\n\r\nexport function setStyle(el: HTMLElement, style: Partial<CSSStyleDeclaration>): void {\r\n Object.assign(el.style, style);\r\n}\r\n\r\nexport function createDiv(\r\n className?: string,\r\n style?: Partial<CSSStyleDeclaration>,\r\n): HTMLDivElement {\r\n const el = document.createElement('div');\r\n if (className) el.className = className;\r\n if (style) setStyle(el, style);\r\n return el;\r\n}\r\n\r\n/** Absolute-position a layer to fill its positioned parent. */\r\nexport const fillParentStyle: Partial<CSSStyleDeclaration> = {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n};\r\n","import { computeBackingSize } from './sizing';\r\nimport { getDevicePixelRatio } from './env';\r\n\r\n/**\r\n * A single hi-DPI Canvas2D layer. Drawing is done in CSS pixels — the context\r\n * transform is scaled by the device pixel ratio so output stays crisp.\r\n */\r\nexport class CanvasLayer {\r\n readonly canvas: HTMLCanvasElement;\r\n readonly ctx: CanvasRenderingContext2D;\r\n /** Logical (CSS px) width. */\r\n width = 0;\r\n /** Logical (CSS px) height. */\r\n height = 0;\r\n dpr = 1;\r\n\r\n constructor(canvas?: HTMLCanvasElement) {\r\n this.canvas = canvas ?? document.createElement('canvas');\r\n const ctx = this.canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Graphein: 2D canvas context is unavailable in this environment.');\r\n }\r\n this.ctx = ctx;\r\n }\r\n\r\n /** Resize the layer to a CSS size; updates the backing store + DPR transform. */\r\n resize(width: number, height: number, dpr: number = getDevicePixelRatio()): void {\r\n const b = computeBackingSize(width, height, dpr);\r\n this.width = b.cssWidth;\r\n this.height = b.cssHeight;\r\n this.dpr = b.dpr;\r\n if (this.canvas.width !== b.pixelWidth) this.canvas.width = b.pixelWidth;\r\n if (this.canvas.height !== b.pixelHeight) this.canvas.height = b.pixelHeight;\r\n this.canvas.style.width = `${b.cssWidth}px`;\r\n this.canvas.style.height = `${b.cssHeight}px`;\r\n this.ctx.setTransform(b.dpr, 0, 0, b.dpr, 0, 0);\r\n }\r\n\r\n /** Clear the entire backing store regardless of the current transform. */\r\n clear(): void {\r\n const { ctx, canvas } = this;\r\n ctx.save();\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.restore();\r\n }\r\n}\r\n","import { CanvasLayer } from './canvasLayer';\r\nimport { createDiv, fillParentStyle, setStyle } from './dom';\r\nimport { getDevicePixelRatio } from './env';\r\n\r\n/**\r\n * A rendering Surface mounted inside a user-provided container. It owns a stack\r\n * of layers:\r\n * - `marks` : static Canvas2D layer for data marks + gridlines\r\n * - `interaction` : Canvas2D layer for hover/crosshair (redrawn cheaply)\r\n * - `overlay` : HTML layer for crisp text (axis labels, legend, tooltip)\r\n *\r\n * The Surface creates a single wrapper element it fully owns, so it never\r\n * clobbers other content in the container.\r\n */\r\nexport class Surface {\r\n readonly container: HTMLElement;\r\n readonly root: HTMLDivElement;\r\n readonly marks: CanvasLayer;\r\n readonly interaction: CanvasLayer;\r\n readonly overlay: HTMLDivElement;\r\n /** Visually-hidden container for the screen-reader data-table fallback. */\r\n readonly a11y: HTMLDivElement;\r\n width = 0;\r\n height = 0;\r\n dpr = 1;\r\n\r\n constructor(container: HTMLElement) {\r\n this.container = container;\r\n this.root = createDiv('graphein-root', {\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n });\r\n\r\n const marksCanvas = document.createElement('canvas');\r\n marksCanvas.className = 'graphein-layer-marks';\r\n setStyle(marksCanvas, { ...fillParentStyle });\r\n\r\n const interactionCanvas = document.createElement('canvas');\r\n interactionCanvas.className = 'graphein-layer-interaction';\r\n setStyle(interactionCanvas, { ...fillParentStyle, pointerEvents: 'none' });\r\n\r\n this.overlay = createDiv('graphein-layer-overlay', {\r\n ...fillParentStyle,\r\n width: '100%',\r\n height: '100%',\r\n pointerEvents: 'none',\r\n });\r\n\r\n // Off-screen (visually hidden) host for the screen-reader data-table\r\n // fallback. Present to assistive tech, invisible on screen.\r\n this.a11y = createDiv('graphein-a11y', {\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0 0 0 0)',\r\n clipPath: 'inset(50%)',\r\n whiteSpace: 'nowrap',\r\n border: '0',\r\n margin: '-1px',\r\n padding: '0',\r\n });\r\n\r\n this.root.appendChild(marksCanvas);\r\n this.root.appendChild(interactionCanvas);\r\n this.root.appendChild(this.overlay);\r\n this.root.appendChild(this.a11y);\r\n container.appendChild(this.root);\r\n\r\n this.marks = new CanvasLayer(marksCanvas);\r\n this.interaction = new CanvasLayer(interactionCanvas);\r\n }\r\n\r\n resize(width: number, height: number, dpr: number = getDevicePixelRatio()): void {\r\n this.width = width;\r\n this.height = height;\r\n this.dpr = dpr;\r\n this.marks.resize(width, height, dpr);\r\n this.interaction.resize(width, height, dpr);\r\n setStyle(this.overlay, { width: `${width}px`, height: `${height}px` });\r\n }\r\n\r\n /** Clear both canvas layers and empty the HTML overlay. */\r\n clear(): void {\r\n this.marks.clear();\r\n this.interaction.clear();\r\n this.overlay.replaceChildren();\r\n }\r\n\r\n /** Remove all DOM created by this Surface. */\r\n destroy(): void {\r\n this.clear();\r\n this.root.remove();\r\n }\r\n}\r\n","/**\r\n * Text measurement using a shared offscreen canvas context. Falls back to a\r\n * rough heuristic when no canvas is available (SSR/test).\r\n */\r\n\r\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\r\n\r\nfunction getMeasureCtx(): CanvasRenderingContext2D | null {\r\n if (measureCtx !== undefined) return measureCtx;\r\n try {\r\n measureCtx = document.createElement('canvas').getContext('2d');\r\n } catch {\r\n measureCtx = null;\r\n }\r\n return measureCtx;\r\n}\r\n\r\nexport interface TextMetricsLite {\r\n width: number;\r\n}\r\n\r\n/** Measure the advance width of `text` rendered with the given CSS `font`. */\r\nexport function measureText(text: string, font: string): TextMetricsLite {\r\n const ctx = getMeasureCtx();\r\n if (!ctx) {\r\n // Heuristic: ~0.55em per character at the parsed pixel size.\r\n const sizeMatch = /(\\d+(?:\\.\\d+)?)px/.exec(font);\r\n const size = sizeMatch ? parseFloat(sizeMatch[1]) : 12;\r\n return { width: text.length * size * 0.55 };\r\n }\r\n ctx.font = font;\r\n return { width: ctx.measureText(text).width };\r\n}\r\n\r\n/** Build a CSS font shorthand string. */\r\nexport function fontString(\r\n size: number,\r\n family: string,\r\n weight: number | string = 400,\r\n style = 'normal',\r\n): string {\r\n return `${style} ${weight} ${size}px ${family}`;\r\n}\r\n","/**\r\n * Graphein design tokens.\r\n *\r\n * Flat, modern aesthetic: solid fills, minimal shadows, restrained radii, and a\r\n * teal accent. Two built-in themes (light/dark). Token values are literals so\r\n * this module stays dependency-free; charts combine these with the color module\r\n * for derived ramps and contrast.\r\n */\r\n\r\nexport interface ThemeColors {\r\n /** Page/plot background. */\r\n background: string;\r\n /** Cards / elevated surfaces (KPI cards, tooltips, table headers). */\r\n surface: string;\r\n /** Primary text. */\r\n text: string;\r\n /** Secondary / muted text (axis labels, captions). */\r\n textMuted: string;\r\n /** Axis baseline color. */\r\n axis: string;\r\n /** Gridline color (lighter than the axis). */\r\n grid: string;\r\n /** Hairline borders. */\r\n border: string;\r\n /** Brand accent (selection, focus, primary series). */\r\n accent: string;\r\n /** Categorical series palette. */\r\n palette: string[];\r\n /** Positive / up semantics. */\r\n positive: string;\r\n /** Negative / down semantics. */\r\n negative: string;\r\n}\r\n\r\nexport interface ThemeFont {\r\n family: string;\r\n size: { tiny: number; small: number; base: number; large: number; title: number };\r\n weight: { normal: number; medium: number; bold: number };\r\n}\r\n\r\nexport interface ThemeTokens {\r\n name: string;\r\n dark: boolean;\r\n color: ThemeColors;\r\n font: ThemeFont;\r\n spacing: { xs: number; sm: number; md: number; lg: number; xl: number };\r\n radius: { sm: number; md: number; lg: number };\r\n stroke: { thin: number; base: number; thick: number };\r\n}\r\n\r\n/** A vibrant, accessible categorical palette that reads well on light and dark. */\r\nconst PALETTE = [\r\n '#3b82f6', // blue\r\n '#14b8a6', // teal\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#ec4899', // pink\r\n '#10b981', // emerald\r\n '#f97316', // orange\r\n '#6366f1', // indigo\r\n '#84cc16', // lime\r\n];\r\n\r\nconst FONT_FAMILY =\r\n 'Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif';\r\n\r\nconst SHARED = {\r\n font: {\r\n family: FONT_FAMILY,\r\n size: { tiny: 10, small: 11, base: 12, large: 14, title: 16 },\r\n weight: { normal: 400, medium: 500, bold: 600 },\r\n },\r\n spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 },\r\n radius: { sm: 4, md: 6, lg: 8 },\r\n stroke: { thin: 1, base: 1.5, thick: 2 },\r\n} as const;\r\n\r\nexport const lightTheme: ThemeTokens = {\r\n name: 'light',\r\n dark: false,\r\n color: {\r\n background: '#ffffff',\r\n surface: '#f8fafc',\r\n text: '#0f172a',\r\n textMuted: '#64748b',\r\n axis: '#cbd5e1',\r\n grid: '#eef2f6',\r\n border: '#e2e8f0',\r\n accent: '#0d9488',\r\n palette: PALETTE,\r\n positive: '#16a34a',\r\n negative: '#dc2626',\r\n },\r\n ...SHARED,\r\n};\r\n\r\nexport const darkTheme: ThemeTokens = {\r\n name: 'dark',\r\n dark: true,\r\n color: {\r\n background: '#0b1220',\r\n surface: '#111a2e',\r\n text: '#f1f5f9',\r\n textMuted: '#94a3b8',\r\n axis: '#334155',\r\n grid: '#1c2740',\r\n border: '#1e293b',\r\n accent: '#2dd4bf',\r\n palette: PALETTE,\r\n positive: '#22c55e',\r\n negative: '#f87171',\r\n },\r\n ...SHARED,\r\n};\r\n\r\nexport const themes: Record<string, ThemeTokens> = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n};\r\n\r\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\r\n return typeof v === 'object' && v !== null && !Array.isArray(v);\r\n}\r\n\r\n/** Deep-merge a partial override onto a base token set (arrays replace). */\r\nfunction deepMerge<T>(base: T, override: unknown): T {\r\n if (!isPlainObject(override)) return base;\r\n if (!isPlainObject(base)) return override as T;\r\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\r\n for (const [key, value] of Object.entries(override)) {\r\n const baseValue = out[key];\r\n if (isPlainObject(baseValue) && isPlainObject(value)) {\r\n out[key] = deepMerge(baseValue, value);\r\n } else {\r\n out[key] = value;\r\n }\r\n }\r\n return out as T;\r\n}\r\n\r\nexport type ThemeInput = string | (Partial<ThemeTokens> & { base?: string });\r\n\r\n/**\r\n * Resolve a theme reference into concrete tokens.\r\n * - a name ('light' | 'dark') selects a built-in theme\r\n * - an object deep-merges onto a base theme (override.base or override.dark picks it)\r\n */\r\nexport function resolveTheme(theme?: ThemeInput): ThemeTokens {\r\n if (theme == null) return lightTheme;\r\n if (typeof theme === 'string') return themes[theme] ?? lightTheme;\r\n const baseName = theme.base ?? (theme.dark ? 'dark' : 'light');\r\n const base = themes[baseName] ?? lightTheme;\r\n const { base: _ignored, ...override } = theme;\r\n return deepMerge(base, override);\r\n}\r\n","/**\r\n * Theme-side support for the hand-drawn (\"sketch\") style.\r\n *\r\n * Two responsibilities:\r\n * 1. `ensureSketchFont()` lazily loads the bundled handwriting font (Patrick\r\n * Hand, SIL OFL) as a data URL — no network, works offline. The base64 blob\r\n * lives in its own module that we `import()` dynamically so it is code-split\r\n * out of the main bundle and only fetched when a chart actually sketches.\r\n * 2. `withSketchFont()` swaps a theme's font family to the handwriting stack so\r\n * every bit of text (titles, axes, legends, KPI/table/matrix) reads as drawn.\r\n */\r\n\r\nimport type { ThemeTokens } from './tokens';\r\n\r\n/** The font-family name the injected `@font-face` registers. */\r\nexport const SKETCH_FONT_NAME = 'Patrick Hand';\r\n\r\n/** Handwriting stack with graceful fallbacks for SSR / pre-load / odd hosts. */\r\nexport const SKETCH_FONT_FAMILY = `'Patrick Hand', 'Segoe Print', 'Bradley Hand', 'Comic Sans MS', ui-rounded, cursive`;\r\n\r\nlet injected = false;\r\n\r\nfunction injectViaStyle(dataUrl: string): void {\r\n const style = document.createElement('style');\r\n style.setAttribute('data-graphein-sketch-font', '');\r\n style.textContent =\r\n `@font-face{font-family:'${SKETCH_FONT_NAME}';font-style:normal;font-weight:400;` +\r\n `font-display:swap;src:url(\"${dataUrl}\") format(\"woff2\");}`;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/**\r\n * Ensure the handwriting font is available. Resolves `true` only when it was\r\n * newly loaded this call (so the caller can trigger a single corrective redraw\r\n * once real glyph metrics exist); resolves `false` if already present or if the\r\n * environment can't load fonts (Node/SSR).\r\n */\r\nexport async function ensureSketchFont(): Promise<boolean> {\r\n if (injected) return false;\r\n if (typeof document === 'undefined') return false;\r\n injected = true;\r\n\r\n try {\r\n const { PATRICK_HAND_DATA_URL } = await import('./fonts/patrickHand');\r\n const docFonts = (document as Document & { fonts?: FontFaceSet }).fonts;\r\n\r\n if (typeof FontFace !== 'undefined' && docFonts?.add) {\r\n const face = new FontFace(\r\n SKETCH_FONT_NAME,\r\n `url(\"${PATRICK_HAND_DATA_URL}\") format(\"woff2\")`,\r\n { style: 'normal', weight: '400' },\r\n );\r\n await face.load();\r\n docFonts.add(face);\r\n return true;\r\n }\r\n\r\n injectViaStyle(PATRICK_HAND_DATA_URL);\r\n return true;\r\n } catch {\r\n injected = false;\r\n return false;\r\n }\r\n}\r\n\r\n/** Return a copy of `tokens` whose text uses the handwriting font. */\r\nexport function withSketchFont(tokens: ThemeTokens): ThemeTokens {\r\n return {\r\n ...tokens,\r\n font: {\r\n ...tokens.font,\r\n family: `${SKETCH_FONT_FAMILY}`,\r\n },\r\n };\r\n}\r\n","import type { Datum, FieldType, Insets } from '../types';\r\nimport type { AggOp } from '../pivot';\r\nimport type { ThemeInput } from '../theme';\r\nimport type { FillStyle } from '../rough';\r\nimport type { FilterClause, HighlightConfig, SelectionParam } from './selection';\r\n\r\n/**\r\n * Graphein declarative chart specs.\r\n *\r\n * One chart = one JSON-serializable `ChartSpec`. The shape is intentionally\r\n * Vega-Lite-flavored (data + encoding channels) so coding agents can generate\r\n * charts reliably. Every field is plain JSON (no functions) so specs round-trip\r\n * through `JSON.stringify`.\r\n */\r\n\r\n/** How a data field maps onto a visual channel. */\r\nexport interface FieldDef {\r\n /** Column name in each datum. */\r\n field: string;\r\n /** Data type; inferred from the data when omitted. */\r\n type?: FieldType;\r\n /** Optional aggregation applied when grouping (e.g. sum of sales). */\r\n aggregate?: AggOp;\r\n /** Axis/legend title override. */\r\n title?: string;\r\n /** Number/date format hint (see format module), e.g. ',.0f' or '%b %Y'. */\r\n format?: string;\r\n /** Per-channel scale overrides. */\r\n scale?: ScaleConfig;\r\n}\r\n\r\nexport type ScaleType = 'linear' | 'log' | 'time' | 'band' | 'point';\r\n\r\nexport interface ScaleConfig {\r\n type?: ScaleType;\r\n /** Explicit domain; numbers for continuous, strings for categorical. */\r\n domain?: [number, number] | string[];\r\n /** Round the domain to nice values (continuous only). */\r\n nice?: boolean;\r\n /** Force the domain to include zero (continuous only). */\r\n zero?: boolean;\r\n /** Clamp out-of-domain values into range. */\r\n clamp?: boolean;\r\n /** Band/point padding (0..1). */\r\n padding?: number;\r\n /** Log base. */\r\n base?: number;\r\n /** Reverse the range. */\r\n reverse?: boolean;\r\n}\r\n\r\n/** Visual encoding channels. Not every chart uses every channel. */\r\nexport interface Encoding {\r\n x?: FieldDef;\r\n y?: FieldDef;\r\n /** Upper bound for ranged area / band marks. */\r\n y2?: FieldDef;\r\n /** Color channel (series color or continuous color). */\r\n color?: FieldDef;\r\n /** Size channel (bubble radius). */\r\n size?: FieldDef;\r\n /** Splits data into multiple series (multi-line, grouped/stacked bars). */\r\n series?: FieldDef;\r\n /** Pie/donut angular measure. */\r\n theta?: FieldDef;\r\n /** Text/label channel. */\r\n label?: FieldDef;\r\n /** Sankey link source node. */\r\n source?: FieldDef;\r\n /** Sankey link target node. */\r\n target?: FieldDef;\r\n /** Magnitude channel (Sankey link value / generic measure). */\r\n value?: FieldDef;\r\n /** Geographic key matching a GeoJSON feature (choropleth). */\r\n key?: FieldDef;\r\n /** Funnel stage (ordered category, one bar per stage). */\r\n stage?: FieldDef;\r\n}\r\n\r\nexport interface Dimensions {\r\n /** Fixed width in px. Omit for responsive (fills container). */\r\n width?: number;\r\n /** Fixed height in px. Omit for responsive (fills container). */\r\n height?: number;\r\n /** Re-render on container resize (default true when width/height omitted). */\r\n autoResize?: boolean;\r\n}\r\n\r\nexport interface AxisConfig {\r\n show?: boolean;\r\n title?: string;\r\n grid?: boolean;\r\n /** Approximate tick count. */\r\n ticks?: number;\r\n /** Explicit tick values. */\r\n tickValues?: number[];\r\n format?: string;\r\n /** Show tick labels. */\r\n labels?: boolean;\r\n}\r\n\r\nexport interface AxesConfig {\r\n x?: AxisConfig;\r\n y?: AxisConfig;\r\n}\r\n\r\nexport type LegendPosition = 'top' | 'right' | 'bottom' | 'left';\r\n\r\nexport interface LegendConfig {\r\n show?: boolean;\r\n position?: LegendPosition;\r\n title?: string;\r\n}\r\n\r\nexport interface TooltipConfig {\r\n show?: boolean;\r\n}\r\n\r\nexport interface TitleConfig {\r\n text?: string;\r\n subtitle?: string;\r\n align?: 'left' | 'center' | 'right';\r\n}\r\n\r\nexport interface AnimationConfig {\r\n enabled?: boolean;\r\n duration?: number;\r\n easing?: string;\r\n}\r\n\r\n/**\r\n * Hand-drawn (\"sketch\") rendering options. Set `sketch: true` on any spec for\r\n * the defaults, or pass this object to tune the look. All fields are plain JSON\r\n * so specs still round-trip through `JSON.stringify`.\r\n */\r\nexport interface SketchConfig {\r\n /** Wobble magnitude. 0 ≈ clean, 1 = default, >1 = wilder. */\r\n roughness?: number;\r\n /** How much straight strokes bow between their endpoints. */\r\n bowing?: number;\r\n /** Fill treatment for closed marks (bars, wedges, cells). Default 'hachure'. */\r\n fillStyle?: FillStyle;\r\n /** Spacing (px) between hachure lines. Omit to derive from stroke width. */\r\n hachureGap?: number;\r\n /** Hachure angle in degrees (default -41). */\r\n hachureAngle?: number;\r\n /** Outline width multiplier (default 1). */\r\n strokeWidth?: number;\r\n /** Explicit PRNG seed; omit to derive a stable one from the spec. */\r\n seed?: number;\r\n /** Apply the hand-drawn font to titles/labels/axes (default true). */\r\n font?: boolean;\r\n}\r\n\r\n/** Fields shared by all spec types. */\r\nexport interface BaseSpec {\r\n /** Row-oriented (tidy) data. Required for all charts/tables. */\r\n data?: Datum[];\r\n /** Theme name ('light' | 'dark') or a partial override object. */\r\n theme?: ThemeInput;\r\n dimensions?: Dimensions;\r\n title?: string | TitleConfig;\r\n /**\r\n * Accessible description (alt text) for the chart. Used verbatim as the\r\n * chart's `aria-label`; when omitted, a concise label is synthesized from the\r\n * type, title, and data. Agents should set this to convey the chart's intent.\r\n */\r\n description?: string;\r\n legend?: LegendConfig | boolean;\r\n tooltip?: TooltipConfig | boolean;\r\n axes?: AxesConfig;\r\n animation?: AnimationConfig | boolean;\r\n /** Extra padding around the plot area. */\r\n padding?: Partial<Insets>;\r\n /** Background override (defaults to the theme background). */\r\n background?: string;\r\n /**\r\n * Render the chart in a hand-drawn (\"sketch\") style — wobbly outlines, hachure\r\n * fills, and a handwriting font. `true` uses the defaults; pass a `SketchConfig`\r\n * to tune it. Omit (or `false`) for the default clean rendering.\r\n */\r\n sketch?: boolean | SketchConfig;\r\n /**\r\n * Named selections this visual publishes. Clicking marks, brushing, or\r\n * changing a slicer updates the param's value on the shared selection store,\r\n * which other visuals can consume via {@link BaseSpec.highlight} or\r\n * {@link BaseSpec.filter}. Pure data — no callbacks.\r\n */\r\n params?: SelectionParam[];\r\n /**\r\n * Emphasize rows matching a selection and dim the rest. References a param by\r\n * name (typically published by another visual for cross-highlighting). An array\r\n * unions several sources: a row is emphasized if it matches *any* active one.\r\n */\r\n highlight?: HighlightConfig | HighlightConfig[];\r\n /**\r\n * Subset this visual's rows to those matching every clause (logical AND).\r\n * Each clause is a named param (cross-filter) or a literal predicate.\r\n */\r\n filter?: FilterClause[];\r\n}\r\n\r\nexport type CurveType =\r\n | 'linear'\r\n | 'monotone'\r\n | 'step'\r\n | 'stepBefore'\r\n | 'stepAfter'\r\n | 'catmullRom';\r\n\r\nexport interface LineSpec extends BaseSpec {\r\n type: 'line';\r\n encoding: Encoding & { x: FieldDef; y: FieldDef };\r\n curve?: CurveType;\r\n /** Show point markers on the line. */\r\n points?: boolean;\r\n /** Fill the area under the line. */\r\n area?: boolean;\r\n}\r\n\r\nexport interface AreaSpec extends BaseSpec {\r\n type: 'area';\r\n encoding: Encoding & { x: FieldDef; y: FieldDef };\r\n curve?: CurveType;\r\n /** Stack multiple series. */\r\n stack?: boolean;\r\n}\r\n\r\nexport interface BarSpec extends BaseSpec {\r\n type: 'bar';\r\n encoding: Encoding & { x: FieldDef; y: FieldDef };\r\n orientation?: 'vertical' | 'horizontal';\r\n /** Stack series (default false). */\r\n stack?: boolean;\r\n /** Group series side-by-side (default when `series` present and not stacked). */\r\n group?: boolean;\r\n cornerRadius?: number;\r\n}\r\n\r\nexport interface ScatterSpec extends BaseSpec {\r\n type: 'scatter';\r\n encoding: Encoding & { x: FieldDef; y: FieldDef };\r\n}\r\n\r\nexport interface PieSpec extends BaseSpec {\r\n type: 'pie';\r\n encoding: Encoding & { theta: FieldDef; color: FieldDef };\r\n /** true for a default donut, or a 0..1 inner-radius ratio. */\r\n donut?: boolean | number;\r\n /**\r\n * Value/percent labels. `true` (default) / `false` toggles them; pass a\r\n * {@link PieLabels} object to control placement (inside vs. outside callouts),\r\n * what each label says, and the connector style.\r\n */\r\n labels?: boolean | PieLabels;\r\n}\r\n\r\n/** Fine-grained control over pie/donut slice labels. */\r\nexport interface PieLabels {\r\n /** Master toggle (default true). */\r\n show?: boolean;\r\n /**\r\n * Where labels sit:\r\n * - 'auto' (default): inside the slice when the text fits, otherwise an\r\n * outside callout with a leader line.\r\n * - 'inside': always inside (small slices are dropped if they don't fit).\r\n * - 'outside': always an outside callout with a leader line.\r\n */\r\n placement?: 'inside' | 'outside' | 'auto';\r\n /**\r\n * What each label says (default: 'percent' inside, 'category-percent' for\r\n * outside callouts).\r\n */\r\n content?: 'percent' | 'value' | 'category' | 'category-percent' | 'category-value';\r\n /** Hide labels for slices below this share of the total (0..1, default 0.01). */\r\n minShare?: number;\r\n /** Leader-line colour for outside callouts: the slice colour or a muted grey. */\r\n connector?: 'slice' | 'muted';\r\n}\r\n\r\nexport interface HeatmapSpec extends BaseSpec {\r\n type: 'heatmap';\r\n encoding: Encoding & { x: FieldDef; y: FieldDef; color: FieldDef };\r\n /** Sequential/diverging ramp name. */\r\n scheme?: string;\r\n}\r\n\r\n/**\r\n * A funnel chart: ordered `stage`s drawn as stacked, centered trapezoids whose\r\n * width encodes `value`. Ideal for conversion / drop-off across a pipeline. Each\r\n * stage shows its value and the share retained relative to the first (or the\r\n * previous) stage.\r\n */\r\nexport interface FunnelSpec extends BaseSpec {\r\n type: 'funnel';\r\n encoding: Encoding & { stage: FieldDef; value: FieldDef };\r\n /** Show stage labels + value/percent inside the funnel (default true). */\r\n labels?: boolean;\r\n /**\r\n * What the per-stage percentage is measured against:\r\n * - 'first' (default): share retained vs. the top of the funnel.\r\n * - 'previous': step conversion vs. the stage above.\r\n */\r\n percent?: 'first' | 'previous';\r\n}\r\n\r\nexport type ValueRef = number | { field: string; aggregate?: AggOp };\r\n\r\nexport interface KpiSpec extends BaseSpec {\r\n type: 'kpi';\r\n /** Literal value or a field (optionally aggregated over data). */\r\n value: ValueRef;\r\n label?: string;\r\n /** Delta vs. a comparison, drives the up/down indicator. */\r\n delta?: ValueRef;\r\n format?: string;\r\n /** Inline sparkline from a numeric field. */\r\n sparkline?: boolean | { field: string };\r\n}\r\n\r\nexport type ConditionalFormat =\r\n | {\r\n type: 'colorScale';\r\n scheme?: string;\r\n domain?: [number, number];\r\n midpoint?: number;\r\n diverging?: boolean;\r\n target?: 'background' | 'text';\r\n }\r\n | {\r\n type: 'bar';\r\n color?: string;\r\n negativeColor?: string;\r\n domain?: [number, number];\r\n baseline?: 'zero' | 'min';\r\n showValue?: boolean;\r\n }\r\n | {\r\n type: 'icon';\r\n set?: 'arrows' | 'triangles' | 'dots' | 'trafficLights';\r\n rules?: IconRule[];\r\n position?: 'left' | 'right';\r\n }\r\n | { type: 'rules'; rules: ValueRule[] };\r\n\r\nexport interface ValueRule {\r\n when: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | 'between';\r\n value: number | string;\r\n to?: number;\r\n background?: string;\r\n color?: string;\r\n weight?: 'bold' | 'normal';\r\n icon?: string;\r\n}\r\n\r\nexport interface IconRule {\r\n when: ValueRule['when'];\r\n value: number;\r\n to?: number;\r\n icon?: string;\r\n color?: string;\r\n}\r\n\r\nexport interface TableColumn {\r\n field: string;\r\n title?: string;\r\n type?: FieldType;\r\n format?: string;\r\n align?: 'left' | 'center' | 'right';\r\n width?: number;\r\n conditionalFormat?: ConditionalFormat;\r\n prefix?: string;\r\n suffix?: string;\r\n negativeStyle?: 'sign' | 'parens' | 'red' | 'parens-red';\r\n hidden?: boolean;\r\n sortable?: boolean;\r\n wrap?: boolean;\r\n group?: string;\r\n total?: AggOp | false;\r\n}\r\n\r\nexport interface TableSpec extends BaseSpec {\r\n type: 'table';\r\n /** Explicit columns; inferred from data keys when omitted. */\r\n columns?: TableColumn[];\r\n sort?: { field: string; order?: 'asc' | 'desc' };\r\n density?: 'comfortable' | 'standard' | 'compact';\r\n totals?: boolean | { label?: string };\r\n /** Zebra striping (off by default — flat aesthetic). */\r\n striped?: boolean;\r\n /** Sticky header (default true). */\r\n stickyHeader?: boolean;\r\n}\r\n\r\nexport interface MatrixValueDef {\r\n field: string;\r\n op: AggOp;\r\n label?: string;\r\n format?: string;\r\n conditionalFormat?: ConditionalFormat;\r\n prefix?: string;\r\n suffix?: string;\r\n negativeStyle?: TableColumn['negativeStyle'];\r\n showAs?: 'value' | 'percentOfRow' | 'percentOfColumn' | 'percentOfTotal';\r\n}\r\n\r\nexport interface MatrixSpec extends BaseSpec {\r\n type: 'matrix';\r\n /** Row grouping fields (hierarchical). */\r\n rows: string[];\r\n /** Column grouping fields (hierarchical). */\r\n columns?: string[];\r\n values: MatrixValueDef[];\r\n subtotals?: boolean;\r\n grandTotals?: boolean;\r\n density?: 'comfortable' | 'standard' | 'compact';\r\n columnSort?: { by: 'value' | 'label'; valueIndex?: number; order?: 'asc' | 'desc' };\r\n}\r\n\r\nexport interface BoxSpec extends BaseSpec {\r\n type: 'box';\r\n /**\r\n * `x` is the category axis (one box per category); `y` holds the raw\r\n * observations that are summarized into quartiles. Add `series` to draw\r\n * grouped boxes side-by-side within each category.\r\n */\r\n encoding: Encoding & { x: FieldDef; y: FieldDef };\r\n /**\r\n * Whisker rule:\r\n * - 'tukey' (default): whiskers reach the furthest points within 1.5×IQR of\r\n * the quartiles; points beyond are drawn as outliers.\r\n * - 'minMax': whiskers span the full data range (no outliers).\r\n */\r\n whisker?: 'tukey' | 'minMax';\r\n /** Draw outlier points beyond the whiskers (tukey only; default true). */\r\n outliers?: boolean;\r\n}\r\n\r\nexport interface SankeySpec extends BaseSpec {\r\n type: 'sankey';\r\n /**\r\n * Each data row is one link. Nodes are derived from the distinct `source`\r\n * and `target` values; `value` is the flow magnitude (link/node thickness).\r\n */\r\n encoding: Encoding & { source: FieldDef; target: FieldDef; value: FieldDef };\r\n /** Node block width in px (default 16). */\r\n nodeWidth?: number;\r\n /** Vertical gap between stacked nodes in px (default 14). */\r\n nodePadding?: number;\r\n /** Show the node total alongside its label (default true). */\r\n nodeValues?: boolean;\r\n}\r\n\r\n/** A GeoJSON position: [longitude, latitude] (or projected [x, y]). */\r\nexport type GeoPosition = [number, number];\r\n\r\nexport interface GeoPolygon {\r\n type: 'Polygon';\r\n /** Rings: the first is the exterior, the rest are holes. */\r\n coordinates: GeoPosition[][];\r\n}\r\n\r\nexport interface GeoMultiPolygon {\r\n type: 'MultiPolygon';\r\n coordinates: GeoPosition[][][];\r\n}\r\n\r\nexport type GeoGeometry = GeoPolygon | GeoMultiPolygon;\r\n\r\nexport interface GeoFeature {\r\n type: 'Feature';\r\n id?: string | number;\r\n properties?: Record<string, unknown> | null;\r\n geometry: GeoGeometry | null;\r\n}\r\n\r\nexport interface GeoFeatureCollection {\r\n type: 'FeatureCollection';\r\n features: GeoFeature[];\r\n}\r\n\r\n/**\r\n * How feature coordinates are mapped to the screen:\r\n * - 'mercator' / 'equirectangular': geographic [lon, lat] projections.\r\n * - 'identity': coordinates are already planar [x, y] in screen orientation\r\n * (y increases downward), e.g. data pre-projected with Albers USA. Useful for\r\n * composite projections or non-geographic polygon maps.\r\n */\r\nexport type MapProjection = 'mercator' | 'equirectangular' | 'identity';\r\n\r\nexport interface ChoroplethSpec extends BaseSpec {\r\n type: 'choropleth';\r\n /** Map geometry: a GeoJSON FeatureCollection of Polygon/MultiPolygon features. */\r\n geo: GeoFeatureCollection;\r\n /**\r\n * `key` joins each data row to a feature; `color` is the numeric value that\r\n * drives the fill via a sequential color scale.\r\n */\r\n encoding: Encoding & { key: FieldDef; color: FieldDef };\r\n /**\r\n * Where to read a feature's join id: a property name (e.g. 'name' for\r\n * `feature.properties.name'), or 'id' for the top-level `feature.id`.\r\n * Defaults to trying `feature.id`, then `properties.id`, then `properties.name`.\r\n */\r\n featureId?: string;\r\n /** Geographic projection (default 'mercator'). */\r\n projection?: MapProjection;\r\n /** Sequential color scheme name (e.g. 'teal', 'blues', 'viridis'). */\r\n scheme?: string;\r\n}\r\n\r\n/**\r\n * Slicer visuals — interactive controls that *publish* a selection (rather than\r\n * plotting marks). A slicer cross-filters (or cross-highlights) every visual that\r\n * consumes its param. They are ordinary DOM widgets, so they validate and render\r\n * standalone, and slot into a dashboard like any other view.\r\n *\r\n * Every slicer reads a single `field` and writes to a named param (defaulting to\r\n * the field name, so a chart's `filter: [{ param: 'region' }]` auto-connects to a\r\n * `field: 'region'` slicer). Options/bounds are derived from the *unfiltered*\r\n * data so a slicer never hides its own choices.\r\n */\r\nexport interface BaseSlicerSpec extends BaseSpec {\r\n /** The data field this slicer reads its options/bounds from and filters on. */\r\n field: string;\r\n /**\r\n * The param name this slicer publishes to. Defaults to `field`, which makes a\r\n * slicer auto-wire to any visual filtering/highlighting on that param name.\r\n */\r\n param?: string;\r\n /** Label shown above the control. Defaults to `title` or the field name. */\r\n label?: string;\r\n /** How consumers should react: emphasize matches or subset rows. Default 'filter'. */\r\n as?: 'filter' | 'highlight';\r\n}\r\n\r\n/** Choose one (single) or several (multi) of a field's distinct values. */\r\nexport interface DropdownSlicerSpec extends BaseSlicerSpec {\r\n type: 'dropdown';\r\n /** Allow choosing multiple values (emits a set). Default false (single-select). */\r\n multiple?: boolean;\r\n /** Placeholder shown when nothing is selected. */\r\n placeholder?: string;\r\n}\r\n\r\n/** A debounced case-insensitive substring filter over a text field. */\r\nexport interface SearchSlicerSpec extends BaseSlicerSpec {\r\n type: 'search';\r\n placeholder?: string;\r\n /** Debounce in ms before publishing the query (default 200). */\r\n debounce?: number;\r\n}\r\n\r\n/** A scrollable checkbox list of a field's distinct values (multi-select). */\r\nexport interface ListSlicerSpec extends BaseSlicerSpec {\r\n type: 'list';\r\n /** Show a search-within box once options exceed this count (default 8). */\r\n searchThreshold?: number;\r\n /** Show the \"Select all\" / \"Clear\" row (default true). */\r\n selectAll?: boolean;\r\n}\r\n\r\n/** A numeric min/max range over a quantitative field (dual-thumb slider). */\r\nexport interface RangeSlicerSpec extends BaseSlicerSpec {\r\n type: 'range';\r\n /** Lower bound; defaults to the data minimum of `field`. */\r\n min?: number;\r\n /** Upper bound; defaults to the data maximum of `field`. */\r\n max?: number;\r\n /** Thumb step; defaults to a sensible fraction of the range. */\r\n step?: number;\r\n /** Number format hint for the value labels (e.g. ',.0f'). */\r\n format?: string;\r\n}\r\n\r\n/** A temporal min/max range over a date field, with relative presets. */\r\nexport interface DateRangeSlicerSpec extends BaseSlicerSpec {\r\n type: 'dateRange';\r\n /** Show relative presets (last 7 / 30 / 90 days, all). Default true. */\r\n presets?: boolean;\r\n /** Date format hint for the value labels (e.g. '%b %e, %Y'). */\r\n format?: string;\r\n}\r\n\r\nexport type SlicerSpec =\r\n | DropdownSlicerSpec\r\n | SearchSlicerSpec\r\n | ListSlicerSpec\r\n | RangeSlicerSpec\r\n | DateRangeSlicerSpec;\r\n\r\nexport type SlicerType = SlicerSpec['type'];\r\n\r\nexport const SLICER_TYPES: readonly SlicerType[] = [\r\n 'dropdown',\r\n 'search',\r\n 'list',\r\n 'range',\r\n 'dateRange',\r\n];\r\n\r\nexport type ChartSpec =\r\n | LineSpec\r\n | AreaSpec\r\n | BarSpec\r\n | ScatterSpec\r\n | PieSpec\r\n | HeatmapSpec\r\n | FunnelSpec\r\n | KpiSpec\r\n | TableSpec\r\n | MatrixSpec\r\n | BoxSpec\r\n | SankeySpec\r\n | ChoroplethSpec\r\n | DropdownSlicerSpec\r\n | SearchSlicerSpec\r\n | ListSlicerSpec\r\n | RangeSlicerSpec\r\n | DateRangeSlicerSpec;\r\n\r\nexport type ChartType = ChartSpec['type'];\r\n\r\nexport const CHART_TYPES: readonly ChartType[] = [\r\n 'line',\r\n 'area',\r\n 'bar',\r\n 'scatter',\r\n 'pie',\r\n 'heatmap',\r\n 'funnel',\r\n 'kpi',\r\n 'table',\r\n 'matrix',\r\n 'box',\r\n 'sankey',\r\n 'choropleth',\r\n 'dropdown',\r\n 'search',\r\n 'list',\r\n 'range',\r\n 'dateRange',\r\n];\r\n","import type { Datum, FieldType } from '../types';\r\n\r\n/** Detect whether a string looks like a date Graphein can parse. */\r\nfunction looksTemporal(value: string): boolean {\r\n if (value.length < 4) return false;\r\n // ISO-ish dates / datetimes, or YYYY, YYYY-MM, YYYY-MM-DD\r\n if (/^\\d{4}(-\\d{2}(-\\d{2})?)?([T\\s]\\d{2}:\\d{2})?/.test(value)) {\r\n const t = Date.parse(value);\r\n return !Number.isNaN(t);\r\n }\r\n return false;\r\n}\r\n\r\n/** Infer the channel type of a single value. */\r\nexport function inferValueType(value: unknown): FieldType | undefined {\r\n if (value == null) return undefined;\r\n if (typeof value === 'number') return Number.isFinite(value) ? 'quantitative' : undefined;\r\n if (value instanceof Date) return 'temporal';\r\n if (typeof value === 'boolean') return 'nominal';\r\n if (typeof value === 'string') {\r\n if (value.trim() === '') return undefined;\r\n if (looksTemporal(value)) return 'temporal';\r\n // numeric strings -> quantitative\r\n if (/^-?\\d*\\.?\\d+(e[-+]?\\d+)?$/i.test(value.trim())) return 'quantitative';\r\n return 'nominal';\r\n }\r\n return 'nominal';\r\n}\r\n\r\n/**\r\n * Infer the type of a field across a dataset by sampling non-null values.\r\n * Falls back to 'nominal' when ambiguous.\r\n */\r\nexport function inferFieldType(data: Datum[], field: string, sample = 50): FieldType {\r\n let seen = 0;\r\n const counts: Record<FieldType, number> = {\r\n quantitative: 0,\r\n temporal: 0,\r\n ordinal: 0,\r\n nominal: 0,\r\n };\r\n for (let i = 0; i < data.length && seen < sample; i++) {\r\n const t = inferValueType(data[i]?.[field]);\r\n if (!t) continue;\r\n counts[t]++;\r\n seen++;\r\n }\r\n if (seen === 0) return 'nominal';\r\n // Prefer the strongest signal: temporal > quantitative > nominal.\r\n if (counts.temporal >= seen * 0.6) return 'temporal';\r\n if (counts.quantitative >= seen * 0.6) return 'quantitative';\r\n return 'nominal';\r\n}\r\n\r\n/** Infer types for every field present in the first rows of the dataset. */\r\nexport function inferFieldTypes(data: Datum[]): Record<string, FieldType> {\r\n const fields = new Set<string>();\r\n for (let i = 0; i < Math.min(data.length, 20); i++) {\r\n const row = data[i];\r\n if (row) for (const k of Object.keys(row)) fields.add(k);\r\n }\r\n const out: Record<string, FieldType> = {};\r\n for (const f of fields) out[f] = inferFieldType(data, f);\r\n return out;\r\n}\r\n","import type { ChartSpec, ChartType, SlicerType } from './types';\r\nimport { CHART_TYPES, SLICER_TYPES } from './types';\r\n\r\nexport interface ValidationError {\r\n /** JSON-path-ish location, e.g. \"encoding.x.field\". */\r\n path: string;\r\n message: string;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n warnings: ValidationError[];\r\n}\r\n\r\nconst REQUIRED_CHANNELS: Record<ChartType, string[]> = {\r\n line: ['x', 'y'],\r\n area: ['x', 'y'],\r\n bar: ['x', 'y'],\r\n scatter: ['x', 'y'],\r\n pie: ['theta', 'color'],\r\n heatmap: ['x', 'y', 'color'],\r\n funnel: ['stage', 'value'],\r\n box: ['x', 'y'],\r\n sankey: ['source', 'target', 'value'],\r\n choropleth: ['key', 'color'],\r\n kpi: [],\r\n table: [],\r\n matrix: [],\r\n dropdown: [],\r\n search: [],\r\n list: [],\r\n range: [],\r\n dateRange: [],\r\n};\r\n\r\nconst AGG_OPS = ['sum', 'mean', 'avg', 'min', 'max', 'count', 'countDistinct', 'median', 'first', 'last'];\r\nconst DENSITIES = ['comfortable', 'standard', 'compact'];\r\nconst NEGATIVE_STYLES = ['sign', 'parens', 'red', 'parens-red'];\r\nconst SHOW_AS = ['value', 'percentOfRow', 'percentOfColumn', 'percentOfTotal'];\r\n\r\nfunction isObject(v: unknown): v is Record<string, unknown> {\r\n return typeof v === 'object' && v !== null && !Array.isArray(v);\r\n}\r\n\r\n/**\r\n * Validate a chart spec, returning friendly, path-pointed errors and warnings.\r\n * Designed so an agent can read the messages and fix its spec without guessing.\r\n */\r\nexport function validateSpec(spec: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationError[] = [];\r\n const err = (path: string, message: string) => errors.push({ path, message });\r\n const warn = (path: string, message: string) => warnings.push({ path, message });\r\n\r\n if (!isObject(spec)) {\r\n return {\r\n valid: false,\r\n errors: [{ path: '', message: 'Spec must be an object.' }],\r\n warnings: [],\r\n };\r\n }\r\n\r\n if (spec.type === 'dashboard') {\r\n return validateDashboard(spec);\r\n }\r\n\r\n const type = spec.type as ChartType | undefined;\r\n if (!type) {\r\n err('type', 'Missing required \"type\". Expected one of: ' + CHART_TYPES.join(', ') + '.');\r\n return { valid: false, errors, warnings };\r\n }\r\n if (!CHART_TYPES.includes(type)) {\r\n err('type', `Unknown chart type \"${String(type)}\". Expected one of: ${CHART_TYPES.join(', ')}.`);\r\n return { valid: false, errors, warnings };\r\n }\r\n\r\n // Data presence (KPI may use a literal value instead).\r\n const data = spec.data as unknown;\r\n const hasData = Array.isArray(data) && data.length > 0;\r\n if (type !== 'kpi') {\r\n if (data === undefined) {\r\n err('data', `\"${type}\" requires a \"data\" array of records.`);\r\n } else if (!Array.isArray(data)) {\r\n err('data', '\"data\" must be an array of records.');\r\n } else if (data.length === 0) {\r\n warn('data', '\"data\" is empty — the chart will render with no marks.');\r\n }\r\n }\r\n\r\n const firstRow = hasData ? (data as unknown[])[0] : undefined;\r\n const fieldsInData = isObject(firstRow) ? new Set(Object.keys(firstRow)) : null;\r\n\r\n const checkField = (path: string, field: unknown) => {\r\n if (typeof field !== 'string' || field === '') {\r\n err(path, 'Field reference must be a non-empty string.');\r\n return;\r\n }\r\n if (fieldsInData && !fieldsInData.has(field)) {\r\n warn(path, `Field \"${field}\" was not found in the first data row.`);\r\n }\r\n };\r\n\r\n // Encoding-based charts (those with required channels).\r\n if (REQUIRED_CHANNELS[type].length > 0) {\r\n const encoding = spec.encoding;\r\n if (!isObject(encoding)) {\r\n err('encoding', `\"${type}\" requires an \"encoding\" object.`);\r\n } else {\r\n for (const ch of REQUIRED_CHANNELS[type]) {\r\n const channel = encoding[ch];\r\n if (!isObject(channel)) {\r\n err(`encoding.${ch}`, `\"${type}\" requires the \"${ch}\" channel.`);\r\n } else {\r\n checkField(`encoding.${ch}.field`, channel.field);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (type === 'kpi') {\r\n const value = spec.value;\r\n if (value === undefined) {\r\n err('value', '\"kpi\" requires a \"value\" (a number or { field, aggregate? }).');\r\n } else if (isObject(value)) {\r\n checkField('value.field', value.field);\r\n } else if (typeof value !== 'number') {\r\n err('value', '\"value\" must be a number or an object with a \"field\".');\r\n }\r\n }\r\n\r\n if (type === 'matrix') {\r\n const rows = spec.rows;\r\n if (!Array.isArray(rows) || rows.length === 0) {\r\n err('rows', '\"matrix\" requires a non-empty \"rows\" array of field names.');\r\n } else {\r\n rows.forEach((f, i) => checkField(`rows[${i}]`, f));\r\n }\r\n const values = spec.values;\r\n if (!Array.isArray(values) || values.length === 0) {\r\n err('values', '\"matrix\" requires a non-empty \"values\" array of { field, op }.');\r\n } else {\r\n values.forEach((v, i) => {\r\n if (!isObject(v)) {\r\n err(`values[${i}]`, 'Each value must be an object { field, op }.');\r\n return;\r\n }\r\n checkField(`values[${i}].field`, v.field);\r\n if (typeof v.op !== 'string') err(`values[${i}].op`, 'Missing aggregation \"op\".');\r\n else if (!AGG_OPS.includes(v.op)) err(`values[${i}].op`, `Expected one of: ${AGG_OPS.join(', ')}.`);\r\n if (v.conditionalFormat !== undefined) validateConditionalFormat(`values[${i}].conditionalFormat`, v.conditionalFormat, err);\r\n if (v.negativeStyle !== undefined && !NEGATIVE_STYLES.includes(v.negativeStyle as string)) {\r\n err(`values[${i}].negativeStyle`, 'Expected \"sign\", \"parens\", \"red\", or \"parens-red\".');\r\n }\r\n if (v.showAs !== undefined && !SHOW_AS.includes(v.showAs as string)) {\r\n err(`values[${i}].showAs`, 'Expected \"value\", \"percentOfRow\", \"percentOfColumn\", or \"percentOfTotal\".');\r\n }\r\n for (const key of ['prefix', 'suffix'] as const) {\r\n if (v[key] !== undefined && typeof v[key] !== 'string') err(`values[${i}].${key}`, `\"${key}\" must be a string.`);\r\n }\r\n });\r\n }\r\n const columns = spec.columns;\r\n if (columns !== undefined && !Array.isArray(columns)) {\r\n err('columns', '\"columns\" must be an array of field names.');\r\n }\r\n if (spec.density !== undefined && !DENSITIES.includes(spec.density as string)) {\r\n err('density', 'Expected \"comfortable\", \"standard\", or \"compact\".');\r\n }\r\n if (spec.columnSort !== undefined) {\r\n if (!isObject(spec.columnSort)) {\r\n err('columnSort', '\"columnSort\" must be an object { by, valueIndex?, order? }.');\r\n } else {\r\n if (spec.columnSort.by !== 'value' && spec.columnSort.by !== 'label') {\r\n err('columnSort.by', 'Expected \"value\" or \"label\".');\r\n }\r\n if (\r\n spec.columnSort.valueIndex !== undefined &&\r\n (typeof spec.columnSort.valueIndex !== 'number' || !Number.isInteger(spec.columnSort.valueIndex) || spec.columnSort.valueIndex < 0)\r\n ) {\r\n err('columnSort.valueIndex', '\"valueIndex\" must be a non-negative integer.');\r\n }\r\n if (spec.columnSort.order !== undefined && spec.columnSort.order !== 'asc' && spec.columnSort.order !== 'desc') {\r\n err('columnSort.order', 'Expected \"asc\" or \"desc\".');\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (type === 'table') {\r\n const columns = spec.columns;\r\n if (columns !== undefined) {\r\n if (!Array.isArray(columns)) {\r\n err('columns', '\"columns\" must be an array of column definitions.');\r\n } else {\r\n columns.forEach((c, i) => {\r\n if (!isObject(c)) err(`columns[${i}]`, 'Each column must be an object.');\r\n else {\r\n checkField(`columns[${i}].field`, c.field);\r\n if (c.conditionalFormat !== undefined) validateConditionalFormat(`columns[${i}].conditionalFormat`, c.conditionalFormat, err);\r\n if (c.negativeStyle !== undefined && !NEGATIVE_STYLES.includes(c.negativeStyle as string)) {\r\n err(`columns[${i}].negativeStyle`, 'Expected \"sign\", \"parens\", \"red\", or \"parens-red\".');\r\n }\r\n for (const key of ['prefix', 'suffix', 'group'] as const) {\r\n if (c[key] !== undefined && typeof c[key] !== 'string') err(`columns[${i}].${key}`, `\"${key}\" must be a string.`);\r\n }\r\n for (const key of ['hidden', 'sortable', 'wrap'] as const) {\r\n if (c[key] !== undefined && typeof c[key] !== 'boolean') err(`columns[${i}].${key}`, `\"${key}\" must be a boolean.`);\r\n }\r\n if (c.total !== undefined && c.total !== false && (typeof c.total !== 'string' || !AGG_OPS.includes(c.total))) {\r\n err(`columns[${i}].total`, `Expected false or one of: ${AGG_OPS.join(', ')}.`);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (spec.density !== undefined && !DENSITIES.includes(spec.density as string)) {\r\n err('density', 'Expected \"comfortable\", \"standard\", or \"compact\".');\r\n }\r\n if (spec.totals !== undefined && typeof spec.totals !== 'boolean') {\r\n if (!isObject(spec.totals)) {\r\n err('totals', '\"totals\" must be a boolean or an object { label? }.');\r\n } else if (spec.totals.label !== undefined && typeof spec.totals.label !== 'string') {\r\n err('totals.label', '\"label\" must be a string.');\r\n }\r\n }\r\n }\r\n\r\n if (type === 'pie') {\r\n const labels = spec.labels;\r\n if (labels !== undefined && typeof labels !== 'boolean') {\r\n if (!isObject(labels)) {\r\n err('labels', '\"labels\" must be a boolean or a { show?, placement?, content?, minShare?, connector? } object.');\r\n } else {\r\n if (labels.show !== undefined && typeof labels.show !== 'boolean') {\r\n err('labels.show', '\"show\" must be a boolean.');\r\n }\r\n if (labels.placement !== undefined && !['inside', 'outside', 'auto'].includes(labels.placement as string)) {\r\n err('labels.placement', 'Expected \"inside\", \"outside\", or \"auto\".');\r\n }\r\n if (\r\n labels.content !== undefined &&\r\n !['percent', 'value', 'category', 'category-percent', 'category-value'].includes(labels.content as string)\r\n ) {\r\n err('labels.content', 'Expected \"percent\", \"value\", \"category\", \"category-percent\", or \"category-value\".');\r\n }\r\n if (\r\n labels.minShare !== undefined &&\r\n (typeof labels.minShare !== 'number' || labels.minShare < 0 || labels.minShare > 1)\r\n ) {\r\n err('labels.minShare', '\"minShare\" must be a number between 0 and 1.');\r\n }\r\n if (labels.connector !== undefined && !['slice', 'muted'].includes(labels.connector as string)) {\r\n err('labels.connector', 'Expected \"slice\" or \"muted\".');\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (type === 'choropleth') {\r\n const geo = spec.geo as { type?: unknown; features?: unknown } | undefined;\r\n if (!isObject(geo)) {\r\n err('geo', '\"choropleth\" requires a \"geo\" GeoJSON FeatureCollection.');\r\n } else if (geo.type !== 'FeatureCollection' || !Array.isArray(geo.features)) {\r\n err('geo', '\"geo\" must be a GeoJSON FeatureCollection with a \"features\" array.');\r\n } else if (geo.features.length === 0) {\r\n warn('geo', '\"geo.features\" is empty — the map will render nothing.');\r\n }\r\n }\r\n\r\n if (SLICER_TYPES.includes(type as SlicerType)) {\r\n checkField('field', spec.field);\r\n if (spec.param !== undefined && (typeof spec.param !== 'string' || spec.param === '')) {\r\n err('param', '\"param\" must be a non-empty string (defaults to the field name).');\r\n }\r\n if (spec.as !== undefined && spec.as !== 'filter' && spec.as !== 'highlight') {\r\n err('as', 'Expected \"filter\" or \"highlight\".');\r\n }\r\n const numberField = (key: string, min?: number) => {\r\n const v = spec[key];\r\n if (v !== undefined && (typeof v !== 'number' || !Number.isFinite(v) || (min != null && v < min))) {\r\n err(key, `\"${key}\" must be a finite number${min != null ? ` ≥ ${min}` : ''}.`);\r\n }\r\n };\r\n const boolField = (key: string) => {\r\n if (spec[key] !== undefined && typeof spec[key] !== 'boolean') {\r\n err(key, `\"${key}\" must be a boolean.`);\r\n }\r\n };\r\n if (type === 'dropdown') boolField('multiple');\r\n if (type === 'search') numberField('debounce', 0);\r\n if (type === 'list') {\r\n numberField('searchThreshold', 0);\r\n boolField('selectAll');\r\n }\r\n if (type === 'range') {\r\n numberField('min');\r\n numberField('max');\r\n numberField('step', 0);\r\n const lo = spec.min;\r\n const hi = spec.max;\r\n if (typeof lo === 'number' && typeof hi === 'number' && lo >= hi) {\r\n err('max', '\"max\" must be greater than \"min\".');\r\n }\r\n }\r\n if (type === 'dateRange') boolField('presets');\r\n }\r\n\r\n validateInteraction(spec, err, warn);\r\n\r\n const sketch = spec.sketch;\r\n if (sketch !== undefined && typeof sketch !== 'boolean') {\r\n if (!isObject(sketch)) {\r\n err('sketch', '\"sketch\" must be a boolean or a SketchConfig object.');\r\n } else {\r\n const fillStyle = sketch.fillStyle;\r\n if (fillStyle !== undefined && !['hachure', 'solid', 'cross-hatch'].includes(fillStyle as string)) {\r\n err('sketch.fillStyle', 'Expected \"hachure\", \"solid\", or \"cross-hatch\".');\r\n }\r\n for (const key of ['roughness', 'bowing', 'hachureGap', 'hachureAngle', 'strokeWidth', 'seed'] as const) {\r\n const v = sketch[key];\r\n if (v !== undefined && (typeof v !== 'number' || !Number.isFinite(v))) {\r\n err(`sketch.${key}`, `\"${key}\" must be a finite number.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors, warnings };\r\n}\r\n\r\ntype Reporter = (path: string, message: string) => void;\r\n\r\nfunction validateConditionalFormat(path: string, cf: unknown, err: Reporter): void {\r\n if (!isObject(cf)) {\r\n err(path, '\"conditionalFormat\" must be an object with a \"type\".');\r\n return;\r\n }\r\n if (!['colorScale', 'bar', 'icon', 'rules'].includes(cf.type as string)) {\r\n err(`${path}.type`, 'Expected \"colorScale\", \"bar\", \"icon\", or \"rules\".');\r\n return;\r\n }\r\n validateDomain(`${path}.domain`, cf.domain, err);\r\n if (cf.type === 'colorScale') {\r\n if (cf.midpoint !== undefined && (typeof cf.midpoint !== 'number' || !Number.isFinite(cf.midpoint))) {\r\n err(`${path}.midpoint`, '\"midpoint\" must be a finite number.');\r\n }\r\n if (cf.diverging !== undefined && typeof cf.diverging !== 'boolean') err(`${path}.diverging`, '\"diverging\" must be a boolean.');\r\n if (cf.target !== undefined && cf.target !== 'background' && cf.target !== 'text') {\r\n err(`${path}.target`, 'Expected \"background\" or \"text\".');\r\n }\r\n } else if (cf.type === 'bar') {\r\n if (cf.baseline !== undefined && cf.baseline !== 'zero' && cf.baseline !== 'min') {\r\n err(`${path}.baseline`, 'Expected \"zero\" or \"min\".');\r\n }\r\n if (cf.showValue !== undefined && typeof cf.showValue !== 'boolean') err(`${path}.showValue`, '\"showValue\" must be a boolean.');\r\n for (const key of ['color', 'negativeColor'] as const) {\r\n if (cf[key] !== undefined && typeof cf[key] !== 'string') err(`${path}.${key}`, `\"${key}\" must be a color string.`);\r\n }\r\n } else if (cf.type === 'icon') {\r\n if (cf.set !== undefined && !['arrows', 'triangles', 'dots', 'trafficLights'].includes(cf.set as string)) {\r\n err(`${path}.set`, 'Expected \"arrows\", \"triangles\", \"dots\", or \"trafficLights\".');\r\n }\r\n if (cf.position !== undefined && cf.position !== 'left' && cf.position !== 'right') {\r\n err(`${path}.position`, 'Expected \"left\" or \"right\".');\r\n }\r\n if (cf.rules !== undefined) validateRules(`${path}.rules`, cf.rules, err, true);\r\n } else if (!Array.isArray(cf.rules) || cf.rules.length === 0) {\r\n err(`${path}.rules`, '\"rules\" conditional formatting requires a non-empty \"rules\" array.');\r\n } else {\r\n validateRules(`${path}.rules`, cf.rules, err, false);\r\n }\r\n}\r\n\r\nfunction validateDomain(path: string, domain: unknown, err: Reporter): void {\r\n if (domain === undefined) return;\r\n if (!Array.isArray(domain) || domain.length !== 2 || domain.some((value) => typeof value !== 'number' || !Number.isFinite(value))) {\r\n err(path, '\"domain\" must be a [min, max] pair of finite numbers.');\r\n }\r\n}\r\n\r\nfunction validateRules(path: string, rules: unknown, err: Reporter, iconRules: boolean): void {\r\n if (!Array.isArray(rules)) {\r\n err(path, '\"rules\" must be an array.');\r\n return;\r\n }\r\n rules.forEach((rule, index) => {\r\n const rulePath = `${path}[${index}]`;\r\n if (!isObject(rule)) {\r\n err(rulePath, 'Each rule must be an object.');\r\n return;\r\n }\r\n if (!['gt', 'gte', 'lt', 'lte', 'eq', 'ne', 'between'].includes(rule.when as string)) {\r\n err(`${rulePath}.when`, 'Expected one of: gt, gte, lt, lte, eq, ne, between.');\r\n }\r\n if (iconRules || !['eq', 'ne'].includes(rule.when as string)) {\r\n if (typeof rule.value !== 'number' || !Number.isFinite(rule.value)) err(`${rulePath}.value`, '\"value\" must be a finite number.');\r\n } else if (typeof rule.value !== 'number' && typeof rule.value !== 'string') {\r\n err(`${rulePath}.value`, '\"value\" must be a number or string.');\r\n }\r\n if (rule.when === 'between' && (typeof rule.to !== 'number' || !Number.isFinite(rule.to))) {\r\n err(`${rulePath}.to`, '\"between\" rules require a finite numeric \"to\".');\r\n }\r\n if (rule.to !== undefined && (typeof rule.to !== 'number' || !Number.isFinite(rule.to))) {\r\n err(`${rulePath}.to`, '\"to\" must be a finite number.');\r\n }\r\n if (!iconRules) {\r\n if (rule.weight !== undefined && rule.weight !== 'bold' && rule.weight !== 'normal') {\r\n err(`${rulePath}.weight`, 'Expected \"bold\" or \"normal\".');\r\n }\r\n for (const key of ['background', 'color', 'icon'] as const) {\r\n if (rule[key] !== undefined && typeof rule[key] !== 'string') err(`${rulePath}.${key}`, `\"${key}\" must be a string.`);\r\n }\r\n } else {\r\n for (const key of ['icon', 'color'] as const) {\r\n if (rule[key] !== undefined && typeof rule[key] !== 'string') err(`${rulePath}.${key}`, `\"${key}\" must be a string.`);\r\n }\r\n }\r\n });\r\n}\r\n\r\nconst SELECTION_KINDS = ['point', 'set', 'range', 'text'];\r\n\r\n/**\r\n * Validate the cross-visual interaction surface shared by every spec: the\r\n * `params` a visual publishes, and the `highlight` / `filter` it consumes. Shape\r\n * checks only — `highlight`/`filter` often reference params defined on *other*\r\n * visuals (cross-highlight/cross-filter), so an unknown param name is not an\r\n * error here.\r\n */\r\nfunction validateInteraction(\r\n spec: Record<string, unknown>,\r\n err: Reporter,\r\n warn: Reporter,\r\n): void {\r\n const { params, highlight, filter } = spec;\r\n\r\n if (params !== undefined) {\r\n if (!Array.isArray(params)) {\r\n err('params', '\"params\" must be an array of selection definitions.');\r\n } else {\r\n const seen = new Set<string>();\r\n params.forEach((p, i) => {\r\n if (!isObject(p)) {\r\n err(`params[${i}]`, 'Each param must be an object { name, select }.');\r\n return;\r\n }\r\n if (typeof p.name !== 'string' || p.name === '') {\r\n err(`params[${i}].name`, 'A param needs a non-empty \"name\".');\r\n } else if (seen.has(p.name)) {\r\n err(`params[${i}].name`, `Duplicate param name \"${p.name}\".`);\r\n } else {\r\n seen.add(p.name);\r\n }\r\n const select = p.select;\r\n if (!isObject(select)) {\r\n err(`params[${i}].select`, 'A param needs a \"select\" with a \"type\".');\r\n } else if (select.type !== 'point' && select.type !== 'interval') {\r\n err(`params[${i}].select.type`, 'Expected \"point\" or \"interval\".');\r\n }\r\n if (p.value !== undefined && p.value !== null) {\r\n validateSelectionValue(`params[${i}].value`, p.value, err);\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (highlight !== undefined) {\r\n const configs = Array.isArray(highlight) ? highlight : [highlight];\r\n if (Array.isArray(highlight) && highlight.length === 0) {\r\n warn('highlight', '\"highlight\" is an empty array — nothing will be emphasized.');\r\n }\r\n configs.forEach((cfg, i) => {\r\n const path = Array.isArray(highlight) ? `highlight[${i}]` : 'highlight';\r\n if (!isObject(cfg) || typeof cfg.param !== 'string' || cfg.param === '') {\r\n err(path, '\"highlight\" must be an object { param } (or an array of them).');\r\n }\r\n });\r\n }\r\n\r\n if (filter !== undefined) {\r\n if (!Array.isArray(filter)) {\r\n err('filter', '\"filter\" must be an array of clauses (a { param } or a predicate).');\r\n } else {\r\n filter.forEach((clause, i) => {\r\n if (!isObject(clause)) {\r\n err(`filter[${i}]`, 'Each filter clause must be an object.');\r\n return;\r\n }\r\n if (typeof clause.param === 'string') {\r\n if (clause.param === '') err(`filter[${i}].param`, 'Param reference must be non-empty.');\r\n return;\r\n }\r\n if (typeof clause.field !== 'string' || clause.field === '') {\r\n err(`filter[${i}].field`, 'A literal filter clause needs a \"field\".');\r\n }\r\n const forms = ['equals', 'oneOf', 'range', 'contains'].filter((k) => k in clause);\r\n if (forms.length === 0) {\r\n err(`filter[${i}]`, 'A literal clause needs one of: equals, oneOf, range, contains.');\r\n } else if (forms.length > 1) {\r\n warn(`filter[${i}]`, `Multiple predicate forms (${forms.join(', ')}); the first is used.`);\r\n }\r\n if ('oneOf' in clause && !Array.isArray(clause.oneOf)) {\r\n err(`filter[${i}].oneOf`, '\"oneOf\" must be an array of values.');\r\n }\r\n if ('range' in clause && (!Array.isArray(clause.range) || clause.range.length !== 2)) {\r\n err(`filter[${i}].range`, '\"range\" must be a [min, max] pair.');\r\n }\r\n if ('contains' in clause && typeof clause.contains !== 'string') {\r\n err(`filter[${i}].contains`, '\"contains\" must be a string.');\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n/** Validate a resolved selection value object (initial param values). */\r\nfunction validateSelectionValue(path: string, value: unknown, err: Reporter): void {\r\n if (!isObject(value) || typeof value.kind !== 'string' || !SELECTION_KINDS.includes(value.kind)) {\r\n err(path, `Selection value \"kind\" must be one of: ${SELECTION_KINDS.join(', ')}.`);\r\n return;\r\n }\r\n if (value.kind === 'point') {\r\n if (!Array.isArray(value.fields)) err(`${path}.fields`, '\"point\" needs a \"fields\" array.');\r\n if (!Array.isArray(value.tuples)) err(`${path}.tuples`, '\"point\" needs a \"tuples\" array.');\r\n } else if (value.kind === 'set') {\r\n if (typeof value.field !== 'string') err(`${path}.field`, '\"set\" needs a \"field\".');\r\n if (!Array.isArray(value.values)) err(`${path}.values`, '\"set\" needs a \"values\" array.');\r\n } else if (value.kind === 'range') {\r\n if (typeof value.field !== 'string') err(`${path}.field`, '\"range\" needs a \"field\".');\r\n } else if (value.kind === 'text') {\r\n if (typeof value.field !== 'string') err(`${path}.field`, '\"text\" needs a \"field\".');\r\n if (typeof value.query !== 'string') err(`${path}.query`, '\"text\" needs a \"query\" string.');\r\n }\r\n}\r\n\r\n/**\r\n * Validate a {@link DashboardSpec}: view-id uniqueness, grid placement, each\r\n * view's nested spec (recursively, inheriting the dashboard's data so a view\r\n * doesn't error on \"missing data\"), the cross-interaction surface, and explicit\r\n * link references. Messages are path-pointed (e.g. `views[2].spec.encoding.x`).\r\n */\r\nexport function validateDashboard(spec: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationError[] = [];\r\n const err = (path: string, message: string) => errors.push({ path, message });\r\n const warn = (path: string, message: string) => warnings.push({ path, message });\r\n\r\n if (spec.data !== undefined && !Array.isArray(spec.data)) {\r\n err('data', '\"data\" must be an array of records.');\r\n }\r\n\r\n const ids = new Set<string>();\r\n const views = spec.views;\r\n\r\n if (!Array.isArray(views) || views.length === 0) {\r\n err('views', '\"dashboard\" requires a non-empty \"views\" array.');\r\n } else {\r\n views.forEach((v, i) => {\r\n if (!isObject(v)) {\r\n err(`views[${i}]`, 'Each view must be an object { id, spec }.');\r\n return;\r\n }\r\n if (typeof v.id !== 'string' || v.id === '') {\r\n err(`views[${i}].id`, 'A view needs a non-empty \"id\".');\r\n } else if (ids.has(v.id)) {\r\n err(`views[${i}].id`, `Duplicate view id \"${v.id}\".`);\r\n } else {\r\n ids.add(v.id);\r\n }\r\n for (const k of ['x', 'y', 'w', 'h'] as const) {\r\n const n = v[k];\r\n if (n !== undefined && (typeof n !== 'number' || !Number.isFinite(n) || n < 1)) {\r\n err(`views[${i}].${k}`, `\"${k}\" must be a positive number.`);\r\n }\r\n }\r\n for (const k of ['title', 'subtitle', 'background', 'accent'] as const) {\r\n if (v[k] !== undefined && typeof v[k] !== 'string') {\r\n err(`views[${i}].${k}`, `\"${k}\" must be a string.`);\r\n }\r\n }\r\n if (v.frame !== undefined && typeof v.frame !== 'boolean') {\r\n err(`views[${i}].frame`, '\"frame\" must be a boolean.');\r\n }\r\n if (v.padding !== undefined && v.padding !== 'none' && v.padding !== 'standard') {\r\n err(`views[${i}].padding`, 'Expected \"none\" or \"standard\".');\r\n }\r\n if (v.responsive !== undefined) {\r\n if (!Array.isArray(v.responsive)) {\r\n err(`views[${i}].responsive`, '\"responsive\" must be an array of { maxWidth, w?, h?, hidden? }.');\r\n } else {\r\n v.responsive.forEach((rule, j) => {\r\n if (!isObject(rule)) {\r\n err(`views[${i}].responsive[${j}]`, 'Each responsive rule must be an object { maxWidth, w?, h?, hidden? }.');\r\n return;\r\n }\r\n const maxWidth = rule.maxWidth;\r\n if (typeof maxWidth !== 'number' || !Number.isFinite(maxWidth) || maxWidth < 1) {\r\n err(`views[${i}].responsive[${j}].maxWidth`, '\"maxWidth\" must be a positive number.');\r\n }\r\n for (const k of ['w', 'h'] as const) {\r\n const n = rule[k];\r\n if (n !== undefined && (typeof n !== 'number' || !Number.isFinite(n) || n < 1)) {\r\n err(`views[${i}].responsive[${j}].${k}`, `\"${k}\" must be a positive number.`);\r\n }\r\n }\r\n if (rule.hidden !== undefined && typeof rule.hidden !== 'boolean') {\r\n err(`views[${i}].responsive[${j}].hidden`, '\"hidden\" must be a boolean.');\r\n }\r\n });\r\n }\r\n }\r\n if (!isObject(v.spec)) {\r\n err(`views[${i}].spec`, 'A view needs a \"spec\" (a chart or slicer).');\r\n return;\r\n }\r\n const childSpec =\r\n v.spec.data === undefined && Array.isArray(spec.data)\r\n ? { ...v.spec, data: spec.data }\r\n : v.spec;\r\n const res = validateSpec(childSpec);\r\n const prefix = (p: string) => (p ? `views[${i}].spec.${p}` : `views[${i}].spec`);\r\n for (const e of res.errors) err(prefix(e.path), e.message);\r\n for (const w of res.warnings) warn(prefix(w.path), w.message);\r\n });\r\n }\r\n\r\n // Dashboard-level params / highlight / filter (shape only).\r\n validateInteraction(spec, err, warn);\r\n\r\n const interactions = spec.interactions;\r\n if (interactions !== undefined && interactions !== 'auto' && interactions !== 'none') {\r\n if (!Array.isArray(interactions)) {\r\n err('interactions', '\"interactions\" must be \"auto\", \"none\", or an array of links.');\r\n } else {\r\n interactions.forEach((link, i) => {\r\n if (!isObject(link)) {\r\n err(`interactions[${i}]`, 'Each link must be an object { source, target }.');\r\n return;\r\n }\r\n if (typeof link.source !== 'string' || !ids.has(link.source)) {\r\n err(`interactions[${i}].source`, 'Link \"source\" must reference a view id.');\r\n }\r\n if (link.target === undefined) {\r\n err(`interactions[${i}].target`, 'Link needs a \"target\" (a view id, an array, or \"*\").');\r\n } else if (link.target !== '*') {\r\n const targets = Array.isArray(link.target) ? link.target : [link.target];\r\n targets.forEach((t, j) => {\r\n if (typeof t !== 'string' || !ids.has(t)) {\r\n const suffix = Array.isArray(link.target) ? `[${j}]` : '';\r\n err(`interactions[${i}].target${suffix}`, 'Link \"target\" must reference a view id.');\r\n }\r\n });\r\n }\r\n if (link.as !== undefined && !['highlight', 'filter', 'none'].includes(link.as as string)) {\r\n err(`interactions[${i}].as`, 'Expected \"highlight\", \"filter\", or \"none\".');\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (spec.subtitle !== undefined && typeof spec.subtitle !== 'string') {\r\n err('subtitle', '\"subtitle\" must be a string.');\r\n }\r\n\r\n const layout = spec.layout;\r\n if (layout !== undefined) {\r\n if (!isObject(layout)) {\r\n err('layout', '\"layout\" must be an object { cols?, rowHeight?, gap?, breakpoints?, navigators?, sections? }.');\r\n } else {\r\n for (const k of ['cols', 'rowHeight', 'gap', 'maxWidth', 'padding'] as const) {\r\n const n = layout[k];\r\n if (n !== undefined && (typeof n !== 'number' || !Number.isFinite(n) || n < 0)) {\r\n err(`layout.${k}`, `\"${k}\" must be a non-negative number.`);\r\n }\r\n }\r\n if (layout.navigators !== undefined && layout.navigators !== 'top' && layout.navigators !== 'inline') {\r\n err('layout.navigators', 'Expected \"top\" or \"inline\".');\r\n }\r\n if (layout.preset !== undefined && !['auto', 'kpi-first', 'sidebar'].includes(layout.preset as string)) {\r\n err('layout.preset', 'Expected \"auto\", \"kpi-first\", or \"sidebar\".');\r\n }\r\n if (layout.density !== undefined && !['compact', 'standard', 'comfortable'].includes(layout.density as string)) {\r\n err('layout.density', 'Expected \"compact\", \"standard\", or \"comfortable\".');\r\n }\r\n if (layout.breakpoints !== undefined) {\r\n if (!Array.isArray(layout.breakpoints)) {\r\n err('layout.breakpoints', '\"breakpoints\" must be an array of { maxWidth, cols }.');\r\n } else {\r\n layout.breakpoints.forEach((bp, i) => {\r\n if (!isObject(bp)) {\r\n err(`layout.breakpoints[${i}]`, 'Each breakpoint must be an object { maxWidth, cols }.');\r\n return;\r\n }\r\n for (const k of ['maxWidth', 'cols'] as const) {\r\n const n = bp[k];\r\n if (typeof n !== 'number' || !Number.isFinite(n) || n < 1) {\r\n err(`layout.breakpoints[${i}].${k}`, `\"${k}\" must be a positive number.`);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (layout.sections !== undefined) {\r\n if (!Array.isArray(layout.sections)) {\r\n err('layout.sections', '\"sections\" must be an array of dashboard sections.');\r\n } else {\r\n const sectionViewIds = new Set<string>();\r\n layout.sections.forEach((section, i) => {\r\n if (!isObject(section)) {\r\n err(`layout.sections[${i}]`, 'Each section must be an object { views }.');\r\n return;\r\n }\r\n for (const k of ['id', 'title', 'subtitle', 'background'] as const) {\r\n if (section[k] !== undefined && typeof section[k] !== 'string') {\r\n err(`layout.sections[${i}].${k}`, `\"${k}\" must be a string.`);\r\n }\r\n }\r\n for (const k of ['cols', 'rowHeight'] as const) {\r\n const n = section[k];\r\n if (n !== undefined && (typeof n !== 'number' || !Number.isFinite(n) || n < 1)) {\r\n err(`layout.sections[${i}].${k}`, `\"${k}\" must be a positive number.`);\r\n }\r\n }\r\n if (section.collapsed !== undefined && typeof section.collapsed !== 'boolean') {\r\n err(`layout.sections[${i}].collapsed`, '\"collapsed\" must be a boolean.');\r\n }\r\n if (!Array.isArray(section.views)) {\r\n err(`layout.sections[${i}].views`, '\"views\" must be an array of view ids.');\r\n } else {\r\n section.views.forEach((id, j) => {\r\n const path = `layout.sections[${i}].views[${j}]`;\r\n if (typeof id !== 'string' || id === '') {\r\n err(path, 'Section view references must be non-empty strings.');\r\n } else if (!ids.has(id)) {\r\n err(path, `Section view \"${id}\" must reference an existing view id.`);\r\n } else if (sectionViewIds.has(id)) {\r\n err(path, `View \"${id}\" is already assigned to another section.`);\r\n } else {\r\n sectionViewIds.add(id);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors, warnings };\r\n}\r\n\r\nexport function assertValidSpec(spec: unknown): ChartSpec {\r\n const { valid, errors } = validateSpec(spec);\r\n if (!valid) {\r\n const detail = errors.map((e) => ` - ${e.path || '(root)'}: ${e.message}`).join('\\n');\r\n throw new Error(`Invalid Graphein chart spec:\\n${detail}`);\r\n }\r\n return spec as ChartSpec;\r\n}","/**\r\n * Resolve a spec's `sketch` option into concrete, fully-defaulted knobs for the\r\n * rough engine. Returns `null` when sketching is off, which lets every chart\r\n * keep its pixel-identical clean path with a single early check.\r\n *\r\n * The seed is derived deterministically from the spec's identity when the author\r\n * doesn't pass one, so the same chart always wobbles the same way (required for\r\n * the screenshot harness).\r\n */\r\n\r\nimport { DEFAULT_ROUGH_STYLE, hashString, type RoughStyle } from '../rough';\r\nimport type { BaseSpec, ChartSpec, SketchConfig } from './types';\r\n\r\n/** Fully-resolved sketch settings handed to charts / the rough pen. */\r\nexport interface ResolvedSketch extends RoughStyle {\r\n /** Whether text should use the hand-drawn font. */\r\n font: boolean;\r\n}\r\n\r\nfunction deriveSeed(spec: ChartSpec): number {\r\n const title =\r\n typeof spec.title === 'string' ? spec.title : (spec.title?.text ?? spec.title?.subtitle ?? '');\r\n const dataLen = Array.isArray(spec.data) ? spec.data.length : 0;\r\n const firstRow = Array.isArray(spec.data) && spec.data[0] ? Object.keys(spec.data[0]).join(',') : '';\r\n return hashString(`${spec.type}|${title}|${dataLen}|${firstRow}`) || 1;\r\n}\r\n\r\n/**\r\n * Map `spec.sketch` to a `ResolvedSketch`, or `null` when disabled.\r\n * `sketch: true` uses all defaults; an object overrides individual knobs.\r\n */\r\nexport function resolveSketch(spec: ChartSpec): ResolvedSketch | null {\r\n const sketch = (spec as BaseSpec).sketch;\r\n if (!sketch) return null;\r\n const cfg: SketchConfig = sketch === true ? {} : sketch;\r\n\r\n return {\r\n roughness: cfg.roughness ?? DEFAULT_ROUGH_STYLE.roughness,\r\n bowing: cfg.bowing ?? DEFAULT_ROUGH_STYLE.bowing,\r\n fillStyle: cfg.fillStyle ?? DEFAULT_ROUGH_STYLE.fillStyle,\r\n hachureGap: cfg.hachureGap ?? DEFAULT_ROUGH_STYLE.hachureGap,\r\n hachureAngle: cfg.hachureAngle ?? DEFAULT_ROUGH_STYLE.hachureAngle,\r\n strokeWidth: cfg.strokeWidth ?? DEFAULT_ROUGH_STYLE.strokeWidth,\r\n seed: (cfg.seed ?? deriveSeed(spec)) >>> 0,\r\n font: cfg.font ?? true,\r\n };\r\n}\r\n","/**\r\n * Number formatting — a pragmatic subset of the d3-format mini-language, enough\r\n * for agent-authored specs without a runtime dependency.\r\n *\r\n * Grammar: [$][,][.precision][type]\r\n * $ prefix a currency symbol\r\n * , group thousands\r\n * .N precision (digits after the decimal, or significant digits)\r\n * type:\r\n * f fixed-point (.2f → 3.14)\r\n * % percent (×100) (.0% → 42%)\r\n * s SI suffix (.1s → 1.2k, 3.4M)\r\n * d integer (rounded) (,d → 1,234)\r\n * e exponential (.2e → 1.23e+4)\r\n * g significant digits (.3g → 12300)\r\n * (none) → smart default: trims trailing zeros, optional grouping\r\n */\r\n\r\nexport interface NumberFormatSpec {\r\n currency?: string;\r\n group?: boolean;\r\n precision?: number;\r\n type?: 'f' | '%' | 's' | 'd' | 'e' | 'g' | '';\r\n}\r\n\r\nconst FORMAT_RE = /^(\\$)?(,)?(?:\\.(\\d+))?([f%sdeg])?$/;\r\n\r\nconst cache = new Map<string, NumberFormatSpec>();\r\n\r\nexport function parseNumberFormat(spec: string): NumberFormatSpec {\r\n const cached = cache.get(spec);\r\n if (cached) return cached;\r\n const m = FORMAT_RE.exec(spec.trim());\r\n const parsed: NumberFormatSpec = m\r\n ? {\r\n currency: m[1] ? '$' : undefined,\r\n group: Boolean(m[2]),\r\n precision: m[3] != null ? Number(m[3]) : undefined,\r\n type: (m[4] as NumberFormatSpec['type']) ?? '',\r\n }\r\n : {};\r\n cache.set(spec, parsed);\r\n return parsed;\r\n}\r\n\r\nconst SI_SYMBOLS: Array<[number, string]> = [\r\n [1e12, 'T'],\r\n [1e9, 'B'],\r\n [1e6, 'M'],\r\n [1e3, 'k'],\r\n];\r\n\r\nfunction groupThousands(intDigits: string): string {\r\n return intDigits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n}\r\n\r\nfunction applyGroup(numStr: string, group: boolean): string {\r\n if (!group) return numStr;\r\n const neg = numStr.startsWith('-');\r\n const body = neg ? numStr.slice(1) : numStr;\r\n const dot = body.indexOf('.');\r\n const intPart = dot === -1 ? body : body.slice(0, dot);\r\n const rest = dot === -1 ? '' : body.slice(dot);\r\n return (neg ? '-' : '') + groupThousands(intPart) + rest;\r\n}\r\n\r\nfunction trimZeros(s: string): string {\r\n if (s.indexOf('.') === -1) return s;\r\n return s.replace(/\\.?0+$/, '');\r\n}\r\n\r\nfunction formatSI(value: number, precision?: number): string {\r\n const abs = Math.abs(value);\r\n for (const [factor, symbol] of SI_SYMBOLS) {\r\n if (abs >= factor) {\r\n const scaled = value / factor;\r\n const digits = precision ?? (Math.abs(scaled) >= 100 ? 0 : Math.abs(scaled) >= 10 ? 1 : 2);\r\n return trimZeros(scaled.toFixed(digits)) + symbol;\r\n }\r\n }\r\n const digits = precision ?? (abs >= 100 || abs === 0 ? 0 : abs >= 1 ? 1 : 2);\r\n return trimZeros(value.toFixed(digits));\r\n}\r\n\r\n/** Format a number according to a parsed or string spec. */\r\nexport function formatNumber(value: number, spec?: string | NumberFormatSpec): string {\r\n if (value == null || Number.isNaN(value)) return '';\r\n if (!Number.isFinite(value)) return value > 0 ? '∞' : '-∞';\r\n const f: NumberFormatSpec = typeof spec === 'string' ? parseNumberFormat(spec) : spec ?? {};\r\n const { currency, group = false, precision, type = '' } = f;\r\n\r\n let body: string;\r\n switch (type) {\r\n case 'f':\r\n body = applyGroup(value.toFixed(precision ?? 2), group);\r\n break;\r\n case '%':\r\n body = applyGroup((value * 100).toFixed(precision ?? 0), group) + '%';\r\n break;\r\n case 's':\r\n body = formatSI(value, precision);\r\n break;\r\n case 'd':\r\n body = applyGroup(Math.round(value).toString(), group);\r\n break;\r\n case 'e':\r\n body = value.toExponential(precision ?? 2);\r\n break;\r\n case 'g':\r\n body = trimZeros(Number(value.toPrecision(precision ?? 6)).toString());\r\n body = applyGroup(body, group);\r\n break;\r\n default: {\r\n // Smart default: integers stay integers; floats trim to `precision` (or 6).\r\n if (Number.isInteger(value)) {\r\n body = applyGroup(value.toString(), group);\r\n } else {\r\n const digits = precision ?? 6;\r\n body = applyGroup(trimZeros(value.toFixed(digits)), group);\r\n }\r\n }\r\n }\r\n\r\n if (currency) {\r\n const neg = body.startsWith('-');\r\n return (neg ? '-' : '') + currency + (neg ? body.slice(1) : body);\r\n }\r\n return body;\r\n}\r\n","/**\r\n * Date formatting — strftime-style tokens, plus a \"smart\" formatter that picks\r\n * a sensible representation from the time span being shown (used by time axes).\r\n */\r\n\r\nconst MONTHS = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nfunction pad(n: number, width = 2): string {\r\n return String(n).padStart(width, '0');\r\n}\r\n\r\nconst TOKENS: Record<string, (d: Date) => string> = {\r\n Y: (d) => String(d.getFullYear()),\r\n y: (d) => pad(d.getFullYear() % 100),\r\n m: (d) => pad(d.getMonth() + 1),\r\n d: (d) => pad(d.getDate()),\r\n e: (d) => String(d.getDate()),\r\n H: (d) => pad(d.getHours()),\r\n I: (d) => pad(((d.getHours() + 11) % 12) + 1),\r\n M: (d) => pad(d.getMinutes()),\r\n S: (d) => pad(d.getSeconds()),\r\n L: (d) => pad(d.getMilliseconds(), 3),\r\n p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'),\r\n b: (d) => MONTHS[d.getMonth()].slice(0, 3),\r\n B: (d) => MONTHS[d.getMonth()],\r\n a: (d) => DAYS[d.getDay()].slice(0, 3),\r\n A: (d) => DAYS[d.getDay()],\r\n j: (d) => {\r\n const start = new Date(d.getFullYear(), 0, 0);\r\n const diff = d.getTime() - start.getTime();\r\n return pad(Math.floor(diff / 86_400_000), 3);\r\n },\r\n};\r\n\r\n/** Format a date with a strftime-like pattern, e.g. `%b %Y` → \"Jan 2024\". */\r\nexport function formatDate(value: Date | number, pattern: string): string {\r\n const d = value instanceof Date ? value : new Date(value);\r\n if (Number.isNaN(d.getTime())) return '';\r\n let out = '';\r\n for (let i = 0; i < pattern.length; i++) {\r\n const ch = pattern[i];\r\n if (ch === '%' && i + 1 < pattern.length) {\r\n const tok = pattern[++i];\r\n if (tok === '%') out += '%';\r\n else out += TOKENS[tok] ? TOKENS[tok](d) : '%' + tok;\r\n } else {\r\n out += ch;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Smart, span-aware label for a tick on a time axis. Picks granularity from the\r\n * distance between adjacent ticks so labels stay compact and legible.\r\n */\r\nexport function smartDate(value: Date | number, stepMs: number): string {\r\n const d = value instanceof Date ? value : new Date(value);\r\n if (Number.isNaN(d.getTime())) return '';\r\n const SECOND = 1000;\r\n const MINUTE = 60 * SECOND;\r\n const HOUR = 60 * MINUTE;\r\n const DAY = 24 * HOUR;\r\n const MONTH = 30 * DAY;\r\n const YEAR = 365 * DAY;\r\n\r\n if (stepMs < SECOND) return formatDate(d, '%H:%M:%S.%L');\r\n if (stepMs < MINUTE) return formatDate(d, '%H:%M:%S');\r\n if (stepMs < DAY) return formatDate(d, '%H:%M');\r\n if (stepMs < MONTH) return formatDate(d, '%b %e');\r\n if (stepMs < YEAR) return formatDate(d, '%b %Y');\r\n return formatDate(d, '%Y');\r\n}\r\n\r\n/** A standalone, context-free pretty date used by tooltips. */\r\nexport function prettyDate(value: Date | number): string {\r\n const d = value instanceof Date ? value : new Date(value);\r\n if (Number.isNaN(d.getTime())) return '';\r\n const hasTime = d.getHours() !== 0 || d.getMinutes() !== 0 || d.getSeconds() !== 0;\r\n return hasTime ? formatDate(d, '%b %e, %Y %H:%M') : formatDate(d, '%b %e, %Y');\r\n}\r\n","/**\r\n * Data access helpers shared by charts, tables, and the pivot engine.\r\n *\r\n * All chart input is a tidy array of records (`Datum`). These helpers read\r\n * fields, coerce values, and compute the summaries (extent, unique values,\r\n * series groups) that scales and layout need. Kept pure and dependency-free so\r\n * they unit-test in node.\r\n */\r\n\r\nimport type { Datum, FieldType } from '../types';\r\n\r\n/** Read a (possibly nested, dot-separated) field from a record. */\r\nexport function getField(datum: Datum, field: string): unknown {\r\n if (field in datum) return datum[field];\r\n if (field.indexOf('.') === -1) return undefined;\r\n let cur: unknown = datum;\r\n for (const part of field.split('.')) {\r\n if (cur == null || typeof cur !== 'object') return undefined;\r\n cur = (cur as Record<string, unknown>)[part];\r\n }\r\n return cur;\r\n}\r\n\r\n/** True when a record carries `field` as a (possibly nested) column key. */\r\nexport function hasField(datum: Datum, field: string): boolean {\r\n if (field in datum) return true;\r\n if (field.indexOf('.') === -1) return false;\r\n let cur: unknown = datum;\r\n for (const part of field.split('.')) {\r\n if (cur == null || typeof cur !== 'object' || !(part in (cur as object))) return false;\r\n cur = (cur as Record<string, unknown>)[part];\r\n }\r\n return true;\r\n}\r\n\r\n/** Build a fast accessor for a field. */\r\nexport function accessor(field: string): (d: Datum) => unknown {\r\n if (field.indexOf('.') === -1) return (d) => d[field];\r\n return (d) => getField(d, field);\r\n}\r\n\r\n/** Coerce a value to a finite number, or NaN when it cannot be represented. */\r\nexport function toNumber(value: unknown): number {\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'boolean') return value ? 1 : 0;\r\n if (value instanceof Date) return value.getTime();\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (trimmed === '') return NaN;\r\n const n = Number(trimmed);\r\n return Number.isNaN(n) ? NaN : n;\r\n }\r\n return NaN;\r\n}\r\n\r\n/** Coerce a value to a Date, or null when it cannot be parsed. */\r\nconst ISO_DATE_RE = /^(\\d{4})-(\\d{2})(?:-(\\d{2}))?$/;\r\n\r\nexport function toDate(value: unknown): Date | null {\r\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\r\n if (typeof value === 'number') {\r\n const d = new Date(value);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n }\r\n if (typeof value === 'string') {\r\n // Bare ISO dates (YYYY-MM / YYYY-MM-DD) have no zone; the JS spec parses\r\n // them as UTC, which then renders as the previous day in any timezone west\r\n // of UTC. Parse them in LOCAL time so the calendar day matches the input.\r\n // Date-time (with a clock) and slash forms are already local via Date.parse.\r\n const m = ISO_DATE_RE.exec(value);\r\n if (m) return new Date(+m[1], +m[2] - 1, m[3] ? +m[3] : 1);\r\n const ms = Date.parse(value);\r\n return Number.isNaN(ms) ? null : new Date(ms);\r\n }\r\n return null;\r\n}\r\n\r\n/** Stable string key for grouping (dates by epoch, null as \"\"). */\r\nexport function toKey(value: unknown): string {\r\n if (value == null) return '';\r\n if (value instanceof Date) return String(value.getTime());\r\n return String(value);\r\n}\r\n\r\n/** Numeric [min, max] over the finite numeric values of a field. */\r\nexport function extent(data: readonly Datum[], field: string): [number, number] | null {\r\n const read = accessor(field);\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (const d of data) {\r\n const n = toNumber(read(d));\r\n if (Number.isNaN(n)) continue;\r\n if (n < min) min = n;\r\n if (n > max) max = n;\r\n }\r\n return min === Infinity ? null : [min, max];\r\n}\r\n\r\n/** Numeric [min, max] over a raw numeric array. */\r\nexport function extentOf(values: readonly number[]): [number, number] | null {\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (const n of values) {\r\n if (Number.isNaN(n)) continue;\r\n if (n < min) min = n;\r\n if (n > max) max = n;\r\n }\r\n return min === Infinity ? null : [min, max];\r\n}\r\n\r\n/** Distinct values of a field, in first-seen order. */\r\nexport function uniqueValues(data: readonly Datum[], field: string): unknown[] {\r\n const read = accessor(field);\r\n const seen = new Set<string>();\r\n const out: unknown[] = [];\r\n for (const d of data) {\r\n const v = read(d);\r\n const k = toKey(v);\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(v);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Distinct values coerced to display strings, in first-seen order. */\r\nexport function uniqueStrings(data: readonly Datum[], field: string): string[] {\r\n return uniqueValues(data, field).map((v) => (v == null ? '' : String(v)));\r\n}\r\n\r\nexport interface Series {\r\n /** Group key (series name). */\r\n key: string;\r\n /** Raw value of the series field (Date/number/string). */\r\n value: unknown;\r\n rows: Datum[];\r\n}\r\n\r\n/**\r\n * Split rows into series by a field, preserving first-seen order. When `field`\r\n * is undefined the whole dataset is one unnamed series.\r\n */\r\nexport function groupBySeries(data: readonly Datum[], field?: string): Series[] {\r\n if (!field) return [{ key: '', value: undefined, rows: data as Datum[] }];\r\n const read = accessor(field);\r\n const index = new Map<string, Series>();\r\n const order: Series[] = [];\r\n for (const d of data) {\r\n const v = read(d);\r\n const k = toKey(v);\r\n let s = index.get(k);\r\n if (!s) {\r\n s = { key: k, value: v, rows: [] };\r\n index.set(k, s);\r\n order.push(s);\r\n }\r\n s.rows.push(d);\r\n }\r\n return order;\r\n}\r\n\r\n/**\r\n * Infer a field's encoding type by sampling its values.\r\n * Numbers → quantitative, Dates / ISO-ish strings → temporal, else nominal.\r\n */\r\nexport function inferType(data: readonly Datum[], field: string): FieldType {\r\n const read = accessor(field);\r\n let numbers = 0;\r\n let dates = 0;\r\n let total = 0;\r\n for (const d of data) {\r\n const v = read(d);\r\n if (v == null || v === '') continue;\r\n total++;\r\n if (typeof v === 'number') {\r\n numbers++;\r\n } else if (v instanceof Date) {\r\n dates++;\r\n } else if (typeof v === 'string') {\r\n if (!Number.isNaN(Number(v)) && v.trim() !== '') numbers++;\r\n else if (looksTemporal(v)) dates++;\r\n }\r\n if (total >= 200) break;\r\n }\r\n if (total === 0) return 'nominal';\r\n if (dates > 0 && dates >= numbers) return 'temporal';\r\n if (numbers / total >= 0.8) return 'quantitative';\r\n return 'nominal';\r\n}\r\n\r\nconst TEMPORAL_RE =\r\n /^\\d{4}-\\d{2}(-\\d{2})?([ T]\\d{2}:\\d{2})?|^\\d{4}\\/\\d{1,2}\\/\\d{1,2}|^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}/;\r\n\r\nfunction looksTemporal(s: string): boolean {\r\n if (!TEMPORAL_RE.test(s)) return false;\r\n return !Number.isNaN(Date.parse(s));\r\n}\r\n\r\n/** Sum a numeric field across rows (ignoring non-numeric). */\r\nexport function sumField(rows: readonly Datum[], field: string): number {\r\n const read = accessor(field);\r\n let total = 0;\r\n for (const d of rows) {\r\n const n = toNumber(read(d));\r\n if (!Number.isNaN(n)) total += n;\r\n }\r\n return total;\r\n}\r\n","import { formatNumber } from './number';\r\nimport { formatDate, prettyDate } from './date';\r\nimport { toDate } from '../util/data';\r\n\r\n/**\r\n * Format any field value for display. Routes by value type and an optional\r\n * format hint:\r\n * - a hint containing `%` → strftime date pattern\r\n * - otherwise → number format mini-language (when the value is numeric)\r\n * - Dates without a hint use a friendly default; everything else stringifies.\r\n *\r\n * Because JSON has no Date type, agent-authored specs pass dates as ISO-ish\r\n * strings. When a `%` (date) hint is supplied for such a string we parse it and\r\n * format as a date, so e.g. a table column `{ format: '%b %e, %Y' }` over\r\n * `\"2024-05-02\"` renders `May 2, 2024` rather than the raw string.\r\n */\r\nexport function formatValue(value: unknown, hint?: string): string {\r\n if (value == null) return '';\r\n if (value instanceof Date) {\r\n return hint && hint.indexOf('%') !== -1 ? formatDate(value, hint) : prettyDate(value);\r\n }\r\n if (typeof value === 'number') {\r\n if (hint && hint.indexOf('%') !== -1 && !/^[$,.\\d]*[f%sdeg]?$/.test(hint)) {\r\n return formatDate(value, hint);\r\n }\r\n return formatNumber(value, hint);\r\n }\r\n if (typeof value === 'boolean') return value ? 'true' : 'false';\r\n if (typeof value === 'string') {\r\n if (hint && hint.indexOf('%') !== -1) {\r\n const d = toDate(value);\r\n if (d) return formatDate(d, hint);\r\n }\r\n return value;\r\n }\r\n return String(value);\r\n}\r\n\r\nexport * from './number';\r\nexport * from './date';\r\n","/**\r\n * Layout engine.\r\n *\r\n * Given the surface size, theme typography, and what the chart needs to show\r\n * (title, legend, axis tick labels), `computeFrame` reserves space for each\r\n * region and returns the plot rectangle where marks are drawn. It is pure (text\r\n * widths come from an injected measurer) so it unit-tests in node.\r\n */\r\n\r\nimport type { Insets, Rect } from '../types';\r\nimport type { LegendPosition } from '../spec/types';\r\nimport type { ThemeFont } from '../theme';\r\nimport { measureText, fontString } from '../render/text';\r\n\r\nexport interface LegendItem {\r\n label: string;\r\n color: string;\r\n /** Marker style; defaults to a filled swatch. */\r\n symbol?: 'square' | 'line' | 'circle';\r\n}\r\n\r\nexport interface PositionedLegendItem extends LegendItem {\r\n x: number;\r\n y: number;\r\n /** Total item width (swatch + gap + label). */\r\n width: number;\r\n}\r\n\r\nexport interface TitleInput {\r\n text?: string;\r\n subtitle?: string;\r\n align?: 'left' | 'center' | 'right';\r\n}\r\n\r\nexport interface AxisInput {\r\n show: boolean;\r\n /** Formatted tick labels used to measure the gutter. */\r\n labels: string[];\r\n title?: string;\r\n /**\r\n * True when the first/last ticks sit exactly on the plot's horizontal edges\r\n * (linear/time scales), so half of each edge label overflows the plot and the\r\n * layout must reserve room for it. Band scales inset their labels, so this is\r\n * false/omitted for them.\r\n */\r\n edgeAnchored?: boolean;\r\n}\r\n\r\nexport interface FrameInput {\r\n width: number;\r\n height: number;\r\n padding: Insets;\r\n font: ThemeFont;\r\n title?: TitleInput;\r\n legend?: { items: LegendItem[]; position: LegendPosition };\r\n /** Cartesian charts pass both axes; non-cartesian omit them. */\r\n xAxis?: AxisInput;\r\n yAxis?: AxisInput;\r\n}\r\n\r\nexport interface Frame {\r\n width: number;\r\n height: number;\r\n plot: Rect;\r\n titleRect?: Rect;\r\n subtitleRect?: Rect;\r\n legendRect?: Rect;\r\n legendItems?: PositionedLegendItem[];\r\n legendPosition?: LegendPosition;\r\n}\r\n\r\nexport const TICK_SIZE = 6;\r\nconst AXIS_LABEL_GAP = 6;\r\nconst AXIS_TITLE_GAP = 4;\r\nconst LEGEND_SWATCH = 11;\r\nconst LEGEND_SWATCH_GAP = 6;\r\nconst LEGEND_ITEM_GAP = 16;\r\nconst LEGEND_ROW_GAP = 6;\r\nconst LEGEND_PAD = 4;\r\n\r\nconst lineHeight = (size: number): number => Math.round(size * 1.35);\r\n\r\nfunction legendItemWidth(label: string, font: ThemeFont): number {\r\n const w = measureText(label, fontString(font.size.small, font.family, font.weight.normal)).width;\r\n return LEGEND_SWATCH + LEGEND_SWATCH_GAP + Math.ceil(w);\r\n}\r\n\r\ninterface LegendBlock {\r\n width: number;\r\n height: number;\r\n items: PositionedLegendItem[];\r\n}\r\n\r\n/** Lay out legend items within a max width/height, returning size + positions. */\r\nfunction layoutLegend(\r\n items: LegendItem[],\r\n position: LegendPosition,\r\n font: ThemeFont,\r\n maxWidth: number,\r\n maxHeight: number,\r\n): LegendBlock {\r\n const rowH = Math.max(LEGEND_SWATCH, lineHeight(font.size.small));\r\n const horizontal = position === 'top' || position === 'bottom';\r\n\r\n if (horizontal) {\r\n const rows: PositionedLegendItem[][] = [[]];\r\n let x = 0;\r\n let row = 0;\r\n for (const item of items) {\r\n const w = legendItemWidth(item.label, font);\r\n if (x > 0 && x + w > maxWidth) {\r\n row++;\r\n rows[row] = [];\r\n x = 0;\r\n }\r\n rows[row].push({ ...item, x, y: row * (rowH + LEGEND_ROW_GAP), width: w });\r\n x += w + LEGEND_ITEM_GAP;\r\n }\r\n const widest = Math.max(\r\n 0,\r\n ...rows.map((r) => r.reduce((acc, it) => acc + it.width + LEGEND_ITEM_GAP, -LEGEND_ITEM_GAP)),\r\n );\r\n const height = rows.length * rowH + (rows.length - 1) * LEGEND_ROW_GAP;\r\n // Center each row horizontally within the block.\r\n const blockWidth = Math.min(maxWidth, widest);\r\n const positioned: PositionedLegendItem[] = [];\r\n for (const r of rows) {\r\n const rowWidth = r.reduce((acc, it) => acc + it.width + LEGEND_ITEM_GAP, -LEGEND_ITEM_GAP);\r\n const offset = Math.max(0, (blockWidth - rowWidth) / 2);\r\n for (const it of r) positioned.push({ ...it, x: it.x + offset });\r\n }\r\n return { width: blockWidth, height: height + LEGEND_PAD * 2, items: positioned };\r\n }\r\n\r\n // Vertical (left/right): stack, truncate to maxHeight.\r\n const maxRows = Math.max(1, Math.floor((maxHeight + LEGEND_ROW_GAP) / (rowH + LEGEND_ROW_GAP)));\r\n const shown = items.slice(0, maxRows);\r\n const width = Math.max(0, ...shown.map((it) => legendItemWidth(it.label, font)));\r\n const positioned = shown.map((it, i) => ({\r\n ...it,\r\n x: 0,\r\n y: i * (rowH + LEGEND_ROW_GAP),\r\n width: legendItemWidth(it.label, font),\r\n }));\r\n const height = shown.length * rowH + (shown.length - 1) * LEGEND_ROW_GAP;\r\n return { width: width + LEGEND_PAD * 2, height, items: positioned };\r\n}\r\n\r\n/** Reserve space for every region and return the plot rect + positioned chrome. */\r\nexport function computeFrame(input: FrameInput): Frame {\r\n const { width, height, padding, font } = input;\r\n let top = padding.top;\r\n let right = width - padding.right;\r\n let bottom = height - padding.bottom;\r\n let left = padding.left;\r\n\r\n const frame: Frame = {\r\n width,\r\n height,\r\n plot: { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) },\r\n };\r\n\r\n // --- Title (top band) ---\r\n if (input.title?.text) {\r\n const titleH = lineHeight(font.size.title);\r\n frame.titleRect = { x: left, y: top, width: right - left, height: titleH };\r\n top += titleH;\r\n if (input.title.subtitle) {\r\n const subH = lineHeight(font.size.small);\r\n frame.subtitleRect = { x: left, y: top, width: right - left, height: subH };\r\n top += subH;\r\n }\r\n top += font.size.base; // breathing room before the plot\r\n }\r\n\r\n // --- Legend (one side) ---\r\n if (input.legend && input.legend.items.length > 0) {\r\n const pos = input.legend.position;\r\n const availW = right - left;\r\n const availH = bottom - top;\r\n const block = layoutLegend(input.legend.items, pos, font, availW, availH);\r\n frame.legendPosition = pos;\r\n if (pos === 'top') {\r\n frame.legendRect = { x: left, y: top, width: availW, height: block.height };\r\n top += block.height + font.size.base;\r\n } else if (pos === 'bottom') {\r\n frame.legendRect = { x: left, y: bottom - block.height, width: availW, height: block.height };\r\n bottom -= block.height + font.size.base;\r\n } else if (pos === 'left') {\r\n frame.legendRect = { x: left, y: top, width: block.width, height: availH };\r\n left += block.width + font.size.base;\r\n } else {\r\n frame.legendRect = { x: right - block.width, y: top, width: block.width, height: availH };\r\n right -= block.width + font.size.base;\r\n }\r\n // Offset positioned items into absolute frame coordinates.\r\n const ox = frame.legendRect.x + LEGEND_PAD;\r\n const oy = frame.legendRect.y + LEGEND_PAD;\r\n frame.legendItems = block.items.map((it) => ({ ...it, x: it.x + ox, y: it.y + oy }));\r\n }\r\n\r\n // --- Axes (cartesian) ---\r\n if (input.yAxis?.show) {\r\n let gutter = 0;\r\n if (input.yAxis.labels.length) {\r\n const wfont = fontString(font.size.small, font.family, font.weight.normal);\r\n const widest = Math.max(...input.yAxis.labels.map((l) => measureText(l, wfont).width));\r\n gutter = Math.ceil(widest) + TICK_SIZE + AXIS_LABEL_GAP;\r\n }\r\n if (input.yAxis.title) gutter += lineHeight(font.size.base) + AXIS_TITLE_GAP;\r\n left += gutter;\r\n // Reserve half a label line so the top/bottom tick labels (which center on\r\n // the plot edges) never collide with the legend above or x labels below.\r\n const yHalf = Math.ceil(lineHeight(font.size.small) / 2);\r\n top += yHalf;\r\n bottom -= yHalf;\r\n }\r\n if (input.xAxis?.show) {\r\n let gutter = lineHeight(font.size.small) + TICK_SIZE + AXIS_LABEL_GAP;\r\n if (input.xAxis.title) gutter += lineHeight(font.size.base) + AXIS_TITLE_GAP;\r\n bottom -= gutter;\r\n // Edge-anchored x labels (linear/time) center on the first/last ticks, which\r\n // sit on the plot's left/right edges — reserve half of each so they don't\r\n // overflow (and get clipped) at narrow widths.\r\n if (input.xAxis.edgeAnchored && input.xAxis.labels.length) {\r\n const wfont = fontString(font.size.small, font.family, font.weight.normal);\r\n const labels = input.xAxis.labels;\r\n const firstHalf = Math.ceil(measureText(labels[0], wfont).width / 2);\r\n const lastHalf = Math.ceil(measureText(labels[labels.length - 1], wfont).width / 2);\r\n left = Math.max(left, padding.left + firstHalf);\r\n right -= lastHalf;\r\n }\r\n }\r\n\r\n frame.plot = {\r\n x: left,\r\n y: top,\r\n width: Math.max(0, right - left),\r\n height: Math.max(0, bottom - top),\r\n };\r\n return frame;\r\n}\r\n","/** Small numeric helpers used across layout and charts. */\r\n\r\n/** Clamp `v` into [min, max]. */\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : v > max ? max : v;\r\n}\r\n\r\n/** Linear interpolation. */\r\nexport function lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/** Round to `dpr`-aligned device pixels for crisp 1px strokes. */\r\nexport function crisp(v: number, strokeWidth = 1): number {\r\n const offset = strokeWidth % 2 === 0 ? 0 : 0.5;\r\n return Math.round(v) + offset;\r\n}\r\n\r\n/** Sum of an array. */\r\nexport function sum(values: readonly number[]): number {\r\n let total = 0;\r\n for (const v of values) total += v;\r\n return total;\r\n}\r\n\r\n/** Integer range [0, n). */\r\nexport function range(n: number): number[] {\r\n const out: number[] = new Array(Math.max(0, n));\r\n for (let i = 0; i < n; i++) out[i] = i;\r\n return out;\r\n}\r\n","/**\r\n * Axis, gridline, legend, and title rendering for cartesian charts.\r\n *\r\n * Marks (gridlines, tick marks, axis baselines) are drawn on the canvas; text\r\n * (tick labels, axis titles, chart title, legend) lives in the HTML overlay for\r\n * crisp, accessible, selectable typography. Geometry comes from the already\r\n * computed `CartesianModel` / `Frame`, so this module is pure presentation.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport { fontString, measureText } from '../render/text';\r\nimport { crisp } from '../util/math';\r\nimport { TICK_SIZE, type Frame, type PositionedLegendItem } from '../layout';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport { RoughPen } from '../rough';\r\nimport type { ThemeTokens } from '../theme';\r\n\r\ninterface TextOptions {\r\n left?: number;\r\n top?: number;\r\n width?: number;\r\n text: string;\r\n color: string;\r\n size: number;\r\n weight?: number;\r\n align?: 'left' | 'center' | 'right';\r\n transform?: string;\r\n whiteSpace?: 'nowrap' | 'normal';\r\n}\r\n\r\nfunction addText(overlay: HTMLElement, font: string, o: TextOptions): HTMLDivElement {\r\n const el = document.createElement('div');\r\n el.textContent = o.text;\r\n el.style.position = 'absolute';\r\n el.style.font = font;\r\n el.style.fontSize = `${o.size}px`;\r\n if (o.weight) el.style.fontWeight = String(o.weight);\r\n el.style.color = o.color;\r\n el.style.whiteSpace = o.whiteSpace ?? 'nowrap';\r\n if (o.left != null) el.style.left = `${o.left}px`;\r\n if (o.top != null) el.style.top = `${o.top}px`;\r\n if (o.width != null) {\r\n el.style.width = `${o.width}px`;\r\n el.style.textAlign = o.align ?? 'left';\r\n }\r\n if (o.transform) el.style.transform = o.transform;\r\n el.style.pointerEvents = 'none';\r\n overlay.appendChild(el);\r\n return el;\r\n}\r\n\r\nfunction xGridEnabled(model: CartesianModel): boolean {\r\n const cfg = model.spec.axes?.x;\r\n if (cfg?.grid !== undefined) return cfg.grid;\r\n return model.x.kind === 'linear' || model.x.kind === 'time' || model.spec.type === 'scatter';\r\n}\r\n\r\nfunction yGridEnabled(model: CartesianModel): boolean {\r\n return model.spec.axes?.y?.grid !== false;\r\n}\r\n\r\n/** Draw gridlines + axis baselines + tick marks on the marks canvas (behind marks). */\r\nexport function drawAxesUnderlay(surface: Surface, model: CartesianModel): void {\r\n const ctx = surface.marks.ctx;\r\n const { plot, tokens } = model;\r\n const x0 = plot.x;\r\n const x1 = plot.x + plot.width;\r\n const y0 = plot.y;\r\n const y1 = plot.y + plot.height;\r\n\r\n ctx.save();\r\n ctx.lineWidth = 1;\r\n\r\n // The labelled x-tick subset drives gridlines, tick marks and labels alike so\r\n // a dense axis never shows more gridlines than it has room to label.\r\n const xPlaced = resolveXLabels(model);\r\n\r\n // When sketching, gridlines/ticks are drawn as gently wavy hand-drawn segments\r\n // (reduced roughness keeps them subtle behind the bolder data marks).\r\n const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;\r\n const seg = (sx0: number, sy0: number, sx1: number, sy1: number, stroke: string): void => {\r\n pen!.polyline([{ x: sx0, y: sy0 }, { x: sx1, y: sy1 }], {\r\n stroke,\r\n strokeWidth: 1,\r\n roughness: model.sketch!.roughness * 0.5,\r\n bowing: model.sketch!.bowing * 0.55,\r\n });\r\n };\r\n\r\n // Horizontal y gridlines.\r\n if (yGridEnabled(model)) {\r\n if (pen) {\r\n for (const t of model.yTicks) seg(x0, t.pos, x1, t.pos, tokens.color.grid);\r\n } else {\r\n ctx.strokeStyle = tokens.color.grid;\r\n ctx.beginPath();\r\n for (const t of model.yTicks) {\r\n const y = crisp(t.pos);\r\n ctx.moveTo(x0, y);\r\n ctx.lineTo(x1, y);\r\n }\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n // Vertical x gridlines (aligned to the labelled ticks for a clean read).\r\n if (xGridEnabled(model)) {\r\n if (pen) {\r\n for (const p of xPlaced) seg(p.pos, y0, p.pos, y1, tokens.color.grid);\r\n } else {\r\n ctx.strokeStyle = tokens.color.grid;\r\n ctx.beginPath();\r\n for (const p of xPlaced) {\r\n const x = crisp(p.pos);\r\n ctx.moveTo(x, y0);\r\n ctx.lineTo(x, y1);\r\n }\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n // Axis baselines. The y axis relies on horizontal gridlines + labels (no\r\n // vertical domain line) for a cleaner, more modern read; only the x baseline\r\n // is drawn to anchor the marks.\r\n if (model.spec.axes?.x?.show !== false) {\r\n if (pen) {\r\n seg(x0, y1, x1, y1, tokens.color.axis);\r\n } else {\r\n ctx.strokeStyle = tokens.color.axis;\r\n ctx.beginPath();\r\n ctx.moveTo(x0, crisp(y1));\r\n ctx.lineTo(x1, crisp(y1));\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n // X tick marks (subtle), drawn only where labels sit.\r\n if (model.spec.axes?.x?.show !== false) {\r\n if (pen) {\r\n for (const p of xPlaced) seg(p.pos, y1, p.pos, y1 + TICK_SIZE, tokens.color.axis);\r\n } else {\r\n ctx.strokeStyle = tokens.color.axis;\r\n ctx.beginPath();\r\n for (const p of xPlaced) {\r\n const x = crisp(p.pos);\r\n ctx.moveTo(x, y1);\r\n ctx.lineTo(x, y1 + TICK_SIZE);\r\n }\r\n ctx.stroke();\r\n }\r\n }\r\n ctx.restore();\r\n}\r\n\r\n/** Thin out x tick labels that would overlap, keeping a readable subset. */\r\nfunction thinXTicks(model: CartesianModel, avgCharPx: number): typeof model.xTicks {\r\n const ticks = model.xTicks;\r\n if (ticks.length <= 1) return ticks;\r\n const longest = ticks.reduce((m, t) => Math.max(m, t.label.length), 0);\r\n const needed = longest * avgCharPx + 10;\r\n const available = model.plot.width / ticks.length;\r\n if (available >= needed) return ticks;\r\n const stride = Math.ceil(needed / available);\r\n return ticks.filter((_, i) => i % stride === 0);\r\n}\r\n\r\ninterface PlacedLabel {\r\n text: string;\r\n pos: number;\r\n left: number;\r\n transform: string;\r\n}\r\n\r\n/**\r\n * Resolve thinned x ticks into non-overlapping label boxes. Each label is\r\n * centered on its tick, except the first/last which are clamped to the surface\r\n * edges. A left→right sweep then drops any label whose box would collide with\r\n * the previous kept label or with the final label, so the right-edge label is\r\n * always preserved without overlap (fixes \"Aug 2023Sep 2023\" style run-ons).\r\n */\r\nfunction placeXLabels(\r\n ticks: CartesianModel['xTicks'],\r\n frameWidth: number,\r\n font: string,\r\n): PlacedLabel[] {\r\n const edgePad = 2;\r\n const minGap = 6;\r\n const boxes = ticks.map((t) => {\r\n const w = measureText(t.label, font).width;\r\n const half = w / 2;\r\n let left = t.pos;\r\n let transform = 'translateX(-50%)';\r\n let bl = t.pos - half;\r\n let br = t.pos + half;\r\n if (bl < edgePad) {\r\n left = edgePad;\r\n transform = 'none';\r\n bl = edgePad;\r\n br = edgePad + w;\r\n } else if (br > frameWidth - edgePad) {\r\n left = frameWidth - edgePad;\r\n transform = 'translateX(-100%)';\r\n br = frameWidth - edgePad;\r\n bl = br - w;\r\n }\r\n return { text: t.label, pos: t.pos, left, transform, bl, br };\r\n });\r\n if (boxes.length <= 1) return boxes;\r\n\r\n const n = boxes.length;\r\n const last = boxes[n - 1];\r\n const keep = new Array<boolean>(n).fill(false);\r\n keep[n - 1] = true;\r\n let prevBr = -Infinity;\r\n for (let i = 0; i < n - 1; i += 1) {\r\n const b = boxes[i];\r\n if (b.bl < prevBr + minGap) continue; // overlaps the previous kept label\r\n if (b.br + minGap > last.bl) break; // would overlap the final label\r\n keep[i] = true;\r\n prevBr = b.br;\r\n }\r\n return boxes.filter((_, i) => keep[i]);\r\n}\r\n\r\n/** Compute the placed (thinned, non-overlapping) x labels for a model. Shared by\r\n * the gridline/tick underlay and the label overlay so they stay perfectly aligned. */\r\nfunction resolveXLabels(model: CartesianModel): PlacedLabel[] {\r\n const f = model.tokens.font;\r\n const smallFont = fontString(f.size.small, f.family, f.weight.normal);\r\n const thinned = thinXTicks(model, f.size.small * 0.58);\r\n return placeXLabels(thinned, model.frame.width, smallFont);\r\n}\r\n\r\n/** Draw all overlay text: tick labels, axis titles, chart title, legend. */\r\nexport function drawOverlay(surface: Surface, model: CartesianModel): void {\r\n const overlay = surface.overlay;\r\n const { plot, tokens, frame } = model;\r\n const f = tokens.font;\r\n const smallFont = fontString(f.size.small, f.family, f.weight.normal);\r\n\r\n // Y tick labels (right-aligned in the left gutter).\r\n if (model.spec.axes?.y?.labels !== false) {\r\n const gutterRight = plot.x - TICK_SIZE - 4;\r\n for (const t of model.yTicks) {\r\n addText(overlay, smallFont, {\r\n left: 0,\r\n top: t.pos,\r\n width: Math.max(0, gutterRight),\r\n text: t.label,\r\n color: tokens.color.textMuted,\r\n size: f.size.small,\r\n align: 'right',\r\n transform: 'translateY(-50%)',\r\n });\r\n }\r\n }\r\n\r\n // X tick labels. Resolve each thinned tick to a measured box, clamp the\r\n // first/last so they never overflow the surface, then drop any that still\r\n // collide — always preserving the final (right-edge) label, which is the most\r\n // informative on a time/linear axis.\r\n if (model.spec.axes?.x?.labels !== false) {\r\n const top = plot.y + plot.height + TICK_SIZE + 3;\r\n for (const p of resolveXLabels(model)) {\r\n addText(overlay, smallFont, {\r\n left: p.left,\r\n top,\r\n text: p.text,\r\n color: tokens.color.textMuted,\r\n size: f.size.small,\r\n transform: p.transform,\r\n });\r\n }\r\n }\r\n\r\n drawAxisTitles(overlay, model);\r\n drawTitle(overlay, frame, model.spec, tokens);\r\n if (frame.legendItems) drawLegend(overlay, frame.legendItems, model);\r\n}\r\n\r\nfunction drawAxisTitles(overlay: HTMLElement, model: CartesianModel): void {\r\n const { plot, tokens, frame } = model;\r\n const f = tokens.font;\r\n const baseFont = fontString(f.size.base, f.family, f.weight.medium);\r\n\r\n const xTitle = model.spec.axes?.x?.title ?? model.spec.encoding.x.title;\r\n if (xTitle) {\r\n addText(overlay, baseFont, {\r\n left: plot.x + plot.width / 2,\r\n top: frame.height - Math.round(f.size.base * 1.35),\r\n text: xTitle,\r\n color: tokens.color.text,\r\n size: f.size.base,\r\n weight: f.weight.medium,\r\n transform: 'translateX(-50%)',\r\n });\r\n }\r\n const yTitle = model.spec.axes?.y?.title ?? model.spec.encoding.y.title;\r\n if (yTitle) {\r\n addText(overlay, baseFont, {\r\n left: Math.round(f.size.base * 0.4),\r\n top: plot.y + plot.height / 2,\r\n text: yTitle,\r\n color: tokens.color.text,\r\n size: f.size.base,\r\n weight: f.weight.medium,\r\n transform: 'translate(-50%, -50%) rotate(-90deg)',\r\n });\r\n }\r\n}\r\n\r\nfunction drawTitle(\r\n overlay: HTMLElement,\r\n frame: Frame,\r\n spec: CartesianModel['spec'],\r\n tokens: ThemeTokens,\r\n): void {\r\n if (!frame.titleRect) return;\r\n const f = tokens.font;\r\n const title = typeof spec.title === 'string' ? { text: spec.title } : spec.title ?? {};\r\n const align = (typeof spec.title === 'object' && spec.title?.align) || 'left';\r\n const titleFont = fontString(f.size.title, f.family, f.weight.bold);\r\n addText(overlay, titleFont, {\r\n left: frame.titleRect.x,\r\n top: frame.titleRect.y,\r\n width: frame.titleRect.width,\r\n text: title.text ?? '',\r\n color: tokens.color.text,\r\n size: f.size.title,\r\n weight: f.weight.bold,\r\n align,\r\n });\r\n if (frame.subtitleRect && title.subtitle) {\r\n addText(overlay, fontString(f.size.small, f.family, f.weight.normal), {\r\n left: frame.subtitleRect.x,\r\n top: frame.subtitleRect.y,\r\n width: frame.subtitleRect.width,\r\n text: title.subtitle,\r\n color: tokens.color.textMuted,\r\n size: f.size.small,\r\n align,\r\n });\r\n }\r\n}\r\n\r\nfunction drawLegend(\r\n overlay: HTMLElement,\r\n items: PositionedLegendItem[],\r\n model: CartesianModel,\r\n): void {\r\n const f = model.tokens.font;\r\n for (const item of items) {\r\n const row = document.createElement('div');\r\n row.style.position = 'absolute';\r\n row.style.left = `${item.x}px`;\r\n row.style.top = `${item.y}px`;\r\n row.style.display = 'flex';\r\n row.style.alignItems = 'center';\r\n row.style.gap = '6px';\r\n row.style.pointerEvents = 'none';\r\n\r\n const swatch = document.createElement('span');\r\n const size = 11;\r\n swatch.style.flex = '0 0 auto';\r\n swatch.style.background = item.color;\r\n if (item.symbol === 'circle') {\r\n swatch.style.width = `${size}px`;\r\n swatch.style.height = `${size}px`;\r\n swatch.style.borderRadius = '50%';\r\n } else if (item.symbol === 'line') {\r\n swatch.style.width = `${size + 3}px`;\r\n swatch.style.height = '3px';\r\n swatch.style.borderRadius = '2px';\r\n } else {\r\n swatch.style.width = `${size}px`;\r\n swatch.style.height = `${size}px`;\r\n swatch.style.borderRadius = '2px';\r\n }\r\n\r\n const label = document.createElement('span');\r\n label.textContent = item.label;\r\n label.style.font = fontString(f.size.small, f.family, f.weight.normal);\r\n label.style.fontSize = `${f.size.small}px`;\r\n label.style.color = model.tokens.color.text;\r\n label.style.whiteSpace = 'nowrap';\r\n\r\n row.appendChild(swatch);\r\n row.appendChild(label);\r\n overlay.appendChild(row);\r\n }\r\n}\r\n","/**\r\n * Cartesian model builder.\r\n *\r\n * Turns a line / area / bar / scatter spec + resolved theme + pixel size into a\r\n * fully-resolved drawing model: x/y scales, the plot rect, series split, color\r\n * mapping, and positioned axis ticks. Charts consume this model and only worry\r\n * about drawing marks. Heatmap, pie, kpi, table, and matrix are non-cartesian\r\n * and build their own models.\r\n */\r\n\r\nimport type { Datum, FieldType, Rect } from '../types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type {\r\n AreaSpec,\r\n AxisConfig,\r\n BarSpec,\r\n BoxSpec,\r\n CurveType,\r\n FieldDef,\r\n LegendConfig,\r\n LineSpec,\r\n ScatterSpec,\r\n} from '../spec/types';\r\nimport {\r\n accessor,\r\n extent,\r\n groupBySeries,\r\n inferType,\r\n toDate,\r\n toKey,\r\n toNumber,\r\n uniqueStrings,\r\n type Series,\r\n} from '../util/data';\r\nimport { ticks as numericTicks } from '../ticks';\r\nimport { timeTicks } from '../ticks';\r\nimport { niceDomain } from '../ticks';\r\nimport {\r\n bandScale,\r\n linearScale,\r\n pointScale,\r\n timeScale,\r\n type BandScale,\r\n type ContinuousScale,\r\n type PointScale,\r\n} from '../scales';\r\nimport {\r\n curveCatmullRom,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveStep,\r\n curveStepAfter,\r\n curveStepBefore,\r\n type Curve,\r\n} from '../shape';\r\nimport { ordinalColorScale } from '../color';\r\nimport { rgbaToCss } from '../color';\r\nimport { formatNumber, formatValue, smartDate } from '../format';\r\nimport { computeFrame, type Frame, type LegendItem } from '../layout';\r\nimport { resolveSketch, type ResolvedSketch } from '../spec/sketch';\r\nimport type { Emphasis } from '../interaction/types';\r\n\r\nexport type CartesianChartSpec = LineSpec | AreaSpec | BarSpec | ScatterSpec | BoxSpec;\r\n\r\nexport type XKind = 'linear' | 'time' | 'band' | 'point';\r\n\r\nexport interface Tick {\r\n value: number | string;\r\n /** Pixel position along the axis. */\r\n pos: number;\r\n label: string;\r\n}\r\n\r\nexport interface XModel {\r\n kind: XKind;\r\n field: string;\r\n type: FieldType;\r\n /** Band/point category domain. */\r\n categories?: string[];\r\n band?: BandScale;\r\n point?: PointScale;\r\n /** Continuous (linear/time) scale; domain in numbers or epoch ms. */\r\n continuous?: ContinuousScale;\r\n /** Category width for band scales (0 otherwise). */\r\n bandwidth: number;\r\n /** Project a data value to its center pixel, or undefined if unmappable. */\r\n pixel(value: unknown): number | undefined;\r\n}\r\n\r\nexport interface YModel {\r\n field?: string;\r\n scale: ContinuousScale;\r\n /** Pixel of the zero baseline, clamped into the plot. */\r\n baseline: number;\r\n pixel(value: unknown): number;\r\n}\r\n\r\nexport interface ResolvedSeries {\r\n key: string;\r\n label: string;\r\n color: string;\r\n value: unknown;\r\n rows: Datum[];\r\n}\r\n\r\nexport interface CartesianModel {\r\n spec: CartesianChartSpec;\r\n tokens: ThemeTokens;\r\n frame: Frame;\r\n plot: Rect;\r\n x: XModel;\r\n y: YModel;\r\n series: ResolvedSeries[];\r\n seriesField?: string;\r\n stacked: boolean;\r\n xTicks: Tick[];\r\n yTicks: Tick[];\r\n colorOf(key: string): string;\r\n /** Hand-drawn render settings, or null for the default clean rendering. */\r\n sketch: ResolvedSketch | null;\r\n /**\r\n * Active highlight for this frame (matching rows full strength, the rest dimmed),\r\n * or null when nothing is selected. Set externally by the runtime from the spec's\r\n * `highlight` param + the shared store; `buildCartesianModel` leaves it null.\r\n */\r\n emphasis?: Emphasis | null;\r\n}\r\n\r\nconst CURVES: Record<CurveType, Curve> = {\r\n linear: curveLinear,\r\n monotone: curveMonotoneX,\r\n step: curveStep,\r\n stepBefore: curveStepBefore,\r\n stepAfter: curveStepAfter,\r\n catmullRom: curveCatmullRom,\r\n};\r\n\r\nexport function resolveCurve(curve?: CurveType): Curve {\r\n return curve ? (CURVES[curve] ?? curveLinear) : curveLinear;\r\n}\r\n\r\nfunction fieldType(spec: CartesianChartSpec, def: FieldDef | undefined, fallback: FieldType): FieldType {\r\n if (def?.type) return def.type;\r\n if (def && spec.data?.length) return inferType(spec.data, def.field);\r\n return fallback;\r\n}\r\n\r\n/** Decide the x scale kind from the chart type and field type. */\r\nfunction xKindFor(spec: CartesianChartSpec, xType: FieldType): XKind {\r\n if (spec.type === 'bar' || spec.type === 'box') return 'band';\r\n if (xType === 'quantitative') return 'linear';\r\n if (xType === 'temporal') return 'time';\r\n return 'point';\r\n}\r\n\r\nfunction wantsZeroBaseline(spec: CartesianChartSpec): boolean {\r\n return spec.type === 'bar' || spec.type === 'area';\r\n}\r\n\r\nfunction isStacked(spec: CartesianChartSpec, seriesCount: number): boolean {\r\n if (seriesCount < 2) return false;\r\n if (spec.type === 'area') return spec.stack === true;\r\n if (spec.type === 'bar') return spec.stack === true;\r\n return false;\r\n}\r\n\r\n/** Stacked y extent: max of per-category cumulative sums (and min with 0). */\r\nfunction stackedYExtent(\r\n rows: readonly Datum[],\r\n xField: string,\r\n yField: string,\r\n): [number, number] {\r\n const readX = accessor(xField);\r\n const readY = accessor(yField);\r\n const pos = new Map<string, number>();\r\n const neg = new Map<string, number>();\r\n for (const d of rows) {\r\n const k = toKey(readX(d));\r\n const v = toNumber(readY(d));\r\n if (Number.isNaN(v)) continue;\r\n if (v >= 0) pos.set(k, (pos.get(k) ?? 0) + v);\r\n else neg.set(k, (neg.get(k) ?? 0) + v);\r\n }\r\n let max = 0;\r\n let min = 0;\r\n for (const v of pos.values()) if (v > max) max = v;\r\n for (const v of neg.values()) if (v < min) min = v;\r\n return [min, max];\r\n}\r\n\r\nfunction resolveSeriesField(spec: CartesianChartSpec): string | undefined {\r\n const enc = spec.encoding;\r\n if (enc.series?.field) return enc.series.field;\r\n if (enc.color?.field) {\r\n const t = fieldType(spec, enc.color, 'nominal');\r\n if (t !== 'quantitative') return enc.color.field;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction legendDefaults(\r\n spec: CartesianChartSpec,\r\n seriesCount: number,\r\n): { show: boolean; position: 'top' | 'right' | 'bottom' | 'left' } {\r\n const cfg = spec.legend;\r\n const show =\r\n cfg === true\r\n ? true\r\n : cfg === false\r\n ? false\r\n : typeof cfg === 'object' && cfg.show !== undefined\r\n ? cfg.show\r\n : seriesCount > 1;\r\n const position =\r\n (typeof cfg === 'object' && (cfg as LegendConfig).position) ||\r\n (seriesCount > 8 ? 'right' : 'top');\r\n return { show, position };\r\n}\r\n\r\nfunction axisCfg(spec: CartesianChartSpec, axis: 'x' | 'y'): AxisConfig {\r\n return spec.axes?.[axis] ?? {};\r\n}\r\n\r\nfunction numericTickValues(d0: number, d1: number, count: number): number[] {\r\n return numericTicks(d0, d1, count);\r\n}\r\n\r\nfunction formatNumericTick(value: number, userFormat: string | undefined): string {\r\n if (userFormat) return formatValue(value, userFormat);\r\n return formatNumber(value, ',');\r\n}\r\n\r\nconst DEFAULT_PADDING = { top: 12, right: 16, bottom: 12, left: 12 };\r\n\r\nexport interface BuildOptions {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport function buildCartesianModel(\r\n spec: CartesianChartSpec,\r\n tokens: ThemeTokens,\r\n opts: BuildOptions,\r\n): CartesianModel {\r\n const data = spec.data ?? [];\r\n const enc = spec.encoding;\r\n const xField = enc.x.field;\r\n const yField = enc.y.field;\r\n const xType = fieldType(spec, enc.x, 'nominal');\r\n const xKind = xKindFor(spec, xType);\r\n\r\n // --- Series split + colors ---\r\n const seriesField = resolveSeriesField(spec);\r\n const rawSeries: Series[] = groupBySeries(data, seriesField);\r\n const seriesKeys = rawSeries.map((s) => s.key);\r\n const palette = tokens.color.palette;\r\n const colorScale = ordinalColorScale({ domain: seriesKeys, palette });\r\n const colorCache = new Map<string, string>();\r\n const colorOf = (key: string): string => {\r\n let c = colorCache.get(key);\r\n if (!c) {\r\n c = rgbaToCss(colorScale.map(key));\r\n colorCache.set(key, c);\r\n }\r\n return c;\r\n };\r\n const singleSeries = rawSeries.length <= 1 && !seriesField;\r\n const series: ResolvedSeries[] = rawSeries.map((s) => ({\r\n key: s.key,\r\n label: s.key === '' ? (enc.y.title ?? yField) : s.key,\r\n color: singleSeries ? rgbaToCss(colorScale.map(s.key)) : colorOf(s.key),\r\n value: s.value,\r\n rows: s.rows,\r\n }));\r\n\r\n const stacked = isStacked(spec, series.length);\r\n\r\n // --- Domains (pixel-independent) ---\r\n let categories: string[] | undefined;\r\n let xDomainNum: [number, number] | null = null;\r\n if (xKind === 'band' || xKind === 'point') {\r\n categories = uniqueStrings(data, xField);\r\n } else if (xKind === 'time') {\r\n const ms = data\r\n .map((d) => toDate(accessor(xField)(d))?.getTime())\r\n .filter((v): v is number => v != null);\r\n xDomainNum = ms.length ? [Math.min(...ms), Math.max(...ms)] : [0, 1];\r\n } else {\r\n xDomainNum = extent(data, xField) ?? [0, 1];\r\n const xScaleCfg = enc.x.scale;\r\n if (xScaleCfg?.domain && typeof xScaleCfg.domain[0] === 'number') {\r\n xDomainNum = [xScaleCfg.domain[0], xScaleCfg.domain[1] as number];\r\n } else if (xScaleCfg?.nice !== false) {\r\n xDomainNum = niceDomain(xDomainNum[0], xDomainNum[1], 10);\r\n }\r\n }\r\n\r\n let yDomain: [number, number];\r\n if (stacked) {\r\n yDomain = stackedYExtent(data, xField, yField);\r\n } else {\r\n const ext = extent(data, yField) ?? [0, 1];\r\n yDomain = [ext[0], ext[1]];\r\n }\r\n if (wantsZeroBaseline(spec)) {\r\n yDomain = [Math.min(0, yDomain[0]), Math.max(0, yDomain[1])];\r\n }\r\n const yScaleCfg = enc.y.scale;\r\n const xAxisCfg = axisCfg(spec, 'x');\r\n const yAxisCfg = axisCfg(spec, 'y');\r\n const yTickCount = yAxisCfg.ticks ?? 6;\r\n\r\n // Tick values and the y-domain must be derived together so that the first and\r\n // last tick sit exactly on the plot edges (otherwise labels spill past the axis).\r\n let yTickValues: number[];\r\n if (yScaleCfg?.domain && typeof yScaleCfg.domain[0] === 'number') {\r\n yDomain = [yScaleCfg.domain[0], yScaleCfg.domain[1] as number];\r\n const lo = Math.min(yDomain[0], yDomain[1]);\r\n const hi = Math.max(yDomain[0], yDomain[1]);\r\n yTickValues = numericTickValues(yDomain[0], yDomain[1], yTickCount).filter(\r\n (v) => v >= lo - 1e-9 && v <= hi + 1e-9,\r\n );\r\n } else if (yScaleCfg?.nice !== false) {\r\n yTickValues = numericTickValues(yDomain[0], yDomain[1], yTickCount);\r\n if (yTickValues.length >= 2) {\r\n yDomain = [\r\n Math.min(yTickValues[0], yDomain[0]),\r\n Math.max(yTickValues[yTickValues.length - 1], yDomain[1]),\r\n ];\r\n }\r\n } else {\r\n yTickValues = numericTickValues(yDomain[0], yDomain[1], yTickCount).filter(\r\n (v) => v >= yDomain[0] - 1e-9 && v <= yDomain[1] + 1e-9,\r\n );\r\n }\r\n if (yDomain[0] === yDomain[1]) yDomain = [yDomain[0], yDomain[0] + 1];\r\n\r\n // --- Tick labels (pixel-independent) ---\r\n const yLabels = yTickValues.map((v) => formatNumericTick(v, enc.y.format ?? yAxisCfg.format));\r\n\r\n let xTickValues: Array<number | string>;\r\n let xLabels: string[];\r\n let xStepMs = 0;\r\n if (categories) {\r\n xTickValues = categories;\r\n xLabels = categories.map((c) => c);\r\n } else if (xKind === 'time') {\r\n const xt = timeTicks(xDomainNum![0], xDomainNum![1], xAxisCfg.ticks ?? 7);\r\n xTickValues = xt;\r\n xStepMs = xt.length > 1 ? xt[1] - xt[0] : 0;\r\n xLabels = xt.map((v) => (enc.x.format ? formatValue(v, enc.x.format) : smartDate(v, xStepMs)));\r\n } else {\r\n const xt = numericTickValues(xDomainNum![0], xDomainNum![1], xAxisCfg.ticks ?? 8);\r\n xTickValues = xt;\r\n xLabels = xt.map((v) => formatNumericTick(v, enc.x.format ?? xAxisCfg.format));\r\n }\r\n\r\n // --- Frame (reserve title/legend/axis space) ---\r\n const xShow = xAxisCfg.show !== false;\r\n const yShow = yAxisCfg.show !== false;\r\n const legend = legendDefaults(spec, series.length);\r\n const legendItems: LegendItem[] = series.map((s) => ({\r\n label: s.label,\r\n color: s.color,\r\n symbol: spec.type === 'scatter' ? 'circle' : spec.type === 'line' ? 'line' : 'square',\r\n }));\r\n const padding = { ...DEFAULT_PADDING, ...spec.padding };\r\n const titleInput = resolveTitle(spec);\r\n\r\n const frame = computeFrame({\r\n width: opts.width,\r\n height: opts.height,\r\n padding,\r\n font: tokens.font,\r\n title: titleInput,\r\n legend: legend.show && legendItems.length > 1 ? { items: legendItems, position: legend.position } : undefined,\r\n xAxis: { show: xShow, labels: xLabels, title: resolveAxisTitle(enc.x, xAxisCfg), edgeAnchored: !categories },\r\n yAxis: { show: yShow, labels: yLabels, title: resolveAxisTitle(enc.y, yAxisCfg) },\r\n });\r\n const plot = frame.plot;\r\n\r\n // --- Build scales with final ranges ---\r\n const yScale = linearScale({ domain: yDomain, range: [plot.y + plot.height, plot.y] });\r\n const yPixel = (value: unknown): number => yScale.map(toNumber(value));\r\n const baseline = clampPx(yScale.map(0), plot.y, plot.y + plot.height);\r\n\r\n const xModel = buildXModel(xKind, {\r\n field: xField,\r\n type: xType,\r\n categories,\r\n domainNum: xDomainNum,\r\n range: [plot.x, plot.x + plot.width],\r\n paddingInner: spec.type === 'bar' ? 0.2 : spec.type === 'box' ? 0.32 : 0.5,\r\n scaleCfg: enc.x.scale,\r\n });\r\n\r\n // --- Positioned ticks ---\r\n const yTicks: Tick[] = yTickValues.map((v, i) => ({\r\n value: v,\r\n pos: yScale.map(v),\r\n label: yLabels[i],\r\n }));\r\n const xTicks: Tick[] = xTickValues\r\n .map((v, i) => {\r\n const pos = categories ? xModel.pixel(v) : xModel.pixel(toTickNumber(v));\r\n return pos == null ? null : { value: v, pos, label: xLabels[i] };\r\n })\r\n .filter((t): t is Tick => t !== null);\r\n\r\n return {\r\n spec,\r\n tokens,\r\n frame,\r\n plot,\r\n x: xModel,\r\n y: { field: yField, scale: yScale, baseline, pixel: yPixel },\r\n series,\r\n seriesField,\r\n stacked,\r\n xTicks,\r\n yTicks,\r\n colorOf,\r\n sketch: resolveSketch(spec),\r\n };\r\n}\r\n\r\nfunction toTickNumber(v: number | string): number {\r\n return typeof v === 'number' ? v : Number(v);\r\n}\r\n\r\ninterface XBuildArgs {\r\n field: string;\r\n type: FieldType;\r\n categories?: string[];\r\n domainNum: [number, number] | null;\r\n range: [number, number];\r\n paddingInner: number;\r\n scaleCfg?: FieldDef['scale'];\r\n}\r\n\r\nfunction buildXModel(kind: XKind, args: XBuildArgs): XModel {\r\n if (kind === 'band') {\r\n const band = bandScale({\r\n domain: args.categories ?? [],\r\n range: args.range,\r\n paddingInner: args.scaleCfg?.padding ?? args.paddingInner,\r\n paddingOuter: (args.scaleCfg?.padding ?? args.paddingInner) / 2,\r\n });\r\n return {\r\n kind,\r\n field: args.field,\r\n type: args.type,\r\n categories: args.categories,\r\n band,\r\n bandwidth: band.bandwidth,\r\n pixel: (value) => {\r\n const p = band.map(toKey(value));\r\n return p == null ? undefined : p + band.bandwidth / 2;\r\n },\r\n };\r\n }\r\n if (kind === 'point') {\r\n const point = pointScale({\r\n domain: args.categories ?? [],\r\n range: args.range,\r\n padding: args.scaleCfg?.padding ?? 0.5,\r\n });\r\n return {\r\n kind,\r\n field: args.field,\r\n type: args.type,\r\n categories: args.categories,\r\n point,\r\n bandwidth: 0,\r\n pixel: (value) => point.map(toKey(value)),\r\n };\r\n }\r\n const domain = args.domainNum ?? [0, 1];\r\n const continuous =\r\n kind === 'time'\r\n ? timeScale({ domain, range: args.range })\r\n : linearScale({ domain, range: args.range });\r\n return {\r\n kind,\r\n field: args.field,\r\n type: args.type,\r\n continuous,\r\n bandwidth: 0,\r\n pixel: (value) => {\r\n const n = kind === 'time' ? toDate(value)?.getTime() : toNumber(value);\r\n return n == null || Number.isNaN(n) ? undefined : continuous.map(n);\r\n },\r\n };\r\n}\r\n\r\nfunction resolveTitle(spec: CartesianChartSpec): { text?: string; subtitle?: string } | undefined {\r\n if (!spec.title) return undefined;\r\n if (typeof spec.title === 'string') return { text: spec.title };\r\n return { text: spec.title.text, subtitle: spec.title.subtitle };\r\n}\r\n\r\nfunction resolveAxisTitle(def: FieldDef, cfg: AxisConfig): string | undefined {\r\n if (cfg.title !== undefined) return cfg.title;\r\n return def.title;\r\n}\r\n\r\nfunction clampPx(v: number, min: number, max: number): number {\r\n return v < min ? min : v > max ? max : v;\r\n}\r\n","/**\r\n * Fill helpers shared by mark renderers.\r\n *\r\n * Premium area/line fills use a vertical gradient that's richest just under the\r\n * line and fades toward the baseline, which reads with more depth than a flat\r\n * translucent wash while staying clean and modern.\r\n */\r\n\r\nimport { parseColor } from '../color';\r\n\r\n/**\r\n * Build a vertical (top→bottom) gradient from a CSS color at two alpha stops.\r\n * `topY` is the visually upper edge (smaller pixel y, e.g. the line/peak) and\r\n * `bottomY` the lower edge (e.g. the baseline). Falls back to a flat fill when\r\n * the color can't be parsed or the band is degenerate.\r\n */\r\nexport function verticalFill(\r\n ctx: CanvasRenderingContext2D,\r\n color: string,\r\n topY: number,\r\n bottomY: number,\r\n topAlpha: number,\r\n bottomAlpha: number,\r\n): CanvasGradient | string {\r\n const rgba = parseColor(color);\r\n const base = rgba ? `${rgba.r}, ${rgba.g}, ${rgba.b}` : null;\r\n if (!base || !Number.isFinite(topY) || !Number.isFinite(bottomY) || topY === bottomY) {\r\n return base ? `rgba(${base}, ${topAlpha})` : color;\r\n }\r\n const y0 = Math.min(topY, bottomY);\r\n const y1 = Math.max(topY, bottomY);\r\n const startAlpha = topY <= bottomY ? topAlpha : bottomAlpha;\r\n const endAlpha = topY <= bottomY ? bottomAlpha : topAlpha;\r\n const grad = ctx.createLinearGradient(0, y0, 0, y1);\r\n grad.addColorStop(0, `rgba(${base}, ${startAlpha})`);\r\n grad.addColorStop(1, `rgba(${base}, ${endAlpha})`);\r\n return grad;\r\n}\r\n\r\n/** Smallest finite value in a list, or `fallback` when none are finite. */\r\nexport function minFinite(values: Iterable<number>, fallback: number): number {\r\n let min = Infinity;\r\n for (const v of values) if (Number.isFinite(v) && v < min) min = v;\r\n return min === Infinity ? fallback : min;\r\n}\r\n\r\n/** Largest finite value in a list, or `fallback` when none are finite. */\r\nexport function maxFinite(values: Iterable<number>, fallback: number): number {\r\n let max = -Infinity;\r\n for (const v of values) if (Number.isFinite(v) && v > max) max = v;\r\n return max === -Infinity ? fallback : max;\r\n}\r\n","/**\r\n * Emphasis helpers — small, shared utilities renderers use to honor an active\r\n * highlight. Matching marks draw at full strength; non-matching marks fade to\r\n * `emphasis.dim`. Discrete marks (bars, points, cells, wedges) test per-row;\r\n * continuous marks (lines, areas) test the series as a whole.\r\n */\r\n\r\nimport type { Datum } from '../types';\r\nimport type { Emphasis } from '../interaction/types';\r\nimport type { ResolvedSeries } from '../runtime/cartesian';\r\n\r\n/** Alpha multiplier for a single discrete mark backing `row`. */\r\nexport function rowAlpha(emphasis: Emphasis | null | undefined, row: Datum): number {\r\n if (!emphasis) return 1;\r\n return emphasis.match(row) ? 1 : emphasis.dim;\r\n}\r\n\r\n/** True when *any* row of a series is part of the selection. */\r\nexport function seriesMatches(\r\n emphasis: Emphasis | null | undefined,\r\n series: Pick<ResolvedSeries, 'rows'>,\r\n): boolean {\r\n if (!emphasis) return true;\r\n return series.rows.some((row) => emphasis.match(row));\r\n}\r\n\r\n/** Alpha multiplier for a continuous series (line/area): full if any row matches. */\r\nexport function seriesAlpha(\r\n emphasis: Emphasis | null | undefined,\r\n series: Pick<ResolvedSeries, 'rows'>,\r\n): number {\r\n if (!emphasis) return 1;\r\n return seriesMatches(emphasis, series) ? 1 : emphasis.dim;\r\n}\r\n","/**\r\n * Line chart (also handles `line` specs with `area: true` and point markers).\r\n * Multi-series, gap-aware (missing values break the line), curve-configurable.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { LineSpec } from '../spec/types';\r\nimport type { Point } from '../types';\r\nimport { accessor, toNumber } from '../util/data';\r\nimport { line, area } from '../shape';\r\nimport { decimate } from '../decimate';\r\nimport { resolveCurve, type CartesianModel, type ResolvedSeries } from '../runtime/cartesian';\r\nimport { RoughPen } from '../rough';\r\nimport { minFinite, verticalFill } from './fill';\r\nimport { seriesAlpha } from './emphasis';\r\n\r\ninterface SeriesPoints {\r\n series: ResolvedSeries;\r\n points: Point[];\r\n alpha: number;\r\n}\r\n\r\nfunction buildSeriesPoints(model: CartesianModel, s: ResolvedSeries): Point[] {\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const pts: Array<Point & { sortKey: number }> = [];\r\n for (const d of s.rows) {\r\n const xv = readX(d);\r\n const px = model.x.pixel(xv);\r\n const yRaw = readY(d);\r\n const py = yRaw == null || yRaw === '' ? NaN : model.y.pixel(yRaw);\r\n pts.push({\r\n x: px == null ? NaN : px,\r\n y: Number.isNaN(toNumber(yRaw)) ? NaN : py,\r\n sortKey: px == null ? Number.POSITIVE_INFINITY : px,\r\n });\r\n }\r\n pts.sort((a, b) => a.sortKey - b.sortKey);\r\n const points: Point[] = pts.map(({ x, y }) => ({ x, y }));\r\n const threshold = Math.max(2, Math.round(model.plot.width));\r\n return decimate(points, threshold, {\r\n getX: (p) => p.x,\r\n getY: (p) => p.y,\r\n gap: () => ({ x: NaN, y: NaN }),\r\n });\r\n}\r\n\r\n/** Split a point list into contiguous runs of finite points (gap-aware). */\r\nfunction finiteRuns(points: readonly Point[]): Point[][] {\r\n const runs: Point[][] = [];\r\n let run: Point[] = [];\r\n for (const p of points) {\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) {\r\n if (run.length) runs.push(run);\r\n run = [];\r\n } else {\r\n run.push(p);\r\n }\r\n }\r\n if (run.length) runs.push(run);\r\n return runs;\r\n}\r\n\r\n/** Hand-drawn path: hachure area fills, wobbly multi-pass strokes, circle markers. */\r\nfunction drawLineSketch(\r\n ctx: CanvasRenderingContext2D,\r\n model: CartesianModel,\r\n allSeries: SeriesPoints[],\r\n pen: RoughPen,\r\n filled: boolean,\r\n showPoints: boolean,\r\n): void {\r\n if (filled) {\r\n for (const { series, points, alpha } of allSeries) {\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n for (const run of finiteRuns(points)) {\r\n if (run.length < 2) continue;\r\n const poly: Point[] = [\r\n ...run,\r\n ...run.map((p) => ({ x: p.x, y: model.y.baseline })).reverse(),\r\n ];\r\n pen.polygon(poly, { fill: series.color, fillAlpha: 0.5 });\r\n }\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n }\r\n\r\n for (const { series, points, alpha } of allSeries) {\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n pen.trendStroke(points, { stroke: series.color });\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n\r\n if (showPoints) {\r\n for (const { series, points, alpha } of allSeries) {\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n for (const p of points) {\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) continue;\r\n pen.circle(p.x, p.y, 3.4, {\r\n fill: series.color,\r\n stroke: model.tokens.color.background,\r\n strokeWidth: 1.5,\r\n });\r\n }\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n }\r\n}\r\n\r\nexport function drawLine(surface: Surface, model: CartesianModel): void {\r\n const ctx = surface.marks.ctx;\r\n const spec = model.spec as LineSpec;\r\n const { plot, tokens } = model;\r\n const curve = resolveCurve(spec.curve);\r\n const lineGen = line({ curve });\r\n const areaGen = spec.area ? area({ curve }) : null;\r\n\r\n const allSeries: SeriesPoints[] = model.series.map((s) => ({\r\n series: s,\r\n points: buildSeriesPoints(model, s),\r\n alpha: seriesAlpha(model.emphasis, s),\r\n }));\r\n\r\n const showPoints = spec.points || allSeries.some((s) => s.points.filter((p) => !Number.isNaN(p.x)).length === 1);\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\r\n ctx.clip();\r\n\r\n if (model.sketch) {\r\n drawLineSketch(ctx, model, allSeries, new RoughPen(ctx, model.sketch), Boolean(areaGen), showPoints);\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n // Area fills first (behind the strokes) — a vertical gradient that's richest\r\n // just under the line and fades to transparent at the baseline.\r\n if (areaGen) {\r\n for (const { series, points, alpha } of allSeries) {\r\n const top = minFinite(\r\n points.map((p) => p.y),\r\n plot.y,\r\n );\r\n ctx.beginPath();\r\n areaGen(\r\n points.map((p) => ({ x: p.x, y0: model.y.baseline, y1: p.y })),\r\n ctx,\r\n );\r\n ctx.globalAlpha = alpha;\r\n ctx.fillStyle = verticalFill(ctx, series.color, top, model.y.baseline, 0.26, 0.0);\r\n ctx.fill();\r\n ctx.globalAlpha = 1;\r\n }\r\n }\r\n\r\n ctx.lineJoin = 'round';\r\n ctx.lineCap = 'round';\r\n ctx.lineWidth = Math.max(1.75, tokens.stroke.thick);\r\n\r\n for (const { series, points, alpha } of allSeries) {\r\n ctx.beginPath();\r\n lineGen(points, ctx);\r\n ctx.strokeStyle = series.color;\r\n ctx.globalAlpha = alpha;\r\n ctx.stroke();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n // Point markers.\r\n if (showPoints) {\r\n for (const { series, points, alpha } of allSeries) {\r\n ctx.fillStyle = series.color;\r\n ctx.strokeStyle = tokens.color.background;\r\n ctx.lineWidth = 1.5;\r\n ctx.globalAlpha = alpha;\r\n for (const p of points) {\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) continue;\r\n ctx.beginPath();\r\n ctx.arc(p.x, p.y, 3, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.stroke();\r\n }\r\n ctx.globalAlpha = 1;\r\n }\r\n }\r\n\r\n ctx.restore();\r\n}\r\n","/**\r\n * Area chart. Two modes:\r\n * - overlapping (default): each series filled from the zero baseline with a\r\n * translucent fill + opaque top stroke, so overlaps stay legible.\r\n * - stacked (`stack: true`): series are accumulated per x value; each band\r\n * spans from the running total below it to the new total, with mostly-opaque\r\n * fills for a clean stacked look.\r\n *\r\n * Consumes the prebuilt `CartesianModel` (x/y scales, resolved series, baseline).\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { AreaSpec } from '../spec/types';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport { area, line, type AreaPoint } from '../shape';\r\nimport { decimate } from '../decimate';\r\nimport { resolveCurve, type CartesianModel, type ResolvedSeries } from '../runtime/cartesian';\r\nimport { RoughPen } from '../rough';\r\nimport type { Point } from '../types';\r\nimport { maxFinite, minFinite, verticalFill } from './fill';\r\nimport { seriesAlpha } from './emphasis';\r\n\r\ninterface BandPoints {\r\n series: ResolvedSeries;\r\n points: AreaPoint[];\r\n alpha: number;\r\n}\r\n\r\n/** Build per-series area bands, stacking cumulatively in value-space when asked. */\r\nfunction buildBands(model: CartesianModel, stacked: boolean): BandPoints[] {\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const cumulative = new Map<string, number>();\r\n // Stacked bands must share x samples to stay aligned, so only the\r\n // independent (overlapping) mode is downsampled.\r\n const threshold = stacked ? Infinity : Math.max(2, Math.round(model.plot.width));\r\n\r\n return model.series.map((series) => {\r\n const points: Array<AreaPoint & { sortKey: number }> = [];\r\n for (const row of series.rows) {\r\n const xv = readX(row);\r\n const px = model.x.pixel(xv);\r\n const raw = readY(row);\r\n const value = toNumber(raw);\r\n const missing = raw == null || raw === '' || Number.isNaN(value);\r\n\r\n if (stacked) {\r\n const key = toKey(xv);\r\n const base = cumulative.get(key) ?? 0;\r\n const top = base + (missing ? 0 : value);\r\n cumulative.set(key, top);\r\n points.push({\r\n x: px == null ? NaN : px,\r\n y0: model.y.pixel(base),\r\n y1: missing ? NaN : model.y.pixel(top),\r\n sortKey: px == null ? Number.POSITIVE_INFINITY : px,\r\n });\r\n } else {\r\n points.push({\r\n x: px == null ? NaN : px,\r\n y0: model.y.baseline,\r\n y1: missing ? NaN : model.y.pixel(value),\r\n sortKey: px == null ? Number.POSITIVE_INFINITY : px,\r\n });\r\n }\r\n }\r\n points.sort((a, b) => a.sortKey - b.sortKey);\r\n const band: AreaPoint[] = points.map(({ x, y0, y1 }) => ({ x, y0, y1 }));\r\n const reduced = Number.isFinite(threshold)\r\n ? decimate(band, threshold, {\r\n getX: (p) => p.x,\r\n getY: (p) => p.y1,\r\n gap: () => ({ x: NaN, y0: NaN, y1: NaN }),\r\n })\r\n : band;\r\n return { series, points: reduced, alpha: seriesAlpha(model.emphasis, series) };\r\n });\r\n}\r\n\r\n/** Hand-drawn path: hachure-filled bands with wobbly top edges (gap-aware). */\r\nfunction drawAreaSketch(\r\n ctx: CanvasRenderingContext2D,\r\n model: CartesianModel,\r\n bands: BandPoints[],\r\n pen: RoughPen,\r\n stacked: boolean,\r\n): void {\r\n for (const { series, points, alpha } of bands) {\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n let run: AreaPoint[] = [];\r\n const flush = (): void => {\r\n if (run.length >= 2) {\r\n const top: Point[] = run.map((p) => ({ x: p.x, y: p.y1 }));\r\n const bottom: Point[] = run.map((p) => ({ x: p.x, y: p.y0 })).reverse();\r\n pen.polygon([...top, ...bottom], {\r\n fill: series.color,\r\n fillAlpha: stacked ? 0.85 : 0.5,\r\n });\r\n }\r\n run = [];\r\n };\r\n for (const p of points) {\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y1)) flush();\r\n else run.push(p);\r\n }\r\n flush();\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n\r\n for (const { series, points, alpha } of bands) {\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n pen.trendStroke(\r\n points.map((p) => ({ x: p.x, y: p.y1 })),\r\n { stroke: series.color },\r\n );\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n}\r\n\r\nexport function drawArea(surface: Surface, model: CartesianModel): void {\r\n const ctx = surface.marks.ctx;\r\n const spec = model.spec as AreaSpec;\r\n const { plot, tokens } = model;\r\n const curve = resolveCurve(spec.curve);\r\n const areaGen = area({ curve });\r\n const lineGen = line({ curve });\r\n const stacked = model.stacked;\r\n\r\n // Painter's order: for stacked charts the topmost band must paint last so its\r\n // edge sits above neighbours; bottom-up matches the resolved series order.\r\n const bands = buildBands(model, stacked);\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\r\n ctx.clip();\r\n\r\n if (model.sketch) {\r\n drawAreaSketch(ctx, model, bands, new RoughPen(ctx, model.sketch), stacked);\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n // Gradient fills: overlapping bands fade to near-transparent at the baseline;\r\n // stacked bands stay mostly opaque with a subtle vertical sheen for depth.\r\n for (const { series, points, alpha } of bands) {\r\n const top = minFinite(\r\n points.map((p) => p.y1),\r\n plot.y,\r\n );\r\n const bottom = stacked\r\n ? maxFinite(\r\n points.map((p) => p.y0),\r\n model.y.baseline,\r\n )\r\n : model.y.baseline;\r\n ctx.beginPath();\r\n areaGen(points, ctx);\r\n ctx.globalAlpha = alpha;\r\n ctx.fillStyle = stacked\r\n ? verticalFill(ctx, series.color, top, bottom, 0.96, 0.74)\r\n : verticalFill(ctx, series.color, top, bottom, 0.3, 0.02);\r\n ctx.fill();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n // Top edge strokes for crisp band separation.\r\n ctx.lineJoin = 'round';\r\n ctx.lineCap = 'round';\r\n ctx.lineWidth = Math.max(1.5, tokens.stroke.base);\r\n for (const { series, points, alpha } of bands) {\r\n ctx.beginPath();\r\n lineGen(\r\n points.map((p) => ({ x: p.x, y: p.y1 })),\r\n ctx,\r\n );\r\n ctx.strokeStyle = series.color;\r\n ctx.globalAlpha = (stacked ? 1 : 0.95) * alpha;\r\n ctx.stroke();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n ctx.restore();\r\n}\r\n","import type { Surface } from '../render/surface';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport type { BarSpec } from '../spec/types';\r\nimport { roundedRect } from '../shape';\r\nimport { RoughPen } from '../rough';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport { rowAlpha } from './emphasis';\r\n\r\ntype CornerSide = 'top' | 'bottom' | 'none';\r\n\r\ninterface BarRect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n color: string;\r\n cornerSide: CornerSide;\r\n}\r\n\r\ninterface StackSegment extends BarRect {\r\n stackEndKey: string;\r\n alpha: number;\r\n}\r\n\r\nfunction finite(value: number): boolean {\r\n return Number.isFinite(value);\r\n}\r\n\r\nfunction defaultRadius(model: CartesianModel, spec: BarSpec): number {\r\n return Math.max(0, spec.cornerRadius ?? Math.min(4, model.tokens.radius.sm));\r\n}\r\n\r\nfunction cornerSideFor(baseY: number, valueY: number): CornerSide {\r\n if (valueY < baseY) return 'top';\r\n if (valueY > baseY) return 'bottom';\r\n return 'none';\r\n}\r\n\r\nfunction makeRadii(side: CornerSide, radius: number): number | [number, number, number, number] {\r\n if (side === 'top') return [radius, radius, 0, 0];\r\n if (side === 'bottom') return [0, 0, radius, radius];\r\n return 0;\r\n}\r\n\r\nfunction drawRect(\r\n ctx: CanvasRenderingContext2D,\r\n rect: BarRect,\r\n radius: number,\r\n pen?: RoughPen | null,\r\n alpha = 1,\r\n): void {\r\n if (!finite(rect.x) || !finite(rect.y) || !finite(rect.width) || !finite(rect.height)) return;\r\n if (rect.width <= 0 || rect.height <= 0) return;\r\n\r\n const prevAlpha = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = prevAlpha * alpha;\r\n\r\n if (pen) {\r\n pen.rect(rect.x, rect.y, rect.width, rect.height, { stroke: rect.color, fill: rect.color });\r\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\r\n return;\r\n }\r\n\r\n const r = Math.min(radius, rect.width / 2, rect.height / 2);\r\n ctx.beginPath();\r\n roundedRect(ctx, rect.x, rect.y, rect.width, rect.height, makeRadii(rect.cornerSide, r));\r\n ctx.fillStyle = rect.color;\r\n ctx.fill();\r\n if (alpha !== 1) ctx.globalAlpha = prevAlpha;\r\n}\r\n\r\nfunction barRect(x: number, width: number, baseY: number, valueY: number, color: string): BarRect | null {\r\n if (!finite(x) || !finite(width) || !finite(baseY) || !finite(valueY)) return null;\r\n const y = Math.min(baseY, valueY);\r\n const height = Math.abs(valueY - baseY);\r\n if (width <= 0 || height <= 0) return null;\r\n return {\r\n x,\r\n y,\r\n width,\r\n height,\r\n color,\r\n cornerSide: cornerSideFor(baseY, valueY),\r\n };\r\n}\r\n\r\nfunction drawGroupedBars(ctx: CanvasRenderingContext2D, model: CartesianModel, radius: number, pen?: RoughPen | null): void {\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const seriesCount = model.series.length;\r\n const bandWidth = model.x.bandwidth;\r\n const subWidth = seriesCount > 1 ? bandWidth / seriesCount : bandWidth;\r\n const gap = seriesCount > 1 && subWidth > 3 ? Math.min(1, subWidth * 0.15) : 0;\r\n const barWidth = Math.max(0, subWidth - gap);\r\n\r\n model.series.forEach((series, seriesIndex) => {\r\n ctx.fillStyle = series.color;\r\n for (const row of series.rows) {\r\n const raw = readY(row);\r\n const value = toNumber(raw);\r\n if (raw == null || raw === '' || !finite(value)) continue;\r\n\r\n const center = model.x.pixel(readX(row));\r\n if (center == null) continue;\r\n\r\n const left = center - bandWidth / 2 + seriesIndex * subWidth + gap / 2;\r\n const rect = barRect(left, barWidth, model.y.baseline, model.y.pixel(value), series.color);\r\n if (rect) drawRect(ctx, rect, radius, pen, rowAlpha(model.emphasis, row));\r\n }\r\n });\r\n}\r\n\r\nfunction drawStackedBars(ctx: CanvasRenderingContext2D, model: CartesianModel, radius: number, pen?: RoughPen | null): void {\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const positiveTotals = new Map<string, number>();\r\n const negativeTotals = new Map<string, number>();\r\n const segments: StackSegment[] = [];\r\n const roundedEnds = new Map<string, number>();\r\n const bandWidth = model.x.bandwidth;\r\n\r\n for (const series of model.series) {\r\n for (const row of series.rows) {\r\n const xValue = readX(row);\r\n const center = model.x.pixel(xValue);\r\n if (center == null) continue;\r\n\r\n const raw = readY(row);\r\n const value = toNumber(raw);\r\n if (raw == null || raw === '' || !finite(value) || value === 0) continue;\r\n\r\n const categoryKey = toKey(xValue);\r\n const totals = value >= 0 ? positiveTotals : negativeTotals;\r\n const stackEndKey = `${value >= 0 ? 'pos' : 'neg'}:${categoryKey}`;\r\n const base = totals.get(categoryKey) ?? 0;\r\n const top = base + value;\r\n totals.set(categoryKey, top);\r\n\r\n const rect = barRect(center - bandWidth / 2, bandWidth, model.y.pixel(base), model.y.pixel(top), series.color);\r\n if (!rect) continue;\r\n\r\n segments.push({ ...rect, stackEndKey, alpha: rowAlpha(model.emphasis, row) });\r\n roundedEnds.set(stackEndKey, segments.length - 1);\r\n }\r\n }\r\n\r\n segments.forEach((segment, index) => {\r\n const isOuterSegment = roundedEnds.get(segment.stackEndKey) === index;\r\n drawRect(ctx, { ...segment, cornerSide: isOuterSegment ? segment.cornerSide : 'none' }, radius, pen, segment.alpha);\r\n });\r\n}\r\n\r\nexport function drawBar(surface: Surface, model: CartesianModel): void {\r\n const ctx = surface.marks.ctx;\r\n const spec = model.spec as BarSpec;\r\n const { plot } = model;\r\n const radius = defaultRadius(model, spec);\r\n const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;\r\n\r\n if (model.x.kind !== 'band' || model.x.bandwidth <= 0 || model.series.length === 0) return;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\r\n ctx.clip();\r\n\r\n if (model.stacked) {\r\n drawStackedBars(ctx, model, radius, pen);\r\n } else {\r\n drawGroupedBars(ctx, model, radius, pen);\r\n }\r\n\r\n ctx.restore();\r\n}\r\n","import type { Surface } from '../render/surface';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport type { ScatterSpec } from '../spec/types';\r\nimport type { Datum } from '../types';\r\nimport { accessor, extent, toNumber } from '../util/data';\r\nimport { RoughPen } from '../rough';\r\nimport { clamp } from '../util/math';\r\nimport { rowAlpha } from './emphasis';\r\n\r\ninterface ScatterPoint {\r\n x: number;\r\n y: number;\r\n r: number;\r\n color: string;\r\n alpha: number;\r\n}\r\n\r\nfunction isMissing(value: unknown): boolean {\r\n return value == null || value === '';\r\n}\r\n\r\nfunction isInvalidPositionValue(value: unknown): boolean {\r\n return (\r\n isMissing(value) ||\r\n (typeof value === 'number' && Number.isNaN(value)) ||\r\n (value instanceof Date && Number.isNaN(value.getTime()))\r\n );\r\n}\r\n\r\nfunction fixedRadius(): number {\r\n return 3.75;\r\n}\r\n\r\nfunction radiusScale(rows: readonly Datum[], field: string, plotSize: number): (value?: unknown) => number {\r\n const rMin = 3;\r\n const rMax = clamp(plotSize * 0.05, 10, 26);\r\n const mid = (rMin + rMax) / 2;\r\n const domain = extent(rows, field);\r\n\r\n if (!domain) return () => mid;\r\n\r\n const [min, max] = domain;\r\n if (min === max) return () => mid;\r\n\r\n return (value: unknown) => {\r\n const n = toNumber(value);\r\n if (Number.isNaN(n)) return rMin;\r\n const norm = clamp((n - min) / (max - min), 0, 1);\r\n return rMin + (rMax - rMin) * Math.sqrt(norm);\r\n };\r\n}\r\n\r\nexport function drawScatter(surface: Surface, model: CartesianModel): void {\r\n const ctx = surface.marks.ctx;\r\n const spec = model.spec as ScatterSpec;\r\n const { plot, tokens } = model;\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const sizeField = spec.encoding.size?.field;\r\n const allRows = model.series.flatMap((series) => series.rows);\r\n const readSize = sizeField ? accessor(sizeField) : null;\r\n const radius = sizeField ? radiusScale(allRows, sizeField, Math.min(plot.width, plot.height)) : fixedRadius;\r\n const points: ScatterPoint[] = [];\r\n\r\n for (const series of model.series) {\r\n for (const row of series.rows) {\r\n const xValue = readX(row);\r\n const yValue = readY(row);\r\n const yNumber = toNumber(yValue);\r\n const px = model.x.pixel(xValue);\r\n\r\n if (\r\n px == null ||\r\n isInvalidPositionValue(xValue) ||\r\n isMissing(yValue) ||\r\n Number.isNaN(yNumber)\r\n ) {\r\n continue;\r\n }\r\n\r\n const py = model.y.pixel(yValue);\r\n if (!Number.isFinite(px) || !Number.isFinite(py)) continue;\r\n\r\n points.push({\r\n x: px,\r\n y: py,\r\n r: readSize ? radius(readSize(row)) : radius(),\r\n color: series.color,\r\n alpha: rowAlpha(model.emphasis, row),\r\n });\r\n }\r\n }\r\n\r\n if (sizeField) points.sort((a, b) => b.r - a.r);\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\r\n ctx.clip();\r\n\r\n if (model.sketch) {\r\n const pen = new RoughPen(ctx, model.sketch);\r\n for (const point of points) {\r\n const prev = ctx.globalAlpha;\r\n if (point.alpha !== 1) ctx.globalAlpha = point.alpha;\r\n pen.circle(point.x, point.y, point.r, {\r\n fill: point.color,\r\n fillAlpha: 0.7,\r\n stroke: tokens.color.background,\r\n strokeWidth: 1,\r\n });\r\n if (point.alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = tokens.color.background;\r\n\r\n for (const point of points) {\r\n ctx.beginPath();\r\n ctx.arc(point.x, point.y, point.r, 0, Math.PI * 2);\r\n ctx.fillStyle = point.color;\r\n ctx.globalAlpha = 0.7 * point.alpha;\r\n ctx.fill();\r\n ctx.globalAlpha = point.alpha;\r\n ctx.stroke();\r\n }\r\n\r\n ctx.globalAlpha = 1;\r\n ctx.restore();\r\n}\r\n","import type { Surface } from '../render/surface';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport type { BoxSpec } from '../spec/types';\r\nimport type { Datum } from '../types';\r\nimport { withAlpha } from '../color';\r\nimport { formatValue } from '../format';\r\nimport { roundedRect } from '../shape';\r\nimport { RoughPen } from '../rough';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport type { InteractionModel, TooltipRow } from '../interaction/types';\r\n\r\ninterface BoxStats {\r\n min: number;\r\n q1: number;\r\n median: number;\r\n q3: number;\r\n max: number;\r\n outliers: number[];\r\n count: number;\r\n}\r\n\r\ninterface BoxGeom {\r\n key: string;\r\n title: string;\r\n color: string;\r\n /** Raw x-category value backing this box (for selection identity). */\r\n xValue: unknown;\r\n /** Raw series value, or undefined for single-series box plots. */\r\n seriesValue: unknown;\r\n cx: number;\r\n boxW: number;\r\n left: number;\r\n right: number;\r\n /** Vertical hit extent (whisker top to whisker bottom in px). */\r\n top: number;\r\n bottom: number;\r\n stats: BoxStats;\r\n}\r\n\r\ninterface BoxLayout {\r\n geoms: BoxGeom[];\r\n showOutliers: boolean;\r\n}\r\n\r\n/** Type-7 (linear interpolation) quantile of a pre-sorted ascending array. */\r\nfunction quantileSorted(sorted: readonly number[], p: number): number {\r\n const n = sorted.length;\r\n if (n === 0) return NaN;\r\n if (n === 1) return sorted[0];\r\n const idx = (n - 1) * p;\r\n const lo = Math.floor(idx);\r\n const frac = idx - lo;\r\n if (lo + 1 >= n) return sorted[n - 1];\r\n return sorted[lo] + (sorted[lo + 1] - sorted[lo]) * frac;\r\n}\r\n\r\nfunction computeStats(values: number[], whisker: 'tukey' | 'minMax'): BoxStats | null {\r\n const sorted = values.filter((v) => Number.isFinite(v)).sort((a, b) => a - b);\r\n if (sorted.length === 0) return null;\r\n const q1 = quantileSorted(sorted, 0.25);\r\n const median = quantileSorted(sorted, 0.5);\r\n const q3 = quantileSorted(sorted, 0.75);\r\n const dataMin = sorted[0];\r\n const dataMax = sorted[sorted.length - 1];\r\n const outliers: number[] = [];\r\n let lo = dataMin;\r\n let hi = dataMax;\r\n\r\n if (whisker === 'tukey') {\r\n const iqr = q3 - q1;\r\n const fenceLo = q1 - 1.5 * iqr;\r\n const fenceHi = q3 + 1.5 * iqr;\r\n let wLo = Infinity;\r\n let wHi = -Infinity;\r\n for (const v of sorted) {\r\n if (v < fenceLo || v > fenceHi) {\r\n outliers.push(v);\r\n continue;\r\n }\r\n if (v < wLo) wLo = v;\r\n if (v > wHi) wHi = v;\r\n }\r\n lo = wLo === Infinity ? q1 : wLo;\r\n hi = wHi === -Infinity ? q3 : wHi;\r\n }\r\n\r\n return { min: lo, q1, median, q3, max: hi, outliers, count: sorted.length };\r\n}\r\n\r\n/** Resolve per-category (and per-series) box geometry without drawing. */\r\nfunction computeBoxes(model: CartesianModel): BoxLayout | null {\r\n const spec = model.spec as BoxSpec;\r\n if (model.x.kind !== 'band' || model.x.bandwidth <= 0 || model.series.length === 0) return null;\r\n\r\n const whisker: 'tukey' | 'minMax' = spec.whisker === 'minMax' ? 'minMax' : 'tukey';\r\n const showOutliers = spec.outliers !== false && whisker === 'tukey';\r\n const readX = accessor(model.x.field);\r\n const readY = accessor(model.y.field ?? '');\r\n const seriesCount = model.series.length;\r\n const bandWidth = model.x.bandwidth;\r\n const subWidth = bandWidth / seriesCount;\r\n const gap = seriesCount > 1 ? Math.min(8, subWidth * 0.18) : 0;\r\n const boxW = Math.max(3, Math.min(subWidth - gap, 64));\r\n const grouped = seriesCount > 1;\r\n const yPix = (v: number): number => model.y.pixel(v);\r\n const geoms: BoxGeom[] = [];\r\n\r\n model.series.forEach((series, seriesIndex) => {\r\n const groups = new Map<string, { value: unknown; vals: number[] }>();\r\n for (const row of series.rows) {\r\n const xv = readX(row);\r\n const y = toNumber(readY(row));\r\n if (!Number.isFinite(y)) continue;\r\n const k = toKey(xv);\r\n let g = groups.get(k);\r\n if (!g) {\r\n g = { value: xv, vals: [] };\r\n groups.set(k, g);\r\n }\r\n g.vals.push(y);\r\n }\r\n\r\n for (const [k, g] of groups) {\r\n const cxRaw = model.x.pixel(g.value);\r\n if (cxRaw == null) continue;\r\n const stats = computeStats(g.vals, whisker);\r\n if (!stats) continue;\r\n const cx = cxRaw - bandWidth / 2 + (seriesIndex + 0.5) * subWidth;\r\n geoms.push({\r\n key: grouped ? `${k}\\u0000${series.key}` : k,\r\n title: grouped ? `${k} · ${series.label}` : k,\r\n color: series.color,\r\n xValue: g.value,\r\n seriesValue: grouped ? series.value : undefined,\r\n cx,\r\n boxW,\r\n left: cx - boxW / 2,\r\n right: cx + boxW / 2,\r\n top: Math.min(yPix(stats.max), yPix(stats.min)),\r\n bottom: Math.max(yPix(stats.max), yPix(stats.min)),\r\n stats,\r\n });\r\n }\r\n });\r\n\r\n return geoms.length ? { geoms, showOutliers } : null;\r\n}\r\n\r\nfunction drawOneBox(\r\n ctx: CanvasRenderingContext2D,\r\n model: CartesianModel,\r\n geom: BoxGeom,\r\n showOutliers: boolean,\r\n pen: RoughPen | null,\r\n): void {\r\n const yPix = (v: number): number => model.y.pixel(v);\r\n const { cx, left, right, boxW, stats, color } = geom;\r\n const capHalf = boxW * 0.28;\r\n const yQ1 = yPix(stats.q1);\r\n const yQ3 = yPix(stats.q3);\r\n const yMed = yPix(stats.median);\r\n const yLo = yPix(stats.min);\r\n const yHi = yPix(stats.max);\r\n const top = Math.min(yQ1, yQ3);\r\n const bottom = Math.max(yQ1, yQ3);\r\n const h = Math.max(1, bottom - top);\r\n\r\n if (pen) {\r\n pen.polyline([{ x: cx, y: yHi }, { x: cx, y: top }], { stroke: color });\r\n pen.polyline([{ x: cx, y: bottom }, { x: cx, y: yLo }], { stroke: color });\r\n pen.polyline([{ x: cx - capHalf, y: yHi }, { x: cx + capHalf, y: yHi }], { stroke: color });\r\n pen.polyline([{ x: cx - capHalf, y: yLo }, { x: cx + capHalf, y: yLo }], { stroke: color });\r\n pen.rect(left, top, boxW, h, { stroke: color, fill: color, fillStyle: 'solid', fillAlpha: 0.16 });\r\n pen.polyline([{ x: left, y: yMed }, { x: right, y: yMed }], { stroke: color, strokeWidth: 2 });\r\n if (showOutliers && stats.outliers.length) {\r\n for (const o of stats.outliers) {\r\n pen.circle(cx, yPix(o), 1.9, { fill: withAlpha(color, 0.6) });\r\n }\r\n }\r\n return;\r\n }\r\n\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1.5;\r\n ctx.lineCap = 'round';\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(cx, yHi);\r\n ctx.lineTo(cx, top);\r\n ctx.moveTo(cx, bottom);\r\n ctx.lineTo(cx, yLo);\r\n ctx.moveTo(cx - capHalf, yHi);\r\n ctx.lineTo(cx + capHalf, yHi);\r\n ctx.moveTo(cx - capHalf, yLo);\r\n ctx.lineTo(cx + capHalf, yLo);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n roundedRect(ctx, left, top, boxW, h, Math.min(3, boxW / 4));\r\n ctx.fillStyle = withAlpha(color, 0.16);\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(left, yMed);\r\n ctx.lineTo(right, yMed);\r\n ctx.lineWidth = 2;\r\n ctx.stroke();\r\n\r\n if (showOutliers && stats.outliers.length) {\r\n ctx.fillStyle = withAlpha(color, 0.6);\r\n for (const o of stats.outliers) {\r\n ctx.beginPath();\r\n ctx.arc(cx, yPix(o), 1.9, 0, Math.PI * 2);\r\n ctx.fill();\r\n }\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\n/** Build the synthetic row a box represents, for emphasis/selection matching. */\r\nfunction boxProbe(model: CartesianModel, geom: BoxGeom): Datum {\r\n const probe: Datum = { [model.x.field]: geom.xValue };\r\n if (model.seriesField) probe[model.seriesField] = geom.seriesValue;\r\n return probe;\r\n}\r\n\r\nexport function drawBox(surface: Surface, model: CartesianModel): void {\r\n const layout = computeBoxes(model);\r\n if (!layout) return;\r\n const ctx = surface.marks.ctx;\r\n const { plot } = model;\r\n const emphasis = model.emphasis ?? null;\r\n const pen = model.sketch ? new RoughPen(ctx, model.sketch) : null;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y - 2, plot.width, plot.height + 4);\r\n ctx.clip();\r\n for (const geom of layout.geoms) {\r\n const alpha = emphasis ? (emphasis.match(boxProbe(model, geom)) ? 1 : emphasis.dim) : 1;\r\n const prev = ctx.globalAlpha;\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n drawOneBox(ctx, model, geom, layout.showOutliers, pen);\r\n if (alpha !== 1) ctx.globalAlpha = prev;\r\n }\r\n ctx.restore();\r\n}\r\n\r\n/** Box-plot interaction (the runtime uses this instead of the generic cartesian one). */\r\nexport function buildBoxInteraction(model: CartesianModel): InteractionModel | void {\r\n const spec = model.spec as BoxSpec;\r\n const tt = spec.tooltip;\r\n if (tt === false || (tt && typeof tt === 'object' && tt.show === false)) return;\r\n const layout = computeBoxes(model);\r\n if (!layout) return;\r\n const { geoms, showOutliers } = layout;\r\n const fmt = (v: number): string => formatValue(v, spec.encoding.y.format);\r\n\r\n return {\r\n region: model.plot,\r\n hitTest: (px, py) => {\r\n const hit = geoms.find(\r\n (g) => px >= g.left - 4 && px <= g.right + 4 && py >= g.top - 6 && py <= g.bottom + 6,\r\n );\r\n if (!hit) return null;\r\n const s = hit.stats;\r\n const rows: TooltipRow[] = [\r\n { label: 'Max', value: fmt(s.max) },\r\n { swatch: hit.color, label: 'Q3', value: fmt(s.q3) },\r\n { label: 'Median', value: fmt(s.median) },\r\n { swatch: hit.color, label: 'Q1', value: fmt(s.q1) },\r\n { label: 'Min', value: fmt(s.min) },\r\n { label: 'n', value: String(s.count), muted: true },\r\n ];\r\n if (showOutliers && s.outliers.length) {\r\n rows.push({ label: 'Outliers', value: String(s.outliers.length), muted: true });\r\n }\r\n return {\r\n key: hit.key,\r\n anchorX: hit.cx,\r\n anchorY: hit.top,\r\n content: { title: hit.title, rows },\r\n draw: (ictx) => {\r\n const top = Math.min(model.y.pixel(hit.stats.q1), model.y.pixel(hit.stats.q3));\r\n const h = Math.max(1, Math.abs(model.y.pixel(hit.stats.q1) - model.y.pixel(hit.stats.q3)));\r\n ictx.save();\r\n ictx.strokeStyle = hit.color;\r\n ictx.lineWidth = 2;\r\n ictx.beginPath();\r\n roundedRect(ictx, hit.left, top, hit.boxW, h, Math.min(3, hit.boxW / 4));\r\n ictx.stroke();\r\n ictx.restore();\r\n },\r\n };\r\n },\r\n pick: (px, py) => {\r\n const hit = geoms.find(\r\n (g) => px >= g.left - 4 && px <= g.right + 4 && py >= g.top - 6 && py <= g.bottom + 6,\r\n );\r\n if (!hit) return null;\r\n return { kind: 'point', fields: [model.x.field], tuples: [[hit.xValue]] };\r\n },\r\n };\r\n}\r\n","/**\r\n * Shared \"chrome\" helpers for custom (non-cartesian) chart renderers\r\n * (pie, heatmap, kpi, …). These keep titles, padding, and legends visually\r\n * consistent with the cartesian charts (which use `axes/draw.ts`).\r\n *\r\n * All text lives in the HTML overlay (`surface.overlay`) for crisp typography;\r\n * helpers return the content rect left over after reserving chrome so the\r\n * caller can lay out its marks in the remaining space.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Rect, Size } from '../types';\r\nimport { fontString, measureText } from '../render/text';\r\n\r\nexport const CHROME_PAD = { top: 14, right: 16, bottom: 14, left: 16 } as const;\r\n\r\nexport interface ResolvedTitle {\r\n text?: string;\r\n subtitle?: string;\r\n align: 'left' | 'center' | 'right';\r\n}\r\n\r\nexport function resolveTitle(title: unknown): ResolvedTitle {\r\n if (typeof title === 'string') return { text: title, align: 'left' };\r\n if (title && typeof title === 'object') {\r\n const t = title as { text?: string; subtitle?: string; align?: 'left' | 'center' | 'right' };\r\n return { text: t.text, subtitle: t.subtitle, align: t.align ?? 'left' };\r\n }\r\n return { align: 'left' };\r\n}\r\n\r\ninterface TextSpec {\r\n left: number;\r\n top: number;\r\n width?: number;\r\n text: string;\r\n color: string;\r\n size: number;\r\n weight?: number;\r\n align?: 'left' | 'center' | 'right';\r\n transform?: string;\r\n whiteSpace?: 'nowrap' | 'normal';\r\n opacity?: number;\r\n /** Render the text inside a rounded \"pill\" badge (solid fill + hairline border). */\r\n pill?: { background: string; border?: string; radius?: number; padX?: number; padY?: number };\r\n}\r\n\r\n/** Append an absolutely-positioned text node to the overlay. Returns the node. */\r\nexport function addOverlayText(surface: Surface, tokens: ThemeTokens, o: TextSpec): HTMLDivElement {\r\n const el = document.createElement('div');\r\n el.textContent = o.text;\r\n el.style.position = 'absolute';\r\n el.style.font = fontString(o.size, tokens.font.family, o.weight ?? tokens.font.weight.normal);\r\n el.style.color = o.color;\r\n el.style.left = `${o.left}px`;\r\n el.style.top = `${o.top}px`;\r\n el.style.whiteSpace = o.whiteSpace ?? 'nowrap';\r\n if (o.width != null) {\r\n el.style.width = `${o.width}px`;\r\n el.style.textAlign = o.align ?? 'left';\r\n }\r\n if (o.pill) {\r\n // A shrink-to-fit badge: solid fill keeps the text readable on any colour\r\n // beneath it, so labels look identical across every segment/fill.\r\n el.style.display = 'inline-block';\r\n el.style.lineHeight = '1';\r\n el.style.boxSizing = 'border-box';\r\n el.style.background = o.pill.background;\r\n el.style.borderRadius = `${o.pill.radius ?? 999}px`;\r\n el.style.padding = `${o.pill.padY ?? 2}px ${o.pill.padX ?? 7}px`;\r\n if (o.pill.border) el.style.border = `1px solid ${o.pill.border}`;\r\n }\r\n if (o.transform) el.style.transform = o.transform;\r\n if (o.opacity != null) el.style.opacity = String(o.opacity);\r\n el.style.pointerEvents = 'none';\r\n surface.overlay.appendChild(el);\r\n return el;\r\n}\r\n\r\n/**\r\n * Render the chart title + subtitle (if any) at the top of the chart and return\r\n * the inner content rect below them, inset by CHROME_PAD.\r\n */\r\nexport function drawTitleBlock(surface: Surface, tokens: ThemeTokens, size: Size, title: unknown): Rect {\r\n const f = tokens.font;\r\n const t = resolveTitle(title);\r\n let top = CHROME_PAD.top;\r\n const innerWidth = size.width - CHROME_PAD.left - CHROME_PAD.right;\r\n\r\n if (t.text) {\r\n addOverlayText(surface, tokens, {\r\n left: CHROME_PAD.left,\r\n top,\r\n width: innerWidth,\r\n text: t.text,\r\n color: tokens.color.text,\r\n size: f.size.title,\r\n weight: f.weight.bold,\r\n align: t.align,\r\n });\r\n top += Math.round(f.size.title * 1.3);\r\n if (t.subtitle) {\r\n addOverlayText(surface, tokens, {\r\n left: CHROME_PAD.left,\r\n top,\r\n width: innerWidth,\r\n text: t.subtitle,\r\n color: tokens.color.textMuted,\r\n size: f.size.small,\r\n align: t.align,\r\n });\r\n top += Math.round(f.size.small * 1.5);\r\n } else {\r\n top += 4;\r\n }\r\n }\r\n\r\n return {\r\n x: CHROME_PAD.left,\r\n y: top,\r\n width: innerWidth,\r\n height: Math.max(0, size.height - top - CHROME_PAD.bottom),\r\n };\r\n}\r\n\r\nexport interface LegendEntry {\r\n label: string;\r\n color: string;\r\n symbol?: 'square' | 'circle' | 'line';\r\n}\r\n\r\n/**\r\n * Render a categorical legend of swatch + label entries and return the content\r\n * rect remaining after reserving space for it.\r\n *\r\n * - position 'top' | 'bottom': a centered horizontal row (wraps if needed)\r\n * - position 'right': a vertical stack on the right\r\n */\r\nexport function drawCategoricalLegend(\r\n surface: Surface,\r\n tokens: ThemeTokens,\r\n area: Rect,\r\n entries: LegendEntry[],\r\n position: 'top' | 'bottom' | 'right' = 'right',\r\n): Rect {\r\n if (entries.length === 0) return area;\r\n const f = tokens.font;\r\n const labelSize = f.size.small;\r\n const rowH = Math.round(labelSize * 1.7);\r\n const swatch = 11;\r\n const gap = 16;\r\n const font = fontString(labelSize, f.family, f.weight.normal);\r\n\r\n const makeSwatch = (e: LegendEntry): HTMLSpanElement => {\r\n const s = document.createElement('span');\r\n s.style.flex = '0 0 auto';\r\n s.style.background = e.color;\r\n if (e.symbol === 'line') {\r\n s.style.width = `${swatch + 3}px`;\r\n s.style.height = '3px';\r\n s.style.borderRadius = '2px';\r\n } else if (e.symbol === 'circle') {\r\n s.style.width = `${swatch}px`;\r\n s.style.height = `${swatch}px`;\r\n s.style.borderRadius = '50%';\r\n } else {\r\n s.style.width = `${swatch}px`;\r\n s.style.height = `${swatch}px`;\r\n s.style.borderRadius = '2px';\r\n }\r\n return s;\r\n };\r\n\r\n if (position === 'right') {\r\n let maxLabel = 0;\r\n for (const e of entries) maxLabel = Math.max(maxLabel, measureText(e.label, font).width);\r\n const colW = Math.ceil(swatch + 6 + maxLabel + 4);\r\n const x = area.x + area.width - colW;\r\n let y = area.y + Math.max(0, (area.height - entries.length * rowH) / 2);\r\n for (const e of entries) {\r\n const row = document.createElement('div');\r\n row.style.position = 'absolute';\r\n row.style.left = `${x}px`;\r\n row.style.top = `${y}px`;\r\n row.style.display = 'flex';\r\n row.style.alignItems = 'center';\r\n row.style.gap = '6px';\r\n row.style.pointerEvents = 'none';\r\n const label = document.createElement('span');\r\n label.textContent = e.label;\r\n label.style.font = font;\r\n label.style.color = tokens.color.text;\r\n label.style.whiteSpace = 'nowrap';\r\n row.appendChild(makeSwatch(e));\r\n row.appendChild(label);\r\n surface.overlay.appendChild(row);\r\n y += rowH;\r\n }\r\n return { x: area.x, y: area.y, width: Math.max(0, area.width - colW - gap), height: area.height };\r\n }\r\n\r\n // Horizontal (top/bottom): center a flex-wrap row.\r\n const bar = document.createElement('div');\r\n bar.style.position = 'absolute';\r\n bar.style.left = `${area.x}px`;\r\n bar.style.width = `${area.width}px`;\r\n bar.style.display = 'flex';\r\n bar.style.flexWrap = 'wrap';\r\n bar.style.justifyContent = 'center';\r\n bar.style.gap = `4px ${gap}px`;\r\n bar.style.pointerEvents = 'none';\r\n for (const e of entries) {\r\n const row = document.createElement('div');\r\n row.style.display = 'flex';\r\n row.style.alignItems = 'center';\r\n row.style.gap = '6px';\r\n const label = document.createElement('span');\r\n label.textContent = e.label;\r\n label.style.font = font;\r\n label.style.color = tokens.color.text;\r\n label.style.whiteSpace = 'nowrap';\r\n row.appendChild(makeSwatch(e));\r\n row.appendChild(label);\r\n bar.appendChild(row);\r\n }\r\n // Estimate one row; wrapping is tolerated visually.\r\n const barH = rowH;\r\n if (position === 'top') {\r\n bar.style.top = `${area.y}px`;\r\n surface.overlay.appendChild(bar);\r\n return { x: area.x, y: area.y + barH + 6, width: area.width, height: Math.max(0, area.height - barH - 6) };\r\n }\r\n bar.style.top = `${area.y + area.height - barH}px`;\r\n surface.overlay.appendChild(bar);\r\n return { x: area.x, y: area.y, width: area.width, height: Math.max(0, area.height - barH - 6) };\r\n}\r\n","import { sequential, sequentialColorScale, rgbaToCss } from '../color';\r\nimport { formatValue } from '../format';\r\nimport type { Surface } from '../render/surface';\r\nimport { fontString, measureText } from '../render/text';\r\nimport { bandScale } from '../scales';\r\nimport { roundedRect } from '../shape';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { ChartSpec, HeatmapSpec } from '../spec/types';\r\nimport type { Rect, Size } from '../types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport { accessor, extent, toKey, toNumber, uniqueStrings } from '../util/data';\r\nimport type { InteractionModel } from '../interaction/types';\r\nimport type { RenderContext } from './index';\r\nimport { rowAlpha } from './emphasis';\r\nimport { addOverlayText, CHROME_PAD, drawTitleBlock } from './chrome';\r\n\r\nconst MIN_GRID_SIZE = 8;\r\n/** Above this cell count, sketch mode keeps clean cells (rough fills get too dense/slow). */\r\nconst MAX_ROUGH_CELLS = 800;\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\nfunction finite(value: number): boolean {\r\n return Number.isFinite(value);\r\n}\r\n\r\nfunction categoryKey(value: unknown): string {\r\n return value instanceof Date ? String(value) : toKey(value);\r\n}\r\n\r\nfunction measureMax(labels: readonly string[], font: string): number {\r\n let max = 0;\r\n for (const label of labels) max = Math.max(max, measureText(label, font).width);\r\n return max;\r\n}\r\n\r\nfunction drawRoundedCell(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number): void {\r\n if (!finite(x) || !finite(y) || !finite(width) || !finite(height) || width <= 0 || height <= 0) return;\r\n ctx.beginPath();\r\n roundedRect(ctx, x, y, width, height, Math.min(radius, width / 2, height / 2));\r\n ctx.fill();\r\n}\r\n\r\nfunction drawLegend(\r\n surface: Surface,\r\n tokens: ThemeTokens,\r\n legend: Rect,\r\n min: number,\r\n max: number,\r\n spec: HeatmapSpec,\r\n): void {\r\n if (legend.width <= 0 || legend.height <= 0) return;\r\n\r\n const ctx = surface.marks.ctx;\r\n const interp = sequential(spec.scheme ?? 'teal');\r\n const barWidth = Math.floor(clamp(legend.width * 0.48, Math.min(legend.width, 120), Math.min(legend.width, 220)));\r\n const barHeight = 10;\r\n const barX = Math.round(legend.x + (legend.width - barWidth) / 2);\r\n const barY = Math.round(legend.y + 4);\r\n const sameDomain = min === max;\r\n\r\n for (let i = 0; i < barWidth; i++) {\r\n const t = sameDomain ? 0.5 : barWidth <= 1 ? 0 : i / (barWidth - 1);\r\n ctx.fillStyle = rgbaToCss(interp(t));\r\n ctx.fillRect(barX + i, barY, 1, barHeight);\r\n }\r\n\r\n ctx.strokeStyle = tokens.color.border;\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(barX + 0.5, barY + 0.5, Math.max(0, barWidth - 1), Math.max(0, barHeight - 1));\r\n\r\n const labelTop = barY + barHeight + 3;\r\n addOverlayText(surface, tokens, {\r\n left: barX,\r\n top: labelTop,\r\n text: formatValue(min, spec.encoding.color.format),\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n });\r\n addOverlayText(surface, tokens, {\r\n left: barX + barWidth,\r\n top: labelTop,\r\n text: formatValue(max, spec.encoding.color.format),\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n transform: 'translateX(-100%)',\r\n });\r\n}\r\n\r\nexport function drawHeatmap(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): InteractionModel | void {\r\n const heatmap = spec as HeatmapSpec;\r\n const emphasis = context?.emphasis ?? null;\r\n const content = drawTitleBlock(surface, tokens, size, heatmap.title);\r\n const rows = heatmap.data ?? [];\r\n const { x, y, color } = heatmap.encoding;\r\n const xCats = uniqueStrings(rows, x.field);\r\n const yCats = uniqueStrings(rows, y.field);\r\n const colorDomain = extent(rows, color.field);\r\n\r\n if (xCats.length === 0 || yCats.length === 0 || !colorDomain || content.width <= 0 || content.height <= 0) return;\r\n\r\n const labelSize = tokens.font.size.small;\r\n const labelFont = fontString(labelSize, tokens.font.family, tokens.font.weight.normal);\r\n const yLabelWidth = measureMax(yCats, labelFont);\r\n const leftGutter = Math.ceil(clamp(yLabelWidth + tokens.spacing.sm, 28, Math.min(110, content.width * 0.32)));\r\n const xLabelHeight = Math.ceil(labelSize * 1.7);\r\n const legendHeight = Math.ceil(labelSize + 24);\r\n const gridTop = content.y + Math.min(tokens.spacing.xs, CHROME_PAD.top);\r\n const grid: Rect = {\r\n x: content.x + leftGutter,\r\n y: gridTop,\r\n width: Math.max(0, content.width - leftGutter),\r\n height: Math.max(0, content.y + content.height - gridTop - xLabelHeight - legendHeight - tokens.spacing.sm),\r\n };\r\n\r\n if (grid.width < MIN_GRID_SIZE || grid.height < MIN_GRID_SIZE) return;\r\n\r\n const xScale = bandScale({ domain: xCats, range: [grid.x, grid.x + grid.width], paddingInner: 0.06, paddingOuter: 0.02 });\r\n const yScale = bandScale({ domain: yCats, range: [grid.y, grid.y + grid.height], paddingInner: 0.06, paddingOuter: 0.02 });\r\n const interp = sequential(heatmap.scheme ?? 'teal');\r\n const cscale = sequentialColorScale({ domain: colorDomain, interpolator: interp });\r\n const readX = accessor(x.field);\r\n const readY = accessor(y.field);\r\n const readColor = accessor(color.field);\r\n const ctx = surface.marks.ctx;\r\n const cellRadius = Math.min(2, tokens.radius.sm);\r\n const cellValue = new Map<string, number>();\r\n const sketch = resolveSketch(spec);\r\n const pen = sketch && xCats.length * yCats.length <= MAX_ROUGH_CELLS ? new RoughPen(ctx, sketch) : null;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(grid.x, grid.y, grid.width, grid.height);\r\n ctx.clip();\r\n\r\n for (const row of rows) {\r\n const value = toNumber(readColor(row));\r\n if (!finite(value)) continue;\r\n\r\n const xk = categoryKey(readX(row));\r\n const yk = categoryKey(readY(row));\r\n const sx = xScale.map(xk);\r\n const sy = yScale.map(yk);\r\n if (sx === undefined || sy === undefined) continue;\r\n\r\n cellValue.set(`${xk}\\u0000${yk}`, value);\r\n const fill = rgbaToCss(cscale.map(value));\r\n const alpha = rowAlpha(emphasis, row);\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n if (pen) {\r\n pen.rect(sx, sy, xScale.bandwidth, yScale.bandwidth, { fill, fillStyle: 'solid' });\r\n } else {\r\n ctx.fillStyle = fill;\r\n drawRoundedCell(ctx, sx, sy, xScale.bandwidth, yScale.bandwidth, cellRadius);\r\n }\r\n if (alpha !== 1) ctx.globalAlpha = 1;\r\n }\r\n\r\n ctx.restore();\r\n\r\n if (pen) {\r\n pen.rect(grid.x, grid.y, grid.width, grid.height, {\r\n stroke: tokens.color.border,\r\n roughness: sketch!.roughness * 0.6,\r\n });\r\n } else {\r\n ctx.strokeStyle = tokens.color.border;\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(grid.x + 0.5, grid.y + 0.5, Math.max(0, grid.width - 1), Math.max(0, grid.height - 1));\r\n }\r\n\r\n for (const cat of yCats) {\r\n const sy = yScale.map(cat);\r\n if (sy === undefined) continue;\r\n addOverlayText(surface, tokens, {\r\n left: content.x,\r\n top: sy + yScale.bandwidth / 2,\r\n width: Math.max(0, leftGutter - tokens.spacing.sm),\r\n text: cat,\r\n color: tokens.color.textMuted,\r\n size: labelSize,\r\n align: 'right',\r\n transform: 'translateY(-50%)',\r\n });\r\n }\r\n\r\n const widestX = measureMax(xCats, labelFont);\r\n const every = Math.max(1, Math.ceil((widestX + tokens.spacing.md) / Math.max(1, xScale.step)));\r\n const xLabelTop = grid.y + grid.height + 6;\r\n xCats.forEach((cat, index) => {\r\n if (index % every !== 0) return;\r\n const sx = xScale.map(cat);\r\n if (sx === undefined) return;\r\n addOverlayText(surface, tokens, {\r\n left: sx + xScale.bandwidth / 2,\r\n top: xLabelTop,\r\n text: cat,\r\n color: tokens.color.textMuted,\r\n size: labelSize,\r\n transform: 'translateX(-50%)',\r\n });\r\n });\r\n\r\n drawLegend(\r\n surface,\r\n tokens,\r\n {\r\n x: grid.x,\r\n y: grid.y + grid.height + xLabelHeight + tokens.spacing.xs,\r\n width: grid.width,\r\n height: legendHeight,\r\n },\r\n colorDomain[0],\r\n colorDomain[1],\r\n heatmap,\r\n );\r\n\r\n const tt = heatmap.tooltip;\r\n if (tt === false || (tt && typeof tt === 'object' && tt.show === false)) return;\r\n\r\n const bw = xScale.bandwidth;\r\n const bh = yScale.bandwidth;\r\n const xPos = xCats.map((cat) => ({ cat, s: xScale.map(cat) })).filter((p) => p.s !== undefined) as { cat: string; s: number }[];\r\n const yPos = yCats.map((cat) => ({ cat, s: yScale.map(cat) })).filter((p) => p.s !== undefined) as { cat: string; s: number }[];\r\n const colorLabel = color.title ?? color.field;\r\n\r\n return {\r\n region: grid,\r\n hitTest: (px, py) => {\r\n const xc = xPos.find((p) => px >= p.s && px <= p.s + bw);\r\n const yc = yPos.find((p) => py >= p.s && py <= p.s + bh);\r\n if (!xc || !yc) return null;\r\n const value = cellValue.get(`${xc.cat}\\u0000${yc.cat}`);\r\n if (value === undefined) return null;\r\n return {\r\n key: `${xc.cat}\\u0000${yc.cat}`,\r\n anchorX: xc.s + bw / 2,\r\n anchorY: yc.s + bh / 2,\r\n content: {\r\n title: `${xc.cat} · ${yc.cat}`,\r\n rows: [\r\n { swatch: rgbaToCss(cscale.map(value)), label: colorLabel, value: formatValue(value, color.format) },\r\n ],\r\n },\r\n draw: (ictx) => {\r\n ictx.save();\r\n ictx.beginPath();\r\n roundedRect(ictx, xc.s, yc.s, bw, bh, cellRadius);\r\n ictx.lineWidth = 3;\r\n ictx.strokeStyle = tokens.color.background;\r\n ictx.stroke();\r\n ictx.beginPath();\r\n roundedRect(ictx, xc.s, yc.s, bw, bh, cellRadius);\r\n ictx.lineWidth = 1.5;\r\n ictx.strokeStyle = tokens.color.text;\r\n ictx.stroke();\r\n ictx.restore();\r\n },\r\n };\r\n },\r\n pick: (px, py) => {\r\n const xc = xPos.find((p) => px >= p.s && px <= p.s + bw);\r\n const yc = yPos.find((p) => py >= p.s && py <= p.s + bh);\r\n if (!xc || !yc) return null;\r\n if (cellValue.get(`${xc.cat}\\u0000${yc.cat}`) === undefined) return null;\r\n return { kind: 'point', fields: [x.field, y.field], tuples: [[xc.cat, yc.cat]] };\r\n },\r\n };\r\n}\r\n","/**\r\n * Pure layout engine for pie / donut slice labels.\r\n *\r\n * Decides, per slice, whether a label sits **inside** the wedge or becomes an\r\n * **outside callout** with a leader line, then lays the outside labels out into\r\n * two collision-free columns (left / right) and reserves horizontal room for\r\n * them by shrinking / recentring the pie. No DOM, no canvas — every output is a\r\n * plain number so the result is deterministic and unit-testable.\r\n *\r\n * Angle convention matches `pie.ts`: 0 rad points up (12 o'clock) and angles\r\n * increase clockwise, so a point at radius `r` and angle `a` is\r\n * `(cx + r·sin a, cy − r·cos a)`.\r\n */\r\n\r\nexport type PieLabelContent =\r\n | 'percent'\r\n | 'value'\r\n | 'category'\r\n | 'category-percent'\r\n | 'category-value';\r\n\r\nexport interface PieLabelInput {\r\n /** Caller-side identity so the result can be mapped back to a slice. */\r\n index: number;\r\n label: string;\r\n value: number;\r\n /** Fraction of the whole, 0..1. */\r\n share: number;\r\n startAngle: number;\r\n endAngle: number;\r\n}\r\n\r\nexport interface PlannedInsideLabel {\r\n index: number;\r\n text: string;\r\n /** Centre of the label (caller centres the text on this point). */\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface PlannedOutsideLabel {\r\n index: number;\r\n text: string;\r\n /** Text anchor point (paired with `align`). */\r\n x: number;\r\n y: number;\r\n align: 'left' | 'right';\r\n side: 'left' | 'right';\r\n /** Leader polyline: slice edge → radial elbow → label row. */\r\n points: Array<{ x: number; y: number }>;\r\n}\r\n\r\nexport interface PieLabelPlan {\r\n /** Geometry the caller should draw the wedges with (may be shrunk/recentred). */\r\n cx: number;\r\n cy: number;\r\n outerR: number;\r\n innerR: number;\r\n inside: PlannedInsideLabel[];\r\n outside: PlannedOutsideLabel[];\r\n}\r\n\r\ninterface Rect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface PlanPieLabelsOptions {\r\n slices: PieLabelInput[];\r\n cx: number;\r\n cy: number;\r\n outerR: number;\r\n innerR: number;\r\n area: Rect;\r\n placement: 'inside' | 'outside' | 'auto';\r\n /** When omitted, defaults to 'percent' inside and 'category-percent' outside. */\r\n content?: PieLabelContent;\r\n minShare: number;\r\n lineHeight: number;\r\n measure: (text: string) => number;\r\n formatValue: (value: number) => string;\r\n}\r\n\r\nconst ELBOW = 12;\r\nconst GAP = 6;\r\nconst INSIDE_PAD = 6;\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\n/** Unit direction for an angle in the pie's \"0 at top, clockwise\" convention. */\r\nfunction direction(angle: number): { x: number; y: number } {\r\n return { x: Math.sin(angle), y: -Math.cos(angle) };\r\n}\r\n\r\n/** Percentage text with adaptive precision (1 decimal under 10%, else whole). */\r\nfunction formatPercent(share: number): string {\r\n const pct = share * 100;\r\n const text = pct < 10 ? pct.toFixed(1) : pct.toFixed(0);\r\n return `${text.replace(/\\.0$/, '')}%`;\r\n}\r\n\r\nfunction labelText(\r\n slice: PieLabelInput,\r\n placement: 'inside' | 'outside',\r\n options: PlanPieLabelsOptions,\r\n): string {\r\n const content = options.content ?? (placement === 'inside' ? 'percent' : 'category-percent');\r\n switch (content) {\r\n case 'percent':\r\n return formatPercent(slice.share);\r\n case 'value':\r\n return options.formatValue(slice.value);\r\n case 'category':\r\n return slice.label;\r\n case 'category-value':\r\n return `${slice.label} · ${options.formatValue(slice.value)}`;\r\n case 'category-percent':\r\n default:\r\n return `${slice.label} · ${formatPercent(slice.share)}`;\r\n }\r\n}\r\n\r\n/**\r\n * Spread label centres so neighbours never overlap (>= `lineHeight` apart) while\r\n * staying within `[top, bottom]`. Two-way relaxation: push down from the top,\r\n * shift up if it spills past the bottom, then re-settle from the top.\r\n */\r\nfunction relaxColumn(idealYs: number[], lineHeight: number, top: number, bottom: number): number[] {\r\n const order = idealYs.map((y, i) => ({ i, y })).sort((a, b) => a.y - b.y);\r\n for (let k = 1; k < order.length; k++) {\r\n if (order[k].y < order[k - 1].y + lineHeight) order[k].y = order[k - 1].y + lineHeight;\r\n }\r\n const last = order[order.length - 1];\r\n if (last && last.y > bottom) {\r\n const shift = last.y - bottom;\r\n for (const o of order) o.y -= shift;\r\n }\r\n if (order.length && order[0].y < top) {\r\n let prev = top - lineHeight;\r\n for (const o of order) {\r\n if (o.y < prev + lineHeight) o.y = prev + lineHeight;\r\n prev = o.y;\r\n }\r\n }\r\n const out = new Array<number>(idealYs.length);\r\n for (const o of order) out[o.i] = o.y;\r\n return out;\r\n}\r\n\r\nexport function planPieLabels(options: PlanPieLabelsOptions): PieLabelPlan {\r\n const { slices, area, placement, minShare, lineHeight, measure } = options;\r\n const origOuterR = options.outerR;\r\n const origInnerR = options.innerR;\r\n\r\n // 1. Resolve inside vs. outside per slice using the original geometry.\r\n const insideSlices: Array<{ slice: PieLabelInput; mid: number; text: string }> = [];\r\n const outsideSlices: Array<{ slice: PieLabelInput; mid: number; text: string; side: 'left' | 'right' }> = [];\r\n\r\n const insideLabelR = origInnerR > 0 ? (origInnerR + origOuterR) / 2 : origOuterR * 0.62;\r\n const radialBand = origInnerR > 0 ? origOuterR - origInnerR : origOuterR;\r\n\r\n for (const slice of slices) {\r\n if (slice.share < minShare) continue;\r\n const mid = (slice.startAngle + slice.endAngle) / 2;\r\n\r\n let goesInside: boolean;\r\n if (placement === 'inside') goesInside = true;\r\n else if (placement === 'outside') goesInside = false;\r\n else {\r\n const insideText = labelText(slice, 'inside', options);\r\n const tangential = (slice.endAngle - slice.startAngle) * insideLabelR;\r\n const fitsTangential = measure(insideText) + INSIDE_PAD <= tangential;\r\n const fitsRadial = lineHeight * 0.8 <= radialBand;\r\n goesInside = fitsTangential && fitsRadial;\r\n }\r\n\r\n if (goesInside) {\r\n insideSlices.push({ slice, mid, text: labelText(slice, 'inside', options) });\r\n } else {\r\n const dir = direction(mid);\r\n outsideSlices.push({\r\n slice,\r\n mid,\r\n text: labelText(slice, 'outside', options),\r\n side: dir.x >= 0 ? 'right' : 'left',\r\n });\r\n }\r\n }\r\n\r\n // 2. Reserve horizontal room for outside labels by fitting the circle between\r\n // two label columns; shrink + recentre as needed.\r\n let cx = options.cx;\r\n const cy = options.cy;\r\n let outerR = origOuterR;\r\n let innerR = origInnerR;\r\n\r\n if (outsideSlices.length > 0) {\r\n let maxLeftW = 0;\r\n let maxRightW = 0;\r\n for (const o of outsideSlices) {\r\n const w = measure(o.text);\r\n if (o.side === 'right') maxRightW = Math.max(maxRightW, w);\r\n else maxLeftW = Math.max(maxLeftW, w);\r\n }\r\n const capW = area.width * 0.34;\r\n const leftReserve = maxLeftW > 0 ? Math.min(maxLeftW + ELBOW + GAP, capW) : 0;\r\n const rightReserve = maxRightW > 0 ? Math.min(maxRightW + ELBOW + GAP, capW) : 0;\r\n const leftBound = area.x + leftReserve;\r\n const rightBound = area.x + area.width - rightReserve;\r\n const horizR = (rightBound - leftBound) / 2;\r\n const vertR = area.height * 0.46;\r\n outerR = clamp(Math.min(origOuterR, horizR, vertR), 16, origOuterR);\r\n const scale = origOuterR > 0 ? outerR / origOuterR : 1;\r\n innerR = origInnerR * scale;\r\n cx = (leftBound + rightBound) / 2;\r\n }\r\n\r\n // 3. Inside labels at the (possibly shrunk) mid-radius.\r\n const insideR = innerR > 0 ? (innerR + outerR) / 2 : outerR * 0.62;\r\n const inside: PlannedInsideLabel[] = insideSlices.map(({ slice, mid, text }) => {\r\n const dir = direction(mid);\r\n return { index: slice.index, text, x: cx + insideR * dir.x, y: cy + insideR * dir.y };\r\n });\r\n\r\n // 4. Outside callouts: anchor + radial elbow, then collision-resolve per side.\r\n const elbowR = outerR + ELBOW;\r\n const top = area.y + lineHeight / 2;\r\n const bottom = area.y + area.height - lineHeight / 2;\r\n const outside: PlannedOutsideLabel[] = [];\r\n\r\n for (const side of ['left', 'right'] as const) {\r\n const group = outsideSlices.filter((o) => o.side === side);\r\n if (group.length === 0) continue;\r\n const idealYs = group.map((o) => cy + elbowR * direction(o.mid).y);\r\n const ys = relaxColumn(idealYs, lineHeight, top, bottom);\r\n\r\n group.forEach((o, i) => {\r\n const dir = direction(o.mid);\r\n const anchor = { x: cx + outerR * dir.x, y: cy + outerR * dir.y };\r\n const elbow = { x: cx + elbowR * dir.x, y: cy + elbowR * dir.y };\r\n const labelY = ys[i];\r\n const textX = side === 'right' ? elbow.x + GAP : elbow.x - GAP;\r\n outside.push({\r\n index: o.slice.index,\r\n text: o.text,\r\n x: textX,\r\n y: labelY,\r\n align: side === 'right' ? 'left' : 'right',\r\n side,\r\n points: [anchor, elbow, { x: textX, y: labelY }],\r\n });\r\n });\r\n }\r\n\r\n return { cx, cy, outerR, innerR, inside, outside };\r\n}\r\n","import { ordinalColorScale, parseColor, readableTextColor, rgbaToCss } from '../color';\r\nimport { formatValue } from '../format';\r\nimport type { Surface } from '../render/surface';\r\nimport { arc } from '../shape';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { ChartSpec, PieSpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { RGBA, Size } from '../types';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport { aggregateValues } from '../pivot';\r\nimport type { InteractionModel } from '../interaction/types';\r\nimport type { RenderContext } from './index';\r\nimport {\r\n addOverlayText,\r\n CHROME_PAD,\r\n drawCategoricalLegend,\r\n drawTitleBlock,\r\n type LegendEntry,\r\n} from './chrome';\r\nimport { fontString, measureText } from '../render/text';\r\nimport { planPieLabels, type PieLabelContent } from './pieLabels';\r\n\r\nconst TAU = Math.PI * 2;\r\n\r\ninterface PieSlice {\r\n key: string;\r\n label: string;\r\n value: number;\r\n color: string;\r\n rgba: RGBA;\r\n /** The raw color-field value backing this slice (for selection identity). */\r\n category: unknown;\r\n startAngle: number;\r\n endAngle: number;\r\n}\r\n\r\ntype LegendPosition = 'top' | 'right' | 'bottom';\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\nfunction resolveLegendPosition(spec: PieSpec, width: number, height: number): LegendPosition | null {\r\n if (spec.legend === false) return null;\r\n if (spec.legend && typeof spec.legend === 'object' && spec.legend.show === false) return null;\r\n\r\n const requested = spec.legend && typeof spec.legend === 'object' ? spec.legend.position : undefined;\r\n if (requested === 'top' || requested === 'bottom' || requested === 'right') return requested;\r\n\r\n return height > 0 && width / height > 2.2 ? 'bottom' : 'right';\r\n}\r\n\r\nfunction sliceLabel(value: unknown): string {\r\n const key = toKey(value);\r\n return key === '' ? '(blank)' : key;\r\n}\r\n\r\nfunction buildSlices(spec: PieSpec, palette: string[]): PieSlice[] {\r\n const readTheta = accessor(spec.encoding.theta.field);\r\n const readColor = accessor(spec.encoding.color.field);\r\n const colorScale = ordinalColorScale({ palette });\r\n const op = spec.encoding.theta.aggregate ?? 'sum';\r\n const rows = spec.data ?? [];\r\n\r\n // Aggregate theta by color category (first-seen order) so repeated categories\r\n // collapse into one slice — the expected BI behavior for a share chart.\r\n const order: string[] = [];\r\n const groups = new Map<string, { category: unknown; values: number[] }>();\r\n for (const row of rows) {\r\n const value = toNumber(readTheta(row));\r\n if (!Number.isFinite(value)) continue;\r\n const category = readColor(row);\r\n const key = toKey(category);\r\n let group = groups.get(key);\r\n if (!group) {\r\n group = { category, values: [] };\r\n groups.set(key, group);\r\n order.push(key);\r\n }\r\n group.values.push(value);\r\n }\r\n\r\n const raw: Array<Omit<PieSlice, 'startAngle' | 'endAngle'>> = [];\r\n let total = 0;\r\n for (const key of order) {\r\n const group = groups.get(key)!;\r\n const value = aggregateValues(group.values, op) ?? 0;\r\n if (!Number.isFinite(value) || value <= 0) continue;\r\n const rgba = colorScale.map(key);\r\n raw.push({\r\n key,\r\n label: sliceLabel(group.category),\r\n value,\r\n color: rgbaToCss(rgba),\r\n rgba,\r\n category: group.category,\r\n });\r\n total += value;\r\n }\r\n\r\n let angle = 0;\r\n return raw.map((s, i) => {\r\n const endAngle = i === raw.length - 1 ? TAU : angle + (s.value / total) * TAU;\r\n const slice = { ...s, startAngle: angle, endAngle };\r\n angle = endAngle;\r\n return slice;\r\n });\r\n}\r\n\r\nfunction uniqueLegendEntries(slices: readonly PieSlice[]): LegendEntry[] {\r\n const seen = new Set<string>();\r\n const entries: LegendEntry[] = [];\r\n for (const slice of slices) {\r\n if (seen.has(slice.key)) continue;\r\n seen.add(slice.key);\r\n entries.push({ label: slice.label, color: slice.color, symbol: 'square' });\r\n }\r\n return entries;\r\n}\r\n\r\nfunction totalOf(slices: readonly PieSlice[]): number {\r\n return slices.reduce((sum, slice) => sum + slice.value, 0);\r\n}\r\n\r\nfunction pieTooltipEnabled(spec: PieSpec): boolean {\r\n const tt = spec.tooltip;\r\n if (tt === false) return false;\r\n if (tt && typeof tt === 'object' && tt.show === false) return false;\r\n return true;\r\n}\r\n\r\ninterface ResolvedPieLabels {\r\n placement: 'inside' | 'outside' | 'auto';\r\n content?: PieLabelContent;\r\n minShare: number;\r\n connector: 'slice' | 'muted';\r\n}\r\n\r\n/** Normalise `spec.labels` (boolean | PieLabels) into a config, or null to hide. */\r\nfunction resolvePieLabels(spec: PieSpec): ResolvedPieLabels | null {\r\n const l = spec.labels;\r\n if (l === false) return null;\r\n if (l && typeof l === 'object') {\r\n if (l.show === false) return null;\r\n return {\r\n placement: l.placement ?? 'auto',\r\n content: l.content,\r\n minShare: typeof l.minShare === 'number' ? l.minShare : 0.01,\r\n connector: l.connector ?? 'slice',\r\n };\r\n }\r\n return { placement: 'auto', minShare: 0.01, connector: 'slice' };\r\n}\r\n\r\nexport function drawPie(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): InteractionModel | void {\r\n const pie = spec as PieSpec;\r\n const ctx = surface.marks.ctx;\r\n const colorField = pie.encoding.color.field;\r\n const emphasis = context?.emphasis ?? null;\r\n const sliceAlpha = (slice: PieSlice): number =>\r\n emphasis ? (emphasis.match({ [colorField]: slice.category }) ? 1 : emphasis.dim) : 1;\r\n const content = drawTitleBlock(surface, tokens, size, pie.title);\r\n const slices = buildSlices(pie, tokens.color.palette);\r\n const legendPosition = resolveLegendPosition(pie, content.width, content.height);\r\n const area = legendPosition\r\n ? drawCategoricalLegend(surface, tokens, content, uniqueLegendEntries(slices), legendPosition)\r\n : content;\r\n\r\n const initialCx = area.x + area.width / 2;\r\n const initialCy = area.y + area.height / 2;\r\n const initialOuterR = Math.max(0, (Math.min(area.width, area.height) / 2) * 0.92);\r\n const donutRatio =\r\n pie.donut === true ? 0.6 : typeof pie.donut === 'number' ? clamp(pie.donut, 0, 0.95) : 0;\r\n const initialInnerR = initialOuterR * donutRatio;\r\n const total = totalOf(slices);\r\n const separator = parseColor(tokens.color.background) ? tokens.color.background : tokens.color.border;\r\n\r\n if (slices.length === 0 || total <= 0 || initialOuterR <= 0) {\r\n addOverlayText(surface, tokens, {\r\n left: area.x,\r\n top: area.y + Math.max(CHROME_PAD.top, area.height / 2 - tokens.font.size.small / 2),\r\n width: area.width,\r\n text: 'No positive values',\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n align: 'center',\r\n });\r\n return;\r\n }\r\n\r\n const labelCfg = resolvePieLabels(pie);\r\n const labelFont = fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.normal);\r\n const labelPlan =\r\n labelCfg &&\r\n planPieLabels({\r\n slices: slices.map((s, i) => ({\r\n index: i,\r\n label: s.label,\r\n value: s.value,\r\n share: s.value / total,\r\n startAngle: s.startAngle,\r\n endAngle: s.endAngle,\r\n })),\r\n cx: initialCx,\r\n cy: initialCy,\r\n outerR: initialOuterR,\r\n innerR: initialInnerR,\r\n area: { x: area.x, y: area.y, width: area.width, height: area.height },\r\n placement: labelCfg.placement,\r\n content: labelCfg.content,\r\n minShare: labelCfg.minShare,\r\n lineHeight: Math.round(tokens.font.size.small * 1.5),\r\n measure: (t) => measureText(t, labelFont).width,\r\n formatValue: (v) => formatValue(v, pie.encoding.theta.format),\r\n });\r\n\r\n const cx = labelPlan ? labelPlan.cx : initialCx;\r\n const cy = labelPlan ? labelPlan.cy : initialCy;\r\n const outerRadius = labelPlan ? labelPlan.outerR : initialOuterR;\r\n const innerRadius = labelPlan ? labelPlan.innerR : initialInnerR;\r\n\r\n ctx.save();\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeStyle = separator;\r\n\r\n const sketch = resolveSketch(spec);\r\n if (sketch) {\r\n const pen = new RoughPen(ctx, sketch);\r\n for (const slice of slices) {\r\n const alpha = sliceAlpha(slice);\r\n if (alpha !== 1) ctx.globalAlpha = alpha;\r\n pen.wedge(cx, cy, innerRadius, outerRadius, slice.startAngle, slice.endAngle, {\r\n fill: slice.color,\r\n stroke: separator,\r\n });\r\n if (alpha !== 1) ctx.globalAlpha = 1;\r\n }\r\n ctx.restore();\r\n } else {\r\n for (const slice of slices) {\r\n const wedge = arc({\r\n innerRadius,\r\n outerRadius,\r\n startAngle: slice.startAngle,\r\n endAngle: slice.endAngle,\r\n });\r\n ctx.beginPath();\r\n wedge(ctx, cx, cy);\r\n ctx.globalAlpha = sliceAlpha(slice);\r\n ctx.fillStyle = slice.color;\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.globalAlpha = 1;\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n if (labelPlan && labelCfg) {\r\n ctx.save();\r\n ctx.lineWidth = 1;\r\n ctx.lineJoin = 'round';\r\n ctx.lineCap = 'round';\r\n for (const o of labelPlan.outside) {\r\n const slice = slices[o.index];\r\n ctx.globalAlpha = sliceAlpha(slice);\r\n ctx.strokeStyle = labelCfg.connector === 'muted' ? tokens.color.border : slice.color;\r\n ctx.beginPath();\r\n o.points.forEach((p, i) => (i === 0 ? ctx.moveTo(p.x, p.y) : ctx.lineTo(p.x, p.y)));\r\n ctx.stroke();\r\n }\r\n ctx.globalAlpha = 1;\r\n ctx.restore();\r\n\r\n for (const o of labelPlan.outside) {\r\n const alpha = sliceAlpha(slices[o.index]);\r\n addOverlayText(surface, tokens, {\r\n left: o.x,\r\n top: o.y,\r\n text: o.text,\r\n color: tokens.color.text,\r\n size: tokens.font.size.small,\r\n transform: o.align === 'right' ? 'translate(-100%,-50%)' : 'translateY(-50%)',\r\n opacity: alpha === 1 ? undefined : alpha,\r\n });\r\n }\r\n\r\n for (const l of labelPlan.inside) {\r\n const slice = slices[l.index];\r\n const alpha = sliceAlpha(slice);\r\n addOverlayText(surface, tokens, {\r\n left: l.x,\r\n top: l.y,\r\n text: l.text,\r\n color: rgbaToCss(readableTextColor(slice.rgba)),\r\n size: tokens.font.size.small,\r\n weight: tokens.font.weight.bold,\r\n transform: 'translate(-50%,-50%)',\r\n opacity: alpha === 1 ? undefined : alpha,\r\n });\r\n }\r\n }\r\n\r\n if (innerRadius >= 34) {\r\n addOverlayText(surface, tokens, {\r\n left: cx,\r\n top: cy - tokens.font.size.small - 2,\r\n text: pie.encoding.theta.title ?? 'Total',\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.tiny,\r\n transform: 'translate(-50%,-50%)',\r\n });\r\n addOverlayText(surface, tokens, {\r\n left: cx,\r\n top: cy + tokens.font.size.base / 2,\r\n text: formatValue(total, pie.encoding.theta.format),\r\n color: tokens.color.text,\r\n size: tokens.font.size.large,\r\n weight: tokens.font.weight.bold,\r\n transform: 'translate(-50%,-50%)',\r\n });\r\n }\r\n\r\n if (!pieTooltipEnabled(pie)) return;\r\n\r\n const measureLabel = pie.encoding.theta.title ?? pie.encoding.theta.field;\r\n const region = { x: area.x, y: area.y, width: area.width, height: area.height };\r\n\r\n return {\r\n region,\r\n hitTest: (px, py) => {\r\n const dx = px - cx;\r\n const dy = py - cy;\r\n const r = Math.hypot(dx, dy);\r\n if (r < innerRadius || r > outerRadius) return null;\r\n let theta = Math.atan2(dx, -dy);\r\n if (theta < 0) theta += TAU;\r\n const slice = slices.find((s) => theta >= s.startAngle && theta < s.endAngle);\r\n if (!slice) return null;\r\n const share = slice.value / total;\r\n return {\r\n key: slice.key,\r\n anchorX: px,\r\n anchorY: py,\r\n content: {\r\n title: slice.label,\r\n rows: [\r\n { swatch: slice.color, label: measureLabel, value: formatValue(slice.value, pie.encoding.theta.format) },\r\n { label: 'Share', value: `${(share * 100).toFixed(1)}%`, muted: true },\r\n ],\r\n },\r\n draw: (ictx) => {\r\n const wedge = arc({\r\n innerRadius,\r\n outerRadius: outerRadius + 5,\r\n startAngle: slice.startAngle,\r\n endAngle: slice.endAngle,\r\n });\r\n ictx.save();\r\n ictx.beginPath();\r\n wedge(ictx, cx, cy);\r\n ictx.fillStyle = slice.color;\r\n ictx.fill();\r\n ictx.lineWidth = 1.5;\r\n ictx.strokeStyle = separator;\r\n ictx.stroke();\r\n ictx.restore();\r\n },\r\n };\r\n },\r\n pick: (px, py) => {\r\n const dx = px - cx;\r\n const dy = py - cy;\r\n const r = Math.hypot(dx, dy);\r\n if (r < innerRadius || r > outerRadius) return null;\r\n let theta = Math.atan2(dx, -dy);\r\n if (theta < 0) theta += TAU;\r\n const slice = slices.find((s) => theta >= s.startAngle && theta < s.endAngle);\r\n if (!slice) return null;\r\n return { kind: 'point', fields: [colorField], tuples: [[slice.category]] };\r\n },\r\n };\r\n}\r\n","import { ordinalColorScale, rgbaToCss } from '../color';\r\nimport { formatValue } from '../format';\r\nimport type { Surface } from '../render/surface';\r\nimport { fontString, measureText } from '../render/text';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { ChartSpec, FunnelSpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Point, RGBA, Size } from '../types';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport type { InteractionModel } from '../interaction/types';\r\nimport type { RenderContext } from './index';\r\nimport { addOverlayText, CHROME_PAD, drawTitleBlock } from './chrome';\r\n\r\ninterface Stage {\r\n key: string;\r\n label: string;\r\n value: number;\r\n category: unknown;\r\n color: string;\r\n rgba: RGBA;\r\n}\r\n\r\n/** Aggregate (sum) value by stage, preserving first-seen order. */\r\nfunction buildStages(spec: FunnelSpec, palette: string[]): Stage[] {\r\n const readStage = accessor(spec.encoding.stage.field);\r\n const readValue = accessor(spec.encoding.value.field);\r\n const colorScale = ordinalColorScale({ palette });\r\n const order: string[] = [];\r\n const totals = new Map<string, { category: unknown; value: number }>();\r\n\r\n for (const row of spec.data ?? []) {\r\n const category = readStage(row);\r\n const key = toKey(category);\r\n const value = toNumber(readValue(row));\r\n if (!Number.isFinite(value)) continue;\r\n const cur = totals.get(key);\r\n if (cur) cur.value += value;\r\n else {\r\n totals.set(key, { category, value });\r\n order.push(key);\r\n }\r\n }\r\n\r\n return order.map((key) => {\r\n const { category, value } = totals.get(key)!;\r\n const rgba = colorScale.map(key);\r\n return {\r\n key,\r\n label: key === '' ? '(blank)' : key,\r\n value,\r\n category,\r\n color: rgbaToCss(rgba),\r\n rgba,\r\n };\r\n });\r\n}\r\n\r\nexport function drawFunnel(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): InteractionModel | void {\r\n const funnel = spec as FunnelSpec;\r\n const ctx = surface.marks.ctx;\r\n const stageField = funnel.encoding.stage.field;\r\n const valueFormat = funnel.encoding.value.format;\r\n const showLabels = funnel.labels !== false;\r\n const mode = funnel.percent === 'previous' ? 'previous' : 'first';\r\n const emphasis = context?.emphasis ?? null;\r\n\r\n const content = drawTitleBlock(surface, tokens, size, funnel.title);\r\n const stages = buildStages(funnel, tokens.color.palette);\r\n const maxValue = stages.reduce((m, s) => Math.max(m, s.value), 0);\r\n\r\n if (stages.length === 0 || maxValue <= 0 || content.width <= 0 || content.height <= 0) {\r\n addOverlayText(surface, tokens, {\r\n left: content.x,\r\n top: content.y + Math.max(CHROME_PAD.top, content.height / 2 - tokens.font.size.small / 2),\r\n width: content.width,\r\n text: 'No positive values',\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n align: 'center',\r\n });\r\n return;\r\n }\r\n\r\n // Left gutter holds the stage name + value (like a category axis).\r\n const labelFont = fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.bold);\r\n let labelW = 0;\r\n if (showLabels) {\r\n for (const s of stages) labelW = Math.max(labelW, measureText(s.label, labelFont).width);\r\n labelW = Math.min(content.width * 0.34, labelW + 14);\r\n }\r\n\r\n const funnelX = content.x + labelW;\r\n const funnelW = content.width - labelW;\r\n const cx = funnelX + funnelW / 2;\r\n const n = stages.length;\r\n const gap = Math.min(6, Math.max(2, content.height / n / 12));\r\n const bandH = content.height / n;\r\n const widthOf = (v: number): number => (v / maxValue) * funnelW;\r\n\r\n const alphaOf = (s: Stage): number =>\r\n emphasis ? (emphasis.match({ [stageField]: s.category }) ? 1 : emphasis.dim) : 1;\r\n const pctOf = (i: number): number => {\r\n if (mode === 'previous') return i === 0 ? 1 : stages[i].value / stages[i - 1].value;\r\n return stages[i].value / stages[0].value;\r\n };\r\n\r\n const sketch = resolveSketch(spec);\r\n const pen = sketch ? new RoughPen(ctx, sketch) : null;\r\n const bands: { top: number; bottom: number; topHalf: number; botHalf: number }[] = [];\r\n\r\n ctx.save();\r\n for (let i = 0; i < n; i++) {\r\n const s = stages[i];\r\n const top = content.y + i * bandH + gap / 2;\r\n const bottom = content.y + (i + 1) * bandH - gap / 2;\r\n const topHalf = widthOf(s.value) / 2;\r\n const nextValue = i < n - 1 ? stages[i + 1].value : s.value;\r\n const botHalf = widthOf(nextValue) / 2;\r\n bands.push({ top, bottom, topHalf, botHalf });\r\n\r\n const pts: Point[] = [\r\n { x: cx - topHalf, y: top },\r\n { x: cx + topHalf, y: top },\r\n { x: cx + botHalf, y: bottom },\r\n { x: cx - botHalf, y: bottom },\r\n ];\r\n\r\n ctx.globalAlpha = alphaOf(s);\r\n if (pen) {\r\n pen.polygon(pts, { fill: s.color, stroke: s.color });\r\n } else {\r\n ctx.beginPath();\r\n ctx.moveTo(pts[0].x, pts[0].y);\r\n for (let k = 1; k < pts.length; k++) ctx.lineTo(pts[k].x, pts[k].y);\r\n ctx.closePath();\r\n ctx.fillStyle = s.color;\r\n ctx.fill();\r\n }\r\n ctx.globalAlpha = 1;\r\n }\r\n ctx.restore();\r\n\r\n const halfAtY = (band: { top: number; bottom: number; topHalf: number; botHalf: number }, y: number): number => {\r\n const t = band.bottom === band.top ? 0 : (y - band.top) / (band.bottom - band.top);\r\n return band.topHalf + (band.botHalf - band.topHalf) * t;\r\n };\r\n\r\n if (showLabels) {\r\n for (let i = 0; i < n; i++) {\r\n const s = stages[i];\r\n const band = bands[i];\r\n const midY = (band.top + band.bottom) / 2;\r\n const dim = alphaOf(s) !== 1;\r\n\r\n // Stage name + value in the left gutter.\r\n addOverlayText(surface, tokens, {\r\n left: content.x,\r\n top: midY - tokens.font.size.small,\r\n text: s.label,\r\n color: tokens.color.text,\r\n size: tokens.font.size.small,\r\n weight: tokens.font.weight.bold,\r\n opacity: dim ? 0.5 : 1,\r\n });\r\n addOverlayText(surface, tokens, {\r\n left: content.x,\r\n top: midY + 2,\r\n text: formatValue(s.value, valueFormat),\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.tiny,\r\n opacity: dim ? 0.5 : 1,\r\n });\r\n\r\n // Retained % in a themed pill so it reads identically on every fill. When\r\n // the pill is wider than the segment at this row, place it just outside to\r\n // the right instead of letting the text spill over the narrow band.\r\n const pct = pctOf(i);\r\n const pctText = `${Math.round(pct * 100)}%`;\r\n const padX = 7;\r\n const badgeW = Math.ceil(measureText(pctText, labelFont).width) + padX * 2 + 2;\r\n const innerHalf = halfAtY(band, midY);\r\n const fitsInside = badgeW + 8 <= innerHalf * 2;\r\n let badgeLeft = cx;\r\n let badgeTransform = 'translate(-50%,-50%)';\r\n if (!fitsInside) {\r\n badgeLeft = cx + innerHalf + 6;\r\n const maxLeft = content.x + content.width - badgeW;\r\n if (badgeLeft > maxLeft) badgeLeft = maxLeft;\r\n badgeTransform = 'translate(0,-50%)';\r\n }\r\n addOverlayText(surface, tokens, {\r\n left: badgeLeft,\r\n top: midY,\r\n text: pctText,\r\n color: tokens.color.text,\r\n size: tokens.font.size.small,\r\n weight: tokens.font.weight.bold,\r\n opacity: dim ? 0.55 : 1,\r\n transform: badgeTransform,\r\n pill: { background: tokens.color.surface, border: tokens.color.border, padX },\r\n });\r\n }\r\n }\r\n\r\n const measureLabel = funnel.encoding.value.title ?? funnel.encoding.value.field;\r\n const hitIndex = (px: number, py: number): number => {\r\n for (let i = 0; i < n; i++) {\r\n const b = bands[i];\r\n if (py < b.top || py > b.bottom) continue;\r\n if (Math.abs(px - cx) <= halfAtY(b, py)) return i;\r\n }\r\n return -1;\r\n };\r\n\r\n return {\r\n region: { x: content.x, y: content.y, width: content.width, height: content.height },\r\n hitTest: (px, py) => {\r\n const i = hitIndex(px, py);\r\n if (i < 0) return null;\r\n const s = stages[i];\r\n return {\r\n key: s.key,\r\n anchorX: px,\r\n anchorY: py,\r\n content: {\r\n title: s.label,\r\n rows: [\r\n { swatch: s.color, label: measureLabel, value: formatValue(s.value, valueFormat) },\r\n { label: mode === 'previous' ? 'vs previous' : 'vs first', value: `${(pctOf(i) * 100).toFixed(1)}%`, muted: true },\r\n ],\r\n },\r\n };\r\n },\r\n pick: (px, py) => {\r\n const i = hitIndex(px, py);\r\n if (i < 0) return null;\r\n return { kind: 'point', fields: [stageField], tuples: [[stages[i].category]] };\r\n },\r\n };\r\n}\r\n","import { formatNumber, formatValue } from '../format';\r\nimport { aggregateValues } from '../pivot';\r\nimport type { Surface } from '../render/surface';\r\nimport { getDevicePixelRatio } from '../render/env';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch, type ResolvedSketch } from '../spec/sketch';\r\nimport type { ChartSpec, KpiSpec, ValueRef } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Datum, Point, Rect, Size } from '../types';\r\nimport { accessor, toNumber } from '../util/data';\r\nimport { CHROME_PAD, drawTitleBlock } from './chrome';\r\nimport type { RenderContext } from './index';\r\n\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\n/** A wobbly, asymmetric border-radius that reads as a hand-drawn card outline. */\r\nconst SKETCH_BORDER_RADIUS = '255px 15px 225px 15px / 15px 225px 15px 255px';\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\nfunction resolveValue(ref: ValueRef | undefined, data: readonly Datum[]): number | null {\r\n if (ref == null) return null;\r\n if (typeof ref === 'number') return Number.isFinite(ref) ? ref : null;\r\n const read = accessor(ref.field);\r\n return aggregateValues(\r\n data.map((d) => read(d)),\r\n ref.aggregate ?? 'sum',\r\n );\r\n}\r\n\r\nfunction valueField(ref: ValueRef): string | null {\r\n return typeof ref === 'number' ? null : ref.field;\r\n}\r\n\r\nfunction formatDelta(delta: number, specFormat?: string): string {\r\n const sign = delta >= 0 ? '+' : '-';\r\n const abs = Math.abs(delta);\r\n if (abs <= 1) return sign + formatNumber(abs, '.1%');\r\n if (specFormat) return sign + formatValue(abs, specFormat);\r\n return sign + formatNumber(abs, ',.0f');\r\n}\r\n\r\nfunction cardRectFor(surface: Surface, tokens: ThemeTokens, size: Size, spec: KpiSpec): Rect {\r\n if (spec.title) return drawTitleBlock(surface, tokens, size, spec.title);\r\n return {\r\n x: CHROME_PAD.left,\r\n y: CHROME_PAD.top,\r\n width: Math.max(0, size.width - CHROME_PAD.left - CHROME_PAD.right),\r\n height: Math.max(0, size.height - CHROME_PAD.top - CHROME_PAD.bottom),\r\n };\r\n}\r\n\r\nfunction createCard(tokens: ThemeTokens, rect: Rect, hasSparkline: boolean, framed = false): HTMLDivElement {\r\n const card = document.createElement('div');\r\n const pad = tokens.spacing.lg;\r\n const sparkReserve = hasSparkline ? Math.min(44, Math.max(28, rect.height * 0.18)) + tokens.spacing.sm : 0;\r\n card.style.position = 'absolute';\r\n card.style.left = `${rect.x}px`;\r\n card.style.top = `${rect.y}px`;\r\n card.style.width = `${rect.width}px`;\r\n card.style.height = `${rect.height}px`;\r\n card.style.boxSizing = 'border-box';\r\n // When framed (e.g. inside a dashboard cell) the host already draws the card,\r\n // so render flat to avoid a doubled border/background.\r\n card.style.background = framed ? 'transparent' : tokens.color.surface;\r\n card.style.border = framed ? 'none' : `1px solid ${tokens.color.border}`;\r\n card.style.borderRadius = `${tokens.radius.lg}px`;\r\n card.style.padding = framed ? `0 0 ${sparkReserve}px` : `${pad}px ${pad}px ${pad + sparkReserve}px`;\r\n card.style.display = 'flex';\r\n card.style.flexDirection = 'column';\r\n card.style.justifyContent = 'center';\r\n card.style.alignItems = 'flex-start';\r\n card.style.gap = `${tokens.spacing.sm}px`;\r\n card.style.overflow = 'hidden';\r\n card.style.pointerEvents = 'none';\r\n return card;\r\n}\r\n\r\nfunction addText(card: HTMLDivElement, text: string, style: Partial<CSSStyleDeclaration>): HTMLDivElement {\r\n const el = document.createElement('div');\r\n el.textContent = text;\r\n Object.assign(el.style, style);\r\n card.appendChild(el);\r\n return el;\r\n}\r\n\r\nfunction sparklineField(spec: KpiSpec): string | null {\r\n if (!spec.sparkline) return null;\r\n if (typeof spec.sparkline === 'object') return spec.sparkline.field;\r\n return valueField(spec.value);\r\n}\r\n\r\nfunction sparklineValues(data: readonly Datum[], field: string): number[] {\r\n const read = accessor(field);\r\n const values: number[] = [];\r\n for (const d of data) {\r\n const n = toNumber(read(d));\r\n if (!Number.isNaN(n) && Number.isFinite(n)) values.push(n);\r\n }\r\n return values;\r\n}\r\n\r\nfunction buildSparkline(\r\n tokens: ThemeTokens,\r\n width: number,\r\n height: number,\r\n values: readonly number[],\r\n): SVGSVGElement | null {\r\n if (values.length === 0 || width <= 0 || height <= 0) return null;\r\n\r\n const svg = document.createElementNS(SVG_NS, 'svg');\r\n svg.setAttribute('width', String(width));\r\n svg.setAttribute('height', String(height));\r\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\r\n svg.setAttribute('preserveAspectRatio', 'none');\r\n svg.style.display = 'block';\r\n svg.style.overflow = 'visible';\r\n\r\n const stroke = 1.75;\r\n const pad = stroke;\r\n const innerH = Math.max(1, height - pad * 2);\r\n const n = values.length;\r\n const min = Math.min(...values);\r\n const max = Math.max(...values);\r\n const span = max - min;\r\n const xAt = (i: number): number => (n === 1 ? width / 2 : (i / (n - 1)) * width);\r\n const yAt = (v: number): number => {\r\n const t = span === 0 ? 0.5 : (v - min) / span;\r\n return pad + (1 - t) * innerH;\r\n };\r\n\r\n if (n === 1) {\r\n const dot = document.createElementNS(SVG_NS, 'circle');\r\n dot.setAttribute('cx', String(width / 2));\r\n dot.setAttribute('cy', String(yAt(values[0] as number)));\r\n dot.setAttribute('r', '2.25');\r\n dot.setAttribute('fill', tokens.color.accent);\r\n svg.appendChild(dot);\r\n return svg;\r\n }\r\n\r\n let lineD = '';\r\n for (let i = 0; i < n; i++) {\r\n lineD += `${i === 0 ? 'M' : 'L'}${xAt(i).toFixed(2)} ${yAt(values[i] as number).toFixed(2)}`;\r\n }\r\n const areaD = `${lineD}L${width.toFixed(2)} ${height}L0 ${height}Z`;\r\n\r\n const gradId = `graphein-spark-${Math.random().toString(36).slice(2, 9)}`;\r\n const defs = document.createElementNS(SVG_NS, 'defs');\r\n const grad = document.createElementNS(SVG_NS, 'linearGradient');\r\n grad.setAttribute('id', gradId);\r\n grad.setAttribute('x1', '0');\r\n grad.setAttribute('y1', '0');\r\n grad.setAttribute('x2', '0');\r\n grad.setAttribute('y2', '1');\r\n const stopTop = document.createElementNS(SVG_NS, 'stop');\r\n stopTop.setAttribute('offset', '0');\r\n stopTop.setAttribute('stop-color', tokens.color.accent);\r\n stopTop.setAttribute('stop-opacity', '0.24');\r\n const stopBottom = document.createElementNS(SVG_NS, 'stop');\r\n stopBottom.setAttribute('offset', '1');\r\n stopBottom.setAttribute('stop-color', tokens.color.accent);\r\n stopBottom.setAttribute('stop-opacity', '0');\r\n grad.appendChild(stopTop);\r\n grad.appendChild(stopBottom);\r\n defs.appendChild(grad);\r\n svg.appendChild(defs);\r\n\r\n const area = document.createElementNS(SVG_NS, 'path');\r\n area.setAttribute('d', areaD);\r\n area.setAttribute('fill', `url(#${gradId})`);\r\n svg.appendChild(area);\r\n\r\n const path = document.createElementNS(SVG_NS, 'path');\r\n path.setAttribute('d', lineD);\r\n path.setAttribute('fill', 'none');\r\n path.setAttribute('stroke', tokens.color.accent);\r\n path.setAttribute('stroke-width', String(stroke));\r\n path.setAttribute('stroke-linejoin', 'round');\r\n path.setAttribute('stroke-linecap', 'round');\r\n svg.appendChild(path);\r\n\r\n return svg;\r\n}\r\n\r\n/** Hand-drawn sparkline: the same geometry rendered through the rough engine. */\r\nfunction buildSparklineCanvas(\r\n tokens: ThemeTokens,\r\n width: number,\r\n height: number,\r\n values: readonly number[],\r\n sketch: ResolvedSketch,\r\n): HTMLCanvasElement | null {\r\n if (values.length === 0 || width <= 0 || height <= 0) return null;\r\n\r\n const dpr = getDevicePixelRatio();\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(width * dpr));\r\n canvas.height = Math.max(1, Math.round(height * dpr));\r\n canvas.style.width = `${width}px`;\r\n canvas.style.height = `${height}px`;\r\n canvas.style.display = 'block';\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return null;\r\n ctx.scale(dpr, dpr);\r\n\r\n const stroke = 1.75;\r\n const pad = stroke;\r\n const innerH = Math.max(1, height - pad * 2);\r\n const n = values.length;\r\n const min = Math.min(...values);\r\n const max = Math.max(...values);\r\n const span = max - min;\r\n const xAt = (i: number): number => (n === 1 ? width / 2 : (i / (n - 1)) * width);\r\n const yAt = (v: number): number => pad + (1 - (span === 0 ? 0.5 : (v - min) / span)) * innerH;\r\n\r\n const pen = new RoughPen(ctx, sketch);\r\n if (n === 1) {\r\n pen.circle(width / 2, yAt(values[0] as number), 2.5, { fill: tokens.color.accent });\r\n return canvas;\r\n }\r\n const points: Point[] = values.map((v, i) => ({ x: xAt(i), y: yAt(v) }));\r\n pen.trendStroke(points, { stroke: tokens.color.accent, strokeWidth: stroke });\r\n return canvas;\r\n}\r\n\r\nexport function drawKpi(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const kpi = spec as KpiSpec;\r\n const data = kpi.data ?? [];\r\n const value = resolveValue(kpi.value, data);\r\n const delta = resolveValue(kpi.delta, data);\r\n const sparkField = sparklineField(kpi);\r\n const sparkValues = sparkField ? sparklineValues(data, sparkField) : [];\r\n const hasSparkline = sparkValues.length > 0;\r\n const sketch = resolveSketch(spec);\r\n const framed = context?.framed === true;\r\n const rect = cardRectFor(surface, tokens, size, kpi);\r\n const card = createCard(tokens, rect, hasSparkline, framed);\r\n if (sketch) card.style.borderRadius = SKETCH_BORDER_RADIUS;\r\n\r\n if (kpi.label) {\r\n addText(card, kpi.label, {\r\n color: tokens.color.textMuted,\r\n fontFamily: tokens.font.family,\r\n fontSize: `${tokens.font.size.base}px`,\r\n fontWeight: String(tokens.font.weight.medium),\r\n letterSpacing: '0.04em',\r\n lineHeight: '1.25',\r\n textTransform: 'uppercase',\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n });\r\n }\r\n\r\n const valueText = value == null ? '—' : formatValue(value, kpi.format);\r\n const contentWidth = Math.max(1, rect.width - tokens.spacing.lg * 2);\r\n const sizeByCard = Math.min(rect.width, rect.height) * 0.22;\r\n const sizeByText = contentWidth / Math.max(1, valueText.length * 0.58);\r\n const valueSize = clamp(Math.min(sizeByCard, sizeByText), 28, 64);\r\n addText(card, valueText, {\r\n color: tokens.color.text,\r\n fontFamily: tokens.font.family,\r\n fontSize: `${valueSize}px`,\r\n fontWeight: String(tokens.font.weight.bold),\r\n letterSpacing: '-0.03em',\r\n lineHeight: '1.02',\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n });\r\n\r\n if (delta != null) {\r\n const positive = delta >= 0;\r\n addText(card, `${positive ? '▲' : '▼'} ${formatDelta(delta, kpi.format)}`, {\r\n color: positive ? tokens.color.positive : tokens.color.negative,\r\n fontFamily: tokens.font.family,\r\n fontSize: `${tokens.font.size.large}px`,\r\n fontWeight: String(tokens.font.weight.medium),\r\n lineHeight: '1',\r\n whiteSpace: 'nowrap',\r\n });\r\n }\r\n\r\n surface.overlay.appendChild(card);\r\n if (hasSparkline) {\r\n const pad = framed ? 0 : tokens.spacing.lg;\r\n const sparkH = clamp(rect.height * 0.18, 24, 40);\r\n const sparkW = Math.max(0, rect.width - pad * 2);\r\n const node = sketch\r\n ? buildSparklineCanvas(tokens, sparkW, sparkH, sparkValues, sketch)\r\n : buildSparkline(tokens, sparkW, sparkH, sparkValues);\r\n if (node) {\r\n node.style.position = 'absolute';\r\n node.style.left = `${pad}px`;\r\n node.style.bottom = `${pad}px`;\r\n card.appendChild(node);\r\n }\r\n }\r\n}\r\n","import { ordinalColorScale, rgbaToCss, withAlpha } from '../color';\r\nimport { formatValue } from '../format';\r\nimport type { Surface } from '../render/surface';\r\nimport { fontString, measureText } from '../render/text';\r\nimport { roundedRect } from '../shape';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { ChartSpec, SankeySpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Rect, Size } from '../types';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport type { InteractionModel, TooltipRow } from '../interaction/types';\r\nimport { addOverlayText, drawTitleBlock } from './chrome';\r\n\r\ninterface SNode {\r\n name: string;\r\n index: number;\r\n layer: number;\r\n value: number;\r\n x0: number;\r\n x1: number;\r\n y0: number;\r\n y1: number;\r\n color: string;\r\n sourceLinks: SLink[];\r\n targetLinks: SLink[];\r\n}\r\n\r\ninterface SLink {\r\n source: SNode;\r\n target: SNode;\r\n value: number;\r\n width: number;\r\n sy: number;\r\n ty: number;\r\n}\r\n\r\ninterface Graph {\r\n nodes: SNode[];\r\n links: SLink[];\r\n columns: SNode[][];\r\n maxLayer: number;\r\n}\r\n\r\nconst center = (n: SNode): number => (n.y0 + n.y1) / 2;\r\n\r\nfunction buildGraph(spec: SankeySpec, palette: string[]): Graph {\r\n const readS = accessor(spec.encoding.source.field);\r\n const readT = accessor(spec.encoding.target.field);\r\n const readV = accessor(spec.encoding.value.field);\r\n const nodeByName = new Map<string, SNode>();\r\n const order: SNode[] = [];\r\n const scale = ordinalColorScale({ palette });\r\n\r\n const ensure = (name: string): SNode => {\r\n let n = nodeByName.get(name);\r\n if (!n) {\r\n n = {\r\n name,\r\n index: order.length,\r\n layer: 0,\r\n value: 0,\r\n x0: 0,\r\n x1: 0,\r\n y0: 0,\r\n y1: 0,\r\n color: rgbaToCss(scale.map(name)),\r\n sourceLinks: [],\r\n targetLinks: [],\r\n };\r\n nodeByName.set(name, n);\r\n order.push(n);\r\n }\r\n return n;\r\n };\r\n\r\n const links: SLink[] = [];\r\n for (const row of spec.data ?? []) {\r\n const sName = toKey(readS(row));\r\n const tName = toKey(readT(row));\r\n const value = toNumber(readV(row));\r\n if (sName === '' || tName === '' || sName === tName || !Number.isFinite(value) || value <= 0) {\r\n continue;\r\n }\r\n const source = ensure(sName);\r\n const target = ensure(tName);\r\n const link: SLink = { source, target, value, width: 0, sy: 0, ty: 0 };\r\n source.sourceLinks.push(link);\r\n target.targetLinks.push(link);\r\n links.push(link);\r\n }\r\n\r\n for (const n of order) {\r\n const out = n.sourceLinks.reduce((s, l) => s + l.value, 0);\r\n const inc = n.targetLinks.reduce((s, l) => s + l.value, 0);\r\n n.value = Math.max(out, inc);\r\n }\r\n\r\n assignLayers(order);\r\n const maxLayer = order.reduce((m, n) => Math.max(m, n.layer), 0);\r\n const columns: SNode[][] = Array.from({ length: maxLayer + 1 }, () => []);\r\n for (const n of order) columns[n.layer].push(n);\r\n\r\n return { nodes: order, links, columns, maxLayer };\r\n}\r\n\r\n/** Longest-path layering via Kahn topological order; sinks pushed to the last column. */\r\nfunction assignLayers(nodes: SNode[]): void {\r\n const indeg = new Map<SNode, number>();\r\n for (const n of nodes) indeg.set(n, n.targetLinks.length);\r\n const queue = nodes.filter((n) => (indeg.get(n) ?? 0) === 0);\r\n const seen = new Set<SNode>();\r\n while (queue.length) {\r\n const n = queue.shift()!;\r\n seen.add(n);\r\n for (const l of n.sourceLinks) {\r\n const t = l.target;\r\n if (t.layer < n.layer + 1) t.layer = n.layer + 1;\r\n const d = (indeg.get(t) ?? 0) - 1;\r\n indeg.set(t, d);\r\n if (d === 0) queue.push(t);\r\n }\r\n }\r\n const maxLayer = nodes.reduce((m, n) => Math.max(m, n.layer), 0);\r\n // Right-align pure sinks so terminal nodes line up on the right edge.\r\n for (const n of nodes) {\r\n if (n.sourceLinks.length === 0 && n.targetLinks.length > 0) n.layer = maxLayer;\r\n }\r\n}\r\n\r\nfunction layout(graph: Graph, area: Rect, nodeWidth: number, pad: number): void {\r\n const { columns, links, maxLayer } = graph;\r\n const kx = maxLayer > 0 ? (area.width - nodeWidth) / maxLayer : 0;\r\n for (const col of columns) {\r\n for (const n of col) {\r\n n.x0 = area.x + n.layer * kx;\r\n n.x1 = n.x0 + nodeWidth;\r\n }\r\n }\r\n\r\n let ky = Infinity;\r\n for (const col of columns) {\r\n if (col.length === 0) continue;\r\n const sum = col.reduce((s, n) => s + n.value, 0);\r\n const avail = area.height - (col.length - 1) * pad;\r\n if (sum > 0 && avail > 0) ky = Math.min(ky, avail / sum);\r\n }\r\n if (!Number.isFinite(ky) || ky <= 0) ky = 1;\r\n\r\n for (const col of columns) {\r\n let y = area.y;\r\n for (const n of col) {\r\n n.y0 = y;\r\n n.y1 = y + Math.max(1, n.value * ky);\r\n y = n.y1 + pad;\r\n }\r\n centerColumn(col, area);\r\n }\r\n for (const l of links) l.width = Math.max(1, l.value * ky);\r\n\r\n for (let i = 0; i < 6; i += 1) {\r\n const alpha = Math.pow(0.97, i);\r\n relax(columns, true, alpha);\r\n resolveAll(columns, area, pad);\r\n relax(columns, false, alpha);\r\n resolveAll(columns, area, pad);\r\n }\r\n computeLinkBreadths(graph);\r\n}\r\n\r\nfunction centerColumn(col: SNode[], area: Rect): void {\r\n if (col.length === 0) return;\r\n const extent = col[col.length - 1].y1 - col[0].y0;\r\n const dy = area.y + (area.height - extent) / 2 - col[0].y0;\r\n if (Math.abs(dy) < 0.01) return;\r\n for (const n of col) {\r\n n.y0 += dy;\r\n n.y1 += dy;\r\n }\r\n}\r\n\r\nfunction relax(columns: SNode[][], leftToRight: boolean, alpha: number): void {\r\n const seq = leftToRight ? columns : [...columns].reverse();\r\n for (const col of seq) {\r\n for (const n of col) {\r\n const linkSet = leftToRight ? n.targetLinks : n.sourceLinks;\r\n let w = 0;\r\n let sum = 0;\r\n for (const l of linkSet) {\r\n const other = leftToRight ? l.source : l.target;\r\n sum += center(other) * l.value;\r\n w += l.value;\r\n }\r\n if (w <= 0) continue;\r\n const dy = (sum / w - center(n)) * alpha;\r\n n.y0 += dy;\r\n n.y1 += dy;\r\n }\r\n }\r\n}\r\n\r\nfunction resolveAll(columns: SNode[][], area: Rect, pad: number): void {\r\n for (const col of columns) resolveCollisions(col, area, pad);\r\n}\r\n\r\nfunction resolveCollisions(col: SNode[], area: Rect, pad: number): void {\r\n col.sort((a, b) => a.y0 - b.y0);\r\n let y = area.y;\r\n for (const n of col) {\r\n const dy = y - n.y0;\r\n if (dy > 0) {\r\n n.y0 += dy;\r\n n.y1 += dy;\r\n }\r\n y = n.y1 + pad;\r\n }\r\n y = area.y + area.height;\r\n for (let i = col.length - 1; i >= 0; i -= 1) {\r\n const n = col[i];\r\n const dy = n.y1 - y;\r\n if (dy > 0) {\r\n n.y0 -= dy;\r\n n.y1 -= dy;\r\n }\r\n y = n.y0 - pad;\r\n }\r\n}\r\n\r\nfunction computeLinkBreadths(graph: Graph): void {\r\n for (const n of graph.nodes) {\r\n n.sourceLinks.sort((a, b) => center(a.target) - center(b.target));\r\n n.targetLinks.sort((a, b) => center(a.source) - center(b.source));\r\n let sy = n.y0;\r\n for (const l of n.sourceLinks) {\r\n l.sy = sy + l.width / 2;\r\n sy += l.width;\r\n }\r\n let ty = n.y0;\r\n for (const l of n.targetLinks) {\r\n l.ty = ty + l.width / 2;\r\n ty += l.width;\r\n }\r\n }\r\n}\r\n\r\nfunction strokeLink(ctx: CanvasRenderingContext2D, l: SLink, color: string): void {\r\n const x0 = l.source.x1;\r\n const x1 = l.target.x0;\r\n const xm = (x0 + x1) / 2;\r\n ctx.lineWidth = l.width;\r\n ctx.strokeStyle = color;\r\n ctx.beginPath();\r\n ctx.moveTo(x0, l.sy);\r\n ctx.bezierCurveTo(xm, l.sy, xm, l.ty, x1, l.ty);\r\n ctx.stroke();\r\n}\r\n\r\nexport function drawSankey(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n): InteractionModel | void {\r\n const sankey = spec as SankeySpec;\r\n const content = drawTitleBlock(surface, tokens, size, sankey.title);\r\n const f = tokens.font;\r\n const graph = buildGraph(sankey, tokens.color.palette);\r\n if (graph.nodes.length === 0 || content.width <= 0 || content.height <= 0) return;\r\n\r\n const labelFont = fontString(f.size.small, f.family, f.weight.medium);\r\n let maxLabel = 0;\r\n for (const n of graph.nodes) maxLabel = Math.max(maxLabel, measureText(n.name, labelFont).width);\r\n const gutter = Math.min(maxLabel + 12, content.width * 0.24);\r\n const nodeWidth = sankey.nodeWidth ?? 16;\r\n const pad = sankey.nodePadding ?? 14;\r\n const area: Rect = {\r\n x: content.x + gutter,\r\n y: content.y + 4,\r\n width: Math.max(10, content.width - gutter * 2),\r\n height: Math.max(10, content.height - 8),\r\n };\r\n\r\n layout(graph, area, nodeWidth, pad);\r\n\r\n const ctx = surface.marks.ctx;\r\n ctx.save();\r\n ctx.lineCap = 'butt';\r\n\r\n // Links first (widest underneath), colored by source node.\r\n const sorted = [...graph.links].sort((a, b) => b.width - a.width);\r\n for (const l of sorted) strokeLink(ctx, l, withAlpha(l.source.color, 0.4));\r\n\r\n // Nodes.\r\n const radius = Math.min(3, tokens.radius.sm);\r\n const sketch = resolveSketch(spec);\r\n const pen = sketch ? new RoughPen(ctx, sketch) : null;\r\n for (const n of graph.nodes) {\r\n const h = Math.max(1, n.y1 - n.y0);\r\n if (pen) {\r\n pen.rect(n.x0, n.y0, nodeWidth, h, { fill: n.color, fillStyle: 'solid' });\r\n } else {\r\n ctx.fillStyle = n.color;\r\n ctx.beginPath();\r\n roundedRect(ctx, n.x0, n.y0, nodeWidth, h, Math.min(radius, h / 2));\r\n ctx.fill();\r\n }\r\n }\r\n ctx.restore();\r\n\r\n // Labels (in the gutter on the side with more room).\r\n const showValues = sankey.nodeValues !== false;\r\n const mid = area.x + area.width / 2;\r\n for (const n of graph.nodes) {\r\n const labelRight = n.x0 < mid;\r\n const cy = center(n);\r\n const left = labelRight ? n.x1 + 6 : n.x0 - 6;\r\n const transform = labelRight ? 'translateY(-50%)' : 'translate(-100%,-50%)';\r\n addOverlayText(surface, tokens, {\r\n left,\r\n top: showValues ? cy - f.size.small * 0.62 : cy,\r\n text: n.name,\r\n color: tokens.color.text,\r\n size: f.size.small,\r\n weight: f.weight.medium,\r\n transform,\r\n });\r\n if (showValues) {\r\n addOverlayText(surface, tokens, {\r\n left,\r\n top: cy + f.size.small * 0.62,\r\n text: formatValue(n.value, sankey.encoding.value.format),\r\n color: tokens.color.textMuted,\r\n size: f.size.tiny,\r\n transform,\r\n });\r\n }\r\n }\r\n\r\n const tt = sankey.tooltip;\r\n if (tt === false || (tt && typeof tt === 'object' && tt.show === false)) return;\r\n\r\n const valueLabel = sankey.encoding.value.title ?? sankey.encoding.value.field;\r\n return {\r\n region: content,\r\n hitTest: (px, py) => {\r\n const n = graph.nodes.find(\r\n (node) => px >= node.x0 - 1 && px <= node.x1 + 1 && py >= node.y0 && py <= node.y1,\r\n );\r\n if (!n) return null;\r\n const out = n.sourceLinks.reduce((s, l) => s + l.value, 0);\r\n const inc = n.targetLinks.reduce((s, l) => s + l.value, 0);\r\n const rows: TooltipRow[] = [\r\n { swatch: n.color, label: valueLabel, value: formatValue(n.value, sankey.encoding.value.format) },\r\n ];\r\n if (inc > 0) rows.push({ label: 'In', value: formatValue(inc, sankey.encoding.value.format), muted: true });\r\n if (out > 0) rows.push({ label: 'Out', value: formatValue(out, sankey.encoding.value.format), muted: true });\r\n return {\r\n key: n.name,\r\n anchorX: (n.x0 + n.x1) / 2,\r\n anchorY: center(n),\r\n content: { title: n.name, rows },\r\n draw: (ictx) => {\r\n ictx.save();\r\n ictx.lineCap = 'butt';\r\n for (const l of [...n.sourceLinks, ...n.targetLinks]) {\r\n strokeLink(ictx, l, withAlpha(l.source.color, 0.72));\r\n }\r\n const h = Math.max(1, n.y1 - n.y0);\r\n ictx.fillStyle = n.color;\r\n ictx.beginPath();\r\n roundedRect(ictx, n.x0, n.y0, n.x1 - n.x0, h, Math.min(3, h / 2));\r\n ictx.fill();\r\n ictx.restore();\r\n },\r\n };\r\n },\r\n };\r\n}\r\n","import { rgbaToCss, sequential, sequentialColorScale, withAlpha } from '../color';\r\nimport { formatValue } from '../format';\r\nimport type { Surface } from '../render/surface';\r\nimport { RoughPen } from '../rough';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type {\r\n ChartSpec,\r\n ChoroplethSpec,\r\n GeoFeature,\r\n GeoPosition,\r\n MapProjection,\r\n} from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Rect, Size } from '../types';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport type { InteractionModel } from '../interaction/types';\r\nimport { addOverlayText, drawTitleBlock } from './chrome';\r\n\r\ntype Ring = GeoPosition[];\r\n\r\ninterface ProjectedFeature {\r\n key: string;\r\n name: string;\r\n value: number | null;\r\n /** Polygons in projected (pre-fit) space; each polygon is a list of rings. */\r\n polys: Ring[][];\r\n}\r\n\r\ninterface ScreenFeature {\r\n key: string;\r\n name: string;\r\n value: number | null;\r\n color: string;\r\n /** Polygons in screen space; each polygon is a list of rings of [x, y]. */\r\n polys: number[][][][];\r\n cx: number;\r\n cy: number;\r\n}\r\n\r\nconst clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v);\r\n\r\n/**\r\n * Pick a central meridian so geometry that straddles the ±180° antimeridian\r\n * (e.g. Alaska's Aleutian islands) doesn't blow the longitude span out to ~360°.\r\n * We find the widest empty longitude gap and center the map on its antipode.\r\n */\r\nfunction centralMeridian(features: GeoFeature[]): number {\r\n const lons: number[] = [];\r\n for (const feature of features) {\r\n for (const polygon of polygonsOf(feature)) {\r\n for (const ring of polygon) {\r\n for (const pos of ring) {\r\n if (Number.isFinite(pos[0])) lons.push(pos[0]);\r\n }\r\n }\r\n }\r\n }\r\n if (lons.length === 0) return 0;\r\n lons.sort((a, b) => a - b);\r\n // Widest gap, including the wrap-around from the last point back to the first.\r\n let gapStart = lons[lons.length - 1];\r\n let gapEnd = lons[0] + 360;\r\n let maxGap = gapEnd - gapStart;\r\n for (let i = 1; i < lons.length; i += 1) {\r\n const g = lons[i] - lons[i - 1];\r\n if (g > maxGap) {\r\n maxGap = g;\r\n gapStart = lons[i - 1];\r\n gapEnd = lons[i];\r\n }\r\n }\r\n // Data is centered opposite the empty gap.\r\n return (gapStart + gapEnd) / 2 + 180;\r\n}\r\n\r\nfunction projector(kind: MapProjection, lon0: number): (pos: GeoPosition) => [number, number] {\r\n if (kind === 'identity') {\r\n return ([x, y]) => [x, y];\r\n }\r\n const wrapLon = (lon: number): number => {\r\n let d = lon - lon0;\r\n while (d > 180) d -= 360;\r\n while (d < -180) d += 360;\r\n return lon0 + d;\r\n };\r\n if (kind === 'equirectangular') {\r\n return ([lon, lat]) => [wrapLon(lon), lat];\r\n }\r\n // Web Mercator (north-up); latitude clamped to the standard cutoff.\r\n return ([lon, lat]) => {\r\n const phi = (clamp(lat, -85.0511, 85.0511) * Math.PI) / 180;\r\n return [wrapLon(lon), (Math.log(Math.tan(Math.PI / 4 + phi / 2)) * 180) / Math.PI];\r\n };\r\n}\r\n\r\nfunction featureKey(feature: GeoFeature, featureId: string | undefined): string {\r\n if (featureId) {\r\n if (featureId === 'id' && feature.id != null) return toKey(feature.id);\r\n const v = feature.properties?.[featureId];\r\n if (v != null) return toKey(v);\r\n }\r\n if (feature.id != null) return toKey(feature.id);\r\n const props = feature.properties ?? {};\r\n if (props.id != null) return toKey(props.id);\r\n if (props.name != null) return toKey(props.name);\r\n return '';\r\n}\r\n\r\nfunction featureName(feature: GeoFeature, key: string): string {\r\n const props = feature.properties ?? {};\r\n if (typeof props.name === 'string') return props.name;\r\n return key;\r\n}\r\n\r\nfunction polygonsOf(feature: GeoFeature): Ring[][] {\r\n const geom = feature.geometry;\r\n if (!geom) return [];\r\n if (geom.type === 'Polygon') return [geom.coordinates];\r\n if (geom.type === 'MultiPolygon') return geom.coordinates;\r\n return [];\r\n}\r\n\r\nfunction pointInRing(x: number, y: number, ring: number[][]): boolean {\r\n let inside = false;\r\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {\r\n const xi = ring[i][0];\r\n const yi = ring[i][1];\r\n const xj = ring[j][0];\r\n const yj = ring[j][1];\r\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n}\r\n\r\nfunction drawLegend(\r\n surface: Surface,\r\n tokens: ThemeTokens,\r\n legend: Rect,\r\n domain: [number, number],\r\n scheme: string,\r\n format: string | undefined,\r\n): void {\r\n if (legend.width <= 0 || legend.height <= 0) return;\r\n const ctx = surface.marks.ctx;\r\n const interp = sequential(scheme);\r\n const barWidth = Math.floor(clamp(legend.width * 0.5, 120, 240));\r\n const barHeight = 10;\r\n const barX = Math.round(legend.x + (legend.width - barWidth) / 2);\r\n const barY = Math.round(legend.y + 4);\r\n const same = domain[0] === domain[1];\r\n for (let i = 0; i < barWidth; i += 1) {\r\n const t = same ? 0.5 : i / (barWidth - 1);\r\n ctx.fillStyle = rgbaToCss(interp(t));\r\n ctx.fillRect(barX + i, barY, 1, barHeight);\r\n }\r\n ctx.strokeStyle = tokens.color.border;\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(barX + 0.5, barY + 0.5, Math.max(0, barWidth - 1), Math.max(0, barHeight - 1));\r\n const labelTop = barY + barHeight + 3;\r\n addOverlayText(surface, tokens, {\r\n left: barX,\r\n top: labelTop,\r\n text: formatValue(domain[0], format),\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n });\r\n addOverlayText(surface, tokens, {\r\n left: barX + barWidth,\r\n top: labelTop,\r\n text: formatValue(domain[1], format),\r\n color: tokens.color.textMuted,\r\n size: tokens.font.size.small,\r\n transform: 'translateX(-100%)',\r\n });\r\n}\r\n\r\nexport function drawChoropleth(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n): InteractionModel | void {\r\n const choropleth = spec as ChoroplethSpec;\r\n const content = drawTitleBlock(surface, tokens, size, choropleth.title);\r\n const features = choropleth.geo?.features ?? [];\r\n if (features.length === 0 || content.width <= 0 || content.height <= 0) return;\r\n\r\n // Join data rows to features by key.\r\n const readKey = accessor(choropleth.encoding.key.field);\r\n const readColor = accessor(choropleth.encoding.color.field);\r\n const valueByKey = new Map<string, number>();\r\n for (const row of choropleth.data ?? []) {\r\n const k = toKey(readKey(row));\r\n const v = toNumber(readColor(row));\r\n if (k !== '' && Number.isFinite(v)) valueByKey.set(k, v);\r\n }\r\n\r\n const projection = choropleth.projection ?? 'mercator';\r\n const project = projector(\r\n projection,\r\n projection === 'identity' ? 0 : centralMeridian(features),\r\n );\r\n const flipY = projection !== 'identity';\r\n const projected: ProjectedFeature[] = [];\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n let vMin = Infinity;\r\n let vMax = -Infinity;\r\n\r\n for (const feature of features) {\r\n const key = featureKey(feature, choropleth.featureId);\r\n const value = valueByKey.has(key) ? valueByKey.get(key)! : null;\r\n if (value != null) {\r\n if (value < vMin) vMin = value;\r\n if (value > vMax) vMax = value;\r\n }\r\n const polys: Ring[][] = [];\r\n for (const polygon of polygonsOf(feature)) {\r\n const rings: Ring[] = [];\r\n for (const ring of polygon) {\r\n const pr: Ring = [];\r\n for (const pos of ring) {\r\n const [x, y] = project(pos);\r\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue;\r\n if (x < minX) minX = x;\r\n if (x > maxX) maxX = x;\r\n if (y < minY) minY = y;\r\n if (y > maxY) maxY = y;\r\n pr.push([x, y]);\r\n }\r\n if (pr.length >= 3) rings.push(pr);\r\n }\r\n if (rings.length) polys.push(rings);\r\n }\r\n projected.push({ key, name: featureName(feature, key), value, polys });\r\n }\r\n\r\n const spanX = maxX - minX;\r\n const spanY = maxY - minY;\r\n if (!(spanX > 0) || !(spanY > 0)) return;\r\n\r\n const labelSize = tokens.font.size.small;\r\n const legendHeight = vMax >= vMin ? Math.ceil(labelSize + 26) : 0;\r\n const mapRect: Rect = {\r\n x: content.x,\r\n y: content.y,\r\n width: content.width,\r\n height: Math.max(10, content.height - legendHeight),\r\n };\r\n\r\n const scale = Math.min(mapRect.width / spanX, mapRect.height / spanY);\r\n const drawW = spanX * scale;\r\n const drawH = spanY * scale;\r\n const offsetX = mapRect.x + (mapRect.width - drawW) / 2;\r\n const offsetY = mapRect.y + (mapRect.height - drawH) / 2;\r\n const sx = (x: number): number => offsetX + (x - minX) * scale;\r\n const sy = (y: number): number =>\r\n flipY ? offsetY + (maxY - y) * scale : offsetY + (y - minY) * scale;\r\n\r\n const hasValues = vMax >= vMin;\r\n const domain: [number, number] = hasValues ? [vMin, vMax] : [0, 1];\r\n const cscale = sequentialColorScale({\r\n domain,\r\n interpolator: sequential(choropleth.scheme ?? 'teal'),\r\n });\r\n const noDataFill = withAlpha(tokens.color.textMuted, 0.14);\r\n\r\n const screen: ScreenFeature[] = projected.map((pf) => {\r\n let cx = 0;\r\n let cy = 0;\r\n let count = 0;\r\n const polys = pf.polys.map((polygon) =>\r\n polygon.map((ring) =>\r\n ring.map(([x, y]) => {\r\n const px = sx(x);\r\n const py = sy(y);\r\n cx += px;\r\n cy += py;\r\n count += 1;\r\n return [px, py];\r\n }),\r\n ),\r\n );\r\n return {\r\n key: pf.key,\r\n name: pf.name,\r\n value: pf.value,\r\n color: pf.value == null ? noDataFill : rgbaToCss(cscale.map(pf.value)),\r\n polys,\r\n cx: count ? cx / count : 0,\r\n cy: count ? cy / count : 0,\r\n };\r\n });\r\n\r\n const ctx = surface.marks.ctx;\r\n const sketch = resolveSketch(spec);\r\n const pen = sketch ? new RoughPen(ctx, sketch) : null;\r\n ctx.save();\r\n ctx.lineJoin = 'round';\r\n ctx.strokeStyle = tokens.color.background;\r\n ctx.lineWidth = 0.75;\r\n for (const f of screen) {\r\n ctx.fillStyle = f.color;\r\n for (const polygon of f.polys) {\r\n ctx.beginPath();\r\n for (const ring of polygon) {\r\n ring.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\r\n ctx.closePath();\r\n }\r\n ctx.fill('evenodd');\r\n if (!pen) ctx.stroke();\r\n }\r\n // Hand-drawn region outlines: the rough offset auto-scales with segment\r\n // length, so fine coastline detail stays crisp while broad borders wobble.\r\n if (pen) {\r\n for (const polygon of f.polys) {\r\n for (const ring of polygon) {\r\n pen.polygon(\r\n ring.map(([x, y]) => ({ x, y })),\r\n { stroke: tokens.color.background, strokeWidth: 0.75 },\r\n );\r\n }\r\n }\r\n }\r\n }\r\n ctx.restore();\r\n\r\n if (legendHeight > 0) {\r\n drawLegend(\r\n surface,\r\n tokens,\r\n { x: content.x, y: mapRect.y + mapRect.height + 4, width: content.width, height: legendHeight },\r\n domain,\r\n choropleth.scheme ?? 'teal',\r\n choropleth.encoding.color.format,\r\n );\r\n }\r\n\r\n const tt = choropleth.tooltip;\r\n if (tt === false || (tt && typeof tt === 'object' && tt.show === false)) return;\r\n\r\n const colorLabel = choropleth.encoding.color.title ?? choropleth.encoding.color.field;\r\n return {\r\n region: mapRect,\r\n hitTest: (px, py) => {\r\n for (const f of screen) {\r\n let inside = false;\r\n for (const polygon of f.polys) {\r\n if (polygon.length && pointInRing(px, py, polygon[0])) {\r\n inside = true;\r\n for (let i = 1; i < polygon.length; i += 1) {\r\n if (pointInRing(px, py, polygon[i])) inside = false;\r\n }\r\n if (inside) break;\r\n }\r\n }\r\n if (!inside) continue;\r\n return {\r\n key: f.key,\r\n anchorX: px,\r\n anchorY: py,\r\n content: {\r\n title: f.name,\r\n rows: [\r\n {\r\n swatch: f.color,\r\n label: colorLabel,\r\n value: f.value == null ? 'no data' : formatValue(f.value, choropleth.encoding.color.format),\r\n },\r\n ],\r\n },\r\n draw: (ictx) => {\r\n ictx.save();\r\n ictx.lineJoin = 'round';\r\n ictx.strokeStyle = tokens.color.text;\r\n ictx.lineWidth = 1.5;\r\n for (const polygon of f.polys) {\r\n ictx.beginPath();\r\n for (const ring of polygon) {\r\n ring.forEach(([x, y], i) => (i === 0 ? ictx.moveTo(x, y) : ictx.lineTo(x, y)));\r\n ictx.closePath();\r\n }\r\n ictx.stroke();\r\n }\r\n ictx.restore();\r\n },\r\n };\r\n }\r\n return null;\r\n },\r\n };\r\n}\r\n","import type { IconRule, ValueRule } from '../spec/types';\r\n\r\nexport type ConditionalTone = 'up' | 'mid' | 'down';\r\nexport type IconSetName = 'arrows' | 'triangles' | 'dots' | 'trafficLights';\r\n\r\nexport interface RuleStyle {\r\n background?: string;\r\n color?: string;\r\n weight?: 'bold' | 'normal';\r\n icon?: string;\r\n}\r\n\r\nexport interface SemanticIcon {\r\n icon: string;\r\n tone: ConditionalTone;\r\n}\r\n\r\nexport function evalRules(raw: number | null, rules: readonly ValueRule[]): RuleStyle;\r\nexport function evalRules(raw: number | string | null, rules: readonly ValueRule[]): RuleStyle {\r\n for (const rule of rules) {\r\n if (matchesRule(raw, rule)) {\r\n return {\r\n background: rule.background,\r\n color: rule.color,\r\n weight: rule.weight,\r\n icon: rule.icon,\r\n };\r\n }\r\n }\r\n return {};\r\n}\r\n\r\nexport function iconForValue(\r\n set: IconSetName = 'arrows',\r\n raw: number | null,\r\n domain: [number, number] | null,\r\n rules?: readonly IconRule[],\r\n): SemanticIcon | null {\r\n if (raw == null || !Number.isFinite(raw)) return null;\r\n\r\n if (rules && rules.length > 0) {\r\n const match = rules.find((rule) => matchesRule(raw, rule));\r\n if (!match) return null;\r\n return {\r\n icon: match.icon ?? glyphForTone(set, toneForValue(raw, domain)),\r\n tone: colorToTone(match.color) ?? toneForValue(raw, domain),\r\n };\r\n }\r\n\r\n return {\r\n icon: glyphForTone(set, toneForValue(raw, domain)),\r\n tone: toneForValue(raw, domain),\r\n };\r\n}\r\n\r\nexport function toneColor(tone: ConditionalTone, colors?: Partial<Record<ConditionalTone, string>>): string {\r\n if (colors?.[tone]) return colors[tone] as string;\r\n if (tone === 'up') return '#16a34a';\r\n if (tone === 'mid') return '#d97706';\r\n return '#dc2626';\r\n}\r\n\r\nfunction matchesRule(raw: number | string | null, rule: Pick<ValueRule, 'when' | 'value' | 'to'>): boolean {\r\n if (rule.when === 'eq' || rule.when === 'ne') {\r\n const match = String(raw) === String(rule.value);\r\n return rule.when === 'eq' ? match : !match;\r\n }\r\n const numericRaw = typeof raw === 'number' ? raw : Number(raw);\r\n if (!Number.isFinite(numericRaw)) return false;\r\n const value = Number(rule.value);\r\n if (!Number.isFinite(value)) return false;\r\n switch (rule.when) {\r\n case 'gt':\r\n return numericRaw > value;\r\n case 'gte':\r\n return numericRaw >= value;\r\n case 'lt':\r\n return numericRaw < value;\r\n case 'lte':\r\n return numericRaw <= value;\r\n case 'between': {\r\n const to = Number(rule.to);\r\n return Number.isFinite(to) && numericRaw >= Math.min(value, to) && numericRaw <= Math.max(value, to);\r\n }\r\n }\r\n}\r\n\r\nfunction toneForValue(raw: number, domain: [number, number] | null): ConditionalTone {\r\n if (!domain) return raw > 0 ? 'up' : raw < 0 ? 'down' : 'mid';\r\n const [min, max] = domain;\r\n if (max === min) return 'mid';\r\n const t = (raw - min) / (max - min);\r\n if (t < 1 / 3) return 'down';\r\n if (t < 2 / 3) return 'mid';\r\n return 'up';\r\n}\r\n\r\nfunction glyphForTone(set: IconSetName, tone: ConditionalTone): string {\r\n if (set === 'trafficLights' || set === 'dots') return '●';\r\n if (set === 'triangles') return tone === 'down' ? '▼' : '▲';\r\n if (tone === 'down') return '▼';\r\n if (tone === 'mid') return '▬';\r\n return '▲';\r\n}\r\n\r\nfunction colorToTone(color: string | undefined): ConditionalTone | null {\r\n if (!color) return null;\r\n const value = color.toLowerCase();\r\n if (value.includes('16a34a') || value.includes('green')) return 'up';\r\n if (value.includes('dc2626') || value.includes('red')) return 'down';\r\n if (value.includes('d97706') || value.includes('amber') || value.includes('orange')) return 'mid';\r\n return null;\r\n}\r\n","import type { ConditionalFormat } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { FieldType, Rect } from '../types';\r\nimport {\r\n diverging as divergingInterpolator,\r\n divergingColorScale,\r\n parseColor,\r\n readableTextColor,\r\n rgbaToCss,\r\n sequential,\r\n sequentialColorScale,\r\n} from '../color';\r\nimport { formatValue } from '../format';\r\nimport { evalRules, iconForValue, toneColor } from './condFormat';\r\n\r\nconst HEADER_ROW_HEIGHT = 32;\r\nconst MIN_COL_WIDTH = 72;\r\nconst DEFAULT_BODY_ROW_HEIGHT = 30;\r\n/** A wobbly, asymmetric border-radius that reads as a hand-drawn frame. */\r\nconst SKETCH_BORDER_RADIUS = '14px 6px 16px 7px / 7px 15px 6px 14px';\r\n\r\nexport interface ViewColumn {\r\n key: string;\r\n title: string;\r\n align: 'left' | 'center' | 'right';\r\n format?: string;\r\n type?: FieldType;\r\n width?: number;\r\n conditionalFormat?: ConditionalFormat;\r\n isMeasure?: boolean;\r\n prefix?: string;\r\n suffix?: string;\r\n negativeStyle?: 'sign' | 'parens' | 'red' | 'parens-red';\r\n sortable?: boolean;\r\n wrap?: boolean;\r\n group?: string;\r\n}\r\n\r\nexport interface HeaderCell {\r\n title: string;\r\n colSpan?: number;\r\n rowSpan?: number;\r\n align?: 'left' | 'center' | 'right';\r\n colIndex?: number;\r\n}\r\n\r\nexport interface VisibleRange {\r\n start: number;\r\n end: number;\r\n rowHeight: number;\r\n}\r\n\r\nexport interface BuildTableOptions {\r\n container: HTMLElement;\r\n tokens: ThemeTokens;\r\n rect: Rect;\r\n columns: ViewColumn[];\r\n rowCount: number;\r\n getCell(rowIndex: number, colIndex: number): { value: unknown; raw: number | null };\r\n rowClass?(rowIndex: number): 'normal' | 'subtotal' | 'grandtotal';\r\n cellIndent?(rowIndex: number, colIndex: number): number;\r\n rowHeaderSpan?: number;\r\n striped?: boolean;\r\n stickyHeader?: boolean;\r\n onSort?(colIndex: number): void;\r\n sortState?: { col: number; dir: 'asc' | 'desc' };\r\n conditionalDomains?: Array<[number, number] | null>;\r\n headerRows?: HeaderCell[][];\r\n footerRow?: { cells: Array<{ value: unknown; raw: number | null; label?: boolean }> };\r\n density?: 'comfortable' | 'standard' | 'compact';\r\n visibleRange?: VisibleRange;\r\n /** Render hand-drawn chrome (a wobbly container frame) for sketch mode. */\r\n sketch?: boolean;\r\n /** Computed internally by buildTable; column pixel widths fitted to the container. */\r\n widths?: number[];\r\n}\r\n\r\nexport function formatCellValue(value: unknown, column: Pick<ViewColumn, 'format'>): string {\r\n return formatValue(value, column.format);\r\n}\r\n\r\nexport function formatDisplayValue(\r\n value: unknown,\r\n column: Pick<ViewColumn, 'format' | 'prefix' | 'suffix' | 'negativeStyle'>,\r\n): string {\r\n const raw = typeof value === 'number' ? value : Number(value);\r\n const negative = Number.isFinite(raw) && raw < 0;\r\n const baseValue =\r\n negative && (column.negativeStyle === 'parens' || column.negativeStyle === 'parens-red') ? Math.abs(raw) : value;\r\n const formatted = formatCellValue(baseValue, column);\r\n const wrapped = negative && (column.negativeStyle === 'parens' || column.negativeStyle === 'parens-red')\r\n ? `(${formatted})`\r\n : formatted;\r\n return `${column.prefix ?? ''}${wrapped}${column.suffix ?? ''}`;\r\n}\r\n\r\nexport function resolveConditionalDomain(\r\n conditionalFormat: ConditionalFormat | undefined,\r\n values: readonly (number | null | undefined)[],\r\n): [number, number] | null {\r\n if (!conditionalFormat) return null;\r\n if ('domain' in conditionalFormat && conditionalFormat.domain) return conditionalFormat.domain;\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (const value of values) {\r\n if (value == null || !Number.isFinite(value)) continue;\r\n if (value < min) min = value;\r\n if (value > max) max = value;\r\n }\r\n return min === Infinity ? null : [min, max];\r\n}\r\n\r\nexport function buildTable(opts: BuildTableOptions): void {\r\n const { container, rect, tokens } = opts;\r\n // When the body is taller than the container a vertical scrollbar appears and\r\n // eats horizontal space; reserve its (platform-specific) width so the last\r\n // column isn't clipped behind a spurious horizontal scrollbar.\r\n const reserve = willScrollVertically(opts) ? scrollbarWidth() : 0;\r\n const available = Math.max(0, rect.width - 2 - reserve);\r\n opts.widths = computeFittedWidths(opts.columns, available);\r\n const tableWidth = Math.max(available, sumWidths(opts.widths));\r\n setStyles(container, {\r\n position: 'absolute',\r\n left: `${rect.x}px`,\r\n top: `${rect.y}px`,\r\n width: `${Math.max(0, rect.width)}px`,\r\n height: `${Math.max(0, rect.height)}px`,\r\n overflow: 'auto',\r\n pointerEvents: 'auto',\r\n boxSizing: 'border-box',\r\n border: `1px solid ${tokens.color.border}`,\r\n borderRadius: opts.sketch ? SKETCH_BORDER_RADIUS : `${tokens.radius.sm}px`,\r\n background: tokens.color.background,\r\n });\r\n\r\n container.replaceChildren();\r\n\r\n const table = document.createElement('table');\r\n table.setAttribute('role', 'table');\r\n setStyles(table, {\r\n width: `${tableWidth}px`,\r\n minWidth: '100%',\r\n borderCollapse: 'separate',\r\n borderSpacing: '0',\r\n tableLayout: 'fixed',\r\n fontFamily: tokens.font.family,\r\n fontSize: `${tokens.font.size.small}px`,\r\n lineHeight: '1.35',\r\n color: tokens.color.text,\r\n });\r\n\r\n table.appendChild(buildColGroup(opts.widths));\r\n table.appendChild(buildHeader(opts));\r\n table.appendChild(buildBody(opts));\r\n const footer = buildFooter(opts);\r\n if (footer) table.appendChild(footer);\r\n container.appendChild(table);\r\n}\r\n\r\nconst FILL_EPS = 0.5;\r\n\r\nlet cachedScrollbarWidth: number | null = null;\r\n\r\n/** Measure the browser's vertical scrollbar width (0 for overlay scrollbars). */\r\nfunction scrollbarWidth(): number {\r\n if (cachedScrollbarWidth != null) return cachedScrollbarWidth;\r\n if (typeof document === 'undefined' || !document.body) return 0;\r\n const probe = document.createElement('div');\r\n probe.style.cssText =\r\n 'position:absolute;top:-9999px;width:100px;height:100px;overflow:scroll;visibility:hidden';\r\n document.body.appendChild(probe);\r\n cachedScrollbarWidth = probe.offsetWidth - probe.clientWidth;\r\n probe.remove();\r\n return cachedScrollbarWidth;\r\n}\r\n\r\n/** Predicted total content height, used to decide whether the body will scroll. */\r\nfunction contentHeight(opts: BuildTableOptions): number {\r\n const headerRows = opts.headerRows?.length ?? 1;\r\n const metrics = densityMetrics(opts.density);\r\n const rowHeight = opts.visibleRange?.rowHeight ?? metrics.rowHeight;\r\n return headerRows * metrics.headerHeight + opts.rowCount * rowHeight + (opts.footerRow ? metrics.rowHeight : 0);\r\n}\r\n\r\nfunction willScrollVertically(opts: BuildTableOptions): boolean {\r\n return contentHeight(opts) > opts.rect.height + 1;\r\n}\r\n\r\nfunction computeFittedWidths(columns: readonly ViewColumn[], available: number): number[] {\r\n const natural = columns.map((column) => column.width ?? defaultColumnWidth(column));\r\n const naturalTotal = natural.reduce((sum, w) => sum + w, 0) || 1;\r\n if (available <= FILL_EPS) return natural;\r\n if (naturalTotal <= available) {\r\n const extra = available - naturalTotal;\r\n return natural.map((w) => w + extra * (w / naturalTotal));\r\n }\r\n // Shrink to fit: iteratively scale columns above MIN_COL_WIDTH, letting any\r\n // column clamped at the minimum push its deficit onto the still-flexible ones,\r\n // so the total lands exactly on `available` whenever the minimums allow it.\r\n const widths = natural.slice();\r\n for (let pass = 0; pass < columns.length; pass += 1) {\r\n const total = widths.reduce((sum, w) => sum + w, 0);\r\n if (total <= available + FILL_EPS) break;\r\n let flexTotal = 0;\r\n let fixedTotal = 0;\r\n for (const w of widths) {\r\n if (w > MIN_COL_WIDTH + FILL_EPS) flexTotal += w;\r\n else fixedTotal += w;\r\n }\r\n if (flexTotal <= 0) break;\r\n const targetFlex = available - fixedTotal;\r\n const factor = targetFlex <= 0 ? 0 : targetFlex / flexTotal;\r\n for (let i = 0; i < widths.length; i += 1) {\r\n if (widths[i] > MIN_COL_WIDTH + FILL_EPS) {\r\n widths[i] = Math.max(MIN_COL_WIDTH, widths[i] * factor);\r\n }\r\n }\r\n }\r\n return widths;\r\n}\r\n\r\nfunction sumWidths(widths: readonly number[]): number {\r\n return widths.reduce((sum, w) => sum + w, 0);\r\n}\r\n\r\nfunction buildColGroup(widths: readonly number[]): HTMLTableColElement {\r\n const colgroup = document.createElement('colgroup');\r\n for (const width of widths) {\r\n const col = document.createElement('col');\r\n col.style.width = `${width}px`;\r\n colgroup.appendChild(col);\r\n }\r\n return colgroup;\r\n}\r\n\r\nfunction buildHeader(opts: BuildTableOptions): HTMLTableSectionElement {\r\n const thead = document.createElement('thead');\r\n if (opts.headerRows) {\r\n opts.headerRows.forEach((row, rowIndex) => {\r\n const tr = document.createElement('tr');\r\n for (const cell of row) {\r\n const th = makeHeaderCell(opts, cell.title, cell.colIndex, cell.align, rowIndex);\r\n if (cell.colSpan && cell.colSpan > 1) th.colSpan = cell.colSpan;\r\n if (cell.rowSpan && cell.rowSpan > 1) th.rowSpan = cell.rowSpan;\r\n tr.appendChild(th);\r\n }\r\n thead.appendChild(tr);\r\n });\r\n return thead;\r\n }\r\n\r\n const tr = document.createElement('tr');\r\n opts.columns.forEach((column, colIndex) => {\r\n tr.appendChild(makeHeaderCell(opts, column.title, colIndex, column.align));\r\n });\r\n thead.appendChild(tr);\r\n return thead;\r\n}\r\n\r\nfunction makeHeaderCell(\r\n opts: BuildTableOptions,\r\n title: string,\r\n colIndex: number | undefined,\r\n align: 'left' | 'center' | 'right' | undefined,\r\n rowIndex = 0,\r\n): HTMLTableCellElement {\r\n const th = document.createElement('th');\r\n const metrics = densityMetrics(opts.density);\r\n th.scope = 'col';\r\n th.textContent = title;\r\n const isSorted = colIndex != null && opts.sortState?.col === colIndex;\r\n if (isSorted) th.setAttribute('aria-sort', opts.sortState?.dir === 'desc' ? 'descending' : 'ascending');\r\n setCellBaseStyles(th, opts.tokens, align ?? 'left', opts.stickyHeader !== false, metrics.padding);\r\n setStyles(th, {\r\n top: `${rowIndex * metrics.headerHeight}px`,\r\n zIndex: '4',\r\n background: opts.tokens.color.surface,\r\n color: opts.tokens.color.text,\r\n fontWeight: String(opts.tokens.font.weight.bold),\r\n borderBottom: `1px solid ${opts.tokens.color.border}`,\r\n userSelect: 'none',\r\n height: `${metrics.headerHeight}px`,\r\n });\r\n\r\n if (colIndex != null && opts.onSort && opts.columns[colIndex]?.sortable !== false) {\r\n th.textContent = '';\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.addEventListener('click', () => opts.onSort?.(colIndex));\r\n setStyles(button, {\r\n all: 'unset',\r\n boxSizing: 'border-box',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start',\r\n gap: '5px',\r\n width: '100%',\r\n cursor: 'pointer',\r\n color: 'inherit',\r\n font: 'inherit',\r\n });\r\n const label = document.createElement('span');\r\n label.textContent = title;\r\n label.style.overflow = 'hidden';\r\n label.style.textOverflow = 'ellipsis';\r\n const glyph = document.createElement('span');\r\n glyph.textContent = isSorted ? (opts.sortState?.dir === 'desc' ? '↓' : '↑') : '';\r\n glyph.setAttribute('aria-hidden', 'true');\r\n glyph.style.color = opts.tokens.color.textMuted;\r\n button.append(label, glyph);\r\n th.appendChild(button);\r\n }\r\n\r\n applyStickyColumn(th, opts, colIndex, true);\r\n return th;\r\n}\r\n\r\nfunction buildBody(opts: BuildTableOptions): HTMLTableSectionElement {\r\n const tbody = document.createElement('tbody');\r\n const range = opts.visibleRange;\r\n const start = range ? clampInt(range.start, 0, opts.rowCount) : 0;\r\n const end = range ? clampInt(range.end, start, opts.rowCount) : opts.rowCount;\r\n if (range && start > 0) tbody.appendChild(makeSpacerRow(opts, start * range.rowHeight));\r\n for (let rowIndex = start; rowIndex < end; rowIndex += 1) {\r\n tbody.appendChild(makeBodyRow(opts, rowIndex, range?.rowHeight));\r\n }\r\n if (range && end < opts.rowCount) {\r\n tbody.appendChild(makeSpacerRow(opts, (opts.rowCount - end) * range.rowHeight));\r\n }\r\n return tbody;\r\n}\r\n\r\nfunction makeBodyRow(opts: BuildTableOptions, rowIndex: number, rowHeight?: number): HTMLTableRowElement {\r\n const tr = document.createElement('tr');\r\n const cls = opts.rowClass?.(rowIndex) ?? 'normal';\r\n const metrics = densityMetrics(opts.density);\r\n if (rowHeight) tr.style.height = `${rowHeight}px`;\r\n opts.columns.forEach((column, colIndex) => {\r\n const td = document.createElement('td');\r\n const cell = opts.getCell(rowIndex, colIndex);\r\n const rowBg = rowBackground(opts, rowIndex, cls);\r\n setCellBaseStyles(td, opts.tokens, column.align, false, metrics.padding);\r\n setStyles(td, {\r\n position: colIndex < (opts.rowHeaderSpan ?? 0) ? 'sticky' : 'relative',\r\n background: rowBg,\r\n fontWeight: cls === 'normal' ? String(opts.tokens.font.weight.normal) : String(opts.tokens.font.weight.bold),\r\n color: opts.tokens.color.text,\r\n borderBottom: `1px solid ${opts.tokens.color.border}`,\r\n height: rowHeight ? `${rowHeight}px` : `${metrics.rowHeight}px`,\r\n whiteSpace: column.wrap === true ? 'normal' : 'nowrap',\r\n });\r\n const indent = opts.cellIndent?.(rowIndex, colIndex) ?? 0;\r\n if (indent > 0) td.style.paddingLeft = `${metrics.paddingX + indent}px`;\r\n applyConditionalFormatting(td, opts, column, colIndex, cell, rowBg);\r\n if (td.childNodes.length === 0) {\r\n td.textContent = formatDisplayValue(cell.value, column);\r\n applyNegativeStyle(td, cell.value, column);\r\n }\r\n applyStickyColumn(td, opts, colIndex, false);\r\n tr.appendChild(td);\r\n });\r\n return tr;\r\n}\r\n\r\nfunction buildFooter(opts: BuildTableOptions): HTMLTableSectionElement | null {\r\n if (!opts.footerRow) return null;\r\n const tfoot = document.createElement('tfoot');\r\n const tr = document.createElement('tr');\r\n const metrics = densityMetrics(opts.density);\r\n opts.columns.forEach((column, colIndex) => {\r\n const td = document.createElement('td');\r\n const cell = opts.footerRow?.cells[colIndex] ?? { value: null, raw: null };\r\n setCellBaseStyles(td, opts.tokens, column.align, false, metrics.padding);\r\n setStyles(td, {\r\n position: colIndex < (opts.rowHeaderSpan ?? 0) ? 'sticky' : 'sticky',\r\n bottom: '0',\r\n zIndex: colIndex < (opts.rowHeaderSpan ?? 0) ? '5' : '4',\r\n background: opts.tokens.color.surface,\r\n color: opts.tokens.color.text,\r\n fontWeight: String(opts.tokens.font.weight.bold),\r\n borderTop: `1px solid ${opts.tokens.color.border}`,\r\n borderBottom: `1px solid ${opts.tokens.color.border}`,\r\n height: `${metrics.rowHeight}px`,\r\n whiteSpace: column.wrap === true ? 'normal' : 'nowrap',\r\n });\r\n td.textContent = cell.label ? String(cell.value ?? '') : formatDisplayValue(cell.value, column);\r\n applyNegativeStyle(td, cell.value, column);\r\n applyStickyColumn(td, opts, colIndex, false);\r\n tr.appendChild(td);\r\n });\r\n tfoot.appendChild(tr);\r\n return tfoot;\r\n}\r\n\r\nfunction makeSpacerRow(opts: BuildTableOptions, height: number): HTMLTableRowElement {\r\n const tr = document.createElement('tr');\r\n tr.setAttribute('aria-hidden', 'true');\r\n const td = document.createElement('td');\r\n td.colSpan = Math.max(1, opts.columns.length);\r\n setStyles(td, {\r\n height: `${Math.max(0, height)}px`,\r\n padding: '0',\r\n border: '0',\r\n background: opts.tokens.color.background,\r\n });\r\n tr.appendChild(td);\r\n return tr;\r\n}\r\n\r\nfunction applyConditionalFormatting(\r\n td: HTMLTableCellElement,\r\n opts: BuildTableOptions,\r\n column: ViewColumn,\r\n colIndex: number,\r\n cell: { value: unknown; raw: number | null },\r\n rowBg: string,\r\n): void {\r\n const cf = column.conditionalFormat;\r\n const raw = cell.raw;\r\n const domain = opts.conditionalDomains?.[colIndex] ?? null;\r\n if (!cf) return;\r\n if ((cf.type === 'colorScale' || cf.type === 'bar' || cf.type === 'icon') && (raw == null || !Number.isFinite(raw))) {\r\n return;\r\n }\r\n const numeric = raw as number;\r\n\r\n if (cf.type === 'colorScale') {\r\n if (!domain) return;\r\n const midpoint = cf.midpoint ?? (domain[0] + domain[1]) / 2;\r\n const scale =\r\n cf.diverging === true || cf.midpoint !== undefined\r\n ? divergingColorScale({ domain: [domain[0], midpoint, domain[1]], interpolator: divergingInterpolator(cf.scheme ?? 'redblue') })\r\n : sequentialColorScale({ domain, interpolator: sequential(cf.scheme ?? 'blues') });\r\n const color = scale.map(numeric);\r\n if (cf.target === 'text') {\r\n td.style.color = rgbaToCss(color);\r\n } else {\r\n td.style.background = rgbaToCss(color);\r\n td.style.color = rgbaToCss(readableTextColor(color));\r\n }\r\n return;\r\n }\r\n\r\n if (cf.type === 'rules') {\r\n const style = evalRules((raw ?? String(cell.value ?? '')) as number | null, cf.rules);\r\n if (style.background) td.style.background = style.background;\r\n if (style.color) td.style.color = style.color;\r\n if (style.weight) td.style.fontWeight = style.weight === 'bold' ? String(opts.tokens.font.weight.bold) : String(opts.tokens.font.weight.normal);\r\n if (style.icon) renderIconValue(td, style.icon, style.color ?? td.style.color, formatDisplayValue(cell.value, column), 'left');\r\n return;\r\n }\r\n\r\n if (cf.type === 'icon') {\r\n const semantic = iconForValue(cf.set, numeric, domain, cf.rules);\r\n if (!semantic) return;\r\n renderIconValue(\r\n td,\r\n semantic.icon,\r\n toneColor(semantic.tone, { up: opts.tokens.color.positive, mid: '#d97706', down: opts.tokens.color.negative }),\r\n formatDisplayValue(cell.value, column),\r\n cf.position ?? 'left',\r\n );\r\n applyNegativeStyle(td, cell.value, column);\r\n return;\r\n }\r\n\r\n if (!domain) return;\r\n const ratio = normalized(numeric, domain);\r\n const bar = document.createElement('div');\r\n const diverging = cf.negativeColor !== undefined || cf.baseline === 'zero';\r\n const positive = numeric >= 0;\r\n const barColor = alphaColor(positive ? cf.color ?? opts.tokens.color.accent : cf.negativeColor ?? opts.tokens.color.negative, 0.85);\r\n const baseline = diverging ? normalized(0, domain) : 0;\r\n const left = diverging ? Math.min(baseline, normalized(numeric, domain)) : 0;\r\n const width = diverging ? Math.abs(normalized(numeric, domain) - baseline) : ratio;\r\n setStyles(bar, {\r\n position: 'absolute',\r\n left: `calc(${Math.round(left * 1000) / 10}% + 4px)`,\r\n top: '5px',\r\n bottom: '5px',\r\n width: `${Math.round(width * 1000) / 10}%`,\r\n borderRadius: `${Math.max(2, opts.tokens.radius.sm - 1)}px`,\r\n background: barColor,\r\n opacity: '0.9',\r\n pointerEvents: 'none',\r\n });\r\n const text = document.createElement('span');\r\n text.textContent = cf.showValue === false ? '' : formatDisplayValue(cell.value, column);\r\n setStyles(text, overlayTextStyles(opts.tokens.color.text));\r\n td.style.background = rowBg;\r\n td.append(bar, text);\r\n applyNegativeStyle(text, cell.value, column);\r\n}\r\n\r\nfunction setCellBaseStyles(\r\n cell: HTMLTableCellElement,\r\n tokens: ThemeTokens,\r\n align: 'left' | 'center' | 'right',\r\n sticky: boolean,\r\n padding = '6px 10px',\r\n): void {\r\n setStyles(cell, {\r\n boxSizing: 'border-box',\r\n padding,\r\n textAlign: align,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n borderRight: `1px solid ${tokens.color.border}`,\r\n verticalAlign: 'middle',\r\n });\r\n if (sticky) cell.style.position = 'sticky';\r\n}\r\n\r\nfunction renderIconValue(\r\n td: HTMLTableCellElement,\r\n icon: string,\r\n color: string,\r\n value: string,\r\n position: 'left' | 'right',\r\n): void {\r\n const iconSpan = document.createElement('span');\r\n iconSpan.textContent = icon;\r\n iconSpan.setAttribute('aria-hidden', 'true');\r\n setStyles(iconSpan, { color, fontWeight: '700', flex: '0 0 auto' });\r\n\r\n const valueSpan = document.createElement('span');\r\n valueSpan.textContent = value;\r\n setStyles(valueSpan, { overflow: 'hidden', textOverflow: 'ellipsis' });\r\n\r\n const wrap = document.createElement('span');\r\n setStyles(wrap, {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: td.style.textAlign === 'right' ? 'flex-end' : td.style.textAlign === 'center' ? 'center' : 'flex-start',\r\n gap: '6px',\r\n maxWidth: '100%',\r\n width: '100%',\r\n });\r\n if (position === 'right') wrap.append(valueSpan, iconSpan);\r\n else wrap.append(iconSpan, valueSpan);\r\n td.appendChild(wrap);\r\n}\r\n\r\nfunction overlayTextStyles(color: string): Record<string, string> {\r\n return {\r\n position: 'relative',\r\n zIndex: '1',\r\n display: 'block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n color,\r\n };\r\n}\r\n\r\nfunction applyNegativeStyle(\r\n el: HTMLElement,\r\n value: unknown,\r\n column: Pick<ViewColumn, 'negativeStyle'>,\r\n): void {\r\n const raw = typeof value === 'number' ? value : Number(value);\r\n if (!Number.isFinite(raw) || raw >= 0) return;\r\n if (column.negativeStyle === 'red' || column.negativeStyle === 'parens-red') {\r\n el.style.color = '#dc2626';\r\n }\r\n}\r\n\r\nfunction densityMetrics(density: BuildTableOptions['density']): {\r\n rowHeight: number;\r\n headerHeight: number;\r\n padding: string;\r\n paddingX: number;\r\n} {\r\n if (density === 'comfortable') return { rowHeight: 36, headerHeight: 36, padding: '8px 12px', paddingX: 12 };\r\n if (density === 'compact') return { rowHeight: 24, headerHeight: 28, padding: '3px 8px', paddingX: 8 };\r\n return { rowHeight: DEFAULT_BODY_ROW_HEIGHT, headerHeight: HEADER_ROW_HEIGHT, padding: '6px 10px', paddingX: 10 };\r\n}\r\n\r\nfunction applyStickyColumn(\r\n cell: HTMLTableCellElement,\r\n opts: BuildTableOptions,\r\n colIndex: number | undefined,\r\n isHeader: boolean,\r\n): void {\r\n if (colIndex == null || colIndex >= (opts.rowHeaderSpan ?? 0)) return;\r\n cell.style.position = 'sticky';\r\n cell.style.left = `${leftOffset(opts, colIndex)}px`;\r\n cell.style.zIndex = isHeader ? '6' : '3';\r\n}\r\n\r\nfunction rowBackground(opts: BuildTableOptions, rowIndex: number, cls: 'normal' | 'subtotal' | 'grandtotal'): string {\r\n if (cls !== 'normal') return opts.tokens.color.surface;\r\n if (opts.striped === true && rowIndex % 2 === 1) return subtleStripe(opts.tokens);\r\n return opts.tokens.color.background;\r\n}\r\n\r\nfunction subtleStripe(tokens: ThemeTokens): string {\r\n const c = parseColor(tokens.color.surface);\r\n if (!c) return tokens.color.surface;\r\n return rgbaToCss({ ...c, a: tokens.dark ? 0.34 : 0.55 });\r\n}\r\n\r\nfunction alphaColor(input: string, alpha: number): string {\r\n const c = parseColor(input);\r\n if (!c) return input;\r\n return rgbaToCss({ ...c, a: Math.min(c.a, alpha) });\r\n}\r\n\r\nfunction normalized(value: number, domain: [number, number]): number {\r\n const [min, max] = domain;\r\n if (max === min) return 1;\r\n const t = (value - min) / (max - min);\r\n return t < 0 ? 0 : t > 1 ? 1 : t;\r\n}\r\n\r\nfunction defaultColumnWidth(column: ViewColumn): number {\r\n if (column.width) return column.width;\r\n if (column.isMeasure || column.align === 'right') return 112;\r\n if (column.type === 'temporal') return 132;\r\n return 148;\r\n}\r\n\r\nfunction leftOffset(opts: BuildTableOptions, colIndex: number): number {\r\n const widths = opts.widths ?? opts.columns.map((column) => column.width ?? defaultColumnWidth(column));\r\n let left = 0;\r\n for (let i = 0; i < colIndex; i += 1) left += widths[i] ?? 0;\r\n return left;\r\n}\r\n\r\nfunction clampInt(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, Math.floor(value)));\r\n}\r\n\r\nfunction setStyles(styleable: HTMLElement, styles: Record<string, string>): void {\r\n for (const [key, value] of Object.entries(styles)) {\r\n styleable.style.setProperty(kebab(key), value);\r\n }\r\n}\r\n\r\nfunction kebab(key: string): string {\r\n return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\r\n}\r\n","import { drawTitleBlock } from './chrome';\r\nimport { buildTable, resolveConditionalDomain, type ViewColumn } from './tableView';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { Surface } from '../render/surface';\r\nimport type { ChartSpec, TableSpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Datum, FieldType, Size } from '../types';\r\nimport { accessor, inferType, toNumber } from '../util/data';\r\nimport { aggregateValues } from '../pivot';\r\n\r\nconst ROW_HEIGHT = 30;\r\nconst BUFFER_ROWS = 8;\r\n\r\nexport function drawTable(surface: Surface, spec: ChartSpec, tokens: ThemeTokens, size: Size): void {\r\n if (spec.type !== 'table') return;\r\n renderTable(surface, spec, tokens, size);\r\n}\r\n\r\nfunction renderTable(surface: Surface, spec: TableSpec, tokens: ThemeTokens, size: Size): void {\r\n const rect = drawTitleBlock(surface, tokens, size, spec.title);\r\n const data = spec.data ?? [];\r\n const columns = resolveColumns(data, spec);\r\n const read = columns.map((column) => accessor(column.key));\r\n const sketch = resolveSketch(spec) != null;\r\n let sortState = initialSortState(spec, columns);\r\n let sortedRows = sortRows(data, columns, read, sortState);\r\n const domains = columns.map((column, colIndex) =>\r\n resolveConditionalDomain(\r\n column.conditionalFormat,\r\n data.map((row) => numericRaw(read[colIndex](row))),\r\n ),\r\n );\r\n\r\n const host = document.createElement('div');\r\n surface.overlay.appendChild(host);\r\n\r\n let frame = 0;\r\n const renderWindow = (): void => {\r\n const scrollTop = host.scrollTop || 0;\r\n const rowHeight = densityRowHeight(spec.density);\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - BUFFER_ROWS);\r\n const visible = Math.ceil(Math.max(rect.height, host.clientHeight || rect.height) / rowHeight) + BUFFER_ROWS * 2;\r\n const end = Math.min(sortedRows.length, start + visible);\r\n buildTable({\r\n container: host,\r\n tokens,\r\n rect,\r\n columns,\r\n rowCount: sortedRows.length,\r\n getCell(rowIndex, colIndex) {\r\n const value = read[colIndex](sortedRows[rowIndex]);\r\n return { value, raw: numericRaw(value) };\r\n },\r\n striped: spec.striped === true,\r\n stickyHeader: spec.stickyHeader !== false,\r\n onSort(colIndex) {\r\n sortState =\r\n sortState?.col === colIndex\r\n ? { col: colIndex, dir: sortState.dir === 'asc' ? 'desc' : 'asc' }\r\n : { col: colIndex, dir: 'asc' };\r\n sortedRows = sortRows(data, columns, read, sortState);\r\n host.scrollTop = 0;\r\n renderWindow();\r\n },\r\n sortState: sortState ?? undefined,\r\n conditionalDomains: domains,\r\n headerRows: buildTableHeaderRows(columns),\r\n footerRow: buildTotalsRow(sortedRows, columns, read, spec),\r\n density: spec.density,\r\n visibleRange: { start, end, rowHeight },\r\n sketch,\r\n });\r\n };\r\n\r\n host.addEventListener('scroll', () => {\r\n if (frame !== 0) return;\r\n frame = requestFrame(() => {\r\n frame = 0;\r\n renderWindow();\r\n });\r\n });\r\n\r\n renderWindow();\r\n}\r\n\r\nfunction resolveColumns(data: readonly Datum[], spec: TableSpec): ViewColumn[] {\r\n const declared = spec.columns;\r\n const declaredVisible = declared?.filter((column) => column.hidden !== true);\r\n const fields = declaredVisible ? declaredVisible.map((column) => column.field) : Object.keys(data[0] ?? {});\r\n return fields.map((field, index) => {\r\n const declaredColumn = declaredVisible?.[index];\r\n const type = declaredColumn?.type ?? inferColumnType(data, field);\r\n const align = declaredColumn?.align ?? (type === 'quantitative' ? 'right' : 'left');\r\n return {\r\n key: field,\r\n title: declaredColumn?.title ?? field,\r\n type,\r\n align,\r\n format: declaredColumn?.format,\r\n width: declaredColumn?.width,\r\n conditionalFormat: declaredColumn?.conditionalFormat,\r\n isMeasure: type === 'quantitative',\r\n prefix: declaredColumn?.prefix,\r\n suffix: declaredColumn?.suffix,\r\n negativeStyle: declaredColumn?.negativeStyle,\r\n sortable: declaredColumn?.sortable,\r\n wrap: declaredColumn?.wrap,\r\n group: declaredColumn?.group,\r\n };\r\n });\r\n}\r\n\r\nfunction buildTableHeaderRows(columns: readonly ViewColumn[]) {\r\n if (!columns.some((column) => column.group)) return undefined;\r\n const groups = [];\r\n let index = 0;\r\n while (index < columns.length) {\r\n const group = columns[index].group ?? '';\r\n let span = 1;\r\n while (index + span < columns.length && (columns[index + span].group ?? '') === group) span += 1;\r\n groups.push({ title: group, colSpan: span, align: 'center' as const });\r\n index += span;\r\n }\r\n return [\r\n groups,\r\n columns.map((column, colIndex) => ({\r\n title: column.title,\r\n align: column.align,\r\n colIndex,\r\n })),\r\n ];\r\n}\r\n\r\nfunction buildTotalsRow(\r\n rows: readonly Datum[],\r\n columns: readonly ViewColumn[],\r\n read: readonly ((row: Datum) => unknown)[],\r\n spec: TableSpec,\r\n) {\r\n if (!spec.totals) return undefined;\r\n const label = typeof spec.totals === 'object' ? spec.totals.label ?? 'Total' : 'Total';\r\n const labelIndex = Math.max(0, columns.findIndex((column) => !column.isMeasure));\r\n const declaredVisible = spec.columns?.filter((column) => column.hidden !== true);\r\n return {\r\n cells: columns.map((column, colIndex) => {\r\n if (colIndex === labelIndex) return { value: label, raw: null, label: true };\r\n const declared = declaredVisible?.find((entry) => entry.field === column.key);\r\n const op = declared?.total === false ? false : declared?.total ?? (column.isMeasure ? 'sum' : false);\r\n if (!op) return { value: null, raw: null };\r\n const value = aggregateValues(rows.map((row) => read[colIndex](row)), op);\r\n return { value, raw: value };\r\n }),\r\n };\r\n}\r\n\r\nfunction inferColumnType(data: readonly Datum[], field: string): FieldType {\r\n return data.length === 0 ? 'nominal' : inferType(data, field);\r\n}\r\n\r\nfunction initialSortState(spec: TableSpec, columns: readonly ViewColumn[]): { col: number; dir: 'asc' | 'desc' } | null {\r\n if (!spec.sort) return null;\r\n const col = columns.findIndex((column) => column.key === spec.sort?.field);\r\n return col === -1 ? null : { col, dir: spec.sort.order ?? 'asc' };\r\n}\r\n\r\nfunction sortRows(\r\n data: readonly Datum[],\r\n columns: readonly ViewColumn[],\r\n read: readonly ((row: Datum) => unknown)[],\r\n sortState: { col: number; dir: 'asc' | 'desc' } | null,\r\n): Datum[] {\r\n if (!sortState) return [...data];\r\n const dir = sortState.dir === 'asc' ? 1 : -1;\r\n const column = columns[sortState.col];\r\n const get = read[sortState.col];\r\n return data\r\n .map((row, index) => ({ row, index }))\r\n .sort((left, right) => {\r\n const cmp = compareValues(get(left.row), get(right.row), column.type);\r\n return cmp === 0 ? left.index - right.index : cmp * dir;\r\n })\r\n .map((entry) => entry.row);\r\n}\r\n\r\nfunction compareValues(left: unknown, right: unknown, type?: FieldType): number {\r\n if (left == null && right == null) return 0;\r\n if (left == null) return 1;\r\n if (right == null) return -1;\r\n const ln = toNumber(left);\r\n const rn = toNumber(right);\r\n if (Number.isFinite(ln) && Number.isFinite(rn)) return ln === rn ? 0 : ln < rn ? -1 : 1;\r\n if (type === 'temporal' || left instanceof Date || right instanceof Date) {\r\n const lt = left instanceof Date ? left.getTime() : Date.parse(String(left));\r\n const rt = right instanceof Date ? right.getTime() : Date.parse(String(right));\r\n if (Number.isFinite(lt) && Number.isFinite(rt)) return lt === rt ? 0 : lt < rt ? -1 : 1;\r\n }\r\n return String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: 'base' });\r\n}\r\n\r\nfunction numericRaw(value: unknown): number | null {\r\n const n = toNumber(value);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nfunction densityRowHeight(density: TableSpec['density']): number {\r\n if (density === 'comfortable') return 36;\r\n if (density === 'compact') return 24;\r\n return ROW_HEIGHT;\r\n}\r\n\r\nfunction requestFrame(callback: () => void): number {\r\n return typeof requestAnimationFrame === 'function' ? requestAnimationFrame(callback) : window.setTimeout(callback, 16);\r\n}\r\n","import { drawTitleBlock } from './chrome';\r\nimport {\r\n buildTable,\r\n resolveConditionalDomain,\r\n type HeaderCell,\r\n type ViewColumn,\r\n} from './tableView';\r\nimport { pivot, type PivotFlatRow, type PivotHeaderNode } from '../pivot';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport type { Surface } from '../render/surface';\r\nimport type { ChartSpec, MatrixSpec } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Size } from '../types';\r\n\r\nconst PATH_SEPARATOR = '\\u0000';\r\n\r\nexport function drawMatrix(surface: Surface, spec: ChartSpec, tokens: ThemeTokens, size: Size): void {\r\n if (spec.type !== 'matrix') return;\r\n renderMatrix(surface, spec, tokens, size);\r\n}\r\n\r\nfunction renderMatrix(surface: Surface, spec: MatrixSpec, tokens: ThemeTokens, size: Size): void {\r\n const rect = drawTitleBlock(surface, tokens, size, spec.title);\r\n const data = spec.data ?? [];\r\n const result = pivot(data, {\r\n rows: spec.rows,\r\n columns: spec.columns ?? [],\r\n values: spec.values.map((value) => ({ field: value.field, op: value.op, label: value.label })),\r\n includeRowSubtotals: spec.subtotals === true,\r\n includeColumnSubtotals: spec.subtotals === true,\r\n includeGrandTotals: spec.grandTotals === true,\r\n sort: 'asc',\r\n });\r\n\r\n const sortedLeaves = sortColumnLeaves(result.columnLeaves, result.rows, spec);\r\n const denominators = computeShowAsDenominators(result.rows, sortedLeaves, spec);\r\n const leafValueColumns = flattenLeafValueColumns(sortedLeaves, spec);\r\n const columns: ViewColumn[] = [\r\n {\r\n key: '__row__',\r\n title: spec.rows.join(' / ') || 'Rows',\r\n align: 'left',\r\n type: 'nominal',\r\n width: Math.max(180, Math.min(280, 120 + spec.rows.length * 34)),\r\n },\r\n ...leafValueColumns.map(({ leaf, valueIndex }) => {\r\n const valueDef = spec.values[valueIndex];\r\n const title = spec.values.length > 1 ? valueDef.label ?? valueDef.field : leaf.key;\r\n return {\r\n key: `${leaf.path.join(PATH_SEPARATOR)}:${valueIndex}`,\r\n title,\r\n align: 'right' as const,\r\n type: 'quantitative' as const,\r\n format: valueDef.showAs && valueDef.showAs !== 'value' ? '.1%' : valueDef.format,\r\n width: 118,\r\n conditionalFormat: valueDef.conditionalFormat,\r\n isMeasure: true,\r\n prefix: valueDef.showAs && valueDef.showAs !== 'value' ? undefined : valueDef.prefix,\r\n suffix: valueDef.showAs && valueDef.showAs !== 'value' ? undefined : valueDef.suffix,\r\n negativeStyle: valueDef.negativeStyle,\r\n };\r\n }),\r\n ];\r\n\r\n const bodyDomains = columns.map((column, colIndex) => {\r\n if (colIndex === 0) return null;\r\n const { leaf, valueIndex } = leafValueColumns[colIndex - 1];\r\n const colKey = leaf.path.join(PATH_SEPARATOR);\r\n return resolveConditionalDomain(\r\n column.conditionalFormat,\r\n result.rows\r\n .map((row, rowIndex) =>\r\n row.isSubtotal === true || row.isGrandTotal === true\r\n ? null\r\n : displayMatrixValue(row.cellsByColumnKey.get(colKey)?.values[valueIndex] ?? null, rowIndex, colIndex - 1, denominators, spec),\r\n ),\r\n );\r\n });\r\n\r\n const host = document.createElement('div');\r\n surface.overlay.appendChild(host);\r\n buildTable({\r\n container: host,\r\n tokens,\r\n rect,\r\n columns,\r\n rowCount: result.rows.length,\r\n getCell(rowIndex, colIndex) {\r\n const row = result.rows[rowIndex];\r\n if (colIndex === 0) return { value: rowLabel(row), raw: null };\r\n const { leaf, valueIndex } = leafValueColumns[colIndex - 1];\r\n const value = row.cellsByColumnKey.get(leaf.path.join(PATH_SEPARATOR))?.values[valueIndex] ?? null;\r\n const display = displayMatrixValue(value, rowIndex, colIndex - 1, denominators, spec);\r\n return { value: display, raw: display };\r\n },\r\n rowClass(rowIndex) {\r\n const row = result.rows[rowIndex];\r\n return row.isGrandTotal === true ? 'grandtotal' : row.isSubtotal === true ? 'subtotal' : 'normal';\r\n },\r\n cellIndent(rowIndex, colIndex) {\r\n return colIndex === 0 ? result.rows[rowIndex].depth * 16 : 0;\r\n },\r\n rowHeaderSpan: 1,\r\n stickyHeader: true,\r\n striped: false,\r\n conditionalDomains: bodyDomains,\r\n headerRows: buildMatrixHeaderRows(result.columnTree, sortedLeaves, spec, sortedLeaves !== result.columnLeaves),\r\n density: spec.density,\r\n sketch: resolveSketch(spec) != null,\r\n });\r\n}\r\n\r\nfunction rowLabel(row: PivotFlatRow): string {\r\n if (row.isGrandTotal === true) return row.label;\r\n if (row.isSubtotal === true) {\r\n const name = row.path[row.path.length - 1] ?? '';\r\n return name === '' ? row.label : `${name} ${row.label}`;\r\n }\r\n return row.label;\r\n}\r\n\r\nfunction flattenLeafValueColumns(\r\n columnLeaves: readonly PivotHeaderNode[],\r\n spec: MatrixSpec,\r\n): Array<{ leaf: PivotHeaderNode; valueIndex: number }> {\r\n const out: Array<{ leaf: PivotHeaderNode; valueIndex: number }> = [];\r\n for (const leaf of columnLeaves) {\r\n spec.values.forEach((_value, valueIndex) => out.push({ leaf, valueIndex }));\r\n }\r\n return out;\r\n}\r\n\r\ninterface ShowAsDenominators {\r\n rowTotals: number[][];\r\n columnTotals: number[][];\r\n grandTotals: number[];\r\n}\r\n\r\nexport function computeShowAsValue(\r\n value: number | null,\r\n showAs: NonNullable<MatrixSpec['values'][number]['showAs']> | undefined,\r\n denominator: number,\r\n): number | null {\r\n if (value == null) return null;\r\n if (!showAs || showAs === 'value') return value;\r\n return denominator === 0 ? null : value / denominator;\r\n}\r\n\r\nfunction computeShowAsDenominators(\r\n rows: readonly PivotFlatRow[],\r\n leaves: readonly PivotHeaderNode[],\r\n spec: MatrixSpec,\r\n): ShowAsDenominators {\r\n const valueCount = spec.values.length;\r\n const rowTotals = rows.map((row) => {\r\n const totals = Array.from({ length: valueCount }, () => 0);\r\n leaves.forEach((leaf) => {\r\n const cell = row.cellsByColumnKey.get(leaf.path.join(PATH_SEPARATOR));\r\n for (let i = 0; i < valueCount; i += 1) totals[i] += cell?.values[i] ?? 0;\r\n });\r\n return totals;\r\n });\r\n const columnTotals = leaves.map((leaf) => {\r\n const totals = Array.from({ length: valueCount }, () => 0);\r\n rows.forEach((row) => {\r\n if (row.isSubtotal || row.isGrandTotal) return;\r\n const cell = row.cellsByColumnKey.get(leaf.path.join(PATH_SEPARATOR));\r\n for (let i = 0; i < valueCount; i += 1) totals[i] += cell?.values[i] ?? 0;\r\n });\r\n return totals;\r\n });\r\n const grandTotals = Array.from({ length: valueCount }, (_, valueIndex) =>\r\n columnTotals.reduce((sum, totals) => sum + totals[valueIndex], 0),\r\n );\r\n return { rowTotals, columnTotals, grandTotals };\r\n}\r\n\r\nfunction displayMatrixValue(\r\n value: number | null,\r\n rowIndex: number,\r\n leafValueIndex: number,\r\n denominators: ShowAsDenominators,\r\n spec: MatrixSpec,\r\n): number | null {\r\n const valueIndex = leafValueIndex % spec.values.length;\r\n const leafIndex = Math.floor(leafValueIndex / spec.values.length);\r\n const showAs = spec.values[valueIndex].showAs;\r\n if (!showAs || showAs === 'value') return value;\r\n const denominator =\r\n showAs === 'percentOfRow'\r\n ? denominators.rowTotals[rowIndex]?.[valueIndex] ?? 0\r\n : showAs === 'percentOfColumn'\r\n ? denominators.columnTotals[leafIndex]?.[valueIndex] ?? 0\r\n : denominators.grandTotals[valueIndex] ?? 0;\r\n return computeShowAsValue(value, showAs, denominator);\r\n}\r\n\r\nfunction sortColumnLeaves(\r\n leaves: readonly PivotHeaderNode[],\r\n rows: readonly PivotFlatRow[],\r\n spec: MatrixSpec,\r\n): readonly PivotHeaderNode[] {\r\n const order = spec.columnSort?.order === 'desc' ? -1 : 1;\r\n if (!spec.columnSort) return leaves;\r\n const sorted = [...leaves];\r\n if (spec.columnSort.by === 'label') {\r\n return sorted.sort((left, right) => left.key.localeCompare(right.key, undefined, { numeric: true }) * order);\r\n }\r\n const valueIndex = spec.columnSort.valueIndex ?? 0;\r\n return sorted.sort((left, right) => {\r\n const leftTotal = columnTotal(rows, left, valueIndex);\r\n const rightTotal = columnTotal(rows, right, valueIndex);\r\n return (leftTotal === rightTotal ? left.key.localeCompare(right.key) : leftTotal - rightTotal) * order;\r\n });\r\n}\r\n\r\nfunction columnTotal(rows: readonly PivotFlatRow[], leaf: PivotHeaderNode, valueIndex: number): number {\r\n const key = leaf.path.join(PATH_SEPARATOR);\r\n return rows.reduce((sum, row) => {\r\n if (row.isSubtotal || row.isGrandTotal) return sum;\r\n return sum + (row.cellsByColumnKey.get(key)?.values[valueIndex] ?? 0);\r\n }, 0);\r\n}\r\n\r\nfunction buildMatrixHeaderRows(\r\n columnTree: readonly PivotHeaderNode[],\r\n columnLeaves: readonly PivotHeaderNode[],\r\n spec: MatrixSpec,\r\n flatLeaves = false,\r\n): HeaderCell[][] {\r\n if (flatLeaves) return buildFlatMatrixHeaderRows(columnLeaves, spec);\r\n const groupRows = Math.max(1, maxDepth(columnTree) + 1);\r\n const showMeasureRow = spec.values.length > 1;\r\n const totalRows = groupRows + (showMeasureRow ? 1 : 0);\r\n const rows: HeaderCell[][] = Array.from({ length: totalRows }, () => []);\r\n rows[0].push({\r\n title: spec.rows.join(' / ') || 'Rows',\r\n rowSpan: totalRows,\r\n align: 'left',\r\n colIndex: 0,\r\n });\r\n\r\n for (const node of columnTree) appendHeaderNode(rows, node, 0, groupRows, spec.values.length);\r\n\r\n if (showMeasureRow) {\r\n for (let leafIndex = 0; leafIndex < columnLeaves.length; leafIndex += 1) {\r\n for (let valueIndex = 0; valueIndex < spec.values.length; valueIndex += 1) {\r\n rows[totalRows - 1].push({\r\n title: spec.values[valueIndex].label ?? spec.values[valueIndex].field,\r\n align: 'right',\r\n colIndex: 1 + leafIndex * spec.values.length + valueIndex,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n\r\n\r\nfunction buildFlatMatrixHeaderRows(columnLeaves: readonly PivotHeaderNode[], spec: MatrixSpec): HeaderCell[][] {\r\n const showMeasureRow = spec.values.length > 1;\r\n const rows: HeaderCell[][] = [[], ...(showMeasureRow ? [[]] : [])];\r\n rows[0].push({\r\n title: spec.rows.join(' / ') || 'Rows',\r\n rowSpan: showMeasureRow ? 2 : 1,\r\n align: 'left',\r\n colIndex: 0,\r\n });\r\n columnLeaves.forEach((leaf, leafIndex) => {\r\n rows[0].push({\r\n title: leaf.path.join(' / ') || leaf.key,\r\n colSpan: spec.values.length,\r\n align: 'center',\r\n colIndex: showMeasureRow ? undefined : 1 + leafIndex,\r\n });\r\n if (showMeasureRow) {\r\n spec.values.forEach((value, valueIndex) =>\r\n rows[1].push({\r\n title: value.label ?? value.field,\r\n align: 'right',\r\n colIndex: 1 + leafIndex * spec.values.length + valueIndex,\r\n }),\r\n );\r\n }\r\n });\r\n return rows;\r\n}\r\n\r\nfunction appendHeaderNode(\r\n rows: HeaderCell[][],\r\n node: PivotHeaderNode,\r\n depth: number,\r\n groupRows: number,\r\n valueCount: number,\r\n): void {\r\n const isLeaf = node.children.length === 0;\r\n rows[depth].push({\r\n title: node.key,\r\n colSpan: node.span * valueCount,\r\n rowSpan: isLeaf ? groupRows - depth : 1,\r\n align: 'center',\r\n });\r\n for (const child of node.children) appendHeaderNode(rows, child, depth + 1, groupRows, valueCount);\r\n}\r\n\r\nfunction maxDepth(nodes: readonly PivotHeaderNode[]): number {\r\n let depth = 0;\r\n for (const node of nodes) {\r\n depth = Math.max(depth, node.depth, maxDepth(node.children));\r\n }\r\n return depth;\r\n}\r\n","/**\r\n * Zero-dependency, themed DOM control toolkit for slicer visuals.\r\n *\r\n * Slicers (dropdown / search / list / range / dateRange) are *interactive* DOM\r\n * widgets rather than canvas marks, so — like the table renderer — they live in\r\n * the surface's HTML `overlay`. That overlay is `pointer-events:none` by default\r\n * (so canvas charts get raw pointer events); every slicer therefore mounts a\r\n * host whose `pointerEvents` is restored to `auto`.\r\n *\r\n * The kit is intentionally small and self-contained: native focusable inputs for\r\n * accessibility, inline styles from {@link ThemeTokens} (no global stylesheet),\r\n * and a hand-rolled dual-thumb range slider (no `<input type=range>` because its\r\n * thumb can't be themed without a stylesheet). All factories return real\r\n * elements the caller wires up.\r\n */\r\n\r\nimport type { Surface } from './surface';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { Rect, Size } from '../types';\r\nimport { fontString } from './text';\r\nimport { CHROME_PAD, resolveTitle } from '../charts/chrome';\r\n\r\n/** A mounted slicer frame: an interactive host with a header and a body. */\r\nexport interface SlicerShell {\r\n /** The pointer-enabled host filling the surface (appended to the overlay). */\r\n host: HTMLDivElement;\r\n /** The scrollable body where the control's guts go. */\r\n body: HTMLDivElement;\r\n /** Set/replace the right-aligned clear (\"×\") affordance in the header. */\r\n setClear(onClear: (() => void) | null): void;\r\n}\r\n\r\n/**\r\n * Mount a standard slicer frame into the overlay: a titled, padded, pointer-\r\n * enabled card with an optional label/clear header and a flexible body. The\r\n * header shows the slicer's `title` (falling back to `label`); a clear button is\r\n * added on demand via {@link SlicerShell.setClear}.\r\n */\r\nexport function mountSlicerShell(\r\n surface: Surface,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n opts: { title?: unknown; label?: string } = {},\r\n): SlicerShell {\r\n const c = tokens.color;\r\n const host = document.createElement('div');\r\n Object.assign(host.style, {\r\n position: 'absolute',\r\n left: '0',\r\n top: '0',\r\n width: `${size.width}px`,\r\n height: `${size.height}px`,\r\n boxSizing: 'border-box',\r\n padding: `${CHROME_PAD.top}px ${CHROME_PAD.right}px ${CHROME_PAD.bottom}px ${CHROME_PAD.left}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: `${tokens.spacing.sm}px`,\r\n pointerEvents: 'auto',\r\n color: c.text,\r\n font: fontString(tokens.font.size.base, tokens.font.family, tokens.font.weight.normal),\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const title = resolveTitle(opts.title);\r\n const labelText = title.text ?? opts.label;\r\n\r\n const header = document.createElement('div');\r\n Object.assign(header.style, {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n justifyContent: 'space-between',\r\n gap: `${tokens.spacing.sm}px`,\r\n flex: '0 0 auto',\r\n minHeight: '0',\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const labelEl = document.createElement('div');\r\n labelEl.textContent = labelText ?? '';\r\n Object.assign(labelEl.style, {\r\n font: fontString(\r\n title.text ? tokens.font.size.large : tokens.font.size.small,\r\n tokens.font.family,\r\n title.text ? tokens.font.weight.bold : tokens.font.weight.medium,\r\n ),\r\n color: title.text ? c.text : c.textMuted,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n } as Partial<CSSStyleDeclaration>);\r\n if (title.subtitle) labelEl.title = title.subtitle;\r\n\r\n const clearSlot = document.createElement('div');\r\n clearSlot.style.flex = '0 0 auto';\r\n\r\n header.appendChild(labelEl);\r\n header.appendChild(clearSlot);\r\n\r\n const body = document.createElement('div');\r\n Object.assign(body.style, {\r\n flex: '1 1 auto',\r\n minHeight: '0',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: `${tokens.spacing.xs}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n if (labelText) host.appendChild(header);\r\n host.appendChild(body);\r\n surface.overlay.appendChild(host);\r\n\r\n return {\r\n host,\r\n body,\r\n setClear(onClear) {\r\n clearSlot.replaceChildren();\r\n if (!onClear) return;\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.textContent = 'Clear';\r\n btn.setAttribute('aria-label', 'Clear selection');\r\n Object.assign(btn.style, {\r\n appearance: 'none',\r\n border: 'none',\r\n background: 'transparent',\r\n color: c.accent,\r\n cursor: 'pointer',\r\n padding: '0',\r\n font: fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.medium),\r\n } as Partial<CSSStyleDeclaration>);\r\n btn.addEventListener('click', onClear);\r\n clearSlot.appendChild(btn);\r\n },\r\n };\r\n}\r\n\r\n/** Common visual reset + focus ring shared by inputs and buttons. */\r\nfunction applyFieldStyle(el: HTMLElement, tokens: ThemeTokens): void {\r\n const c = tokens.color;\r\n Object.assign(el.style, {\r\n appearance: 'none',\r\n boxSizing: 'border-box',\r\n width: '100%',\r\n background: c.background,\r\n color: c.text,\r\n border: `1px solid ${c.border}`,\r\n borderRadius: `${tokens.radius.md}px`,\r\n padding: `${tokens.spacing.xs + 2}px ${tokens.spacing.sm}px`,\r\n font: fontString(tokens.font.size.base, tokens.font.family, tokens.font.weight.normal),\r\n outline: 'none',\r\n } as Partial<CSSStyleDeclaration>);\r\n el.addEventListener('focus', () => {\r\n el.style.borderColor = c.accent;\r\n el.style.boxShadow = `0 0 0 2px ${withAlpha(c.accent, 0.25)}`;\r\n });\r\n el.addEventListener('blur', () => {\r\n el.style.borderColor = c.border;\r\n el.style.boxShadow = 'none';\r\n });\r\n}\r\n\r\n/** A themed single-line text input. */\r\nexport function makeTextInput(\r\n tokens: ThemeTokens,\r\n opts: { placeholder?: string; value?: string; type?: string } = {},\r\n): HTMLInputElement {\r\n const input = document.createElement('input');\r\n input.type = opts.type ?? 'text';\r\n if (opts.placeholder) input.placeholder = opts.placeholder;\r\n if (opts.value != null) input.value = opts.value;\r\n applyFieldStyle(input, tokens);\r\n return input;\r\n}\r\n\r\n/**\r\n * A themed \"select\" trigger (the closed dropdown button). It looks like a field\r\n * and shows a caret; the caller opens a popover on click.\r\n */\r\nexport function makeSelectButton(tokens: ThemeTokens, label: string): HTMLButtonElement {\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n applyFieldStyle(btn, tokens);\r\n Object.assign(btn.style, {\r\n cursor: 'pointer',\r\n textAlign: 'left',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: `${tokens.spacing.sm}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n const text = document.createElement('span');\r\n text.textContent = label;\r\n Object.assign(text.style, {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n } as Partial<CSSStyleDeclaration>);\r\n const caret = document.createElement('span');\r\n caret.textContent = '▾';\r\n caret.style.color = tokens.color.textMuted;\r\n caret.style.flex = '0 0 auto';\r\n btn.appendChild(text);\r\n btn.appendChild(caret);\r\n return btn;\r\n}\r\n\r\n/** A themed floating popover surface (for dropdown menus). */\r\nexport function makePopover(tokens: ThemeTokens): HTMLDivElement {\r\n const c = tokens.color;\r\n const pop = document.createElement('div');\r\n Object.assign(pop.style, {\r\n position: 'absolute',\r\n zIndex: '20',\r\n background: c.surface,\r\n border: `1px solid ${c.border}`,\r\n borderRadius: `${tokens.radius.md}px`,\r\n boxShadow: tokens.dark\r\n ? '0 8px 24px rgba(0,0,0,0.5)'\r\n : '0 8px 24px rgba(15,23,42,0.16)',\r\n padding: `${tokens.spacing.xs}px`,\r\n overflowY: 'auto',\r\n pointerEvents: 'auto',\r\n } as Partial<CSSStyleDeclaration>);\r\n return pop;\r\n}\r\n\r\n/** One selectable row inside a popover/list. Returns the row element. */\r\nexport function makeOptionRow(\r\n tokens: ThemeTokens,\r\n opts: {\r\n label: string;\r\n selected: boolean;\r\n checkbox?: boolean;\r\n onToggle: () => void;\r\n },\r\n): HTMLElement {\r\n const c = tokens.color;\r\n const row = document.createElement(opts.checkbox ? 'label' : 'div');\r\n Object.assign(row.style, {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: `${tokens.spacing.sm}px`,\r\n padding: `${tokens.spacing.xs + 1}px ${tokens.spacing.sm}px`,\r\n borderRadius: `${tokens.radius.sm}px`,\r\n cursor: 'pointer',\r\n color: c.text,\r\n whiteSpace: 'nowrap',\r\n userSelect: 'none',\r\n } as Partial<CSSStyleDeclaration>);\r\n row.addEventListener('mouseenter', () => {\r\n row.style.background = withAlpha(c.accent, tokens.dark ? 0.18 : 0.1);\r\n });\r\n row.addEventListener('mouseleave', () => {\r\n row.style.background = opts.selected && !opts.checkbox ? withAlpha(c.accent, 0.14) : 'transparent';\r\n });\r\n\r\n if (opts.checkbox) {\r\n const box = document.createElement('input');\r\n box.type = 'checkbox';\r\n box.checked = opts.selected;\r\n box.style.accentColor = c.accent;\r\n box.style.flex = '0 0 auto';\r\n box.style.margin = '0';\r\n box.addEventListener('change', () => opts.onToggle());\r\n row.appendChild(box);\r\n } else {\r\n row.setAttribute('role', 'option');\r\n row.setAttribute('aria-selected', String(opts.selected));\r\n if (opts.selected) row.style.background = withAlpha(c.accent, 0.14);\r\n row.addEventListener('click', () => opts.onToggle());\r\n }\r\n\r\n const text = document.createElement('span');\r\n text.textContent = opts.label;\r\n Object.assign(text.style, {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n } as Partial<CSSStyleDeclaration>);\r\n row.appendChild(text);\r\n return row;\r\n}\r\n\r\n/** A small pill button used for relative presets (e.g. \"Last 7 days\"). */\r\nexport function makeChip(tokens: ThemeTokens, label: string, active = false): HTMLButtonElement {\r\n const c = tokens.color;\r\n const chip = document.createElement('button');\r\n chip.type = 'button';\r\n chip.textContent = label;\r\n Object.assign(chip.style, {\r\n appearance: 'none',\r\n cursor: 'pointer',\r\n borderRadius: `${tokens.radius.sm}px`,\r\n border: `1px solid ${active ? c.accent : c.border}`,\r\n background: active ? withAlpha(c.accent, 0.16) : 'transparent',\r\n color: active ? c.accent : c.textMuted,\r\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\r\n font: fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.medium),\r\n whiteSpace: 'nowrap',\r\n } as Partial<CSSStyleDeclaration>);\r\n return chip;\r\n}\r\n\r\nexport interface DualSlider {\r\n /** The slider element to append. */\r\n el: HTMLDivElement;\r\n /** Programmatically set the thumbs (does not fire `onChange`). */\r\n set(low: number, high: number): void;\r\n}\r\n\r\n/**\r\n * A hand-rolled dual-thumb range slider over `[min, max]`. Thumbs are focusable\r\n * (`role=slider`, arrow-key steppable) and drag with a pointer; `onInput` fires\r\n * continuously (for live labels), `onChange` on release / keypress (to publish).\r\n * `format` renders the live value labels above the thumbs.\r\n */\r\nexport function makeDualSlider(\r\n tokens: ThemeTokens,\r\n opts: {\r\n min: number;\r\n max: number;\r\n step?: number;\r\n low: number;\r\n high: number;\r\n format?: (v: number) => string;\r\n onInput?: (low: number, high: number) => void;\r\n onChange: (low: number, high: number) => void;\r\n },\r\n): DualSlider {\r\n const c = tokens.color;\r\n const span = Math.max(1e-9, opts.max - opts.min);\r\n const step = opts.step && opts.step > 0 ? opts.step : span / 100;\r\n const fmt = opts.format ?? ((v: number) => String(Math.round(v)));\r\n let low = clamp(opts.low, opts.min, opts.max);\r\n let high = clamp(opts.high, low, opts.max);\r\n\r\n const wrap = document.createElement('div');\r\n Object.assign(wrap.style, {\r\n position: 'relative',\r\n width: '100%',\r\n paddingTop: `${tokens.font.size.small + 6}px`,\r\n height: `${tokens.font.size.small + 6 + 18}px`,\r\n boxSizing: 'border-box',\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const track = document.createElement('div');\r\n Object.assign(track.style, {\r\n position: 'absolute',\r\n left: '8px',\r\n right: '8px',\r\n top: `${tokens.font.size.small + 6 + 7}px`,\r\n height: '4px',\r\n borderRadius: '2px',\r\n background: c.border,\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const fill = document.createElement('div');\r\n Object.assign(fill.style, {\r\n position: 'absolute',\r\n top: '0',\r\n height: '4px',\r\n borderRadius: '2px',\r\n background: c.accent,\r\n } as Partial<CSSStyleDeclaration>);\r\n track.appendChild(fill);\r\n\r\n const labels = document.createElement('div');\r\n Object.assign(labels.style, {\r\n position: 'absolute',\r\n left: '0',\r\n right: '0',\r\n top: '0',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n font: fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.medium),\r\n color: c.textMuted,\r\n } as Partial<CSSStyleDeclaration>);\r\n const lowLabel = document.createElement('span');\r\n const highLabel = document.createElement('span');\r\n labels.appendChild(lowLabel);\r\n labels.appendChild(highLabel);\r\n\r\n const makeThumb = (label: string): HTMLDivElement => {\r\n const t = document.createElement('div');\r\n t.tabIndex = 0;\r\n t.setAttribute('role', 'slider');\r\n t.setAttribute('aria-label', label);\r\n t.setAttribute('aria-valuemin', String(opts.min));\r\n t.setAttribute('aria-valuemax', String(opts.max));\r\n Object.assign(t.style, {\r\n position: 'absolute',\r\n top: `${tokens.font.size.small + 6 + 1}px`,\r\n width: '16px',\r\n height: '16px',\r\n marginLeft: '-8px',\r\n borderRadius: '50%',\r\n background: c.background,\r\n border: `2px solid ${c.accent}`,\r\n boxShadow: tokens.dark ? '0 1px 3px rgba(0,0,0,0.6)' : '0 1px 3px rgba(15,23,42,0.25)',\r\n cursor: 'pointer',\r\n touchAction: 'none',\r\n outline: 'none',\r\n } as Partial<CSSStyleDeclaration>);\r\n t.addEventListener('focus', () => {\r\n t.style.boxShadow = `0 0 0 3px ${withAlpha(c.accent, 0.3)}`;\r\n });\r\n t.addEventListener('blur', () => {\r\n t.style.boxShadow = tokens.dark ? '0 1px 3px rgba(0,0,0,0.6)' : '0 1px 3px rgba(15,23,42,0.25)';\r\n });\r\n return t;\r\n };\r\n\r\n const thumbLow = makeThumb('Minimum');\r\n const thumbHigh = makeThumb('Maximum');\r\n\r\n wrap.appendChild(track);\r\n wrap.appendChild(labels);\r\n wrap.appendChild(thumbLow);\r\n wrap.appendChild(thumbHigh);\r\n\r\n const pct = (v: number): number => ((v - opts.min) / span) * 100;\r\n const paint = (): void => {\r\n const lo = pct(low);\r\n const hi = pct(high);\r\n thumbLow.style.left = thumbLeftCss(lo);\r\n thumbHigh.style.left = thumbLeftCss(hi);\r\n fill.style.left = `${lo}%`;\r\n fill.style.width = `${Math.max(0, hi - lo)}%`;\r\n lowLabel.textContent = fmt(low);\r\n highLabel.textContent = fmt(high);\r\n thumbLow.setAttribute('aria-valuenow', String(low));\r\n thumbHigh.setAttribute('aria-valuenow', String(high));\r\n };\r\n paint();\r\n\r\n const quantize = (v: number): number => {\r\n const snapped = Math.round((v - opts.min) / step) * step + opts.min;\r\n return clamp(snapped, opts.min, opts.max);\r\n };\r\n\r\n const dragThumb = (which: 'low' | 'high', startEvent: PointerEvent): void => {\r\n startEvent.preventDefault();\r\n const rect = track.getBoundingClientRect();\r\n const move = (e: PointerEvent): void => {\r\n const ratio = rect.width <= 0 ? 0 : (e.clientX - rect.left) / rect.width;\r\n const v = quantize(opts.min + ratio * span);\r\n if (which === 'low') low = clamp(v, opts.min, high);\r\n else high = clamp(v, low, opts.max);\r\n paint();\r\n opts.onInput?.(low, high);\r\n };\r\n const up = (): void => {\r\n window.removeEventListener('pointermove', move);\r\n window.removeEventListener('pointerup', up);\r\n opts.onChange(low, high);\r\n };\r\n window.addEventListener('pointermove', move);\r\n window.addEventListener('pointerup', up);\r\n };\r\n\r\n thumbLow.addEventListener('pointerdown', (e) => dragThumb('low', e));\r\n thumbHigh.addEventListener('pointerdown', (e) => dragThumb('high', e));\r\n\r\n const key = (which: 'low' | 'high') => (e: KeyboardEvent): void => {\r\n const dir = e.key === 'ArrowRight' || e.key === 'ArrowUp' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowDown' ? -1 : 0;\r\n if (dir === 0) return;\r\n e.preventDefault();\r\n if (which === 'low') low = clamp(quantize(low + dir * step), opts.min, high);\r\n else high = clamp(quantize(high + dir * step), low, opts.max);\r\n paint();\r\n opts.onInput?.(low, high);\r\n opts.onChange(low, high);\r\n };\r\n thumbLow.addEventListener('keydown', key('low'));\r\n thumbHigh.addEventListener('keydown', key('high'));\r\n\r\n return {\r\n el: wrap,\r\n set(nextLow, nextHigh) {\r\n low = clamp(nextLow, opts.min, opts.max);\r\n high = clamp(nextHigh, low, opts.max);\r\n paint();\r\n },\r\n };\r\n}\r\n\r\n/** Place an absolutely-positioned popover under `anchor`, clamped to `host`. */\r\nexport function positionPopover(pop: HTMLDivElement, anchor: HTMLElement, host: HTMLElement): void {\r\n const a = anchor.getBoundingClientRect();\r\n const h = host.getBoundingClientRect();\r\n pop.style.left = `${a.left - h.left}px`;\r\n pop.style.top = `${a.bottom - h.top + 4}px`;\r\n pop.style.width = `${a.width}px`;\r\n const maxH = Math.max(80, h.bottom - a.bottom - 8);\r\n pop.style.maxHeight = `${maxH}px`;\r\n}\r\n\r\nfunction clamp(v: number, lo: number, hi: number): number {\r\n return v < lo ? lo : v > hi ? hi : v;\r\n}\r\n\r\n/**\r\n * CSS `left` for a dual-slider thumb whose center sits at `pct` (0–100) along a\r\n * track inset 8px on each side; the 16px thumb is centered via `marginLeft:-8px`.\r\n *\r\n * The multiplier MUST be a unitless `<number>` — `calc(<percentage> * <length>)`\r\n * is invalid CSS and would be silently dropped, collapsing both thumbs to the\r\n * left edge (so the slider appears to have a single handle). Exported so this\r\n * contract can be unit-tested without a DOM.\r\n */\r\nexport function thumbLeftCss(pct: number): string {\r\n const fraction = clamp(pct, 0, 100) / 100;\r\n return `calc(8px + ${fraction} * (100% - 16px))`;\r\n}\r\n\r\n/** Apply an alpha to a #rgb/#rrggbb color, returning an rgba() string. */\r\nexport function withAlpha(color: string, alpha: number): string {\r\n const hex = color.trim();\r\n const m3 = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(hex);\r\n const m6 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n if (m6) {\r\n r = parseInt(m6[1], 16);\r\n g = parseInt(m6[2], 16);\r\n b = parseInt(m6[3], 16);\r\n } else if (m3) {\r\n r = parseInt(m3[1] + m3[1], 16);\r\n g = parseInt(m3[2] + m3[2], 16);\r\n b = parseInt(m3[3] + m3[3], 16);\r\n } else {\r\n return color;\r\n }\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n}\r\n\r\nexport type { Rect };\r\n","/**\r\n * Shared helpers for slicer renderers.\r\n *\r\n * Slicers are {@link CustomRenderer}s that publish a {@link SelectionValue} to a\r\n * named param on the shared store. These helpers resolve the param name, the\r\n * unfiltered option source, and the current value, and centralize publishing so\r\n * every slicer behaves consistently.\r\n */\r\n\r\nimport type { Datum } from '../../types';\r\nimport type { RenderContext } from '../index';\r\nimport type { BaseSlicerSpec } from '../../spec/types';\r\nimport type { SelectionValue } from '../../spec/selection';\r\nimport { uniqueValues } from '../../util/data';\r\n\r\n/** The param a slicer publishes to: explicit `param`, else the field name. */\r\nexport function slicerParam(spec: BaseSlicerSpec): string {\r\n return spec.param ?? spec.field;\r\n}\r\n\r\n/** The accessible/display label for a slicer's control. */\r\nexport function slicerLabel(spec: BaseSlicerSpec): string {\r\n if (spec.label) return spec.label;\r\n if (typeof spec.title === 'string') return spec.title;\r\n if (spec.title && typeof spec.title === 'object' && spec.title.text) return spec.title.text;\r\n return spec.field;\r\n}\r\n\r\n/**\r\n * The rows a slicer derives its options/bounds from — always the *unfiltered*\r\n * source so the slicer doesn't hide its own choices (or collapse its range) by\r\n * filtering itself. Falls back to the spec's own data when no context is given.\r\n */\r\nexport function slicerSource(spec: BaseSlicerSpec, context?: RenderContext): Datum[] {\r\n return context?.sourceData ?? spec.data ?? [];\r\n}\r\n\r\n/** Distinct values of the slicer's field, in first-seen order. */\r\nexport function slicerOptions(spec: BaseSlicerSpec, context?: RenderContext): unknown[] {\r\n return uniqueValues(slicerSource(spec, context), spec.field);\r\n}\r\n\r\n/** The slicer's current published value (from the store), or null. */\r\nexport function currentValue(spec: BaseSlicerSpec, context?: RenderContext): SelectionValue | null {\r\n return context?.store?.get(slicerParam(spec)) ?? null;\r\n}\r\n\r\n/** Publish a new value to the slicer's param (null clears it). */\r\nexport function publish(\r\n spec: BaseSlicerSpec,\r\n context: RenderContext | undefined,\r\n value: SelectionValue | null,\r\n): void {\r\n context?.store?.set(slicerParam(spec), value);\r\n}\r\n\r\n/** Render a small notice when a slicer is misconfigured or has no options. */\r\nexport function emptyNotice(host: HTMLElement, message: string, color: string): void {\r\n const note = document.createElement('div');\r\n note.textContent = message;\r\n note.style.color = color;\r\n note.style.fontStyle = 'italic';\r\n host.appendChild(note);\r\n}\r\n","/**\r\n * Dropdown slicer — single or multi select of a field's distinct values.\r\n *\r\n * Emits a `set` selection (`{ field, values }`) and auto-wires to any visual\r\n * filtering/highlighting on its param. A closed trigger summarizes the choice;\r\n * clicking opens a themed popover of options.\r\n */\r\n\r\nimport type { Surface } from '../../render/surface';\r\nimport type { Size } from '../../types';\r\nimport type { ChartSpec, DropdownSlicerSpec } from '../../spec/types';\r\nimport type { ThemeTokens } from '../../theme';\r\nimport type { SetSelection } from '../../spec/selection';\r\nimport type { RenderContext } from '../index';\r\nimport {\r\n makeOptionRow,\r\n makePopover,\r\n makeSelectButton,\r\n mountSlicerShell,\r\n positionPopover,\r\n} from '../../render/controls';\r\nimport { formatValue } from '../../format';\r\nimport { toKey } from '../../util/data';\r\nimport {\r\n currentValue,\r\n publish,\r\n slicerLabel,\r\n slicerOptions,\r\n} from './common';\r\n\r\nexport function drawDropdown(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const s = spec as DropdownSlicerSpec;\r\n const shell = mountSlicerShell(surface, tokens, size, {\r\n title: s.title,\r\n label: slicerLabel(s),\r\n });\r\n\r\n const options = slicerOptions(s, context);\r\n const display = (v: unknown): string => formatValue(v, undefined) || '—';\r\n const placeholder = s.placeholder ?? (s.multiple ? 'Any' : 'All');\r\n\r\n const current = currentValue(s, context) as SetSelection | null;\r\n const selected = new Set((current?.kind === 'set' ? current.values : []).map((v) => toKey(v)));\r\n\r\n const summary = (): string => {\r\n if (selected.size === 0) return placeholder;\r\n const picks = options.filter((o) => selected.has(toKey(o)));\r\n if (picks.length === 1) return display(picks[0]);\r\n if (s.multiple) return `${picks.length} selected`;\r\n return display(picks[0]);\r\n };\r\n\r\n const trigger = makeSelectButton(tokens, summary());\r\n shell.body.appendChild(trigger);\r\n\r\n const refreshChrome = (): void => {\r\n (trigger.firstChild as HTMLElement).textContent = summary();\r\n shell.setClear(selected.size ? clearAll : null);\r\n };\r\n\r\n const emit = (): void => {\r\n const values = options.filter((o) => selected.has(toKey(o)));\r\n publish(s, context, values.length ? { kind: 'set', field: s.field, values } : null);\r\n refreshChrome();\r\n };\r\n\r\n const clearAll = (): void => {\r\n selected.clear();\r\n closeMenu();\r\n emit();\r\n };\r\n\r\n let pop: HTMLDivElement | null = null;\r\n const closeMenu = (): void => {\r\n if (pop) {\r\n pop.remove();\r\n pop = null;\r\n document.removeEventListener('pointerdown', onOutside, true);\r\n }\r\n };\r\n const onOutside = (e: PointerEvent): void => {\r\n if (pop && !pop.contains(e.target as Node) && !trigger.contains(e.target as Node)) closeMenu();\r\n };\r\n\r\n const openMenu = (): void => {\r\n if (pop) {\r\n closeMenu();\r\n return;\r\n }\r\n pop = makePopover(tokens);\r\n for (const opt of options) {\r\n const key = toKey(opt);\r\n const row = makeOptionRow(tokens, {\r\n label: display(opt),\r\n selected: selected.has(key),\r\n checkbox: s.multiple === true,\r\n onToggle: () => {\r\n if (s.multiple) {\r\n if (selected.has(key)) selected.delete(key);\r\n else selected.add(key);\r\n emit();\r\n } else {\r\n // Single-select: clicking the active option clears it.\r\n if (selected.has(key) && selected.size === 1) selected.clear();\r\n else {\r\n selected.clear();\r\n selected.add(key);\r\n }\r\n emit();\r\n closeMenu();\r\n }\r\n },\r\n });\r\n pop.appendChild(row);\r\n }\r\n shell.host.appendChild(pop);\r\n positionPopover(pop, trigger, shell.host);\r\n document.addEventListener('pointerdown', onOutside, true);\r\n };\r\n\r\n trigger.addEventListener('click', openMenu);\r\n refreshChrome();\r\n}\r\n","/**\r\n * Search slicer — a debounced, case-insensitive substring filter over a field.\r\n *\r\n * Emits a `text` selection (`{ field, query }`). Typing is debounced before\r\n * publishing so consumers aren't re-filtered on every keystroke; the input keeps\r\n * focus because the runtime does not redraw a slicer on its own param change.\r\n */\r\n\r\nimport type { Surface } from '../../render/surface';\r\nimport type { Size } from '../../types';\r\nimport type { ChartSpec, SearchSlicerSpec } from '../../spec/types';\r\nimport type { ThemeTokens } from '../../theme';\r\nimport type { TextSelection } from '../../spec/selection';\r\nimport type { RenderContext } from '../index';\r\nimport { makeTextInput, mountSlicerShell } from '../../render/controls';\r\nimport { currentValue, publish, slicerLabel } from './common';\r\n\r\nexport function drawSearch(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const s = spec as SearchSlicerSpec;\r\n const shell = mountSlicerShell(surface, tokens, size, {\r\n title: s.title,\r\n label: slicerLabel(s),\r\n });\r\n\r\n const current = currentValue(s, context) as TextSelection | null;\r\n const initial = current?.kind === 'text' ? current.query : '';\r\n const input = makeTextInput(tokens, {\r\n type: 'search',\r\n placeholder: s.placeholder ?? `Search ${s.field}…`,\r\n value: initial,\r\n });\r\n input.setAttribute('aria-label', slicerLabel(s));\r\n shell.body.appendChild(input);\r\n\r\n const debounceMs = typeof s.debounce === 'number' && s.debounce >= 0 ? s.debounce : 200;\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const emit = (query: string): void => {\r\n const trimmed = query.trim();\r\n publish(s, context, trimmed ? { kind: 'text', field: s.field, query: trimmed } : null);\r\n shell.setClear(trimmed ? clear : null);\r\n };\r\n\r\n const clear = (): void => {\r\n input.value = '';\r\n if (timer) clearTimeout(timer);\r\n emit('');\r\n input.focus();\r\n };\r\n\r\n input.addEventListener('input', () => {\r\n if (timer) clearTimeout(timer);\r\n const value = input.value;\r\n timer = setTimeout(() => emit(value), debounceMs);\r\n });\r\n // Enter publishes immediately (skip the debounce).\r\n input.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter') {\r\n if (timer) clearTimeout(timer);\r\n emit(input.value);\r\n }\r\n });\r\n\r\n shell.setClear(initial ? clear : null);\r\n}\r\n","/**\r\n * List slicer — a scrollable checkbox list of a field's distinct values.\r\n *\r\n * Emits a `set` selection. For long lists it shows a \"search within\" box and a\r\n * \"Select all / Clear\" row. Multi-select by nature; toggling a box republishes\r\n * immediately.\r\n */\r\n\r\nimport type { Surface } from '../../render/surface';\r\nimport type { Size } from '../../types';\r\nimport type { ChartSpec, ListSlicerSpec } from '../../spec/types';\r\nimport type { ThemeTokens } from '../../theme';\r\nimport type { SetSelection } from '../../spec/selection';\r\nimport type { RenderContext } from '../index';\r\nimport { makeOptionRow, makeTextInput, mountSlicerShell } from '../../render/controls';\r\nimport { fontString } from '../../render/text';\r\nimport { formatValue } from '../../format';\r\nimport { toKey } from '../../util/data';\r\nimport { currentValue, publish, slicerLabel, slicerOptions } from './common';\r\n\r\nexport function drawList(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const s = spec as ListSlicerSpec;\r\n const shell = mountSlicerShell(surface, tokens, size, {\r\n title: s.title,\r\n label: slicerLabel(s),\r\n });\r\n\r\n const options = slicerOptions(s, context);\r\n const display = (v: unknown): string => formatValue(v, undefined) || '—';\r\n const current = currentValue(s, context) as SetSelection | null;\r\n const selected = new Set((current?.kind === 'set' ? current.values : []).map((v) => toKey(v)));\r\n\r\n const emit = (): void => {\r\n const values = options.filter((o) => selected.has(toKey(o)));\r\n publish(s, context, values.length ? { kind: 'set', field: s.field, values } : null);\r\n shell.setClear(selected.size ? clearAll : null);\r\n };\r\n\r\n const clearAll = (): void => {\r\n selected.clear();\r\n emit();\r\n rebuild();\r\n };\r\n\r\n const threshold = typeof s.searchThreshold === 'number' ? s.searchThreshold : 8;\r\n let query = '';\r\n if (options.length > threshold) {\r\n const search = makeTextInput(tokens, { type: 'search', placeholder: 'Filter…' });\r\n search.setAttribute('aria-label', `Filter ${slicerLabel(s)} options`);\r\n search.style.flex = '0 0 auto';\r\n search.addEventListener('input', () => {\r\n query = search.value.trim().toLowerCase();\r\n rebuild();\r\n });\r\n shell.body.appendChild(search);\r\n }\r\n\r\n let toolbar: HTMLDivElement | null = null;\r\n if (s.selectAll !== false) {\r\n toolbar = document.createElement('div');\r\n Object.assign(toolbar.style, {\r\n display: 'flex',\r\n gap: `${tokens.spacing.md}px`,\r\n flex: '0 0 auto',\r\n font: fontString(tokens.font.size.small, tokens.font.family, tokens.font.weight.medium),\r\n } as Partial<CSSStyleDeclaration>);\r\n shell.body.appendChild(toolbar);\r\n }\r\n\r\n const listEl = document.createElement('div');\r\n Object.assign(listEl.style, {\r\n flex: '1 1 auto',\r\n minHeight: '0',\r\n overflowY: 'auto',\r\n border: `1px solid ${tokens.color.border}`,\r\n borderRadius: `${tokens.radius.md}px`,\r\n padding: `${tokens.spacing.xs}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n shell.body.appendChild(listEl);\r\n\r\n const visible = (): unknown[] =>\r\n query ? options.filter((o) => display(o).toLowerCase().includes(query)) : options;\r\n\r\n const linkButton = (label: string, onClick: () => void): HTMLButtonElement => {\r\n const b = document.createElement('button');\r\n b.type = 'button';\r\n b.textContent = label;\r\n Object.assign(b.style, {\r\n appearance: 'none',\r\n border: 'none',\r\n background: 'transparent',\r\n color: tokens.color.accent,\r\n cursor: 'pointer',\r\n padding: '0',\r\n font: 'inherit',\r\n } as Partial<CSSStyleDeclaration>);\r\n b.addEventListener('click', onClick);\r\n return b;\r\n };\r\n\r\n const rebuild = (): void => {\r\n const items = visible();\r\n if (toolbar) {\r\n toolbar.replaceChildren();\r\n toolbar.appendChild(\r\n linkButton('Select all', () => {\r\n for (const o of items) selected.add(toKey(o));\r\n emit();\r\n rebuild();\r\n }),\r\n );\r\n toolbar.appendChild(\r\n linkButton('Clear', () => {\r\n for (const o of items) selected.delete(toKey(o));\r\n emit();\r\n rebuild();\r\n }),\r\n );\r\n const count = document.createElement('span');\r\n count.style.marginLeft = 'auto';\r\n count.style.color = tokens.color.textMuted;\r\n count.textContent = selected.size ? `${selected.size} selected` : '';\r\n toolbar.appendChild(count);\r\n }\r\n\r\n listEl.replaceChildren();\r\n if (items.length === 0) {\r\n const none = document.createElement('div');\r\n none.textContent = 'No matches';\r\n none.style.color = tokens.color.textMuted;\r\n none.style.padding = `${tokens.spacing.xs}px ${tokens.spacing.sm}px`;\r\n listEl.appendChild(none);\r\n return;\r\n }\r\n for (const opt of items) {\r\n const key = toKey(opt);\r\n const row = makeOptionRow(tokens, {\r\n label: display(opt),\r\n selected: selected.has(key),\r\n checkbox: true,\r\n onToggle: () => {\r\n if (selected.has(key)) selected.delete(key);\r\n else selected.add(key);\r\n emit();\r\n if (toolbar) {\r\n const count = toolbar.lastChild as HTMLElement;\r\n count.textContent = selected.size ? `${selected.size} selected` : '';\r\n }\r\n },\r\n });\r\n listEl.appendChild(row);\r\n }\r\n };\r\n\r\n // Subtle hover is handled by makeOptionRow.\r\n rebuild();\r\n shell.setClear(selected.size ? clearAll : null);\r\n}\r\n","/**\r\n * Range slicer — a numeric min/max filter over a quantitative field.\r\n *\r\n * Emits a `range` selection (`{ field, min, max }`). Bounds default to the data\r\n * extent of `field`; a value spanning the full extent publishes nothing (i.e.\r\n * \"no constraint\"). Uses the dependency-free dual-thumb slider.\r\n */\r\n\r\nimport type { Surface } from '../../render/surface';\r\nimport type { Size } from '../../types';\r\nimport type { ChartSpec, RangeSlicerSpec } from '../../spec/types';\r\nimport type { ThemeTokens } from '../../theme';\r\nimport type { RangeSelection } from '../../spec/selection';\r\nimport type { RenderContext } from '../index';\r\nimport { makeDualSlider, mountSlicerShell } from '../../render/controls';\r\nimport { extent, toNumber } from '../../util/data';\r\nimport { formatValue } from '../../format';\r\nimport { currentValue, emptyNotice, publish, slicerLabel, slicerSource } from './common';\r\n\r\nexport function drawRange(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const s = spec as RangeSlicerSpec;\r\n const shell = mountSlicerShell(surface, tokens, size, {\r\n title: s.title,\r\n label: slicerLabel(s),\r\n });\r\n\r\n const dataExtent = extent(slicerSource(s, context), s.field);\r\n const min = s.min ?? dataExtent?.[0] ?? 0;\r\n const max = s.max ?? dataExtent?.[1] ?? 1;\r\n if (!(max > min)) {\r\n emptyNotice(shell.body, `No numeric range for \"${s.field}\".`, tokens.color.textMuted);\r\n return;\r\n }\r\n\r\n const current = currentValue(s, context) as RangeSelection | null;\r\n const low = current?.kind === 'range' && current.min != null ? toNumber(current.min) : min;\r\n const high = current?.kind === 'range' && current.max != null ? toNumber(current.max) : max;\r\n const fmt = (v: number): string => formatValue(v, s.format);\r\n\r\n const slider = makeDualSlider(tokens, {\r\n min,\r\n max,\r\n step: s.step,\r\n low: Number.isNaN(low) ? min : low,\r\n high: Number.isNaN(high) ? max : high,\r\n format: fmt,\r\n onChange: (lo, hi) => emit(lo, hi),\r\n });\r\n shell.body.appendChild(slider.el);\r\n\r\n const emit = (lo: number, hi: number): void => {\r\n // A range covering the full extent is \"no constraint\".\r\n const constrained = lo > min || hi < max;\r\n publish(\r\n s,\r\n context,\r\n constrained ? { kind: 'range', field: s.field, min: lo, max: hi } : null,\r\n );\r\n shell.setClear(constrained ? clear : null);\r\n };\r\n\r\n const clear = (): void => {\r\n slider.set(min, max);\r\n emit(min, max);\r\n };\r\n\r\n const active = (current?.kind === 'range') && (low > min || high < max);\r\n shell.setClear(active ? clear : null);\r\n}\r\n","/**\r\n * Date-range slicer — a temporal min/max filter with relative presets.\r\n *\r\n * Emits a `range` selection whose bounds are ISO date strings (`YYYY-MM-DD`), so\r\n * the value stays JSON-friendly and round-trips through the predicate engine\r\n * (which parses date strings). Presets (\"Last 7 / 30 / 90 days\") set the range\r\n * relative to the data's latest date.\r\n */\r\n\r\nimport type { Surface } from '../../render/surface';\r\nimport type { Size } from '../../types';\r\nimport type { ChartSpec, DateRangeSlicerSpec } from '../../spec/types';\r\nimport type { ThemeTokens } from '../../theme';\r\nimport type { RangeSelection } from '../../spec/selection';\r\nimport type { RenderContext } from '../index';\r\nimport { makeChip, makeDualSlider, mountSlicerShell } from '../../render/controls';\r\nimport { toDate } from '../../util/data';\r\nimport { formatValue } from '../../format';\r\nimport { currentValue, emptyNotice, publish, slicerLabel, slicerSource } from './common';\r\n\r\nconst DAY_MS = 86_400_000;\r\n\r\nfunction dateExtent(rows: readonly Record<string, unknown>[], field: string): [number, number] | null {\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (const row of rows) {\r\n const d = toDate(row[field]);\r\n if (!d) continue;\r\n const t = d.getTime();\r\n if (t < min) min = t;\r\n if (t > max) max = t;\r\n }\r\n return min === Infinity ? null : [min, max];\r\n}\r\n\r\n/** Epoch ms → local `YYYY-MM-DD` (matches `toDate`'s local parsing of bare ISO). */\r\nfunction toISODate(ms: number): string {\r\n const d = new Date(ms);\r\n const y = d.getFullYear();\r\n const m = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${y}-${m}-${day}`;\r\n}\r\n\r\nexport function drawDateRange(\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n): void {\r\n const s = spec as DateRangeSlicerSpec;\r\n const shell = mountSlicerShell(surface, tokens, size, {\r\n title: s.title,\r\n label: slicerLabel(s),\r\n });\r\n\r\n const ext = dateExtent(slicerSource(s, context) as Record<string, unknown>[], s.field);\r\n if (!ext || !(ext[1] > ext[0])) {\r\n emptyNotice(shell.body, `No date range for \"${s.field}\".`, tokens.color.textMuted);\r\n return;\r\n }\r\n const [min, max] = ext;\r\n\r\n const current = currentValue(s, context) as RangeSelection | null;\r\n const toMs = (v: number | string | undefined, fallback: number): number => {\r\n if (v == null) return fallback;\r\n const d = toDate(v);\r\n return d ? d.getTime() : fallback;\r\n };\r\n let low = current?.kind === 'range' ? toMs(current.min, min) : min;\r\n let high = current?.kind === 'range' ? toMs(current.max, max) : max;\r\n\r\n const fmt = (v: number): string => {\r\n // Snap to local midnight before formatting: stepping in epoch-ms can land a\r\n // day on 01:00 after the spring DST shift, which would otherwise render a\r\n // spurious time component. The emitted value (toISODate) is already local\r\n // Y-M-D, so this keeps the label consistent with what gets published.\r\n const d = new Date(v);\r\n return formatValue(new Date(d.getFullYear(), d.getMonth(), d.getDate()), s.format);\r\n };\r\n\r\n const slider = makeDualSlider(tokens, {\r\n min,\r\n max,\r\n step: DAY_MS,\r\n low,\r\n high,\r\n format: fmt,\r\n onChange: (lo, hi) => emit(lo, hi),\r\n });\r\n\r\n const emit = (lo: number, hi: number): void => {\r\n low = lo;\r\n high = hi;\r\n const constrained = lo > min || hi < max;\r\n publish(\r\n s,\r\n context,\r\n constrained ? { kind: 'range', field: s.field, min: toISODate(lo), max: toISODate(hi) } : null,\r\n );\r\n shell.setClear(constrained ? clear : null);\r\n };\r\n\r\n const clear = (): void => {\r\n slider.set(min, max);\r\n emit(min, max);\r\n };\r\n\r\n if (s.presets !== false) {\r\n const presets = document.createElement('div');\r\n Object.assign(presets.style, {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: `${tokens.spacing.xs}px`,\r\n flex: '0 0 auto',\r\n } as Partial<CSSStyleDeclaration>);\r\n const setRange = (lo: number, hi: number): void => {\r\n slider.set(lo, hi);\r\n emit(lo, hi);\r\n };\r\n for (const days of [7, 30, 90]) {\r\n const chip = makeChip(tokens, `Last ${days}d`);\r\n chip.addEventListener('click', () => setRange(Math.max(min, max - days * DAY_MS), max));\r\n presets.appendChild(chip);\r\n }\r\n const all = makeChip(tokens, 'All');\r\n all.addEventListener('click', () => setRange(min, max));\r\n presets.appendChild(all);\r\n shell.body.appendChild(presets);\r\n }\r\n\r\n shell.body.appendChild(slider.el);\r\n\r\n const active = current?.kind === 'range' && (low > min || high < max);\r\n shell.setClear(active ? clear : null);\r\n}\r\n","/**\r\n * Chart registry.\r\n *\r\n * Cartesian charts (line/area/bar/scatter) consume a prebuilt `CartesianModel`\r\n * and only draw marks. Custom charts (heatmap/pie/kpi/table/matrix) own their\r\n * full layout and draw directly onto the surface. The runtime dispatches here.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { Datum, Size } from '../types';\r\nimport type { ChartSpec, ChartType } from '../spec/types';\r\nimport type { ThemeTokens } from '../theme';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport type { Emphasis, InteractionModel } from '../interaction/types';\r\nimport type { SelectionStore } from '../interaction/store';\r\nimport type { SelectionDef } from '../spec/selection';\r\nimport { drawLine } from './line';\r\nimport { drawArea } from './area';\r\nimport { drawBar } from './bar';\r\nimport { drawScatter } from './scatter';\r\nimport { drawBox, buildBoxInteraction } from './box';\r\nimport { drawHeatmap } from './heatmap';\r\nimport { drawPie } from './pie';\r\nimport { drawFunnel } from './funnel';\r\nimport { drawKpi } from './kpi';\r\nimport { drawSankey } from './sankey';\r\nimport { drawChoropleth } from './choropleth';\r\nimport { drawTable } from './table';\r\nimport { drawMatrix } from './matrix';\r\nimport { drawDropdown, drawSearch, drawList, drawRange, drawDateRange } from './slicers';\r\n\r\nexport type CartesianRenderer = (surface: Surface, model: CartesianModel) => void;\r\nexport type CartesianInteractionBuilder = (model: CartesianModel) => InteractionModel | void;\r\n\r\n/**\r\n * Optional per-frame interactivity context handed to custom renderers. Lets a\r\n * chart dim non-selected marks (`emphasis`), publish its own selection to the\r\n * shared bus (`store` + `param`/`def`), and request a redraw when its internal\r\n * state changes (slicers). All fields are optional — a renderer that ignores the\r\n * context behaves exactly as before.\r\n */\r\nexport interface RenderContext {\r\n /** Active highlight for this frame, or null when nothing is selected. */\r\n emphasis?: Emphasis | null;\r\n /** Shared selection bus when this chart is linked to others. */\r\n store?: SelectionStore;\r\n /** The param this chart publishes selections to (usually `spec.params[0]`). */\r\n param?: string;\r\n /** The selection definition backing `param`. */\r\n def?: SelectionDef;\r\n /**\r\n * The visual's *unfiltered* source rows. Slicers derive their option lists from\r\n * this (so a slicer never hides its own choices by filtering itself), while the\r\n * `spec.data` handed to the renderer may already be cross-filtered.\r\n */\r\n sourceData?: Datum[];\r\n /**\r\n * The host already provides card chrome (e.g. a dashboard cell), so renderers\r\n * that normally draw their own card (KPI) should render flat to avoid doubling\r\n * the border/background.\r\n */\r\n framed?: boolean;\r\n /** Ask the runtime to redraw the marks layer (used by DOM slicers). */\r\n requestRedraw?: () => void;\r\n}\r\n\r\nexport type CustomRenderer = (\r\n surface: Surface,\r\n spec: ChartSpec,\r\n tokens: ThemeTokens,\r\n size: Size,\r\n context?: RenderContext,\r\n) => InteractionModel | void;\r\n\r\nexport const CARTESIAN_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\r\n 'line',\r\n 'area',\r\n 'bar',\r\n 'scatter',\r\n 'box',\r\n]);\r\n\r\nexport const cartesianRenderers: Partial<Record<ChartType, CartesianRenderer>> = {\r\n line: drawLine,\r\n area: drawArea,\r\n bar: drawBar,\r\n scatter: drawScatter,\r\n box: drawBox,\r\n};\r\n\r\n/**\r\n * Cartesian charts whose hover semantics differ from the generic nearest-point\r\n * model (e.g. box plots surface quartile stats). When present, the runtime uses\r\n * this builder instead of `buildCartesianInteraction`.\r\n */\r\nexport const cartesianInteractionBuilders: Partial<Record<ChartType, CartesianInteractionBuilder>> = {\r\n box: buildBoxInteraction,\r\n};\r\n\r\nexport const customRenderers: Partial<Record<ChartType, CustomRenderer>> = {\r\n heatmap: drawHeatmap,\r\n pie: drawPie,\r\n funnel: drawFunnel,\r\n kpi: drawKpi,\r\n sankey: drawSankey,\r\n choropleth: drawChoropleth,\r\n table: drawTable,\r\n matrix: drawMatrix,\r\n dropdown: drawDropdown,\r\n search: drawSearch,\r\n list: drawList,\r\n range: drawRange,\r\n dateRange: drawDateRange,\r\n};\r\n","/**\r\n * The hover tooltip — a flat, themed HTML card the controller positions next to\r\n * the cursor. It lives as a direct child of the Surface root (a sibling of the\r\n * overlay layer) so the per-frame `surface.clear()` never wipes it; the\r\n * controller owns its full lifecycle.\r\n */\r\n\r\nimport type { ThemeTokens } from '../theme';\r\nimport { createDiv, setStyle } from '../render/dom';\r\nimport type { TooltipContent } from './types';\r\n\r\nconst OFFSET = 14;\r\nconst EDGE_PAD = 8;\r\n\r\nexport class Tooltip {\r\n private readonly el: HTMLDivElement;\r\n private tokens: ThemeTokens;\r\n private visible = false;\r\n\r\n constructor(\r\n private readonly root: HTMLElement,\r\n tokens: ThemeTokens,\r\n ) {\r\n this.tokens = tokens;\r\n this.el = createDiv('graphein-tooltip');\r\n this.applyShell();\r\n this.root.appendChild(this.el);\r\n }\r\n\r\n setTokens(tokens: ThemeTokens): void {\r\n this.tokens = tokens;\r\n this.applyShell();\r\n }\r\n\r\n private applyShell(): void {\r\n const t = this.tokens;\r\n setStyle(this.el, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n boxSizing: 'border-box',\r\n maxWidth: '280px',\r\n padding: `${t.spacing.sm}px ${t.spacing.md}px`,\r\n background: t.color.surface,\r\n color: t.color.text,\r\n border: `1px solid ${t.color.border}`,\r\n borderRadius: `${t.radius.md}px`,\r\n boxShadow: t.dark\r\n ? '0 6px 20px rgba(0,0,0,0.45)'\r\n : '0 6px 18px rgba(15,23,42,0.12)',\r\n font: `${t.font.size.small}px/1.45 ${t.font.family}`,\r\n fontWeight: String(t.font.weight.normal),\r\n opacity: '0',\r\n transform: 'translate(-9999px, -9999px)',\r\n transition: 'opacity 90ms ease',\r\n zIndex: '20',\r\n whiteSpace: 'nowrap',\r\n });\r\n }\r\n\r\n /** Replace the card contents from structured data. */\r\n setContent(content: TooltipContent): void {\r\n const t = this.tokens;\r\n this.el.replaceChildren();\r\n\r\n if (content.title) {\r\n const head = createDiv('graphein-tooltip-title', {\r\n fontWeight: String(t.font.weight.bold),\r\n fontSize: `${t.font.size.base}px`,\r\n color: t.color.text,\r\n marginBottom: content.rows.length ? `${t.spacing.xs}px` : '0',\r\n });\r\n head.textContent = content.title;\r\n this.el.appendChild(head);\r\n }\r\n\r\n for (const row of content.rows) {\r\n const line = createDiv('graphein-tooltip-row', {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: `${t.spacing.sm}px`,\r\n padding: '1px 0',\r\n color: row.muted ? t.color.textMuted : t.color.text,\r\n fontWeight: String(row.strong ? t.font.weight.bold : t.font.weight.normal),\r\n });\r\n\r\n if (row.swatch) {\r\n const chip = createDiv('graphein-tooltip-swatch', {\r\n flex: '0 0 auto',\r\n width: '9px',\r\n height: '9px',\r\n borderRadius: '2px',\r\n background: row.swatch,\r\n });\r\n line.appendChild(chip);\r\n }\r\n\r\n const label = createDiv('graphein-tooltip-label', {\r\n flex: '1 1 auto',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n paddingRight: `${t.spacing.md}px`,\r\n });\r\n label.textContent = row.label;\r\n line.appendChild(label);\r\n\r\n const value = createDiv('graphein-tooltip-value', {\r\n flex: '0 0 auto',\r\n marginLeft: 'auto',\r\n fontVariantNumeric: 'tabular-nums',\r\n fontWeight: String(row.strong ? t.font.weight.bold : t.font.weight.medium),\r\n });\r\n value.textContent = row.value;\r\n line.appendChild(value);\r\n\r\n this.el.appendChild(line);\r\n }\r\n }\r\n\r\n /**\r\n * Position the card near (anchorX, anchorY) in CSS px, flipping away from the\r\n * surface edges so it never clips. `surfaceW/H` bound the placement.\r\n */\r\n place(anchorX: number, anchorY: number, surfaceW: number, surfaceH: number): void {\r\n const rect = this.el.getBoundingClientRect();\r\n const w = rect.width || this.el.offsetWidth;\r\n const h = rect.height || this.el.offsetHeight;\r\n\r\n let left = anchorX + OFFSET;\r\n if (left + w > surfaceW - EDGE_PAD) left = anchorX - OFFSET - w;\r\n left = Math.max(EDGE_PAD, Math.min(left, surfaceW - w - EDGE_PAD));\r\n\r\n let top = anchorY + OFFSET;\r\n if (top + h > surfaceH - EDGE_PAD) top = anchorY - OFFSET - h;\r\n top = Math.max(EDGE_PAD, Math.min(top, surfaceH - h - EDGE_PAD));\r\n\r\n setStyle(this.el, { transform: `translate(${Math.round(left)}px, ${Math.round(top)}px)` });\r\n if (!this.visible) {\r\n this.visible = true;\r\n // Force the transform to apply before fading in (avoids a corner slide).\r\n void this.el.offsetWidth;\r\n this.el.style.opacity = '1';\r\n }\r\n }\r\n\r\n hide(): void {\r\n if (!this.visible) return;\r\n this.visible = false;\r\n this.el.style.opacity = '0';\r\n this.el.style.transform = 'translate(-9999px, -9999px)';\r\n }\r\n\r\n destroy(): void {\r\n this.el.remove();\r\n }\r\n}\r\n","/**\r\n * InteractionController — the single owner of pointer events for a Surface.\r\n *\r\n * Created once per chart instance; handed a fresh `InteractionModel` on every\r\n * redraw. It throttles pointer moves to one rAF, hit-tests against the current\r\n * model, paints the highlight onto the interaction canvas, and drives the HTML\r\n * tooltip. Hover never touches the marks layer.\r\n */\r\n\r\nimport type { Surface } from '../render/surface';\r\nimport type { ThemeTokens } from '../theme';\r\nimport { Tooltip } from './tooltip';\r\nimport type { Hover, InteractionModel } from './types';\r\nimport type { SelectionValue } from '../spec/selection';\r\n\r\n/** How the controller publishes a click/tap selection from the current model. */\r\nexport interface ControllerSelect {\r\n /** Called with the picked value (or `null` when empty space is clicked). */\r\n onPick(value: SelectionValue | null): void;\r\n}\r\n\r\nexport class InteractionController {\r\n private model: InteractionModel | null = null;\r\n private tokens: ThemeTokens;\r\n private readonly tooltip: Tooltip;\r\n\r\n private raf = 0;\r\n private pending: { x: number; y: number } | null = null;\r\n private activeKey: string | null = null;\r\n private selectCfg: ControllerSelect | null = null;\r\n private pickable = false;\r\n\r\n constructor(\r\n private readonly surface: Surface,\r\n tokens: ThemeTokens,\r\n ) {\r\n this.tokens = tokens;\r\n this.tooltip = new Tooltip(surface.root, tokens);\r\n const root = surface.root;\r\n root.addEventListener('pointermove', this.onMove);\r\n root.addEventListener('pointerleave', this.onLeave);\r\n root.addEventListener('pointerdown', this.onMove);\r\n root.addEventListener('click', this.onClick);\r\n }\r\n\r\n /** Install the model for the current frame (or `null` to disable hover). */\r\n setModel(model: InteractionModel | null, tokens: ThemeTokens): void {\r\n this.model = model;\r\n this.tokens = tokens;\r\n this.tooltip.setTokens(tokens);\r\n // The per-frame surface.clear() already wiped the interaction canvas and\r\n // any prior highlight; drop the active hover so the next move re-resolves.\r\n this.activeKey = null;\r\n this.pickable = Boolean(model?.pick);\r\n if (!model) this.tooltip.hide();\r\n }\r\n\r\n /** Wire click/tap selection for this chart (or `null` to disable it). */\r\n setSelect(cfg: ControllerSelect | null): void {\r\n this.selectCfg = cfg;\r\n }\r\n\r\n private readonly onMove = (e: PointerEvent): void => {\r\n if (!this.model) return;\r\n const rect = this.surface.root.getBoundingClientRect();\r\n this.pending = { x: e.clientX - rect.left, y: e.clientY - rect.top };\r\n if (!this.raf) this.raf = requestAnimationFrame(this.flush);\r\n };\r\n\r\n private readonly onLeave = (): void => {\r\n if (this.raf) {\r\n cancelAnimationFrame(this.raf);\r\n this.raf = 0;\r\n }\r\n this.pending = null;\r\n this.clearHover();\r\n };\r\n\r\n private readonly onClick = (e: PointerEvent): void => {\r\n const cfg = this.selectCfg;\r\n const model = this.model;\r\n if (!cfg || !model || !model.pick) return;\r\n const rect = this.surface.root.getBoundingClientRect();\r\n cfg.onPick(model.pick(e.clientX - rect.left, e.clientY - rect.top));\r\n };\r\n\r\n private readonly flush = (): void => {\r\n this.raf = 0;\r\n const pt = this.pending;\r\n this.pending = null;\r\n if (!pt || !this.model) return;\r\n\r\n const hover = this.model.hitTest(pt.x, pt.y);\r\n if (!hover) {\r\n this.clearHover();\r\n return;\r\n }\r\n this.render(hover);\r\n };\r\n\r\n private render(hover: Hover): void {\r\n if (hover.key !== this.activeKey) {\r\n this.activeKey = hover.key;\r\n this.paintHighlight(hover);\r\n this.tooltip.setContent(hover.content);\r\n }\r\n this.tooltip.place(hover.anchorX, hover.anchorY, this.surface.width, this.surface.height);\r\n if (this.selectCfg && this.pickable) this.surface.root.style.cursor = 'pointer';\r\n }\r\n\r\n private paintHighlight(hover: Hover): void {\r\n const ctx = this.surface.interaction.ctx;\r\n ctx.clearRect(0, 0, this.surface.width, this.surface.height);\r\n if (hover.draw) hover.draw(ctx);\r\n }\r\n\r\n private clearHover(): void {\r\n if (this.activeKey === null) return;\r\n this.activeKey = null;\r\n this.surface.interaction.ctx.clearRect(0, 0, this.surface.width, this.surface.height);\r\n this.tooltip.hide();\r\n if (this.selectCfg && this.pickable) this.surface.root.style.cursor = '';\r\n }\r\n\r\n destroy(): void {\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n const root = this.surface.root;\r\n root.removeEventListener('pointermove', this.onMove);\r\n root.removeEventListener('pointerleave', this.onLeave);\r\n root.removeEventListener('pointerdown', this.onMove);\r\n root.removeEventListener('click', this.onClick);\r\n this.tooltip.destroy();\r\n }\r\n}\r\n","/**\r\n * Cartesian hit-testing.\r\n *\r\n * Builds an `InteractionModel` from a resolved `CartesianModel`:\r\n * - line / area / bar / point-x → shared-x \"index\" hover (crosshair + one\r\n * tooltip row per series at the focused x).\r\n * - scatter (quantitative x) → nearest-point hover (focus ring).\r\n *\r\n * All highlight drawing targets the interaction canvas in CSS px; nothing here\r\n * mutates the marks layer, so hover never triggers a full redraw.\r\n */\r\n\r\nimport type { Rect } from '../types';\r\nimport type { CartesianModel } from '../runtime/cartesian';\r\nimport { accessor, toKey, toNumber } from '../util/data';\r\nimport { formatValue } from '../format';\r\nimport { withAlpha } from '../color';\r\nimport type { Hover, InteractionModel, TooltipRow } from './types';\r\nimport type { SelectionValue } from '../spec/selection';\r\n\r\nconst HIT_RADIUS = 26; // scatter nearest-point pickup radius (px)\r\n\r\nexport function tooltipEnabled(spec: CartesianModel['spec']): boolean {\r\n const tt = spec.tooltip;\r\n if (tt === false) return false;\r\n if (tt && typeof tt === 'object' && tt.show === false) return false;\r\n return true;\r\n}\r\n\r\nexport function buildCartesianInteraction(model: CartesianModel): InteractionModel | null {\r\n if (!tooltipEnabled(model.spec)) return null;\r\n if (model.series.length === 0) return null;\r\n if (model.spec.type === 'scatter') return scatterInteraction(model);\r\n return indexInteraction(model);\r\n}\r\n\r\nfunction inside(r: Rect, px: number, py: number, pad = 0): boolean {\r\n return (\r\n px >= r.x - pad &&\r\n px <= r.x + r.width + pad &&\r\n py >= r.y - pad &&\r\n py <= r.y + r.height + pad\r\n );\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Shared-x index hover (line / area / bar / point) */\r\n/* ------------------------------------------------------------------ */\r\n\r\ninterface Stop {\r\n key: string;\r\n value: unknown;\r\n px: number;\r\n}\r\n\r\ninterface SeriesLookup {\r\n key: string;\r\n label: string;\r\n color: string;\r\n /** xKey → raw y value. */\r\n byX: Map<string, number>;\r\n}\r\n\r\nfunction indexInteraction(model: CartesianModel): InteractionModel | null {\r\n const { plot, x, y, series } = model;\r\n const xField = x.field;\r\n const yField = y.field ?? model.spec.encoding.y.field;\r\n const readX = accessor(xField);\r\n const readY = accessor(yField);\r\n const xFormat = model.spec.encoding.x?.format;\r\n const yFormat = model.spec.encoding.y?.format;\r\n const band = x.kind === 'band';\r\n const showDots = !model.stacked && !band;\r\n\r\n const stopByKey = new Map<string, Stop>();\r\n const lookups: SeriesLookup[] = [];\r\n\r\n for (const s of series) {\r\n const byX = new Map<string, number>();\r\n for (const row of s.rows) {\r\n const xv = readX(row);\r\n const k = toKey(xv);\r\n const yv = toNumber(readY(row));\r\n if (!Number.isNaN(yv)) byX.set(k, yv);\r\n if (!stopByKey.has(k)) {\r\n const px = x.pixel(xv);\r\n if (px != null) stopByKey.set(k, { key: k, value: xv, px });\r\n }\r\n }\r\n lookups.push({ key: s.key, label: s.label, color: s.color, byX });\r\n }\r\n\r\n const stops = [...stopByKey.values()].sort((a, b) => a.px - b.px);\r\n if (stops.length === 0) return null;\r\n const multi = series.length > 1;\r\n\r\n const nearestStop = (px: number): Stop => {\r\n let best = stops[0];\r\n let bestDist = Math.abs(px - best.px);\r\n for (let i = 1; i < stops.length; i++) {\r\n const d = Math.abs(px - stops[i].px);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n best = stops[i];\r\n }\r\n }\r\n return best;\r\n };\r\n\r\n const hitTest = (px: number, py: number): Hover | null => {\r\n if (!inside(plot, px, py, 6)) return null;\r\n\r\n const best = nearestStop(px);\r\n\r\n const rows: TooltipRow[] = [];\r\n const dots: { py: number; color: string }[] = [];\r\n let nearestDy = Infinity;\r\n let nearestIdx = -1;\r\n\r\n for (const lk of lookups) {\r\n const raw = lk.byX.get(best.key);\r\n if (raw == null) continue;\r\n const dotY = y.pixel(raw);\r\n if (showDots) {\r\n const dy = Math.abs(dotY - py);\r\n if (dy < nearestDy) {\r\n nearestDy = dy;\r\n nearestIdx = rows.length;\r\n }\r\n dots.push({ py: dotY, color: lk.color });\r\n }\r\n rows.push({\r\n swatch: lk.color,\r\n label: multi ? lk.label : (model.spec.encoding.y.title ?? yField),\r\n value: formatValue(raw, yFormat),\r\n });\r\n }\r\n\r\n if (rows.length === 0) return null;\r\n if (nearestIdx >= 0) rows[nearestIdx].strong = true;\r\n\r\n const anchorY = showDots && nearestIdx >= 0 ? dots[nearestIdx].py : py;\r\n\r\n return {\r\n key: best.key,\r\n anchorX: best.px,\r\n anchorY,\r\n content: { title: formatValue(best.value, xFormat), rows },\r\n draw: (ctx) => {\r\n ctx.save();\r\n // Crosshair / category band.\r\n if (band) {\r\n const half = x.bandwidth / 2;\r\n ctx.fillStyle = withAlpha(model.tokens.color.text, 0.06);\r\n ctx.fillRect(best.px - half, plot.y, x.bandwidth, plot.height);\r\n } else {\r\n ctx.strokeStyle = withAlpha(model.tokens.color.text, 0.28);\r\n ctx.lineWidth = 1;\r\n ctx.setLineDash([4, 3]);\r\n ctx.beginPath();\r\n ctx.moveTo(Math.round(best.px) + 0.5, plot.y);\r\n ctx.lineTo(Math.round(best.px) + 0.5, plot.y + plot.height);\r\n ctx.stroke();\r\n ctx.setLineDash([]);\r\n }\r\n // Focus dots.\r\n for (let i = 0; i < dots.length; i++) {\r\n const d = dots[i];\r\n const strong = i === nearestIdx;\r\n ctx.beginPath();\r\n ctx.fillStyle = model.tokens.color.background;\r\n ctx.arc(best.px, d.py, strong ? 6 : 5, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.beginPath();\r\n ctx.fillStyle = d.color;\r\n ctx.arc(best.px, d.py, strong ? 4 : 3, 0, Math.PI * 2);\r\n ctx.fill();\r\n }\r\n ctx.restore();\r\n },\r\n };\r\n };\r\n\r\n const pick = (px: number, py: number): SelectionValue | null => {\r\n if (!inside(plot, px, py, 6)) return null;\r\n const best = nearestStop(px);\r\n return { kind: 'point', fields: [xField], tuples: [[best.value]] };\r\n };\r\n\r\n return { region: plot, hitTest, pick };\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Scatter nearest-point hover */\r\n/* ------------------------------------------------------------------ */\r\n\r\ninterface ScatterPoint {\r\n px: number;\r\n py: number;\r\n color: string;\r\n seriesLabel: string;\r\n seriesValue: unknown;\r\n xVal: unknown;\r\n yVal: unknown;\r\n sizeVal?: unknown;\r\n}\r\n\r\nfunction scatterInteraction(model: CartesianModel): InteractionModel | null {\r\n const { plot, x, y, series } = model;\r\n const xField = x.field;\r\n const yField = y.field ?? model.spec.encoding.y.field;\r\n const readX = accessor(xField);\r\n const readY = accessor(yField);\r\n const sizeField = model.spec.encoding.size?.field;\r\n const readSize = sizeField ? accessor(sizeField) : null;\r\n const xFormat = model.spec.encoding.x?.format;\r\n const yFormat = model.spec.encoding.y?.format;\r\n const sizeFormat = model.spec.encoding.size?.format;\r\n const multi = series.length > 1;\r\n\r\n const points: ScatterPoint[] = [];\r\n for (const s of series) {\r\n for (const row of s.rows) {\r\n const xv = readX(row);\r\n const yv = readY(row);\r\n const px = x.pixel(xv);\r\n const py = y.pixel(yv);\r\n if (px == null || Number.isNaN(py)) continue;\r\n points.push({\r\n px,\r\n py,\r\n color: s.color,\r\n seriesLabel: s.label,\r\n seriesValue: s.value,\r\n xVal: xv,\r\n yVal: yv,\r\n sizeVal: readSize ? readSize(row) : undefined,\r\n });\r\n }\r\n }\r\n if (points.length === 0) return null;\r\n\r\n const nearest = (px: number, py: number): number => {\r\n if (!inside(plot, px, py, HIT_RADIUS)) return -1;\r\n let best = -1;\r\n let bestSq = HIT_RADIUS * HIT_RADIUS;\r\n for (let i = 0; i < points.length; i++) {\r\n const dx = points[i].px - px;\r\n const dy = points[i].py - py;\r\n const sq = dx * dx + dy * dy;\r\n if (sq <= bestSq) {\r\n bestSq = sq;\r\n best = i;\r\n }\r\n }\r\n return best;\r\n };\r\n\r\n const hitTest = (px: number, py: number): Hover | null => {\r\n const best = nearest(px, py);\r\n if (best < 0) return null;\r\n const p = points[best];\r\n\r\n const rows: TooltipRow[] = [\r\n { swatch: p.color, label: model.spec.encoding.x?.title ?? xField, value: formatValue(p.xVal, xFormat) },\r\n { label: model.spec.encoding.y.title ?? yField, value: formatValue(p.yVal, yFormat) },\r\n ];\r\n if (sizeField && p.sizeVal != null) {\r\n rows.push({\r\n label: model.spec.encoding.size?.title ?? sizeField,\r\n value: formatValue(p.sizeVal, sizeFormat),\r\n muted: true,\r\n });\r\n }\r\n\r\n return {\r\n key: `${best}`,\r\n anchorX: p.px,\r\n anchorY: p.py,\r\n content: { title: multi ? p.seriesLabel : undefined, rows },\r\n draw: (ctx) => {\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.strokeStyle = model.tokens.color.background;\r\n ctx.lineWidth = 3;\r\n ctx.arc(p.px, p.py, 8, 0, Math.PI * 2);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.strokeStyle = p.color;\r\n ctx.lineWidth = 2;\r\n ctx.arc(p.px, p.py, 8, 0, Math.PI * 2);\r\n ctx.stroke();\r\n ctx.restore();\r\n },\r\n };\r\n };\r\n\r\n const pick = (px: number, py: number): SelectionValue | null => {\r\n const best = nearest(px, py);\r\n if (best < 0) return null;\r\n const p = points[best];\r\n if (model.seriesField) {\r\n return { kind: 'point', fields: [model.seriesField], tuples: [[p.seriesValue]] };\r\n }\r\n return { kind: 'point', fields: [xField, yField], tuples: [[p.xVal, p.yVal]] };\r\n };\r\n\r\n return { region: plot, hitTest, pick };\r\n}\r\n","/**\r\n * SelectionStore — the dependency-free bus that links interactive visuals.\r\n *\r\n * It holds the current {@link SelectionValue} for every named param and notifies\r\n * subscribers when one changes. Visuals **publish** to params they define (click,\r\n * brush, slicer change) and **subscribe** to params they consume (re-resolve\r\n * highlight/filter, redraw). A single store shared across `render()` calls links\r\n * independently-mounted charts; a `DashboardSpec` owns one internally.\r\n *\r\n * The store is deliberately \"dumb\": toggle/accumulate logic lives in the visual\r\n * that computes the next value. Change detection uses a structural compare so a\r\n * no-op `set` doesn't trigger redundant redraws.\r\n */\r\n\r\nimport type { SelectionValue } from '../spec/selection';\r\n\r\n/** Notified after a param's value changes. */\r\nexport type SelectionListener = (name: string, value: SelectionValue | null) => void;\r\n\r\nexport interface SelectionStore {\r\n /** Current value for `name`, or `null` if unset/empty. */\r\n get(name: string): SelectionValue | null;\r\n /** Replace `name`'s value; no-ops (and skips notifying) if unchanged. */\r\n set(name: string, value: SelectionValue | null): void;\r\n /** Clear one param, or all params when `name` is omitted. */\r\n clear(name?: string): void;\r\n /** A snapshot of every param's current value. */\r\n all(): Record<string, SelectionValue | null>;\r\n /** Subscribe to changes; returns an unsubscribe function. */\r\n subscribe(listener: SelectionListener): () => void;\r\n}\r\n\r\nfunction sameValue(a: SelectionValue | null, b: SelectionValue | null): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return a == null && b == null;\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n}\r\n\r\nexport function createSelectionStore(\r\n initial?: Record<string, SelectionValue | null>,\r\n): SelectionStore {\r\n const values = new Map<string, SelectionValue | null>();\r\n if (initial) {\r\n for (const [k, v] of Object.entries(initial)) values.set(k, v ?? null);\r\n }\r\n const listeners = new Set<SelectionListener>();\r\n\r\n const emit = (name: string, value: SelectionValue | null): void => {\r\n for (const listener of [...listeners]) listener(name, value);\r\n };\r\n\r\n return {\r\n get(name) {\r\n return values.get(name) ?? null;\r\n },\r\n set(name, value) {\r\n const next = value ?? null;\r\n if (sameValue(values.get(name) ?? null, next)) return;\r\n values.set(name, next);\r\n emit(name, next);\r\n },\r\n clear(name) {\r\n if (name === undefined) {\r\n for (const key of [...values.keys()]) {\r\n if ((values.get(key) ?? null) === null) continue;\r\n values.set(key, null);\r\n emit(key, null);\r\n }\r\n return;\r\n }\r\n if ((values.get(name) ?? null) === null) return;\r\n values.set(name, null);\r\n emit(name, null);\r\n },\r\n all() {\r\n return Object.fromEntries(values);\r\n },\r\n subscribe(listener) {\r\n listeners.add(listener);\r\n return () => listeners.delete(listener);\r\n },\r\n };\r\n}\r\n","/**\r\n * Predicate engine — pure, dependency-free matching of data rows against a\r\n * resolved {@link SelectionValue}.\r\n *\r\n * Used by both consumers of a selection: **filter** (keep matching rows) and\r\n * **highlight** (test each mark to decide emphasis vs. dim). Kept side-effect\r\n * free so it unit-tests in node and runs cheaply per mark.\r\n */\r\n\r\nimport type { Datum } from '../types';\r\nimport type {\r\n FilterClause,\r\n LiteralPredicate,\r\n SelectionValue,\r\n} from '../spec/selection';\r\nimport { accessor, hasField, toDate, toKey, toNumber } from '../util/data';\r\n\r\n/** A selection with no constraint (null, empty set/point/text) matches all. */\r\nexport function isEmptyValue(value: SelectionValue | null | undefined): boolean {\r\n if (value == null) return true;\r\n switch (value.kind) {\r\n case 'point':\r\n return value.tuples.length === 0 || value.fields.length === 0;\r\n case 'set':\r\n return value.values.length === 0;\r\n case 'text':\r\n return value.query.trim() === '';\r\n case 'range':\r\n return value.min == null && value.max == null;\r\n }\r\n}\r\n\r\n/** Coerce a value to a comparable number (numeric first, then temporal). */\r\nfunction toComparable(value: unknown): number {\r\n if (typeof value === 'number') return value;\r\n if (value instanceof Date) return value.getTime();\r\n const n = toNumber(value);\r\n if (!Number.isNaN(n)) return n;\r\n const d = toDate(value);\r\n return d ? d.getTime() : NaN;\r\n}\r\n\r\n/**\r\n * Compile a row → boolean tester for a selection value, hoisting accessors and\r\n * lookup sets out of the per-row path so it's cheap to call across many marks.\r\n * An empty/null constraint compiles to a constant `true`.\r\n */\r\nexport function makeMatcher(\r\n value: SelectionValue | null | undefined,\r\n): (row: Datum) => boolean {\r\n if (isEmptyValue(value)) return () => true;\r\n const v = value as SelectionValue;\r\n switch (v.kind) {\r\n case 'point': {\r\n const reads = v.fields.map((f) => accessor(f));\r\n const keys = v.tuples\r\n .filter((t) => t.length === v.fields.length)\r\n .map((t) => t.map((x) => toKey(x)).join('\\u0000'));\r\n const want = new Set(keys);\r\n return (row) => want.has(reads.map((read) => toKey(read(row))).join('\\u0000'));\r\n }\r\n case 'set': {\r\n const read = accessor(v.field);\r\n const want = new Set(v.values.map((x) => toKey(x)));\r\n return (row) => want.has(toKey(read(row)));\r\n }\r\n case 'range': {\r\n const read = accessor(v.field);\r\n const min = v.min != null ? toComparable(v.min) : -Infinity;\r\n const max = v.max != null ? toComparable(v.max) : Infinity;\r\n return (row) => {\r\n const c = toComparable(read(row));\r\n return !Number.isNaN(c) && c >= min && c <= max;\r\n };\r\n }\r\n case 'text': {\r\n const read = accessor(v.field);\r\n const q = v.query.trim().toLowerCase();\r\n return (row) => {\r\n const raw = read(row);\r\n return raw != null && String(raw).toLowerCase().includes(q);\r\n };\r\n }\r\n }\r\n}\r\n\r\n/** Does `row` satisfy `value`? An empty/null constraint always matches. */\r\nexport function matchesValue(row: Datum, value: SelectionValue | null | undefined): boolean {\r\n return makeMatcher(value)(row);\r\n}\r\n\r\n/** The data field(s) a selection value constrains. */\r\nfunction valueFields(value: SelectionValue): string[] {\r\n return value.kind === 'point' ? value.fields : [value.field];\r\n}\r\n\r\n/** True when at least one row carries `field` as a column. */\r\nfunction columnPresent(rows: readonly Datum[], field: string): boolean {\r\n for (const row of rows) if (hasField(row, field)) return true;\r\n return false;\r\n}\r\n\r\n/** Keep only the rows matching *every* provided selection (logical AND). */\r\nexport function filterRows(\r\n rows: readonly Datum[],\r\n values: ReadonlyArray<SelectionValue | null | undefined>,\r\n): Datum[] {\r\n const active = values.filter((v): v is SelectionValue => !isEmptyValue(v));\r\n if (active.length === 0) return rows as Datum[];\r\n // Skip a clause whose field(s) this dataset doesn't contain: a cross-filter on\r\n // a column the data lacks is \"not applicable\" (Power-BI style — a slicer only\r\n // affects visuals built on a field), not \"match nothing\". Otherwise fanning a\r\n // page-wide filter onto a pre-aggregated view would blank it entirely.\r\n const matchers = active\r\n .filter((v) => valueFields(v).every((f) => columnPresent(rows, f)))\r\n .map((v) => makeMatcher(v));\r\n if (matchers.length === 0) return rows as Datum[];\r\n return rows.filter((row) => matchers.every((m) => m(row)));\r\n}\r\n\r\n/** Convert a literal `filter` predicate into a {@link SelectionValue}. */\r\nexport function literalToValue(pred: LiteralPredicate): SelectionValue {\r\n if ('equals' in pred) return { kind: 'set', field: pred.field, values: [pred.equals] };\r\n if ('oneOf' in pred) return { kind: 'set', field: pred.field, values: pred.oneOf };\r\n if ('contains' in pred) return { kind: 'text', field: pred.field, query: pred.contains };\r\n return { kind: 'range', field: pred.field, min: pred.range[0], max: pred.range[1] };\r\n}\r\n\r\n/** True when a filter clause is a named-param reference (vs. a literal). */\r\nexport function isParamClause(clause: FilterClause): clause is { param: string } {\r\n return typeof (clause as { param?: unknown }).param === 'string';\r\n}\r\n","/**\r\n * Selection wiring — turn a single \"pick\" into a published selection value, and\r\n * resolve a spec's `highlight`/`filter` against the store.\r\n *\r\n * The interaction models describe *what* a click picks (a {@link SelectionValue}\r\n * for one mark); this module applies the param's toggle/accumulate semantics and\r\n * publishes the result. It also resolves the consuming side: the emphasis a chart\r\n * draws (from `highlight`) and the row predicates it filters by (from `filter`).\r\n */\r\n\r\nimport type { Datum } from '../types';\r\nimport type {\r\n FilterClause,\r\n PointSelection,\r\n SelectionDef,\r\n SelectionValue,\r\n} from '../spec/selection';\r\nimport type { HighlightConfig } from '../spec/selection';\r\nimport { toKey } from '../util/data';\r\nimport type { SelectionStore } from './store';\r\nimport type { Emphasis } from './types';\r\nimport { isEmptyValue, isParamClause, literalToValue, makeMatcher } from './predicate';\r\n\r\n/** Default dim alpha applied to non-matching marks during highlight. */\r\nexport const DIM_ALPHA = 0.22;\r\n\r\n/** What a selectable visual needs to publish picks to the store. */\r\nexport interface SelectConfig {\r\n store: SelectionStore;\r\n param: string;\r\n def: SelectionDef;\r\n}\r\n\r\nfunction tupleKey(tuple: readonly unknown[]): string {\r\n return tuple.map((x) => toKey(x)).join('\\u0000');\r\n}\r\n\r\nfunction sameFields(a: readonly string[], b: readonly string[]): boolean {\r\n return a.length === b.length && a.every((f, i) => f === b[i]);\r\n}\r\n\r\n/** Merge a fresh point pick into the current value (toggle + accumulate). */\r\nfunction togglePoint(\r\n current: SelectionValue | null,\r\n pick: PointSelection,\r\n): SelectionValue | null {\r\n if (!current || current.kind !== 'point' || !sameFields(current.fields, pick.fields)) {\r\n return pick.tuples.length ? pick : null;\r\n }\r\n const byKey = new Map(current.tuples.map((t) => [tupleKey(t), t]));\r\n for (const t of pick.tuples) {\r\n const k = tupleKey(t);\r\n if (byKey.has(k)) byKey.delete(k);\r\n else byKey.set(k, t);\r\n }\r\n const tuples = [...byKey.values()];\r\n return tuples.length ? { kind: 'point', fields: current.fields, tuples } : null;\r\n}\r\n\r\n/**\r\n * Publish a pick to the store, applying the param's semantics:\r\n * - a `null` pick (clicked empty space) clears the selection;\r\n * - `point` params with `toggle` (the default) accumulate / deselect;\r\n * - everything else replaces the value (single-select, brush, slicer).\r\n */\r\nexport function applyPick(cfg: SelectConfig, pick: SelectionValue | null): void {\r\n const { store, param, def } = cfg;\r\n if (pick == null) {\r\n store.set(param, null);\r\n return;\r\n }\r\n if (def.type === 'point' && def.toggle !== false && pick.kind === 'point') {\r\n store.set(param, togglePoint(store.get(param), pick));\r\n return;\r\n }\r\n store.set(param, pick);\r\n}\r\n\r\n/** Resolve a `highlight` reference (one param or a union of several) into the\r\n * emphasis to draw this frame. With multiple params a row is emphasized if it\r\n * matches *any* active selection; emphasis is null when none are active. */\r\nexport function resolveEmphasis(\r\n highlight: HighlightConfig | HighlightConfig[] | undefined,\r\n store: SelectionStore | undefined,\r\n dim: number = DIM_ALPHA,\r\n): Emphasis | null {\r\n if (!highlight || !store) return null;\r\n const configs = Array.isArray(highlight) ? highlight : [highlight];\r\n const matchers: Array<(row: Datum) => boolean> = [];\r\n for (const cfg of configs) {\r\n const value = store.get(cfg.param);\r\n if (isEmptyValue(value)) continue;\r\n matchers.push(makeMatcher(value));\r\n }\r\n if (matchers.length === 0) return null;\r\n return { match: (row: Datum) => matchers.some((m) => m(row)), dim };\r\n}\r\n\r\n/** Resolve a `filter` list into concrete selection values (params + literals). */\r\nexport function resolveFilterValues(\r\n filter: FilterClause[] | undefined,\r\n store: SelectionStore | undefined,\r\n): SelectionValue[] {\r\n if (!filter || filter.length === 0) return [];\r\n const out: SelectionValue[] = [];\r\n for (const clause of filter) {\r\n if (isParamClause(clause)) {\r\n const v = store?.get(clause.param) ?? null;\r\n if (!isEmptyValue(v)) out.push(v as SelectionValue);\r\n } else {\r\n out.push(literalToValue(clause));\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** The set of param names a spec reacts to (for change-driven redraws). */\r\nexport function dependentParams(\r\n highlight: HighlightConfig | HighlightConfig[] | undefined,\r\n filter: FilterClause[] | undefined,\r\n ownParams: readonly string[] = [],\r\n): Set<string> {\r\n const names = new Set<string>(ownParams);\r\n for (const cfg of highlight ? (Array.isArray(highlight) ? highlight : [highlight]) : []) {\r\n names.add(cfg.param);\r\n }\r\n for (const clause of filter ?? []) {\r\n if (isParamClause(clause)) names.add(clause.param);\r\n }\r\n return names;\r\n}\r\n","/**\r\n * Web-font readiness helpers.\r\n *\r\n * Charts measure text (via a canvas context) to size axis gutters, legends, and\r\n * titles. A chart drawn *before* its web font finishes loading is measured with\r\n * fallback-font metrics, so its layout is slightly off until it re-lays-out once\r\n * the real font arrives. The runtime uses these helpers to detect that case and\r\n * schedule a single corrective redraw.\r\n *\r\n * The CSS Font Loading API (`document.fonts`) only tracks fonts that have already\r\n * been *requested*. Fonts are requested lazily on first use, so a chart triggers\r\n * its font's load when it first measures/paints text — which is exactly when the\r\n * runtime arms `onFontsReady`. All functions are safe no-ops in environments\r\n * without the API (Node/SSR/older browsers).\r\n */\r\n\r\nfunction fontFaceSet(): FontFaceSet | undefined {\r\n try {\r\n if (typeof document === 'undefined') return undefined;\r\n const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\r\n return fonts && typeof fonts.ready?.then === 'function' ? fonts : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** True when at least one web font is still loading. */\r\nexport function fontsLoading(): boolean {\r\n const fonts = fontFaceSet();\r\n return fonts ? fonts.status === 'loading' : false;\r\n}\r\n\r\n/**\r\n * Invoke `cb` once when the document's currently-loading web fonts have settled.\r\n * If the API is unavailable, `cb` is never called (there is nothing to wait for).\r\n */\r\nexport function onFontsReady(cb: () => void): void {\r\n const fonts = fontFaceSet();\r\n if (!fonts) return;\r\n fonts.ready.then(() => cb()).catch(() => {});\r\n}\r\n","/**\r\n * Chart runtime: the public `render(container, spec)` entry point.\r\n *\r\n * Mounts a hybrid canvas + HTML `Surface`, resolves the theme, dispatches to the\r\n * right chart renderer, and manages the lifecycle (update / resize / destroy)\r\n * plus a deterministic \"ready\" signal for screenshot harnesses.\r\n */\r\n\r\nimport type { Size } from '../types';\r\nimport type { ChartSpec, ChartType } from '../spec/types';\r\nimport { resolveSketch } from '../spec/sketch';\r\nimport { resolveTheme, withSketchFont, ensureSketchFont, type ThemeTokens } from '../theme';\r\nimport { Surface } from '../render/surface';\r\nimport type { CanvasLayer } from '../render/canvasLayer';\r\nimport { getDevicePixelRatio } from '../render/env';\r\nimport { fontsLoading, onFontsReady } from '../render/fonts';\r\nimport { buildCartesianModel, type CartesianChartSpec, type CartesianModel } from './cartesian';\r\nimport { drawAxesUnderlay, drawOverlay } from '../axes';\r\nimport {\r\n CARTESIAN_TYPES,\r\n cartesianRenderers,\r\n cartesianInteractionBuilders,\r\n customRenderers,\r\n type CartesianRenderer,\r\n} from '../charts';\r\nimport { InteractionController, buildCartesianInteraction } from '../interaction';\r\nimport type { InteractionModel } from '../interaction';\r\nimport { createSelectionStore, type SelectionStore } from '../interaction/store';\r\nimport {\r\n applyPick,\r\n resolveEmphasis,\r\n resolveFilterValues,\r\n dependentParams,\r\n DIM_ALPHA,\r\n type SelectConfig,\r\n} from '../interaction/select';\r\nimport { filterRows } from '../interaction/predicate';\r\nimport type { RenderContext } from '../charts';\r\nimport type { SelectionValue } from '../spec/selection';\r\nimport { applyA11y } from '../a11y';\r\nimport {\r\n animate,\r\n resolveEntrance,\r\n resolveUpdate,\r\n prefersReducedMotion,\r\n type AnimationHandle,\r\n type ResolvedEntrance,\r\n} from '../animation';\r\n\r\n/** A change to a named selection: the param name and its new value (or null). */\r\nexport type SelectionChangeListener = (name: string, value: SelectionValue | null) => void;\r\n\r\n/** Options for {@link render}. */\r\nexport interface RenderOptions {\r\n /**\r\n * A shared selection bus. Pass the same store to multiple `render()` calls to\r\n * link them (cross-highlight / cross-filter). Omit to give the chart its own\r\n * private store.\r\n */\r\n store?: SelectionStore;\r\n /**\r\n * The chart is mounted inside a host that already provides card chrome (e.g. a\r\n * dashboard cell). Renderers that normally draw their own card (KPI) render\r\n * flat so the chrome isn't doubled. Optional; defaults to false.\r\n */\r\n frame?: boolean;\r\n}\r\n\r\nexport interface ChartInstance {\r\n /** Re-render with a new spec (data or config changes). */\r\n update(spec: ChartSpec): void;\r\n /** Re-measure the container (or use explicit dims) and redraw. */\r\n resize(width?: number, height?: number): void;\r\n /** Tear down DOM, observers, and listeners. */\r\n destroy(): void;\r\n /** The currently rendered spec. */\r\n readonly spec: ChartSpec;\r\n /** The mounted surface (advanced/imperative use). */\r\n readonly surface: Surface;\r\n /** The selection bus this chart is bound to (advanced/linking use). */\r\n readonly store: SelectionStore;\r\n /** Read a param's current value, or a snapshot of all params when omitted. */\r\n getSelection(name?: string): SelectionValue | null | Record<string, SelectionValue | null>;\r\n /** Set a param's value (drives highlight/filter across linked visuals). */\r\n setSelection(name: string, value: SelectionValue | null): void;\r\n /** Clear one param, or every param when `name` is omitted. */\r\n clearSelection(name?: string): void;\r\n /** Subscribe to selection changes; returns an unsubscribe function. */\r\n on(event: 'selectionchange', listener: SelectionChangeListener): () => void;\r\n /** Remove a previously-registered selection listener. */\r\n off(event: 'selectionchange', listener: SelectionChangeListener): void;\r\n}\r\n\r\ndeclare global {\r\n var __GRAPHEIN_READY: number | undefined;\r\n // Global kill-switch for entrance animations (screenshot/automation harnesses).\r\n var __GRAPHEIN_DISABLE_ANIM: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Chart kinds whose data marks are painted to the `marks` canvas (cartesian\r\n * plus pie/heatmap). Updates to these cross-fade the marks layer; the DOM-only\r\n * kinds (kpi/table/matrix) update instantly since there's no canvas to dissolve.\r\n */\r\nconst CANVAS_MARK_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\r\n 'line',\r\n 'area',\r\n 'bar',\r\n 'scatter',\r\n 'box',\r\n 'pie',\r\n 'heatmap',\r\n 'sankey',\r\n 'choropleth',\r\n]);\r\n\r\nfunction resolveContainer(target: HTMLElement | string): HTMLElement {\r\n if (typeof target === 'string') {\r\n const el = document.querySelector(target);\r\n if (!el) throw new Error(`Graphein: no element matches selector \"${target}\"`);\r\n return el as HTMLElement;\r\n }\r\n return target;\r\n}\r\n\r\nfunction resolveSize(container: HTMLElement, spec: ChartSpec): Size {\r\n const d = spec.dimensions;\r\n const width = d?.width ?? (container.clientWidth || 640);\r\n const height = d?.height ?? (container.clientHeight || 400);\r\n return { width: Math.max(1, width), height: Math.max(1, height) };\r\n}\r\n\r\n/** Resolve the theme, swapping in the handwriting font when sketching with text. */\r\nfunction resolveSketchTokens(spec: ChartSpec): ThemeTokens {\r\n const tokens = resolveTheme(spec.theme);\r\n const sketch = resolveSketch(spec);\r\n return sketch?.font ? withSketchFont(tokens) : tokens;\r\n}\r\n\r\nfunction signalReady(surface: Surface): void {\r\n surface.root.setAttribute('data-graphein-ready', 'true');\r\n globalThis.__GRAPHEIN_READY = (globalThis.__GRAPHEIN_READY ?? 0) + 1;\r\n}\r\n\r\nfunction paintBackground(surface: Surface, tokens: ThemeTokens, override?: string): void {\r\n const bg = override ?? tokens.color.background;\r\n surface.root.style.background = bg;\r\n const ctx = surface.marks.ctx;\r\n ctx.save();\r\n ctx.fillStyle = bg;\r\n ctx.fillRect(0, 0, surface.width, surface.height);\r\n ctx.restore();\r\n}\r\n\r\nexport function render(\r\n target: HTMLElement | string,\r\n spec: ChartSpec,\r\n options?: RenderOptions,\r\n): ChartInstance {\r\n const container = resolveContainer(target);\r\n const surface = new Surface(container);\r\n\r\n let currentSpec = spec;\r\n let observer: ResizeObserver | undefined;\r\n let interaction: InteractionController | undefined;\r\n let entrance: AnimationHandle | undefined;\r\n let updateTransition: AnimationHandle | undefined;\r\n let destroyed = false;\r\n // The size we last actually drew at. The resize observer redraws only when the\r\n // container's measured size diverges from this, so a resize that lands between\r\n // render() and the observer's first delivery (e.g. a dashboard that mounts a\r\n // view and then reflows its grid) is honored instead of dropped.\r\n let lastDrawnW = -1;\r\n let lastDrawnH = -1;\r\n // Set when a draw measured text while a web font was still loading. We listen\r\n // for the font once and redraw so the final layout uses real metrics.\r\n let fontRefreshArmed = false;\r\n // Set when the font settles mid-entrance: we defer the corrective redraw until\r\n // the entrance finishes so the animation isn't cut short by a snap.\r\n let pendingFontRefresh = false;\r\n // One-shot guard so the lazy sketch-font load only ever arms a single redraw.\r\n let sketchFontArmed = false;\r\n\r\n // Selection bus: shared (linked charts) or private to this instance. Seed any\r\n // initial param values that aren't already present so a shared store wins.\r\n const store = options?.store ?? createSelectionStore();\r\n for (const param of currentSpec.params ?? []) {\r\n if (param.value !== undefined && store.get(param.name) == null) {\r\n store.set(param.name, param.value ?? null);\r\n }\r\n }\r\n const hostListeners = new Set<SelectionChangeListener>();\r\n\r\n const draw = (animateEntrance: boolean): void => {\r\n entrance?.cancel();\r\n entrance = undefined;\r\n updateTransition?.cancel();\r\n updateTransition = undefined;\r\n\r\n const tokens = resolveSketchTokens(currentSpec);\r\n const size = resolveSize(container, currentSpec);\r\n lastDrawnW = size.width;\r\n lastDrawnH = size.height;\r\n surface.resize(size.width, size.height, getDevicePixelRatio());\r\n surface.root.removeAttribute('data-graphein-ready');\r\n surface.root.style.opacity = '';\r\n surface.root.style.transform = '';\r\n surface.clear();\r\n paintBackground(surface, tokens, currentSpec.background);\r\n\r\n const anim = resolveEntrance(currentSpec.animation, {\r\n reducedMotion: prefersReducedMotion(),\r\n disabled: !animateEntrance || globalThis.__GRAPHEIN_DISABLE_ANIM === true,\r\n });\r\n\r\n // Resolve interactivity for this frame: the rows after cross-filtering, and\r\n // the highlight (emphasis) to dim non-selected marks.\r\n const filterValues = resolveFilterValues(currentSpec.filter, store);\r\n const baseData = currentSpec.data ?? [];\r\n const filtered = filterValues.length ? filterRows(baseData, filterValues) : baseData;\r\n const effectiveSpec =\r\n filtered === baseData ? currentSpec : ({ ...currentSpec, data: filtered } as ChartSpec);\r\n const emphasis = resolveEmphasis(currentSpec.highlight, store, DIM_ALPHA);\r\n const ownParam = currentSpec.params?.[0];\r\n\r\n let interactionModel: InteractionModel | null = null;\r\n const type = currentSpec.type;\r\n if (CARTESIAN_TYPES.has(type)) {\r\n const renderer = cartesianRenderers[type];\r\n const model = buildCartesianModel(effectiveSpec as CartesianChartSpec, tokens, size);\r\n model.emphasis = emphasis;\r\n // When animating, the marks (and their gridline underlay) are painted by\r\n // the entrance loop frame-by-frame; otherwise paint them once now.\r\n if (!anim.enabled) {\r\n drawAxesUnderlay(surface, model);\r\n if (renderer) renderer(surface, model);\r\n }\r\n drawOverlay(surface, model);\r\n const overrideInteraction = cartesianInteractionBuilders[type];\r\n interactionModel = overrideInteraction\r\n ? (overrideInteraction(model) ?? null)\r\n : buildCartesianInteraction(model);\r\n\r\n if (anim.enabled && renderer) {\r\n entrance = runCartesianEntrance(\r\n surface,\r\n model,\r\n renderer,\r\n tokens,\r\n currentSpec.background,\r\n anim,\r\n finishEntrance,\r\n );\r\n }\r\n } else {\r\n const renderer = customRenderers[type];\r\n if (renderer) {\r\n const ctx: RenderContext = {\r\n emphasis,\r\n store,\r\n param: ownParam?.name,\r\n def: ownParam?.select,\r\n sourceData: baseData,\r\n framed: options?.frame === true,\r\n requestRedraw: () => {\r\n if (!destroyed) draw(false);\r\n },\r\n };\r\n interactionModel = renderer(surface, effectiveSpec, tokens, size, ctx) ?? null;\r\n } else {\r\n drawPlaceholder(surface, tokens, `“${type}” renderer not yet registered`);\r\n }\r\n if (anim.enabled) {\r\n entrance = runFadeEntrance(surface, anim, finishEntrance);\r\n }\r\n }\r\n\r\n if (!interaction) interaction = new InteractionController(surface, tokens);\r\n interaction.setModel(interactionModel, tokens);\r\n // Wire click/tap selection when this chart defines a param and its model can\r\n // resolve a pick. Slicers publish via the render context instead.\r\n if (ownParam && interactionModel?.pick) {\r\n const cfg: SelectConfig = { store, param: ownParam.name, def: ownParam.select };\r\n interaction.setSelect({ onPick: (value) => applyPick(cfg, value) });\r\n } else {\r\n interaction.setSelect(null);\r\n }\r\n\r\n applyA11y(surface, currentSpec);\r\n\r\n // Animated entrances signal ready on their final frame; everything else now.\r\n if (!entrance) signalReady(surface);\r\n\r\n // If text was measured with fallback metrics (web font still loading), arm a\r\n // one-shot corrective redraw for when the real font arrives.\r\n armFontRefresh();\r\n // Sketch charts use a bundled handwriting font that loads lazily; once it's\r\n // ready, redraw so text is laid out with its real glyph metrics.\r\n armSketchFont();\r\n };\r\n\r\n // Entrance completion: mark ready, then apply any font-load correction that was\r\n // deferred so it wouldn't interrupt the animation.\r\n const finishEntrance = (): void => {\r\n signalReady(surface);\r\n if (pendingFontRefresh && !destroyed) {\r\n pendingFontRefresh = false;\r\n draw(false);\r\n }\r\n };\r\n\r\n // Self-healing layout: a chart drawn before its web font loads is measured with\r\n // fallback metrics. Listen once for the font and redraw with real metrics. If\r\n // an entrance is mid-flight, defer the redraw to its completion to avoid a snap.\r\n const armFontRefresh = (): void => {\r\n if (fontRefreshArmed || !fontsLoading()) return;\r\n fontRefreshArmed = true;\r\n onFontsReady(() => {\r\n fontRefreshArmed = false;\r\n if (destroyed) return;\r\n if (entrance) {\r\n pendingFontRefresh = true;\r\n } else {\r\n draw(false);\r\n }\r\n });\r\n };\r\n\r\n // The sketch font is bundled and loads lazily (data URL, no network). When it\r\n // first becomes available, redraw once so handwriting metrics replace the\r\n // fallback ones. `ensureSketchFont` resolves `true` only on the load that\r\n // actually injected it, so this never loops.\r\n const armSketchFont = (): void => {\r\n if (sketchFontArmed || !resolveSketch(currentSpec)?.font) return;\r\n sketchFontArmed = true;\r\n void ensureSketchFont().then((loaded) => {\r\n if (loaded && !destroyed) draw(false);\r\n });\r\n };\r\n\r\n const autoResize =\r\n currentSpec.dimensions?.autoResize ??\r\n (currentSpec.dimensions?.width == null || currentSpec.dimensions?.height == null);\r\n\r\n if (autoResize && typeof ResizeObserver !== 'undefined') {\r\n // Redraw on container resize, but only when the measured size actually\r\n // diverges from what we last drew. That skips the redundant delivery the\r\n // observer fires on observe() (same size as the explicit draw below) while\r\n // still honoring a resize that lands before the first delivery — e.g. a\r\n // dashboard that mounts a view and then reflows its grid. (Unconditionally\r\n // skipping the first delivery dropped that reflow, leaving the chart stuck at\r\n // its pre-reflow size on any redraw where a font load didn't mask it.)\r\n // Resizes never animate — they must be instant to avoid jank while dragging.\r\n observer = new ResizeObserver(() => {\r\n if (destroyed) return;\r\n const s = resolveSize(container, currentSpec);\r\n if (s.width === lastDrawnW && s.height === lastDrawnH) return;\r\n draw(false);\r\n });\r\n observer.observe(container);\r\n }\r\n\r\n // React to selection changes: notify host listeners, then redraw if the change\r\n // touches a param this chart consumes (its highlight or a filter clause).\r\n const unsubscribe = store.subscribe((name, value) => {\r\n for (const listener of [...hostListeners]) listener(name, value);\r\n if (destroyed) return;\r\n if (dependentParams(currentSpec.highlight, currentSpec.filter).has(name)) {\r\n draw(false);\r\n }\r\n });\r\n\r\n draw(true);\r\n\r\n return {\r\n get spec() {\r\n return currentSpec;\r\n },\r\n surface,\r\n store,\r\n getSelection(name?: string): SelectionValue | null | Record<string, SelectionValue | null> {\r\n return name === undefined ? store.all() : store.get(name);\r\n },\r\n setSelection(name: string, value: SelectionValue | null): void {\r\n store.set(name, value);\r\n },\r\n clearSelection(name?: string): void {\r\n store.clear(name);\r\n },\r\n on(_event: 'selectionchange', listener: SelectionChangeListener): () => void {\r\n hostListeners.add(listener);\r\n return () => hostListeners.delete(listener);\r\n },\r\n off(_event: 'selectionchange', listener: SelectionChangeListener): void {\r\n hostListeners.delete(listener);\r\n },\r\n update(next: ChartSpec): void {\r\n updateTransition?.cancel();\r\n updateTransition = undefined;\r\n\r\n // Seed any newly-introduced initial param values from the next spec.\r\n for (const param of next.params ?? []) {\r\n if (param.value !== undefined && store.get(param.name) == null) {\r\n store.set(param.name, param.value ?? null);\r\n }\r\n }\r\n\r\n // Decide whether to cross-fade the marks layer: both the outgoing and\r\n // incoming chart must be canvas-mark kinds, motion must be enabled, and\r\n // the surface size must be unchanged (a dimension change is a resize, not\r\n // a data morph — those snap to avoid a stretched bitmap).\r\n const prevType = currentSpec.type;\r\n const prevW = surface.width;\r\n const prevH = surface.height;\r\n const anim = resolveUpdate(next.animation, {\r\n reducedMotion: prefersReducedMotion(),\r\n disabled: globalThis.__GRAPHEIN_DISABLE_ANIM === true,\r\n });\r\n const wantFade =\r\n anim.enabled && CANVAS_MARK_TYPES.has(prevType) && CANVAS_MARK_TYPES.has(next.type);\r\n const before = wantFade ? snapshotLayer(surface.marks) : undefined;\r\n\r\n currentSpec = next;\r\n draw(false);\r\n\r\n if (\r\n before &&\r\n surface.width === prevW &&\r\n surface.height === prevH &&\r\n surface.marks.canvas.width === before.width &&\r\n surface.marks.canvas.height === before.height\r\n ) {\r\n updateTransition = runUpdateCrossfade(surface, before, anim);\r\n }\r\n },\r\n resize(): void {\r\n draw(false);\r\n },\r\n destroy(): void {\r\n destroyed = true;\r\n unsubscribe();\r\n hostListeners.clear();\r\n entrance?.cancel();\r\n updateTransition?.cancel();\r\n observer?.disconnect();\r\n interaction?.destroy();\r\n surface.destroy();\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Cartesian entrance: a left-to-right wipe with a brief fade. Gridlines + axis\r\n * baselines stay fully drawn while the data marks sweep in. The final frame is\r\n * pixel-identical to a static draw.\r\n */\r\nfunction runCartesianEntrance(\r\n surface: Surface,\r\n model: CartesianModel,\r\n renderer: CartesianRenderer,\r\n tokens: ThemeTokens,\r\n background: string | undefined,\r\n anim: ResolvedEntrance,\r\n onDone: () => void,\r\n): AnimationHandle {\r\n const ctx = surface.marks.ctx;\r\n const { plot } = model;\r\n const bg = background ?? tokens.color.background;\r\n\r\n const paintFrame = (t: number): void => {\r\n surface.marks.clear();\r\n ctx.save();\r\n ctx.fillStyle = bg;\r\n ctx.fillRect(0, 0, surface.width, surface.height);\r\n ctx.restore();\r\n drawAxesUnderlay(surface, model);\r\n if (t <= 0) return;\r\n ctx.save();\r\n ctx.globalAlpha = Math.min(1, 0.2 + 0.8 * t);\r\n ctx.beginPath();\r\n ctx.rect(plot.x, plot.y, plot.width * t, plot.height + 1);\r\n ctx.clip();\r\n renderer(surface, model);\r\n ctx.restore();\r\n };\r\n\r\n paintFrame(0);\r\n return animate({\r\n duration: anim.duration,\r\n easing: anim.easing,\r\n onUpdate: paintFrame,\r\n onComplete: () => {\r\n paintFrame(1);\r\n onDone();\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Custom-chart entrance: a compositor-friendly opacity + slight upward rise of\r\n * the whole surface. Used for charts whose content is already fully painted\r\n * (pie/heatmap canvas, kpi/table/matrix DOM), so re-running the renderer per\r\n * frame isn't needed.\r\n */\r\nfunction runFadeEntrance(\r\n surface: Surface,\r\n anim: ResolvedEntrance,\r\n onDone: () => void,\r\n): AnimationHandle {\r\n const root = surface.root;\r\n const apply = (t: number): void => {\r\n root.style.opacity = String(t);\r\n const dy = (1 - t) * 8;\r\n root.style.transform = dy > 0.02 ? `translateY(${dy.toFixed(2)}px)` : '';\r\n };\r\n\r\n apply(0);\r\n return animate({\r\n duration: anim.duration,\r\n easing: anim.easing,\r\n onUpdate: apply,\r\n onComplete: () => {\r\n root.style.opacity = '';\r\n root.style.transform = '';\r\n onDone();\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Copy a canvas layer's current backing store into a detached canvas so it can\r\n * be composited later (used to cross-fade the previous frame on update()).\r\n */\r\nfunction snapshotLayer(layer: CanvasLayer): HTMLCanvasElement {\r\n const off = document.createElement('canvas');\r\n off.width = layer.canvas.width;\r\n off.height = layer.canvas.height;\r\n if (off.width > 0 && off.height > 0) {\r\n const octx = off.getContext('2d');\r\n octx?.drawImage(layer.canvas, 0, 0);\r\n }\r\n return off;\r\n}\r\n\r\n/**\r\n * Update transition: cross-fade the marks layer from the previous frame to the\r\n * freshly drawn one. The new frame is already live on the canvas when this runs,\r\n * so we snapshot it and composite `new` under `old` with `old` fading out. The\r\n * final frame is pixel-identical to the static (instant) draw.\r\n */\r\nfunction runUpdateCrossfade(\r\n surface: Surface,\r\n before: HTMLCanvasElement,\r\n anim: ResolvedEntrance,\r\n): AnimationHandle {\r\n const after = snapshotLayer(surface.marks);\r\n const ctx = surface.marks.ctx;\r\n const w = surface.marks.width;\r\n const h = surface.marks.height;\r\n\r\n const paint = (t: number): void => {\r\n surface.marks.clear();\r\n ctx.save();\r\n ctx.globalAlpha = 1;\r\n ctx.drawImage(after, 0, 0, w, h);\r\n if (t < 1) {\r\n ctx.globalAlpha = 1 - t;\r\n ctx.drawImage(before, 0, 0, w, h);\r\n }\r\n ctx.restore();\r\n };\r\n\r\n paint(0);\r\n return animate({\r\n duration: anim.duration,\r\n easing: anim.easing,\r\n onUpdate: paint,\r\n onComplete: () => paint(1),\r\n });\r\n}\r\n\r\nfunction drawPlaceholder(surface: Surface, tokens: ThemeTokens, message: string): void {\r\n const ctx = surface.marks.ctx;\r\n ctx.save();\r\n ctx.fillStyle = tokens.color.textMuted;\r\n ctx.font = `${tokens.font.size.base}px ${tokens.font.family}`;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(message, surface.width / 2, surface.height / 2);\r\n ctx.restore();\r\n}\r\n","/**\r\n * Dashboard auto-wiring — pure spec rewriting that turns a set of views into\r\n * cross-interacting ones by injecting `params` (sources), `highlight`, and\r\n * `filter` (consumers) onto each view's spec. Kept side-effect free (no DOM, no\r\n * store) so it unit-tests in node and the runtime stays a thin shell.\r\n *\r\n * Rules (interactions: 'auto'):\r\n * - A **slicer** publishes a value on its field/param; every chart that *uses*\r\n * that field gets a `filter` clause for it (cross-filter).\r\n * - A **chart** click publishes a point selection on its key field(s); every\r\n * chart that uses *all* those fields (including itself) gets that param added\r\n * to its `highlight` union (cross-highlight). Matching on shared fields means\r\n * emphasis is always well-defined — a chart never dims itself to nothing.\r\n */\r\n\r\nimport type {\r\n BaseSlicerSpec,\r\n ChartSpec,\r\n Encoding,\r\n FieldDef,\r\n} from '../spec/types';\r\nimport { SLICER_TYPES } from '../spec/types';\r\nimport type {\r\n DashboardView,\r\n InteractionLink,\r\n} from '../spec/dashboard';\r\nimport type {\r\n FilterClause,\r\n HighlightConfig,\r\n SelectionParam,\r\n} from '../spec/selection';\r\n\r\n/** Chart types that support a click → point selection (mirror of `pick()`). */\r\nconst PICKABLE = new Set<ChartSpec['type']>(['bar', 'area', 'line', 'scatter', 'pie', 'heatmap', 'box']);\r\n\r\nexport function isSlicerType(type: ChartSpec['type']): boolean {\r\n return (SLICER_TYPES as readonly string[]).includes(type);\r\n}\r\n\r\nfunction fieldOf(channel: FieldDef | undefined): string | undefined {\r\n return channel && typeof channel.field === 'string' ? channel.field : undefined;\r\n}\r\n\r\n/** Every data field a chart's encoding references (used to test \"uses field\"). */\r\nexport function specFields(spec: ChartSpec): Set<string> {\r\n const out = new Set<string>();\r\n if (isSlicerType(spec.type)) {\r\n const f = (spec as BaseSlicerSpec).field;\r\n if (f) out.add(f);\r\n return out;\r\n }\r\n const enc = (spec as { encoding?: Encoding }).encoding;\r\n if (enc) {\r\n for (const key of Object.keys(enc) as (keyof Encoding)[]) {\r\n const f = fieldOf(enc[key]);\r\n if (f) out.add(f);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** The field(s) a click on this chart selects (mirror of each model's `pick`). */\r\nexport function keyFields(spec: ChartSpec): string[] {\r\n const enc = (spec as { encoding?: Encoding }).encoding ?? {};\r\n switch (spec.type) {\r\n case 'bar':\r\n case 'area':\r\n case 'line':\r\n case 'box': {\r\n const x = fieldOf(enc.x);\r\n return x ? [x] : [];\r\n }\r\n case 'scatter': {\r\n const series = fieldOf(enc.series) ?? fieldOf(enc.color);\r\n if (series) return [series];\r\n const x = fieldOf(enc.x);\r\n const y = fieldOf(enc.y);\r\n return x && y ? [x, y] : [];\r\n }\r\n case 'pie': {\r\n const c = fieldOf(enc.color);\r\n return c ? [c] : [];\r\n }\r\n case 'heatmap': {\r\n const x = fieldOf(enc.x);\r\n const y = fieldOf(enc.y);\r\n return x && y ? [x, y] : [];\r\n }\r\n default:\r\n return [];\r\n }\r\n}\r\n\r\n/** The param a slicer publishes to (explicit `param`, else its field). */\r\nexport function slicerParamName(spec: BaseSlicerSpec): string {\r\n return spec.param ?? spec.field;\r\n}\r\n\r\n// ---- spec mutation helpers (return new objects; never mutate inputs) --------\r\n\r\nfunction addParam(spec: ChartSpec, param: SelectionParam): ChartSpec {\r\n const params = spec.params ? [...spec.params] : [];\r\n if (params.some((p) => p.name === param.name)) return spec;\r\n return { ...spec, params: [...params, param] } as ChartSpec;\r\n}\r\n\r\nfunction addHighlight(spec: ChartSpec, paramName: string): ChartSpec {\r\n const existing = spec.highlight;\r\n const list: HighlightConfig[] = existing\r\n ? Array.isArray(existing)\r\n ? [...existing]\r\n : [existing]\r\n : [];\r\n if (list.some((h) => h.param === paramName)) return spec;\r\n list.push({ param: paramName });\r\n return { ...spec, highlight: list } as ChartSpec;\r\n}\r\n\r\nfunction addFilterParam(spec: ChartSpec, paramName: string): ChartSpec {\r\n const filter: FilterClause[] = spec.filter ? [...spec.filter] : [];\r\n if (filter.some((c) => 'param' in c && c.param === paramName)) return spec;\r\n filter.push({ param: paramName });\r\n return { ...spec, filter } as ChartSpec;\r\n}\r\n\r\nfunction usesAll(spec: ChartSpec, fields: readonly string[]): boolean {\r\n if (fields.length === 0) return false;\r\n const have = specFields(spec);\r\n return fields.every((f) => have.has(f));\r\n}\r\n\r\ninterface WiredSource {\r\n /** The view index this source belongs to. */\r\n view: number;\r\n /** The published param name. */\r\n param: string;\r\n /** Identity fields of the selection. */\r\n fields: string[];\r\n /** 'filter' (slicers) or 'highlight' (charts) by default. */\r\n as: 'filter' | 'highlight';\r\n /** True for slicer sources (already publish on their own). */\r\n slicer: boolean;\r\n}\r\n\r\n/** Source param name auto-assigned to a pickable chart that has no param yet. */\r\nfunction autoParamName(view: DashboardView): string {\r\n const existing = view.spec.params?.[0]?.name;\r\n return existing ?? `__sel__${view.id}`;\r\n}\r\n\r\n/**\r\n * Rewrite a dashboard's views, injecting the params/highlight/filter that\r\n * implement the requested cross-interaction. Returns new view objects with new\r\n * specs; inputs are not mutated.\r\n */\r\nexport function wireViews(\r\n views: DashboardView[],\r\n interactions: 'auto' | 'none' | InteractionLink[] | undefined,\r\n): DashboardView[] {\r\n const out = views.map((v) => ({ ...v, spec: v.spec }));\r\n if (interactions === 'none') return out;\r\n\r\n // 1) Resolve the source param for every view that can drive an interaction.\r\n const sources: WiredSource[] = [];\r\n out.forEach((v, i) => {\r\n const type = v.spec.type;\r\n if (isSlicerType(type)) {\r\n const s = v.spec as BaseSlicerSpec;\r\n sources.push({\r\n view: i,\r\n param: slicerParamName(s),\r\n fields: [s.field],\r\n as: s.as ?? 'filter',\r\n slicer: true,\r\n });\r\n } else if (PICKABLE.has(type)) {\r\n const fields = keyFields(v.spec);\r\n if (fields.length === 0) return;\r\n const param = autoParamName(v);\r\n sources.push({ view: i, param, fields, as: 'highlight', slicer: false });\r\n }\r\n });\r\n\r\n const explicit = Array.isArray(interactions);\r\n const byId = new Map(out.map((v, i) => [v.id, i]));\r\n\r\n if (!explicit) {\r\n // 2a) AUTO: filters fan out to the whole page (Power-BI-style — filtering\r\n // just subsets rows, so it's meaningful even for views that don't encode the\r\n // field, e.g. a KPI or table). Highlights are narrow: a chart click only\r\n // emphasizes views that use *all* its key fields, so per-mark emphasis is\r\n // well-defined (a chart always self-highlights).\r\n for (const src of sources) {\r\n // Pickable chart sources need a param injected so clicks publish.\r\n if (!src.slicer) {\r\n out[src.view].spec = addParam(out[src.view].spec, {\r\n name: src.param,\r\n select: { type: 'point', on: 'click', fields: src.fields },\r\n });\r\n }\r\n out.forEach((v, j) => {\r\n if (isSlicerType(v.spec.type)) return; // slicers aren't highlight/filter targets\r\n if (src.as === 'filter') {\r\n if (j === src.view) return; // a source doesn't filter itself\r\n out[j].spec = addFilterParam(out[j].spec, src.param);\r\n } else {\r\n if (!usesAll(v.spec, src.fields)) return;\r\n out[j].spec = addHighlight(out[j].spec, src.param);\r\n }\r\n });\r\n }\r\n return out;\r\n }\r\n\r\n // 2b) EXPLICIT links replace auto-wiring.\r\n const sourceByView = new Map(sources.map((s) => [s.view, s]));\r\n for (const link of interactions as InteractionLink[]) {\r\n const si = byId.get(link.source);\r\n if (si == null) continue;\r\n const src = sourceByView.get(si);\r\n const fields = link.fields ?? src?.fields ?? keyFields(out[si].spec);\r\n const as = link.as ?? src?.as ?? 'highlight';\r\n if (as === 'none' || fields.length === 0) continue;\r\n const param =\r\n src?.param ??\r\n (() => {\r\n const name = autoParamName(out[si]);\r\n out[si].spec = addParam(out[si].spec, {\r\n name,\r\n select: { type: 'point', on: 'click', fields },\r\n });\r\n return name;\r\n })();\r\n // A chart source still needs its publishing param injected.\r\n if (src && !src.slicer) {\r\n out[si].spec = addParam(out[si].spec, {\r\n name: param,\r\n select: { type: 'point', on: 'click', fields },\r\n });\r\n }\r\n const targets =\r\n link.target === '*'\r\n ? out.map((_, j) => j).filter((j) => j !== si)\r\n : (Array.isArray(link.target) ? link.target : [link.target])\r\n .map((id) => byId.get(id))\r\n .filter((j): j is number => j != null);\r\n for (const t of targets) {\r\n if (isSlicerType(out[t].spec.type)) continue;\r\n if (as === 'filter') out[t].spec = addFilterParam(out[t].spec, param);\r\n else out[t].spec = addHighlight(out[t].spec, param);\r\n }\r\n }\r\n return out;\r\n}\r\n","/**\r\n * Dashboard runtime — `renderDashboard(container, spec)`.\r\n *\r\n * Lays views out on responsive CSS grids, shares one {@link SelectionStore}\r\n * across them, and auto-wires cross-interaction (slicers filter charts; chart\r\n * clicks cross-highlight charts that share the field). Each view is mounted with\r\n * the same `render()` used for standalone charts — the dashboard is mostly a\r\n * spec rewriter (see {@link wireViews}) plus layout and a shared bus, so all of\r\n * Phase 1's filter/highlight machinery is reused unchanged.\r\n */\r\n\r\nimport type { ChartSpec } from '../spec/types';\r\nimport type { DashboardLayout, DashboardSection, DashboardSpec, DashboardView } from '../spec/dashboard';\r\nimport type { SelectionValue } from '../spec/selection';\r\nimport { resolveTheme, type ThemeTokens } from '../theme';\r\nimport { createSelectionStore, type SelectionStore } from '../interaction/store';\r\nimport { render, type ChartInstance, type SelectionChangeListener } from './render';\r\nimport { wireViews, isSlicerType } from './wire';\r\n\r\nexport interface RenderDashboardOptions {\r\n /** Share a bus with charts/dashboards outside this one. */\r\n store?: SelectionStore;\r\n}\r\n\r\nexport interface DashboardInstance {\r\n /** Re-render with a new dashboard spec (keeps the shared store/selection). */\r\n update(spec: DashboardSpec): void;\r\n /** Re-measure every view. */\r\n resize(): void;\r\n /** Tear down all views, observers, and listeners. */\r\n destroy(): void;\r\n /** The currently rendered dashboard spec. */\r\n readonly spec: DashboardSpec;\r\n /** The shared selection bus driving cross-interaction. */\r\n readonly store: SelectionStore;\r\n /** The mounted chart instances, in view order. */\r\n readonly views: ChartInstance[];\r\n getSelection(name?: string): SelectionValue | null | Record<string, SelectionValue | null>;\r\n setSelection(name: string, value: SelectionValue | null): void;\r\n clearSelection(name?: string): void;\r\n on(event: 'selectionchange', listener: SelectionChangeListener): () => void;\r\n off(event: 'selectionchange', listener: SelectionChangeListener): void;\r\n}\r\n\r\nconst DEFAULTS = { cols: 12, rowHeight: 96, gap: 14 } as const;\r\nconst DENSITY: Record<NonNullable<DashboardLayout['density']>, { rowHeight: number; gap: number }> = {\r\n compact: { rowHeight: 80, gap: 10 },\r\n standard: { rowHeight: DEFAULTS.rowHeight, gap: DEFAULTS.gap },\r\n comfortable: { rowHeight: 116, gap: 18 },\r\n};\r\nconst DEFAULT_BREAKPOINTS: { maxWidth: number; cols: number }[] = [\r\n { maxWidth: 600, cols: 1 },\r\n { maxWidth: 960, cols: 6 },\r\n];\r\n/** Compact slicers that belong in the top navigator strip (lists stay in the grid). */\r\nconst STRIP_SLICERS = new Set(['dropdown', 'search', 'dateRange', 'range']);\r\n\r\nconst clamp = (v: number, lo: number, hi: number): number => Math.max(lo, Math.min(hi, v));\r\n\r\ntype ResolvedLayout = Required<Pick<DashboardLayout, 'cols' | 'rowHeight' | 'gap'>> &\r\n Pick<DashboardLayout, 'breakpoints' | 'navigators' | 'sections' | 'preset' | 'maxWidth' | 'density' | 'padding'>;\r\ntype WiredView = DashboardView & { spec: ChartSpec };\r\ntype Cell = {\r\n el: HTMLElement;\r\n view: WiredView;\r\n x?: number;\r\n y?: number;\r\n w: number;\r\n h: number;\r\n baseCols: number;\r\n};\r\ntype SectionPlan = {\r\n section?: DashboardSection;\r\n views: WiredView[];\r\n cols: number;\r\n rowHeight: number;\r\n collapsed: boolean;\r\n explicit: boolean;\r\n};\r\n\r\n/** Default column/row span for a view, by type (at full column count). */\r\nfunction defaultSpan(spec: ChartSpec, cols: number): { w: number; h: number } {\r\n const t = spec.type;\r\n if (isSlicerType(t)) return { w: Math.min(3, cols), h: 2 };\r\n if (t === 'kpi') return { w: Math.min(3, cols), h: 2 };\r\n if (t === 'table' || t === 'matrix') return { w: cols, h: 4 };\r\n if (t === 'funnel' || t === 'pie') return { w: Math.min(4, cols), h: 4 };\r\n return { w: Math.min(6, cols), h: 4 };\r\n}\r\n\r\nexport function resolveDashboardLayout(layout?: DashboardLayout): ResolvedLayout {\r\n const density = layout?.density ?? 'standard';\r\n const dense = DENSITY[density];\r\n return {\r\n cols: layout?.cols ?? DEFAULTS.cols,\r\n rowHeight: layout?.rowHeight ?? dense.rowHeight,\r\n gap: layout?.gap ?? dense.gap,\r\n breakpoints: layout?.breakpoints,\r\n navigators: layout?.navigators,\r\n sections: layout?.sections,\r\n preset: layout?.preset,\r\n maxWidth: layout?.maxWidth,\r\n density: layout?.density,\r\n padding: layout?.padding,\r\n };\r\n}\r\n\r\nfunction resolveContainer(target: HTMLElement | string): HTMLElement {\r\n if (typeof target === 'string') {\r\n const el = document.querySelector(target);\r\n if (!el) throw new Error(`Graphein: no element matches selector \"${target}\"`);\r\n return el as HTMLElement;\r\n }\r\n return target;\r\n}\r\n\r\n/** Inherit the dashboard's data/theme/background onto a (wired) view spec. */\r\nfunction inheritInto(spec: ChartSpec, dash: DashboardSpec, tokens: ThemeTokens, suppressTitle = false): ChartSpec {\r\n const next = { ...spec } as ChartSpec & { data?: unknown; theme?: unknown; background?: string; title?: unknown };\r\n if (next.data == null && dash.data) next.data = dash.data;\r\n next.theme = spec.theme ?? dash.theme;\r\n if (next.background == null) next.background = tokens.color.surface;\r\n if (suppressTitle) delete next.title;\r\n return next as ChartSpec;\r\n}\r\n\r\nfunction hasExplicitPlacement(view: DashboardView): boolean {\r\n return view.x != null || view.y != null || view.w != null || view.h != null;\r\n}\r\n\r\nfunction placeViews(views: WiredView[], cols: number, preset: DashboardLayout['preset']): Cell[] {\r\n if (!preset || preset === 'auto') {\r\n return views.map((view) => {\r\n const span = defaultSpan(view.spec, cols);\r\n return { el: undefined as unknown as HTMLElement, view, x: view.x, y: view.y, w: view.w ?? span.w, h: view.h ?? span.h, baseCols: cols };\r\n });\r\n }\r\n\r\n const cells: Cell[] = [];\r\n const cursor = { x: 1, y: 1, rowH: 0 };\r\n const pack = (view: WiredView, forced?: { x?: number; y?: number; w?: number; h?: number }): Cell => {\r\n const span = defaultSpan(view.spec, cols);\r\n const w = forced?.w ?? view.w ?? span.w;\r\n const h = forced?.h ?? view.h ?? span.h;\r\n if (forced?.x != null || forced?.y != null || view.x != null || view.y != null) {\r\n return { el: undefined as unknown as HTMLElement, view, x: forced?.x ?? view.x, y: forced?.y ?? view.y, w, h, baseCols: cols };\r\n }\r\n if (cursor.x + w - 1 > cols) {\r\n cursor.x = 1;\r\n cursor.y += Math.max(1, cursor.rowH);\r\n cursor.rowH = 0;\r\n }\r\n const cell = { el: undefined as unknown as HTMLElement, view, x: cursor.x, y: cursor.y, w, h, baseCols: cols };\r\n cursor.x += w;\r\n cursor.rowH = Math.max(cursor.rowH, h);\r\n return cell;\r\n };\r\n\r\n const explicit = views.filter(hasExplicitPlacement);\r\n const unplaced = views.filter((v) => !hasExplicitPlacement(v));\r\n for (const view of explicit) cells.push(pack(view));\r\n\r\n if (preset === 'kpi-first') {\r\n const ordered = [...unplaced].sort((a, b) => (b.spec.type === 'kpi' ? 1 : 0) - (a.spec.type === 'kpi' ? 1 : 0));\r\n for (const view of ordered) cells.push(pack(view));\r\n } else {\r\n const sidebar = unplaced.filter((v) => isSlicerType(v.spec.type) || v.spec.type === 'table' || v.spec.type === 'matrix');\r\n const content = unplaced.filter((v) => !sidebar.includes(v));\r\n const sideW = Math.min(3, cols);\r\n let sideY = 1;\r\n let contentY = 1;\r\n for (const view of sidebar) {\r\n const span = defaultSpan(view.spec, cols);\r\n const h = view.h ?? span.h;\r\n cells.push(pack(view, { x: 1, y: sideY, w: view.w ?? sideW, h }));\r\n sideY += h;\r\n }\r\n for (const view of content) {\r\n const span = defaultSpan(view.spec, cols);\r\n const h = view.h ?? span.h;\r\n cells.push(pack(view, { x: sideW + 1, y: contentY, w: view.w ?? Math.max(1, cols - sideW), h }));\r\n contentY += h;\r\n }\r\n }\r\n\r\n return cells.sort((a, b) => views.indexOf(a.view) - views.indexOf(b.view));\r\n}\r\n\r\nexport function resolveDashboardSections(\r\n views: WiredView[],\r\n layout: Pick<ResolvedLayout, 'cols' | 'rowHeight' | 'sections'>,\r\n): SectionPlan[] {\r\n if (!layout.sections?.length) {\r\n return [{ views, cols: Math.max(1, layout.cols), rowHeight: Math.max(1, layout.rowHeight), collapsed: false, explicit: false }];\r\n }\r\n const byId = new Map(views.map((v) => [v.id, v]));\r\n const used = new Set<string>();\r\n const plans: SectionPlan[] = [];\r\n for (const section of layout.sections) {\r\n const sectionViews = section.views.map((id) => byId.get(id)).filter((v): v is WiredView => !!v && !used.has(v.id));\r\n sectionViews.forEach((v) => used.add(v.id));\r\n plans.push({\r\n section,\r\n views: sectionViews,\r\n cols: Math.max(1, section.cols ?? layout.cols),\r\n rowHeight: Math.max(1, section.rowHeight ?? layout.rowHeight),\r\n collapsed: section.collapsed === true,\r\n explicit: true,\r\n });\r\n }\r\n const trailing = views.filter((v) => !used.has(v.id));\r\n if (trailing.length) {\r\n plans.push({ views: trailing, cols: Math.max(1, layout.cols), rowHeight: Math.max(1, layout.rowHeight), collapsed: false, explicit: true });\r\n }\r\n return plans;\r\n}\r\n\r\nfunction matchingResponsive(view: DashboardView, width: number): NonNullable<DashboardView['responsive']>[number] | undefined {\r\n return view.responsive\r\n ?.filter((r) => width <= r.maxWidth)\r\n .sort((a, b) => a.maxWidth - b.maxWidth)[0];\r\n}\r\n\r\nexport function renderDashboard(\r\n target: HTMLElement | string,\r\n spec: DashboardSpec,\r\n options?: RenderDashboardOptions,\r\n): DashboardInstance {\r\n const container = resolveContainer(target);\r\n const store = options?.store ?? createSelectionStore();\r\n\r\n let currentSpec = spec;\r\n const instances: ChartInstance[] = [];\r\n const hostListeners = new Set<SelectionChangeListener>();\r\n let root: HTMLElement | undefined;\r\n let resizeObs: ResizeObserver | undefined;\r\n let destroyed = false;\r\n\r\n const build = (): void => {\r\n const tokens = resolveTheme(currentSpec.theme);\r\n const layout = resolveDashboardLayout(currentSpec.layout);\r\n const baseCols = Math.max(1, layout.cols);\r\n const breakpoints = (layout.breakpoints ?? DEFAULT_BREAKPOINTS).slice().sort((a, b) => a.maxWidth - b.maxWidth);\r\n const navMode = layout.navigators ?? 'top';\r\n const pagePadding = layout.padding ?? Math.round(layout.gap * 1.4);\r\n\r\n // Seed dashboard-level initial param values (without clobbering live ones).\r\n for (const param of currentSpec.params ?? []) {\r\n if (param.value !== undefined && store.get(param.name) == null) {\r\n store.set(param.name, param.value ?? null);\r\n }\r\n }\r\n\r\n root = document.createElement('div');\r\n root.className = 'graphein-dashboard';\r\n Object.assign(root.style, {\r\n boxSizing: 'border-box',\r\n width: currentSpec.dimensions?.width ? `${currentSpec.dimensions.width}px` : '100%',\r\n maxWidth: layout.maxWidth ? `${layout.maxWidth}px` : '',\r\n margin: layout.maxWidth ? '0 auto' : '',\r\n background: currentSpec.background ?? tokens.color.background,\r\n color: tokens.color.text,\r\n fontFamily: tokens.font.family,\r\n padding: `${pagePadding}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: `${layout.gap}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n // ---- Header: accent rule + title + subtitle ----------------------------\r\n const titleText =\r\n typeof currentSpec.title === 'string' ? currentSpec.title : currentSpec.title?.text;\r\n if (titleText || currentSpec.subtitle) {\r\n const header = document.createElement('div');\r\n Object.assign(header.style, {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: `${tokens.spacing.md}px`,\r\n padding: `0 ${tokens.spacing.xs}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const accent = document.createElement('div');\r\n Object.assign(accent.style, {\r\n flex: '0 0 auto',\r\n width: '5px',\r\n alignSelf: 'stretch',\r\n minHeight: '34px',\r\n borderRadius: '3px',\r\n background: tokens.color.accent,\r\n } as Partial<CSSStyleDeclaration>);\r\n header.appendChild(accent);\r\n\r\n const titles = document.createElement('div');\r\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '3px' } as Partial<CSSStyleDeclaration>);\r\n if (titleText) {\r\n const h = document.createElement('div');\r\n h.textContent = titleText;\r\n Object.assign(h.style, {\r\n font: `${tokens.font.weight.bold} ${tokens.font.size.title}px ${tokens.font.family}`,\r\n color: tokens.color.text,\r\n letterSpacing: '-0.01em',\r\n lineHeight: '1.15',\r\n } as Partial<CSSStyleDeclaration>);\r\n titles.appendChild(h);\r\n }\r\n if (currentSpec.subtitle) {\r\n const sub = document.createElement('div');\r\n sub.textContent = currentSpec.subtitle;\r\n Object.assign(sub.style, {\r\n font: `${tokens.font.weight.normal} ${tokens.font.size.small}px ${tokens.font.family}`,\r\n color: tokens.color.textMuted,\r\n } as Partial<CSSStyleDeclaration>);\r\n titles.appendChild(sub);\r\n }\r\n header.appendChild(titles);\r\n root.appendChild(header);\r\n }\r\n\r\n const wired = wireViews(currentSpec.views as DashboardView[], currentSpec.interactions ?? 'auto') as WiredView[];\r\n\r\n // ---- Partition: top-strip navigators vs grid views ---------------------\r\n const sectionedIds = new Set((layout.sections ?? []).flatMap((section) => section.views));\r\n const stripViews =\r\n navMode === 'top'\r\n ? wired.filter((v) => STRIP_SLICERS.has(v.spec.type) && v.x == null && v.y == null && !sectionedIds.has(v.id))\r\n : [];\r\n const stripIds = new Set(stripViews.map((v) => v.id));\r\n const gridViews = wired.filter((v) => !stripIds.has(v.id));\r\n\r\n const mount = (host: HTMLElement, view: WiredView): void => {\r\n const finalSpec = inheritInto(view.spec, currentSpec, tokens, !!(view.title || view.subtitle));\r\n try {\r\n instances.push(render(host, finalSpec, { store, frame: view.frame ?? true }));\r\n } catch (err) {\r\n host.textContent = String(err);\r\n }\r\n };\r\n\r\n const cellChrome = (cell: HTMLElement, view?: DashboardView): void => {\r\n const framed = view?.frame ?? true;\r\n Object.assign(cell.style, {\r\n minWidth: '0',\r\n minHeight: '0',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n boxSizing: 'border-box',\r\n borderRadius: framed ? `${tokens.radius.lg}px` : '0',\r\n border: framed ? `1px solid ${tokens.color.border}` : '0',\r\n background: view?.background ?? (framed ? tokens.color.surface : 'transparent'),\r\n } as Partial<CSSStyleDeclaration>);\r\n };\r\n\r\n const createCard = (view: WiredView): { cell: HTMLElement; host: HTMLElement } => {\r\n const cell = document.createElement('div');\r\n cellChrome(cell, view);\r\n cell.setAttribute('data-view-id', view.id);\r\n const hasCardChrome =\r\n !!(view.title || view.subtitle || view.accent || view.background || view.frame === false || view.padding === 'none');\r\n if (!hasCardChrome) return { cell, host: cell };\r\n\r\n Object.assign(cell.style, { display: 'flex', flexDirection: 'column' } as Partial<CSSStyleDeclaration>);\r\n // Remember the intended display so the responsive pass in applyLayout can\r\n // restore it after toggling visibility (it must not clobber `flex`).\r\n cell.dataset.cardDisplay = 'flex';\r\n if (view.accent) {\r\n const accent = document.createElement('div');\r\n Object.assign(accent.style, {\r\n position: 'absolute',\r\n left: '0',\r\n top: '0',\r\n bottom: '0',\r\n width: '5px',\r\n background: view.accent,\r\n pointerEvents: 'none',\r\n } as Partial<CSSStyleDeclaration>);\r\n cell.appendChild(accent);\r\n }\r\n\r\n const inset = view.padding === 'none' ? 0 : tokens.spacing.sm;\r\n if (view.title || view.subtitle) {\r\n const header = document.createElement('div');\r\n Object.assign(header.style, {\r\n flex: '0 0 auto',\r\n padding: `${tokens.spacing.sm}px ${tokens.spacing.md}px ${tokens.spacing.xs}px ${tokens.spacing.md}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '2px',\r\n } as Partial<CSSStyleDeclaration>);\r\n if (view.title) {\r\n const title = document.createElement('div');\r\n title.textContent = view.title;\r\n Object.assign(title.style, {\r\n font: `${tokens.font.weight.bold} ${tokens.font.size.base}px ${tokens.font.family}`,\r\n color: tokens.color.text,\r\n letterSpacing: '-0.01em',\r\n } as Partial<CSSStyleDeclaration>);\r\n header.appendChild(title);\r\n }\r\n if (view.subtitle) {\r\n const subtitle = document.createElement('div');\r\n subtitle.textContent = view.subtitle;\r\n Object.assign(subtitle.style, {\r\n font: `${tokens.font.weight.normal} ${tokens.font.size.small}px ${tokens.font.family}`,\r\n color: tokens.color.textMuted,\r\n } as Partial<CSSStyleDeclaration>);\r\n header.appendChild(subtitle);\r\n }\r\n cell.appendChild(header);\r\n }\r\n const host = document.createElement('div');\r\n Object.assign(host.style, {\r\n flex: '1 1 auto',\r\n minWidth: '0',\r\n minHeight: '0',\r\n padding: `${inset}px`,\r\n boxSizing: 'border-box',\r\n } as Partial<CSSStyleDeclaration>);\r\n cell.appendChild(host);\r\n return { cell, host };\r\n };\r\n\r\n const sectionPlans = resolveDashboardSections(gridViews, layout);\r\n const layoutGroups: { grid: HTMLElement; cells: Cell[]; baseCols: number }[] = [];\r\n\r\n // Views are mounted via `render()`, which measures the host to size its\r\n // canvas/overlay. A host that is still detached measures 0 and falls back to\r\n // a 640px default — and because ResizeObserver delivers no initial callback\r\n // for a detached element, the corrective post-attach resize is skipped, so\r\n // the view stays at 640px (overflowing/clipping its cell — most visibly a\r\n // slicer whose right handle is clipped). So we build the skeleton first and\r\n // defer every mount until after the root is in the document.\r\n const deferredMounts: { el: HTMLElement; view: WiredView; mounted: boolean }[] = [];\r\n\r\n // ---- Navigator strip ---------------------------------------------------\r\n if (stripViews.length) {\r\n const strip = document.createElement('div');\r\n Object.assign(strip.style, {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: `${layout.gap}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n for (const view of stripViews) {\r\n const { cell, host } = createCard(view);\r\n Object.assign(cell.style, {\r\n flex: '1 1 220px',\r\n minWidth: '200px',\r\n height: `${Math.max(96, layout.rowHeight + 8)}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n strip.appendChild(cell);\r\n deferredMounts.push({ el: host, view, mounted: false });\r\n }\r\n root.appendChild(strip);\r\n }\r\n\r\n // ---- Responsive tile grids / optional sections -------------------------\r\n for (const plan of sectionPlans) {\r\n let parent: HTMLElement = root;\r\n let body: HTMLElement | undefined;\r\n if (plan.explicit) {\r\n const section = document.createElement('section');\r\n section.className = 'graphein-dashboard-section';\r\n if (plan.section?.id) section.setAttribute('data-section-id', plan.section.id);\r\n Object.assign(section.style, {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: `${layout.gap}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n\r\n const header = document.createElement('button');\r\n header.type = 'button';\r\n Object.assign(header.style, {\r\n appearance: 'none',\r\n border: '0',\r\n borderBottom: `1px solid ${tokens.color.border}`,\r\n background: plan.section?.background ?? 'transparent',\r\n color: tokens.color.text,\r\n padding: `${tokens.spacing.sm}px ${tokens.spacing.xs}px`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: `${tokens.spacing.sm}px`,\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n borderRadius: `${tokens.radius.md}px ${tokens.radius.md}px 0 0`,\r\n fontFamily: tokens.font.family,\r\n } as Partial<CSSStyleDeclaration>);\r\n const titles = document.createElement('span');\r\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '2px' } as Partial<CSSStyleDeclaration>);\r\n if (plan.section?.title) {\r\n const title = document.createElement('span');\r\n title.textContent = plan.section.title;\r\n Object.assign(title.style, { fontWeight: String(tokens.font.weight.bold), fontSize: `${tokens.font.size.large}px` } as Partial<CSSStyleDeclaration>);\r\n titles.appendChild(title);\r\n }\r\n if (plan.section?.subtitle) {\r\n const subtitle = document.createElement('span');\r\n subtitle.textContent = plan.section.subtitle;\r\n Object.assign(subtitle.style, { color: tokens.color.textMuted, fontSize: `${tokens.font.size.small}px` } as Partial<CSSStyleDeclaration>);\r\n titles.appendChild(subtitle);\r\n }\r\n if (!plan.section?.title && !plan.section?.subtitle) {\r\n const spacer = document.createElement('span');\r\n spacer.textContent = 'Section';\r\n Object.assign(spacer.style, { color: tokens.color.textMuted, fontSize: `${tokens.font.size.small}px` } as Partial<CSSStyleDeclaration>);\r\n titles.appendChild(spacer);\r\n }\r\n const marker = document.createElement('span');\r\n marker.textContent = plan.collapsed ? '+' : '−';\r\n Object.assign(marker.style, { color: tokens.color.accent, fontWeight: String(tokens.font.weight.bold) } as Partial<CSSStyleDeclaration>);\r\n header.appendChild(titles);\r\n header.appendChild(marker);\r\n section.appendChild(header);\r\n\r\n body = document.createElement('div');\r\n Object.assign(body.style, { display: plan.collapsed ? 'none' : 'block' } as Partial<CSSStyleDeclaration>);\r\n section.appendChild(body);\r\n header.addEventListener('click', () => {\r\n if (!body) return;\r\n const nextCollapsed = body.style.display !== 'none';\r\n body.style.display = nextCollapsed ? 'none' : 'block';\r\n marker.textContent = nextCollapsed ? '+' : '−';\r\n if (!nextCollapsed) {\r\n applyAllLayouts();\r\n for (const m of deferredMounts) {\r\n if (!m.mounted && body.contains(m.el)) {\r\n mount(m.el, m.view);\r\n m.mounted = true;\r\n }\r\n }\r\n for (const inst of instances) inst.resize();\r\n }\r\n });\r\n root.appendChild(section);\r\n parent = body;\r\n }\r\n\r\n const grid = document.createElement('div');\r\n Object.assign(grid.style, {\r\n display: 'grid',\r\n gridAutoRows: `${plan.rowHeight}px`,\r\n gap: `${layout.gap}px`,\r\n } as Partial<CSSStyleDeclaration>);\r\n parent.appendChild(grid);\r\n\r\n const cells = placeViews(plan.views, plan.cols, layout.preset ?? 'auto');\r\n for (const cellInfo of cells) {\r\n const { cell, host } = createCard(cellInfo.view);\r\n grid.appendChild(cell);\r\n cellInfo.el = cell;\r\n deferredMounts.push({ el: host, view: cellInfo.view, mounted: false });\r\n }\r\n layoutGroups.push({ grid, cells, baseCols: plan.cols });\r\n }\r\n\r\n const effectiveCols = (width: number, cols: number): number => {\r\n for (const bp of breakpoints) {\r\n if (width <= bp.maxWidth) return Math.max(1, Math.min(bp.cols, cols));\r\n }\r\n return cols;\r\n };\r\n\r\n // ---- Layout engine: reflow tile spans/columns by available width -------\r\n const applyLayout = (width: number): void => {\r\n for (const group of layoutGroups) {\r\n const gridWidth = Math.round(group.grid.getBoundingClientRect().width || width);\r\n const effCols = effectiveCols(gridWidth, group.baseCols);\r\n group.grid.style.gridTemplateColumns = `repeat(${effCols}, minmax(0, 1fr))`;\r\n const fullWidth = effCols === group.baseCols;\r\n for (const c of group.cells) {\r\n const resp = matchingResponsive(c.view, gridWidth);\r\n c.el.style.display = resp?.hidden ? 'none' : (c.el.dataset.cardDisplay ?? '');\r\n if (resp?.hidden) continue;\r\n const w = resp?.w ?? c.w;\r\n const h = resp?.h ?? c.h;\r\n const scaledW = clamp(Math.round((w * effCols) / group.baseCols), 1, effCols);\r\n c.el.style.gridColumn =\r\n fullWidth && c.x != null ? `${c.x} / span ${Math.min(w, group.baseCols)}` : `span ${scaledW}`;\r\n c.el.style.gridRow = fullWidth && c.y != null ? `${c.y} / span ${h}` : `span ${h}`;\r\n }\r\n }\r\n };\r\n\r\n const applyAllLayouts = (): void => applyLayout(measure());\r\n\r\n const measure = (): number =>\r\n Math.round(root?.getBoundingClientRect().width || container.clientWidth || baseCols * 80);\r\n\r\n // Attach, set every grid's columns/spans, THEN mount — so each cell already\r\n // has its final size and every view draws correctly on first paint (no\r\n // mount-at-wrong-size churn, no reliance on a later resize to correct it).\r\n container.appendChild(root);\r\n applyLayout(measure());\r\n\r\n const isVisibleForInitialMount = (el: HTMLElement): boolean => {\r\n for (let cur: HTMLElement | null = el; cur && cur !== root; cur = cur.parentElement) {\r\n if (cur.style.display === 'none') return false;\r\n }\r\n return true;\r\n };\r\n\r\n const mountVisibleDeferred = (): void => {\r\n for (const m of deferredMounts) {\r\n if (!m.mounted && root?.contains(m.el) && isVisibleForInitialMount(m.el)) {\r\n mount(m.el, m.view);\r\n m.mounted = true;\r\n }\r\n }\r\n };\r\n\r\n for (const m of deferredMounts) {\r\n if (!m.mounted && root.contains(m.el) && isVisibleForInitialMount(m.el)) {\r\n mount(m.el, m.view);\r\n m.mounted = true;\r\n }\r\n }\r\n\r\n if (typeof ResizeObserver !== 'undefined' && root) {\r\n resizeObs = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect.width ?? measure();\r\n applyLayout(Math.round(w));\r\n mountVisibleDeferred();\r\n });\r\n resizeObs.observe(root);\r\n }\r\n };\r\n\r\n const teardown = (): void => {\r\n if (resizeObs) {\r\n resizeObs.disconnect();\r\n resizeObs = undefined;\r\n }\r\n for (const inst of instances) inst.destroy();\r\n instances.length = 0;\r\n if (root && root.parentNode) root.parentNode.removeChild(root);\r\n root = undefined;\r\n };\r\n\r\n const unsubscribe = store.subscribe((name, value) => {\r\n for (const listener of [...hostListeners]) listener(name, value);\r\n });\r\n\r\n build();\r\n\r\n return {\r\n get spec() {\r\n return currentSpec;\r\n },\r\n store,\r\n views: instances,\r\n getSelection(name?: string) {\r\n return name === undefined ? store.all() : store.get(name);\r\n },\r\n setSelection(name: string, value: SelectionValue | null): void {\r\n store.set(name, value);\r\n },\r\n clearSelection(name?: string): void {\r\n store.clear(name);\r\n },\r\n on(_event: 'selectionchange', listener: SelectionChangeListener): () => void {\r\n hostListeners.add(listener);\r\n return () => hostListeners.delete(listener);\r\n },\r\n off(_event: 'selectionchange', listener: SelectionChangeListener): void {\r\n hostListeners.delete(listener);\r\n },\r\n update(next: DashboardSpec): void {\r\n if (destroyed) return;\r\n teardown();\r\n currentSpec = next;\r\n build();\r\n },\r\n resize(): void {\r\n for (const inst of instances) inst.resize();\r\n },\r\n destroy(): void {\r\n destroyed = true;\r\n unsubscribe();\r\n hostListeners.clear();\r\n teardown();\r\n },\r\n };\r\n}\r\n","/**\r\n * graphein — public entry point.\r\n *\r\n * The barrel grows as modules land. Keep exports explicit and tree-shakeable.\r\n */\r\nexport const VERSION = '0.1.0';\r\n\r\nexport * from './types';\r\nexport * from './scales';\r\nexport * from './ticks';\r\nexport * from './color';\r\nexport * from './shape';\r\nexport * from './rough';\r\nexport * from './decimate';\r\nexport * from './animation';\r\nexport * from './a11y';\r\nexport * from './pivot';\r\nexport * from './render';\r\nexport * from './theme';\r\nexport * from './spec';\r\nexport * from './format';\r\nexport * from './layout';\r\nexport * from './axes';\r\nexport * from './charts';\r\nexport * from './interaction';\r\nexport * from './runtime';\r\n"]}