@opendata-ai/openchart-engine 2.10.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/compile.ts","../src/annotations/compute.ts","../src/charts/bar/compute.ts","../src/charts/utils.ts","../src/charts/bar/labels.ts","../src/charts/bar/index.ts","../src/charts/column/compute.ts","../src/charts/column/labels.ts","../src/charts/column/index.ts","../src/charts/dot/compute.ts","../src/charts/dot/labels.ts","../src/charts/dot/index.ts","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/constant.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/math.js","../../../node_modules/.bun/d3-path@3.1.0/node_modules/d3-path/src/path.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/path.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/arc.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/array.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/point.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/line.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/area.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/descending.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/identity.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/pie.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/offset/none.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/order/none.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/stack.js","../src/charts/line/area.ts","../src/charts/line/compute.ts","../src/charts/line/labels.ts","../src/charts/line/index.ts","../src/charts/pie/compute.ts","../src/charts/pie/labels.ts","../src/charts/pie/index.ts","../src/charts/registry.ts","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ascending.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/descending.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisector.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/number.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisect.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/extent.js","../../../node_modules/.bun/internmap@2.0.3/node_modules/internmap/src/index.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ticks.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/max.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/min.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/range.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/init.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/ordinal.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/band.js","../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/define.js","../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/color.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basis.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basisClosed.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/constant.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/color.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/numberArray.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/array.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/date.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/number.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/object.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/value.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/round.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/constant.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/number.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/continuous.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatDecimal.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/exponent.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatGroup.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatNumerals.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatSpecifier.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTrim.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatPrefixAuto.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatRounded.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTypes.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/identity.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/locale.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/defaultLocale.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionFixed.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionPrefix.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionRound.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/tickFormat.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/nice.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/log.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/pow.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/interval.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/millisecond.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/duration.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/second.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/minute.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/hour.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/day.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/week.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/month.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/year.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/ticks.js","../../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/locale.js","../../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/defaultLocale.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/time.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/sequential.js","../src/charts/scatter/compute.ts","../src/charts/scatter/trendline.ts","../src/charts/scatter/index.ts","../src/compiler/normalize.ts","../src/compiler/validate.ts","../src/compiler/index.ts","../src/graphs/compile-graph.ts","../src/graphs/encoding.ts","../src/graphs/community.ts","../src/layout/axes.ts","../src/layout/dimensions.ts","../src/layout/gridlines.ts","../src/layout/scales.ts","../src/legend/compute.ts","../src/tables/compile-table.ts","../src/tables/bar-column.ts","../src/tables/category-colors.ts","../src/tables/utils.ts","../src/tables/format-cells.ts","../src/tables/heatmap.ts","../src/tables/pagination.ts","../src/tables/search.ts","../src/tables/sort.ts","../src/tables/sparkline.ts","../src/tooltips/compute.ts"],"sourcesContent":["/**\n * Main compile API: the public entry points for the engine.\n *\n * Pipeline for charts:\n * validate spec -> normalize -> resolve theme -> dark mode adapt ->\n * compute legend -> compute dimensions (with legend space) ->\n * compute scales -> compute axes -> compute gridlines ->\n * get chart renderer -> compute marks -> compute a11y -> return ChartLayout\n *\n * Table compiler handles full data pipeline (sort, search, pagination, visual enhancements).\n * Graph compiler is a stub for future implementation.\n */\n\nimport type {\n ChartLayout,\n CompileOptions,\n CompileTableOptions,\n Mark,\n PointMark,\n Rect,\n RectMark,\n ResolvedAnnotation,\n ResolvedTheme,\n TableLayout,\n} from '@opendata-ai/openchart-core';\nimport {\n adaptTheme,\n generateAltText,\n generateDataTable,\n getBreakpoint,\n getHeightClass,\n getLayoutStrategy,\n resolveTheme,\n} from '@opendata-ai/openchart-core';\nimport { computeAnnotations } from './annotations/compute';\nimport { barRenderer } from './charts/bar';\nimport { columnRenderer } from './charts/column';\nimport { dotRenderer } from './charts/dot';\nimport { areaRenderer, lineRenderer } from './charts/line';\nimport { donutRenderer, pieRenderer } from './charts/pie';\nimport { type ChartRenderer, getChartRenderer, registerChartRenderer } from './charts/registry';\nimport { scatterRenderer } from './charts/scatter';\nimport { compile as compileSpec } from './compiler/index';\n\n// Register all built-in chart renderers. Explicit imports ensure bundlers\n// cannot tree-shake the registrations away (bare side-effect imports are\n// treated as dead code by esbuild).\nconst builtinRenderers: Record<string, ChartRenderer> = {\n line: lineRenderer,\n area: areaRenderer,\n bar: barRenderer,\n column: columnRenderer,\n scatter: scatterRenderer,\n pie: pieRenderer,\n donut: donutRenderer,\n dot: dotRenderer,\n};\nfor (const [type, renderer] of Object.entries(builtinRenderers)) {\n registerChartRenderer(type, renderer);\n}\n\nimport type { NormalizedChartSpec, NormalizedTableSpec } from './compiler/types';\nimport { compileGraph as compileGraphImpl } from './graphs/compile-graph';\nimport type { GraphCompilation } from './graphs/types';\nimport { computeAxes } from './layout/axes';\nimport { computeDimensions } from './layout/dimensions';\nimport { computeGridlines } from './layout/gridlines';\nimport { computeScales, type ResolvedScales } from './layout/scales';\nimport { computeLegend } from './legend/compute';\nimport { compileTableLayout } from './tables/compile-table';\nimport { computeTooltipDescriptors } from './tooltips/compute';\n\n// ---------------------------------------------------------------------------\n// Mark obstacles for annotation collision avoidance\n// ---------------------------------------------------------------------------\n\n/**\n * Compute per-row bounding rects for band-scale charts (dot, bar).\n * Each obstacle covers the full band height and x-range of marks in that row,\n * giving the annotation nudge system awareness of data marks.\n */\nfunction computeRowObstacles(marks: Mark[], scales: ResolvedScales): Rect[] {\n if (!scales.y || scales.y.type !== 'band') return [];\n\n // Group marks by their y-center (rounded), compute x-extent per group\n const rows = new Map<number, { minX: number; maxX: number; bandY: number }>();\n\n for (const mark of marks) {\n let cy: number;\n let left: number;\n let right: number;\n\n if (mark.type === 'point') {\n const pm = mark as PointMark;\n cy = pm.cy;\n left = pm.cx - pm.r;\n right = pm.cx + pm.r;\n } else if (mark.type === 'rect') {\n const rm = mark as RectMark;\n cy = rm.y + rm.height / 2;\n left = rm.x;\n right = rm.x + rm.width;\n } else {\n continue;\n }\n\n // Round cy to group marks on the same band\n const key = Math.round(cy);\n const existing = rows.get(key);\n if (existing) {\n existing.minX = Math.min(existing.minX, left);\n existing.maxX = Math.max(existing.maxX, right);\n } else {\n rows.set(key, { minX: left, maxX: right, bandY: cy });\n }\n }\n\n // Get bandwidth from the band scale\n const bandScale = scales.y.scale as { bandwidth?: () => number };\n const bandwidth = bandScale.bandwidth?.() ?? 0;\n if (bandwidth === 0) return [];\n\n const obstacles: Rect[] = [];\n for (const { minX, maxX, bandY } of rows.values()) {\n obstacles.push({\n x: minX,\n y: bandY - bandwidth / 2,\n width: maxX - minX,\n height: bandwidth,\n });\n }\n\n return obstacles;\n}\n\n// ---------------------------------------------------------------------------\n// Chart compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a chart spec into a ChartLayout.\n *\n * This is the main engine entry point. Takes a raw spec (any shape,\n * validated at runtime) and compile options, produces a fully resolved\n * ChartLayout with positions, colors, and marks ready for rendering.\n *\n * @param spec - Raw chart spec (validated and normalized internally).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns ChartLayout with all computed positions.\n * @throws Error if spec is invalid or not a chart type.\n */\nexport function compileChart(spec: unknown, options: CompileOptions): ChartLayout {\n // Validate + normalize\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type === 'table') {\n throw new Error('compileChart received a table spec. Use compileTable instead.');\n }\n if (normalized.type === 'graph') {\n throw new Error('compileChart received a graph spec. Use compileGraph instead.');\n }\n\n let chartSpec = normalized as NormalizedChartSpec;\n\n // Responsive strategy\n const breakpoint = getBreakpoint(options.width);\n const heightClass = getHeightClass(options.height);\n const strategy = getLayoutStrategy(breakpoint, heightClass);\n\n // Apply breakpoint-conditional overrides from the original spec\n const rawSpec = spec as Record<string, unknown>;\n const overrides = rawSpec.overrides as\n | Partial<\n Record<\n string,\n { chrome?: unknown; labels?: unknown; legend?: unknown; annotations?: unknown }\n >\n >\n | undefined;\n if (overrides?.[breakpoint]) {\n const bp = overrides[breakpoint]!;\n if (bp.chrome) {\n chartSpec = {\n ...chartSpec,\n chrome: {\n ...chartSpec.chrome,\n ...(bp.chrome as NormalizedChartSpec['chrome']),\n },\n };\n }\n if (bp.labels) {\n chartSpec = {\n ...chartSpec,\n labels: {\n ...chartSpec.labels,\n ...(bp.labels as NormalizedChartSpec['labels']),\n },\n };\n }\n if (bp.legend) {\n chartSpec = {\n ...chartSpec,\n legend: {\n ...chartSpec.legend,\n ...(bp.legend as NormalizedChartSpec['legend']),\n },\n };\n }\n if (bp.annotations) {\n chartSpec = {\n ...chartSpec,\n annotations: bp.annotations as NormalizedChartSpec['annotations'],\n };\n }\n }\n\n // Resolve theme: merge spec-level theme with options-level overrides\n const mergedThemeConfig = options.theme\n ? { ...chartSpec.theme, ...options.theme }\n : chartSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n // Compute legend first (needs to reserve space)\n const preliminaryArea: Rect = {\n x: 0,\n y: 0,\n width: options.width,\n height: options.height,\n };\n const legendLayout = computeLegend(chartSpec, strategy, theme, preliminaryArea);\n\n // Compute dimensions (accounts for chrome + legend + responsive strategy)\n const dims = computeDimensions(chartSpec, options, legendLayout, theme, strategy);\n const chartArea = dims.chartArea;\n\n // Recompute legend bounds relative to actual chart area.\n // chartArea was shrunk to exclude legend space, so expand it back to include\n // the reserved margin. This way computeLegend positions the legend outside\n // the data area (in the margin) instead of overlapping data marks.\n const legendArea: Rect = { ...chartArea };\n if (legendLayout.entries.length > 0) {\n switch (legendLayout.position) {\n case 'top':\n legendArea.y -= legendLayout.bounds.height + 4;\n legendArea.height += legendLayout.bounds.height + 4;\n break;\n case 'bottom':\n legendArea.height += legendLayout.bounds.height + 4;\n break;\n case 'right':\n case 'bottom-right':\n legendArea.width += legendLayout.bounds.width + 8;\n break;\n }\n }\n const finalLegend = computeLegend(chartSpec, strategy, theme, legendArea);\n\n // Apply data filtering after legend (so legend retains all series), but before\n // scale computation (so hidden/clipped data doesn't affect domains or marks).\n let renderData = chartSpec.data;\n\n // Filter hidden series: removed from rendering but kept in legend (dimmed in the adapter)\n if (chartSpec.hiddenSeries.length > 0 && chartSpec.encoding.color) {\n const colorField = chartSpec.encoding.color.field;\n const hiddenSet = new Set(chartSpec.hiddenSeries);\n renderData = renderData.filter((row) => !hiddenSet.has(String(row[colorField])));\n }\n\n // Filter clipped scale domains: when scale.clip is true, exclude rows outside the domain\n for (const channel of ['x', 'y'] as const) {\n const enc = chartSpec.encoding[channel];\n if (!enc?.scale?.clip || !enc.scale.domain) continue;\n const domain = enc.scale.domain;\n const field = enc.field;\n if (Array.isArray(domain) && domain.length === 2 && typeof domain[0] === 'number') {\n const [lo, hi] = domain as [number, number];\n renderData = renderData.filter((row) => {\n const v = Number(row[field]);\n return Number.isFinite(v) && v >= lo && v <= hi;\n });\n }\n }\n\n // Build a filtered spec for scales and marks, keeping all other properties intact\n const renderSpec = renderData !== chartSpec.data ? { ...chartSpec, data: renderData } : chartSpec;\n\n // Compute scales\n const scales = computeScales(renderSpec, chartArea, renderSpec.data);\n\n // Update color scale to use theme palette\n if (scales.color) {\n if (scales.color.type === 'sequential') {\n // Sequential: use first sequential palette (or fall back to categorical endpoints)\n const seqStops = Object.values(theme.colors.sequential)[0] ?? theme.colors.categorical;\n (scales.color.scale as unknown as import('d3-scale').ScaleLinear<string, string>).range([\n seqStops[0],\n seqStops[seqStops.length - 1],\n ]);\n } else {\n (scales.color.scale as import('d3-scale').ScaleOrdinal<string, string>).range(\n theme.colors.categorical,\n );\n }\n }\n\n // Set default color for single-series charts (no color encoding)\n scales.defaultColor = theme.colors.categorical[0];\n\n // Pie/donut charts don't use axes or gridlines\n const isRadial = chartSpec.type === 'pie' || chartSpec.type === 'donut';\n\n // Compute axes (skip for radial charts)\n const axes = isRadial\n ? { x: undefined, y: undefined }\n : computeAxes(scales, chartArea, strategy, theme);\n\n // Compute gridlines (stored in axes, used by adapters via axes.y.gridlines)\n if (!isRadial) {\n computeGridlines(axes, chartArea);\n }\n\n // Get chart renderer and compute marks (using filtered data)\n const renderer = getChartRenderer(renderSpec.type);\n const marks: Mark[] = renderer ? renderer(renderSpec, scales, chartArea, strategy, theme) : [];\n\n // Compute annotations from spec, passing legend + mark bounds as obstacles for collision avoidance\n const obstacles: Rect[] = [];\n if (finalLegend.bounds.width > 0) {\n obstacles.push(finalLegend.bounds);\n }\n obstacles.push(...computeRowObstacles(marks, scales));\n const annotations: ResolvedAnnotation[] = computeAnnotations(\n chartSpec,\n scales,\n chartArea,\n strategy,\n theme.isDark,\n obstacles,\n );\n\n // Compute tooltip descriptors from marks and encoding\n const tooltipDescriptors = computeTooltipDescriptors(chartSpec, marks);\n\n // Compute accessibility\n const altText = generateAltText(\n {\n type: chartSpec.type,\n data: chartSpec.data,\n encoding: chartSpec.encoding,\n chrome: chartSpec.chrome,\n },\n chartSpec.data,\n );\n const dataTableFallback = generateDataTable(\n {\n type: chartSpec.type,\n data: chartSpec.data,\n encoding: chartSpec.encoding,\n },\n chartSpec.data,\n );\n\n return {\n area: chartArea,\n chrome: dims.chrome,\n axes: {\n x: axes.x,\n y: axes.y,\n },\n marks,\n annotations,\n legend: finalLegend,\n tooltipDescriptors,\n a11y: {\n altText,\n dataTableFallback,\n role: 'img',\n keyboardNavigable: marks.length > 0,\n },\n theme,\n dimensions: {\n width: options.width,\n height: options.height,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Table compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a table spec into a TableLayout.\n *\n * Validates and normalizes the spec, resolves the theme, then delegates\n * to compileTableLayout for the full pipeline: column resolution, search,\n * sort, pagination, cell formatting, and visual enhancements.\n *\n * @param spec - Raw table spec.\n * @param options - Compile options with sort, search, pagination state.\n * @returns Fully resolved TableLayout.\n */\nexport function compileTable(spec: unknown, options: CompileTableOptions): TableLayout {\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type !== 'table') {\n throw new Error(`compileTable received a ${normalized.type} spec. Use compileChart instead.`);\n }\n\n const tableSpec = normalized as NormalizedTableSpec;\n\n // Resolve theme: merge spec-level theme with options-level overrides\n const mergedThemeConfig = options.theme\n ? { ...tableSpec.theme, ...options.theme }\n : tableSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n return compileTableLayout(tableSpec, options, theme);\n}\n\n// ---------------------------------------------------------------------------\n// Graph compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a graph spec into a GraphCompilation.\n *\n * The graph pipeline resolves visual properties (size, color, stroke) for\n * nodes and edges, assigns communities, and builds legend/tooltip/a11y data.\n * Unlike charts, the output does NOT include x/y positions since the force\n * simulation in the adapter handles layout at runtime.\n *\n * @param spec - Raw graph spec (validated and normalized internally).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns GraphCompilation with resolved visual properties and simulation config.\n * @throws Error if spec is invalid or not a graph type.\n */\nexport function compileGraph(spec: unknown, options: CompileOptions): GraphCompilation {\n return compileGraphImpl(spec, options);\n}\n","/**\n * Annotation computation: converts spec-level annotations to pixel-positioned\n * ResolvedAnnotation objects using the resolved scales.\n *\n * Handles three annotation types:\n * - text: positioned at a data coordinate with an optional callout\n * - range: a highlighted rectangle between two data values\n * - refline: a horizontal or vertical reference line at a data value\n *\n * Supports fine-grained positioning via offset, anchor, connector, and zIndex.\n * At compact breakpoints, annotations are simplified or hidden.\n */\n\nimport type {\n AnnotationAnchor,\n AnnotationOffset,\n LayoutStrategy,\n Point,\n RangeAnnotation,\n Rect,\n RefLineAnnotation,\n ResolvedAnnotation,\n ResolvedLabel,\n TextAnnotation,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear, ScaleTime } from 'd3-scale';\nimport type { NormalizedChartSpec } from '../compiler/types';\nimport type { ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_ANNOTATION_FONT_SIZE = 12;\nconst DEFAULT_ANNOTATION_FONT_WEIGHT = 400;\nconst DEFAULT_LINE_HEIGHT = 1.3;\nconst DEFAULT_RANGE_FILL = '#f0c040';\nconst DEFAULT_RANGE_OPACITY = 0.15;\nconst DEFAULT_REFLINE_DASH = '4 3';\n\n// Theme-aware defaults for text and stroke colors\nconst LIGHT_TEXT_FILL = '#333333';\nconst DARK_TEXT_FILL = '#d1d5db';\nconst LIGHT_REFLINE_STROKE = '#888888';\nconst DARK_REFLINE_STROKE = '#9ca3af';\n\n/** Default label offset when using anchor directions. */\nconst ANCHOR_OFFSET = 8;\n\n/**\n * Interpolate a numeric value between sorted domain entries.\n * Used when an annotation references a value not present in a categorical domain\n * (e.g. \"2008\" on an axis with data points at \"2007\" and \"2009\").\n * Returns null if domain values aren't numeric or the domain is too small.\n */\nfunction interpolateInDomain(\n numValue: number,\n domain: string[],\n positionOf: (entry: string) => number,\n): number | null {\n if (domain.length < 2) return null;\n const nums = domain.map(Number);\n if (!nums.every(Number.isFinite)) return null;\n\n // Sort by numeric value so bracket-finding works regardless of data order\n const sorted = nums.map((n, i) => ({ n, i })).sort((a, b) => a.n - b.n);\n\n // Find the two sorted neighbors that bracket this value\n let lower = 0;\n let upper = sorted.length - 1;\n for (let i = 0; i < sorted.length; i++) {\n if (sorted[i].n <= numValue) lower = i;\n if (sorted[i].n >= numValue) {\n upper = i;\n break;\n }\n }\n\n const lowerPos = positionOf(domain[sorted[lower].i]);\n const upperPos = positionOf(domain[sorted[upper].i]);\n if (lower === upper) return lowerPos;\n const t = (numValue - sorted[lower].n) / (sorted[upper].n - sorted[lower].n);\n return lowerPos + t * (upperPos - lowerPos);\n}\n\n/** Resolve a data value to a pixel position on a given axis. */\nfunction resolvePosition(\n value: string | number,\n scale: ResolvedScales['x'] | ResolvedScales['y'],\n): number | null {\n if (!scale) return null;\n\n const s = scale.scale;\n const type = scale.type;\n\n if (type === 'time') {\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) return null;\n return (s as ScaleTime<number, number>)(date);\n }\n\n if (type === 'linear' || type === 'log') {\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(num)) return null;\n return (s as ScaleLinear<number, number>)(num);\n }\n\n if (type === 'band') {\n const bandScale = s as ScaleBand<string>;\n const strValue = String(value);\n const pos = bandScale(strValue);\n if (pos !== undefined) return pos + (bandScale.bandwidth?.() ?? 0) / 2;\n\n const bw = bandScale.bandwidth?.() ?? 0;\n return interpolateInDomain(\n Number(strValue),\n bandScale.domain(),\n (entry) => (bandScale(entry) ?? 0) + bw / 2,\n );\n }\n\n // point or ordinal: try direct lookup, fall back to interpolation\n const strValue = String(value);\n const directResult = (s as (v: string) => number | undefined)(strValue);\n if (directResult !== undefined) return directResult;\n\n if (type === 'point' || type === 'ordinal') {\n const domain = (s as { domain(): string[] }).domain();\n return interpolateInDomain(\n Number(strValue),\n domain,\n (entry) => (s as (v: string) => number)(entry) ?? 0,\n );\n }\n\n return null;\n}\n\nfunction makeAnnotationLabelStyle(\n fontSize?: number,\n fontWeight?: number,\n fill?: string,\n isDark?: boolean,\n): TextStyle {\n const defaultFill = isDark ? DARK_TEXT_FILL : LIGHT_TEXT_FILL;\n return {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE,\n fontWeight: fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT,\n fill: fill ?? defaultFill,\n lineHeight: DEFAULT_LINE_HEIGHT,\n textAnchor: 'start',\n };\n}\n\n/**\n * Compute the bounding box of annotation text at a given label position.\n * Multi-line text is centered at labelX; single-line starts at labelX.\n */\nfunction computeTextBounds(\n labelX: number,\n labelY: number,\n text: string,\n fontSize: number,\n fontWeight: number,\n): Rect {\n const lines = text.split('\\n');\n const isMultiLine = lines.length > 1;\n const maxWidth = Math.max(...lines.map((line) => estimateTextWidth(line, fontSize, fontWeight)));\n const totalHeight = lines.length * fontSize * DEFAULT_LINE_HEIGHT;\n const x = isMultiLine ? labelX - maxWidth / 2 : labelX;\n\n return {\n x,\n y: labelY - fontSize,\n width: maxWidth,\n height: totalHeight,\n };\n}\n\n/**\n * Apply anchor direction to compute label offset from data point.\n * Returns { dx, dy } pixel offsets.\n */\nfunction computeAnchorOffset(\n anchor: AnnotationAnchor | undefined,\n _px: number,\n py: number,\n chartArea: Rect,\n): { dx: number; dy: number } {\n if (!anchor || anchor === 'auto') {\n // Auto: place above if in the lower half, below if upper half\n const isUpperHalf = py < chartArea.y + chartArea.height / 2;\n return isUpperHalf\n ? { dx: ANCHOR_OFFSET, dy: ANCHOR_OFFSET } // below-right\n : { dx: ANCHOR_OFFSET, dy: -ANCHOR_OFFSET }; // above-right\n }\n\n switch (anchor) {\n case 'top':\n return { dx: 0, dy: -ANCHOR_OFFSET };\n case 'bottom':\n return { dx: 0, dy: ANCHOR_OFFSET };\n case 'left':\n return { dx: -ANCHOR_OFFSET, dy: 0 };\n case 'right':\n return { dx: ANCHOR_OFFSET, dy: 0 };\n }\n}\n\n/** Apply user offset on top of computed anchor offset. */\nfunction applyOffset(\n base: { dx: number; dy: number },\n offset: AnnotationOffset | undefined,\n): { dx: number; dy: number } {\n if (!offset) return base;\n return {\n dx: base.dx + (offset.dx ?? 0),\n dy: base.dy + (offset.dy ?? 0),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Connector origin: pick the edge midpoint closest to the data point\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the connector origin point on the text bounding box.\n * For straight connectors, finds the edge midpoint (top, bottom, left, right)\n * closest to the data point. For curve connectors, always uses the right edge.\n */\nfunction computeConnectorOrigin(\n labelX: number,\n labelY: number,\n text: string,\n fontSize: number,\n fontWeight: number,\n targetX: number,\n targetY: number,\n connectorStyle: 'straight' | 'curve',\n): { x: number; y: number } {\n const box = computeTextBounds(labelX, labelY, text, fontSize, fontWeight);\n const boxCenterX = box.x + box.width / 2;\n const boxCenterY = box.y + box.height / 2;\n\n // Curve connectors always start from the right edge\n if (connectorStyle === 'curve') {\n return {\n x: box.x + box.width,\n y: boxCenterY,\n };\n }\n\n // Normalize the vector from box center to target by the box half-dimensions.\n // This accounts for the box aspect ratio: a wide text box should prefer\n // top/bottom exits even when the target is also offset horizontally.\n const halfW = box.width / 2 || 1;\n const halfH = box.height / 2 || 1;\n const ndx = (targetX - boxCenterX) / halfW;\n const ndy = (targetY - boxCenterY) / halfH;\n\n if (Math.abs(ndy) >= Math.abs(ndx)) {\n // Target is more above/below than left/right → use top or bottom edge\n return ndy < 0\n ? { x: boxCenterX, y: box.y } // top\n : { x: boxCenterX, y: box.y + box.height }; // bottom\n }\n // Target is more left/right → use left or right edge\n return ndx < 0\n ? { x: box.x, y: boxCenterY } // left\n : { x: box.x + box.width, y: boxCenterY }; // right\n}\n\n// ---------------------------------------------------------------------------\n// Text annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveTextAnnotation(\n annotation: TextAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n const px = resolvePosition(annotation.x, scales.x);\n const py = resolvePosition(annotation.y, scales.y);\n\n if (px === null || py === null) return null;\n\n const defaultTextFill = isDark ? DARK_TEXT_FILL : LIGHT_TEXT_FILL;\n const labelStyle = makeAnnotationLabelStyle(\n annotation.fontSize,\n annotation.fontWeight,\n annotation.fill ?? defaultTextFill,\n isDark,\n );\n\n // Compute position from anchor direction + user offset\n const anchorDelta = computeAnchorOffset(annotation.anchor, px, py, chartArea);\n const finalDelta = applyOffset(anchorDelta, annotation.offset);\n\n const labelX = px + finalDelta.dx;\n const labelY = py + finalDelta.dy;\n\n // Connector: draw unless explicitly disabled\n const showConnector = annotation.connector !== false;\n const connectorStyle = annotation.connector === 'curve' ? 'curve' : 'straight';\n\n // Compute connector origin: pick the edge midpoint closest to the data point\n const fontSize = annotation.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const fontWeight = annotation.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n const { x: connectorFromX, y: connectorFromY } = computeConnectorOrigin(\n labelX,\n labelY,\n annotation.text,\n fontSize,\n fontWeight,\n px,\n py,\n connectorStyle,\n );\n\n // Apply user-provided connector endpoint offsets\n const baseFrom = { x: connectorFromX, y: connectorFromY };\n const baseTo = { x: px, y: py };\n const adjustedFrom = {\n x: baseFrom.x + (annotation.connectorOffset?.from?.dx ?? 0),\n y: baseFrom.y + (annotation.connectorOffset?.from?.dy ?? 0),\n };\n const adjustedToRaw = {\n x: baseTo.x + (annotation.connectorOffset?.to?.dx ?? 0),\n y: baseTo.y + (annotation.connectorOffset?.to?.dy ?? 0),\n };\n\n // Pull the \"to\" endpoint back along the connector direction so the\n // line doesn't touch the data point directly (leaves a small gap).\n const GAP = 4;\n const cdx = adjustedToRaw.x - adjustedFrom.x;\n const cdy = adjustedToRaw.y - adjustedFrom.y;\n const dist = Math.sqrt(cdx * cdx + cdy * cdy);\n const adjustedTo =\n dist > GAP * 2\n ? { x: adjustedToRaw.x - (cdx / dist) * GAP, y: adjustedToRaw.y - (cdy / dist) * GAP }\n : adjustedToRaw;\n\n const label: ResolvedLabel = {\n text: annotation.text,\n x: labelX,\n y: labelY,\n style: labelStyle,\n visible: true,\n connector: showConnector\n ? {\n from: adjustedFrom,\n to: adjustedTo,\n stroke: annotation.stroke ?? '#999999',\n style: connectorStyle,\n }\n : undefined,\n background: annotation.background,\n };\n\n return {\n type: 'text',\n label,\n stroke: annotation.stroke,\n fill: annotation.fill,\n opacity: annotation.opacity,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Range annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveRangeAnnotation(\n annotation: RangeAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n let x = chartArea.x;\n let y = chartArea.y;\n let width = chartArea.width;\n let height = chartArea.height;\n\n // X-range (vertical band)\n if (annotation.x1 !== undefined && annotation.x2 !== undefined) {\n const x1px = resolvePosition(annotation.x1, scales.x);\n const x2px = resolvePosition(annotation.x2, scales.x);\n if (x1px === null || x2px === null) return null;\n\n x = Math.min(x1px, x2px);\n width = Math.abs(x2px - x1px);\n }\n\n // Y-range (horizontal band)\n if (annotation.y1 !== undefined && annotation.y2 !== undefined) {\n const y1px = resolvePosition(annotation.y1, scales.y);\n const y2px = resolvePosition(annotation.y2, scales.y);\n if (y1px === null || y2px === null) return null;\n\n y = Math.min(y1px, y2px);\n height = Math.abs(y2px - y1px);\n }\n\n const rect: Rect = { x, y, width, height };\n\n // Label positioned within the range, with optional offset.\n // labelAnchor controls horizontal placement:\n // \"left\" (default): left edge, text-anchor start\n // \"top\"/\"auto\": horizontally centered, text-anchor middle\n // \"right\": right edge, text-anchor end\n let label: ResolvedLabel | undefined;\n if (annotation.label) {\n const anchor = annotation.labelAnchor ?? 'left';\n const centered = anchor === 'top' || anchor === 'bottom' || anchor === 'auto';\n const baseDx = centered ? 0 : anchor === 'right' ? -4 : 4;\n const baseDy = 14;\n const labelDelta = applyOffset({ dx: baseDx, dy: baseDy }, annotation.labelOffset);\n\n const style = makeAnnotationLabelStyle(11, 500, undefined, isDark);\n if (centered) {\n style.textAnchor = 'middle';\n } else if (anchor === 'right') {\n style.textAnchor = 'end';\n }\n\n const baseX = centered ? x + width / 2 : anchor === 'right' ? x + width : x;\n\n label = {\n text: annotation.label,\n x: baseX + labelDelta.dx,\n y: y + labelDelta.dy,\n style,\n visible: true,\n };\n }\n\n // In dark mode, boost range opacity slightly for better visibility\n const defaultOpacity = isDark ? 0.2 : DEFAULT_RANGE_OPACITY;\n\n return {\n type: 'range',\n rect,\n label,\n fill: annotation.fill ?? DEFAULT_RANGE_FILL,\n opacity: annotation.opacity ?? defaultOpacity,\n stroke: annotation.stroke,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Reference line annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveRefLineAnnotation(\n annotation: RefLineAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n let start: Point;\n let end: Point;\n\n if (annotation.y !== undefined) {\n // Horizontal reference line\n const yPx = resolvePosition(annotation.y, scales.y);\n if (yPx === null) return null;\n\n start = { x: chartArea.x, y: yPx };\n end = { x: chartArea.x + chartArea.width, y: yPx };\n } else if (annotation.x !== undefined) {\n // Vertical reference line\n const xPx = resolvePosition(annotation.x, scales.x);\n if (xPx === null) return null;\n\n start = { x: xPx, y: chartArea.y };\n end = { x: xPx, y: chartArea.y + chartArea.height };\n } else {\n return null;\n }\n\n // Determine dash pattern from style\n let strokeDasharray: string | undefined;\n if (annotation.style === 'dashed' || annotation.style === undefined) {\n strokeDasharray = DEFAULT_REFLINE_DASH;\n } else if (annotation.style === 'dotted') {\n strokeDasharray = '2 2';\n }\n // 'solid' gets no dasharray\n\n // Label at the right end for horizontal, top end for vertical, with optional offset.\n // Horizontal refline labels use text-anchor 'end' so text stays inside the chart.\n // labelAnchor controls which side of the line the label sits on:\n // \"top\" (default): above horizontal, left of vertical\n // \"bottom\": below horizontal, right of vertical\n let label: ResolvedLabel | undefined;\n if (annotation.label) {\n const isHorizontal = annotation.y !== undefined;\n const anchor = annotation.labelAnchor ?? 'top';\n const baseDx = isHorizontal ? -4 : 4;\n const baseDy = anchor === 'bottom' ? 14 : -4;\n const labelDelta = applyOffset({ dx: baseDx, dy: baseDy }, annotation.labelOffset);\n\n const defaultStroke = isDark ? DARK_REFLINE_STROKE : LIGHT_REFLINE_STROKE;\n const style = makeAnnotationLabelStyle(11, 400, annotation.stroke ?? defaultStroke, isDark);\n if (isHorizontal) {\n style.textAnchor = 'end';\n }\n\n label = {\n text: annotation.label,\n x: (isHorizontal ? end.x : start.x) + labelDelta.dx,\n y: (isHorizontal ? end.y : start.y) + labelDelta.dy,\n style,\n visible: true,\n };\n }\n\n const defaultStroke = isDark ? DARK_REFLINE_STROKE : LIGHT_REFLINE_STROKE;\n\n return {\n type: 'refline',\n line: { start, end },\n label,\n stroke: annotation.stroke ?? defaultStroke,\n strokeDasharray,\n strokeWidth: annotation.strokeWidth ?? 1,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Collision avoidance\n// ---------------------------------------------------------------------------\n\n/** Estimate the bounding box of an annotation label. */\nfunction estimateLabelBounds(label: ResolvedLabel): Rect {\n const fontSize = label.style.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const fontWeight = label.style.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n return computeTextBounds(label.x, label.y, label.text, fontSize, fontWeight);\n}\n\n/** Check if two rects overlap. */\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Padding between annotation and obstacle when nudging. */\nconst NUDGE_PADDING = 6;\n\n/**\n * Try to reposition a text annotation to avoid overlapping with obstacle rects\n * (legend bounds, etc.). First tries standard anchor alternatives, then\n * calculates specific offsets needed to clear obstacles. Returns true if moved.\n */\nfunction nudgeAnnotationFromObstacles(\n annotation: ResolvedAnnotation,\n originalAnnotation: TextAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n obstacles: Rect[],\n): boolean {\n if (annotation.type !== 'text' || !annotation.label) return false;\n\n const labelBounds = estimateLabelBounds(annotation.label);\n const collidingObs = obstacles.filter(\n (obs) => obs.width > 0 && obs.height > 0 && rectsOverlap(labelBounds, obs),\n );\n\n if (collidingObs.length === 0) return false;\n\n // Resolve the data point pixel position for offset calculations\n const px = resolvePosition(originalAnnotation.x, scales.x);\n const py = resolvePosition(originalAnnotation.y, scales.y);\n if (px === null || py === null) return false;\n\n // Generate candidate positions: calculated offsets to clear each obstacle\n const candidates: { dx: number; dy: number; distance: number }[] = [];\n const fontSize = labelBounds.height / Math.max(1, annotation.label.text.split('\\n').length);\n\n for (const obs of collidingObs) {\n // Below obstacle: shift label so its top edge clears the obstacle bottom\n const currentLabelTop = labelBounds.y;\n const targetLabelTop = obs.y + obs.height + NUDGE_PADDING;\n const belowDy = targetLabelTop - currentLabelTop;\n candidates.push({ dx: 0, dy: belowDy, distance: Math.abs(belowDy) });\n\n // Above obstacle: shift label so its bottom edge clears the obstacle top\n const currentLabelBottom = labelBounds.y + labelBounds.height;\n const targetLabelBottom = obs.y - NUDGE_PADDING;\n const aboveDy = targetLabelBottom - currentLabelBottom;\n candidates.push({ dx: 0, dy: aboveDy, distance: Math.abs(aboveDy) });\n\n // Left of obstacle: shift label so its right edge clears the obstacle left\n const currentLabelRight = labelBounds.x + labelBounds.width;\n const targetLabelRight = obs.x - NUDGE_PADDING;\n const leftDx = targetLabelRight - currentLabelRight;\n candidates.push({ dx: leftDx, dy: 0, distance: Math.abs(leftDx) });\n\n // Right of obstacle: shift label so its left edge clears the obstacle right\n const currentLabelLeft = labelBounds.x;\n const targetLabelLeft = obs.x + obs.width + NUDGE_PADDING;\n const rightDx = targetLabelLeft - currentLabelLeft;\n candidates.push({ dx: rightDx, dy: 0, distance: Math.abs(rightDx) });\n }\n\n // Sort candidates by distance (prefer smallest movement)\n candidates.sort((a, b) => a.distance - b.distance);\n\n for (const { dx, dy } of candidates) {\n const newLabelX = annotation.label.x + dx;\n const newLabelY = annotation.label.y + dy;\n\n // Recompute connector origin for the new label position so the connector\n // exits from the edge closest to the data point after nudging.\n let newConnector = annotation.label.connector;\n if (newConnector) {\n const annFontSize = annotation.label.style.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const annFontWeight = annotation.label.style.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n const connStyle = newConnector.style === 'curve' ? ('curve' as const) : ('straight' as const);\n const newFrom = computeConnectorOrigin(\n newLabelX,\n newLabelY,\n annotation.label.text,\n annFontSize,\n annFontWeight,\n px,\n py,\n connStyle,\n );\n newConnector = { ...newConnector, from: newFrom };\n }\n\n const candidateLabel: ResolvedLabel = {\n ...annotation.label,\n x: newLabelX,\n y: newLabelY,\n connector: newConnector,\n };\n\n const candidateBounds = estimateLabelBounds(candidateLabel);\n\n // Check no collisions with any obstacle\n const stillCollides = obstacles.some(\n (obs) => obs.width > 0 && obs.height > 0 && rectsOverlap(candidateBounds, obs),\n );\n if (stillCollides) continue;\n\n // Annotations render outside the clip path, so they can extend into margins.\n // Only check that the label center is reasonably within the chart and that\n // the text doesn't go completely off-screen.\n const labelCenterX = candidateBounds.x + candidateBounds.width / 2;\n const labelCenterY = candidateBounds.y + candidateBounds.height / 2;\n const inBounds =\n labelCenterX >= chartArea.x &&\n labelCenterX <= chartArea.x + chartArea.width + 100 &&\n labelCenterY >= chartArea.y - fontSize &&\n labelCenterY <= chartArea.y + chartArea.height + fontSize;\n\n if (inBounds) {\n // When nudged vertically (directly above/below the data), use a caret\n // instead of a connector line for a cleaner editorial look.\n if (candidateLabel.connector && dx === 0 && dy !== 0) {\n candidateLabel.connector = {\n ...candidateLabel.connector,\n style: 'caret',\n };\n }\n annotation.label = candidateLabel;\n return true;\n }\n }\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute resolved annotations from spec annotations using the resolved scales.\n *\n * Converts data-coordinate annotations to pixel-positioned ResolvedAnnotation\n * objects. Supports offset, anchor, connector, and zIndex. At compact\n * breakpoints, annotations are hidden (strategy says \"tooltip-only\").\n *\n * When obstacle rects are provided (e.g. legend bounds), text annotations\n * that overlap with them are automatically repositioned using alternate\n * anchor directions.\n */\nexport function computeAnnotations(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n isDark = false,\n obstacles: Rect[] = [],\n): ResolvedAnnotation[] {\n // At compact breakpoints, skip all annotations\n if (strategy.annotationPosition === 'tooltip-only') {\n return [];\n }\n\n const annotations: ResolvedAnnotation[] = [];\n\n for (const annotation of spec.annotations) {\n let resolved: ResolvedAnnotation | null = null;\n\n switch (annotation.type) {\n case 'text':\n resolved = resolveTextAnnotation(annotation, scales, chartArea, isDark);\n break;\n case 'range':\n resolved = resolveRangeAnnotation(annotation, scales, chartArea, isDark);\n break;\n case 'refline':\n resolved = resolveRefLineAnnotation(annotation, scales, chartArea, isDark);\n break;\n }\n\n if (resolved) {\n // For text annotations, check for collisions with obstacles and nudge if needed\n if (annotation.type === 'text' && obstacles.length > 0) {\n nudgeAnnotationFromObstacles(resolved, annotation, scales, chartArea, obstacles);\n }\n annotations.push(resolved);\n }\n }\n\n // Sort by zIndex (lower first, undefined treated as 0)\n annotations.sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n\n return annotations;\n}\n","/**\n * Bar chart (horizontal) mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * RectMark[] for rendering horizontal bars. Supports grouped and\n * stacked variants via the color encoding channel.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport { abbreviateNumber, formatNumber } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, getSequentialColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MIN_BAR_WIDTH = 1;\n\n/** Format a bar value for display (abbreviate large numbers). */\nfunction formatBarValue(value: number): string {\n if (Math.abs(value) >= 1000) return abbreviateNumber(value);\n return formatNumber(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute horizontal bar marks from a normalized chart spec.\n *\n * Y axis uses a band scale for categories. X axis uses a linear scale\n * for values. When a color encoding is present, bars within each category\n * are grouped (subdivided bands) or stacked (cumulative widths).\n */\nexport function computeBarMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): RectMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const yScale = scales.y.scale as ScaleBand<string>;\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n\n // Band scale should provide bandwidth\n if (typeof yScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = yScale.bandwidth();\n const baseline = xScale(0);\n const colorField = encoding.color?.field;\n const isSequentialColor = encoding.color?.type === 'quantitative';\n\n // If no color encoding, or sequential color (value-based gradient), render simple bars\n if (!colorField || isSequentialColor) {\n return computeSimpleBars(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n isSequentialColor,\n );\n }\n\n // Stacked bars when color is present\n return computeStackedBars(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n}\n\n/** Compute stacked horizontal bars. */\nfunction computeStackedBars(\n data: DataRow[],\n valueField: string,\n categoryField: string,\n colorField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n _baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n const categoryGroups = groupByField(data, categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n let cumulativeValue = 0;\n\n for (const row of rows) {\n const groupKey = String(row[colorField] ?? '');\n const value = Number(row[valueField] ?? 0);\n // Only stack positive values (same approach as stacked columns)\n if (!Number.isFinite(value) || value <= 0) continue;\n\n const color = getColor(scales, groupKey);\n\n const xLeft = xScale(cumulativeValue);\n const xRight = xScale(cumulativeValue + value);\n const barWidth = Math.max(Math.abs(xRight - xLeft), MIN_BAR_WIDTH);\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatBarValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: xLeft,\n y: bandY,\n width: barWidth,\n height: bandwidth,\n fill: color,\n cornerRadius: 0,\n data: row as Record<string, unknown>,\n aria,\n });\n\n cumulativeValue += value;\n }\n }\n\n return marks;\n}\n\n/** Compute simple (non-grouped) horizontal bars. */\nfunction computeSimpleBars(\n data: DataRow[],\n valueField: string,\n categoryField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n sequentialColor = false,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const color = sequentialColor\n ? getSequentialColor(scales, value)\n : getColor(scales, '__default__');\n const xPos = value >= 0 ? baseline : xScale(value);\n const barWidth = Math.max(Math.abs(xScale(value) - baseline), MIN_BAR_WIDTH);\n\n const aria: MarkAria = {\n label: `${category}: ${formatBarValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: xPos,\n y: bandY,\n width: barWidth,\n height: bandwidth,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Shared utilities for chart mark computation.\n *\n * Common helpers used across multiple chart types: scale value resolution,\n * data grouping, color lookup, and shared constants.\n */\n\nimport type { DataRow } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear, ScalePoint, ScaleTime } from 'd3-scale';\nimport type { D3Scale, ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default single-series color when no color encoding is present. */\nexport const DEFAULT_COLOR = '#1b7fa3';\n\n// ---------------------------------------------------------------------------\n// Scale helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a data value to a pixel position using a D3 scale.\n *\n * Handles time scales (parsing string dates), categorical scales\n * (point, band, ordinal - passing string values directly), and\n * linear/log scales (coercing to number). Returns null for values\n * that can't be resolved (null, NaN, invalid dates, or values not\n * in a categorical scale's domain).\n */\nexport function scaleValue(scale: D3Scale, scaleType: string, value: unknown): number | null {\n if (value == null) return null;\n\n if (scaleType === 'time') {\n const date = value instanceof Date ? value : new Date(String(value));\n if (Number.isNaN(date.getTime())) return null;\n return (scale as ScaleTime<number, number>)(date);\n }\n\n // Categorical scales: pass string values directly\n if (scaleType === 'point' || scaleType === 'band' || scaleType === 'ordinal') {\n const result = (scale as ScalePoint<string> | ScaleBand<string>)(String(value));\n return result ?? null;\n }\n\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(num)) return null;\n return (scale as ScaleLinear<number, number>)(num);\n}\n\n// ---------------------------------------------------------------------------\n// Data grouping\n// ---------------------------------------------------------------------------\n\n/**\n * Group data rows by a field value.\n *\n * If no field is provided, all rows are grouped under '__default__'.\n * Returns a Map preserving insertion order.\n */\nexport function groupByField(data: DataRow[], field: string | undefined): Map<string, DataRow[]> {\n const groups = new Map<string, DataRow[]>();\n\n if (!field) {\n groups.set('__default__', data);\n return groups;\n }\n\n for (const row of data) {\n const key = String(row[field] ?? '__default__');\n const existing = groups.get(key);\n if (existing) {\n existing.push(row);\n } else {\n groups.set(key, [row]);\n }\n }\n\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// Sorting\n// ---------------------------------------------------------------------------\n\n/**\n * Sort data rows by a field value in ascending order.\n *\n * Type-aware: numbers compared numerically, Date objects by timestamp,\n * string-encoded numbers parsed and compared numerically, and everything\n * else compared lexicographically (which also handles ISO date strings).\n * Nulls are sorted last. Returns a new array (no mutation).\n */\nexport function sortByField(data: DataRow[], field: string): DataRow[] {\n if (data.length <= 1) return [...data];\n\n return [...data].sort((a, b) => {\n const aVal = a[field];\n const bVal = b[field];\n\n // Nulls last\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n\n // Both numbers\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return aVal - bVal;\n }\n\n // Both Dates\n if (aVal instanceof Date && bVal instanceof Date) {\n return aVal.getTime() - bVal.getTime();\n }\n\n // String values: try numeric parse, then lexicographic\n const aStr = String(aVal);\n const bStr = String(bVal);\n\n const aNum = Number(aStr);\n const bNum = Number(bStr);\n if (Number.isFinite(aNum) && Number.isFinite(bNum)) {\n return aNum - bNum;\n }\n\n return aStr.localeCompare(bStr);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Color helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get the color for a series/category from the resolved color scale.\n *\n * For single-series charts (key === '__default__'), uses the theme's\n * first categorical color via scales.defaultColor.\n */\nexport function getColor(\n scales: ResolvedScales,\n key: string,\n _index?: number,\n fallback: string = DEFAULT_COLOR,\n): string {\n if (scales.color && key !== '__default__') {\n const colorScale = scales.color.scale as (v: string) => string;\n return colorScale(key);\n }\n return scales.defaultColor ?? fallback;\n}\n\n/**\n * Get color from a sequential (quantitative) color scale.\n * Maps a numeric value to a color via linear interpolation.\n */\nexport function getSequentialColor(\n scales: ResolvedScales,\n value: number,\n fallback: string = DEFAULT_COLOR,\n): string {\n if (scales.color?.type === 'sequential') {\n const colorScale = scales.color.scale as unknown as (v: number) => string;\n return colorScale(value);\n }\n return scales.defaultColor ?? fallback;\n}\n","/**\n * Bar chart label computation.\n *\n * Produces value labels for horizontal bars, positioned inside the bar\n * if the bar is wide enough, or outside (to the right) otherwise.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last bars only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n RectMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport {\n buildD3Formatter,\n estimateTextWidth,\n resolveCollisions,\n} from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_PADDING = 6;\nconst MIN_WIDTH_FOR_INSIDE_LABEL = 40;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for bar marks.\n *\n * For each bar, the value from the data is formatted and placed either\n * inside the bar (right-aligned) if the bar is wide enough, or just\n * outside the bar's right edge.\n */\nexport function computeBarLabels(\n marks: RectMark[],\n _chartArea: { x: number; y: number; width: number; height: number },\n density: LabelDensity = 'auto',\n labelFormat?: string,\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n\n const formatter = buildD3Formatter(labelFormat);\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\" or \"category, group: value\".\n // Use the last colon to split, which handles colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const rawValue = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!rawValue) continue;\n\n // Apply label format if provided (re-parse the number from the aria string)\n let valuePart = rawValue;\n if (formatter) {\n const num = Number(rawValue.replace(/[^0-9.-]/g, ''));\n if (!Number.isNaN(num)) valuePart = formatter(num);\n }\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // Detect stacked bars: cornerRadius 0 indicates stacked segment\n const isStacked = mark.cornerRadius === 0;\n\n // Determine if label goes inside or outside the bar\n const isInside = mark.width >= MIN_WIDTH_FOR_INSIDE_LABEL;\n\n let anchorX: number;\n let fill: string;\n let textAnchor: 'start' | 'end' | 'middle';\n\n if (isStacked && isInside) {\n // Stacked: centered within segment\n anchorX = mark.x + mark.width / 2;\n fill = '#ffffff';\n textAnchor = 'middle';\n } else if (isInside) {\n // Simple: right-aligned within bar\n anchorX = mark.x + mark.width - LABEL_PADDING;\n fill = '#ffffff';\n textAnchor = 'end';\n } else {\n // Outside: just past the bar's right edge\n anchorX = mark.x + mark.width + LABEL_PADDING;\n fill = mark.fill;\n textAnchor = 'start';\n }\n\n // anchorY = bar vertical center. With dominant-baseline: central,\n // SVG places the text center at this y coordinate.\n const anchorY = mark.y + mark.height / 2;\n\n candidates.push({\n text: valuePart,\n anchorX,\n anchorY,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill,\n lineHeight: 1.2,\n textAnchor,\n dominantBaseline: 'central',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Bar chart module (horizontal bars).\n *\n * Exports the bar chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeBarMarks } from './compute';\nimport { computeBarLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Bar chart renderer\n// ---------------------------------------------------------------------------\n\nexport const barRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeBarMarks(spec, scales, chartArea, strategy);\n\n // Compute and attach value labels (respects spec.labels.density)\n const labels = computeBarLabels(marks, chartArea, spec.labels.density, spec.labels.format);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeBarMarks } from './compute';\nexport { computeBarLabels } from './labels';\n","/**\n * Column chart (vertical bars) mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * RectMark[] for rendering vertical columns. When a color encoding\n * is present, columns are stacked (cumulative heights per category).\n *\n * Shares conceptual logic with bar chart but axes are swapped:\n * x-axis is categorical (band scale), y-axis is quantitative.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport { abbreviateNumber, formatNumber } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, getSequentialColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MIN_COLUMN_HEIGHT = 1;\n\n/** Format a column value for display (abbreviate large numbers). */\nfunction formatColumnValue(value: number): string {\n if (Math.abs(value) >= 1000) return abbreviateNumber(value);\n return formatNumber(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute vertical column marks from a normalized chart spec.\n *\n * X axis uses a band scale for categories. Y axis uses a linear scale\n * for values. When a color encoding is present, columns within each\n * category are stacked (cumulative heights).\n */\nexport function computeColumnMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): RectMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleBand<string>;\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n\n // Band scale should provide bandwidth\n if (typeof xScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = xScale.bandwidth();\n const baseline = yScale(0);\n const colorField = encoding.color?.field;\n\n const isSequentialColor = encoding.color?.type === 'quantitative';\n\n // Color encoding present: decide between colored simple columns vs stacked\n if (colorField && !isSequentialColor) {\n // Check if any category has multiple rows (actual stacking needed)\n const categoryGroups = groupByField(spec.data, xChannel.field);\n const needsStacking = Array.from(categoryGroups.values()).some((rows) => rows.length > 1);\n\n if (needsStacking) {\n return computeStackedColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n }\n\n // Single row per category: render like simple columns but with color from scale\n return computeColoredColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n }\n\n return computeSimpleColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n isSequentialColor,\n );\n}\n\n/** Compute simple (non-grouped) vertical columns. */\nfunction computeSimpleColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n sequentialColor = false,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n const color = sequentialColor\n ? getSequentialColor(scales, value)\n : getColor(scales, '__default__');\n const yPos = yScale(value);\n const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);\n\n // For positive values, column goes upward from baseline.\n // For negative values, column goes downward from baseline.\n const y = value >= 0 ? yPos : baseline;\n\n const aria: MarkAria = {\n label: `${category}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n\n/** Compute colored (non-stacked) vertical columns. Used when color encoding\n * is present but each category has only one row (e.g., diverging charts). */\nfunction computeColoredColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n colorField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n const groupKey = String(row[colorField] ?? '');\n const color = getColor(scales, groupKey);\n const yPos = yScale(value);\n const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);\n\n const y = value >= 0 ? yPos : baseline;\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n\n/** Compute stacked vertical columns. */\nfunction computeStackedColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n colorField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n _baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n const categoryGroups = groupByField(data, categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n let cumulativeValue = 0;\n\n for (const row of rows) {\n const groupKey = String(row[colorField] ?? '');\n const value = Number(row[valueField] ?? 0);\n // Stacking only applies to positive values; negative/zero rows are skipped\n // since cumulative stacking doesn't make visual sense for mixed signs.\n if (!Number.isFinite(value) || value <= 0) continue;\n\n const color = getColor(scales, groupKey);\n\n const yTop = yScale(cumulativeValue + value);\n const yBottom = yScale(cumulativeValue);\n const columnHeight = Math.max(Math.abs(yBottom - yTop), MIN_COLUMN_HEIGHT);\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y: yTop,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 0,\n data: row as Record<string, unknown>,\n aria,\n });\n\n cumulativeValue += value;\n }\n }\n\n return marks;\n}\n","/**\n * Column chart label computation.\n *\n * Produces value labels positioned above each column (for positive values)\n * or below (for negative values).\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last columns only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n RectMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport {\n buildD3Formatter,\n estimateTextWidth,\n resolveCollisions,\n} from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 10;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_OFFSET_Y = 6;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for column marks.\n *\n * For each column, the value is placed centered above the column top.\n */\nexport function computeColumnLabels(\n marks: RectMark[],\n _chartArea: { x: number; y: number; width: number; height: number },\n density: LabelDensity = 'auto',\n labelFormat?: string,\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const formatter = buildD3Formatter(labelFormat);\n\n const candidates: LabelCandidate[] = [];\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\" or \"category, group: value\".\n // Use the last colon to split, which handles colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const rawValue = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!rawValue) continue;\n\n // Apply label format if provided (re-parse the number from the aria string)\n let valuePart = rawValue;\n if (formatter) {\n const num = Number(rawValue.replace(/[^0-9.-]/g, ''));\n if (!Number.isNaN(num)) valuePart = formatter(num);\n }\n\n const numericValue = parseFloat(valuePart);\n const isNegative = Number.isFinite(numericValue) && numericValue < 0;\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // For positive values, place label above the column top.\n // For negative values, place label below the column bottom.\n const anchorX = mark.x + mark.width / 2;\n const anchorY = isNegative\n ? mark.y + mark.height + LABEL_OFFSET_Y\n : mark.y - LABEL_OFFSET_Y - textHeight;\n\n candidates.push({\n text: valuePart,\n anchorX,\n anchorY,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.fill,\n lineHeight: 1.2,\n textAnchor: 'middle',\n dominantBaseline: isNegative ? 'hanging' : 'auto',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Column chart module (vertical bars).\n *\n * Exports the column chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeColumnMarks } from './compute';\nimport { computeColumnLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Column chart renderer\n// ---------------------------------------------------------------------------\n\nexport const columnRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeColumnMarks(spec, scales, chartArea, strategy);\n\n // Compute and attach value labels (respects spec.labels.density)\n const labels = computeColumnLabels(marks, chartArea, spec.labels.density, spec.labels.format);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeColumnMarks } from './compute';\nexport { computeColumnLabels } from './labels';\n","/**\n * Dot plot / lollipop chart mark computation.\n *\n * Category axis (band scale) + value axis (linear scale). Produces\n * PointMark[] for the dots plus RectMark[] for lollipop stems\n * (thin lines from axis baseline to each dot).\n *\n * When a color encoding is present (multi-series), renders as a dumbbell\n * chart: a connecting bar spans min-to-max per category instead of\n * baseline-to-dot stems.\n */\n\nimport type {\n Encoding,\n LayoutStrategy,\n MarkAria,\n PointMark,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DOT_RADIUS = 6;\nconst STEM_WIDTH = 2;\nconst STEM_COLOR = '#cccccc';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute dot plot marks from a normalized chart spec.\n *\n * Y axis uses a band scale for categories. X axis uses a linear scale\n * for values. When no color encoding is present, each data point produces\n * a lollipop stem + dot. When color is present (multi-series), renders\n * connecting bars between min/max values per category (dumbbell style).\n */\nexport function computeDotMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): (PointMark | RectMark)[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n const yScale = scales.y.scale as ScaleBand<string>;\n\n // Band scale should provide bandwidth\n if (typeof yScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = yScale.bandwidth();\n const baseline = xScale(0);\n const colorField = encoding.color?.field;\n\n // Multi-series: dumbbell chart with connecting bars\n if (colorField) {\n return computeDumbbellMarks(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n scales,\n );\n }\n\n // Single series: lollipop stems from baseline\n return computeLollipopMarks(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dumbbell (multi-series)\n// ---------------------------------------------------------------------------\n\n/** Compute dumbbell marks: connecting bar + colored dots per category. */\nfunction computeDumbbellMarks(\n data: readonly Record<string, unknown>[],\n valueField: string,\n categoryField: string,\n colorField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n scales: ResolvedScales,\n): (PointMark | RectMark)[] {\n const marks: (PointMark | RectMark)[] = [];\n const categoryGroups = groupByField([...data], categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const cy = bandY + bandwidth / 2;\n\n // Collect all x-values for this category to find the range\n const xValues: number[] = [];\n for (const row of rows) {\n const value = Number(row[valueField] ?? 0);\n if (Number.isFinite(value)) xValues.push(value);\n }\n\n if (xValues.length === 0) continue;\n\n const minVal = Math.min(...xValues);\n const maxVal = Math.max(...xValues);\n const xLeft = xScale(minVal);\n const xRight = xScale(maxVal);\n const barWidth = Math.abs(xRight - xLeft);\n\n // Connecting bar (rendered first so dots layer on top)\n if (barWidth > 0) {\n const stemAria: MarkAria = {\n label: `Range for ${category}: ${minVal} to ${maxVal}`,\n };\n\n marks.push({\n type: 'rect',\n x: Math.min(xLeft, xRight),\n y: cy - STEM_WIDTH / 2,\n width: barWidth,\n height: STEM_WIDTH,\n fill: STEM_COLOR,\n data: rows[0] as Record<string, unknown>,\n aria: stemAria,\n });\n }\n\n // Individual dots for each series value\n for (const row of rows) {\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const cx = xScale(value);\n const colorCategory = String(row[colorField] ?? '');\n const color = getColor(scales, colorCategory);\n\n const dotAria: MarkAria = {\n label: `${category}, ${colorCategory}: ${value}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: DOT_RADIUS,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: row as Record<string, unknown>,\n aria: dotAria,\n });\n }\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Lollipop (single series)\n// ---------------------------------------------------------------------------\n\n/** Compute lollipop marks: stem from baseline + dot. */\nfunction computeLollipopMarks(\n data: readonly Record<string, unknown>[],\n valueField: string,\n categoryField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n): (PointMark | RectMark)[] {\n const marks: (PointMark | RectMark)[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const cx = xScale(value);\n const cy = bandY + bandwidth / 2;\n\n const color = getColor(scales, '__default__');\n\n // Stem: thin rectangle from baseline to dot center\n const stemX = Math.min(baseline, cx);\n const stemWidth = Math.abs(cx - baseline);\n\n if (stemWidth > 0) {\n const stemAria: MarkAria = {\n label: `Stem for ${category}`,\n };\n\n marks.push({\n type: 'rect',\n x: stemX,\n y: cy - STEM_WIDTH / 2,\n width: stemWidth,\n height: STEM_WIDTH,\n fill: STEM_COLOR,\n data: row as Record<string, unknown>,\n aria: stemAria,\n });\n }\n\n // Dot\n const dotAria: MarkAria = {\n label: `${category}: ${value}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: DOT_RADIUS,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: row as Record<string, unknown>,\n aria: dotAria,\n });\n }\n\n return marks;\n}\n","/**\n * Dot chart label computation.\n *\n * Produces value labels positioned to the right of each dot.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last dots only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n PointMark,\n Rect,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_OFFSET_X = 10;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for dot marks.\n *\n * Places labels to the right of each dot point.\n */\nexport function computeDotLabels(\n marks: PointMark[],\n _chartArea: Rect,\n density: LabelDensity = 'auto',\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\". Use the last colon to handle colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const valuePart = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!valuePart) continue;\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n candidates.push({\n text: valuePart,\n anchorX: mark.cx + mark.r + LABEL_OFFSET_X,\n anchorY: mark.cy - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.fill,\n lineHeight: 1.2,\n textAnchor: 'start',\n dominantBaseline: 'central',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Dot plot / lollipop chart module.\n *\n * Exports the dot chart renderer and computation functions.\n */\n\nimport type { Mark, PointMark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeDotMarks } from './compute';\nimport { computeDotLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Dot chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Dot/lollipop chart renderer.\n *\n * Produces stem (RectMark) and dot (PointMark) pairs for each data point.\n * Value labels are attached to the dot marks.\n */\nexport const dotRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeDotMarks(spec, scales, chartArea, strategy);\n\n // Extract just the point marks for label computation\n const pointMarks = marks.filter((m): m is PointMark => m.type === 'point');\n\n // Compute and attach labels to point marks (respects spec.labels.density)\n const labels = computeDotLabels(pointMarks, chartArea, spec.labels.density);\n let labelIdx = 0;\n for (const mark of marks) {\n if (mark.type === 'point' && labelIdx < labels.length) {\n mark.label = labels[labelIdx];\n labelIdx++;\n }\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeDotMarks } from './compute';\nexport { computeDotLabels } from './labels';\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(line);\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x0, y0, y1) {\n var x1 = null,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(area);\n\n x0 = typeof x0 === \"function\" ? x0 : (x0 === undefined) ? pointX : constant(+x0);\n y0 = typeof y0 === \"function\" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0);\n y1 = typeof y1 === \"function\" ? y1 : (y1 === undefined) ? pointY : constant(+y1);\n\n function area(data) {\n var i,\n j,\n k,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = (data = array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nfunction stackSeries(key) {\n const series = [];\n series.key = key;\n return series;\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i, n = sz.length, j = -1,\n oz;\n\n for (const d of data) {\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n\n for (i = 0, oz = array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","/**\n * Area chart mark computation.\n *\n * Uses D3 area() generator to produce AreaMark[] with top/bottom\n * boundary points and SVG path strings. Supports single areas and\n * stacked areas via d3-shape stack layout.\n */\n\nimport type { AreaMark, DataRow, Encoding, MarkAria, Rect } from '@opendata-ai/openchart-core';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area, curveMonotoneX, line, stack, stackOffsetNone, stackOrderNone } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, scaleValue, sortByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_FILL_OPACITY = 0.15;\n\n// ---------------------------------------------------------------------------\n// Single area (non-stacked)\n// ---------------------------------------------------------------------------\n\nfunction computeSingleArea(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) return [];\n\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n // Use the domain minimum as the baseline so the area fill doesn't drop\n // below the visible scale range when zero: false excludes 0 from the domain.\n const domain = yScale.domain();\n const baselineY = yScale(Math.min(domain[0], domain[1]));\n\n // Group by color field\n const colorField = encoding.color?.field;\n const groups = new Map<string, DataRow[]>();\n\n if (!colorField) {\n groups.set('__default__', spec.data);\n } else {\n for (const row of spec.data) {\n const key = String(row[colorField] ?? '__default__');\n const existing = groups.get(key);\n if (existing) {\n existing.push(row);\n } else {\n groups.set(key, [row]);\n }\n }\n }\n\n const marks: AreaMark[] = [];\n\n for (const [seriesKey, rows] of groups) {\n const color = getColor(scales, seriesKey);\n\n // Sort rows by x-axis field so areas draw left-to-right\n const sortedRows = sortByField(rows, xChannel.field);\n\n // Compute points, filtering out null values\n const validPoints: { x: number; yTop: number; yBottom: number; row: DataRow }[] = [];\n\n for (const row of sortedRows) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, row[xChannel.field]);\n const yVal = scaleValue(scales.y.scale, scales.y.type, row[yChannel.field]);\n\n if (xVal === null || yVal === null) continue;\n\n validPoints.push({\n x: xVal,\n yTop: yVal,\n yBottom: baselineY,\n row,\n });\n }\n\n if (validPoints.length === 0) continue;\n\n // Build the area path\n const areaGenerator = area<{ x: number; yTop: number; yBottom: number }>()\n .x((d) => d.x)\n .y0((d) => d.yBottom)\n .y1((d) => d.yTop)\n .curve(curveMonotoneX);\n\n const pathStr = areaGenerator(validPoints) ?? '';\n\n // Top-line path for stroking only the data line (not the baseline)\n const topLineGenerator = line<{ x: number; yTop: number }>()\n .x((d) => d.x)\n .y((d) => d.yTop)\n .curve(curveMonotoneX);\n const topPathStr = topLineGenerator(validPoints) ?? '';\n\n const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));\n const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));\n\n const ariaLabel =\n seriesKey === '__default__'\n ? `Area with ${validPoints.length} data points`\n : `${seriesKey}: area with ${validPoints.length} data points`;\n\n const aria: MarkAria = { label: ariaLabel };\n\n marks.push({\n type: 'area',\n topPoints,\n bottomPoints,\n path: pathStr,\n topPath: topPathStr,\n fill: color,\n fillOpacity: DEFAULT_FILL_OPACITY,\n stroke: color,\n strokeWidth: 2,\n seriesKey: seriesKey === '__default__' ? undefined : seriesKey,\n data: validPoints.map((p) => p.row),\n aria,\n });\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Stacked area\n// ---------------------------------------------------------------------------\n\nfunction computeStackedArea(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n const colorField = encoding.color?.field;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y || !colorField) {\n // If no color field, can't stack -- fall back to single area\n return computeSingleArea(spec, scales, chartArea);\n }\n\n // Sort data by x field so stacked areas render left-to-right\n const sortedData = sortByField(spec.data, xChannel.field);\n\n // Collect unique series keys and x values, and build a lookup from\n // (x-value, series-key) -> original data row so stacked area marks\n // get original rows instead of pivot rows.\n const seriesKeys = new Set<string>();\n const xValueSet = new Set<string>();\n const rowsByXSeries = new Map<string, DataRow>();\n const rowsByX = new Map<string, DataRow[]>();\n\n for (const row of sortedData) {\n const xStr = String(row[xChannel.field]);\n const series = String(row[colorField]);\n seriesKeys.add(series);\n xValueSet.add(xStr);\n rowsByXSeries.set(`${xStr}::${series}`, row);\n\n const existing = rowsByX.get(xStr);\n if (existing) {\n existing.push(row);\n } else {\n rowsByX.set(xStr, [row]);\n }\n }\n\n const keys = Array.from(seriesKeys);\n const xValues = Array.from(xValueSet);\n\n // Build a pivot table: one row per x value, one column per series\n const pivotData: Record<string, unknown>[] = xValues.map((xVal) => {\n const pivot: Record<string, unknown> = { __x__: xVal };\n for (const key of keys) {\n pivot[key] = 0;\n }\n // Fill in actual values from pre-grouped data\n const xRows = rowsByX.get(xVal);\n if (xRows) {\n for (const row of xRows) {\n const series = String(row[colorField]);\n pivot[series] = row[yChannel.field] ?? 0;\n }\n }\n return pivot;\n });\n\n // Use d3 stack to compute the stacked layout\n const stackGenerator = stack<Record<string, unknown>>()\n .keys(keys)\n .order(stackOrderNone)\n .offset(stackOffsetNone);\n\n const stackedData = stackGenerator(pivotData);\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n const marks: AreaMark[] = [];\n\n for (const layer of stackedData) {\n const seriesKey = layer.key;\n const color = getColor(scales, seriesKey);\n\n const validPoints: { x: number; yTop: number; yBottom: number }[] = [];\n\n for (const d of layer) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, d.data.__x__);\n\n if (xVal === null) continue;\n\n const yTop = yScale(d[1] as number);\n const yBottom = yScale(d[0] as number);\n\n validPoints.push({ x: xVal, yTop, yBottom });\n }\n\n if (validPoints.length === 0) continue;\n\n const areaGenerator = area<{ x: number; yTop: number; yBottom: number }>()\n .x((p) => p.x)\n .y0((p) => p.yBottom)\n .y1((p) => p.yTop)\n .curve(curveMonotoneX);\n\n const pathStr = areaGenerator(validPoints) ?? '';\n\n const topLineGenerator = line<{ x: number; yTop: number }>()\n .x((p) => p.x)\n .y((p) => p.yTop)\n .curve(curveMonotoneX);\n const topPathStr = topLineGenerator(validPoints) ?? '';\n\n const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));\n const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));\n\n const aria: MarkAria = {\n label: `${seriesKey}: stacked area with ${validPoints.length} data points`,\n };\n\n marks.push({\n type: 'area',\n topPoints,\n bottomPoints,\n path: pathStr,\n topPath: topPathStr,\n fill: color,\n fillOpacity: 0.7, // Higher opacity for stacked so layers are visible\n stroke: color,\n strokeWidth: 1,\n seriesKey,\n data: layer.map((d) => {\n const xStr = String(d.data.__x__);\n return (rowsByXSeries.get(`${xStr}::${seriesKey}`) ?? d.data) as Record<string, unknown>;\n }),\n aria,\n });\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute area marks from a normalized chart spec.\n *\n * For multi-series with color encoding, produces stacked areas.\n * For single series, produces a simple area fill from the line to baseline (y=0).\n */\nexport function computeAreaMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const hasColor = !!encoding.color;\n\n if (hasColor) {\n return computeStackedArea(spec, scales, chartArea);\n }\n\n return computeSingleArea(spec, scales, chartArea);\n}\n","/**\n * Line chart mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * LineMark[] and PointMark[] arrays for rendering. Groups data by\n * color field for multi-series, uses D3 line() generator for SVG\n * path computation, and handles missing data with line breaks.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n LineMark,\n MarkAria,\n PointMark,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport { curveMonotoneX, line } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, groupByField, scaleValue, sortByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default stroke width for line marks. */\nconst DEFAULT_STROKE_WIDTH = 2.5;\n\n/** Default radius for point marks (hover targets). */\nconst DEFAULT_POINT_RADIUS = 3;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute line marks from a normalized chart spec.\n *\n * Produces one LineMark per series (grouped by color field) plus\n * PointMark entries at each data point for hover targets. Missing\n * data (null/undefined y values) breaks the line path.\n */\nexport function computeLineMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): (LineMark | PointMark)[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const colorField = encoding.color?.field;\n const groups = groupByField(spec.data, colorField);\n const marks: (LineMark | PointMark)[] = [];\n\n for (const [seriesKey, rows] of groups) {\n const color = getColor(scales, seriesKey);\n\n // Sort rows by x-axis field so lines draw left-to-right\n const sortedRows = sortByField(rows, xChannel.field);\n\n // Compute pixel positions for each data point, preserving nulls\n // for line break handling\n const pointsWithData: {\n x: number;\n y: number;\n row: DataRow;\n }[] = [];\n\n // We need to track segments separated by null values\n const segments: { x: number; y: number }[][] = [];\n let currentSegment: { x: number; y: number }[] = [];\n\n for (const row of sortedRows) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, row[xChannel.field]);\n const yVal = scaleValue(scales.y.scale, scales.y.type, row[yChannel.field]);\n\n if (xVal === null || yVal === null) {\n // Break the line here. Push current segment if non-empty.\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n currentSegment = [];\n }\n continue;\n }\n\n const point = { x: xVal, y: yVal };\n currentSegment.push(point);\n pointsWithData.push({ ...point, row });\n }\n\n // Push the last segment\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n }\n\n // Build the D3 line generator with monotone interpolation\n const lineGenerator = line<{ x: number; y: number }>()\n .x((d) => d.x)\n .y((d) => d.y)\n .curve(curveMonotoneX);\n\n // Combine all segments into a single path string with M/L commands.\n // Each segment starts a new M (moveto) command, creating line breaks\n // where data is missing.\n const allPoints: { x: number; y: number }[] = [];\n const pathParts: string[] = [];\n\n for (const segment of segments) {\n if (segment.length === 0) continue;\n const pathStr = lineGenerator(segment);\n if (pathStr) {\n pathParts.push(pathStr);\n }\n allPoints.push(...segment);\n }\n\n // Skip this series if there are no valid data points\n if (allPoints.length === 0) continue;\n\n const ariaLabel =\n seriesKey === '__default__'\n ? `Line with ${allPoints.length} data points`\n : `${seriesKey}: line with ${allPoints.length} data points`;\n\n const aria: MarkAria = {\n label: ariaLabel,\n };\n\n // Combine D3 curve path segments into a single path string.\n // Each segment produces a smooth monotone curve; line breaks between\n // segments are created by starting a new M command.\n const combinedPath = pathParts.join(' ');\n\n // Look up per-series style overrides\n const seriesStyleKey = seriesKey === '__default__' ? undefined : seriesKey;\n const styleOverride = seriesStyleKey ? spec.seriesStyles?.[seriesStyleKey] : undefined;\n\n // Map lineStyle to SVG strokeDasharray\n let strokeDasharray: string | undefined;\n if (styleOverride?.lineStyle === 'dashed') strokeDasharray = '6 4';\n else if (styleOverride?.lineStyle === 'dotted') strokeDasharray = '2 3';\n\n // Create the LineMark with the combined path points.\n // The points array includes all valid points across all segments.\n const lineMark: LineMark = {\n type: 'line',\n points: allPoints,\n path: combinedPath,\n stroke: color,\n strokeWidth: styleOverride?.strokeWidth ?? DEFAULT_STROKE_WIDTH,\n strokeDasharray,\n opacity: styleOverride?.opacity,\n seriesKey: seriesStyleKey,\n data: pointsWithData.map((p) => p.row),\n aria,\n };\n\n marks.push(lineMark);\n\n // Create point marks for hover targets (skip if showPoints is false)\n const showPoints = styleOverride?.showPoints !== false;\n for (let i = 0; i < pointsWithData.length; i++) {\n const p = pointsWithData[i];\n const pointMark: PointMark = {\n type: 'point',\n cx: p.x,\n cy: p.y,\n r: showPoints ? DEFAULT_POINT_RADIUS : 0,\n fill: color,\n stroke: showPoints ? '#ffffff' : 'transparent',\n strokeWidth: showPoints ? 1.5 : 0,\n fillOpacity: 0,\n data: p.row,\n aria: {\n label: `Data point: ${xChannel.field}=${String(p.row[xChannel.field])}, ${yChannel.field}=${String(p.row[yChannel.field])}`,\n },\n };\n marks.push(pointMark);\n }\n }\n\n return marks;\n}\n","/**\n * Line chart label computation.\n *\n * Produces end-of-line labels (series name at the last data point)\n * and feeds them through the core collision engine. At compact\n * breakpoints, labels are suppressed in favor of the legend.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last data point labels per series\n * - 'none': return empty map\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n LayoutStrategy,\n LineMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default label font size. */\nconst LABEL_FONT_SIZE = 11;\n\n/** Default label font weight. */\nconst LABEL_FONT_WEIGHT = 600;\n\n/** Horizontal offset from last point to label. */\nconst LABEL_OFFSET_X = 6;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute end-of-line labels for line marks.\n *\n * For each series, places a label at the position of the last data point.\n * At compact breakpoints (labelMode === 'none'), all labels are hidden\n * so the legend takes over. Labels go through collision detection to\n * avoid overlap.\n *\n * Returns a Map keyed by seriesKey so callers can look up labels by\n * mark identity instead of relying on positional indices.\n *\n * @param marks - Line marks (only processes marks with type === 'line').\n * @param strategy - Layout strategy from the responsive breakpoint.\n * @param density - Label density mode from spec.labels.density.\n * @returns Map of seriesKey -> ResolvedLabel after collision detection.\n */\nexport function computeLineLabels(\n marks: LineMark[],\n strategy: LayoutStrategy,\n density: LabelDensity = 'auto',\n labelOffsets?: Record<string, { dx?: number; dy?: number }>,\n): Map<string, ResolvedLabel> {\n const result = new Map<string, ResolvedLabel>();\n\n // 'none': no labels\n if (density === 'none') return result;\n\n // At compact breakpoint, suppress inline labels entirely\n if (strategy.labelMode === 'none') {\n return result;\n }\n\n const candidates: LabelCandidate[] = [];\n const seriesOrder: string[] = [];\n\n for (const mark of marks) {\n if (mark.points.length === 0) continue;\n\n const labelText = mark.seriesKey ?? '';\n if (!labelText) continue;\n\n const lastPoint = mark.points[mark.points.length - 1];\n const textWidth = estimateTextWidth(labelText, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n candidates.push({\n text: labelText,\n anchorX: lastPoint.x + LABEL_OFFSET_X,\n anchorY: lastPoint.y - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.stroke,\n lineHeight: 1.2,\n textAnchor: 'start',\n dominantBaseline: 'central',\n },\n });\n\n seriesOrder.push(labelText);\n }\n\n if (candidates.length === 0) return result;\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n for (let i = 0; i < candidates.length; i++) {\n const c = candidates[i];\n const seriesKey = seriesOrder[i];\n const userOffset = labelOffsets?.[seriesKey];\n result.set(seriesKey, {\n text: c.text,\n x: c.anchorX + (userOffset?.dx ?? 0),\n y: c.anchorY + (userOffset?.dy ?? 0),\n style: c.style,\n visible: true,\n });\n }\n return result;\n }\n\n // 'endpoints': for line charts, endpoints means showing just the end-of-line\n // label (which is what we already compute). This is the same as 'auto' for lines\n // since we only compute the endpoint label per series.\n\n const resolved = resolveCollisions(candidates);\n for (let i = 0; i < resolved.length; i++) {\n const seriesKey = seriesOrder[i];\n const label = resolved[i];\n // Apply user-provided per-series label offset after collision resolution\n const userOffset = labelOffsets?.[seriesKey];\n if (userOffset) {\n label.x += userOffset.dx ?? 0;\n label.y += userOffset.dy ?? 0;\n }\n result.set(seriesKey, label);\n }\n\n return result;\n}\n","/**\n * Line & area chart module.\n *\n * Exports line and area chart renderers and computation functions.\n */\n\nimport type { LineMark, Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeAreaMarks } from './area';\nimport { computeLineMarks } from './compute';\nimport { computeLineLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Line chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Line chart renderer.\n *\n * Computes line marks + point marks for hover targets, then resolves\n * end-of-line labels and attaches them to the corresponding line marks.\n */\nexport const lineRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeLineMarks(spec, scales, chartArea, strategy);\n\n // Extract just the line marks for label computation\n const lineMarks = marks.filter((m): m is LineMark => m.type === 'line');\n\n // Compute and attach labels to line marks by seriesKey lookup\n const labelMap = computeLineLabels(lineMarks, strategy, spec.labels.density, spec.labels.offsets);\n for (const mark of marks) {\n if (mark.type === 'line' && mark.seriesKey) {\n const label = labelMap.get(mark.seriesKey);\n if (label) {\n mark.label = label;\n }\n }\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Area chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Area chart renderer.\n *\n * Computes area fill marks (stacked if multi-series).\n * Also computes line marks for the top boundary and point marks\n * for hover targets, layered on top of the areas.\n */\nexport const areaRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const areas = computeAreaMarks(spec, scales, chartArea);\n const lines = computeLineMarks(spec, scales, chartArea, strategy);\n\n // Areas go first (rendered behind lines), then lines on top\n return [...areas, ...lines] as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeAreaMarks } from './area';\nexport { computeLineMarks } from './compute';\nexport { computeLineLabels } from './labels';\n","/**\n * Pie / donut chart mark computation.\n *\n * Uses d3.pie() for angle calculation and d3.arc() for SVG path\n * generation. Supports sorting by value (largest first), small-slice\n * grouping into \"Other\", and donut variant with inner radius.\n */\n\nimport type {\n ArcMark,\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport type { PieArcDatum } from 'd3-shape';\nimport { arc as d3Arc, pie as d3Pie } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Slices smaller than this fraction are grouped into \"Other\". */\nconst SMALL_SLICE_THRESHOLD = 0.03;\n\n/** Default color palette when no color scale is available. */\nconst DEFAULT_PALETTE = [\n '#1b7fa3',\n '#c44e52',\n '#6a9f58',\n '#d47215',\n '#507e79',\n '#9a6a8d',\n '#c4636b',\n '#9c755f',\n '#a88f22',\n '#858078',\n];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface SliceData {\n label: string;\n value: number;\n originalRow: DataRow;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Group small slices (< threshold) into an \"Other\" category. */\nfunction groupSmallSlices(slices: SliceData[], threshold: number): SliceData[] {\n const total = slices.reduce((sum, s) => sum + s.value, 0);\n if (total === 0) return slices;\n\n const big: SliceData[] = [];\n let otherValue = 0;\n\n for (const slice of slices) {\n if (slice.value / total < threshold) {\n otherValue += slice.value;\n } else {\n big.push(slice);\n }\n }\n\n if (otherValue > 0) {\n big.push({\n label: 'Other',\n value: otherValue,\n originalRow: { label: 'Other', value: otherValue },\n });\n }\n\n return big;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute pie or donut arc marks from a normalized chart spec.\n *\n * Extracts category and value from the encoding channels. Categories\n * come from the color field, values from the quantitative y (or x) field.\n * Slices are sorted largest first. Small slices are grouped into \"Other\".\n *\n * @param isDonut - When true, creates a donut with inner radius at 60% of outer.\n */\nexport function computePieMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n _strategy: LayoutStrategy,\n isDonut = false,\n): ArcMark[] {\n const encoding = spec.encoding as Encoding;\n\n // For pie/donut charts, we need a value field (typically y or x) and\n // a category field (typically color). The value field provides the slice sizes.\n const valueChannel = encoding.y ?? encoding.x;\n const categoryField = encoding.color?.field;\n\n if (!valueChannel) return [];\n\n // Build slices from data\n let slices: SliceData[] = [];\n\n if (categoryField) {\n // Aggregate by category\n const categoryTotals = new Map<string, number>();\n const categoryRows = new Map<string, DataRow>();\n\n for (const row of spec.data) {\n const cat = String(row[categoryField] ?? '');\n const val = Number(row[valueChannel.field] ?? 0);\n if (!Number.isFinite(val) || val < 0) continue;\n\n categoryTotals.set(cat, (categoryTotals.get(cat) ?? 0) + val);\n if (!categoryRows.has(cat)) {\n categoryRows.set(cat, row);\n }\n }\n\n for (const [label, value] of categoryTotals) {\n slices.push({\n label,\n value,\n originalRow: categoryRows.get(label) ?? {\n [categoryField]: label,\n [valueChannel.field]: value,\n },\n });\n }\n } else {\n // Each data row is a slice. Use a label field if present, or index.\n for (let i = 0; i < spec.data.length; i++) {\n const row = spec.data[i];\n const val = Number(row[valueChannel.field] ?? 0);\n if (!Number.isFinite(val) || val < 0) continue;\n\n // Try common label fields\n const label = String(row.label ?? row.name ?? row.category ?? `Slice ${i + 1}`);\n\n slices.push({ label, value: val, originalRow: row });\n }\n }\n\n if (slices.length === 0) return [];\n\n // Sort by value descending (largest first)\n slices.sort((a, b) => b.value - a.value);\n\n // Group small slices into \"Other\"\n slices = groupSmallSlices(slices, SMALL_SLICE_THRESHOLD);\n\n // Compute pie layout\n const pieGenerator = d3Pie<SliceData>()\n .value((d) => d.value)\n .sort(null) // Already sorted\n .padAngle(0.01);\n\n const arcs = pieGenerator(slices);\n\n // Compute arc dimensions\n const centerX = chartArea.x + chartArea.width / 2;\n const centerY = chartArea.y + chartArea.height / 2;\n const outerRadius = (Math.min(chartArea.width, chartArea.height) / 2) * 0.85;\n const innerRadius = isDonut ? outerRadius * 0.6 : 0;\n\n const arcGenerator = d3Arc<PieArcDatum<SliceData>>()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius);\n\n // Build arc marks\n const marks: ArcMark[] = [];\n const center = { x: centerX, y: centerY };\n const total = slices.reduce((sum, s) => sum + s.value, 0);\n\n for (let i = 0; i < arcs.length; i++) {\n const arcDatum = arcs[i];\n const slice = arcDatum.data;\n\n // Get color from scale or default palette\n let color: string;\n if (scales.color && categoryField) {\n const colorScale = scales.color.scale as (v: string) => string;\n color = colorScale(slice.label);\n } else {\n color = DEFAULT_PALETTE[i % DEFAULT_PALETTE.length];\n }\n\n // Generate SVG path (relative to 0,0; renderer wraps in translate)\n const path = arcGenerator(arcDatum) ?? '';\n\n // Compute centroid (for label positioning), offset to chart center\n const centroidResult = arcGenerator.centroid(arcDatum);\n\n const percentage = total > 0 ? ((slice.value / total) * 100).toFixed(1) : '0';\n\n const aria: MarkAria = {\n label: `${slice.label}: ${slice.value} (${percentage}%)`,\n };\n\n marks.push({\n type: 'arc',\n path,\n centroid: {\n x: centroidResult[0] + centerX,\n y: centroidResult[1] + centerY,\n },\n center,\n innerRadius,\n outerRadius,\n startAngle: arcDatum.startAngle,\n endAngle: arcDatum.endAngle,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: slice.originalRow as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Pie/donut chart label computation.\n *\n * Produces leader-line labels positioned outside each arc slice.\n * Labels are placed at the midpoint of each arc's angle, extended\n * outward from the centroid. Collision detection resolves overlaps.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last slices only\n * - 'none': return empty array\n */\n\nimport type {\n ArcMark,\n LabelCandidate,\n LabelDensity,\n Rect,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 10;\nconst LABEL_FONT_WEIGHT = 500;\nconst LEADER_LINE_OFFSET = 12;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute leader-line labels for pie/donut arc marks.\n *\n * Each label is positioned outward from the arc centroid with a connector\n * line from the centroid to the label. Labels go through collision\n * detection to avoid overlap.\n */\nexport function computePieLabels(\n marks: ArcMark[],\n _chartArea: Rect,\n density: LabelDensity = 'auto',\n _textFill = '#333333',\n): ResolvedLabel[] {\n if (marks.length === 0) return [];\n\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Get the pie center from the first mark's center property\n const centerX = marks[0].center.x;\n const centerY = marks[0].center.y;\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n const targetMarkIndices: number[] = [];\n\n for (let mi = 0; mi < targetMarks.length; mi++) {\n const mark = targetMarks[mi];\n // Extract the label text (category name) from the aria label.\n // Format is \"Category: value (percent%)\". Split on the first colon\n // to handle category names that might contain colons.\n const ariaLabel = mark.aria.label;\n const firstColon = ariaLabel.indexOf(':');\n const labelText = firstColon >= 0 ? ariaLabel.slice(0, firstColon).trim() : '';\n if (!labelText) continue;\n\n const textWidth = estimateTextWidth(labelText, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // Position label outward from centroid\n const midAngle = (mark.startAngle + mark.endAngle) / 2;\n const labelRadius = mark.outerRadius + LEADER_LINE_OFFSET;\n\n const labelX = centerX + Math.sin(midAngle) * labelRadius;\n const labelY = centerY - Math.cos(midAngle) * labelRadius;\n\n // Determine text anchor based on which side of the pie the label is on\n const isRight = Math.sin(midAngle) > 0;\n\n candidates.push({\n text: labelText,\n anchorX: isRight ? labelX : labelX - textWidth,\n anchorY: labelY - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: _textFill,\n lineHeight: 1.2,\n textAnchor: isRight ? 'start' : 'end',\n dominantBaseline: 'central',\n },\n });\n\n targetMarkIndices.push(mi);\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n let resolved: ResolvedLabel[];\n if (density === 'all') {\n resolved = candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n } else {\n // Run collision detection\n resolved = resolveCollisions(candidates);\n }\n\n // Add connector lines from centroid to label\n for (let i = 0; i < resolved.length && i < targetMarks.length; i++) {\n const label = resolved[i];\n const mark = targetMarks[i];\n\n if (label.visible) {\n label.connector = {\n from: { x: label.x, y: label.y },\n to: { x: mark.centroid.x, y: mark.centroid.y },\n stroke: _textFill,\n style: 'straight',\n };\n }\n }\n\n return resolved;\n}\n","/**\n * Pie and donut chart module.\n *\n * Exports pie and donut chart renderers and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computePieMarks } from './compute';\nimport { computePieLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Pie chart renderer\n// ---------------------------------------------------------------------------\n\nexport const pieRenderer: ChartRenderer = (spec, scales, chartArea, strategy, theme) => {\n const marks = computePieMarks(spec, scales, chartArea, strategy, false);\n\n // Compute and attach labels (respects spec.labels.density)\n const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Donut chart renderer\n// ---------------------------------------------------------------------------\n\nexport const donutRenderer: ChartRenderer = (spec, scales, chartArea, strategy, theme) => {\n const marks = computePieMarks(spec, scales, chartArea, strategy, true);\n\n // Compute and attach labels (respects spec.labels.density)\n const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computePieMarks } from './compute';\nexport { computePieLabels } from './labels';\n","/**\n * Chart renderer registry.\n *\n * Each chart type (line, bar, column, scatter, pie, donut, dot) registers\n * a renderer that produces marks from normalized specs and resolved scales.\n * The registry pattern decouples chart-type logic from the compile pipeline.\n */\n\nimport type { LayoutStrategy, Mark, Rect, ResolvedTheme } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\nimport type { ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A chart renderer function.\n *\n * Takes a normalized spec, resolved scales, chart area, layout strategy,\n * and the resolved theme for theme-aware styling (e.g. label colors).\n * Returns an array of marks to render.\n */\nexport type ChartRenderer = (\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n) => Mark[];\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst renderers = new Map<string, ChartRenderer>();\n\n/**\n * Register a chart renderer for a specific chart type.\n *\n * @param type - Chart type string (e.g. \"line\", \"bar\").\n * @param renderer - The renderer function.\n */\nexport function registerChartRenderer(type: string, renderer: ChartRenderer): void {\n renderers.set(type, renderer);\n}\n\n/**\n * Get the registered chart renderer for a type.\n *\n * @param type - Chart type string.\n * @returns The renderer, or undefined if no renderer is registered.\n */\nexport function getChartRenderer(type: string): ChartRenderer | undefined {\n return renderers.get(type);\n}\n\n/**\n * Clear all registered renderers. Useful for testing.\n */\nexport function clearRenderers(): void {\n renderers.clear();\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if (!isFinite(x) || x === 0) return null; // NaN, ±Infinity, ±0\n var i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\"), coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return prefixExponent = undefined, x.toPrecision(p);\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier, options) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = (options && options.prefix !== undefined ? options.prefix : \"\") + (symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\"),\n suffix = (symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\") + (options && options.suffix !== undefined ? options.suffix : \"\");\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" && !isNaN(value) && prefixExponent !== undefined ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier), {suffix: prefixes[8 + e / 3]});\n return function(value) {\n return f(k * value);\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","export default function nice(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","import {ticks} from \"d3-array\";\nimport {format, formatSpecifier} from \"d3-format\";\nimport nice from \"./nice.js\";\nimport {copy, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformLog(x) {\n return Math.log(x);\n}\n\nfunction transformExp(x) {\n return Math.exp(x);\n}\n\nfunction transformLogn(x) {\n return -Math.log(-x);\n}\n\nfunction transformExpn(x) {\n return -Math.exp(-x);\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : x => Math.pow(base, x);\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), x => Math.log(x) / base);\n}\n\nfunction reflect(f) {\n return (x, k) => -f(-x, k);\n}\n\nexport function loggish(transform) {\n const scale = transform(transformLog, transformExp);\n const domain = scale.domain;\n let base = 10;\n let logs;\n let pows;\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) {\n logs = reflect(logs), pows = reflect(pows);\n transform(transformLogn, transformExpn);\n } else {\n transform(transformLog, transformExp);\n }\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = count => {\n const d = domain();\n let u = d[0];\n let v = d[d.length - 1];\n const r = v < u;\n\n if (r) ([u, v] = [v, u]);\n\n let i = logs(u);\n let j = logs(v);\n let k;\n let t;\n const n = count == null ? 10 : +count;\n let z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.floor(i), j = Math.ceil(j);\n if (u > 0) for (; i <= j; ++i) {\n for (k = 1; k < base; ++k) {\n t = i < 0 ? k / pows(-i) : k * pows(i);\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i <= j; ++i) {\n for (k = base - 1; k >= 1; --k) {\n t = i > 0 ? k / pows(-i) : k * pows(i);\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n if (z.length * 2 < n) z = ticks(u, v, n);\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = (count, specifier) => {\n if (count == null) count = 10;\n if (specifier == null) specifier = base === 10 ? \"s\" : \",\";\n if (typeof specifier !== \"function\") {\n if (!(base % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true;\n specifier = format(specifier);\n }\n if (count === Infinity) return specifier;\n const k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return d => {\n let i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = () => {\n return domain(nice(domain(), {\n floor: x => pows(Math.floor(logs(x))),\n ceil: x => pows(Math.ceil(logs(x)))\n }));\n };\n\n return scale;\n}\n\nexport default function log() {\n const scale = loggish(transformer()).domain([1, 10]);\n scale.copy = () => copy(scale, log()).base(scale.base());\n initRange.apply(scale, arguments);\n return scale;\n}\n","import {linearish} from \"./linear.js\";\nimport {copy, identity, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeTicks, timeTickInterval} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport nice from \"./nice.js\";\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n var scale = continuous(),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval) {\n var d = domain();\n if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n return interval ? domain(nice(d, interval)) : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n };\n\n return scale;\n}\n\nexport default function time() {\n return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n","import {interpolate, interpolateRound} from \"d3-interpolate\";\nimport {identity} from \"./continuous.js\";\nimport {initInterpolator} from \"./init.js\";\nimport {linearish} from \"./linear.js\";\nimport {loggish} from \"./log.js\";\nimport {symlogish} from \"./symlog.js\";\nimport {powish} from \"./pow.js\";\n\nfunction transformer() {\n var x0 = 0,\n x1 = 1,\n t0,\n t1,\n k10,\n transform,\n interpolator = identity,\n clamp = false,\n unknown;\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n\n scale.domain = function(_) {\n return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n function range(interpolate) {\n return function(_) {\n var r0, r1;\n return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n };\n }\n\n scale.range = range(interpolate);\n\n scale.rangeRound = range(interpolateRound);\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t) {\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n return scale;\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .interpolator(source.interpolator())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport default function sequential() {\n var scale = linearish(transformer()(identity));\n\n scale.copy = function() {\n return copy(scale, sequential());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialLog() {\n var scale = loggish(transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return copy(scale, sequentialLog()).base(scale.base());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSymlog() {\n var scale = symlogish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialSymlog()).constant(scale.constant());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialPow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialPow()).exponent(scale.exponent());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSqrt() {\n return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n","/**\n * Scatter / bubble chart mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * PointMark[] for rendering scatter plots. Both axes are quantitative.\n * Optional size encoding produces area-proportional bubbles via sqrt\n * scaling, and color encoding groups points by category.\n */\n\nimport type {\n Encoding,\n LayoutStrategy,\n MarkAria,\n PointMark,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport { max, min } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleSqrt } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_POINT_RADIUS = 5;\nconst MIN_BUBBLE_RADIUS = 3;\nconst MAX_BUBBLE_RADIUS = 30;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute scatter/bubble marks from a normalized chart spec.\n *\n * Both x and y are quantitative (linear scales). Optional size encoding\n * maps a data field to point radius using sqrt scale (area-proportional).\n * Optional color encoding groups points by category with distinct colors.\n */\nexport function computeScatterMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): PointMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n\n const colorField = encoding.color?.field;\n const sizeField = encoding.size?.field;\n\n // Build a size scale for bubble variant\n let sizeScale: ((v: number) => number) | undefined;\n if (sizeField) {\n const sizeValues = spec.data.map((d) => Number(d[sizeField])).filter((v) => Number.isFinite(v));\n\n const sizeMin = min(sizeValues) ?? 0;\n const sizeMax = max(sizeValues) ?? 1;\n\n sizeScale = scaleSqrt()\n .domain([sizeMin, sizeMax])\n .range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS]);\n }\n\n const marks: PointMark[] = [];\n\n for (const row of spec.data) {\n const xVal = Number(row[xChannel.field]);\n const yVal = Number(row[yChannel.field]);\n\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) continue;\n\n const cx = xScale(xVal);\n const cy = yScale(yVal);\n\n const category = colorField ? String(row[colorField] ?? '') : undefined;\n const color = getColor(scales, category ?? '__default__');\n\n let radius = DEFAULT_POINT_RADIUS;\n if (sizeScale && sizeField) {\n const sizeVal = Number(row[sizeField]);\n if (Number.isFinite(sizeVal)) {\n radius = sizeScale(sizeVal);\n }\n }\n\n const labelParts = [`${xChannel.field}=${xVal}`, `${yChannel.field}=${yVal}`];\n if (category) labelParts.push(`${colorField}=${category}`);\n if (sizeField && row[sizeField] != null) {\n labelParts.push(`${sizeField}=${row[sizeField]}`);\n }\n\n const aria: MarkAria = {\n label: `Data point: ${labelParts.join(', ')}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: radius,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 1,\n fillOpacity: 0.7,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Trend line computation for scatter plots.\n *\n * Computes a simple linear regression (least squares) over the\n * point marks and returns a LineMark representing the best-fit line.\n */\n\nimport type { LineMark, MarkAria, PointMark } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TRENDLINE_COLOR = '#666666';\nconst TRENDLINE_STROKE_WIDTH = 1.5;\nconst TRENDLINE_DASH = '6 4';\n\n// ---------------------------------------------------------------------------\n// Linear regression\n// ---------------------------------------------------------------------------\n\n/**\n * Compute slope and intercept for a simple linear regression.\n * Returns null if there aren't enough points or variance is zero.\n */\nfunction linearRegression(\n points: { x: number; y: number }[],\n): { slope: number; intercept: number } | null {\n const n = points.length;\n if (n < 2) return null;\n\n let sumX = 0;\n let sumY = 0;\n let sumXY = 0;\n let sumXX = 0;\n\n for (const p of points) {\n sumX += p.x;\n sumY += p.y;\n sumXY += p.x * p.y;\n sumXX += p.x * p.x;\n }\n\n const denominator = n * sumXX - sumX * sumX;\n if (denominator === 0) return null;\n\n const slope = (n * sumXY - sumX * sumY) / denominator;\n const intercept = (sumY - slope * sumX) / n;\n\n return { slope, intercept };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute a trend line (linear regression) over scatter point marks.\n *\n * Returns a single LineMark spanning the x-range of the data points,\n * rendered as a dashed line. Returns null if regression can't be computed.\n */\nexport function computeTrendLine(marks: PointMark[]): LineMark | null {\n if (marks.length < 2) return null;\n\n const points = marks.map((m) => ({ x: m.cx, y: m.cy }));\n const result = linearRegression(points);\n if (!result) return null;\n\n const { slope, intercept } = result;\n\n // Find x range from marks\n let minX = Infinity;\n let maxX = -Infinity;\n for (const m of marks) {\n if (m.cx < minX) minX = m.cx;\n if (m.cx > maxX) maxX = m.cx;\n }\n\n // Compute y values at the endpoints\n const y1 = slope * minX + intercept;\n const y2 = slope * maxX + intercept;\n\n const aria: MarkAria = {\n label: `Trend line: linear regression`,\n };\n\n return {\n type: 'line',\n points: [\n { x: minX, y: y1 },\n { x: maxX, y: y2 },\n ],\n stroke: TRENDLINE_COLOR,\n strokeWidth: TRENDLINE_STROKE_WIDTH,\n strokeDasharray: TRENDLINE_DASH,\n data: [],\n aria,\n };\n}\n","/**\n * Scatter / bubble chart module.\n *\n * Exports the scatter chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeScatterMarks } from './compute';\nimport { computeTrendLine } from './trendline';\n\n// ---------------------------------------------------------------------------\n// Scatter chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Scatter chart renderer.\n *\n * Produces point marks for each data point, optionally with size encoding\n * for bubbles and a trend line overlay.\n */\nexport const scatterRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const pointMarks = computeScatterMarks(spec, scales, chartArea, strategy);\n const marks: Mark[] = [...pointMarks];\n\n // Add trend line if there are enough points\n const trendLine = computeTrendLine(pointMarks);\n if (trendLine) {\n // Trend line goes behind points\n marks.unshift(trendLine);\n }\n\n return marks;\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeScatterMarks } from './compute';\nexport { computeTrendLine } from './trendline';\n","/**\n * Spec normalization: fill in defaults and infer types.\n *\n * Takes a validated VizSpec and produces a NormalizedSpec where:\n * - All optional fields have sensible defaults\n * - Chrome strings are converted to ChromeText objects\n * - Encoding types are inferred from data if not specified\n * - Annotations have default styles\n */\n\nimport type {\n Annotation,\n ChartSpec,\n Chrome,\n ChromeText,\n DataRow,\n Encoding,\n FieldType,\n GraphSpec,\n TableSpec,\n VizSpec,\n} from '@opendata-ai/openchart-core';\nimport { isChartSpec, isGraphSpec, isTableSpec } from '@opendata-ai/openchart-core';\n\nimport type {\n NormalizedChartSpec,\n NormalizedChrome,\n NormalizedGraphSpec,\n NormalizedSpec,\n NormalizedTableSpec,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Chrome normalization\n// ---------------------------------------------------------------------------\n\n/** Convert a string | ChromeText | undefined to ChromeText | undefined. */\nfunction normalizeChromeField(value: string | ChromeText | undefined): ChromeText | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return { text: value };\n return value;\n}\n\n/** Normalize all chrome fields from strings to ChromeText objects. */\nfunction normalizeChrome(chrome: Chrome | undefined): NormalizedChrome {\n if (!chrome) return {};\n return {\n title: normalizeChromeField(chrome.title),\n subtitle: normalizeChromeField(chrome.subtitle),\n source: normalizeChromeField(chrome.source),\n byline: normalizeChromeField(chrome.byline),\n footer: normalizeChromeField(chrome.footer),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Type inference\n// ---------------------------------------------------------------------------\n\n/** Sample values from a data column and infer the field type. */\nfunction inferFieldType(data: DataRow[], field: string): FieldType {\n // Sample up to 10 rows\n const sampleSize = Math.min(10, data.length);\n let numericCount = 0;\n let dateCount = 0;\n let totalNonNull = 0;\n\n for (let i = 0; i < sampleSize; i++) {\n const value = data[i][field];\n if (value == null) continue;\n totalNonNull++;\n\n // Check numeric\n if (typeof value === 'number' && Number.isFinite(value)) {\n numericCount++;\n continue;\n }\n\n // Check date-like strings\n if (typeof value === 'string') {\n // Try as number first\n const num = Number(value);\n if (!Number.isNaN(num) && Number.isFinite(num) && value.trim() !== '') {\n numericCount++;\n continue;\n }\n\n // Try as date\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n dateCount++;\n continue;\n }\n }\n\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n dateCount++;\n }\n }\n\n if (totalNonNull === 0) return 'nominal';\n\n // If >80% of sampled values are dates, it's temporal\n if (dateCount / totalNonNull > 0.8) return 'temporal';\n // If >80% are numeric, it's quantitative\n if (numericCount / totalNonNull > 0.8) return 'quantitative';\n // Otherwise it's nominal\n return 'nominal';\n}\n\n/** Infer types for encoding channels that don't have one specified. */\nfunction inferEncodingTypes(encoding: Encoding, data: DataRow[], warnings: string[]): Encoding {\n const result = { ...encoding };\n\n for (const channel of ['x', 'y', 'color', 'size', 'detail'] as const) {\n const spec = result[channel];\n if (!spec) continue;\n\n if (!spec.type) {\n const inferred = inferFieldType(data, spec.field);\n result[channel] = { ...spec, type: inferred };\n warnings.push(\n `Inferred encoding.${channel}.type as \"${inferred}\" from data values for field \"${spec.field}\"`,\n );\n } else {\n // Check for potential mismatches and warn\n const actualType = inferFieldType(data, spec.field);\n if (spec.type === 'nominal' && actualType === 'temporal') {\n warnings.push(`Field \"${spec.field}\" looks temporal but was declared as nominal`);\n }\n if (spec.type === 'nominal' && actualType === 'quantitative') {\n warnings.push(`Field \"${spec.field}\" looks quantitative but was declared as nominal`);\n }\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Annotation normalization\n// ---------------------------------------------------------------------------\n\n/** Apply default styles to annotations that don't have them. */\nfunction normalizeAnnotations(annotations: Annotation[] | undefined): Annotation[] {\n if (!annotations || annotations.length === 0) return [];\n\n return annotations.map((ann) => {\n switch (ann.type) {\n case 'text':\n return {\n ...ann,\n fontSize: ann.fontSize ?? 12,\n fontWeight: ann.fontWeight ?? 400,\n opacity: ann.opacity ?? 1,\n };\n case 'range':\n return {\n ...ann,\n opacity: ann.opacity ?? 0.1,\n fill: ann.fill ?? '#000000',\n };\n case 'refline':\n return {\n ...ann,\n style: ann.style ?? 'dashed',\n strokeWidth: ann.strokeWidth ?? 1,\n stroke: ann.stroke ?? '#666666',\n opacity: ann.opacity ?? 0.8,\n };\n default:\n return ann;\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Spec-level normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeChartSpec(spec: ChartSpec, warnings: string[]): NormalizedChartSpec {\n const encoding = inferEncodingTypes(spec.encoding, spec.data, warnings);\n\n return {\n type: spec.type,\n data: spec.data,\n encoding,\n chrome: normalizeChrome(spec.chrome),\n annotations: normalizeAnnotations(spec.annotations),\n labels: {\n density: spec.labels?.density ?? 'auto',\n format: spec.labels?.format ?? '',\n offsets: spec.labels?.offsets,\n },\n legend: spec.legend,\n responsive: spec.responsive ?? true,\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n hiddenSeries: spec.hiddenSeries ?? [],\n seriesStyles: spec.seriesStyles ?? {},\n };\n}\n\nfunction normalizeTableSpec(spec: TableSpec, _warnings: string[]): NormalizedTableSpec {\n return {\n type: 'table',\n data: spec.data,\n columns: spec.columns,\n rowKey: spec.rowKey,\n chrome: normalizeChrome(spec.chrome),\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n search: spec.search ?? false,\n pagination: spec.pagination ?? false,\n stickyFirstColumn: spec.stickyFirstColumn ?? false,\n compact: spec.compact ?? false,\n responsive: spec.responsive ?? true,\n };\n}\n\nfunction normalizeGraphSpec(spec: GraphSpec, _warnings: string[]): NormalizedGraphSpec {\n // Default layout with chargeStrength and linkDistance\n const defaultLayout = {\n type: 'force' as const,\n chargeStrength: -300,\n linkDistance: 30,\n };\n const layout = spec.layout\n ? {\n ...defaultLayout,\n ...spec.layout,\n }\n : defaultLayout;\n\n return {\n type: 'graph',\n nodes: spec.nodes,\n edges: spec.edges,\n encoding: spec.encoding ?? {},\n layout,\n nodeOverrides: spec.nodeOverrides,\n chrome: normalizeChrome(spec.chrome),\n annotations: normalizeAnnotations(spec.annotations),\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a validated VizSpec, filling in all defaults.\n *\n * @param spec - A validated VizSpec (must pass validateSpec first).\n * @param warnings - Mutable array to collect non-fatal warnings.\n * @returns A NormalizedSpec with all optionals filled.\n */\nexport function normalizeSpec(spec: VizSpec, warnings: string[] = []): NormalizedSpec {\n if (isChartSpec(spec)) {\n return normalizeChartSpec(spec, warnings);\n }\n if (isTableSpec(spec)) {\n return normalizeTableSpec(spec, warnings);\n }\n if (isGraphSpec(spec)) {\n return normalizeGraphSpec(spec, warnings);\n }\n // Should never happen after validation\n throw new Error(`Unknown spec type: ${(spec as Record<string, unknown>).type}`);\n}\n","/**\n * Runtime spec validation.\n *\n * TypeScript catches compile-time errors for specs written in code.\n * This module catches runtime errors for specs coming from JSON, APIs,\n * or Claude-generated output where the TypeScript compiler can't help.\n *\n * Every error includes a machine-readable code and an actionable suggestion\n * so consumers (and LLMs) can fix issues programmatically.\n */\n\nimport {\n CHART_ENCODING_RULES,\n CHART_TYPES,\n type ChartType,\n type FieldType,\n type VizSpec,\n} from '@opendata-ai/openchart-core';\n\nimport type { ValidationError, ValidationResult } from './types';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst VALID_FIELD_TYPES = new Set<string>(['quantitative', 'temporal', 'nominal', 'ordinal']);\n\nconst VALID_DARK_MODES = new Set<string>(['auto', 'force', 'off']);\n\n/** Check if a value looks like a parseable date. */\nfunction isParseableDate(value: unknown): boolean {\n if (value instanceof Date) return !Number.isNaN(value.getTime());\n if (typeof value === 'string') {\n const d = new Date(value);\n return !Number.isNaN(d.getTime());\n }\n if (typeof value === 'number') return true;\n return false;\n}\n\n/** Check if a value is numeric. */\nfunction isNumeric(value: unknown): boolean {\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value === 'string') {\n const n = Number(value);\n return !Number.isNaN(n) && Number.isFinite(n);\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Chart validation\n// ---------------------------------------------------------------------------\n\nfunction validateChartSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n const chartType = spec.type as ChartType;\n\n // Check data\n if (!Array.isArray(spec.data)) {\n errors.push({\n message: 'Spec error: \"data\" must be an array',\n path: 'data',\n code: 'INVALID_TYPE',\n suggestion: 'Provide data as an array of objects, e.g. data: [{ x: 1, y: 2 }]',\n });\n return; // Can't validate further without data\n }\n\n if (spec.data.length === 0) {\n errors.push({\n message: 'Spec error: \"data\" must be a non-empty array',\n path: 'data',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one data row, e.g. data: [{ x: 1, y: 2 }]',\n });\n return;\n }\n\n // Validate data entries are objects\n const firstRow = spec.data[0] as unknown;\n if (typeof firstRow !== 'object' || firstRow === null || Array.isArray(firstRow)) {\n errors.push({\n message: 'Spec error: each item in \"data\" must be a plain object',\n path: 'data[0]',\n code: 'INVALID_TYPE',\n suggestion:\n 'Each data item should be an object with key-value pairs, e.g. { name: \"Alice\", value: 10 }',\n });\n return;\n }\n\n // Check encoding exists\n if (!spec.encoding || typeof spec.encoding !== 'object') {\n const rules = CHART_ENCODING_RULES[chartType];\n const requiredChannels = Object.entries(rules)\n .filter(([, rule]) => rule.required)\n .map(([ch]) => ch);\n errors.push({\n message: `Spec error: ${chartType} chart requires an \"encoding\" object`,\n path: 'encoding',\n code: 'MISSING_FIELD',\n suggestion: `Add an encoding object with required channels: ${requiredChannels.join(', ')}. Example: encoding: { ${requiredChannels.map((ch) => `${ch}: { field: \"...\", type: \"...\" }`).join(', ')} }`,\n });\n return;\n }\n\n const rules = CHART_ENCODING_RULES[chartType];\n const encoding = spec.encoding as Record<string, unknown>;\n const dataColumns = new Set(Object.keys(firstRow as Record<string, unknown>));\n const availableColumns = [...dataColumns].join(', ');\n\n // Validate required channels\n for (const [channel, rule] of Object.entries(rules)) {\n if (rule.required && !encoding[channel]) {\n const allowedTypes = rule.allowedTypes.join(' or ');\n errors.push({\n message: `Spec error: ${chartType} chart requires encoding.${channel} but none was provided`,\n path: `encoding.${channel}`,\n code: 'MISSING_FIELD',\n suggestion: `Add encoding.${channel} with a field from your data (${availableColumns}) and type (${allowedTypes}). Example: ${channel}: { field: \"${[...dataColumns][0] ?? 'myField'}\", type: \"${rule.allowedTypes[0]}\" }`,\n });\n }\n }\n\n // Validate provided channels\n for (const [channel, channelSpec] of Object.entries(encoding)) {\n if (!channelSpec || typeof channelSpec !== 'object') continue;\n\n const channelObj = channelSpec as Record<string, unknown>;\n const channelRule = rules[channel as keyof typeof rules];\n\n // Check field exists\n if (!channelObj.field || typeof channelObj.field !== 'string') {\n errors.push({\n message: `Spec error: encoding.${channel} must have a \"field\" string`,\n path: `encoding.${channel}.field`,\n code: 'MISSING_FIELD',\n suggestion: `Add a field name from your data columns: ${availableColumns}`,\n });\n continue;\n }\n\n // Check field references a column in data\n if (!dataColumns.has(channelObj.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${channelObj.field}\" does not exist in data. Available columns: ${availableColumns}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the available data columns: ${availableColumns}`,\n });\n }\n\n // Check field type is valid\n if (channelObj.type && !VALID_FIELD_TYPES.has(channelObj.type as string)) {\n errors.push({\n message: `Spec error: encoding.${channel}.type \"${channelObj.type}\" is not valid. Must be one of: ${[...VALID_FIELD_TYPES].join(', ')}`,\n path: `encoding.${channel}.type`,\n code: 'INVALID_VALUE',\n suggestion: `Use one of: ${[...VALID_FIELD_TYPES].join(', ')}`,\n });\n }\n\n // Check field type is allowed for this channel\n if (channelRule && channelObj.type && channelRule.allowedTypes.length > 0) {\n if (!channelRule.allowedTypes.includes(channelObj.type as FieldType)) {\n errors.push({\n message: `Spec error: encoding.${channel} for ${chartType} chart does not accept type \"${channelObj.type}\". Allowed types: ${channelRule.allowedTypes.join(', ')}`,\n path: `encoding.${channel}.type`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Change encoding.${channel}.type to one of: ${channelRule.allowedTypes.join(', ')}`,\n });\n }\n }\n\n // Check field values match declared type\n if (channelObj.type && channelObj.field && dataColumns.has(channelObj.field as string)) {\n const data = spec.data as Record<string, unknown>[];\n const fieldName = channelObj.field as string;\n const fieldType = channelObj.type as string;\n // Sample up to 5 values for type checking\n const sampleSize = Math.min(5, data.length);\n\n if (fieldType === 'temporal') {\n let nonDateCount = 0;\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][fieldName];\n if (val != null && !isParseableDate(val)) {\n nonDateCount++;\n }\n }\n if (nonDateCount > 0) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${fieldName}\" is declared as temporal but contains non-date values`,\n path: `encoding.${channel}`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Either change the type to \"nominal\" or ensure \"${fieldName}\" values are parseable dates (ISO 8601 strings like \"2024-01-15\" or Date objects)`,\n });\n }\n }\n\n if (fieldType === 'quantitative') {\n let nonNumericCount = 0;\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][fieldName];\n if (val != null && !isNumeric(val)) {\n nonNumericCount++;\n }\n }\n if (nonNumericCount > 0) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${fieldName}\" is declared as quantitative but contains non-numeric values`,\n path: `encoding.${channel}`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Either change the type to \"nominal\" or ensure \"${fieldName}\" values are numbers`,\n });\n }\n }\n }\n }\n\n // Validate darkMode if provided\n if (spec.darkMode !== undefined && !VALID_DARK_MODES.has(spec.darkMode as string)) {\n errors.push({\n message: `Spec error: darkMode must be \"auto\", \"force\", or \"off\"`,\n path: 'darkMode',\n code: 'INVALID_VALUE',\n suggestion:\n 'Use one of: \"auto\" (system preference), \"force\" (always dark), or \"off\" (always light)',\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Table validation\n// ---------------------------------------------------------------------------\n\nfunction validateTableSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n if (!Array.isArray(spec.data)) {\n errors.push({\n message: 'Spec error: \"data\" must be an array',\n path: 'data',\n code: 'INVALID_TYPE',\n suggestion: 'Provide data as an array of objects, e.g. data: [{ name: \"Alice\", age: 30 }]',\n });\n return;\n }\n\n if (spec.data.length === 0) {\n errors.push({\n message: 'Spec error: \"data\" must be a non-empty array',\n path: 'data',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one data row to the data array',\n });\n return;\n }\n\n if (!Array.isArray(spec.columns)) {\n errors.push({\n message: 'Spec error: table spec requires a \"columns\" array',\n path: 'columns',\n code: 'MISSING_FIELD',\n suggestion:\n 'Add a columns array defining which data fields to display, e.g. columns: [{ key: \"name\" }, { key: \"age\" }]',\n });\n return;\n }\n\n const data = spec.data as Record<string, unknown>[];\n const firstRow = data[0];\n if (typeof firstRow !== 'object' || firstRow === null || Array.isArray(firstRow)) {\n errors.push({\n message: 'Spec error: each item in \"data\" must be a plain object',\n path: 'data[0]',\n code: 'INVALID_TYPE',\n suggestion:\n 'Each data item should be an object with key-value pairs, e.g. { name: \"Alice\", age: 30 }',\n });\n return;\n }\n\n const dataColumns = new Set(Object.keys(firstRow as Record<string, unknown>));\n const availableColumns = [...dataColumns].join(', ');\n const columns = spec.columns as Record<string, unknown>[];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i];\n if (!col || typeof col !== 'object') {\n errors.push({\n message: `Spec error: columns[${i}] must be an object`,\n path: `columns[${i}]`,\n code: 'INVALID_TYPE',\n suggestion: 'Each column entry should be an object, e.g. { key: \"fieldName\" }',\n });\n continue;\n }\n\n // Check key exists\n if (!col.key || typeof col.key !== 'string') {\n errors.push({\n message: `Spec error: columns[${i}] must have a \"key\" string`,\n path: `columns[${i}].key`,\n code: 'MISSING_FIELD',\n suggestion: `Add a key referencing a data field. Available columns: ${availableColumns}`,\n });\n continue;\n }\n\n // Check key references a field in data\n if (!dataColumns.has(col.key as string)) {\n errors.push({\n message: `Spec error: columns[${i}].key \"${col.key}\" does not exist in data. Available columns: ${availableColumns}`,\n path: `columns[${i}].key`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the available data columns: ${availableColumns}`,\n });\n }\n\n // Check at most one visual enhancement\n const visuals = ['heatmap', 'bar', 'sparkline', 'image', 'flag', 'categoryColors'].filter(\n (v) => col[v] != null && col[v] !== false,\n );\n if (visuals.length > 1) {\n errors.push({\n message: `Spec error: columns[${i}] has multiple visual features (${visuals.join(', ')}). Only one is allowed per column.`,\n path: `columns[${i}]`,\n code: 'INVALID_VALUE',\n suggestion: `Keep only one visual feature per column. Remove all but one of: ${visuals.join(', ')}`,\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Graph validation\n// ---------------------------------------------------------------------------\n\nfunction validateGraphSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n // Validate nodes array exists and is non-empty\n if (!Array.isArray(spec.nodes)) {\n errors.push({\n message: 'Spec error: graph spec requires a \"nodes\" array',\n path: 'nodes',\n code: 'MISSING_FIELD',\n suggestion:\n 'Add a nodes array with objects that have an \"id\" field, e.g. nodes: [{ id: \"a\" }, { id: \"b\" }]',\n });\n return; // Can't validate further without nodes\n }\n\n if (spec.nodes.length === 0) {\n errors.push({\n message: 'Spec error: \"nodes\" must be a non-empty array',\n path: 'nodes',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one node, e.g. nodes: [{ id: \"a\" }]',\n });\n return;\n }\n\n // Validate each node has a string id\n const nodeIds = new Set<string>();\n const nodes = spec.nodes as Record<string, unknown>[];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (!node || typeof node !== 'object') {\n errors.push({\n message: `Spec error: nodes[${i}] must be an object`,\n path: `nodes[${i}]`,\n code: 'INVALID_TYPE',\n suggestion: 'Each node must be an object with at least an \"id\" field, e.g. { id: \"a\" }',\n });\n continue;\n }\n if (typeof node.id !== 'string' || node.id === '') {\n errors.push({\n message: `Spec error: nodes[${i}] must have a non-empty string \"id\" field`,\n path: `nodes[${i}].id`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a string id to the node, e.g. { id: \"node1\" }',\n });\n } else {\n nodeIds.add(node.id);\n }\n }\n\n // Validate edges array exists\n if (!Array.isArray(spec.edges)) {\n errors.push({\n message: 'Spec error: graph spec requires an \"edges\" array',\n path: 'edges',\n code: 'MISSING_FIELD',\n suggestion: 'Add an edges array (can be empty), e.g. edges: [{ source: \"a\", target: \"b\" }]',\n });\n return;\n }\n\n // Validate each edge has string source and target that reference existing nodes\n const edges = spec.edges as Record<string, unknown>[];\n for (let i = 0; i < edges.length; i++) {\n const edge = edges[i];\n if (!edge || typeof edge !== 'object') {\n errors.push({\n message: `Spec error: edges[${i}] must be an object`,\n path: `edges[${i}]`,\n code: 'INVALID_TYPE',\n suggestion:\n 'Each edge must be an object with \"source\" and \"target\" fields, e.g. { source: \"a\", target: \"b\" }',\n });\n continue;\n }\n\n if (typeof edge.source !== 'string' || edge.source === '') {\n errors.push({\n message: `Spec error: edges[${i}] must have a non-empty string \"source\" field`,\n path: `edges[${i}].source`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a source node id, e.g. { source: \"a\", target: \"b\" }',\n });\n } else if (nodeIds.size > 0 && !nodeIds.has(edge.source)) {\n errors.push({\n message: `Spec error: edges[${i}].source \"${edge.source}\" does not reference an existing node id`,\n path: `edges[${i}].source`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the existing node ids: ${[...nodeIds].slice(0, 5).join(', ')}${nodeIds.size > 5 ? '...' : ''}`,\n });\n }\n\n if (typeof edge.target !== 'string' || edge.target === '') {\n errors.push({\n message: `Spec error: edges[${i}] must have a non-empty string \"target\" field`,\n path: `edges[${i}].target`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a target node id, e.g. { source: \"a\", target: \"b\" }',\n });\n } else if (nodeIds.size > 0 && !nodeIds.has(edge.target)) {\n errors.push({\n message: `Spec error: edges[${i}].target \"${edge.target}\" does not reference an existing node id`,\n path: `edges[${i}].target`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the existing node ids: ${[...nodeIds].slice(0, 5).join(', ')}${nodeIds.size > 5 ? '...' : ''}`,\n });\n }\n }\n\n // Validate encoding fields exist on at least the first node/edge\n if (spec.encoding && typeof spec.encoding === 'object') {\n const encoding = spec.encoding as Record<string, unknown>;\n const firstNode = nodes[0] as Record<string, unknown>;\n const firstEdge = edges.length > 0 ? (edges[0] as Record<string, unknown>) : null;\n const nodeFields = firstNode ? new Set(Object.keys(firstNode)) : new Set<string>();\n const edgeFields = firstEdge ? new Set(Object.keys(firstEdge)) : new Set<string>();\n\n const nodeChannels = ['nodeColor', 'nodeSize', 'nodeLabel'] as const;\n for (const channel of nodeChannels) {\n const ch = encoding[channel] as Record<string, unknown> | undefined;\n if (ch?.field && typeof ch.field === 'string' && !nodeFields.has(ch.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${ch.field}\" does not exist on nodes. Available fields: ${[...nodeFields].join(', ')}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the node fields: ${[...nodeFields].join(', ')}`,\n });\n }\n }\n\n const edgeChannels = ['edgeColor', 'edgeWidth'] as const;\n for (const channel of edgeChannels) {\n const ch = encoding[channel] as Record<string, unknown> | undefined;\n if (ch?.field && typeof ch.field === 'string' && firstEdge && !edgeFields.has(ch.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${ch.field}\" does not exist on edges. Available fields: ${[...edgeFields].join(', ')}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the edge fields: ${[...edgeFields].join(', ')}`,\n });\n }\n }\n }\n\n // Validate layout type if specified\n if (spec.layout && typeof spec.layout === 'object') {\n const layout = spec.layout as Record<string, unknown>;\n if (layout.type && layout.type !== 'force') {\n errors.push({\n message: `Spec error: layout.type \"${layout.type}\" is not supported. Only \"force\" is currently supported`,\n path: 'layout.type',\n code: 'INVALID_VALUE',\n suggestion:\n 'Use layout.type: \"force\" or omit the layout field to use the default force layout',\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a spec at runtime.\n *\n * Checks structure, required fields, encoding rules, data shape, and\n * field type compatibility. Returns structured errors with machine-readable\n * codes and actionable suggestions for each problem found.\n */\nexport function validateSpec(spec: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n // Basic shape check\n if (!spec || typeof spec !== 'object' || Array.isArray(spec)) {\n return {\n valid: false,\n errors: [\n {\n message: 'Spec error: spec must be a non-null object',\n code: 'INVALID_TYPE',\n suggestion:\n 'Pass a spec object with at least a \"type\" field, e.g. { type: \"line\", data: [...], encoding: {...} }',\n },\n ],\n normalized: null,\n };\n }\n\n const obj = spec as Record<string, unknown>;\n\n // Type check\n if (!obj.type || typeof obj.type !== 'string') {\n return {\n valid: false,\n errors: [\n {\n message: 'Spec error: spec must have a \"type\" field',\n path: 'type',\n code: 'MISSING_FIELD',\n suggestion: `Add a type field. Valid types: ${[...CHART_TYPES].join(', ')}, table, graph`,\n },\n ],\n normalized: null,\n };\n }\n\n const isChart = CHART_TYPES.has(obj.type);\n const isTable = obj.type === 'table';\n const isGraph = obj.type === 'graph';\n\n if (!isChart && !isTable && !isGraph) {\n return {\n valid: false,\n errors: [\n {\n message: `Spec error: \"${obj.type}\" is not a valid type. Valid types: ${[...CHART_TYPES].join(', ')}, table, graph`,\n path: 'type',\n code: 'INVALID_VALUE',\n suggestion: `Change type to one of: ${[...CHART_TYPES].join(', ')}, table, graph`,\n },\n ],\n normalized: null,\n };\n }\n\n // Type-specific validation\n if (isChart) {\n validateChartSpec(obj, errors);\n } else if (isTable) {\n validateTableSpec(obj, errors);\n } else if (isGraph) {\n validateGraphSpec(obj, errors);\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, normalized: null };\n }\n\n return {\n valid: true,\n errors: [],\n normalized: spec as VizSpec,\n };\n}\n","/**\n * Spec compiler: validate -> normalize pipeline.\n *\n * This is the first stage of the engine: take raw user input (possibly JSON\n * from an API or Claude), validate it, fill in defaults, and produce a\n * NormalizedSpec that the rest of the engine can work with safely.\n */\n\nimport { normalizeSpec } from './normalize';\nimport type { CompileResult } from './types';\nimport { validateSpec } from './validate';\n\n/**\n * Compile a raw spec through the validate -> normalize pipeline.\n *\n * @param spec - Raw spec input (unknown type, could be anything).\n * @returns CompileResult with the normalized spec and any warnings.\n * @throws Error if the spec is invalid.\n */\nexport function compile(spec: unknown): CompileResult {\n const validation = validateSpec(spec);\n\n if (!validation.valid || !validation.normalized) {\n const errorMessages = validation.errors.map((e) => e.message).join('\\n');\n throw new Error(`Invalid spec:\\n${errorMessages}`);\n }\n\n const warnings: string[] = [];\n const normalized = normalizeSpec(validation.normalized, warnings);\n\n return { spec: normalized, warnings };\n}\n\nexport { normalizeSpec } from './normalize';\nexport type {\n CompileResult,\n NormalizedChartSpec,\n NormalizedChrome,\n NormalizedGraphSpec,\n NormalizedSpec,\n NormalizedTableSpec,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n} from './types';\n// Re-export everything\nexport { validateSpec } from './validate';\n","/**\n * Graph compilation pipeline.\n *\n * Takes a raw graph spec (unknown shape), validates, normalizes, resolves\n * encoding channels to visual properties, assigns communities, builds\n * legend/tooltips/a11y, and returns a GraphCompilation.\n *\n * The pipeline mirrors compileChart's structure:\n * validate -> normalize -> resolve theme -> resolve visuals ->\n * community assignment -> legend -> tooltips -> a11y -> return\n *\n * Key difference from charts: the output does NOT include x/y positions.\n * The force simulation in the adapter handles layout at runtime.\n */\n\nimport type {\n CompileOptions,\n LegendEntry,\n LegendLayout,\n ResolvedTheme,\n TextStyle,\n TooltipContent,\n TooltipField,\n} from '@opendata-ai/openchart-core';\nimport { adaptTheme, computeChrome, resolveTheme } from '@opendata-ai/openchart-core';\n\nimport { compile as compileSpec } from '../compiler/index';\nimport type { NormalizedGraphSpec } from '../compiler/types';\nimport { applyCommunityColors, assignCommunities, buildCommunityColorMap } from './community';\nimport { resolveEdgeVisuals, resolveNodeVisuals } from './encoding';\nimport type { CompiledGraphNode, GraphCompilation, SimulationConfig } from './types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SWATCH_SIZE = 12;\nconst SWATCH_GAP = 6;\nconst ENTRY_GAP = 16;\n\n// ---------------------------------------------------------------------------\n// Legend builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a legend from community assignments or nodeColor encoding.\n *\n * Built manually instead of reusing computeLegend (which assumes chart\n * encoding channels). Returns entries with color swatches and labels.\n * Position is placeholder (adapter determines actual placement).\n */\nfunction buildGraphLegend(\n nodes: CompiledGraphNode[],\n communityColorMap: Map<string, string>,\n hasCommunities: boolean,\n theme: ResolvedTheme,\n): LegendLayout {\n const labelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n let entries: LegendEntry[];\n\n if (hasCommunities && communityColorMap.size > 0) {\n // One entry per community\n entries = [...communityColorMap.entries()].map(([label, color]) => ({\n label,\n color,\n shape: 'circle' as const,\n active: true,\n }));\n } else {\n // Collect unique colors from nodes (for nodeColor encoding)\n const colorLabels = new Map<string, string>();\n for (const node of nodes) {\n if (!colorLabels.has(node.fill)) {\n // Use the first node with this color as the label representative\n colorLabels.set(node.fill, node.label ?? node.id);\n }\n }\n\n // Only show legend if there are multiple colors\n if (colorLabels.size <= 1) {\n entries = [];\n } else {\n entries = [...colorLabels.entries()].map(([color, label]) => ({\n label,\n color,\n shape: 'circle' as const,\n active: true,\n }));\n }\n }\n\n return {\n position: 'top',\n entries,\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build tooltip descriptors for each node.\n *\n * Keyed by node id. Shows all data fields, label, and community.\n */\nfunction buildGraphTooltips(nodes: CompiledGraphNode[]): Map<string, TooltipContent> {\n const descriptors = new Map<string, TooltipContent>();\n\n for (const node of nodes) {\n const fields: TooltipField[] = [];\n\n // Add community if present\n if (node.community != null) {\n fields.push({\n label: 'Community',\n value: node.community,\n color: node.fill,\n });\n }\n\n // Add all data fields (excluding id since it's the title)\n for (const [key, value] of Object.entries(node.data)) {\n if (key === 'id') continue;\n if (value == null) continue;\n\n fields.push({\n label: key,\n value: typeof value === 'number' ? value.toLocaleString() : String(value),\n });\n }\n\n descriptors.set(node.id, {\n title: node.label ?? node.id,\n fields,\n });\n }\n\n return descriptors;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a graph spec into a GraphCompilation.\n *\n * Pipeline:\n * 1. Validate + normalize via the shared compiler pipeline\n * 2. Resolve theme (merge spec + options, apply dark mode)\n * 3. Resolve node visuals (size, color, label, stroke)\n * 4. Assign communities if layout.clustering is set\n * 5. Apply community colors (override nodeColor)\n * 6. Resolve edge visuals (width, color)\n * 7. Build legend from communities or nodeColor\n * 8. Build tooltip descriptors for each node\n * 9. Build a11y metadata\n * 10. Build simulation config from spec layout\n * 11. Build chrome from spec + theme\n * 12. Return GraphCompilation\n *\n * @param spec - Raw graph spec (validated at runtime).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns GraphCompilation with resolved visual properties.\n * @throws Error if spec is invalid or not a graph type.\n */\nexport function compileGraph(spec: unknown, options: CompileOptions): GraphCompilation {\n // 1. Validate + normalize\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type !== 'graph') {\n throw new Error(\n `compileGraph received a ${normalized.type} spec. Use compileChart or compileTable instead.`,\n );\n }\n\n const graphSpec = normalized as NormalizedGraphSpec;\n\n // 2. Resolve theme\n const mergedThemeConfig = options.theme\n ? { ...graphSpec.theme, ...options.theme }\n : graphSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n // 3. Resolve node visuals\n const compiledNodes = resolveNodeVisuals(\n graphSpec.nodes,\n graphSpec.encoding,\n graphSpec.edges,\n theme,\n graphSpec.nodeOverrides,\n );\n\n // 4. Assign communities\n const clusteringField = graphSpec.layout.clustering?.field;\n const hasCommunities = !!clusteringField;\n assignCommunities(compiledNodes, clusteringField);\n\n // 5. Apply community colors\n let communityColorMap = new Map<string, string>();\n if (hasCommunities) {\n communityColorMap = buildCommunityColorMap(compiledNodes, theme);\n applyCommunityColors(compiledNodes, communityColorMap);\n }\n\n // 6. Resolve edge visuals\n const compiledEdges = resolveEdgeVisuals(graphSpec.edges, graphSpec.encoding, theme);\n\n // 7. Build legend\n const legend = buildGraphLegend(compiledNodes, communityColorMap, hasCommunities, theme);\n\n // 8. Build tooltips\n const tooltipDescriptors = buildGraphTooltips(compiledNodes);\n\n // 9. Build a11y metadata\n const communityCount = communityColorMap.size;\n const altParts = [\n `Network graph with ${compiledNodes.length} nodes and ${compiledEdges.length} edges`,\n ];\n if (communityCount > 0) {\n altParts.push(`organized into ${communityCount} communities`);\n }\n const a11y = {\n altText: altParts.join(', '),\n dataTableFallback: compiledNodes.map((n) => [n.id, n.community ?? '', n.label ?? '']),\n role: 'img',\n keyboardNavigable: compiledNodes.length > 0,\n };\n\n // 10. Build simulation config\n const collisionPadding = graphSpec.layout.collisionPadding ?? 2;\n const maxRadius =\n compiledNodes.length > 0\n ? Math.max(...compiledNodes.map((n) => n.radius))\n : DEFAULT_COLLISION_PADDING;\n const simulationConfig: SimulationConfig = {\n chargeStrength: graphSpec.layout.chargeStrength ?? -300,\n linkDistance: graphSpec.layout.linkDistance ?? 30,\n clustering: clusteringField ? { field: clusteringField, strength: 0.5 } : null,\n alphaDecay: 0.0228,\n velocityDecay: 0.4,\n collisionRadius: maxRadius + collisionPadding,\n collisionPadding,\n linkStrength: graphSpec.layout.linkStrength,\n centerForce: graphSpec.layout.centerForce,\n };\n\n // 11. Build chrome\n const chrome = computeChrome(\n {\n title: graphSpec.chrome.title,\n subtitle: graphSpec.chrome.subtitle,\n source: graphSpec.chrome.source,\n byline: graphSpec.chrome.byline,\n footer: graphSpec.chrome.footer,\n },\n theme,\n options.width,\n options.measureText,\n );\n\n // 12. Return compilation\n return {\n nodes: compiledNodes,\n edges: compiledEdges,\n legend,\n chrome,\n tooltipDescriptors,\n a11y,\n theme,\n dimensions: {\n width: options.width,\n height: options.height,\n },\n simulationConfig,\n };\n}\n\n/** Default padding for collision radius when there are no nodes. */\nconst DEFAULT_COLLISION_PADDING = 5;\n","/**\n * Graph encoding resolution.\n *\n * Maps graph encoding channels (nodeSize, nodeColor, edgeWidth, edgeColor,\n * nodeLabel) to computed visual properties on nodes and edges. Uses d3 scales\n * the same way scatter/bubble charts do: scaleSqrt for size, scaleOrdinal\n * for categorical color, scaleLinear for quantitative color.\n */\n\nimport type {\n GraphEdge,\n GraphEncoding,\n GraphNode,\n NodeOverride,\n ResolvedTheme,\n} from '@opendata-ai/openchart-core';\nimport { max, min } from 'd3-array';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } from 'd3-scale';\n\nimport type { CompiledGraphEdge, CompiledGraphNode } from './types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_NODE_RADIUS = 5;\nconst MIN_NODE_RADIUS = 3;\nconst MAX_NODE_RADIUS = 12;\n\nconst DEFAULT_EDGE_WIDTH = 1;\nconst MIN_EDGE_WIDTH = 0.5;\nconst MAX_EDGE_WIDTH = 4;\n\nconst DEFAULT_STROKE_WIDTH = 1;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Darken a hex color by a percentage.\n *\n * Doesn't use d3-color (engine doesn't depend on it). Operates directly\n * on hex RGB channels. Falls back to the original color on parse failure.\n */\nexport function darkenColor(hex: string, amount: number = 0.2): string {\n // Strip # prefix\n const clean = hex.replace(/^#/, '');\n if (clean.length !== 6 && clean.length !== 3) return hex;\n\n // Expand shorthand\n const full =\n clean.length === 3\n ? clean\n .split('')\n .map((c) => c + c)\n .join('')\n : clean;\n\n const r = Math.max(0, Math.round(parseInt(full.substring(0, 2), 16) * (1 - amount)));\n const g = Math.max(0, Math.round(parseInt(full.substring(2, 4), 16) * (1 - amount)));\n const b = Math.max(0, Math.round(parseInt(full.substring(4, 6), 16) * (1 - amount)));\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Apply opacity to a hex color, returning an rgba string.\n */\nfunction hexWithOpacity(hex: string, opacity: number): string {\n const clean = hex.replace(/^#/, '');\n if (clean.length !== 6 && clean.length !== 3) {\n // Non-hex input: return as-is with opacity via CSS\n return hex;\n }\n\n const full =\n clean.length === 3\n ? clean\n .split('')\n .map((c) => c + c)\n .join('')\n : clean;\n\n const r = parseInt(full.substring(0, 2), 16);\n const g = parseInt(full.substring(2, 4), 16);\n const b = parseInt(full.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\n/**\n * Compute the degree of each node (number of edges touching it).\n */\nfunction computeDegrees(nodes: GraphNode[], edges: GraphEdge[]): Map<string, number> {\n const degrees = new Map<string, number>();\n for (const node of nodes) {\n degrees.set(node.id, 0);\n }\n for (const edge of edges) {\n degrees.set(edge.source, (degrees.get(edge.source) ?? 0) + 1);\n degrees.set(edge.target, (degrees.get(edge.target) ?? 0) + 1);\n }\n return degrees;\n}\n\n// ---------------------------------------------------------------------------\n// Node visual resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve visual properties for all graph nodes.\n *\n * Applies nodeSize, nodeColor, and nodeLabel encoding channels from the\n * spec to produce CompiledGraphNode objects with computed fill, radius,\n * stroke, label, and label priority.\n */\nexport function resolveNodeVisuals(\n nodes: GraphNode[],\n encoding: GraphEncoding,\n edges: GraphEdge[],\n theme: ResolvedTheme,\n nodeOverrides?: Record<string, NodeOverride>,\n): CompiledGraphNode[] {\n const degrees = computeDegrees(nodes, edges);\n const maxDegree = Math.max(1, ...degrees.values());\n\n // Build node size scale\n let sizeScale: ((v: number) => number) | undefined;\n if (encoding.nodeSize?.field) {\n const field = encoding.nodeSize.field;\n const values = nodes.map((n) => Number(n[field])).filter((v) => Number.isFinite(v));\n\n const sizeMin = min(values) ?? 0;\n const sizeMax = max(values) ?? 1;\n\n sizeScale = scaleSqrt().domain([sizeMin, sizeMax]).range([MIN_NODE_RADIUS, MAX_NODE_RADIUS]);\n }\n\n // Build node color scale\n let colorFn: ((node: GraphNode) => string) | undefined;\n if (encoding.nodeColor?.field) {\n const field = encoding.nodeColor.field;\n const fieldType = encoding.nodeColor.type ?? 'nominal';\n\n if (fieldType === 'quantitative') {\n const values = nodes.map((n) => Number(n[field])).filter((v) => Number.isFinite(v));\n const colorMin = min(values) ?? 0;\n const colorMax = max(values) ?? 1;\n\n // Use first sequential palette\n const seqPalettes = Object.values(theme.colors.sequential);\n const palette = seqPalettes.length > 0 ? seqPalettes[0] : ['#ccc', '#333'];\n const colorScale = scaleLinear<string>()\n .domain([colorMin, colorMax])\n .range([palette[0], palette[palette.length - 1]]);\n\n colorFn = (node: GraphNode) => {\n const val = Number(node[field]);\n return Number.isFinite(val) ? colorScale(val) : theme.colors.categorical[0];\n };\n } else {\n // nominal/ordinal\n const uniqueValues = [...new Set(nodes.map((n) => String(n[field] ?? '')))];\n const ordinalScale = scaleOrdinal<string>()\n .domain(uniqueValues)\n .range(theme.colors.categorical);\n\n colorFn = (node: GraphNode) => ordinalScale(String(node[field] ?? ''));\n }\n }\n\n const defaultColor = theme.colors.categorical[0];\n\n return nodes.map((node) => {\n // Radius\n let radius = DEFAULT_NODE_RADIUS;\n if (sizeScale && encoding.nodeSize?.field) {\n const val = Number(node[encoding.nodeSize.field]);\n if (Number.isFinite(val)) {\n radius = sizeScale(val);\n }\n }\n\n // Color\n const fill = colorFn ? colorFn(node) : defaultColor;\n\n // Stroke: darken fill by 20%\n const stroke = darkenColor(fill);\n\n // Label\n let label: string | undefined;\n if (encoding.nodeLabel?.field) {\n const labelVal = node[encoding.nodeLabel.field];\n label = labelVal != null ? String(labelVal) : undefined;\n } else {\n label = node.id;\n }\n\n // Label priority: degree / maxDegree (0 to 1)\n const degree = degrees.get(node.id) ?? 0;\n const labelPriority = maxDegree > 0 ? degree / maxDegree : 0;\n\n // Data: spread all original node fields\n const { id: _id, ...rest } = node;\n const data: Record<string, unknown> = { id: node.id, ...rest };\n\n // Apply per-node overrides if present\n const override = nodeOverrides?.[node.id];\n const finalFill = override?.fill ?? fill;\n const finalRadius = override?.radius ?? radius;\n const finalStrokeWidth = override?.strokeWidth ?? DEFAULT_STROKE_WIDTH;\n const finalStroke = override?.stroke ?? stroke;\n const finalLabelPriority = override?.alwaysShowLabel ? Infinity : labelPriority;\n\n return {\n id: node.id,\n radius: finalRadius,\n fill: finalFill,\n stroke: finalStroke,\n strokeWidth: finalStrokeWidth,\n label,\n labelPriority: finalLabelPriority,\n community: undefined,\n data,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Edge visual resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve visual properties for all graph edges.\n *\n * Applies edgeWidth and edgeColor encoding channels to produce\n * CompiledGraphEdge objects with computed stroke, strokeWidth, and style.\n */\nexport function resolveEdgeVisuals(\n edges: GraphEdge[],\n encoding: GraphEncoding,\n theme: ResolvedTheme,\n): CompiledGraphEdge[] {\n // Edge width scale\n let widthScale: ((v: number) => number) | undefined;\n if (encoding.edgeWidth?.field) {\n const field = encoding.edgeWidth.field;\n const values = edges.map((e) => Number(e[field])).filter((v) => Number.isFinite(v));\n\n const widthMin = min(values) ?? 0;\n const widthMax = max(values) ?? 1;\n\n widthScale = scaleLinear().domain([widthMin, widthMax]).range([MIN_EDGE_WIDTH, MAX_EDGE_WIDTH]);\n }\n\n // Edge color scale\n let edgeColorFn: ((edge: GraphEdge) => string) | undefined;\n if (encoding.edgeColor?.field) {\n const field = encoding.edgeColor.field;\n const fieldType = encoding.edgeColor.type ?? 'nominal';\n\n if (fieldType === 'quantitative') {\n const values = edges.map((e) => Number(e[field])).filter((v) => Number.isFinite(v));\n const colorMin = min(values) ?? 0;\n const colorMax = max(values) ?? 1;\n\n const seqPalettes = Object.values(theme.colors.sequential);\n const palette = seqPalettes.length > 0 ? seqPalettes[0] : ['#ccc', '#333'];\n const colorScale = scaleLinear<string>()\n .domain([colorMin, colorMax])\n .range([palette[0], palette[palette.length - 1]]);\n\n edgeColorFn = (edge: GraphEdge) => {\n const val = Number(edge[field]);\n return Number.isFinite(val) ? colorScale(val) : hexWithOpacity(theme.colors.axis, 0.4);\n };\n } else {\n const uniqueValues = [...new Set(edges.map((e) => String(e[field] ?? '')))];\n const ordinalScale = scaleOrdinal<string>()\n .domain(uniqueValues)\n .range(theme.colors.categorical);\n\n edgeColorFn = (edge: GraphEdge) => ordinalScale(String(edge[field] ?? ''));\n }\n }\n\n const defaultEdgeColor = hexWithOpacity(theme.colors.axis, 0.4);\n\n // Edge style mapping (ordinal: map unique field values to solid/dashed/dotted)\n const EDGE_STYLES: Array<'solid' | 'dashed' | 'dotted'> = ['solid', 'dashed', 'dotted'];\n let styleFn: ((edge: GraphEdge) => 'solid' | 'dashed' | 'dotted') | undefined;\n if (encoding.edgeStyle?.field) {\n const field = encoding.edgeStyle.field;\n const uniqueValues = [...new Set(edges.map((e) => String(e[field] ?? '')))];\n const styleMap = new Map<string, 'solid' | 'dashed' | 'dotted'>();\n for (let i = 0; i < uniqueValues.length; i++) {\n styleMap.set(uniqueValues[i], EDGE_STYLES[i % EDGE_STYLES.length]);\n }\n styleFn = (edge: GraphEdge) => styleMap.get(String(edge[field] ?? '')) ?? 'solid';\n }\n\n return edges.map((edge) => {\n const { source, target, ...rest } = edge;\n\n let strokeWidth = DEFAULT_EDGE_WIDTH;\n if (widthScale && encoding.edgeWidth?.field) {\n const val = Number(edge[encoding.edgeWidth.field]);\n if (Number.isFinite(val)) {\n strokeWidth = widthScale(val);\n }\n }\n\n const stroke = edgeColorFn ? edgeColorFn(edge) : defaultEdgeColor;\n const style = styleFn ? styleFn(edge) : ('solid' as const);\n\n return {\n source,\n target,\n stroke,\n strokeWidth,\n style,\n data: { source, target, ...rest } as Record<string, unknown>,\n };\n });\n}\n","/**\n * Community assignment and color mapping for graph clustering.\n *\n * When a graph spec has layout.clustering.field, nodes are grouped into\n * communities based on their data values for that field. Each community\n * gets a color from the theme's categorical palette. Community colors\n * override nodeColor encoding when clustering is active.\n */\n\nimport type { ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { darkenColor } from './encoding';\nimport type { CompiledGraphNode } from './types';\n\n// ---------------------------------------------------------------------------\n// Community assignment\n// ---------------------------------------------------------------------------\n\n/**\n * Assign community labels to compiled nodes based on a clustering field.\n *\n * Reads node.data[clusteringField] as the community label. If the field\n * is missing on a node, community remains undefined.\n *\n * Mutates nodes in-place for efficiency (no copy needed since we just\n * built them in the compilation pipeline).\n */\nexport function assignCommunities(\n nodes: CompiledGraphNode[],\n clusteringField: string | undefined,\n): void {\n if (!clusteringField) return;\n\n for (const node of nodes) {\n const value = node.data[clusteringField];\n node.community = value != null ? String(value) : undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Community color mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Build a map from community label to color.\n *\n * Collects unique community values (in order of first appearance),\n * then assigns theme categorical colors round-robin.\n */\nexport function buildCommunityColorMap(\n nodes: CompiledGraphNode[],\n theme: ResolvedTheme,\n): Map<string, string> {\n const colorMap = new Map<string, string>();\n const palette = theme.colors.categorical;\n let colorIndex = 0;\n\n for (const node of nodes) {\n if (node.community != null && !colorMap.has(node.community)) {\n colorMap.set(node.community, palette[colorIndex % palette.length]);\n colorIndex++;\n }\n }\n\n return colorMap;\n}\n\n// ---------------------------------------------------------------------------\n// Apply community colors\n// ---------------------------------------------------------------------------\n\n/**\n * Override node fill and stroke colors with community colors.\n *\n * Only affects nodes that have a community assignment. Nodes without\n * a community keep their existing fill/stroke from encoding resolution.\n *\n * Mutates nodes in-place.\n */\nexport function applyCommunityColors(\n nodes: CompiledGraphNode[],\n colorMap: Map<string, string>,\n): void {\n for (const node of nodes) {\n if (node.community != null) {\n const communityColor = colorMap.get(node.community);\n if (communityColor) {\n node.fill = communityColor;\n node.stroke = darkenColor(communityColor);\n }\n }\n }\n}\n","/**\n * Axis computation: tick positions, labels, and axis lines.\n *\n * Generates ticks manually (no d3-axis) so we have full control over\n * responsive tick density and formatting.\n */\n\nimport type {\n AxisLabelDensity,\n AxisLayout,\n AxisTick,\n Gridline,\n LayoutStrategy,\n Rect,\n ResolvedTheme,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport {\n abbreviateNumber,\n buildD3Formatter,\n estimateTextWidth,\n formatDate,\n formatNumber,\n} from '@opendata-ai/openchart-core';\nimport type { ScaleBand } from 'd3-scale';\nimport type {\n D3CategoricalScale,\n D3ContinuousScale,\n ResolvedScale,\n ResolvedScales,\n} from './scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Base tick counts by axis label density. */\nconst TICK_COUNTS: Record<AxisLabelDensity, number> = {\n full: 8,\n reduced: 5,\n minimal: 3,\n};\n\n/**\n * Height thresholds for reducing y-axis tick density.\n * Below these pixel heights, we step down the density regardless of the\n * width-based strategy. This prevents overlapping y-axis labels in short\n * containers like thumbnail previews.\n */\nconst HEIGHT_MINIMAL_THRESHOLD = 120;\nconst HEIGHT_REDUCED_THRESHOLD = 200;\n\n/**\n * Width thresholds for reducing x-axis tick density.\n * Mirrors the height logic for the x-axis: narrow containers get fewer ticks.\n */\nconst WIDTH_MINIMAL_THRESHOLD = 150;\nconst WIDTH_REDUCED_THRESHOLD = 300;\n\n/** Ordered densities from most to fewest ticks. */\nconst DENSITY_ORDER: AxisLabelDensity[] = ['full', 'reduced', 'minimal'];\n\n/**\n * Compute effective axis tick density by considering available space.\n *\n * The width-based breakpoint system sets a base density, but it doesn't know\n * about the actual chart area dimensions (which shrink after chrome/legend\n * allocation). This function steps density down further when the axis\n * dimension is too small for the requested tick count.\n *\n * @param baseDensity - The density from the responsive layout strategy.\n * @param axisLength - Available pixels along this axis (height for y, width for x).\n * @param minimalThreshold - Below this pixel size, force minimal density.\n * @param reducedThreshold - Below this pixel size, cap at reduced density.\n * @returns The effective density, never looser than the base.\n */\nexport function effectiveDensity(\n baseDensity: AxisLabelDensity,\n axisLength: number,\n minimalThreshold: number,\n reducedThreshold: number,\n): AxisLabelDensity {\n let density = baseDensity;\n\n if (axisLength < minimalThreshold) {\n density = 'minimal';\n } else if (axisLength < reducedThreshold) {\n // Don't increase density beyond what the base strategy allows.\n // If base is already 'minimal', keep it.\n const baseIdx = DENSITY_ORDER.indexOf(baseDensity);\n const reducedIdx = DENSITY_ORDER.indexOf('reduced');\n density = DENSITY_ORDER[Math.max(baseIdx, reducedIdx)];\n }\n\n return density;\n}\n\n// ---------------------------------------------------------------------------\n// Tick generation\n// ---------------------------------------------------------------------------\n\n/** Generate ticks for a continuous scale (linear, time, log). */\nfunction continuousTicks(resolvedScale: ResolvedScale, density: AxisLabelDensity): AxisTick[] {\n const scale = resolvedScale.scale as D3ContinuousScale;\n const count = resolvedScale.channel.axis?.tickCount ?? TICK_COUNTS[density];\n const ticks: unknown[] = scale.ticks(count);\n\n return ticks.map((value: unknown) => ({\n value,\n position: scale(value as number & Date) as number,\n label: formatTickLabel(value, resolvedScale),\n }));\n}\n\n/** Generate ticks for a band/point/ordinal scale. */\nfunction categoricalTicks(resolvedScale: ResolvedScale, density: AxisLabelDensity): AxisTick[] {\n const scale = resolvedScale.scale as D3CategoricalScale;\n const domain: string[] = scale.domain();\n const explicitTickCount = resolvedScale.channel.axis?.tickCount;\n const maxTicks = explicitTickCount ?? TICK_COUNTS[density];\n\n // Band scales (bar charts) show all category labels by default.\n // Only thin when there's an explicit tickCount override or for point/ordinal scales.\n let selectedValues = domain;\n if ((resolvedScale.type !== 'band' || explicitTickCount) && domain.length > maxTicks) {\n const step = Math.ceil(domain.length / maxTicks);\n selectedValues = domain.filter((_: string, i: number) => i % step === 0);\n }\n\n return selectedValues.map((value: string) => {\n // Band scales: use the center of the band\n const bandScale = resolvedScale.type === 'band' ? (scale as ScaleBand<string>) : null;\n const pos = bandScale\n ? (bandScale(value) ?? 0) + bandScale.bandwidth() / 2\n : ((scale(value) as number | undefined) ?? 0);\n\n return {\n value,\n position: pos,\n label: value,\n };\n });\n}\n\n/** Format a tick value based on the scale type. */\nfunction formatTickLabel(value: unknown, resolvedScale: ResolvedScale): string {\n const formatStr = resolvedScale.channel.axis?.format;\n\n if (resolvedScale.type === 'time') {\n if (formatStr) return String(value); // Custom format not implemented yet\n return formatDate(value as Date);\n }\n\n if (resolvedScale.type === 'linear' || resolvedScale.type === 'log') {\n const num = value as number;\n if (formatStr) {\n const fmt = buildD3Formatter(formatStr);\n if (fmt) return fmt(num);\n }\n // Abbreviate large numbers for axis labels\n if (Math.abs(num) >= 1000) return abbreviateNumber(num);\n return formatNumber(num);\n }\n\n return String(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Output of computeAxes. */\nexport interface AxesResult {\n x?: AxisLayout;\n y?: AxisLayout;\n}\n\n/**\n * Compute axis layouts with tick positions, labels, and axis lines.\n *\n * @param scales - Resolved scales from computeScales.\n * @param chartArea - The chart drawing area.\n * @param strategy - Responsive layout strategy.\n * @param theme - Resolved theme for styling.\n */\nexport function computeAxes(\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n): AxesResult {\n const result: AxesResult = {};\n const baseDensity = strategy.axisLabelDensity;\n\n // Compute per-axis density based on available space.\n // Y-axis density adapts to chart height; X-axis density adapts to chart width.\n const yDensity = effectiveDensity(\n baseDensity,\n chartArea.height,\n HEIGHT_MINIMAL_THRESHOLD,\n HEIGHT_REDUCED_THRESHOLD,\n );\n const xDensity = effectiveDensity(\n baseDensity,\n chartArea.width,\n WIDTH_MINIMAL_THRESHOLD,\n WIDTH_REDUCED_THRESHOLD,\n );\n\n const tickLabelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.axisTick,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.axis,\n lineHeight: 1.2,\n fontVariant: 'tabular-nums',\n };\n\n const axisLabelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.body,\n fontWeight: theme.fonts.weights.medium,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n if (scales.x) {\n const ticks =\n scales.x.type === 'band' || scales.x.type === 'point' || scales.x.type === 'ordinal'\n ? categoricalTicks(scales.x, xDensity)\n : continuousTicks(scales.x, xDensity);\n\n const gridlines: Gridline[] = ticks.map((t) => ({\n position: t.position,\n major: true,\n }));\n\n // Auto-rotate labels when band scale labels would overlap.\n // Uses max label width (not average) since one long label is enough to overlap.\n let tickAngle = scales.x.channel.axis?.tickAngle;\n if (tickAngle === undefined && scales.x.type === 'band' && ticks.length > 1) {\n const bandwidth = (scales.x.scale as ScaleBand<string>).bandwidth();\n let maxLabelWidth = 0;\n for (const t of ticks) {\n const w = estimateTextWidth(\n t.label,\n theme.fonts.sizes.axisTick,\n theme.fonts.weights.normal,\n );\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n // If the widest label exceeds 85% of the bandwidth, rotate to avoid overlap\n if (maxLabelWidth > bandwidth * 0.85) {\n tickAngle = -45;\n }\n }\n\n result.x = {\n ticks,\n gridlines: scales.x.channel.axis?.grid ? gridlines : [],\n label: scales.x.channel.axis?.label,\n labelStyle: axisLabelStyle,\n tickLabelStyle,\n tickAngle,\n start: { x: chartArea.x, y: chartArea.y + chartArea.height },\n end: { x: chartArea.x + chartArea.width, y: chartArea.y + chartArea.height },\n };\n }\n\n if (scales.y) {\n const ticks =\n scales.y.type === 'band' || scales.y.type === 'point' || scales.y.type === 'ordinal'\n ? categoricalTicks(scales.y, yDensity)\n : continuousTicks(scales.y, yDensity);\n\n const gridlines: Gridline[] = ticks.map((t) => ({\n position: t.position,\n major: true,\n }));\n\n result.y = {\n ticks,\n // Y-axis gridlines are shown by default (standard editorial practice)\n gridlines,\n label: scales.y.channel.axis?.label,\n labelStyle: axisLabelStyle,\n tickLabelStyle,\n tickAngle: scales.y.channel.axis?.tickAngle,\n start: { x: chartArea.x, y: chartArea.y },\n end: { x: chartArea.x, y: chartArea.y + chartArea.height },\n };\n }\n\n return result;\n}\n","/**\n * Dimension computation for the chart layout.\n *\n * Takes the normalized spec + compile options + legend layout and produces\n * LayoutDimensions with the total area, chrome layout, chart drawing area,\n * and margins. The chart area is what's left after subtracting chrome,\n * legend space, and axis margins.\n *\n * Padding and chrome scale down at smaller container sizes to maximize\n * the usable chart area. When the chart area is still too small after\n * scaling, chrome is progressively stripped as a fallback.\n */\n\nimport type {\n CompileOptions,\n Encoding,\n LayoutStrategy,\n LegendLayout,\n Margins,\n Rect,\n ResolvedChrome,\n ResolvedTheme,\n} from '@opendata-ai/openchart-core';\nimport { computeChrome, estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec, NormalizedChrome } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The complete dimension layout for a chart. */\nexport interface LayoutDimensions {\n /** Total available space. */\n total: Rect;\n /** Resolved chrome (title, subtitle, source, etc.). */\n chrome: ResolvedChrome;\n /** The chart drawing area (after subtracting chrome, legend, margins). */\n chartArea: Rect;\n /** Margins around the chart area. */\n margins: Margins;\n /** Resolved theme used for this layout. */\n theme: ResolvedTheme;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Convert NormalizedChrome back to a Chrome-compatible shape for computeChrome. */\nfunction chromeToInput(chrome: NormalizedChrome): import('@opendata-ai/openchart-core').Chrome {\n return {\n title: chrome.title,\n subtitle: chrome.subtitle,\n source: chrome.source,\n byline: chrome.byline,\n footer: chrome.footer,\n };\n}\n\n/**\n * Scale padding based on the smaller container dimension.\n * At >= 500px, padding is unchanged. At <= 200px, padding is halved (min 4px).\n * Linear interpolation between 200-500px.\n */\nfunction scalePadding(basePadding: number, width: number, height: number): number {\n const minDim = Math.min(width, height);\n if (minDim >= 500) return basePadding;\n if (minDim <= 200) return Math.max(Math.round(basePadding * 0.5), 4);\n const t = (minDim - 200) / 300;\n return Math.max(Math.round(basePadding * (0.5 + t * 0.5)), 4);\n}\n\n/** Minimum chart area dimensions before guardrails kick in. */\nconst MIN_CHART_WIDTH = 60;\nconst MIN_CHART_HEIGHT = 40;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute chart dimensions, reserving space for chrome, legend, and axes.\n *\n * @param spec - Normalized chart spec.\n * @param options - Compile options (width, height, theme, darkMode).\n * @param legendLayout - Pre-computed legend layout (used to reserve space).\n * @param theme - Already-resolved theme (resolved once in compileChart).\n * @param strategy - Responsive layout strategy (controls chrome mode).\n * @returns LayoutDimensions with chart area rect.\n */\nexport function computeDimensions(\n spec: NormalizedChartSpec,\n options: CompileOptions,\n legendLayout: LegendLayout,\n theme: ResolvedTheme,\n strategy?: LayoutStrategy,\n): LayoutDimensions {\n const { width, height } = options;\n\n const padding = scalePadding(theme.spacing.padding, width, height);\n const axisMargin = theme.spacing.axisMargin;\n const chromeMode = strategy?.chromeMode ?? 'full';\n\n // Compute chrome with mode and scaled padding\n const chrome = computeChrome(\n chromeToInput(spec.chrome),\n theme,\n width,\n options.measureText,\n chromeMode,\n padding,\n );\n\n // Start with the total rect\n const total: Rect = { x: 0, y: 0, width, height };\n\n // Radial charts (pie/donut) don't have axes, so skip axis space\n const isRadial = spec.type === 'pie' || spec.type === 'donut';\n const encoding = spec.encoding as Encoding;\n\n // Estimate x-axis height below chart area: tick labels sit 14px below,\n // axis title sits 35px below. These extend past the chart area bottom\n // and source/footer chrome must be positioned below them.\n const xAxis = encoding.x?.axis as (Record<string, unknown> & { tickAngle?: number }) | undefined;\n const hasXAxisLabel = !!xAxis?.label;\n const xTickAngle = xAxis?.tickAngle;\n\n let xAxisHeight: number;\n if (isRadial) {\n xAxisHeight = 0;\n } else if (xTickAngle && Math.abs(xTickAngle) > 10) {\n // Rotated labels: estimate height from the longest label text.\n // At -90 degrees, the label height = text width. At -45, it's width * sin(45).\n const angleRad = Math.abs(xTickAngle) * (Math.PI / 180);\n const xField = encoding.x?.field;\n let maxLabelWidth = 40; // fallback\n if (xField) {\n for (const row of spec.data) {\n const label = String(row[xField] ?? '');\n const w = estimateTextWidth(label, theme.fonts.sizes.axisTick, theme.fonts.weights.normal);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n }\n // Rotated label height: width * sin(angle), plus a small gap\n const rotatedHeight = maxLabelWidth * Math.sin(angleRad) + 6;\n // Cap at a reasonable max to avoid absurd margins\n const labelHeight = Math.min(rotatedHeight, 120);\n xAxisHeight = hasXAxisLabel ? labelHeight + 20 : labelHeight;\n } else {\n xAxisHeight = hasXAxisLabel ? 48 : 26;\n }\n\n // Build margins: padding + chrome + axis space\n const margins: Margins = {\n top: padding + chrome.topHeight + axisMargin,\n right: padding + (isRadial ? padding : axisMargin),\n bottom: padding + chrome.bottomHeight + xAxisHeight,\n left: padding + (isRadial ? padding : axisMargin),\n };\n\n // Dynamic right margin for line/area end-of-line labels.\n // Only reserve space when labels will actually render (density != 'none').\n const labelDensity = spec.labels.density;\n if ((spec.type === 'line' || spec.type === 'area') && labelDensity !== 'none') {\n // Estimate label width from longest series name (color encoding domain)\n const colorField = encoding.color?.field;\n if (colorField) {\n let maxLabelWidth = 0;\n const seen = new Set<string>();\n for (const row of spec.data) {\n const label = String(row[colorField] ?? '');\n if (!seen.has(label)) {\n seen.add(label);\n const w = estimateTextWidth(label, 11, 600);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n }\n if (maxLabelWidth > 0) {\n margins.right = Math.max(margins.right, padding + maxLabelWidth + 16);\n }\n }\n }\n\n // Dynamic left margin for y-axis labels\n if (encoding.y && !isRadial) {\n if (\n spec.type === 'bar' ||\n spec.type === 'dot' ||\n encoding.y.type === 'nominal' ||\n encoding.y.type === 'ordinal'\n ) {\n // Category labels on the left for bar/dot charts\n const yField = encoding.y.field;\n let maxLabelWidth = 0;\n for (const row of spec.data) {\n const label = String(row[yField] ?? '');\n const w = estimateTextWidth(label, theme.fonts.sizes.axisTick, theme.fonts.weights.normal);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n if (maxLabelWidth > 0) {\n margins.left = Math.max(margins.left, padding + maxLabelWidth + 12);\n }\n } else if (encoding.y.type === 'quantitative' || encoding.y.type === 'temporal') {\n // Numeric tick labels on the left. Estimate width from the data range.\n const yField = encoding.y.field;\n let maxAbsVal = 0;\n for (const row of spec.data) {\n const v = Number(row[yField]);\n if (Number.isFinite(v) && Math.abs(v) > maxAbsVal) maxAbsVal = Math.abs(v);\n }\n // Estimate the formatted label: abbreviateNumber for >= 1000, formatNumber otherwise\n let sampleLabel: string;\n if (maxAbsVal >= 1_000_000_000) sampleLabel = '1.5B';\n else if (maxAbsVal >= 1_000_000) sampleLabel = '1.5M';\n else if (maxAbsVal >= 1_000) sampleLabel = '1.5K';\n else if (maxAbsVal >= 100) sampleLabel = '100';\n else if (maxAbsVal >= 10) sampleLabel = '10';\n else sampleLabel = '0.0';\n // Account for negative sign\n const negPrefix = spec.data.some((r) => Number(r[yField]) < 0) ? '-' : '';\n const labelEst = negPrefix + sampleLabel;\n const labelWidth = estimateTextWidth(\n labelEst,\n theme.fonts.sizes.axisTick,\n theme.fonts.weights.normal,\n );\n // 6px gap between label and chart area edge\n margins.left = Math.max(margins.left, padding + labelWidth + 10);\n }\n }\n\n // Rotated y-axis label needs extra left margin (rendered at area.x - 45 in SVG)\n if (encoding.y?.axis && (encoding.y.axis as Record<string, unknown>).label && !isRadial) {\n const rotatedLabelMargin = 45 + Math.ceil(theme.fonts.sizes.body / 2) + 4;\n margins.left = Math.max(margins.left, padding + rotatedLabelMargin);\n }\n\n // Reserve legend space\n if (legendLayout.entries.length > 0) {\n if (legendLayout.position === 'right' || legendLayout.position === 'bottom-right') {\n margins.right += legendLayout.bounds.width + 8;\n } else if (legendLayout.position === 'top') {\n margins.top += legendLayout.bounds.height + 4;\n } else if (legendLayout.position === 'bottom') {\n margins.bottom += legendLayout.bounds.height + 4;\n }\n }\n\n // Chart area is what's left after margins\n let chartArea: Rect = {\n x: margins.left,\n y: margins.top,\n width: Math.max(0, width - margins.left - margins.right),\n height: Math.max(0, height - margins.top - margins.bottom),\n };\n\n // Guardrail: if chart area is too small, progressively strip chrome\n if (\n (chartArea.width < MIN_CHART_WIDTH || chartArea.height < MIN_CHART_HEIGHT) &&\n chromeMode !== 'hidden'\n ) {\n // Try compact first, then hidden\n const fallbackMode = chromeMode === 'full' ? 'compact' : 'hidden';\n const fallbackChrome = computeChrome(\n chromeToInput(spec.chrome),\n theme,\n width,\n options.measureText,\n fallbackMode as 'compact' | 'hidden',\n padding,\n );\n\n // Recalculate top/bottom margins with stripped chrome\n const newTop = padding + fallbackChrome.topHeight + axisMargin;\n const topDelta = margins.top - newTop;\n const newBottom = padding + fallbackChrome.bottomHeight + xAxisHeight;\n const bottomDelta = margins.bottom - newBottom;\n\n if (topDelta > 0 || bottomDelta > 0) {\n margins.top =\n newTop +\n (legendLayout.entries.length > 0 && legendLayout.position === 'top'\n ? legendLayout.bounds.height + 4\n : 0);\n margins.bottom = newBottom;\n\n chartArea = {\n x: margins.left,\n y: margins.top,\n width: Math.max(0, width - margins.left - margins.right),\n height: Math.max(0, height - margins.top - margins.bottom),\n };\n\n return { total, chrome: fallbackChrome, chartArea, margins, theme };\n }\n }\n\n return { total, chrome, chartArea, margins, theme };\n}\n","/**\n * Gridline computation.\n *\n * Produces horizontal gridlines at y-axis tick positions and optional\n * vertical gridlines at x-axis tick positions.\n */\n\nimport type { Rect } from '@opendata-ai/openchart-core';\nimport type { AxesResult } from './axes';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single gridline with start/end positions. */\nexport interface GridlineSpec {\n /** Start x. */\n x1: number;\n /** Start y. */\n y1: number;\n /** End x. */\n x2: number;\n /** End y. */\n y2: number;\n /** Whether this is a major gridline. */\n major: boolean;\n}\n\n/** Complete gridline layout. */\nexport interface GridlineLayout {\n horizontal: GridlineSpec[];\n vertical: GridlineSpec[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute gridlines from axis layouts.\n *\n * Horizontal gridlines span the chart width at y-axis tick positions.\n * Vertical gridlines span the chart height at x-axis tick positions.\n *\n * @param axes - Computed axis layouts.\n * @param chartArea - The chart drawing area.\n * @param showVertical - Whether to include vertical gridlines (default: false).\n */\nexport function computeGridlines(\n axes: AxesResult,\n chartArea: Rect,\n showVertical = false,\n): GridlineLayout {\n const horizontal: GridlineSpec[] = [];\n const vertical: GridlineSpec[] = [];\n\n // Horizontal gridlines at y-axis ticks\n if (axes.y) {\n for (const gridline of axes.y.gridlines) {\n horizontal.push({\n x1: chartArea.x,\n y1: gridline.position,\n x2: chartArea.x + chartArea.width,\n y2: gridline.position,\n major: gridline.major,\n });\n }\n }\n\n // Vertical gridlines at x-axis ticks (off by default)\n if (showVertical && axes.x) {\n for (const gridline of axes.x.gridlines) {\n vertical.push({\n x1: gridline.position,\n y1: chartArea.y,\n x2: gridline.position,\n y2: chartArea.y + chartArea.height,\n major: gridline.major,\n });\n }\n }\n\n return { horizontal, vertical };\n}\n","/**\n * Scale computation from encoding spec + data.\n *\n * Creates D3 scales that map data values to pixel positions.\n * Temporal -> scaleTime(), quantitative -> scaleLinear(),\n * nominal/ordinal -> scaleBand() or scaleOrdinal(), depending on context.\n */\n\nimport type { DataRow, Encoding, EncodingChannel, Rect } from '@opendata-ai/openchart-core';\nimport { extent, max, min } from 'd3-array';\nimport type {\n ScaleBand,\n ScaleLinear,\n ScaleLogarithmic,\n ScaleOrdinal,\n ScalePoint,\n ScaleTime,\n} from 'd3-scale';\nimport { scaleBand, scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleTime } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Continuous D3 scales (linear, time, log) that support .ticks() and .nice(). */\nexport type D3ContinuousScale =\n | ScaleLinear<number, number>\n | ScaleTime<number, number>\n | ScaleLogarithmic<number, number>;\n\n/** Categorical D3 scales (band, point, ordinal) that support .domain() as string[]. */\nexport type D3CategoricalScale =\n | ScaleBand<string>\n | ScalePoint<string>\n | ScaleOrdinal<string, string>;\n\n/** Union of all D3 scale types used by the engine. */\nexport type D3Scale = D3ContinuousScale | D3CategoricalScale;\n\n/** A sequential color scale mapping numbers to color strings. */\nexport type D3SequentialColorScale = ScaleLinear<string, string>;\n\n/**\n * A resolved scale wrapping a d3 scale with type metadata.\n * We need to carry the scale type around so axes and marks know\n * how to interpret the domain/range. Consumers use the `type` discriminant\n * to determine which D3 methods are available on the scale.\n */\nexport interface ResolvedScale {\n /** The d3 scale function. Maps domain value -> pixel position or color. */\n scale: D3Scale;\n /** The scale type for downstream use. */\n type: 'linear' | 'time' | 'band' | 'ordinal' | 'point' | 'log' | 'sequential';\n /** The encoding channel this scale was derived from. */\n channel: EncodingChannel;\n}\n\n/** All resolved scales for a chart. */\nexport interface ResolvedScales {\n x?: ResolvedScale;\n y?: ResolvedScale;\n color?: ResolvedScale;\n size?: ResolvedScale;\n /** Default color for single-series charts (first categorical palette color). */\n defaultColor?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Extract all non-null values for a field from data. */\nfunction fieldValues(data: DataRow[], field: string): unknown[] {\n return data.map((d) => d[field]).filter((v) => v != null);\n}\n\n/** Parse values to dates. */\nfunction parseDates(values: unknown[]): Date[] {\n return values\n .map((v) => (v instanceof Date ? v : new Date(String(v))))\n .filter((d) => !Number.isNaN(d.getTime()));\n}\n\n/** Parse values to numbers. */\nfunction parseNumbers(values: unknown[]): number[] {\n return values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((n) => Number.isFinite(n));\n}\n\n/** Get unique string values preserving order. */\nfunction uniqueStrings(values: unknown[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const v of values) {\n const s = String(v);\n if (!seen.has(s)) {\n seen.add(s);\n result.push(s);\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Scale builders\n// ---------------------------------------------------------------------------\n\nfunction buildTimeScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseDates(fieldValues(data, channel.field));\n const domain = channel.scale?.domain\n ? [new Date(channel.scale.domain[0] as string), new Date(channel.scale.domain[1] as string)]\n : (extent(values) as [Date, Date]);\n\n const scale = scaleTime().domain(domain).range([rangeStart, rangeEnd]);\n\n if (channel.scale?.nice !== false) {\n scale.nice();\n }\n\n return { scale, type: 'time', channel };\n}\n\nfunction buildLinearScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field));\n\n let domainMin: number;\n let domainMax: number;\n\n if (channel.scale?.domain) {\n const [d0, d1] = channel.scale.domain as [number, number];\n domainMin = d0;\n domainMax = d1;\n } else {\n domainMin = min(values) ?? 0;\n domainMax = max(values) ?? 1;\n\n // Include zero by default for quantitative scales\n if (channel.scale?.zero !== false) {\n domainMin = Math.min(0, domainMin);\n domainMax = Math.max(0, domainMax);\n }\n }\n\n const scale = scaleLinear().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]);\n\n if (channel.scale?.nice !== false) {\n scale.nice();\n }\n\n return { scale, type: 'linear', channel };\n}\n\nfunction buildLogScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field)).filter((v) => v > 0);\n const domainMin = min(values) ?? 1;\n const domainMax = max(values) ?? 10;\n\n const scale = scaleLog().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]).nice();\n\n return { scale, type: 'log', channel };\n}\n\nfunction buildBandScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = channel.scale?.domain\n ? (channel.scale.domain as string[])\n : uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scaleBand().domain(values).range([rangeStart, rangeEnd]).padding(0.35);\n\n return { scale, type: 'band', channel };\n}\n\nfunction buildPointScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = channel.scale?.domain\n ? (channel.scale.domain as string[])\n : uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scalePoint().domain(values).range([rangeStart, rangeEnd]).padding(0.5);\n\n return { scale, type: 'point', channel };\n}\n\nfunction buildOrdinalColorScale(\n channel: EncodingChannel,\n data: DataRow[],\n palette: string[],\n): ResolvedScale {\n const values = uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scaleOrdinal<string>().domain(values).range(palette);\n\n return { scale, type: 'ordinal', channel };\n}\n\nfunction buildSequentialColorScale(\n channel: EncodingChannel,\n data: DataRow[],\n palette: string[],\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field));\n const domainMin = min(values) ?? 0;\n const domainMax = max(values) ?? 1;\n\n const scale = scaleLinear<string>()\n .domain([domainMin, domainMax])\n .range([palette[0], palette[palette.length - 1]])\n .clamp(true);\n\n // Cast: sequential color scale (number -> string) is structurally incompatible\n // with D3Scale (number -> number), but is only ever accessed via scales.color\n // where consumers already cast appropriately.\n return { scale: scale as unknown as D3Scale, type: 'sequential', channel };\n}\n\n// ---------------------------------------------------------------------------\n// Positional scale selection\n// ---------------------------------------------------------------------------\n\n/**\n * Choose the right scale type for a positional channel (x or y).\n * Respects explicit scale.type overrides from the spec.\n */\nfunction buildPositionalScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n chartType: string,\n axis: 'x' | 'y',\n): ResolvedScale {\n // Explicit scale type override\n if (channel.scale?.type) {\n switch (channel.scale.type) {\n case 'time':\n return buildTimeScale(channel, data, rangeStart, rangeEnd);\n case 'linear':\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n case 'log':\n return buildLogScale(channel, data, rangeStart, rangeEnd);\n case 'band':\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n case 'point':\n return buildPointScale(channel, data, rangeStart, rangeEnd);\n case 'ordinal':\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n }\n }\n\n // Infer from field type\n switch (channel.type) {\n case 'temporal':\n return buildTimeScale(channel, data, rangeStart, rangeEnd);\n case 'quantitative':\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n case 'nominal':\n case 'ordinal':\n // Bar/column charts use band scales for their categorical axis\n if (\n (chartType === 'bar' && axis === 'y') ||\n (chartType === 'column' && axis === 'x') ||\n (chartType === 'dot' && axis === 'y')\n ) {\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n }\n return buildPointScale(channel, data, rangeStart, rangeEnd);\n default:\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute D3 scales from encoding channels and data.\n *\n * @param spec - Normalized chart spec.\n * @param chartArea - The computed chart drawing area.\n * @param data - Data rows.\n * @returns ResolvedScales with d3 scale instances.\n */\nexport function computeScales(\n spec: NormalizedChartSpec,\n chartArea: Rect,\n data: DataRow[],\n): ResolvedScales {\n const result: ResolvedScales = {};\n const encoding = spec.encoding as Encoding;\n\n // Scatter/bubble charts should NOT include zero by default (tight domain fits data range)\n if (spec.type === 'scatter') {\n if (encoding.x?.type === 'quantitative' && encoding.x.scale?.zero === undefined) {\n if (!encoding.x.scale) {\n (encoding.x as { scale?: Record<string, unknown> }).scale = { zero: false };\n } else {\n (encoding.x.scale as Record<string, unknown>).zero = false;\n }\n }\n if (encoding.y?.type === 'quantitative' && encoding.y.scale?.zero === undefined) {\n if (!encoding.y.scale) {\n (encoding.y as { scale?: Record<string, unknown> }).scale = { zero: false };\n } else {\n (encoding.y.scale as Record<string, unknown>).zero = false;\n }\n }\n }\n\n if (encoding.x) {\n // For stacked bars, the x-domain needs the max category sum, not max individual value.\n // Without this, stacked bars would clip past the chart area.\n let xData = data;\n if (spec.type === 'bar' && encoding.color && encoding.x.type === 'quantitative') {\n const yField = encoding.y?.field;\n const xField = encoding.x.field;\n if (yField) {\n const sums = new Map<string, number>();\n for (const row of data) {\n const cat = String(row[yField] ?? '');\n const val = Number(row[xField] ?? 0);\n if (Number.isFinite(val) && val > 0) {\n sums.set(cat, (sums.get(cat) ?? 0) + val);\n }\n }\n const maxSum = Math.max(...sums.values(), 0);\n // Create a synthetic row with the max stack sum so buildLinearScale sees it\n xData = [...data, { [xField]: maxSum } as DataRow];\n }\n }\n\n result.x = buildPositionalScale(\n encoding.x,\n xData,\n chartArea.x,\n chartArea.x + chartArea.width,\n spec.type,\n 'x',\n );\n }\n\n if (encoding.y) {\n // For stacked columns and stacked areas, the y-domain needs the max category\n // sum, not the max individual value. Without this, stacked marks would clip\n // above the chart area.\n let yData = data;\n if (\n (spec.type === 'column' || spec.type === 'area') &&\n encoding.color &&\n encoding.y.type === 'quantitative'\n ) {\n const xField = encoding.x?.field;\n const yField = encoding.y.field;\n if (xField) {\n const sums = new Map<string, number>();\n for (const row of data) {\n const cat = String(row[xField] ?? '');\n const val = Number(row[yField] ?? 0);\n if (Number.isFinite(val) && val > 0) {\n sums.set(cat, (sums.get(cat) ?? 0) + val);\n }\n }\n const maxSum = Math.max(...sums.values(), 0);\n // Create a synthetic row with the max stack sum so buildLinearScale sees it\n yData = [...data, { [yField]: maxSum } as DataRow];\n }\n }\n\n // Y axis: range is inverted (SVG y goes down, data y goes up)\n result.y = buildPositionalScale(\n encoding.y,\n yData,\n chartArea.y + chartArea.height,\n chartArea.y,\n spec.type,\n 'y',\n );\n }\n\n if (encoding.color) {\n const defaultPalette = [\n '#1b7fa3',\n '#c44e52',\n '#6a9f58',\n '#d47215',\n '#507e79',\n '#9a6a8d',\n '#c4636b',\n '#9c755f',\n '#a88f22',\n '#858078',\n ];\n\n if (encoding.color.type === 'quantitative') {\n // Sequential color scale for value-based coloring\n result.color = buildSequentialColorScale(encoding.color, data, defaultPalette);\n } else {\n // Categorical color scale for nominal/ordinal grouping\n result.color = buildOrdinalColorScale(encoding.color, data, defaultPalette);\n }\n }\n\n return result;\n}\n","/**\n * Legend computation.\n *\n * Derives legend entries from the color encoding's unique values in data,\n * computes position based on layout strategy, and returns a LegendLayout\n * that dimensions.ts uses to reserve space in the chart area.\n *\n * The legend is computed early (before marks) so the chartArea accounts\n * for legend space. Entries come from data + encoding, not marks.\n *\n * Overflow protection: when there are too many entries for the available\n * space, entries are truncated and a \"+N more\" indicator is appended.\n */\n\nimport type {\n LayoutStrategy,\n LegendEntry,\n LegendLayout,\n Rect,\n ResolvedTheme,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SWATCH_SIZE = 12;\nconst SWATCH_GAP = 6;\nconst ENTRY_GAP = 16;\nconst LEGEND_PADDING = 8;\nconst LEGEND_RIGHT_WIDTH = 120;\n\n/** Max fraction of chart area height for right-positioned legends. */\nconst RIGHT_LEGEND_MAX_HEIGHT_RATIO = 0.4;\n\n/** Max number of rows for top-positioned legends before truncation. */\nconst TOP_LEGEND_MAX_ROWS = 2;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Determine the swatch shape based on chart type. */\nfunction swatchShapeForType(chartType: string): LegendEntry['shape'] {\n switch (chartType) {\n case 'line':\n return 'line';\n case 'scatter':\n case 'dot':\n return 'circle';\n default:\n return 'square';\n }\n}\n\n/** Extract unique color values from data based on the color encoding. */\nfunction extractColorEntries(spec: NormalizedChartSpec, theme: ResolvedTheme): LegendEntry[] {\n const colorEnc = spec.encoding.color;\n if (!colorEnc) return [];\n\n // Sequential (quantitative) color doesn't produce discrete legend entries\n if (colorEnc.type === 'quantitative') return [];\n\n const uniqueValues = [...new Set(spec.data.map((d) => String(d[colorEnc.field])))];\n const palette = theme.colors.categorical;\n const shape = swatchShapeForType(spec.type);\n\n return uniqueValues.map((value, i) => ({\n label: value,\n color: palette[i % palette.length],\n shape,\n active: true,\n }));\n}\n\n/**\n * Calculate how many entries fit within a given number of horizontal rows.\n */\nfunction entriesThatFit(\n entries: LegendEntry[],\n maxWidth: number,\n maxRows: number,\n labelStyle: TextStyle,\n): number {\n let row = 1;\n let rowWidth = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const labelWidth = estimateTextWidth(\n entries[i].label,\n labelStyle.fontSize,\n labelStyle.fontWeight,\n );\n const entryWidth = SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n\n if (rowWidth + entryWidth > maxWidth && rowWidth > 0) {\n row++;\n rowWidth = entryWidth;\n if (row > maxRows) return i;\n } else {\n rowWidth += entryWidth;\n }\n }\n\n return entries.length;\n}\n\n/**\n * Truncate entries and add a \"+N more\" indicator if needed.\n */\nfunction truncateEntries(entries: LegendEntry[], maxCount: number): LegendEntry[] {\n if (maxCount >= entries.length || maxCount <= 0) return entries;\n\n const truncated = entries.slice(0, maxCount);\n const remaining = entries.length - maxCount;\n truncated.push({\n label: `+${remaining} more`,\n color: '#999999',\n shape: 'square',\n active: false,\n overflow: true,\n });\n\n return truncated;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute legend layout for a chart spec.\n *\n * @param spec - Normalized chart spec.\n * @param strategy - Responsive layout strategy.\n * @param theme - Resolved theme.\n * @param chartArea - The available chart area (before legend space is reserved).\n * @returns LegendLayout with position, entries, and bounds.\n */\nexport function computeLegend(\n spec: NormalizedChartSpec,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n chartArea: Rect,\n): LegendLayout {\n // Legend explicitly hidden via show: false, or height strategy says no legend\n if (spec.legend?.show === false || strategy.legendMaxHeight === 0) {\n return {\n position: 'top',\n entries: [],\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle: {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n },\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n }\n\n let entries = extractColorEntries(spec, theme);\n\n const labelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n // Resolve position: spec-level override wins, then responsive strategy\n const resolvedPosition =\n spec.legend?.position ?? (strategy.legendPosition === 'right' ? 'right' : 'top');\n\n // No entries = empty legend with no space\n if (entries.length === 0) {\n return {\n position: resolvedPosition,\n entries: [],\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n }\n\n if (resolvedPosition === 'right' || resolvedPosition === 'bottom-right') {\n // Right-positioned legend: vertical stack\n const maxLabelWidth = Math.max(\n ...entries.map((e) => estimateTextWidth(e.label, labelStyle.fontSize, labelStyle.fontWeight)),\n );\n const legendWidth = Math.min(\n LEGEND_RIGHT_WIDTH,\n SWATCH_SIZE + SWATCH_GAP + maxLabelWidth + LEGEND_PADDING * 2,\n );\n const entryHeight = Math.max(SWATCH_SIZE, labelStyle.fontSize * labelStyle.lineHeight);\n\n // Apply max height ratio (default 40% of chart area, strategy can override)\n const maxHeightRatio =\n strategy.legendMaxHeight > 0 ? strategy.legendMaxHeight : RIGHT_LEGEND_MAX_HEIGHT_RATIO;\n const maxLegendHeight = chartArea.height * maxHeightRatio;\n\n // Calculate how many entries fit\n const maxEntries = Math.max(\n 1,\n Math.floor((maxLegendHeight - LEGEND_PADDING * 2) / (entryHeight + 4)),\n );\n if (entries.length > maxEntries) {\n entries = truncateEntries(entries, maxEntries);\n }\n\n const legendHeight =\n entries.length * entryHeight + (entries.length - 1) * 4 + LEGEND_PADDING * 2;\n const clampedHeight = Math.min(legendHeight, chartArea.height);\n\n // bottom-right anchors to the bottom of the chart area\n const legendY =\n resolvedPosition === 'bottom-right'\n ? chartArea.y + chartArea.height - clampedHeight\n : chartArea.y;\n\n // Apply user-provided legend offset\n const offsetDx = spec.legend?.offset?.dx ?? 0;\n const offsetDy = spec.legend?.offset?.dy ?? 0;\n\n return {\n position: resolvedPosition,\n entries,\n bounds: {\n x: chartArea.x + chartArea.width - legendWidth + offsetDx,\n y: legendY + offsetDy,\n width: legendWidth,\n height: clampedHeight,\n },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: 4,\n };\n }\n\n // Top/bottom-positioned legend: horizontal flow with overflow protection\n const availableWidth = chartArea.width - LEGEND_PADDING * 2;\n const maxFit = entriesThatFit(entries, availableWidth, TOP_LEGEND_MAX_ROWS, labelStyle);\n\n if (maxFit < entries.length) {\n entries = truncateEntries(entries, maxFit);\n }\n\n const totalWidth = entries.reduce((sum, entry) => {\n const labelWidth = estimateTextWidth(entry.label, labelStyle.fontSize, labelStyle.fontWeight);\n return sum + SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n }, 0);\n\n // Calculate actual row count for height\n let rowCount = 1;\n let rowWidth = 0;\n for (const entry of entries) {\n const labelWidth = estimateTextWidth(entry.label, labelStyle.fontSize, labelStyle.fontWeight);\n const entryWidth = SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n if (rowWidth + entryWidth > availableWidth && rowWidth > 0) {\n rowCount++;\n rowWidth = entryWidth;\n } else {\n rowWidth += entryWidth;\n }\n }\n\n const rowHeight = SWATCH_SIZE + 4;\n const legendHeight = rowCount * rowHeight + LEGEND_PADDING * 2;\n\n // Apply user-provided legend offset\n const offsetDx = spec.legend?.offset?.dx ?? 0;\n const offsetDy = spec.legend?.offset?.dy ?? 0;\n\n return {\n position: resolvedPosition,\n entries,\n bounds: {\n x: chartArea.x + offsetDx,\n y:\n (resolvedPosition === 'bottom'\n ? chartArea.y + chartArea.height - legendHeight\n : chartArea.y) + offsetDy,\n width: Math.min(totalWidth, chartArea.width),\n height: legendHeight,\n },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n}\n","/**\n * Table compilation pipeline.\n *\n * Takes a NormalizedTableSpec and produces a fully resolved TableLayout:\n * resolve columns -> build search index -> sort data -> filter by search ->\n * paginate -> format visible cells -> apply visual enhancements -> return\n */\n\nimport type {\n CellStyle,\n ColumnConfig,\n CompileTableOptions,\n PaginationState,\n ResolvedColumn,\n ResolvedTheme,\n TableCell,\n TableLayout,\n TableRow,\n} from '@opendata-ai/openchart-core';\nimport { computeChrome, estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedTableSpec } from '../compiler/types';\nimport { computeBarCell, computeColumnMax, computeColumnMin } from './bar-column';\nimport { computeCategoryColors } from './category-colors';\nimport { formatCell } from './format-cells';\nimport { computeHeatmapColors } from './heatmap';\nimport { paginateData } from './pagination';\nimport { buildSearchIndex, filterBySearch } from './search';\nimport { sortData } from './sort';\nimport { computeSparklineForRow, type SparklineData } from './sparkline';\n\n// ---------------------------------------------------------------------------\n// Column resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the cell type for a column based on its config.\n * Precedence: sparkline > bar > heatmap > image > flag > categoryColors > text\n */\nfunction determineCellType(col: ColumnConfig): ResolvedColumn['cellType'] {\n if (col.sparkline) return 'sparkline';\n if (col.bar) return 'bar';\n if (col.heatmap) return 'heatmap';\n if (col.image) return 'image';\n if (col.flag) return 'flag';\n if (col.categoryColors) return 'category';\n return 'text';\n}\n\n/**\n * Infer alignment for a column.\n * Explicit align wins. Otherwise: right for numeric data, left for everything else.\n */\nfunction inferAlignment(\n col: ColumnConfig,\n data: Record<string, unknown>[],\n): 'left' | 'center' | 'right' {\n if (col.align) return col.align;\n\n // Check first non-null value in the data\n for (const row of data) {\n const val = row[col.key];\n if (val != null) {\n return typeof val === 'number' ? 'right' : 'left';\n }\n }\n return 'left';\n}\n\n/**\n * Estimate the needed width for a column by measuring header and data values.\n * Samples up to 100 rows for estimation.\n */\nfunction estimateColumnWidth(\n col: ColumnConfig,\n data: Record<string, unknown>[],\n fontSize: number,\n): number {\n const MIN_WIDTH = 60;\n const PADDING = 24; // cell padding\n\n // Visual columns get fixed widths (they render graphics, not text)\n if (col.sparkline) return 140;\n if (col.image) return (col.image.width ?? 24) + PADDING;\n if (col.flag) return 60;\n\n // Header width\n const label = col.label ?? col.key;\n const headerWidth = estimateTextWidth(label, fontSize, 600) + PADDING;\n\n // Sample data values\n const sampleSize = Math.min(100, data.length);\n let maxDataWidth = 0;\n\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][col.key];\n const text = val == null ? '' : String(val);\n const width = estimateTextWidth(text, fontSize, 400) + PADDING;\n if (width > maxDataWidth) maxDataWidth = width;\n }\n\n return Math.max(MIN_WIDTH, headerWidth, maxDataWidth);\n}\n\n/**\n * Resolve all columns: compute widths, types, alignment.\n */\nfunction resolveColumns(\n columns: ColumnConfig[],\n data: Record<string, unknown>[],\n totalWidth: number,\n theme: ResolvedTheme,\n): ResolvedColumn[] {\n const fontSize = theme.fonts.sizes.body;\n\n // Compute natural widths and identify fixed-width visual columns.\n // Visual columns (sparkline, image, flag) get fixed sizes; only text\n // columns participate in proportional scaling to fill the container.\n const isFixed = columns.map((col) => !!(col.sparkline || col.image || col.flag));\n\n const naturalWidths = columns.map((col) => {\n if (col.width) {\n // Parse explicit width\n if (col.width.endsWith('px')) {\n return parseInt(col.width, 10) || 100;\n }\n if (col.width.endsWith('%')) {\n return (parseFloat(col.width) / 100) * totalWidth || 100;\n }\n return parseInt(col.width, 10) || 100;\n }\n return estimateColumnWidth(col, data, fontSize);\n });\n\n // Fixed columns keep their natural width; remaining space goes to text columns\n const fixedTotal = naturalWidths.reduce((sum, w, i) => sum + (isFixed[i] ? w : 0), 0);\n const flexTotal = naturalWidths.reduce((sum, w, i) => sum + (isFixed[i] ? 0 : w), 0);\n const remainingWidth = totalWidth - fixedTotal;\n const flexScale = flexTotal > 0 && remainingWidth > 0 ? remainingWidth / flexTotal : 1;\n\n return columns.map((col, i) => ({\n key: col.key,\n label: col.label ?? col.key,\n width: Math.max(60, isFixed[i] ? naturalWidths[i] : Math.round(naturalWidths[i] * flexScale)),\n sortable: col.sortable ?? true,\n align: inferAlignment(col, data),\n cellType: determineCellType(col),\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Cell building\n// ---------------------------------------------------------------------------\n\n/**\n * Build a fully resolved TableCell from a data value and column config.\n */\nfunction buildCell(\n value: unknown,\n column: ColumnConfig,\n resolvedColumn: ResolvedColumn,\n heatmapStyle: CellStyle | undefined,\n categoryStyle: CellStyle | undefined,\n barData:\n | { barPercent: number; barOffset: number; barColor: string; isNegative: boolean }\n | undefined,\n sparklineData: SparklineData | null,\n): TableCell {\n const base = formatCell(value, column);\n\n // Apply font variant for number columns\n if (typeof value === 'number') {\n base.style = { ...base.style, fontVariant: 'tabular-nums' };\n }\n\n const cellType = resolvedColumn.cellType;\n\n switch (cellType) {\n case 'heatmap': {\n const merged = heatmapStyle ? { ...base.style, ...heatmapStyle } : base.style;\n return {\n ...base,\n cellType: 'heatmap',\n style: merged,\n };\n }\n case 'category': {\n const merged = categoryStyle ? { ...base.style, ...categoryStyle } : base.style;\n return {\n ...base,\n cellType: 'category',\n style: merged,\n };\n }\n case 'bar': {\n return {\n ...base,\n cellType: 'bar',\n barWidth: barData?.barPercent ?? 0,\n barOffset: barData?.barOffset ?? 0,\n barColor: barData?.barColor ?? '#ccc',\n isNegative: barData?.isNegative ?? false,\n };\n }\n case 'sparkline': {\n return {\n ...base,\n cellType: 'sparkline',\n sparklineData,\n };\n }\n case 'image': {\n const src = typeof value === 'string' ? value : '';\n const imgConfig = column.image ?? {};\n return {\n ...base,\n cellType: 'image',\n src,\n imageWidth: imgConfig.width ?? 24,\n imageHeight: imgConfig.height ?? 24,\n rounded: imgConfig.rounded ?? false,\n };\n }\n case 'flag': {\n const code = typeof value === 'string' ? value : '';\n return {\n ...base,\n cellType: 'flag',\n countryCode: code,\n };\n }\n default: {\n return {\n ...base,\n cellType: 'text',\n };\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main pipeline\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a normalized table spec into a TableLayout.\n *\n * Pipeline:\n * 1. Resolve columns (widths, types, alignment)\n * 2. Build search index\n * 3. Sort data\n * 4. Filter by search\n * 5. Paginate\n * 6. Format visible cells and apply visual enhancements\n * 7. Return TableLayout\n */\nexport function compileTableLayout(\n spec: NormalizedTableSpec,\n options: CompileTableOptions,\n theme: ResolvedTheme,\n): TableLayout {\n const data = spec.data;\n const darkMode = theme.isDark;\n\n // 1. Resolve columns\n const resolvedColumns = resolveColumns(spec.columns, data, options.width, theme);\n\n // 2. Build search index (over full dataset, using original indices)\n const searchIndex = spec.search\n ? buildSearchIndex(data, spec.columns)\n : new Map<number, string>();\n\n // 3. Track original indices through the pipeline\n let currentData = data;\n let originalIndices = data.map((_, i) => i);\n\n // 4. Sort\n if (options.sort) {\n const sorted = sortData(currentData, options.sort);\n // Map sorted originalIndices back through our current index mapping\n originalIndices = sorted.originalIndices.map((i) => originalIndices[i]);\n currentData = sorted.data;\n }\n\n // 5. Filter by search\n if (spec.search && options.search) {\n const filtered = filterBySearch(currentData, options.search, searchIndex, originalIndices);\n currentData = filtered.data;\n originalIndices = filtered.indices;\n }\n\n const totalFiltered = currentData.length;\n\n // 6. Paginate\n let pageSize = 0;\n let currentPage = 0;\n let paginationState: PaginationState | undefined;\n\n if (spec.pagination) {\n pageSize =\n options.pageSize ?? (typeof spec.pagination === 'object' ? spec.pagination.pageSize : 25);\n currentPage = options.page ?? 0;\n const paginated = paginateData(currentData, currentPage, pageSize);\n\n // Slice indices too\n const start = paginated.page * pageSize;\n const end = start + paginated.rows.length;\n const pageIndices = originalIndices.slice(start, end);\n\n currentData = paginated.rows;\n originalIndices = pageIndices;\n\n paginationState = {\n page: paginated.page,\n pageSize,\n totalRows: paginated.totalRows,\n totalPages: paginated.totalPages,\n };\n }\n\n // 7. Pre-compute visual enhancements for visible data columns\n // We need heatmap/category colors computed over the FULL dataset, then\n // applied only to visible rows.\n const heatmapMaps = new Map<string, Map<number, CellStyle>>();\n const categoryMaps = new Map<string, Map<number, CellStyle>>();\n const barMaxes = new Map<string, number>();\n const barMins = new Map<string, number>();\n\n for (let c = 0; c < spec.columns.length; c++) {\n const col = spec.columns[c];\n const resolved = resolvedColumns[c];\n\n if (resolved.cellType === 'heatmap' && col.heatmap) {\n heatmapMaps.set(col.key, computeHeatmapColors(data, col, theme, darkMode));\n }\n if (resolved.cellType === 'category' && col.categoryColors) {\n categoryMaps.set(col.key, computeCategoryColors(data, col, theme, darkMode));\n }\n if (resolved.cellType === 'bar' && col.bar) {\n barMaxes.set(col.key, computeColumnMax(data, col.key));\n barMins.set(col.key, computeColumnMin(data, col.key));\n }\n }\n\n // 8. Build rows from visible data\n const rows: TableRow[] = currentData.map((row, i) => {\n const origIdx = originalIndices[i];\n const rowId = spec.rowKey ? String(row[spec.rowKey] ?? origIdx) : String(origIdx);\n\n const cells: TableCell[] = spec.columns.map((col, c) => {\n const resolved = resolvedColumns[c];\n const value = row[col.key];\n\n // Lookup visual enhancement data\n const heatmapStyle = heatmapMaps.get(col.key)?.get(origIdx);\n const categoryStyle = categoryMaps.get(col.key)?.get(origIdx);\n\n let barData:\n | { barPercent: number; barOffset: number; barColor: string; isNegative: boolean }\n | undefined;\n if (resolved.cellType === 'bar' && col.bar && typeof value === 'number') {\n barData = computeBarCell(\n value,\n col.bar,\n barMaxes.get(col.key) ?? 0,\n barMins.get(col.key) ?? 0,\n theme,\n darkMode,\n );\n }\n\n let sparklineData: SparklineData | null = null;\n if (resolved.cellType === 'sparkline' && col.sparkline) {\n sparklineData = computeSparklineForRow(row, col.key, col.sparkline, theme, darkMode);\n }\n\n return buildCell(value, col, resolved, heatmapStyle, categoryStyle, barData, sparklineData);\n });\n\n return { id: rowId, cells, data: row };\n });\n\n // 9. Compute chrome\n const chrome = computeChrome(\n {\n title: spec.chrome.title,\n subtitle: spec.chrome.subtitle,\n source: spec.chrome.source,\n byline: spec.chrome.byline,\n footer: spec.chrome.footer,\n },\n theme,\n options.width,\n options.measureText,\n );\n\n // 10. Build a11y\n const titleText = spec.chrome.title?.text ?? '';\n const caption = titleText ? `Table: ${titleText}` : `Data table with ${data.length} rows`;\n\n return {\n chrome,\n columns: resolvedColumns,\n rows,\n sort: options.sort,\n pagination: paginationState,\n search: {\n enabled: spec.search,\n placeholder: 'Search...',\n query: options.search ?? '',\n },\n stickyFirstColumn: spec.stickyFirstColumn,\n compact: spec.compact,\n a11y: {\n caption,\n summary: `${resolvedColumns.length} columns, ${totalFiltered} rows`,\n },\n theme,\n };\n}\n","/**\n * Bar column computation for inline bar visualization in table cells.\n *\n * Computes bar width as a proportion of the max value.\n * Supports negative values with bidirectional bars.\n */\n\nimport type { BarColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\n\nconst NEGATIVE_BAR_COLOR = '#c44e52';\n\n/**\n * Compute the bar percentage, offset, and color for a single cell value.\n *\n * barPercent is 0-1. barOffset is 0-1 (left edge position).\n * When the column has negative values, bars extend bidirectionally from a zero line.\n */\nexport function computeBarCell(\n value: number,\n config: BarColumnConfig,\n columnMax: number,\n columnMin: number,\n theme: ResolvedTheme,\n _darkMode: boolean,\n): { barPercent: number; barOffset: number; barColor: string; isNegative: boolean } {\n const barColor = config.color ?? theme.colors.categorical[0];\n const hasNegatives = columnMin < 0;\n\n if (!Number.isFinite(value)) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n\n if (!hasNegatives) {\n // Positive-only column: simple left-to-right bars\n const maxValue = config.maxValue ?? columnMax;\n if (maxValue <= 0) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n const barPercent = Math.max(0, Math.min(1, value / maxValue));\n return { barPercent, barOffset: 0, barColor, isNegative: false };\n }\n\n // Bidirectional: zero line position proportional to data range\n const maxPos = config.maxValue ?? columnMax;\n const absMin = Math.abs(columnMin);\n const totalRange = maxPos + absMin;\n if (totalRange === 0) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n\n const zeroPos = absMin / totalRange;\n\n if (value >= 0) {\n const barPercent = value / totalRange;\n return { barPercent, barOffset: zeroPos, barColor, isNegative: false };\n }\n\n // Negative value: red bar extending left from zero\n const barPercent = Math.abs(value) / totalRange;\n return {\n barPercent,\n barOffset: zeroPos - barPercent,\n barColor: config.color ?? NEGATIVE_BAR_COLOR,\n isNegative: true,\n };\n}\n\n/**\n * Compute the column max and min from data for bar scaling.\n */\nexport function computeColumnMax(data: Record<string, unknown>[], key: string): number {\n let max = 0;\n for (const row of data) {\n const val = row[key];\n if (typeof val === 'number' && Number.isFinite(val) && val > max) {\n max = val;\n }\n }\n return max;\n}\n\n/**\n * Compute the column minimum from data (for negative bar support).\n */\nexport function computeColumnMin(data: Record<string, unknown>[], key: string): number {\n let min = 0;\n for (const row of data) {\n const val = row[key];\n if (typeof val === 'number' && Number.isFinite(val) && val < min) {\n min = val;\n }\n }\n return min;\n}\n","/**\n * Category color assignment for table columns.\n *\n * Maps categorical values to colors using explicit mappings or\n * theme categorical palette, with AA-contrast text colors.\n */\n\nimport type { CellStyle, ColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { adaptColorForDarkMode } from '@opendata-ai/openchart-core';\nimport { accessibleTextColor } from './utils';\n\n/**\n * Compute category-colored cell styles for a column.\n *\n * Uses column.categoryColors for explicit value-to-color mappings.\n * Unmapped values get colors from the theme's categorical palette.\n *\n * Returns a Map keyed by original data index with background and text colors.\n */\nexport function computeCategoryColors(\n data: Record<string, unknown>[],\n column: ColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): Map<number, CellStyle> {\n const result = new Map<number, CellStyle>();\n const explicitMap = column.categoryColors;\n if (!explicitMap) return result;\n\n const categoricalPalette = theme.colors.categorical;\n let nextPaletteIndex = 0;\n const autoAssigned = new Map<string, string>();\n const lightBg = '#ffffff';\n const darkBg = theme.colors.background;\n\n for (let i = 0; i < data.length; i++) {\n const raw = data[i][column.key];\n if (raw == null) continue;\n\n const key = String(raw);\n let bg: string;\n\n if (explicitMap[key]) {\n bg = explicitMap[key];\n } else if (autoAssigned.has(key)) {\n bg = autoAssigned.get(key)!;\n } else {\n // Assign from categorical palette\n bg = categoricalPalette[nextPaletteIndex % categoricalPalette.length];\n nextPaletteIndex++;\n autoAssigned.set(key, bg);\n }\n\n // Dark mode adaptation\n if (darkMode) {\n bg = adaptColorForDarkMode(bg, lightBg, darkBg);\n }\n\n const textColor = accessibleTextColor(bg);\n result.set(i, {\n backgroundColor: bg,\n color: textColor,\n });\n }\n\n return result;\n}\n","/**\n * Shared utilities for table column computations.\n */\n\nimport { contrastRatio } from '@opendata-ai/openchart-core';\n\n/**\n * Pick a text color (black or white) that meets better contrast against the background.\n */\nexport function accessibleTextColor(bg: string): string {\n const white = '#ffffff';\n const black = '#000000';\n const whiteRatio = contrastRatio(white, bg);\n const blackRatio = contrastRatio(black, bg);\n return whiteRatio >= blackRatio ? white : black;\n}\n","/**\n * Cell value formatting for table columns.\n *\n * Handles number formatting (d3-format), date formatting, and\n * null/undefined values. Produces the formattedValue string and\n * base style for each cell.\n */\n\nimport type { CellStyle, ColumnConfig, TableCellBase } from '@opendata-ai/openchart-core';\nimport { formatDate, formatNumber } from '@opendata-ai/openchart-core';\nimport { format as d3Format } from 'd3-format';\n\n/**\n * Check if a value is numeric (finite number or parseable numeric string).\n */\nfunction isNumericValue(value: unknown): value is number {\n if (typeof value === 'number') return Number.isFinite(value);\n return false;\n}\n\n/**\n * Check if a value is a date.\n */\nfunction isDateValue(value: unknown): boolean {\n if (value instanceof Date) return !Number.isNaN(value.getTime());\n return false;\n}\n\n/**\n * Format a raw cell value into a display string with styling.\n *\n * Formatting precedence:\n * 1. null/undefined -> \"\"\n * 2. column.format (d3-format string) for numbers\n * 3. Auto-format: numbers via formatNumber, dates via formatDate\n * 4. Fallback: String(value)\n */\nexport function formatCell(value: unknown, column: ColumnConfig): TableCellBase {\n const style: CellStyle = {};\n\n // Null/undefined -> empty\n if (value == null) {\n return {\n value,\n formattedValue: '',\n style,\n };\n }\n\n // If column has a d3-format string and value is numeric\n if (column.format && isNumericValue(value)) {\n try {\n const formatter = d3Format(column.format);\n return {\n value,\n formattedValue: formatter(value),\n style,\n };\n } catch {\n // Fall through to auto-format if format string is invalid\n }\n }\n\n // Auto-format numbers\n if (isNumericValue(value)) {\n return {\n value,\n formattedValue: formatNumber(value),\n style,\n };\n }\n\n // Auto-format dates\n if (isDateValue(value)) {\n return {\n value,\n formattedValue: formatDate(value as Date),\n style,\n };\n }\n\n // String and everything else\n return {\n value,\n formattedValue: String(value),\n style,\n };\n}\n\n/**\n * Format a value into a string for search indexing.\n * Uses d3-format for numeric columns, otherwise String().\n */\nexport function formatValueForSearch(value: unknown, column: ColumnConfig): string {\n if (value == null) return '';\n\n if (column.format && isNumericValue(value)) {\n try {\n return d3Format(column.format)(value);\n } catch {\n // Fall through\n }\n }\n\n if (isNumericValue(value)) {\n return formatNumber(value);\n }\n\n return String(value);\n}\n","/**\n * Heatmap coloring for table columns.\n *\n * Colors cell backgrounds using sequential or diverging color scales,\n * then picks an accessible text color for each background.\n */\n\nimport type { CellStyle, ColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { adaptColorForDarkMode } from '@opendata-ai/openchart-core';\nimport { interpolateRgb } from 'd3-interpolate';\nimport { scaleSequential } from 'd3-scale';\nimport { accessibleTextColor } from './utils';\n\n/**\n * Build an interpolator from an array of color stops.\n * Uses d3-interpolate for smooth color transitions.\n */\nfunction interpolatorFromStops(stops: string[]): (t: number) => string {\n if (stops.length === 0) return () => '#ffffff';\n if (stops.length === 1) return () => stops[0];\n\n return (t: number) => {\n const clamped = Math.max(0, Math.min(1, t));\n const segment = clamped * (stops.length - 1);\n const lo = Math.floor(segment);\n const hi = Math.min(lo + 1, stops.length - 1);\n const frac = segment - lo;\n return interpolateRgb(stops[lo], stops[hi])(frac);\n };\n}\n\n/**\n * Resolve palette from column config or theme.\n *\n * - If palette is an array of color stops, use directly\n * - If palette is a string name, look it up in theme sequential then diverging\n * - If no palette specified, use the first sequential palette from the theme\n */\nfunction resolvePalette(palette: string | string[] | undefined, theme: ResolvedTheme): string[] {\n if (Array.isArray(palette)) return palette;\n\n const seqPalettes = theme.colors.sequential;\n const divPalettes = theme.colors.diverging;\n\n if (typeof palette === 'string') {\n if (seqPalettes[palette]) return seqPalettes[palette];\n if (divPalettes[palette]) return divPalettes[palette];\n }\n\n // Default: first sequential palette\n const firstSeqKey = Object.keys(seqPalettes)[0];\n return firstSeqKey ? seqPalettes[firstSeqKey] : ['#deebf7', '#08519c'];\n}\n\n/**\n * Compute heatmap cell styles for a column.\n *\n * Returns a Map keyed by original data index with background and text colors.\n */\nexport function computeHeatmapColors(\n data: Record<string, unknown>[],\n column: ColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): Map<number, CellStyle> {\n const result = new Map<number, CellStyle>();\n const config = column.heatmap;\n if (!config) return result;\n\n // Determine which field provides the color values\n const colorField = config.colorByField ?? column.key;\n\n // Extract numeric values and compute domain\n const numericValues: { index: number; value: number }[] = [];\n for (let i = 0; i < data.length; i++) {\n const raw = data[i][colorField];\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n numericValues.push({ index: i, value: raw });\n }\n }\n\n if (numericValues.length === 0) return result;\n\n // Domain: from config or data min/max\n let domain: [number, number];\n if (config.domain) {\n domain = config.domain;\n } else {\n let min = Infinity;\n let max = -Infinity;\n for (const { value } of numericValues) {\n if (value < min) min = value;\n if (value > max) max = value;\n }\n domain = [min, max];\n }\n\n // Resolve palette and build scale\n let stops = resolvePalette(config.palette, theme);\n if (darkMode) {\n const lightBg = '#ffffff';\n const darkBg = theme.colors.background;\n stops = stops.map((c) => adaptColorForDarkMode(c, lightBg, darkBg));\n }\n\n const interpolator = interpolatorFromStops(stops);\n const scale = scaleSequential(interpolator).domain(domain).clamp(true);\n\n // Apply to each row\n for (const { index, value } of numericValues) {\n const bg = scale(value);\n const textColor = accessibleTextColor(bg);\n\n result.set(index, {\n backgroundColor: bg,\n color: textColor,\n });\n }\n\n return result;\n}\n","/**\n * Table pagination: slice data into pages.\n */\n\n/**\n * Paginate data rows.\n *\n * Returns the current page's rows along with pagination metadata.\n * Page is 0-indexed and clamped to valid range.\n * If pageSize is 0 or negative, pagination is disabled (returns all rows).\n */\nexport function paginateData(\n data: Record<string, unknown>[],\n page: number,\n pageSize: number,\n): {\n rows: Record<string, unknown>[];\n totalRows: number;\n totalPages: number;\n page: number;\n} {\n const totalRows = data.length;\n\n // Disabled pagination\n if (pageSize <= 0) {\n return {\n rows: data,\n totalRows,\n totalPages: 1,\n page: 0,\n };\n }\n\n const totalPages = Math.max(1, Math.ceil(totalRows / pageSize));\n // Clamp page to valid range\n const clampedPage = Math.max(0, Math.min(page, totalPages - 1));\n const start = clampedPage * pageSize;\n const end = Math.min(start + pageSize, totalRows);\n\n return {\n rows: data.slice(start, end),\n totalRows,\n totalPages,\n page: clampedPage,\n };\n}\n","/**\n * Table search: build a search index and filter rows by query.\n *\n * The search index concatenates formatted cell values per row so\n * substring matching works across all columns.\n */\n\nimport type { ColumnConfig } from '@opendata-ai/openchart-core';\nimport { formatValueForSearch } from './format-cells';\n\n/**\n * Build a search index mapping original data indices to searchable strings.\n * Each row's searchable string is the concatenation of all column values,\n * separated by spaces, lowercased.\n */\nexport function buildSearchIndex(\n data: Record<string, unknown>[],\n columns: ColumnConfig[],\n): Map<number, string> {\n const index = new Map<number, string>();\n\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const parts: string[] = [];\n\n for (const col of columns) {\n parts.push(formatValueForSearch(row[col.key], col));\n }\n\n index.set(i, parts.join(' ').toLowerCase());\n }\n\n return index;\n}\n\n/**\n * Filter data by a search query using the pre-built search index.\n *\n * Returns the filtered data and the original indices of matching rows.\n * Empty query returns all data.\n */\nexport function filterBySearch(\n data: Record<string, unknown>[],\n query: string,\n searchIndex: Map<number, string>,\n originalIndices: number[],\n): { data: Record<string, unknown>[]; indices: number[] } {\n if (!query || query.trim() === '') {\n return { data, indices: originalIndices };\n }\n\n const lowerQuery = query.toLowerCase();\n const filteredData: Record<string, unknown>[] = [];\n const filteredIndices: number[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const originalIdx = originalIndices[i];\n const searchText = searchIndex.get(originalIdx);\n if (searchText?.includes(lowerQuery)) {\n filteredData.push(data[i]);\n filteredIndices.push(originalIdx);\n }\n }\n\n return { data: filteredData, indices: filteredIndices };\n}\n","/**\n * Stable sort for table data.\n *\n * Sorts data by a column key with type-aware comparison:\n * - Numbers: numeric comparison\n * - Strings: localeCompare\n * - Dates: timestamp comparison\n * - Nulls: always sorted last regardless of direction\n */\n\nimport type { SortState } from '@opendata-ai/openchart-core';\n\n/** Result of sorting: sorted data rows with their original indices preserved. */\nexport interface SortResult {\n data: Record<string, unknown>[];\n originalIndices: number[];\n}\n\n/**\n * Sort data rows by the specified column.\n * Returns a new array (no mutation). Stable sort preserves\n * original order for rows with equal values.\n *\n * Also returns the original indices so callers can track\n * which row came from where (needed for heatmap/category color lookups).\n */\nexport function sortData(data: Record<string, unknown>[], sort: SortState): SortResult {\n const { column, direction } = sort;\n const multiplier = direction === 'asc' ? 1 : -1;\n\n // Create index-value pairs for stable sort\n const indexed = data.map((row, i) => ({ row, index: i }));\n\n indexed.sort((a, b) => {\n const aVal = a.row[column];\n const bVal = b.row[column];\n\n // Nulls always last\n const aNull = aVal == null;\n const bNull = bVal == null;\n if (aNull && bNull) return a.index - b.index; // preserve order\n if (aNull) return 1;\n if (bNull) return -1;\n\n let cmp = 0;\n\n // Number comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal;\n }\n // Date comparison\n else if (aVal instanceof Date && bVal instanceof Date) {\n cmp = aVal.getTime() - bVal.getTime();\n }\n // String comparison (or mixed types)\n else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n // Stable sort: fall back to original index for equal values\n if (cmp === 0) return a.index - b.index;\n return cmp * multiplier;\n });\n\n return {\n data: indexed.map((item) => item.row),\n originalIndices: indexed.map((item) => item.index),\n };\n}\n","/**\n * Sparkline computation for inline mini-charts in table cells.\n *\n * Produces normalized data points (0-1 range) for sparkline rendering.\n * The adapter handles the actual drawing.\n */\n\nimport type {\n ResolvedTheme,\n SparklineColumnConfig,\n SparklineData,\n} from '@opendata-ai/openchart-core';\n\nexport type { SparklineData };\n\n/**\n * Extract numeric values from a row for sparkline rendering.\n *\n * If valuesField is specified, reads an array from that field.\n * Otherwise uses the column's own key (expects an array value).\n */\nfunction extractValues(\n row: Record<string, unknown>,\n columnKey: string,\n config: SparklineColumnConfig,\n): number[] {\n const field = config.valuesField ?? columnKey;\n const raw = row[field];\n\n if (!Array.isArray(raw)) return [];\n\n return raw\n .map((v) => (typeof v === 'number' && Number.isFinite(v) ? v : null))\n .filter((v): v is number => v !== null);\n}\n\n/**\n * Compute sparkline data for a single row.\n *\n * Normalizes values to 0-1 range. Returns null if no valid values.\n */\nexport function computeSparkline(\n values: number[],\n config: SparklineColumnConfig,\n theme: ResolvedTheme,\n _darkMode: boolean,\n): SparklineData | null {\n if (values.length === 0) return null;\n\n const type = config.type ?? 'line';\n const color = config.color ?? theme.colors.categorical[0];\n\n let min = Infinity;\n let max = -Infinity;\n for (const v of values) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n\n const range = max - min;\n const normalize = (v: number): number => (range === 0 ? 0.5 : (v - min) / range);\n\n const startValue = values[0];\n const endValue = values[values.length - 1];\n\n if (type === 'line') {\n const points = values.map((v, i) => ({\n x: values.length === 1 ? 0.5 : i / (values.length - 1),\n y: normalize(v),\n }));\n\n return {\n type,\n points,\n bars: [],\n color,\n count: values.length,\n startValue,\n endValue,\n };\n }\n\n // Bar (horizontal) or column (vertical): normalized as proportions\n const bars = values.map(normalize);\n const points = values.map((v, i) => ({\n x: values.length === 1 ? 0.5 : i / (values.length - 1),\n y: normalize(v),\n }));\n\n return {\n type,\n points,\n bars,\n color,\n count: values.length,\n startValue,\n endValue,\n };\n}\n\n/**\n * Extract values and compute sparkline data for a cell.\n */\nexport function computeSparklineForRow(\n row: Record<string, unknown>,\n columnKey: string,\n config: SparklineColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): SparklineData | null {\n const values = extractValues(row, columnKey, config);\n return computeSparkline(values, config, theme, darkMode);\n}\n","/**\n * Tooltip descriptor computation.\n *\n * Generates a Map of mark-id -> TooltipContent from the spec encoding and marks.\n * Each mark gets a tooltip that shows relevant field values formatted for display.\n * The mark-id keys match the data-mark-id attributes set by the SVG renderer.\n */\n\nimport type {\n ArcMark,\n AreaMark,\n DataRow,\n Encoding,\n LineMark,\n Mark,\n PointMark,\n RectMark,\n TooltipContent,\n TooltipField,\n} from '@opendata-ai/openchart-core';\nimport { formatDate, formatNumber } from '@opendata-ai/openchart-core';\nimport { format as d3Format } from 'd3-format';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Format a raw data value for tooltip display. */\nfunction formatValue(value: unknown, fieldType?: string, format?: string): string {\n if (value == null) return '';\n\n if (fieldType === 'temporal' || value instanceof Date) {\n return formatDate(value as Date | string | number);\n }\n\n if (typeof value === 'number') {\n if (format) {\n try {\n return d3Format(format)(value);\n } catch {\n return formatNumber(value);\n }\n }\n return formatNumber(value);\n }\n\n return String(value);\n}\n\n/** Build tooltip fields from a data row based on the spec encoding. */\nfunction buildFields(row: DataRow, encoding: Encoding, color?: string): TooltipField[] {\n const fields: TooltipField[] = [];\n\n // Y-axis value (the \"main\" value in most charts)\n if (encoding.y) {\n fields.push({\n label: encoding.y.axis?.label ?? encoding.y.field,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color,\n });\n }\n\n // X-axis value (often the category or date)\n if (encoding.x) {\n fields.push({\n label: encoding.x.axis?.label ?? encoding.x.field,\n value: formatValue(row[encoding.x.field], encoding.x.type, encoding.x.axis?.format),\n });\n }\n\n // Size (for scatter/bubble)\n if (encoding.size) {\n fields.push({\n label: encoding.size.axis?.label ?? encoding.size.field,\n value: formatValue(row[encoding.size.field], encoding.size.type, encoding.size.axis?.format),\n });\n }\n\n return fields;\n}\n\n/** Determine the title for a tooltip based on encoding. */\nfunction getTooltipTitle(row: DataRow, encoding: Encoding): string | undefined {\n // For charts with a temporal x-axis, use the date as the title\n if (encoding.x?.type === 'temporal') {\n return formatValue(row[encoding.x.field], 'temporal');\n }\n\n // For nominal x, use the category\n if (encoding.x?.type === 'nominal' || encoding.x?.type === 'ordinal') {\n return String(row[encoding.x.field] ?? '');\n }\n\n // For nominal y (e.g. horizontal bar charts), use the category\n if (encoding.y?.type === 'nominal' || encoding.y?.type === 'ordinal') {\n return String(row[encoding.y.field] ?? '');\n }\n\n // For color-encoded series, use the series name\n if (encoding.color) {\n return String(row[encoding.color.field] ?? '');\n }\n\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Per-mark-type tooltip generation\n// ---------------------------------------------------------------------------\n\nfunction tooltipsForLine(\n _mark: LineMark,\n _encoding: Encoding,\n _markIndex: number,\n): Array<[string, TooltipContent]> {\n // Line marks themselves don't get individual tooltips.\n // The point marks at each data point handle that.\n return [];\n}\n\nfunction tooltipsForPoint(\n mark: PointMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const title = getTooltipTitle(mark.data, encoding);\n const fields = buildFields(mark.data, encoding, mark.fill);\n\n return [[`point-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForRect(\n mark: RectMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const title = getTooltipTitle(mark.data, encoding);\n const fields = buildFields(mark.data, encoding, mark.fill);\n\n return [[`rect-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForArc(\n mark: ArcMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const row = mark.data;\n const fields: TooltipField[] = [];\n\n // For pie/donut, show the category and its value\n if (encoding.color) {\n const categoryName = String(row[encoding.color.field] ?? '');\n if (encoding.y) {\n fields.push({\n label: categoryName,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color: mark.fill,\n });\n }\n } else if (encoding.y) {\n fields.push({\n label: encoding.y.field,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color: mark.fill,\n });\n }\n\n const title = encoding.color ? String(row[encoding.color.field] ?? '') : undefined;\n\n return [[`arc-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForArea(\n _mark: AreaMark,\n _encoding: Encoding,\n _markIndex: number,\n): Array<[string, TooltipContent]> {\n // Area marks are background fills; point marks on top handle tooltips.\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute tooltip descriptors for all marks in the layout.\n *\n * Returns a Map keyed by data-mark-id (matching the SVG attribute)\n * to TooltipContent objects. The vanilla adapter uses this to show\n * tooltips on hover/tap/keyboard focus.\n */\nexport function computeTooltipDescriptors(\n spec: NormalizedChartSpec,\n marks: Mark[],\n): Map<string, TooltipContent> {\n const encoding = spec.encoding as Encoding;\n const descriptors = new Map<string, TooltipContent>();\n\n for (let i = 0; i < marks.length; i++) {\n const mark = marks[i];\n let entries: Array<[string, TooltipContent]> = [];\n\n switch (mark.type) {\n case 'line':\n entries = tooltipsForLine(mark, encoding, i);\n break;\n case 'area':\n entries = tooltipsForArea(mark, encoding, i);\n break;\n case 'point':\n entries = tooltipsForPoint(mark, encoding, i);\n break;\n case 'rect':\n entries = tooltipsForRect(mark, encoding, i);\n break;\n case 'arc':\n entries = tooltipsForArc(mark, encoding, i);\n break;\n }\n\n for (const [key, content] of entries) {\n descriptors.set(key, content);\n }\n }\n\n return descriptors;\n}\n"],"mappings":"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","names":["adaptTheme","resolveTheme","date","strValue","x","y","defaultStroke","date","color","estimateTextWidth","abbreviateNumber","formatNumber","abbreviateNumber","formatNumber","color","y","buildD3Formatter","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","color","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","x","x","pi","tau","epsilon","x","y","path","t0","t1","x","x","y","x","y","path","path","i","j","x","t0","t1","y","none_default","none_default","color","none_default","color","point","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","LABEL_OFFSET_X","slice","color","path","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","x","x","min","max","key","ticks","max","min","range","range","range","copy","point","format","min","max","t1","constant_default","x","y","y","constant_default","y","color","rgb","x","x","zero","i","constant_default","x","number","x","x","range","i","y","number","x","x","x","x","x","identity_default","x","locale","identity_default","sign","zero","format","formatPrefix","value","max","linear","x","x","sqrt","date","range","date","date","date","date","date","date","date","date","ticks","step","date","y","locale","formats","pad","format","sign","locale","defaultLocale","number","ticks","second","format","formatYear","tickFormat","date","y","transformer","t0","t1","x","range","copy","DEFAULT_POINT_RADIUS","min","max","sqrt","color","date","rules","DEFAULT_STROKE_WIDTH","hex","min","max","sqrt","linear","color","abbreviateNumber","buildD3Formatter","estimateTextWidth","formatNumber","ticks","computeChrome","estimateTextWidth","min","max","linear","point","estimateTextWidth","SWATCH_SIZE","SWATCH_GAP","ENTRY_GAP","legendHeight","offsetDx","offsetDy","computeChrome","estimateTextWidth","barPercent","max","min","formatDate","formatNumber","formatNumber","formatDate","adaptColorForDarkMode","min","max","adaptColorForDarkMode","color","min","max","range","normalize","points","estimateTextWidth","computeChrome","formatDate","formatNumber","format","formatDate","formatNumber","color","resolveTheme","adaptTheme","compileGraph"]}
1
+ {"version":3,"sources":["../src/compile.ts","../src/annotations/compute.ts","../src/charts/bar/compute.ts","../src/charts/utils.ts","../src/charts/bar/labels.ts","../src/charts/bar/index.ts","../src/charts/column/compute.ts","../src/charts/column/labels.ts","../src/charts/column/index.ts","../src/charts/dot/compute.ts","../src/charts/dot/labels.ts","../src/charts/dot/index.ts","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/constant.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/math.js","../../../node_modules/.bun/d3-path@3.1.0/node_modules/d3-path/src/path.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/path.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/arc.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/array.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/point.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/line.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/area.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/descending.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/identity.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/pie.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/offset/none.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/order/none.js","../../../node_modules/.bun/d3-shape@3.2.0/node_modules/d3-shape/src/stack.js","../src/charts/line/area.ts","../src/charts/line/compute.ts","../src/charts/line/labels.ts","../src/charts/line/index.ts","../src/charts/pie/compute.ts","../src/charts/pie/labels.ts","../src/charts/pie/index.ts","../src/charts/registry.ts","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ascending.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/descending.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisector.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/number.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/bisect.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/extent.js","../../../node_modules/.bun/internmap@2.0.3/node_modules/internmap/src/index.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/ticks.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/max.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/min.js","../../../node_modules/.bun/d3-array@3.2.4/node_modules/d3-array/src/range.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/init.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/ordinal.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/band.js","../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/define.js","../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/color.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basis.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basisClosed.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/constant.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/color.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/numberArray.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/array.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/date.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/number.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/object.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/value.js","../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/round.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/constant.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/number.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/continuous.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatDecimal.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/exponent.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatGroup.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatNumerals.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatSpecifier.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTrim.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatPrefixAuto.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatRounded.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/formatTypes.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/identity.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/locale.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/defaultLocale.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionFixed.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionPrefix.js","../../../node_modules/.bun/d3-format@3.1.2/node_modules/d3-format/src/precisionRound.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/tickFormat.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/nice.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/log.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/pow.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/interval.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/millisecond.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/duration.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/second.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/minute.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/hour.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/day.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/week.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/month.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/year.js","../../../node_modules/.bun/d3-time@3.1.0/node_modules/d3-time/src/ticks.js","../../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/locale.js","../../../node_modules/.bun/d3-time-format@4.1.0/node_modules/d3-time-format/src/defaultLocale.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/time.js","../../../node_modules/.bun/d3-scale@4.0.2/node_modules/d3-scale/src/sequential.js","../src/charts/scatter/compute.ts","../src/charts/scatter/trendline.ts","../src/charts/scatter/index.ts","../src/compiler/normalize.ts","../src/compiler/validate.ts","../src/compiler/index.ts","../src/graphs/compile-graph.ts","../src/graphs/encoding.ts","../src/graphs/community.ts","../src/layout/axes.ts","../src/layout/dimensions.ts","../src/layout/gridlines.ts","../src/layout/scales.ts","../src/legend/compute.ts","../src/tables/compile-table.ts","../src/tables/bar-column.ts","../src/tables/category-colors.ts","../src/tables/utils.ts","../src/tables/format-cells.ts","../src/tables/heatmap.ts","../src/tables/pagination.ts","../src/tables/search.ts","../src/tables/sort.ts","../src/tables/sparkline.ts","../src/tooltips/compute.ts"],"sourcesContent":["/**\n * Main compile API: the public entry points for the engine.\n *\n * Pipeline for charts:\n * validate spec -> normalize -> resolve theme -> dark mode adapt ->\n * compute legend -> compute dimensions (with legend space) ->\n * compute scales -> compute axes -> compute gridlines ->\n * get chart renderer -> compute marks -> compute a11y -> return ChartLayout\n *\n * Table compiler handles full data pipeline (sort, search, pagination, visual enhancements).\n * Graph compiler is a stub for future implementation.\n */\n\nimport type {\n ChartLayout,\n CompileOptions,\n CompileTableOptions,\n Mark,\n PointMark,\n Rect,\n RectMark,\n ResolvedAnnotation,\n ResolvedTheme,\n TableLayout,\n} from '@opendata-ai/openchart-core';\nimport {\n adaptTheme,\n BRAND_RESERVE_WIDTH,\n computeLabelBounds,\n generateAltText,\n generateDataTable,\n getBreakpoint,\n getHeightClass,\n getLayoutStrategy,\n resolveTheme,\n} from '@opendata-ai/openchart-core';\nimport { computeAnnotations } from './annotations/compute';\nimport { barRenderer } from './charts/bar';\nimport { columnRenderer } from './charts/column';\nimport { dotRenderer } from './charts/dot';\nimport { areaRenderer, lineRenderer } from './charts/line';\nimport { donutRenderer, pieRenderer } from './charts/pie';\nimport { type ChartRenderer, getChartRenderer, registerChartRenderer } from './charts/registry';\nimport { scatterRenderer } from './charts/scatter';\nimport { compile as compileSpec } from './compiler/index';\n\n// Register all built-in chart renderers. Explicit imports ensure bundlers\n// cannot tree-shake the registrations away (bare side-effect imports are\n// treated as dead code by esbuild).\nconst builtinRenderers: Record<string, ChartRenderer> = {\n line: lineRenderer,\n area: areaRenderer,\n bar: barRenderer,\n column: columnRenderer,\n scatter: scatterRenderer,\n pie: pieRenderer,\n donut: donutRenderer,\n dot: dotRenderer,\n};\nfor (const [type, renderer] of Object.entries(builtinRenderers)) {\n registerChartRenderer(type, renderer);\n}\n\nimport type { NormalizedChartSpec, NormalizedTableSpec } from './compiler/types';\nimport { compileGraph as compileGraphImpl } from './graphs/compile-graph';\nimport type { GraphCompilation } from './graphs/types';\nimport { computeAxes } from './layout/axes';\nimport { computeDimensions } from './layout/dimensions';\nimport { computeGridlines } from './layout/gridlines';\nimport { computeScales, type ResolvedScales } from './layout/scales';\nimport { computeLegend } from './legend/compute';\nimport { compileTableLayout } from './tables/compile-table';\nimport { computeTooltipDescriptors } from './tooltips/compute';\n\n// ---------------------------------------------------------------------------\n// Mark obstacles for annotation collision avoidance\n// ---------------------------------------------------------------------------\n\n/**\n * Compute bounding rects from marks to use as obstacles for annotation nudging.\n *\n * For band-scale charts (bar, dot): groups marks by band row and returns\n * a single obstacle per row spanning the full band height and x-range.\n *\n * For other charts (column, scatter): returns individual mark bounds so\n * annotations avoid overlapping any visible data mark.\n */\nfunction computeMarkObstacles(marks: Mark[], scales: ResolvedScales): Rect[] {\n // Band-scale y-axis: group marks by row for efficient obstacle computation\n if (scales.y?.type === 'band') {\n return computeBandRowObstacles(marks, scales);\n }\n\n // All other charts: use individual rect/point mark bounds as obstacles\n const obstacles: Rect[] = [];\n for (const mark of marks) {\n if (mark.type === 'rect') {\n const rm = mark as RectMark;\n obstacles.push({ x: rm.x, y: rm.y, width: rm.width, height: rm.height });\n } else if (mark.type === 'point') {\n const pm = mark as PointMark;\n obstacles.push({\n x: pm.cx - pm.r,\n y: pm.cy - pm.r,\n width: pm.r * 2,\n height: pm.r * 2,\n });\n }\n }\n return obstacles;\n}\n\n/** Group band-scale marks by row, returning one obstacle per band. */\nfunction computeBandRowObstacles(marks: Mark[], scales: ResolvedScales): Rect[] {\n const rows = new Map<number, { minX: number; maxX: number; bandY: number }>();\n\n for (const mark of marks) {\n let cy: number;\n let left: number;\n let right: number;\n\n if (mark.type === 'point') {\n const pm = mark as PointMark;\n cy = pm.cy;\n left = pm.cx - pm.r;\n right = pm.cx + pm.r;\n } else if (mark.type === 'rect') {\n const rm = mark as RectMark;\n cy = rm.y + rm.height / 2;\n left = rm.x;\n right = rm.x + rm.width;\n } else {\n continue;\n }\n\n // Round cy to group marks on the same band\n const key = Math.round(cy);\n const existing = rows.get(key);\n if (existing) {\n existing.minX = Math.min(existing.minX, left);\n existing.maxX = Math.max(existing.maxX, right);\n } else {\n rows.set(key, { minX: left, maxX: right, bandY: cy });\n }\n }\n\n // Get bandwidth from the band scale\n const bandScale = scales.y!.scale as { bandwidth?: () => number };\n const bandwidth = bandScale.bandwidth?.() ?? 0;\n if (bandwidth === 0) return [];\n\n const obstacles: Rect[] = [];\n for (const { minX, maxX, bandY } of rows.values()) {\n obstacles.push({\n x: minX,\n y: bandY - bandwidth / 2,\n width: maxX - minX,\n height: bandwidth,\n });\n }\n\n return obstacles;\n}\n\n// ---------------------------------------------------------------------------\n// Chart compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a chart spec into a ChartLayout.\n *\n * This is the main engine entry point. Takes a raw spec (any shape,\n * validated at runtime) and compile options, produces a fully resolved\n * ChartLayout with positions, colors, and marks ready for rendering.\n *\n * @param spec - Raw chart spec (validated and normalized internally).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns ChartLayout with all computed positions.\n * @throws Error if spec is invalid or not a chart type.\n */\nexport function compileChart(spec: unknown, options: CompileOptions): ChartLayout {\n // Validate + normalize\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type === 'table') {\n throw new Error('compileChart received a table spec. Use compileTable instead.');\n }\n if (normalized.type === 'graph') {\n throw new Error('compileChart received a graph spec. Use compileGraph instead.');\n }\n\n let chartSpec = normalized as NormalizedChartSpec;\n\n // Responsive strategy\n const breakpoint = getBreakpoint(options.width);\n const heightClass = getHeightClass(options.height);\n const strategy = getLayoutStrategy(breakpoint, heightClass);\n\n // Apply breakpoint-conditional overrides from the original spec\n const rawSpec = spec as Record<string, unknown>;\n const overrides = rawSpec.overrides as\n | Partial<\n Record<\n string,\n { chrome?: unknown; labels?: unknown; legend?: unknown; annotations?: unknown }\n >\n >\n | undefined;\n if (overrides?.[breakpoint]) {\n const bp = overrides[breakpoint]!;\n if (bp.chrome) {\n chartSpec = {\n ...chartSpec,\n chrome: {\n ...chartSpec.chrome,\n ...(bp.chrome as NormalizedChartSpec['chrome']),\n },\n };\n }\n if (bp.labels) {\n chartSpec = {\n ...chartSpec,\n labels: {\n ...chartSpec.labels,\n ...(bp.labels as NormalizedChartSpec['labels']),\n },\n };\n }\n if (bp.legend) {\n chartSpec = {\n ...chartSpec,\n legend: {\n ...chartSpec.legend,\n ...(bp.legend as NormalizedChartSpec['legend']),\n },\n };\n }\n if (bp.annotations) {\n chartSpec = {\n ...chartSpec,\n annotations: bp.annotations as NormalizedChartSpec['annotations'],\n };\n }\n }\n\n // Resolve theme: merge spec-level theme with options-level overrides\n const mergedThemeConfig = options.theme\n ? { ...chartSpec.theme, ...options.theme }\n : chartSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n // Compute legend first (needs to reserve space)\n const preliminaryArea: Rect = {\n x: 0,\n y: 0,\n width: options.width,\n height: options.height,\n };\n const legendLayout = computeLegend(chartSpec, strategy, theme, preliminaryArea);\n\n // Compute dimensions (accounts for chrome + legend + responsive strategy)\n const dims = computeDimensions(chartSpec, options, legendLayout, theme, strategy);\n const chartArea = dims.chartArea;\n\n // Recompute legend bounds relative to actual chart area.\n // chartArea was shrunk to exclude legend space, so expand it back to include\n // the reserved margin. This way computeLegend positions the legend outside\n // the data area (in the margin) instead of overlapping data marks.\n const legendArea: Rect = { ...chartArea };\n if (legendLayout.entries.length > 0) {\n switch (legendLayout.position) {\n case 'top':\n legendArea.y -= legendLayout.bounds.height + 4;\n legendArea.height += legendLayout.bounds.height + 4;\n break;\n case 'bottom':\n legendArea.height += legendLayout.bounds.height + 4;\n break;\n case 'right':\n case 'bottom-right':\n legendArea.width += legendLayout.bounds.width + 8;\n break;\n }\n }\n const finalLegend = computeLegend(chartSpec, strategy, theme, legendArea);\n\n // Apply data filtering after legend (so legend retains all series), but before\n // scale computation (so hidden/clipped data doesn't affect domains or marks).\n let renderData = chartSpec.data;\n\n // Filter hidden series: removed from rendering but kept in legend (dimmed in the adapter)\n if (chartSpec.hiddenSeries.length > 0 && chartSpec.encoding.color) {\n const colorField = chartSpec.encoding.color.field;\n const hiddenSet = new Set(chartSpec.hiddenSeries);\n renderData = renderData.filter((row) => !hiddenSet.has(String(row[colorField])));\n }\n\n // Filter clipped scale domains: when scale.clip is true, exclude rows outside the domain\n for (const channel of ['x', 'y'] as const) {\n const enc = chartSpec.encoding[channel];\n if (!enc?.scale?.clip || !enc.scale.domain) continue;\n const domain = enc.scale.domain;\n const field = enc.field;\n if (Array.isArray(domain) && domain.length === 2 && typeof domain[0] === 'number') {\n const [lo, hi] = domain as [number, number];\n renderData = renderData.filter((row) => {\n const v = Number(row[field]);\n return Number.isFinite(v) && v >= lo && v <= hi;\n });\n }\n }\n\n // Build a filtered spec for scales and marks, keeping all other properties intact\n const renderSpec = renderData !== chartSpec.data ? { ...chartSpec, data: renderData } : chartSpec;\n\n // Compute scales\n const scales = computeScales(renderSpec, chartArea, renderSpec.data);\n\n // Update color scale to use theme palette\n if (scales.color) {\n if (scales.color.type === 'sequential') {\n // Sequential: use first sequential palette (or fall back to categorical endpoints)\n const seqStops = Object.values(theme.colors.sequential)[0] ?? theme.colors.categorical;\n (scales.color.scale as unknown as import('d3-scale').ScaleLinear<string, string>).range([\n seqStops[0],\n seqStops[seqStops.length - 1],\n ]);\n } else {\n (scales.color.scale as import('d3-scale').ScaleOrdinal<string, string>).range(\n theme.colors.categorical,\n );\n }\n }\n\n // Set default color for single-series charts (no color encoding)\n scales.defaultColor = theme.colors.categorical[0];\n\n // Pie/donut charts don't use axes or gridlines\n const isRadial = chartSpec.type === 'pie' || chartSpec.type === 'donut';\n\n // Compute axes (skip for radial charts)\n const axes = isRadial\n ? { x: undefined, y: undefined }\n : computeAxes(scales, chartArea, strategy, theme, options.measureText);\n\n // Compute gridlines (stored in axes, used by adapters via axes.y.gridlines)\n if (!isRadial) {\n computeGridlines(axes, chartArea);\n }\n\n // Get chart renderer and compute marks (using filtered data)\n const renderer = getChartRenderer(renderSpec.type);\n const marks: Mark[] = renderer ? renderer(renderSpec, scales, chartArea, strategy, theme) : [];\n\n // Compute annotations from spec, passing legend + mark + brand bounds as obstacles\n const obstacles: Rect[] = [];\n if (finalLegend.bounds.width > 0) {\n obstacles.push(finalLegend.bounds);\n }\n obstacles.push(...computeMarkObstacles(marks, scales));\n\n // Add visible data label bounds as obstacles so annotations avoid overlapping them\n for (const mark of marks) {\n if (mark.type !== 'area' && mark.label?.visible) {\n obstacles.push(computeLabelBounds(mark.label));\n }\n }\n\n // Add brand watermark as an obstacle so annotations avoid overlapping it.\n // The brand is right-aligned on the same baseline as the first bottom chrome element,\n // offset below the chart area by x-axis extent (tick labels + axis title).\n const brandPadding = theme.spacing.padding;\n const brandX = dims.total.width - brandPadding - BRAND_RESERVE_WIDTH;\n const xAxisExtent = axes.x?.label ? 48 : axes.x ? 26 : 0;\n const firstBottomChrome = dims.chrome.source ?? dims.chrome.byline ?? dims.chrome.footer;\n const brandY = firstBottomChrome\n ? chartArea.y + chartArea.height + xAxisExtent + firstBottomChrome.y\n : chartArea.y + chartArea.height + xAxisExtent + theme.spacing.chartToFooter;\n obstacles.push({ x: brandX, y: brandY, width: BRAND_RESERVE_WIDTH, height: 30 });\n const annotations: ResolvedAnnotation[] = computeAnnotations(\n chartSpec,\n scales,\n chartArea,\n strategy,\n theme.isDark,\n obstacles,\n );\n\n // Compute tooltip descriptors from marks and encoding\n const tooltipDescriptors = computeTooltipDescriptors(chartSpec, marks);\n\n // Compute accessibility\n const altText = generateAltText(\n {\n type: chartSpec.type,\n data: chartSpec.data,\n encoding: chartSpec.encoding,\n chrome: chartSpec.chrome,\n },\n chartSpec.data,\n );\n const dataTableFallback = generateDataTable(\n {\n type: chartSpec.type,\n data: chartSpec.data,\n encoding: chartSpec.encoding,\n },\n chartSpec.data,\n );\n\n return {\n area: chartArea,\n chrome: dims.chrome,\n axes: {\n x: axes.x,\n y: axes.y,\n },\n marks,\n annotations,\n legend: finalLegend,\n tooltipDescriptors,\n a11y: {\n altText,\n dataTableFallback,\n role: 'img',\n keyboardNavigable: marks.length > 0,\n },\n theme,\n dimensions: {\n width: options.width,\n height: options.height,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Table compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a table spec into a TableLayout.\n *\n * Validates and normalizes the spec, resolves the theme, then delegates\n * to compileTableLayout for the full pipeline: column resolution, search,\n * sort, pagination, cell formatting, and visual enhancements.\n *\n * @param spec - Raw table spec.\n * @param options - Compile options with sort, search, pagination state.\n * @returns Fully resolved TableLayout.\n */\nexport function compileTable(spec: unknown, options: CompileTableOptions): TableLayout {\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type !== 'table') {\n throw new Error(`compileTable received a ${normalized.type} spec. Use compileChart instead.`);\n }\n\n const tableSpec = normalized as NormalizedTableSpec;\n\n // Resolve theme: merge spec-level theme with options-level overrides\n const mergedThemeConfig = options.theme\n ? { ...tableSpec.theme, ...options.theme }\n : tableSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n return compileTableLayout(tableSpec, options, theme);\n}\n\n// ---------------------------------------------------------------------------\n// Graph compilation\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a graph spec into a GraphCompilation.\n *\n * The graph pipeline resolves visual properties (size, color, stroke) for\n * nodes and edges, assigns communities, and builds legend/tooltip/a11y data.\n * Unlike charts, the output does NOT include x/y positions since the force\n * simulation in the adapter handles layout at runtime.\n *\n * @param spec - Raw graph spec (validated and normalized internally).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns GraphCompilation with resolved visual properties and simulation config.\n * @throws Error if spec is invalid or not a graph type.\n */\nexport function compileGraph(spec: unknown, options: CompileOptions): GraphCompilation {\n return compileGraphImpl(spec, options);\n}\n","/**\n * Annotation computation: converts spec-level annotations to pixel-positioned\n * ResolvedAnnotation objects using the resolved scales.\n *\n * Handles three annotation types:\n * - text: positioned at a data coordinate with an optional callout\n * - range: a highlighted rectangle between two data values\n * - refline: a horizontal or vertical reference line at a data value\n *\n * Supports fine-grained positioning via offset, anchor, connector, and zIndex.\n * At compact breakpoints, annotations are simplified or hidden.\n */\n\nimport type {\n AnnotationAnchor,\n AnnotationOffset,\n LayoutStrategy,\n Point,\n RangeAnnotation,\n Rect,\n RefLineAnnotation,\n ResolvedAnnotation,\n ResolvedLabel,\n TextAnnotation,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport { detectCollision, estimateTextWidth } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear, ScaleTime } from 'd3-scale';\nimport type { NormalizedChartSpec } from '../compiler/types';\nimport type { ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_ANNOTATION_FONT_SIZE = 12;\nconst DEFAULT_ANNOTATION_FONT_WEIGHT = 400;\nconst DEFAULT_LINE_HEIGHT = 1.3;\nconst DEFAULT_RANGE_FILL = '#f0c040';\nconst DEFAULT_RANGE_OPACITY = 0.15;\nconst DEFAULT_REFLINE_DASH = '4 3';\n\n// Theme-aware defaults for text and stroke colors\nconst LIGHT_TEXT_FILL = '#333333';\nconst DARK_TEXT_FILL = '#d1d5db';\nconst LIGHT_REFLINE_STROKE = '#888888';\nconst DARK_REFLINE_STROKE = '#9ca3af';\n\n/** Default label offset when using anchor directions. */\nconst ANCHOR_OFFSET = 8;\n\n/**\n * Interpolate a numeric value between sorted domain entries.\n * Used when an annotation references a value not present in a categorical domain\n * (e.g. \"2008\" on an axis with data points at \"2007\" and \"2009\").\n * Returns null if domain values aren't numeric or the domain is too small.\n */\nfunction interpolateInDomain(\n numValue: number,\n domain: string[],\n positionOf: (entry: string) => number,\n): number | null {\n if (domain.length < 2) return null;\n const nums = domain.map(Number);\n if (!nums.every(Number.isFinite)) return null;\n\n // Sort by numeric value so bracket-finding works regardless of data order\n const sorted = nums.map((n, i) => ({ n, i })).sort((a, b) => a.n - b.n);\n\n // Find the two sorted neighbors that bracket this value\n let lower = 0;\n let upper = sorted.length - 1;\n for (let i = 0; i < sorted.length; i++) {\n if (sorted[i].n <= numValue) lower = i;\n if (sorted[i].n >= numValue) {\n upper = i;\n break;\n }\n }\n\n const lowerPos = positionOf(domain[sorted[lower].i]);\n const upperPos = positionOf(domain[sorted[upper].i]);\n if (lower === upper) return lowerPos;\n const t = (numValue - sorted[lower].n) / (sorted[upper].n - sorted[lower].n);\n return lowerPos + t * (upperPos - lowerPos);\n}\n\n/** Resolve a data value to a pixel position on a given axis. */\nfunction resolvePosition(\n value: string | number,\n scale: ResolvedScales['x'] | ResolvedScales['y'],\n): number | null {\n if (!scale) return null;\n\n const s = scale.scale;\n const type = scale.type;\n\n if (type === 'time') {\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) return null;\n return (s as ScaleTime<number, number>)(date);\n }\n\n if (type === 'linear' || type === 'log') {\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(num)) return null;\n return (s as ScaleLinear<number, number>)(num);\n }\n\n if (type === 'band') {\n const bandScale = s as ScaleBand<string>;\n const strValue = String(value);\n const pos = bandScale(strValue);\n if (pos !== undefined) return pos + (bandScale.bandwidth?.() ?? 0) / 2;\n\n const bw = bandScale.bandwidth?.() ?? 0;\n return interpolateInDomain(\n Number(strValue),\n bandScale.domain(),\n (entry) => (bandScale(entry) ?? 0) + bw / 2,\n );\n }\n\n // point or ordinal: try direct lookup, fall back to interpolation\n const strValue = String(value);\n const directResult = (s as (v: string) => number | undefined)(strValue);\n if (directResult !== undefined) return directResult;\n\n if (type === 'point' || type === 'ordinal') {\n const domain = (s as { domain(): string[] }).domain();\n return interpolateInDomain(\n Number(strValue),\n domain,\n (entry) => (s as (v: string) => number)(entry) ?? 0,\n );\n }\n\n return null;\n}\n\nfunction makeAnnotationLabelStyle(\n fontSize?: number,\n fontWeight?: number,\n fill?: string,\n isDark?: boolean,\n): TextStyle {\n const defaultFill = isDark ? DARK_TEXT_FILL : LIGHT_TEXT_FILL;\n return {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE,\n fontWeight: fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT,\n fill: fill ?? defaultFill,\n lineHeight: DEFAULT_LINE_HEIGHT,\n textAnchor: 'start',\n };\n}\n\n/**\n * Compute the bounding box of annotation text at a given label position.\n * Multi-line text is centered at labelX; single-line starts at labelX.\n */\nfunction computeTextBounds(\n labelX: number,\n labelY: number,\n text: string,\n fontSize: number,\n fontWeight: number,\n): Rect {\n const lines = text.split('\\n');\n const isMultiLine = lines.length > 1;\n const maxWidth = Math.max(...lines.map((line) => estimateTextWidth(line, fontSize, fontWeight)));\n const totalHeight = lines.length * fontSize * DEFAULT_LINE_HEIGHT;\n const x = isMultiLine ? labelX - maxWidth / 2 : labelX;\n\n return {\n x,\n y: labelY - fontSize,\n width: maxWidth,\n height: totalHeight,\n };\n}\n\n/**\n * Apply anchor direction to compute label offset from data point.\n * Returns { dx, dy } pixel offsets.\n */\nfunction computeAnchorOffset(\n anchor: AnnotationAnchor | undefined,\n _px: number,\n py: number,\n chartArea: Rect,\n): { dx: number; dy: number } {\n if (!anchor || anchor === 'auto') {\n // Auto: place above if in the lower half, below if upper half\n const isUpperHalf = py < chartArea.y + chartArea.height / 2;\n return isUpperHalf\n ? { dx: ANCHOR_OFFSET, dy: ANCHOR_OFFSET } // below-right\n : { dx: ANCHOR_OFFSET, dy: -ANCHOR_OFFSET }; // above-right\n }\n\n switch (anchor) {\n case 'top':\n return { dx: 0, dy: -ANCHOR_OFFSET };\n case 'bottom':\n return { dx: 0, dy: ANCHOR_OFFSET };\n case 'left':\n return { dx: -ANCHOR_OFFSET, dy: 0 };\n case 'right':\n return { dx: ANCHOR_OFFSET, dy: 0 };\n }\n}\n\n/** Apply user offset on top of computed anchor offset. */\nfunction applyOffset(\n base: { dx: number; dy: number },\n offset: AnnotationOffset | undefined,\n): { dx: number; dy: number } {\n if (!offset) return base;\n return {\n dx: base.dx + (offset.dx ?? 0),\n dy: base.dy + (offset.dy ?? 0),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Connector origin: pick the edge midpoint closest to the data point\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the connector origin point on the text bounding box.\n * For straight connectors, finds the edge midpoint (top, bottom, left, right)\n * closest to the data point. For curve connectors, always uses the right edge.\n */\nfunction computeConnectorOrigin(\n labelX: number,\n labelY: number,\n text: string,\n fontSize: number,\n fontWeight: number,\n targetX: number,\n targetY: number,\n connectorStyle: 'straight' | 'curve',\n): { x: number; y: number } {\n const box = computeTextBounds(labelX, labelY, text, fontSize, fontWeight);\n const boxCenterX = box.x + box.width / 2;\n const boxCenterY = box.y + box.height / 2;\n\n // Curve connectors always start from the right edge\n if (connectorStyle === 'curve') {\n return {\n x: box.x + box.width,\n y: boxCenterY,\n };\n }\n\n // Normalize the vector from box center to target by the box half-dimensions.\n // This accounts for the box aspect ratio: a wide text box should prefer\n // top/bottom exits even when the target is also offset horizontally.\n const halfW = box.width / 2 || 1;\n const halfH = box.height / 2 || 1;\n const ndx = (targetX - boxCenterX) / halfW;\n const ndy = (targetY - boxCenterY) / halfH;\n\n if (Math.abs(ndy) >= Math.abs(ndx)) {\n // Target is more above/below than left/right → use top or bottom edge\n return ndy < 0\n ? { x: boxCenterX, y: box.y } // top\n : { x: boxCenterX, y: box.y + box.height }; // bottom\n }\n // Target is more left/right → use left or right edge\n return ndx < 0\n ? { x: box.x, y: boxCenterY } // left\n : { x: box.x + box.width, y: boxCenterY }; // right\n}\n\n// ---------------------------------------------------------------------------\n// Text annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveTextAnnotation(\n annotation: TextAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n const px = resolvePosition(annotation.x, scales.x);\n const py = resolvePosition(annotation.y, scales.y);\n\n if (px === null || py === null) return null;\n\n const defaultTextFill = isDark ? DARK_TEXT_FILL : LIGHT_TEXT_FILL;\n const labelStyle = makeAnnotationLabelStyle(\n annotation.fontSize,\n annotation.fontWeight,\n annotation.fill ?? defaultTextFill,\n isDark,\n );\n\n // Compute position from anchor direction + user offset\n const anchorDelta = computeAnchorOffset(annotation.anchor, px, py, chartArea);\n const finalDelta = applyOffset(anchorDelta, annotation.offset);\n\n const labelX = px + finalDelta.dx;\n const labelY = py + finalDelta.dy;\n\n // Connector: draw unless explicitly disabled\n const showConnector = annotation.connector !== false;\n const connectorStyle = annotation.connector === 'curve' ? 'curve' : 'straight';\n\n // Compute connector origin: pick the edge midpoint closest to the data point\n const fontSize = annotation.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const fontWeight = annotation.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n const { x: connectorFromX, y: connectorFromY } = computeConnectorOrigin(\n labelX,\n labelY,\n annotation.text,\n fontSize,\n fontWeight,\n px,\n py,\n connectorStyle,\n );\n\n // Apply user-provided connector endpoint offsets\n const baseFrom = { x: connectorFromX, y: connectorFromY };\n const baseTo = { x: px, y: py };\n const adjustedFrom = {\n x: baseFrom.x + (annotation.connectorOffset?.from?.dx ?? 0),\n y: baseFrom.y + (annotation.connectorOffset?.from?.dy ?? 0),\n };\n const adjustedToRaw = {\n x: baseTo.x + (annotation.connectorOffset?.to?.dx ?? 0),\n y: baseTo.y + (annotation.connectorOffset?.to?.dy ?? 0),\n };\n\n // Pull the \"to\" endpoint back along the connector direction so the\n // line doesn't touch the data point directly (leaves a small gap).\n const GAP = 4;\n const cdx = adjustedToRaw.x - adjustedFrom.x;\n const cdy = adjustedToRaw.y - adjustedFrom.y;\n const dist = Math.sqrt(cdx * cdx + cdy * cdy);\n const adjustedTo =\n dist > GAP * 2\n ? { x: adjustedToRaw.x - (cdx / dist) * GAP, y: adjustedToRaw.y - (cdy / dist) * GAP }\n : adjustedToRaw;\n\n const label: ResolvedLabel = {\n text: annotation.text,\n x: labelX,\n y: labelY,\n style: labelStyle,\n visible: true,\n connector: showConnector\n ? {\n from: adjustedFrom,\n to: adjustedTo,\n stroke: annotation.stroke ?? '#999999',\n style: connectorStyle,\n }\n : undefined,\n background: annotation.background,\n };\n\n return {\n type: 'text',\n label,\n stroke: annotation.stroke,\n fill: annotation.fill,\n opacity: annotation.opacity,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Range annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveRangeAnnotation(\n annotation: RangeAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n let x = chartArea.x;\n let y = chartArea.y;\n let width = chartArea.width;\n let height = chartArea.height;\n\n // X-range (vertical band)\n if (annotation.x1 !== undefined && annotation.x2 !== undefined) {\n const x1px = resolvePosition(annotation.x1, scales.x);\n const x2px = resolvePosition(annotation.x2, scales.x);\n if (x1px === null || x2px === null) return null;\n\n x = Math.min(x1px, x2px);\n width = Math.abs(x2px - x1px);\n }\n\n // Y-range (horizontal band)\n if (annotation.y1 !== undefined && annotation.y2 !== undefined) {\n const y1px = resolvePosition(annotation.y1, scales.y);\n const y2px = resolvePosition(annotation.y2, scales.y);\n if (y1px === null || y2px === null) return null;\n\n y = Math.min(y1px, y2px);\n height = Math.abs(y2px - y1px);\n }\n\n const rect: Rect = { x, y, width, height };\n\n // Label positioned within the range, with optional offset.\n // labelAnchor controls horizontal placement:\n // \"left\" (default): left edge, text-anchor start\n // \"top\"/\"auto\": horizontally centered, text-anchor middle\n // \"right\": right edge, text-anchor end\n let label: ResolvedLabel | undefined;\n if (annotation.label) {\n const anchor = annotation.labelAnchor ?? 'left';\n const centered = anchor === 'top' || anchor === 'bottom' || anchor === 'auto';\n const baseDx = centered ? 0 : anchor === 'right' ? -4 : 4;\n const baseDy = 14;\n const labelDelta = applyOffset({ dx: baseDx, dy: baseDy }, annotation.labelOffset);\n\n const style = makeAnnotationLabelStyle(11, 500, undefined, isDark);\n if (centered) {\n style.textAnchor = 'middle';\n } else if (anchor === 'right') {\n style.textAnchor = 'end';\n }\n\n const baseX = centered ? x + width / 2 : anchor === 'right' ? x + width : x;\n\n label = {\n text: annotation.label,\n x: baseX + labelDelta.dx,\n y: y + labelDelta.dy,\n style,\n visible: true,\n };\n }\n\n // In dark mode, boost range opacity slightly for better visibility\n const defaultOpacity = isDark ? 0.2 : DEFAULT_RANGE_OPACITY;\n\n return {\n type: 'range',\n rect,\n label,\n fill: annotation.fill ?? DEFAULT_RANGE_FILL,\n opacity: annotation.opacity ?? defaultOpacity,\n stroke: annotation.stroke,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Reference line annotation\n// ---------------------------------------------------------------------------\n\nfunction resolveRefLineAnnotation(\n annotation: RefLineAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n isDark: boolean,\n): ResolvedAnnotation | null {\n let start: Point;\n let end: Point;\n\n if (annotation.y !== undefined) {\n // Horizontal reference line\n const yPx = resolvePosition(annotation.y, scales.y);\n if (yPx === null) return null;\n\n start = { x: chartArea.x, y: yPx };\n end = { x: chartArea.x + chartArea.width, y: yPx };\n } else if (annotation.x !== undefined) {\n // Vertical reference line\n const xPx = resolvePosition(annotation.x, scales.x);\n if (xPx === null) return null;\n\n start = { x: xPx, y: chartArea.y };\n end = { x: xPx, y: chartArea.y + chartArea.height };\n } else {\n return null;\n }\n\n // Determine dash pattern from style\n let strokeDasharray: string | undefined;\n if (annotation.style === 'dashed' || annotation.style === undefined) {\n strokeDasharray = DEFAULT_REFLINE_DASH;\n } else if (annotation.style === 'dotted') {\n strokeDasharray = '2 2';\n }\n // 'solid' gets no dasharray\n\n // Label at the right end for horizontal, top end for vertical, with optional offset.\n // Horizontal refline labels use text-anchor 'end' so text stays inside the chart.\n // labelAnchor controls which side of the line the label sits on:\n // \"top\" (default): above horizontal, left of vertical\n // \"bottom\": below horizontal, right of vertical\n let label: ResolvedLabel | undefined;\n if (annotation.label) {\n const isHorizontal = annotation.y !== undefined;\n const anchor = annotation.labelAnchor ?? 'top';\n const baseDx = isHorizontal ? -4 : 4;\n const baseDy = anchor === 'bottom' ? 14 : -4;\n const labelDelta = applyOffset({ dx: baseDx, dy: baseDy }, annotation.labelOffset);\n\n const defaultStroke = isDark ? DARK_REFLINE_STROKE : LIGHT_REFLINE_STROKE;\n const style = makeAnnotationLabelStyle(11, 400, annotation.stroke ?? defaultStroke, isDark);\n if (isHorizontal) {\n style.textAnchor = 'end';\n }\n\n label = {\n text: annotation.label,\n x: (isHorizontal ? end.x : start.x) + labelDelta.dx,\n y: (isHorizontal ? end.y : start.y) + labelDelta.dy,\n style,\n visible: true,\n };\n }\n\n const defaultStroke = isDark ? DARK_REFLINE_STROKE : LIGHT_REFLINE_STROKE;\n\n return {\n type: 'refline',\n line: { start, end },\n label,\n stroke: annotation.stroke ?? defaultStroke,\n strokeDasharray,\n strokeWidth: annotation.strokeWidth ?? 1,\n zIndex: annotation.zIndex,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Collision avoidance\n// ---------------------------------------------------------------------------\n\n/** Estimate the bounding box of an annotation label. */\nfunction estimateLabelBounds(label: ResolvedLabel): Rect {\n const fontSize = label.style.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const fontWeight = label.style.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n return computeTextBounds(label.x, label.y, label.text, fontSize, fontWeight);\n}\n\n/** Padding between annotation and obstacle when nudging. */\nconst NUDGE_PADDING = 6;\n\n/**\n * Generate candidate displacement vectors to move `selfBounds` clear of each\n * obstacle in 4 directions (below, above, left, right), sorted by smallest\n * movement first.\n */\nfunction generateNudgeCandidates(\n selfBounds: Rect,\n obstacles: Rect[],\n padding: number,\n): { dx: number; dy: number; distance: number }[] {\n const candidates: { dx: number; dy: number; distance: number }[] = [];\n\n for (const obs of obstacles) {\n // Below: shift self so its top edge clears the obstacle bottom\n const belowDy = obs.y + obs.height + padding - selfBounds.y;\n candidates.push({ dx: 0, dy: belowDy, distance: Math.abs(belowDy) });\n\n // Above: shift self so its bottom edge clears the obstacle top\n const aboveDy = obs.y - padding - (selfBounds.y + selfBounds.height);\n candidates.push({ dx: 0, dy: aboveDy, distance: Math.abs(aboveDy) });\n\n // Left: shift self so its right edge clears the obstacle left\n const leftDx = obs.x - padding - (selfBounds.x + selfBounds.width);\n candidates.push({ dx: leftDx, dy: 0, distance: Math.abs(leftDx) });\n\n // Right: shift self so its left edge clears the obstacle right\n const rightDx = obs.x + obs.width + padding - selfBounds.x;\n candidates.push({ dx: rightDx, dy: 0, distance: Math.abs(rightDx) });\n }\n\n candidates.sort((a, b) => a.distance - b.distance);\n return candidates;\n}\n\n/**\n * Try to reposition a text annotation to avoid overlapping with obstacle rects\n * (legend bounds, etc.). First tries standard anchor alternatives, then\n * calculates specific offsets needed to clear obstacles. Returns true if moved.\n */\nfunction nudgeAnnotationFromObstacles(\n annotation: ResolvedAnnotation,\n originalAnnotation: TextAnnotation,\n scales: ResolvedScales,\n chartArea: Rect,\n obstacles: Rect[],\n): boolean {\n if (annotation.type !== 'text' || !annotation.label) return false;\n\n const labelBounds = estimateLabelBounds(annotation.label);\n const collidingObs = obstacles.filter(\n (obs) => obs.width > 0 && obs.height > 0 && detectCollision(labelBounds, obs),\n );\n\n if (collidingObs.length === 0) return false;\n\n // Resolve the data point pixel position for offset calculations\n const px = resolvePosition(originalAnnotation.x, scales.x);\n const py = resolvePosition(originalAnnotation.y, scales.y);\n if (px === null || py === null) return false;\n\n const candidates = generateNudgeCandidates(labelBounds, collidingObs, NUDGE_PADDING);\n const fontSize = labelBounds.height / Math.max(1, annotation.label.text.split('\\n').length);\n\n for (const { dx, dy } of candidates) {\n const newLabelX = annotation.label.x + dx;\n const newLabelY = annotation.label.y + dy;\n\n // Recompute connector origin for the new label position so the connector\n // exits from the edge closest to the data point after nudging.\n let newConnector = annotation.label.connector;\n if (newConnector) {\n const annFontSize = annotation.label.style.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const annFontWeight = annotation.label.style.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n const connStyle = newConnector.style === 'curve' ? ('curve' as const) : ('straight' as const);\n const newFrom = computeConnectorOrigin(\n newLabelX,\n newLabelY,\n annotation.label.text,\n annFontSize,\n annFontWeight,\n px,\n py,\n connStyle,\n );\n newConnector = { ...newConnector, from: newFrom };\n }\n\n const candidateLabel: ResolvedLabel = {\n ...annotation.label,\n x: newLabelX,\n y: newLabelY,\n connector: newConnector,\n };\n\n const candidateBounds = estimateLabelBounds(candidateLabel);\n\n // Check no collisions with any obstacle\n const stillCollides = obstacles.some(\n (obs) => obs.width > 0 && obs.height > 0 && detectCollision(candidateBounds, obs),\n );\n if (stillCollides) continue;\n\n // Annotations render outside the clip path, so they can extend into margins.\n // Only check that the label center is reasonably within the chart and that\n // the text doesn't go completely off-screen.\n const labelCenterX = candidateBounds.x + candidateBounds.width / 2;\n const labelCenterY = candidateBounds.y + candidateBounds.height / 2;\n // Allow nudged labels to extend into the chrome region below the chart\n // (source/footer area) since annotations near the bottom edge often\n // need to shift into that space to avoid marks or the brand watermark.\n const inBounds =\n labelCenterX >= chartArea.x &&\n labelCenterX <= chartArea.x + chartArea.width + 100 &&\n labelCenterY >= chartArea.y - fontSize &&\n labelCenterY <= chartArea.y + chartArea.height + fontSize * 3;\n\n if (inBounds) {\n // When nudged vertically (directly above/below the data), use a caret\n // instead of a connector line for a cleaner editorial look.\n if (candidateLabel.connector && dx === 0 && dy !== 0) {\n candidateLabel.connector = {\n ...candidateLabel.connector,\n style: 'caret',\n };\n }\n annotation.label = candidateLabel;\n return true;\n }\n }\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Annotation-to-annotation collision resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve collisions between text annotation labels using a greedy algorithm.\n *\n * Iterates through text annotations in order, building a list of \"placed\"\n * bounding rects. When a later annotation overlaps an already-placed one,\n * it tries offset positions (below, above, left, right) to find a\n * non-colliding spot. Recomputes the connector origin after nudging.\n */\nfunction resolveAnnotationCollisions(\n annotations: ResolvedAnnotation[],\n originalSpecs: NormalizedChartSpec['annotations'],\n scales: ResolvedScales,\n chartArea: Rect,\n): void {\n const placedBounds: Rect[] = [];\n\n for (let i = 0; i < annotations.length; i++) {\n const annotation = annotations[i];\n if (annotation.type !== 'text' || !annotation.label) {\n continue;\n }\n\n const bounds = estimateLabelBounds(annotation.label);\n\n // Check against all previously placed annotation labels\n const collidingBounds = placedBounds.filter(\n (pb) => pb.width > 0 && pb.height > 0 && detectCollision(bounds, pb),\n );\n\n if (collidingBounds.length > 0) {\n // Find the original spec to get data point coordinates for connector recomputation\n const originalSpec = originalSpecs[i];\n\n if (originalSpec?.type === 'text') {\n const px = resolvePosition(originalSpec.x, scales.x);\n const py = resolvePosition(originalSpec.y, scales.y);\n\n if (px !== null && py !== null) {\n const candidates = generateNudgeCandidates(bounds, collidingBounds, NUDGE_PADDING);\n const fontSize = bounds.height / Math.max(1, annotation.label.text.split('\\n').length);\n\n for (const { dx, dy } of candidates) {\n const newLabelX = annotation.label.x + dx;\n const newLabelY = annotation.label.y + dy;\n\n const candidateLabel: ResolvedLabel = {\n ...annotation.label,\n x: newLabelX,\n y: newLabelY,\n };\n const candidateBounds = estimateLabelBounds(candidateLabel);\n\n // Check no collisions with any placed label\n const stillCollides = placedBounds.some(\n (pb) => pb.width > 0 && pb.height > 0 && detectCollision(candidateBounds, pb),\n );\n if (stillCollides) continue;\n\n // Check the label center stays reasonably in bounds\n const labelCenterX = candidateBounds.x + candidateBounds.width / 2;\n const labelCenterY = candidateBounds.y + candidateBounds.height / 2;\n const inBounds =\n labelCenterX >= chartArea.x &&\n labelCenterX <= chartArea.x + chartArea.width + 100 &&\n labelCenterY >= chartArea.y - fontSize &&\n labelCenterY <= chartArea.y + chartArea.height + fontSize;\n\n if (inBounds) {\n // Recompute connector origin for the new position\n let newConnector = annotation.label.connector;\n if (newConnector) {\n const annFontSize = annotation.label.style.fontSize ?? DEFAULT_ANNOTATION_FONT_SIZE;\n const annFontWeight =\n annotation.label.style.fontWeight ?? DEFAULT_ANNOTATION_FONT_WEIGHT;\n const connStyle =\n newConnector.style === 'curve' ? ('curve' as const) : ('straight' as const);\n const newFrom = computeConnectorOrigin(\n newLabelX,\n newLabelY,\n annotation.label.text,\n annFontSize,\n annFontWeight,\n px,\n py,\n connStyle,\n );\n newConnector = { ...newConnector, from: newFrom };\n }\n\n annotation.label = {\n ...annotation.label,\n x: newLabelX,\n y: newLabelY,\n connector: newConnector,\n };\n break;\n }\n }\n }\n }\n }\n\n // Add this annotation's final bounds to the placed list\n placedBounds.push(estimateLabelBounds(annotation.label));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute resolved annotations from spec annotations using the resolved scales.\n *\n * Converts data-coordinate annotations to pixel-positioned ResolvedAnnotation\n * objects. Supports offset, anchor, connector, and zIndex. At compact\n * breakpoints, annotations are hidden (strategy says \"tooltip-only\").\n *\n * When obstacle rects are provided (e.g. legend bounds), text annotations\n * that overlap with them are automatically repositioned using alternate\n * anchor directions. After individual obstacle avoidance, annotation-to-\n * annotation collisions are resolved using a greedy placement algorithm.\n */\nexport function computeAnnotations(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n isDark = false,\n obstacles: Rect[] = [],\n): ResolvedAnnotation[] {\n // At compact breakpoints, skip all annotations\n if (strategy.annotationPosition === 'tooltip-only') {\n return [];\n }\n\n const annotations: ResolvedAnnotation[] = [];\n\n for (const annotation of spec.annotations) {\n let resolved: ResolvedAnnotation | null = null;\n\n switch (annotation.type) {\n case 'text':\n resolved = resolveTextAnnotation(annotation, scales, chartArea, isDark);\n break;\n case 'range':\n resolved = resolveRangeAnnotation(annotation, scales, chartArea, isDark);\n break;\n case 'refline':\n resolved = resolveRefLineAnnotation(annotation, scales, chartArea, isDark);\n break;\n }\n\n if (resolved) {\n // For text annotations, check for collisions with obstacles and nudge if needed\n if (annotation.type === 'text' && obstacles.length > 0) {\n nudgeAnnotationFromObstacles(resolved, annotation, scales, chartArea, obstacles);\n }\n annotations.push(resolved);\n }\n }\n\n // Resolve annotation-to-annotation collisions (greedy, order-preserving)\n resolveAnnotationCollisions(annotations, spec.annotations, scales, chartArea);\n\n // Sort by zIndex (lower first, undefined treated as 0)\n annotations.sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n\n return annotations;\n}\n","/**\n * Bar chart (horizontal) mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * RectMark[] for rendering horizontal bars. Supports grouped and\n * stacked variants via the color encoding channel.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport { abbreviateNumber, formatNumber } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, getSequentialColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MIN_BAR_WIDTH = 1;\n\n/** Format a bar value for display (abbreviate large numbers). */\nfunction formatBarValue(value: number): string {\n if (Math.abs(value) >= 1000) return abbreviateNumber(value);\n return formatNumber(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute horizontal bar marks from a normalized chart spec.\n *\n * Y axis uses a band scale for categories. X axis uses a linear scale\n * for values. When a color encoding is present, bars within each category\n * are grouped (subdivided bands) or stacked (cumulative widths).\n */\nexport function computeBarMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): RectMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const yScale = scales.y.scale as ScaleBand<string>;\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n\n // Band scale should provide bandwidth\n if (typeof yScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = yScale.bandwidth();\n const baseline = xScale(0);\n const colorField = encoding.color?.field;\n const isSequentialColor = encoding.color?.type === 'quantitative';\n\n // If no color encoding, or sequential color (value-based gradient), render simple bars\n if (!colorField || isSequentialColor) {\n return computeSimpleBars(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n isSequentialColor,\n );\n }\n\n // Stacked bars when color is present\n return computeStackedBars(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n}\n\n/** Compute stacked horizontal bars. */\nfunction computeStackedBars(\n data: DataRow[],\n valueField: string,\n categoryField: string,\n colorField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n _baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n const categoryGroups = groupByField(data, categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n let cumulativeValue = 0;\n\n for (const row of rows) {\n const groupKey = String(row[colorField] ?? '');\n const value = Number(row[valueField] ?? 0);\n // Only stack positive values (same approach as stacked columns)\n if (!Number.isFinite(value) || value <= 0) continue;\n\n const color = getColor(scales, groupKey);\n\n const xLeft = xScale(cumulativeValue);\n const xRight = xScale(cumulativeValue + value);\n const barWidth = Math.max(Math.abs(xRight - xLeft), MIN_BAR_WIDTH);\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatBarValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: xLeft,\n y: bandY,\n width: barWidth,\n height: bandwidth,\n fill: color,\n cornerRadius: 0,\n data: row as Record<string, unknown>,\n aria,\n });\n\n cumulativeValue += value;\n }\n }\n\n return marks;\n}\n\n/** Compute simple (non-grouped) horizontal bars. */\nfunction computeSimpleBars(\n data: DataRow[],\n valueField: string,\n categoryField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n sequentialColor = false,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const color = sequentialColor\n ? getSequentialColor(scales, value)\n : getColor(scales, '__default__');\n const xPos = value >= 0 ? baseline : xScale(value);\n const barWidth = Math.max(Math.abs(xScale(value) - baseline), MIN_BAR_WIDTH);\n\n const aria: MarkAria = {\n label: `${category}: ${formatBarValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: xPos,\n y: bandY,\n width: barWidth,\n height: bandwidth,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Shared utilities for chart mark computation.\n *\n * Common helpers used across multiple chart types: scale value resolution,\n * data grouping, color lookup, and shared constants.\n */\n\nimport type { DataRow } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear, ScalePoint, ScaleTime } from 'd3-scale';\nimport type { D3Scale, ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default single-series color when no color encoding is present. */\nexport const DEFAULT_COLOR = '#1b7fa3';\n\n// ---------------------------------------------------------------------------\n// Scale helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a data value to a pixel position using a D3 scale.\n *\n * Handles time scales (parsing string dates), categorical scales\n * (point, band, ordinal - passing string values directly), and\n * linear/log scales (coercing to number). Returns null for values\n * that can't be resolved (null, NaN, invalid dates, or values not\n * in a categorical scale's domain).\n */\nexport function scaleValue(scale: D3Scale, scaleType: string, value: unknown): number | null {\n if (value == null) return null;\n\n if (scaleType === 'time') {\n const date = value instanceof Date ? value : new Date(String(value));\n if (Number.isNaN(date.getTime())) return null;\n return (scale as ScaleTime<number, number>)(date);\n }\n\n // Categorical scales: pass string values directly\n if (scaleType === 'point' || scaleType === 'band' || scaleType === 'ordinal') {\n const result = (scale as ScalePoint<string> | ScaleBand<string>)(String(value));\n return result ?? null;\n }\n\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(num)) return null;\n return (scale as ScaleLinear<number, number>)(num);\n}\n\n// ---------------------------------------------------------------------------\n// Data grouping\n// ---------------------------------------------------------------------------\n\n/**\n * Group data rows by a field value.\n *\n * If no field is provided, all rows are grouped under '__default__'.\n * Returns a Map preserving insertion order.\n */\nexport function groupByField(data: DataRow[], field: string | undefined): Map<string, DataRow[]> {\n const groups = new Map<string, DataRow[]>();\n\n if (!field) {\n groups.set('__default__', data);\n return groups;\n }\n\n for (const row of data) {\n const key = String(row[field] ?? '__default__');\n const existing = groups.get(key);\n if (existing) {\n existing.push(row);\n } else {\n groups.set(key, [row]);\n }\n }\n\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// Sorting\n// ---------------------------------------------------------------------------\n\n/**\n * Sort data rows by a field value in ascending order.\n *\n * Type-aware: numbers compared numerically, Date objects by timestamp,\n * string-encoded numbers parsed and compared numerically, and everything\n * else compared lexicographically (which also handles ISO date strings).\n * Nulls are sorted last. Returns a new array (no mutation).\n */\nexport function sortByField(data: DataRow[], field: string): DataRow[] {\n if (data.length <= 1) return [...data];\n\n return [...data].sort((a, b) => {\n const aVal = a[field];\n const bVal = b[field];\n\n // Nulls last\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n\n // Both numbers\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return aVal - bVal;\n }\n\n // Both Dates\n if (aVal instanceof Date && bVal instanceof Date) {\n return aVal.getTime() - bVal.getTime();\n }\n\n // String values: try numeric parse, then lexicographic\n const aStr = String(aVal);\n const bStr = String(bVal);\n\n const aNum = Number(aStr);\n const bNum = Number(bStr);\n if (Number.isFinite(aNum) && Number.isFinite(bNum)) {\n return aNum - bNum;\n }\n\n return aStr.localeCompare(bStr);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Color helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get the color for a series/category from the resolved color scale.\n *\n * For single-series charts (key === '__default__'), uses the theme's\n * first categorical color via scales.defaultColor.\n */\nexport function getColor(\n scales: ResolvedScales,\n key: string,\n _index?: number,\n fallback: string = DEFAULT_COLOR,\n): string {\n if (scales.color && key !== '__default__') {\n const colorScale = scales.color.scale as (v: string) => string;\n return colorScale(key);\n }\n return scales.defaultColor ?? fallback;\n}\n\n/**\n * Get color from a sequential (quantitative) color scale.\n * Maps a numeric value to a color via linear interpolation.\n */\nexport function getSequentialColor(\n scales: ResolvedScales,\n value: number,\n fallback: string = DEFAULT_COLOR,\n): string {\n if (scales.color?.type === 'sequential') {\n const colorScale = scales.color.scale as unknown as (v: number) => string;\n return colorScale(value);\n }\n return scales.defaultColor ?? fallback;\n}\n","/**\n * Bar chart label computation.\n *\n * Produces value labels for horizontal bars, positioned inside the bar\n * if the bar is wide enough, or outside (to the right) otherwise.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last bars only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n RectMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport {\n buildD3Formatter,\n estimateTextWidth,\n resolveCollisions,\n} from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_PADDING = 6;\nconst MIN_WIDTH_FOR_INSIDE_LABEL = 40;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for bar marks.\n *\n * For each bar, the value from the data is formatted and placed either\n * inside the bar (right-aligned) if the bar is wide enough, or just\n * outside the bar's right edge.\n */\nexport function computeBarLabels(\n marks: RectMark[],\n _chartArea: { x: number; y: number; width: number; height: number },\n density: LabelDensity = 'auto',\n labelFormat?: string,\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n\n const formatter = buildD3Formatter(labelFormat);\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\" or \"category, group: value\".\n // Use the last colon to split, which handles colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const rawValue = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!rawValue) continue;\n\n // Apply label format if provided (re-parse the number from the aria string)\n let valuePart = rawValue;\n if (formatter) {\n const num = Number(rawValue.replace(/[^0-9.-]/g, ''));\n if (!Number.isNaN(num)) valuePart = formatter(num);\n }\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // Detect stacked bars: cornerRadius 0 indicates stacked segment\n const isStacked = mark.cornerRadius === 0;\n\n // Determine if label goes inside or outside the bar\n const isInside = mark.width >= MIN_WIDTH_FOR_INSIDE_LABEL;\n\n let anchorX: number;\n let fill: string;\n let textAnchor: 'start' | 'end' | 'middle';\n\n if (isStacked && isInside) {\n // Stacked: centered within segment\n anchorX = mark.x + mark.width / 2;\n fill = '#ffffff';\n textAnchor = 'middle';\n } else if (isInside) {\n // Simple: right-aligned within bar\n anchorX = mark.x + mark.width - LABEL_PADDING;\n fill = '#ffffff';\n textAnchor = 'end';\n } else {\n // Outside: just past the bar's right edge\n anchorX = mark.x + mark.width + LABEL_PADDING;\n fill = mark.fill;\n textAnchor = 'start';\n }\n\n // anchorY = bar vertical center. With dominant-baseline: central,\n // SVG places the text center at this y coordinate.\n const anchorY = mark.y + mark.height / 2;\n\n candidates.push({\n text: valuePart,\n anchorX,\n anchorY,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill,\n lineHeight: 1.2,\n textAnchor,\n dominantBaseline: 'central',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Bar chart module (horizontal bars).\n *\n * Exports the bar chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeBarMarks } from './compute';\nimport { computeBarLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Bar chart renderer\n// ---------------------------------------------------------------------------\n\nexport const barRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeBarMarks(spec, scales, chartArea, strategy);\n\n // Compute and attach value labels (respects spec.labels.density)\n const labels = computeBarLabels(marks, chartArea, spec.labels.density, spec.labels.format);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeBarMarks } from './compute';\nexport { computeBarLabels } from './labels';\n","/**\n * Column chart (vertical bars) mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * RectMark[] for rendering vertical columns. When a color encoding\n * is present, columns are stacked (cumulative heights per category).\n *\n * Shares conceptual logic with bar chart but axes are swapped:\n * x-axis is categorical (band scale), y-axis is quantitative.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport { abbreviateNumber, formatNumber } from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, getSequentialColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MIN_COLUMN_HEIGHT = 1;\n\n/** Format a column value for display (abbreviate large numbers). */\nfunction formatColumnValue(value: number): string {\n if (Math.abs(value) >= 1000) return abbreviateNumber(value);\n return formatNumber(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute vertical column marks from a normalized chart spec.\n *\n * X axis uses a band scale for categories. Y axis uses a linear scale\n * for values. When a color encoding is present, columns within each\n * category are stacked (cumulative heights).\n */\nexport function computeColumnMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): RectMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleBand<string>;\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n\n // Band scale should provide bandwidth\n if (typeof xScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = xScale.bandwidth();\n const baseline = yScale(0);\n const colorField = encoding.color?.field;\n\n const isSequentialColor = encoding.color?.type === 'quantitative';\n\n // Color encoding present: decide between colored simple columns vs stacked\n if (colorField && !isSequentialColor) {\n // Check if any category has multiple rows (actual stacking needed)\n const categoryGroups = groupByField(spec.data, xChannel.field);\n const needsStacking = Array.from(categoryGroups.values()).some((rows) => rows.length > 1);\n\n if (needsStacking) {\n return computeStackedColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n }\n\n // Single row per category: render like simple columns but with color from scale\n return computeColoredColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n }\n\n return computeSimpleColumns(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n isSequentialColor,\n );\n}\n\n/** Compute simple (non-grouped) vertical columns. */\nfunction computeSimpleColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n sequentialColor = false,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n const color = sequentialColor\n ? getSequentialColor(scales, value)\n : getColor(scales, '__default__');\n const yPos = yScale(value);\n const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);\n\n // For positive values, column goes upward from baseline.\n // For negative values, column goes downward from baseline.\n const y = value >= 0 ? yPos : baseline;\n\n const aria: MarkAria = {\n label: `${category}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n\n/** Compute colored (non-stacked) vertical columns. Used when color encoding\n * is present but each category has only one row (e.g., diverging charts). */\nfunction computeColoredColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n colorField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n const groupKey = String(row[colorField] ?? '');\n const color = getColor(scales, groupKey);\n const yPos = yScale(value);\n const columnHeight = Math.max(Math.abs(baseline - yPos), MIN_COLUMN_HEIGHT);\n\n const y = value >= 0 ? yPos : baseline;\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 2,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n\n/** Compute stacked vertical columns. */\nfunction computeStackedColumns(\n data: DataRow[],\n categoryField: string,\n valueField: string,\n colorField: string,\n xScale: ScaleBand<string>,\n yScale: ScaleLinear<number, number>,\n bandwidth: number,\n _baseline: number,\n scales: ResolvedScales,\n): RectMark[] {\n const marks: RectMark[] = [];\n const categoryGroups = groupByField(data, categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandX = xScale(category);\n if (bandX === undefined) continue;\n\n let cumulativeValue = 0;\n\n for (const row of rows) {\n const groupKey = String(row[colorField] ?? '');\n const value = Number(row[valueField] ?? 0);\n // Stacking only applies to positive values; negative/zero rows are skipped\n // since cumulative stacking doesn't make visual sense for mixed signs.\n if (!Number.isFinite(value) || value <= 0) continue;\n\n const color = getColor(scales, groupKey);\n\n const yTop = yScale(cumulativeValue + value);\n const yBottom = yScale(cumulativeValue);\n const columnHeight = Math.max(Math.abs(yBottom - yTop), MIN_COLUMN_HEIGHT);\n\n const aria: MarkAria = {\n label: `${category}, ${groupKey}: ${formatColumnValue(value)}`,\n };\n\n marks.push({\n type: 'rect',\n x: bandX,\n y: yTop,\n width: bandwidth,\n height: columnHeight,\n fill: color,\n cornerRadius: 0,\n data: row as Record<string, unknown>,\n aria,\n });\n\n cumulativeValue += value;\n }\n }\n\n return marks;\n}\n","/**\n * Column chart label computation.\n *\n * Produces value labels positioned above each column (for positive values)\n * or below (for negative values).\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last columns only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n RectMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport {\n buildD3Formatter,\n estimateTextWidth,\n resolveCollisions,\n} from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 10;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_OFFSET_Y = 6;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for column marks.\n *\n * For each column, the value is placed centered above the column top.\n */\nexport function computeColumnLabels(\n marks: RectMark[],\n _chartArea: { x: number; y: number; width: number; height: number },\n density: LabelDensity = 'auto',\n labelFormat?: string,\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const formatter = buildD3Formatter(labelFormat);\n\n const candidates: LabelCandidate[] = [];\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\" or \"category, group: value\".\n // Use the last colon to split, which handles colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const rawValue = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!rawValue) continue;\n\n // Apply label format if provided (re-parse the number from the aria string)\n let valuePart = rawValue;\n if (formatter) {\n const num = Number(rawValue.replace(/[^0-9.-]/g, ''));\n if (!Number.isNaN(num)) valuePart = formatter(num);\n }\n\n const numericValue = parseFloat(valuePart);\n const isNegative = Number.isFinite(numericValue) && numericValue < 0;\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // For positive values, place label above the column top.\n // For negative values, place label below the column bottom.\n const anchorX = mark.x + mark.width / 2;\n const anchorY = isNegative\n ? mark.y + mark.height + LABEL_OFFSET_Y\n : mark.y - LABEL_OFFSET_Y - textHeight;\n\n candidates.push({\n text: valuePart,\n anchorX,\n anchorY,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.fill,\n lineHeight: 1.2,\n textAnchor: 'middle',\n dominantBaseline: isNegative ? 'hanging' : 'auto',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Column chart module (vertical bars).\n *\n * Exports the column chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeColumnMarks } from './compute';\nimport { computeColumnLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Column chart renderer\n// ---------------------------------------------------------------------------\n\nexport const columnRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeColumnMarks(spec, scales, chartArea, strategy);\n\n // Compute and attach value labels (respects spec.labels.density)\n const labels = computeColumnLabels(marks, chartArea, spec.labels.density, spec.labels.format);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeColumnMarks } from './compute';\nexport { computeColumnLabels } from './labels';\n","/**\n * Dot plot / lollipop chart mark computation.\n *\n * Category axis (band scale) + value axis (linear scale). Produces\n * PointMark[] for the dots plus RectMark[] for lollipop stems\n * (thin lines from axis baseline to each dot).\n *\n * When a color encoding is present (multi-series), renders as a dumbbell\n * chart: a connecting bar spans min-to-max per category instead of\n * baseline-to-dot stems.\n */\n\nimport type {\n Encoding,\n LayoutStrategy,\n MarkAria,\n PointMark,\n Rect,\n RectMark,\n} from '@opendata-ai/openchart-core';\nimport type { ScaleBand, ScaleLinear } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, groupByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DOT_RADIUS = 6;\nconst STEM_WIDTH = 2;\nconst STEM_COLOR = '#cccccc';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute dot plot marks from a normalized chart spec.\n *\n * Y axis uses a band scale for categories. X axis uses a linear scale\n * for values. When no color encoding is present, each data point produces\n * a lollipop stem + dot. When color is present (multi-series), renders\n * connecting bars between min/max values per category (dumbbell style).\n */\nexport function computeDotMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): (PointMark | RectMark)[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n const yScale = scales.y.scale as ScaleBand<string>;\n\n // Band scale should provide bandwidth\n if (typeof yScale.bandwidth !== 'function') {\n return [];\n }\n\n const bandwidth = yScale.bandwidth();\n const baseline = xScale(0);\n const colorField = encoding.color?.field;\n\n // Multi-series: dumbbell chart with connecting bars\n if (colorField) {\n return computeDumbbellMarks(\n spec.data,\n xChannel.field,\n yChannel.field,\n colorField,\n xScale,\n yScale,\n bandwidth,\n scales,\n );\n }\n\n // Single series: lollipop stems from baseline\n return computeLollipopMarks(\n spec.data,\n xChannel.field,\n yChannel.field,\n xScale,\n yScale,\n bandwidth,\n baseline,\n scales,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dumbbell (multi-series)\n// ---------------------------------------------------------------------------\n\n/** Compute dumbbell marks: connecting bar + colored dots per category. */\nfunction computeDumbbellMarks(\n data: readonly Record<string, unknown>[],\n valueField: string,\n categoryField: string,\n colorField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n scales: ResolvedScales,\n): (PointMark | RectMark)[] {\n const marks: (PointMark | RectMark)[] = [];\n const categoryGroups = groupByField([...data], categoryField);\n\n for (const [category, rows] of categoryGroups) {\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const cy = bandY + bandwidth / 2;\n\n // Collect all x-values for this category to find the range\n const xValues: number[] = [];\n for (const row of rows) {\n const value = Number(row[valueField] ?? 0);\n if (Number.isFinite(value)) xValues.push(value);\n }\n\n if (xValues.length === 0) continue;\n\n const minVal = Math.min(...xValues);\n const maxVal = Math.max(...xValues);\n const xLeft = xScale(minVal);\n const xRight = xScale(maxVal);\n const barWidth = Math.abs(xRight - xLeft);\n\n // Connecting bar (rendered first so dots layer on top)\n if (barWidth > 0) {\n const stemAria: MarkAria = {\n label: `Range for ${category}: ${minVal} to ${maxVal}`,\n };\n\n marks.push({\n type: 'rect',\n x: Math.min(xLeft, xRight),\n y: cy - STEM_WIDTH / 2,\n width: barWidth,\n height: STEM_WIDTH,\n fill: STEM_COLOR,\n data: rows[0] as Record<string, unknown>,\n aria: stemAria,\n });\n }\n\n // Individual dots for each series value\n for (const row of rows) {\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const cx = xScale(value);\n const colorCategory = String(row[colorField] ?? '');\n const color = getColor(scales, colorCategory);\n\n const dotAria: MarkAria = {\n label: `${category}, ${colorCategory}: ${value}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: DOT_RADIUS,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: row as Record<string, unknown>,\n aria: dotAria,\n });\n }\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Lollipop (single series)\n// ---------------------------------------------------------------------------\n\n/** Compute lollipop marks: stem from baseline + dot. */\nfunction computeLollipopMarks(\n data: readonly Record<string, unknown>[],\n valueField: string,\n categoryField: string,\n xScale: ScaleLinear<number, number>,\n yScale: ScaleBand<string>,\n bandwidth: number,\n baseline: number,\n scales: ResolvedScales,\n): (PointMark | RectMark)[] {\n const marks: (PointMark | RectMark)[] = [];\n\n for (const row of data) {\n const category = String(row[categoryField] ?? '');\n const value = Number(row[valueField] ?? 0);\n if (!Number.isFinite(value)) continue;\n\n const bandY = yScale(category);\n if (bandY === undefined) continue;\n\n const cx = xScale(value);\n const cy = bandY + bandwidth / 2;\n\n const color = getColor(scales, '__default__');\n\n // Stem: thin rectangle from baseline to dot center\n const stemX = Math.min(baseline, cx);\n const stemWidth = Math.abs(cx - baseline);\n\n if (stemWidth > 0) {\n const stemAria: MarkAria = {\n label: `Stem for ${category}`,\n };\n\n marks.push({\n type: 'rect',\n x: stemX,\n y: cy - STEM_WIDTH / 2,\n width: stemWidth,\n height: STEM_WIDTH,\n fill: STEM_COLOR,\n data: row as Record<string, unknown>,\n aria: stemAria,\n });\n }\n\n // Dot\n const dotAria: MarkAria = {\n label: `${category}: ${value}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: DOT_RADIUS,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: row as Record<string, unknown>,\n aria: dotAria,\n });\n }\n\n return marks;\n}\n","/**\n * Dot chart label computation.\n *\n * Produces value labels positioned to the right of each dot.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last dots only\n * - 'none': return empty array\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n PointMark,\n Rect,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_FONT_WEIGHT = 600;\nconst LABEL_OFFSET_X = 10;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute value labels for dot marks.\n *\n * Places labels to the right of each dot point.\n */\nexport function computeDotLabels(\n marks: PointMark[],\n _chartArea: Rect,\n density: LabelDensity = 'auto',\n): ResolvedLabel[] {\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n\n for (const mark of targetMarks) {\n // Extract the display value from the aria label.\n // Format is \"category: value\". Use the last colon to handle colons in category names.\n const ariaLabel = mark.aria.label;\n const lastColon = ariaLabel.lastIndexOf(':');\n const valuePart = lastColon >= 0 ? ariaLabel.slice(lastColon + 1).trim() : '';\n if (!valuePart) continue;\n\n const textWidth = estimateTextWidth(valuePart, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n candidates.push({\n text: valuePart,\n anchorX: mark.cx + mark.r + LABEL_OFFSET_X,\n anchorY: mark.cy - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.fill,\n lineHeight: 1.2,\n textAnchor: 'start',\n dominantBaseline: 'central',\n },\n });\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n return candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n }\n\n return resolveCollisions(candidates);\n}\n","/**\n * Dot plot / lollipop chart module.\n *\n * Exports the dot chart renderer and computation functions.\n */\n\nimport type { Mark, PointMark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeDotMarks } from './compute';\nimport { computeDotLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Dot chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Dot/lollipop chart renderer.\n *\n * Produces stem (RectMark) and dot (PointMark) pairs for each data point.\n * Value labels are attached to the dot marks.\n */\nexport const dotRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeDotMarks(spec, scales, chartArea, strategy);\n\n // Extract just the point marks for label computation\n const pointMarks = marks.filter((m): m is PointMark => m.type === 'point');\n\n // Compute and attach labels to point marks (respects spec.labels.density)\n const labels = computeDotLabels(pointMarks, chartArea, spec.labels.density);\n let labelIdx = 0;\n for (const mark of marks) {\n if (mark.type === 'point' && labelIdx < labels.length) {\n mark.label = labels[labelIdx];\n labelIdx++;\n }\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeDotMarks } from './compute';\nexport { computeDotLabels } from './labels';\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(line);\n\n x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x0, y0, y1) {\n var x1 = null,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null,\n path = withPath(area);\n\n x0 = typeof x0 === \"function\" ? x0 : (x0 === undefined) ? pointX : constant(+x0);\n y0 = typeof y0 === \"function\" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0);\n y1 = typeof y1 === \"function\" ? y1 : (y1 === undefined) ? pointY : constant(+y1);\n\n function area(data) {\n var i,\n j,\n k,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = (data = array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nfunction stackSeries(key) {\n const series = [];\n series.key = key;\n return series;\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i, n = sz.length, j = -1,\n oz;\n\n for (const d of data) {\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n\n for (i = 0, oz = array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","/**\n * Area chart mark computation.\n *\n * Uses D3 area() generator to produce AreaMark[] with top/bottom\n * boundary points and SVG path strings. Supports single areas and\n * stacked areas via d3-shape stack layout.\n */\n\nimport type { AreaMark, DataRow, Encoding, MarkAria, Rect } from '@opendata-ai/openchart-core';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area, curveMonotoneX, line, stack, stackOffsetNone, stackOrderNone } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, scaleValue, sortByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_FILL_OPACITY = 0.15;\n\n// ---------------------------------------------------------------------------\n// Single area (non-stacked)\n// ---------------------------------------------------------------------------\n\nfunction computeSingleArea(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) return [];\n\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n // Use the domain minimum as the baseline so the area fill doesn't drop\n // below the visible scale range when zero: false excludes 0 from the domain.\n const domain = yScale.domain();\n const baselineY = yScale(Math.min(domain[0], domain[1]));\n\n // Group by color field\n const colorField = encoding.color?.field;\n const groups = new Map<string, DataRow[]>();\n\n if (!colorField) {\n groups.set('__default__', spec.data);\n } else {\n for (const row of spec.data) {\n const key = String(row[colorField] ?? '__default__');\n const existing = groups.get(key);\n if (existing) {\n existing.push(row);\n } else {\n groups.set(key, [row]);\n }\n }\n }\n\n const marks: AreaMark[] = [];\n\n for (const [seriesKey, rows] of groups) {\n const color = getColor(scales, seriesKey);\n\n // Sort rows by x-axis field so areas draw left-to-right\n const sortedRows = sortByField(rows, xChannel.field);\n\n // Compute points, filtering out null values\n const validPoints: { x: number; yTop: number; yBottom: number; row: DataRow }[] = [];\n\n for (const row of sortedRows) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, row[xChannel.field]);\n const yVal = scaleValue(scales.y.scale, scales.y.type, row[yChannel.field]);\n\n if (xVal === null || yVal === null) continue;\n\n validPoints.push({\n x: xVal,\n yTop: yVal,\n yBottom: baselineY,\n row,\n });\n }\n\n if (validPoints.length === 0) continue;\n\n // Build the area path\n const areaGenerator = area<{ x: number; yTop: number; yBottom: number }>()\n .x((d) => d.x)\n .y0((d) => d.yBottom)\n .y1((d) => d.yTop)\n .curve(curveMonotoneX);\n\n const pathStr = areaGenerator(validPoints) ?? '';\n\n // Top-line path for stroking only the data line (not the baseline)\n const topLineGenerator = line<{ x: number; yTop: number }>()\n .x((d) => d.x)\n .y((d) => d.yTop)\n .curve(curveMonotoneX);\n const topPathStr = topLineGenerator(validPoints) ?? '';\n\n const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));\n const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));\n\n const ariaLabel =\n seriesKey === '__default__'\n ? `Area with ${validPoints.length} data points`\n : `${seriesKey}: area with ${validPoints.length} data points`;\n\n const aria: MarkAria = { label: ariaLabel };\n\n marks.push({\n type: 'area',\n topPoints,\n bottomPoints,\n path: pathStr,\n topPath: topPathStr,\n fill: color,\n fillOpacity: DEFAULT_FILL_OPACITY,\n stroke: color,\n strokeWidth: 2,\n seriesKey: seriesKey === '__default__' ? undefined : seriesKey,\n data: validPoints.map((p) => p.row),\n aria,\n });\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Stacked area\n// ---------------------------------------------------------------------------\n\nfunction computeStackedArea(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n const colorField = encoding.color?.field;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y || !colorField) {\n // If no color field, can't stack -- fall back to single area\n return computeSingleArea(spec, scales, chartArea);\n }\n\n // Sort data by x field so stacked areas render left-to-right\n const sortedData = sortByField(spec.data, xChannel.field);\n\n // Collect unique series keys and x values, and build a lookup from\n // (x-value, series-key) -> original data row so stacked area marks\n // get original rows instead of pivot rows.\n const seriesKeys = new Set<string>();\n const xValueSet = new Set<string>();\n const rowsByXSeries = new Map<string, DataRow>();\n const rowsByX = new Map<string, DataRow[]>();\n\n for (const row of sortedData) {\n const xStr = String(row[xChannel.field]);\n const series = String(row[colorField]);\n seriesKeys.add(series);\n xValueSet.add(xStr);\n rowsByXSeries.set(`${xStr}::${series}`, row);\n\n const existing = rowsByX.get(xStr);\n if (existing) {\n existing.push(row);\n } else {\n rowsByX.set(xStr, [row]);\n }\n }\n\n const keys = Array.from(seriesKeys);\n const xValues = Array.from(xValueSet);\n\n // Build a pivot table: one row per x value, one column per series\n const pivotData: Record<string, unknown>[] = xValues.map((xVal) => {\n const pivot: Record<string, unknown> = { __x__: xVal };\n for (const key of keys) {\n pivot[key] = 0;\n }\n // Fill in actual values from pre-grouped data\n const xRows = rowsByX.get(xVal);\n if (xRows) {\n for (const row of xRows) {\n const series = String(row[colorField]);\n pivot[series] = row[yChannel.field] ?? 0;\n }\n }\n return pivot;\n });\n\n // Use d3 stack to compute the stacked layout\n const stackGenerator = stack<Record<string, unknown>>()\n .keys(keys)\n .order(stackOrderNone)\n .offset(stackOffsetNone);\n\n const stackedData = stackGenerator(pivotData);\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n const marks: AreaMark[] = [];\n\n for (const layer of stackedData) {\n const seriesKey = layer.key;\n const color = getColor(scales, seriesKey);\n\n const validPoints: { x: number; yTop: number; yBottom: number }[] = [];\n\n for (const d of layer) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, d.data.__x__);\n\n if (xVal === null) continue;\n\n const yTop = yScale(d[1] as number);\n const yBottom = yScale(d[0] as number);\n\n validPoints.push({ x: xVal, yTop, yBottom });\n }\n\n if (validPoints.length === 0) continue;\n\n const areaGenerator = area<{ x: number; yTop: number; yBottom: number }>()\n .x((p) => p.x)\n .y0((p) => p.yBottom)\n .y1((p) => p.yTop)\n .curve(curveMonotoneX);\n\n const pathStr = areaGenerator(validPoints) ?? '';\n\n const topLineGenerator = line<{ x: number; yTop: number }>()\n .x((p) => p.x)\n .y((p) => p.yTop)\n .curve(curveMonotoneX);\n const topPathStr = topLineGenerator(validPoints) ?? '';\n\n const topPoints = validPoints.map((p) => ({ x: p.x, y: p.yTop }));\n const bottomPoints = validPoints.map((p) => ({ x: p.x, y: p.yBottom }));\n\n const aria: MarkAria = {\n label: `${seriesKey}: stacked area with ${validPoints.length} data points`,\n };\n\n marks.push({\n type: 'area',\n topPoints,\n bottomPoints,\n path: pathStr,\n topPath: topPathStr,\n fill: color,\n fillOpacity: 0.7, // Higher opacity for stacked so layers are visible\n stroke: color,\n strokeWidth: 1,\n seriesKey,\n data: layer.map((d) => {\n const xStr = String(d.data.__x__);\n return (rowsByXSeries.get(`${xStr}::${seriesKey}`) ?? d.data) as Record<string, unknown>;\n }),\n aria,\n });\n }\n\n return marks;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute area marks from a normalized chart spec.\n *\n * For multi-series with color encoding, produces stacked areas.\n * For single series, produces a simple area fill from the line to baseline (y=0).\n */\nexport function computeAreaMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n): AreaMark[] {\n const encoding = spec.encoding as Encoding;\n const hasColor = !!encoding.color;\n\n if (hasColor) {\n return computeStackedArea(spec, scales, chartArea);\n }\n\n return computeSingleArea(spec, scales, chartArea);\n}\n","/**\n * Line chart mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * LineMark[] and PointMark[] arrays for rendering. Groups data by\n * color field for multi-series, uses D3 line() generator for SVG\n * path computation, and handles missing data with line breaks.\n */\n\nimport type {\n DataRow,\n Encoding,\n LayoutStrategy,\n LineMark,\n MarkAria,\n PointMark,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport { curveMonotoneX, line } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor, groupByField, scaleValue, sortByField } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default stroke width for line marks. */\nconst DEFAULT_STROKE_WIDTH = 2.5;\n\n/** Default radius for point marks (hover targets). */\nconst DEFAULT_POINT_RADIUS = 3;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute line marks from a normalized chart spec.\n *\n * Produces one LineMark per series (grouped by color field) plus\n * PointMark entries at each data point for hover targets. Missing\n * data (null/undefined y values) breaks the line path.\n */\nexport function computeLineMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): (LineMark | PointMark)[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const colorField = encoding.color?.field;\n const groups = groupByField(spec.data, colorField);\n const marks: (LineMark | PointMark)[] = [];\n\n for (const [seriesKey, rows] of groups) {\n const color = getColor(scales, seriesKey);\n\n // Sort rows by x-axis field so lines draw left-to-right\n const sortedRows = sortByField(rows, xChannel.field);\n\n // Compute pixel positions for each data point, preserving nulls\n // for line break handling\n const pointsWithData: {\n x: number;\n y: number;\n row: DataRow;\n }[] = [];\n\n // We need to track segments separated by null values\n const segments: { x: number; y: number }[][] = [];\n let currentSegment: { x: number; y: number }[] = [];\n\n for (const row of sortedRows) {\n const xVal = scaleValue(scales.x.scale, scales.x.type, row[xChannel.field]);\n const yVal = scaleValue(scales.y.scale, scales.y.type, row[yChannel.field]);\n\n if (xVal === null || yVal === null) {\n // Break the line here. Push current segment if non-empty.\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n currentSegment = [];\n }\n continue;\n }\n\n const point = { x: xVal, y: yVal };\n currentSegment.push(point);\n pointsWithData.push({ ...point, row });\n }\n\n // Push the last segment\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n }\n\n // Build the D3 line generator with monotone interpolation\n const lineGenerator = line<{ x: number; y: number }>()\n .x((d) => d.x)\n .y((d) => d.y)\n .curve(curveMonotoneX);\n\n // Combine all segments into a single path string with M/L commands.\n // Each segment starts a new M (moveto) command, creating line breaks\n // where data is missing.\n const allPoints: { x: number; y: number }[] = [];\n const pathParts: string[] = [];\n\n for (const segment of segments) {\n if (segment.length === 0) continue;\n const pathStr = lineGenerator(segment);\n if (pathStr) {\n pathParts.push(pathStr);\n }\n allPoints.push(...segment);\n }\n\n // Skip this series if there are no valid data points\n if (allPoints.length === 0) continue;\n\n const ariaLabel =\n seriesKey === '__default__'\n ? `Line with ${allPoints.length} data points`\n : `${seriesKey}: line with ${allPoints.length} data points`;\n\n const aria: MarkAria = {\n label: ariaLabel,\n };\n\n // Combine D3 curve path segments into a single path string.\n // Each segment produces a smooth monotone curve; line breaks between\n // segments are created by starting a new M command.\n const combinedPath = pathParts.join(' ');\n\n // Look up per-series style overrides\n const seriesStyleKey = seriesKey === '__default__' ? undefined : seriesKey;\n const styleOverride = seriesStyleKey ? spec.seriesStyles?.[seriesStyleKey] : undefined;\n\n // Map lineStyle to SVG strokeDasharray\n let strokeDasharray: string | undefined;\n if (styleOverride?.lineStyle === 'dashed') strokeDasharray = '6 4';\n else if (styleOverride?.lineStyle === 'dotted') strokeDasharray = '2 3';\n\n // Create the LineMark with the combined path points.\n // The points array includes all valid points across all segments.\n const lineMark: LineMark = {\n type: 'line',\n points: allPoints,\n path: combinedPath,\n stroke: color,\n strokeWidth: styleOverride?.strokeWidth ?? DEFAULT_STROKE_WIDTH,\n strokeDasharray,\n opacity: styleOverride?.opacity,\n seriesKey: seriesStyleKey,\n data: pointsWithData.map((p) => p.row),\n aria,\n };\n\n marks.push(lineMark);\n\n // Create point marks for hover targets (skip if showPoints is false)\n const showPoints = styleOverride?.showPoints !== false;\n for (let i = 0; i < pointsWithData.length; i++) {\n const p = pointsWithData[i];\n const pointMark: PointMark = {\n type: 'point',\n cx: p.x,\n cy: p.y,\n r: showPoints ? DEFAULT_POINT_RADIUS : 0,\n fill: color,\n stroke: showPoints ? '#ffffff' : 'transparent',\n strokeWidth: showPoints ? 1.5 : 0,\n fillOpacity: 0,\n data: p.row,\n aria: {\n label: `Data point: ${xChannel.field}=${String(p.row[xChannel.field])}, ${yChannel.field}=${String(p.row[yChannel.field])}`,\n },\n };\n marks.push(pointMark);\n }\n }\n\n return marks;\n}\n","/**\n * Line chart label computation.\n *\n * Produces end-of-line labels (series name at the last data point)\n * and feeds them through the core collision engine. At compact\n * breakpoints, labels are suppressed in favor of the legend.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last data point labels per series\n * - 'none': return empty map\n */\n\nimport type {\n LabelCandidate,\n LabelDensity,\n LayoutStrategy,\n LineMark,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default label font size. */\nconst LABEL_FONT_SIZE = 11;\n\n/** Default label font weight. */\nconst LABEL_FONT_WEIGHT = 600;\n\n/** Horizontal offset from last point to label. */\nconst LABEL_OFFSET_X = 6;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute end-of-line labels for line marks.\n *\n * For each series, places a label at the position of the last data point.\n * At compact breakpoints (labelMode === 'none'), all labels are hidden\n * so the legend takes over. Labels go through collision detection to\n * avoid overlap.\n *\n * Returns a Map keyed by seriesKey so callers can look up labels by\n * mark identity instead of relying on positional indices.\n *\n * @param marks - Line marks (only processes marks with type === 'line').\n * @param strategy - Layout strategy from the responsive breakpoint.\n * @param density - Label density mode from spec.labels.density.\n * @returns Map of seriesKey -> ResolvedLabel after collision detection.\n */\nexport function computeLineLabels(\n marks: LineMark[],\n strategy: LayoutStrategy,\n density: LabelDensity = 'auto',\n labelOffsets?: Record<string, { dx?: number; dy?: number }>,\n): Map<string, ResolvedLabel> {\n const result = new Map<string, ResolvedLabel>();\n\n // 'none': no labels\n if (density === 'none') return result;\n\n // At compact breakpoint, suppress inline labels entirely\n if (strategy.labelMode === 'none') {\n return result;\n }\n\n const candidates: LabelCandidate[] = [];\n const seriesOrder: string[] = [];\n\n for (const mark of marks) {\n if (mark.points.length === 0) continue;\n\n const labelText = mark.seriesKey ?? '';\n if (!labelText) continue;\n\n const lastPoint = mark.points[mark.points.length - 1];\n const textWidth = estimateTextWidth(labelText, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n candidates.push({\n text: labelText,\n anchorX: lastPoint.x + LABEL_OFFSET_X,\n anchorY: lastPoint.y - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: mark.stroke,\n lineHeight: 1.2,\n textAnchor: 'start',\n dominantBaseline: 'central',\n },\n });\n\n seriesOrder.push(labelText);\n }\n\n if (candidates.length === 0) return result;\n\n // 'all': skip collision detection, mark everything visible\n if (density === 'all') {\n for (let i = 0; i < candidates.length; i++) {\n const c = candidates[i];\n const seriesKey = seriesOrder[i];\n const userOffset = labelOffsets?.[seriesKey];\n result.set(seriesKey, {\n text: c.text,\n x: c.anchorX + (userOffset?.dx ?? 0),\n y: c.anchorY + (userOffset?.dy ?? 0),\n style: c.style,\n visible: true,\n });\n }\n return result;\n }\n\n // 'endpoints': for line charts, endpoints means showing just the end-of-line\n // label (which is what we already compute). This is the same as 'auto' for lines\n // since we only compute the endpoint label per series.\n\n const resolved = resolveCollisions(candidates);\n for (let i = 0; i < resolved.length; i++) {\n const seriesKey = seriesOrder[i];\n const label = resolved[i];\n // Apply user-provided per-series label offset after collision resolution\n const userOffset = labelOffsets?.[seriesKey];\n if (userOffset) {\n label.x += userOffset.dx ?? 0;\n label.y += userOffset.dy ?? 0;\n }\n result.set(seriesKey, label);\n }\n\n return result;\n}\n","/**\n * Line & area chart module.\n *\n * Exports line and area chart renderers and computation functions.\n */\n\nimport type { LineMark, Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeAreaMarks } from './area';\nimport { computeLineMarks } from './compute';\nimport { computeLineLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Line chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Line chart renderer.\n *\n * Computes line marks + point marks for hover targets, then resolves\n * end-of-line labels and attaches them to the corresponding line marks.\n */\nexport const lineRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const marks = computeLineMarks(spec, scales, chartArea, strategy);\n\n // Extract just the line marks for label computation\n const lineMarks = marks.filter((m): m is LineMark => m.type === 'line');\n\n // Compute and attach labels to line marks by seriesKey lookup\n const labelMap = computeLineLabels(lineMarks, strategy, spec.labels.density, spec.labels.offsets);\n for (const mark of marks) {\n if (mark.type === 'line' && mark.seriesKey) {\n const label = labelMap.get(mark.seriesKey);\n if (label) {\n mark.label = label;\n }\n }\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Area chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Area chart renderer.\n *\n * Computes area fill marks (stacked if multi-series).\n * Also computes line marks for the top boundary and point marks\n * for hover targets, layered on top of the areas.\n */\nexport const areaRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const areas = computeAreaMarks(spec, scales, chartArea);\n const lines = computeLineMarks(spec, scales, chartArea, strategy);\n\n // Areas go first (rendered behind lines), then lines on top\n return [...areas, ...lines] as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeAreaMarks } from './area';\nexport { computeLineMarks } from './compute';\nexport { computeLineLabels } from './labels';\n","/**\n * Pie / donut chart mark computation.\n *\n * Uses d3.pie() for angle calculation and d3.arc() for SVG path\n * generation. Supports sorting by value (largest first), small-slice\n * grouping into \"Other\", and donut variant with inner radius.\n */\n\nimport type {\n ArcMark,\n DataRow,\n Encoding,\n LayoutStrategy,\n MarkAria,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport type { PieArcDatum } from 'd3-shape';\nimport { arc as d3Arc, pie as d3Pie } from 'd3-shape';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Slices smaller than this fraction are grouped into \"Other\". */\nconst SMALL_SLICE_THRESHOLD = 0.03;\n\n/** Default color palette when no color scale is available. */\nconst DEFAULT_PALETTE = [\n '#1b7fa3',\n '#c44e52',\n '#6a9f58',\n '#d47215',\n '#507e79',\n '#9a6a8d',\n '#c4636b',\n '#9c755f',\n '#a88f22',\n '#858078',\n];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface SliceData {\n label: string;\n value: number;\n originalRow: DataRow;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Group small slices (< threshold) into an \"Other\" category. */\nfunction groupSmallSlices(slices: SliceData[], threshold: number): SliceData[] {\n const total = slices.reduce((sum, s) => sum + s.value, 0);\n if (total === 0) return slices;\n\n const big: SliceData[] = [];\n let otherValue = 0;\n\n for (const slice of slices) {\n if (slice.value / total < threshold) {\n otherValue += slice.value;\n } else {\n big.push(slice);\n }\n }\n\n if (otherValue > 0) {\n big.push({\n label: 'Other',\n value: otherValue,\n originalRow: { label: 'Other', value: otherValue },\n });\n }\n\n return big;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute pie or donut arc marks from a normalized chart spec.\n *\n * Extracts category and value from the encoding channels. Categories\n * come from the color field, values from the quantitative y (or x) field.\n * Slices are sorted largest first. Small slices are grouped into \"Other\".\n *\n * @param isDonut - When true, creates a donut with inner radius at 60% of outer.\n */\nexport function computePieMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n _strategy: LayoutStrategy,\n isDonut = false,\n): ArcMark[] {\n const encoding = spec.encoding as Encoding;\n\n // For pie/donut charts, we need a value field (typically y or x) and\n // a category field (typically color). The value field provides the slice sizes.\n const valueChannel = encoding.y ?? encoding.x;\n const categoryField = encoding.color?.field;\n\n if (!valueChannel) return [];\n\n // Build slices from data\n let slices: SliceData[] = [];\n\n if (categoryField) {\n // Aggregate by category\n const categoryTotals = new Map<string, number>();\n const categoryRows = new Map<string, DataRow>();\n\n for (const row of spec.data) {\n const cat = String(row[categoryField] ?? '');\n const val = Number(row[valueChannel.field] ?? 0);\n if (!Number.isFinite(val) || val < 0) continue;\n\n categoryTotals.set(cat, (categoryTotals.get(cat) ?? 0) + val);\n if (!categoryRows.has(cat)) {\n categoryRows.set(cat, row);\n }\n }\n\n for (const [label, value] of categoryTotals) {\n slices.push({\n label,\n value,\n originalRow: categoryRows.get(label) ?? {\n [categoryField]: label,\n [valueChannel.field]: value,\n },\n });\n }\n } else {\n // Each data row is a slice. Use a label field if present, or index.\n for (let i = 0; i < spec.data.length; i++) {\n const row = spec.data[i];\n const val = Number(row[valueChannel.field] ?? 0);\n if (!Number.isFinite(val) || val < 0) continue;\n\n // Try common label fields\n const label = String(row.label ?? row.name ?? row.category ?? `Slice ${i + 1}`);\n\n slices.push({ label, value: val, originalRow: row });\n }\n }\n\n if (slices.length === 0) return [];\n\n // Sort by value descending (largest first)\n slices.sort((a, b) => b.value - a.value);\n\n // Group small slices into \"Other\"\n slices = groupSmallSlices(slices, SMALL_SLICE_THRESHOLD);\n\n // Compute pie layout\n const pieGenerator = d3Pie<SliceData>()\n .value((d) => d.value)\n .sort(null) // Already sorted\n .padAngle(0.01);\n\n const arcs = pieGenerator(slices);\n\n // Compute arc dimensions\n const centerX = chartArea.x + chartArea.width / 2;\n const centerY = chartArea.y + chartArea.height / 2;\n const outerRadius = (Math.min(chartArea.width, chartArea.height) / 2) * 0.85;\n const innerRadius = isDonut ? outerRadius * 0.6 : 0;\n\n const arcGenerator = d3Arc<PieArcDatum<SliceData>>()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius);\n\n // Build arc marks\n const marks: ArcMark[] = [];\n const center = { x: centerX, y: centerY };\n const total = slices.reduce((sum, s) => sum + s.value, 0);\n\n for (let i = 0; i < arcs.length; i++) {\n const arcDatum = arcs[i];\n const slice = arcDatum.data;\n\n // Get color from scale or default palette\n let color: string;\n if (scales.color && categoryField) {\n const colorScale = scales.color.scale as (v: string) => string;\n color = colorScale(slice.label);\n } else {\n color = DEFAULT_PALETTE[i % DEFAULT_PALETTE.length];\n }\n\n // Generate SVG path (relative to 0,0; renderer wraps in translate)\n const path = arcGenerator(arcDatum) ?? '';\n\n // Compute centroid (for label positioning), offset to chart center\n const centroidResult = arcGenerator.centroid(arcDatum);\n\n const percentage = total > 0 ? ((slice.value / total) * 100).toFixed(1) : '0';\n\n const aria: MarkAria = {\n label: `${slice.label}: ${slice.value} (${percentage}%)`,\n };\n\n marks.push({\n type: 'arc',\n path,\n centroid: {\n x: centroidResult[0] + centerX,\n y: centroidResult[1] + centerY,\n },\n center,\n innerRadius,\n outerRadius,\n startAngle: arcDatum.startAngle,\n endAngle: arcDatum.endAngle,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 2,\n data: slice.originalRow as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Pie/donut chart label computation.\n *\n * Produces leader-line labels positioned outside each arc slice.\n * Labels are placed at the midpoint of each arc's angle, extended\n * outward from the centroid. Collision detection resolves overlaps.\n *\n * Respects the spec's label density setting:\n * - 'all': show every label, skip collision detection\n * - 'auto': existing behavior (collision detection)\n * - 'endpoints': first and last slices only\n * - 'none': return empty array\n */\n\nimport type {\n ArcMark,\n LabelCandidate,\n LabelDensity,\n Rect,\n ResolvedLabel,\n} from '@opendata-ai/openchart-core';\nimport { estimateTextWidth, resolveCollisions } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LABEL_FONT_SIZE = 10;\nconst LABEL_FONT_WEIGHT = 500;\nconst LEADER_LINE_OFFSET = 12;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute leader-line labels for pie/donut arc marks.\n *\n * Each label is positioned outward from the arc centroid with a connector\n * line from the centroid to the label. Labels go through collision\n * detection to avoid overlap.\n */\nexport function computePieLabels(\n marks: ArcMark[],\n _chartArea: Rect,\n density: LabelDensity = 'auto',\n _textFill = '#333333',\n): ResolvedLabel[] {\n if (marks.length === 0) return [];\n\n // 'none': no labels at all\n if (density === 'none') return [];\n\n // Get the pie center from the first mark's center property\n const centerX = marks[0].center.x;\n const centerY = marks[0].center.y;\n\n // Filter marks for 'endpoints' density\n const targetMarks =\n density === 'endpoints' && marks.length > 1 ? [marks[0], marks[marks.length - 1]] : marks;\n\n const candidates: LabelCandidate[] = [];\n const targetMarkIndices: number[] = [];\n\n for (let mi = 0; mi < targetMarks.length; mi++) {\n const mark = targetMarks[mi];\n // Extract the label text (category name) from the aria label.\n // Format is \"Category: value (percent%)\". Split on the first colon\n // to handle category names that might contain colons.\n const ariaLabel = mark.aria.label;\n const firstColon = ariaLabel.indexOf(':');\n const labelText = firstColon >= 0 ? ariaLabel.slice(0, firstColon).trim() : '';\n if (!labelText) continue;\n\n const textWidth = estimateTextWidth(labelText, LABEL_FONT_SIZE, LABEL_FONT_WEIGHT);\n const textHeight = LABEL_FONT_SIZE * 1.2;\n\n // Position label outward from centroid\n const midAngle = (mark.startAngle + mark.endAngle) / 2;\n const labelRadius = mark.outerRadius + LEADER_LINE_OFFSET;\n\n const labelX = centerX + Math.sin(midAngle) * labelRadius;\n const labelY = centerY - Math.cos(midAngle) * labelRadius;\n\n // Determine text anchor based on which side of the pie the label is on\n const isRight = Math.sin(midAngle) > 0;\n\n candidates.push({\n text: labelText,\n anchorX: isRight ? labelX : labelX - textWidth,\n anchorY: labelY - textHeight / 2,\n width: textWidth,\n height: textHeight,\n priority: 'data',\n style: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: LABEL_FONT_SIZE,\n fontWeight: LABEL_FONT_WEIGHT,\n fill: _textFill,\n lineHeight: 1.2,\n textAnchor: isRight ? 'start' : 'end',\n dominantBaseline: 'central',\n },\n });\n\n targetMarkIndices.push(mi);\n }\n\n if (candidates.length === 0) return [];\n\n // 'all': skip collision detection, mark everything visible\n let resolved: ResolvedLabel[];\n if (density === 'all') {\n resolved = candidates.map((c) => ({\n text: c.text,\n x: c.anchorX,\n y: c.anchorY,\n style: c.style,\n visible: true,\n }));\n } else {\n // Run collision detection\n resolved = resolveCollisions(candidates);\n }\n\n // Add connector lines from centroid to label\n for (let i = 0; i < resolved.length && i < targetMarks.length; i++) {\n const label = resolved[i];\n const mark = targetMarks[i];\n\n if (label.visible) {\n label.connector = {\n from: { x: label.x, y: label.y },\n to: { x: mark.centroid.x, y: mark.centroid.y },\n stroke: _textFill,\n style: 'straight',\n };\n }\n }\n\n return resolved;\n}\n","/**\n * Pie and donut chart module.\n *\n * Exports pie and donut chart renderers and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computePieMarks } from './compute';\nimport { computePieLabels } from './labels';\n\n// ---------------------------------------------------------------------------\n// Pie chart renderer\n// ---------------------------------------------------------------------------\n\nexport const pieRenderer: ChartRenderer = (spec, scales, chartArea, strategy, theme) => {\n const marks = computePieMarks(spec, scales, chartArea, strategy, false);\n\n // Compute and attach labels (respects spec.labels.density)\n const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Donut chart renderer\n// ---------------------------------------------------------------------------\n\nexport const donutRenderer: ChartRenderer = (spec, scales, chartArea, strategy, theme) => {\n const marks = computePieMarks(spec, scales, chartArea, strategy, true);\n\n // Compute and attach labels (respects spec.labels.density)\n const labels = computePieLabels(marks, chartArea, spec.labels.density, theme.colors.text);\n for (let i = 0; i < marks.length && i < labels.length; i++) {\n marks[i].label = labels[i];\n }\n\n return marks as Mark[];\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computePieMarks } from './compute';\nexport { computePieLabels } from './labels';\n","/**\n * Chart renderer registry.\n *\n * Each chart type (line, bar, column, scatter, pie, donut, dot) registers\n * a renderer that produces marks from normalized specs and resolved scales.\n * The registry pattern decouples chart-type logic from the compile pipeline.\n */\n\nimport type { LayoutStrategy, Mark, Rect, ResolvedTheme } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\nimport type { ResolvedScales } from '../layout/scales';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A chart renderer function.\n *\n * Takes a normalized spec, resolved scales, chart area, layout strategy,\n * and the resolved theme for theme-aware styling (e.g. label colors).\n * Returns an array of marks to render.\n */\nexport type ChartRenderer = (\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n) => Mark[];\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst renderers = new Map<string, ChartRenderer>();\n\n/**\n * Register a chart renderer for a specific chart type.\n *\n * @param type - Chart type string (e.g. \"line\", \"bar\").\n * @param renderer - The renderer function.\n */\nexport function registerChartRenderer(type: string, renderer: ChartRenderer): void {\n renderers.set(type, renderer);\n}\n\n/**\n * Get the registered chart renderer for a type.\n *\n * @param type - Chart type string.\n * @returns The renderer, or undefined if no renderer is registered.\n */\nexport function getChartRenderer(type: string): ChartRenderer | undefined {\n return renderers.get(type);\n}\n\n/**\n * Clear all registered renderers. Useful for testing.\n */\nexport function clearRenderers(): void {\n renderers.clear();\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if (!isFinite(x) || x === 0) return null; // NaN, ±Infinity, ±0\n var i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\"), coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return prefixExponent = undefined, x.toPrecision(p);\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier, options) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = (options && options.prefix !== undefined ? options.prefix : \"\") + (symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\"),\n suffix = (symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\") + (options && options.suffix !== undefined ? options.suffix : \"\");\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" && !isNaN(value) && prefixExponent !== undefined ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier), {suffix: prefixes[8 + e / 3]});\n return function(value) {\n return f(k * value);\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","export default function nice(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","import {ticks} from \"d3-array\";\nimport {format, formatSpecifier} from \"d3-format\";\nimport nice from \"./nice.js\";\nimport {copy, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformLog(x) {\n return Math.log(x);\n}\n\nfunction transformExp(x) {\n return Math.exp(x);\n}\n\nfunction transformLogn(x) {\n return -Math.log(-x);\n}\n\nfunction transformExpn(x) {\n return -Math.exp(-x);\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : x => Math.pow(base, x);\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), x => Math.log(x) / base);\n}\n\nfunction reflect(f) {\n return (x, k) => -f(-x, k);\n}\n\nexport function loggish(transform) {\n const scale = transform(transformLog, transformExp);\n const domain = scale.domain;\n let base = 10;\n let logs;\n let pows;\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) {\n logs = reflect(logs), pows = reflect(pows);\n transform(transformLogn, transformExpn);\n } else {\n transform(transformLog, transformExp);\n }\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = count => {\n const d = domain();\n let u = d[0];\n let v = d[d.length - 1];\n const r = v < u;\n\n if (r) ([u, v] = [v, u]);\n\n let i = logs(u);\n let j = logs(v);\n let k;\n let t;\n const n = count == null ? 10 : +count;\n let z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.floor(i), j = Math.ceil(j);\n if (u > 0) for (; i <= j; ++i) {\n for (k = 1; k < base; ++k) {\n t = i < 0 ? k / pows(-i) : k * pows(i);\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i <= j; ++i) {\n for (k = base - 1; k >= 1; --k) {\n t = i > 0 ? k / pows(-i) : k * pows(i);\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n if (z.length * 2 < n) z = ticks(u, v, n);\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = (count, specifier) => {\n if (count == null) count = 10;\n if (specifier == null) specifier = base === 10 ? \"s\" : \",\";\n if (typeof specifier !== \"function\") {\n if (!(base % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true;\n specifier = format(specifier);\n }\n if (count === Infinity) return specifier;\n const k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return d => {\n let i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = () => {\n return domain(nice(domain(), {\n floor: x => pows(Math.floor(logs(x))),\n ceil: x => pows(Math.ceil(logs(x)))\n }));\n };\n\n return scale;\n}\n\nexport default function log() {\n const scale = loggish(transformer()).domain([1, 10]);\n scale.copy = () => copy(scale, log()).base(scale.base());\n initRange.apply(scale, arguments);\n return scale;\n}\n","import {linearish} from \"./linear.js\";\nimport {copy, identity, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeTicks, timeTickInterval} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport nice from \"./nice.js\";\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n var scale = continuous(),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval) {\n var d = domain();\n if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n return interval ? domain(nice(d, interval)) : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n };\n\n return scale;\n}\n\nexport default function time() {\n return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n","import {interpolate, interpolateRound} from \"d3-interpolate\";\nimport {identity} from \"./continuous.js\";\nimport {initInterpolator} from \"./init.js\";\nimport {linearish} from \"./linear.js\";\nimport {loggish} from \"./log.js\";\nimport {symlogish} from \"./symlog.js\";\nimport {powish} from \"./pow.js\";\n\nfunction transformer() {\n var x0 = 0,\n x1 = 1,\n t0,\n t1,\n k10,\n transform,\n interpolator = identity,\n clamp = false,\n unknown;\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n\n scale.domain = function(_) {\n return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n function range(interpolate) {\n return function(_) {\n var r0, r1;\n return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n };\n }\n\n scale.range = range(interpolate);\n\n scale.rangeRound = range(interpolateRound);\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t) {\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n return scale;\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .interpolator(source.interpolator())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport default function sequential() {\n var scale = linearish(transformer()(identity));\n\n scale.copy = function() {\n return copy(scale, sequential());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialLog() {\n var scale = loggish(transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return copy(scale, sequentialLog()).base(scale.base());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSymlog() {\n var scale = symlogish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialSymlog()).constant(scale.constant());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialPow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialPow()).exponent(scale.exponent());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSqrt() {\n return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n","/**\n * Scatter / bubble chart mark computation.\n *\n * Takes a normalized chart spec with resolved scales and produces\n * PointMark[] for rendering scatter plots. Both axes are quantitative.\n * Optional size encoding produces area-proportional bubbles via sqrt\n * scaling, and color encoding groups points by category.\n */\n\nimport type {\n Encoding,\n LayoutStrategy,\n MarkAria,\n PointMark,\n Rect,\n} from '@opendata-ai/openchart-core';\nimport { max, min } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleSqrt } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../../compiler/types';\nimport type { ResolvedScales } from '../../layout/scales';\nimport { getColor } from '../utils';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_POINT_RADIUS = 5;\nconst MIN_BUBBLE_RADIUS = 3;\nconst MAX_BUBBLE_RADIUS = 30;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute scatter/bubble marks from a normalized chart spec.\n *\n * Both x and y are quantitative (linear scales). Optional size encoding\n * maps a data field to point radius using sqrt scale (area-proportional).\n * Optional color encoding groups points by category with distinct colors.\n */\nexport function computeScatterMarks(\n spec: NormalizedChartSpec,\n scales: ResolvedScales,\n _chartArea: Rect,\n _strategy: LayoutStrategy,\n): PointMark[] {\n const encoding = spec.encoding as Encoding;\n const xChannel = encoding.x;\n const yChannel = encoding.y;\n\n if (!xChannel || !yChannel || !scales.x || !scales.y) {\n return [];\n }\n\n const xScale = scales.x.scale as ScaleLinear<number, number>;\n const yScale = scales.y.scale as ScaleLinear<number, number>;\n\n const colorField = encoding.color?.field;\n const sizeField = encoding.size?.field;\n\n // Build a size scale for bubble variant\n let sizeScale: ((v: number) => number) | undefined;\n if (sizeField) {\n const sizeValues = spec.data.map((d) => Number(d[sizeField])).filter((v) => Number.isFinite(v));\n\n const sizeMin = min(sizeValues) ?? 0;\n const sizeMax = max(sizeValues) ?? 1;\n\n sizeScale = scaleSqrt()\n .domain([sizeMin, sizeMax])\n .range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS]);\n }\n\n const marks: PointMark[] = [];\n\n for (const row of spec.data) {\n const xVal = Number(row[xChannel.field]);\n const yVal = Number(row[yChannel.field]);\n\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) continue;\n\n const cx = xScale(xVal);\n const cy = yScale(yVal);\n\n const category = colorField ? String(row[colorField] ?? '') : undefined;\n const color = getColor(scales, category ?? '__default__');\n\n let radius = DEFAULT_POINT_RADIUS;\n if (sizeScale && sizeField) {\n const sizeVal = Number(row[sizeField]);\n if (Number.isFinite(sizeVal)) {\n radius = sizeScale(sizeVal);\n }\n }\n\n const labelParts = [`${xChannel.field}=${xVal}`, `${yChannel.field}=${yVal}`];\n if (category) labelParts.push(`${colorField}=${category}`);\n if (sizeField && row[sizeField] != null) {\n labelParts.push(`${sizeField}=${row[sizeField]}`);\n }\n\n const aria: MarkAria = {\n label: `Data point: ${labelParts.join(', ')}`,\n };\n\n marks.push({\n type: 'point',\n cx,\n cy,\n r: radius,\n fill: color,\n stroke: '#ffffff',\n strokeWidth: 1,\n fillOpacity: 0.7,\n data: row as Record<string, unknown>,\n aria,\n });\n }\n\n return marks;\n}\n","/**\n * Trend line computation for scatter plots.\n *\n * Computes a simple linear regression (least squares) over the\n * point marks and returns a LineMark representing the best-fit line.\n */\n\nimport type { LineMark, MarkAria, PointMark } from '@opendata-ai/openchart-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TRENDLINE_COLOR = '#666666';\nconst TRENDLINE_STROKE_WIDTH = 1.5;\nconst TRENDLINE_DASH = '6 4';\n\n// ---------------------------------------------------------------------------\n// Linear regression\n// ---------------------------------------------------------------------------\n\n/**\n * Compute slope and intercept for a simple linear regression.\n * Returns null if there aren't enough points or variance is zero.\n */\nfunction linearRegression(\n points: { x: number; y: number }[],\n): { slope: number; intercept: number } | null {\n const n = points.length;\n if (n < 2) return null;\n\n let sumX = 0;\n let sumY = 0;\n let sumXY = 0;\n let sumXX = 0;\n\n for (const p of points) {\n sumX += p.x;\n sumY += p.y;\n sumXY += p.x * p.y;\n sumXX += p.x * p.x;\n }\n\n const denominator = n * sumXX - sumX * sumX;\n if (denominator === 0) return null;\n\n const slope = (n * sumXY - sumX * sumY) / denominator;\n const intercept = (sumY - slope * sumX) / n;\n\n return { slope, intercept };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute a trend line (linear regression) over scatter point marks.\n *\n * Returns a single LineMark spanning the x-range of the data points,\n * rendered as a dashed line. Returns null if regression can't be computed.\n */\nexport function computeTrendLine(marks: PointMark[]): LineMark | null {\n if (marks.length < 2) return null;\n\n const points = marks.map((m) => ({ x: m.cx, y: m.cy }));\n const result = linearRegression(points);\n if (!result) return null;\n\n const { slope, intercept } = result;\n\n // Find x range from marks\n let minX = Infinity;\n let maxX = -Infinity;\n for (const m of marks) {\n if (m.cx < minX) minX = m.cx;\n if (m.cx > maxX) maxX = m.cx;\n }\n\n // Compute y values at the endpoints\n const y1 = slope * minX + intercept;\n const y2 = slope * maxX + intercept;\n\n const aria: MarkAria = {\n label: `Trend line: linear regression`,\n };\n\n return {\n type: 'line',\n points: [\n { x: minX, y: y1 },\n { x: maxX, y: y2 },\n ],\n stroke: TRENDLINE_COLOR,\n strokeWidth: TRENDLINE_STROKE_WIDTH,\n strokeDasharray: TRENDLINE_DASH,\n data: [],\n aria,\n };\n}\n","/**\n * Scatter / bubble chart module.\n *\n * Exports the scatter chart renderer and computation functions.\n */\n\nimport type { Mark } from '@opendata-ai/openchart-core';\nimport type { ChartRenderer } from '../registry';\nimport { computeScatterMarks } from './compute';\nimport { computeTrendLine } from './trendline';\n\n// ---------------------------------------------------------------------------\n// Scatter chart renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Scatter chart renderer.\n *\n * Produces point marks for each data point, optionally with size encoding\n * for bubbles and a trend line overlay.\n */\nexport const scatterRenderer: ChartRenderer = (spec, scales, chartArea, strategy, _theme) => {\n const pointMarks = computeScatterMarks(spec, scales, chartArea, strategy);\n const marks: Mark[] = [...pointMarks];\n\n // Add trend line if there are enough points\n const trendLine = computeTrendLine(pointMarks);\n if (trendLine) {\n // Trend line goes behind points\n marks.unshift(trendLine);\n }\n\n return marks;\n};\n\n// ---------------------------------------------------------------------------\n// Public exports\n// ---------------------------------------------------------------------------\n\nexport { computeScatterMarks } from './compute';\nexport { computeTrendLine } from './trendline';\n","/**\n * Spec normalization: fill in defaults and infer types.\n *\n * Takes a validated VizSpec and produces a NormalizedSpec where:\n * - All optional fields have sensible defaults\n * - Chrome strings are converted to ChromeText objects\n * - Encoding types are inferred from data if not specified\n * - Annotations have default styles\n */\n\nimport type {\n Annotation,\n ChartSpec,\n Chrome,\n ChromeText,\n DataRow,\n Encoding,\n FieldType,\n GraphSpec,\n TableSpec,\n VizSpec,\n} from '@opendata-ai/openchart-core';\nimport { isChartSpec, isGraphSpec, isTableSpec } from '@opendata-ai/openchart-core';\n\nimport type {\n NormalizedChartSpec,\n NormalizedChrome,\n NormalizedGraphSpec,\n NormalizedSpec,\n NormalizedTableSpec,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Chrome normalization\n// ---------------------------------------------------------------------------\n\n/** Convert a string | ChromeText | undefined to ChromeText | undefined. */\nfunction normalizeChromeField(value: string | ChromeText | undefined): ChromeText | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return { text: value };\n return value;\n}\n\n/** Normalize all chrome fields from strings to ChromeText objects. */\nfunction normalizeChrome(chrome: Chrome | undefined): NormalizedChrome {\n if (!chrome) return {};\n return {\n title: normalizeChromeField(chrome.title),\n subtitle: normalizeChromeField(chrome.subtitle),\n source: normalizeChromeField(chrome.source),\n byline: normalizeChromeField(chrome.byline),\n footer: normalizeChromeField(chrome.footer),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Type inference\n// ---------------------------------------------------------------------------\n\n/** Sample values from a data column and infer the field type. */\nfunction inferFieldType(data: DataRow[], field: string): FieldType {\n // Sample up to 10 rows\n const sampleSize = Math.min(10, data.length);\n let numericCount = 0;\n let dateCount = 0;\n let totalNonNull = 0;\n\n for (let i = 0; i < sampleSize; i++) {\n const value = data[i][field];\n if (value == null) continue;\n totalNonNull++;\n\n // Check numeric\n if (typeof value === 'number' && Number.isFinite(value)) {\n numericCount++;\n continue;\n }\n\n // Check date-like strings\n if (typeof value === 'string') {\n // Try as number first\n const num = Number(value);\n if (!Number.isNaN(num) && Number.isFinite(num) && value.trim() !== '') {\n numericCount++;\n continue;\n }\n\n // Try as date\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n dateCount++;\n continue;\n }\n }\n\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n dateCount++;\n }\n }\n\n if (totalNonNull === 0) return 'nominal';\n\n // If >80% of sampled values are dates, it's temporal\n if (dateCount / totalNonNull > 0.8) return 'temporal';\n // If >80% are numeric, it's quantitative\n if (numericCount / totalNonNull > 0.8) return 'quantitative';\n // Otherwise it's nominal\n return 'nominal';\n}\n\n/** Infer types for encoding channels that don't have one specified. */\nfunction inferEncodingTypes(encoding: Encoding, data: DataRow[], warnings: string[]): Encoding {\n const result = { ...encoding };\n\n for (const channel of ['x', 'y', 'color', 'size', 'detail'] as const) {\n const spec = result[channel];\n if (!spec) continue;\n\n if (!spec.type) {\n const inferred = inferFieldType(data, spec.field);\n result[channel] = { ...spec, type: inferred };\n warnings.push(\n `Inferred encoding.${channel}.type as \"${inferred}\" from data values for field \"${spec.field}\"`,\n );\n } else {\n // Check for potential mismatches and warn\n const actualType = inferFieldType(data, spec.field);\n if (spec.type === 'nominal' && actualType === 'temporal') {\n warnings.push(`Field \"${spec.field}\" looks temporal but was declared as nominal`);\n }\n if (spec.type === 'nominal' && actualType === 'quantitative') {\n warnings.push(`Field \"${spec.field}\" looks quantitative but was declared as nominal`);\n }\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Annotation normalization\n// ---------------------------------------------------------------------------\n\n/** Apply default styles to annotations that don't have them. */\nfunction normalizeAnnotations(annotations: Annotation[] | undefined): Annotation[] {\n if (!annotations || annotations.length === 0) return [];\n\n return annotations.map((ann) => {\n switch (ann.type) {\n case 'text':\n return {\n ...ann,\n fontSize: ann.fontSize ?? 12,\n fontWeight: ann.fontWeight ?? 400,\n opacity: ann.opacity ?? 1,\n };\n case 'range':\n return {\n ...ann,\n opacity: ann.opacity ?? 0.1,\n fill: ann.fill ?? '#000000',\n };\n case 'refline':\n return {\n ...ann,\n style: ann.style ?? 'dashed',\n strokeWidth: ann.strokeWidth ?? 1,\n stroke: ann.stroke ?? '#666666',\n opacity: ann.opacity ?? 0.8,\n };\n default:\n return ann;\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Spec-level normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeChartSpec(spec: ChartSpec, warnings: string[]): NormalizedChartSpec {\n const encoding = inferEncodingTypes(spec.encoding, spec.data, warnings);\n\n return {\n type: spec.type,\n data: spec.data,\n encoding,\n chrome: normalizeChrome(spec.chrome),\n annotations: normalizeAnnotations(spec.annotations),\n labels: {\n density: spec.labels?.density ?? 'auto',\n format: spec.labels?.format ?? '',\n offsets: spec.labels?.offsets,\n },\n legend: spec.legend,\n responsive: spec.responsive ?? true,\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n hiddenSeries: spec.hiddenSeries ?? [],\n seriesStyles: spec.seriesStyles ?? {},\n };\n}\n\nfunction normalizeTableSpec(spec: TableSpec, _warnings: string[]): NormalizedTableSpec {\n return {\n type: 'table',\n data: spec.data,\n columns: spec.columns,\n rowKey: spec.rowKey,\n chrome: normalizeChrome(spec.chrome),\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n search: spec.search ?? false,\n pagination: spec.pagination ?? false,\n stickyFirstColumn: spec.stickyFirstColumn ?? false,\n compact: spec.compact ?? false,\n responsive: spec.responsive ?? true,\n };\n}\n\nfunction normalizeGraphSpec(spec: GraphSpec, _warnings: string[]): NormalizedGraphSpec {\n // Default layout with chargeStrength and linkDistance\n const defaultLayout = {\n type: 'force' as const,\n chargeStrength: -300,\n linkDistance: 30,\n };\n const layout = spec.layout\n ? {\n ...defaultLayout,\n ...spec.layout,\n }\n : defaultLayout;\n\n return {\n type: 'graph',\n nodes: spec.nodes,\n edges: spec.edges,\n encoding: spec.encoding ?? {},\n layout,\n nodeOverrides: spec.nodeOverrides,\n chrome: normalizeChrome(spec.chrome),\n annotations: normalizeAnnotations(spec.annotations),\n theme: spec.theme ?? {},\n darkMode: spec.darkMode ?? 'off',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a validated VizSpec, filling in all defaults.\n *\n * @param spec - A validated VizSpec (must pass validateSpec first).\n * @param warnings - Mutable array to collect non-fatal warnings.\n * @returns A NormalizedSpec with all optionals filled.\n */\nexport function normalizeSpec(spec: VizSpec, warnings: string[] = []): NormalizedSpec {\n if (isChartSpec(spec)) {\n return normalizeChartSpec(spec, warnings);\n }\n if (isTableSpec(spec)) {\n return normalizeTableSpec(spec, warnings);\n }\n if (isGraphSpec(spec)) {\n return normalizeGraphSpec(spec, warnings);\n }\n // Should never happen after validation\n throw new Error(`Unknown spec type: ${(spec as Record<string, unknown>).type}`);\n}\n","/**\n * Runtime spec validation.\n *\n * TypeScript catches compile-time errors for specs written in code.\n * This module catches runtime errors for specs coming from JSON, APIs,\n * or Claude-generated output where the TypeScript compiler can't help.\n *\n * Every error includes a machine-readable code and an actionable suggestion\n * so consumers (and LLMs) can fix issues programmatically.\n */\n\nimport {\n CHART_ENCODING_RULES,\n CHART_TYPES,\n type ChartType,\n type FieldType,\n type VizSpec,\n} from '@opendata-ai/openchart-core';\n\nimport type { ValidationError, ValidationResult } from './types';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst VALID_FIELD_TYPES = new Set<string>(['quantitative', 'temporal', 'nominal', 'ordinal']);\n\nconst VALID_DARK_MODES = new Set<string>(['auto', 'force', 'off']);\n\n/** Check if a value looks like a parseable date. */\nfunction isParseableDate(value: unknown): boolean {\n if (value instanceof Date) return !Number.isNaN(value.getTime());\n if (typeof value === 'string') {\n const d = new Date(value);\n return !Number.isNaN(d.getTime());\n }\n if (typeof value === 'number') return true;\n return false;\n}\n\n/** Check if a value is numeric. */\nfunction isNumeric(value: unknown): boolean {\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value === 'string') {\n const n = Number(value);\n return !Number.isNaN(n) && Number.isFinite(n);\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Chart validation\n// ---------------------------------------------------------------------------\n\nfunction validateChartSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n const chartType = spec.type as ChartType;\n\n // Check data\n if (!Array.isArray(spec.data)) {\n errors.push({\n message: 'Spec error: \"data\" must be an array',\n path: 'data',\n code: 'INVALID_TYPE',\n suggestion: 'Provide data as an array of objects, e.g. data: [{ x: 1, y: 2 }]',\n });\n return; // Can't validate further without data\n }\n\n if (spec.data.length === 0) {\n errors.push({\n message: 'Spec error: \"data\" must be a non-empty array',\n path: 'data',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one data row, e.g. data: [{ x: 1, y: 2 }]',\n });\n return;\n }\n\n // Validate data entries are objects\n const firstRow = spec.data[0] as unknown;\n if (typeof firstRow !== 'object' || firstRow === null || Array.isArray(firstRow)) {\n errors.push({\n message: 'Spec error: each item in \"data\" must be a plain object',\n path: 'data[0]',\n code: 'INVALID_TYPE',\n suggestion:\n 'Each data item should be an object with key-value pairs, e.g. { name: \"Alice\", value: 10 }',\n });\n return;\n }\n\n // Check encoding exists\n if (!spec.encoding || typeof spec.encoding !== 'object') {\n const rules = CHART_ENCODING_RULES[chartType];\n const requiredChannels = Object.entries(rules)\n .filter(([, rule]) => rule.required)\n .map(([ch]) => ch);\n errors.push({\n message: `Spec error: ${chartType} chart requires an \"encoding\" object`,\n path: 'encoding',\n code: 'MISSING_FIELD',\n suggestion: `Add an encoding object with required channels: ${requiredChannels.join(', ')}. Example: encoding: { ${requiredChannels.map((ch) => `${ch}: { field: \"...\", type: \"...\" }`).join(', ')} }`,\n });\n return;\n }\n\n const rules = CHART_ENCODING_RULES[chartType];\n const encoding = spec.encoding as Record<string, unknown>;\n const dataColumns = new Set(Object.keys(firstRow as Record<string, unknown>));\n const availableColumns = [...dataColumns].join(', ');\n\n // Validate required channels\n for (const [channel, rule] of Object.entries(rules)) {\n if (rule.required && !encoding[channel]) {\n const allowedTypes = rule.allowedTypes.join(' or ');\n errors.push({\n message: `Spec error: ${chartType} chart requires encoding.${channel} but none was provided`,\n path: `encoding.${channel}`,\n code: 'MISSING_FIELD',\n suggestion: `Add encoding.${channel} with a field from your data (${availableColumns}) and type (${allowedTypes}). Example: ${channel}: { field: \"${[...dataColumns][0] ?? 'myField'}\", type: \"${rule.allowedTypes[0]}\" }`,\n });\n }\n }\n\n // Validate provided channels\n for (const [channel, channelSpec] of Object.entries(encoding)) {\n if (!channelSpec || typeof channelSpec !== 'object') continue;\n\n const channelObj = channelSpec as Record<string, unknown>;\n const channelRule = rules[channel as keyof typeof rules];\n\n // Check field exists\n if (!channelObj.field || typeof channelObj.field !== 'string') {\n errors.push({\n message: `Spec error: encoding.${channel} must have a \"field\" string`,\n path: `encoding.${channel}.field`,\n code: 'MISSING_FIELD',\n suggestion: `Add a field name from your data columns: ${availableColumns}`,\n });\n continue;\n }\n\n // Check field references a column in data\n if (!dataColumns.has(channelObj.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${channelObj.field}\" does not exist in data. Available columns: ${availableColumns}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the available data columns: ${availableColumns}`,\n });\n }\n\n // Check field type is valid\n if (channelObj.type && !VALID_FIELD_TYPES.has(channelObj.type as string)) {\n errors.push({\n message: `Spec error: encoding.${channel}.type \"${channelObj.type}\" is not valid. Must be one of: ${[...VALID_FIELD_TYPES].join(', ')}`,\n path: `encoding.${channel}.type`,\n code: 'INVALID_VALUE',\n suggestion: `Use one of: ${[...VALID_FIELD_TYPES].join(', ')}`,\n });\n }\n\n // Check field type is allowed for this channel\n if (channelRule && channelObj.type && channelRule.allowedTypes.length > 0) {\n if (!channelRule.allowedTypes.includes(channelObj.type as FieldType)) {\n errors.push({\n message: `Spec error: encoding.${channel} for ${chartType} chart does not accept type \"${channelObj.type}\". Allowed types: ${channelRule.allowedTypes.join(', ')}`,\n path: `encoding.${channel}.type`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Change encoding.${channel}.type to one of: ${channelRule.allowedTypes.join(', ')}`,\n });\n }\n }\n\n // Check field values match declared type\n if (channelObj.type && channelObj.field && dataColumns.has(channelObj.field as string)) {\n const data = spec.data as Record<string, unknown>[];\n const fieldName = channelObj.field as string;\n const fieldType = channelObj.type as string;\n // Sample up to 5 values for type checking\n const sampleSize = Math.min(5, data.length);\n\n if (fieldType === 'temporal') {\n let nonDateCount = 0;\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][fieldName];\n if (val != null && !isParseableDate(val)) {\n nonDateCount++;\n }\n }\n if (nonDateCount > 0) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${fieldName}\" is declared as temporal but contains non-date values`,\n path: `encoding.${channel}`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Either change the type to \"nominal\" or ensure \"${fieldName}\" values are parseable dates (ISO 8601 strings like \"2024-01-15\" or Date objects)`,\n });\n }\n }\n\n if (fieldType === 'quantitative') {\n let nonNumericCount = 0;\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][fieldName];\n if (val != null && !isNumeric(val)) {\n nonNumericCount++;\n }\n }\n if (nonNumericCount > 0) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${fieldName}\" is declared as quantitative but contains non-numeric values`,\n path: `encoding.${channel}`,\n code: 'ENCODING_MISMATCH',\n suggestion: `Either change the type to \"nominal\" or ensure \"${fieldName}\" values are numbers`,\n });\n }\n }\n }\n }\n\n // Validate darkMode if provided\n if (spec.darkMode !== undefined && !VALID_DARK_MODES.has(spec.darkMode as string)) {\n errors.push({\n message: `Spec error: darkMode must be \"auto\", \"force\", or \"off\"`,\n path: 'darkMode',\n code: 'INVALID_VALUE',\n suggestion:\n 'Use one of: \"auto\" (system preference), \"force\" (always dark), or \"off\" (always light)',\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Table validation\n// ---------------------------------------------------------------------------\n\nfunction validateTableSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n if (!Array.isArray(spec.data)) {\n errors.push({\n message: 'Spec error: \"data\" must be an array',\n path: 'data',\n code: 'INVALID_TYPE',\n suggestion: 'Provide data as an array of objects, e.g. data: [{ name: \"Alice\", age: 30 }]',\n });\n return;\n }\n\n if (spec.data.length === 0) {\n errors.push({\n message: 'Spec error: \"data\" must be a non-empty array',\n path: 'data',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one data row to the data array',\n });\n return;\n }\n\n if (!Array.isArray(spec.columns)) {\n errors.push({\n message: 'Spec error: table spec requires a \"columns\" array',\n path: 'columns',\n code: 'MISSING_FIELD',\n suggestion:\n 'Add a columns array defining which data fields to display, e.g. columns: [{ key: \"name\" }, { key: \"age\" }]',\n });\n return;\n }\n\n const data = spec.data as Record<string, unknown>[];\n const firstRow = data[0];\n if (typeof firstRow !== 'object' || firstRow === null || Array.isArray(firstRow)) {\n errors.push({\n message: 'Spec error: each item in \"data\" must be a plain object',\n path: 'data[0]',\n code: 'INVALID_TYPE',\n suggestion:\n 'Each data item should be an object with key-value pairs, e.g. { name: \"Alice\", age: 30 }',\n });\n return;\n }\n\n const dataColumns = new Set(Object.keys(firstRow as Record<string, unknown>));\n const availableColumns = [...dataColumns].join(', ');\n const columns = spec.columns as Record<string, unknown>[];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i];\n if (!col || typeof col !== 'object') {\n errors.push({\n message: `Spec error: columns[${i}] must be an object`,\n path: `columns[${i}]`,\n code: 'INVALID_TYPE',\n suggestion: 'Each column entry should be an object, e.g. { key: \"fieldName\" }',\n });\n continue;\n }\n\n // Check key exists\n if (!col.key || typeof col.key !== 'string') {\n errors.push({\n message: `Spec error: columns[${i}] must have a \"key\" string`,\n path: `columns[${i}].key`,\n code: 'MISSING_FIELD',\n suggestion: `Add a key referencing a data field. Available columns: ${availableColumns}`,\n });\n continue;\n }\n\n // Check key references a field in data\n if (!dataColumns.has(col.key as string)) {\n errors.push({\n message: `Spec error: columns[${i}].key \"${col.key}\" does not exist in data. Available columns: ${availableColumns}`,\n path: `columns[${i}].key`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the available data columns: ${availableColumns}`,\n });\n }\n\n // Check at most one visual enhancement\n const visuals = ['heatmap', 'bar', 'sparkline', 'image', 'flag', 'categoryColors'].filter(\n (v) => col[v] != null && col[v] !== false,\n );\n if (visuals.length > 1) {\n errors.push({\n message: `Spec error: columns[${i}] has multiple visual features (${visuals.join(', ')}). Only one is allowed per column.`,\n path: `columns[${i}]`,\n code: 'INVALID_VALUE',\n suggestion: `Keep only one visual feature per column. Remove all but one of: ${visuals.join(', ')}`,\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Graph validation\n// ---------------------------------------------------------------------------\n\nfunction validateGraphSpec(spec: Record<string, unknown>, errors: ValidationError[]): void {\n // Validate nodes array exists and is non-empty\n if (!Array.isArray(spec.nodes)) {\n errors.push({\n message: 'Spec error: graph spec requires a \"nodes\" array',\n path: 'nodes',\n code: 'MISSING_FIELD',\n suggestion:\n 'Add a nodes array with objects that have an \"id\" field, e.g. nodes: [{ id: \"a\" }, { id: \"b\" }]',\n });\n return; // Can't validate further without nodes\n }\n\n if (spec.nodes.length === 0) {\n errors.push({\n message: 'Spec error: \"nodes\" must be a non-empty array',\n path: 'nodes',\n code: 'EMPTY_DATA',\n suggestion: 'Add at least one node, e.g. nodes: [{ id: \"a\" }]',\n });\n return;\n }\n\n // Validate each node has a string id\n const nodeIds = new Set<string>();\n const nodes = spec.nodes as Record<string, unknown>[];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (!node || typeof node !== 'object') {\n errors.push({\n message: `Spec error: nodes[${i}] must be an object`,\n path: `nodes[${i}]`,\n code: 'INVALID_TYPE',\n suggestion: 'Each node must be an object with at least an \"id\" field, e.g. { id: \"a\" }',\n });\n continue;\n }\n if (typeof node.id !== 'string' || node.id === '') {\n errors.push({\n message: `Spec error: nodes[${i}] must have a non-empty string \"id\" field`,\n path: `nodes[${i}].id`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a string id to the node, e.g. { id: \"node1\" }',\n });\n } else {\n nodeIds.add(node.id);\n }\n }\n\n // Validate edges array exists\n if (!Array.isArray(spec.edges)) {\n errors.push({\n message: 'Spec error: graph spec requires an \"edges\" array',\n path: 'edges',\n code: 'MISSING_FIELD',\n suggestion: 'Add an edges array (can be empty), e.g. edges: [{ source: \"a\", target: \"b\" }]',\n });\n return;\n }\n\n // Validate each edge has string source and target that reference existing nodes\n const edges = spec.edges as Record<string, unknown>[];\n for (let i = 0; i < edges.length; i++) {\n const edge = edges[i];\n if (!edge || typeof edge !== 'object') {\n errors.push({\n message: `Spec error: edges[${i}] must be an object`,\n path: `edges[${i}]`,\n code: 'INVALID_TYPE',\n suggestion:\n 'Each edge must be an object with \"source\" and \"target\" fields, e.g. { source: \"a\", target: \"b\" }',\n });\n continue;\n }\n\n if (typeof edge.source !== 'string' || edge.source === '') {\n errors.push({\n message: `Spec error: edges[${i}] must have a non-empty string \"source\" field`,\n path: `edges[${i}].source`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a source node id, e.g. { source: \"a\", target: \"b\" }',\n });\n } else if (nodeIds.size > 0 && !nodeIds.has(edge.source)) {\n errors.push({\n message: `Spec error: edges[${i}].source \"${edge.source}\" does not reference an existing node id`,\n path: `edges[${i}].source`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the existing node ids: ${[...nodeIds].slice(0, 5).join(', ')}${nodeIds.size > 5 ? '...' : ''}`,\n });\n }\n\n if (typeof edge.target !== 'string' || edge.target === '') {\n errors.push({\n message: `Spec error: edges[${i}] must have a non-empty string \"target\" field`,\n path: `edges[${i}].target`,\n code: 'MISSING_FIELD',\n suggestion: 'Add a target node id, e.g. { source: \"a\", target: \"b\" }',\n });\n } else if (nodeIds.size > 0 && !nodeIds.has(edge.target)) {\n errors.push({\n message: `Spec error: edges[${i}].target \"${edge.target}\" does not reference an existing node id`,\n path: `edges[${i}].target`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the existing node ids: ${[...nodeIds].slice(0, 5).join(', ')}${nodeIds.size > 5 ? '...' : ''}`,\n });\n }\n }\n\n // Validate encoding fields exist on at least the first node/edge\n if (spec.encoding && typeof spec.encoding === 'object') {\n const encoding = spec.encoding as Record<string, unknown>;\n const firstNode = nodes[0] as Record<string, unknown>;\n const firstEdge = edges.length > 0 ? (edges[0] as Record<string, unknown>) : null;\n const nodeFields = firstNode ? new Set(Object.keys(firstNode)) : new Set<string>();\n const edgeFields = firstEdge ? new Set(Object.keys(firstEdge)) : new Set<string>();\n\n const nodeChannels = ['nodeColor', 'nodeSize', 'nodeLabel'] as const;\n for (const channel of nodeChannels) {\n const ch = encoding[channel] as Record<string, unknown> | undefined;\n if (ch?.field && typeof ch.field === 'string' && !nodeFields.has(ch.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${ch.field}\" does not exist on nodes. Available fields: ${[...nodeFields].join(', ')}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the node fields: ${[...nodeFields].join(', ')}`,\n });\n }\n }\n\n const edgeChannels = ['edgeColor', 'edgeWidth'] as const;\n for (const channel of edgeChannels) {\n const ch = encoding[channel] as Record<string, unknown> | undefined;\n if (ch?.field && typeof ch.field === 'string' && firstEdge && !edgeFields.has(ch.field)) {\n errors.push({\n message: `Spec error: encoding.${channel}.field \"${ch.field}\" does not exist on edges. Available fields: ${[...edgeFields].join(', ')}`,\n path: `encoding.${channel}.field`,\n code: 'DATA_FIELD_MISSING',\n suggestion: `Use one of the edge fields: ${[...edgeFields].join(', ')}`,\n });\n }\n }\n }\n\n // Validate layout type if specified\n if (spec.layout && typeof spec.layout === 'object') {\n const layout = spec.layout as Record<string, unknown>;\n if (layout.type && layout.type !== 'force') {\n errors.push({\n message: `Spec error: layout.type \"${layout.type}\" is not supported. Only \"force\" is currently supported`,\n path: 'layout.type',\n code: 'INVALID_VALUE',\n suggestion:\n 'Use layout.type: \"force\" or omit the layout field to use the default force layout',\n });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a spec at runtime.\n *\n * Checks structure, required fields, encoding rules, data shape, and\n * field type compatibility. Returns structured errors with machine-readable\n * codes and actionable suggestions for each problem found.\n */\nexport function validateSpec(spec: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n // Basic shape check\n if (!spec || typeof spec !== 'object' || Array.isArray(spec)) {\n return {\n valid: false,\n errors: [\n {\n message: 'Spec error: spec must be a non-null object',\n code: 'INVALID_TYPE',\n suggestion:\n 'Pass a spec object with at least a \"type\" field, e.g. { type: \"line\", data: [...], encoding: {...} }',\n },\n ],\n normalized: null,\n };\n }\n\n const obj = spec as Record<string, unknown>;\n\n // Type check\n if (!obj.type || typeof obj.type !== 'string') {\n return {\n valid: false,\n errors: [\n {\n message: 'Spec error: spec must have a \"type\" field',\n path: 'type',\n code: 'MISSING_FIELD',\n suggestion: `Add a type field. Valid types: ${[...CHART_TYPES].join(', ')}, table, graph`,\n },\n ],\n normalized: null,\n };\n }\n\n const isChart = CHART_TYPES.has(obj.type);\n const isTable = obj.type === 'table';\n const isGraph = obj.type === 'graph';\n\n if (!isChart && !isTable && !isGraph) {\n return {\n valid: false,\n errors: [\n {\n message: `Spec error: \"${obj.type}\" is not a valid type. Valid types: ${[...CHART_TYPES].join(', ')}, table, graph`,\n path: 'type',\n code: 'INVALID_VALUE',\n suggestion: `Change type to one of: ${[...CHART_TYPES].join(', ')}, table, graph`,\n },\n ],\n normalized: null,\n };\n }\n\n // Type-specific validation\n if (isChart) {\n validateChartSpec(obj, errors);\n } else if (isTable) {\n validateTableSpec(obj, errors);\n } else if (isGraph) {\n validateGraphSpec(obj, errors);\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, normalized: null };\n }\n\n return {\n valid: true,\n errors: [],\n normalized: spec as VizSpec,\n };\n}\n","/**\n * Spec compiler: validate -> normalize pipeline.\n *\n * This is the first stage of the engine: take raw user input (possibly JSON\n * from an API or Claude), validate it, fill in defaults, and produce a\n * NormalizedSpec that the rest of the engine can work with safely.\n */\n\nimport { normalizeSpec } from './normalize';\nimport type { CompileResult } from './types';\nimport { validateSpec } from './validate';\n\n/**\n * Compile a raw spec through the validate -> normalize pipeline.\n *\n * @param spec - Raw spec input (unknown type, could be anything).\n * @returns CompileResult with the normalized spec and any warnings.\n * @throws Error if the spec is invalid.\n */\nexport function compile(spec: unknown): CompileResult {\n const validation = validateSpec(spec);\n\n if (!validation.valid || !validation.normalized) {\n const errorMessages = validation.errors.map((e) => e.message).join('\\n');\n throw new Error(`Invalid spec:\\n${errorMessages}`);\n }\n\n const warnings: string[] = [];\n const normalized = normalizeSpec(validation.normalized, warnings);\n\n return { spec: normalized, warnings };\n}\n\nexport { normalizeSpec } from './normalize';\nexport type {\n CompileResult,\n NormalizedChartSpec,\n NormalizedChrome,\n NormalizedGraphSpec,\n NormalizedSpec,\n NormalizedTableSpec,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n} from './types';\n// Re-export everything\nexport { validateSpec } from './validate';\n","/**\n * Graph compilation pipeline.\n *\n * Takes a raw graph spec (unknown shape), validates, normalizes, resolves\n * encoding channels to visual properties, assigns communities, builds\n * legend/tooltips/a11y, and returns a GraphCompilation.\n *\n * The pipeline mirrors compileChart's structure:\n * validate -> normalize -> resolve theme -> resolve visuals ->\n * community assignment -> legend -> tooltips -> a11y -> return\n *\n * Key difference from charts: the output does NOT include x/y positions.\n * The force simulation in the adapter handles layout at runtime.\n */\n\nimport type {\n CompileOptions,\n LegendEntry,\n LegendLayout,\n ResolvedTheme,\n TextStyle,\n TooltipContent,\n TooltipField,\n} from '@opendata-ai/openchart-core';\nimport { adaptTheme, computeChrome, resolveTheme } from '@opendata-ai/openchart-core';\n\nimport { compile as compileSpec } from '../compiler/index';\nimport type { NormalizedGraphSpec } from '../compiler/types';\nimport { applyCommunityColors, assignCommunities, buildCommunityColorMap } from './community';\nimport { resolveEdgeVisuals, resolveNodeVisuals } from './encoding';\nimport type { CompiledGraphNode, GraphCompilation, SimulationConfig } from './types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SWATCH_SIZE = 12;\nconst SWATCH_GAP = 6;\nconst ENTRY_GAP = 16;\n\n// ---------------------------------------------------------------------------\n// Legend builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a legend from community assignments or nodeColor encoding.\n *\n * Built manually instead of reusing computeLegend (which assumes chart\n * encoding channels). Returns entries with color swatches and labels.\n * Position is placeholder (adapter determines actual placement).\n */\nfunction buildGraphLegend(\n nodes: CompiledGraphNode[],\n communityColorMap: Map<string, string>,\n hasCommunities: boolean,\n theme: ResolvedTheme,\n): LegendLayout {\n const labelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n let entries: LegendEntry[];\n\n if (hasCommunities && communityColorMap.size > 0) {\n // One entry per community\n entries = [...communityColorMap.entries()].map(([label, color]) => ({\n label,\n color,\n shape: 'circle' as const,\n active: true,\n }));\n } else {\n // Collect unique colors from nodes (for nodeColor encoding)\n const colorLabels = new Map<string, string>();\n for (const node of nodes) {\n if (!colorLabels.has(node.fill)) {\n // Use the first node with this color as the label representative\n colorLabels.set(node.fill, node.label ?? node.id);\n }\n }\n\n // Only show legend if there are multiple colors\n if (colorLabels.size <= 1) {\n entries = [];\n } else {\n entries = [...colorLabels.entries()].map(([color, label]) => ({\n label,\n color,\n shape: 'circle' as const,\n active: true,\n }));\n }\n }\n\n return {\n position: 'top',\n entries,\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build tooltip descriptors for each node.\n *\n * Keyed by node id. Shows all data fields, label, and community.\n */\nfunction buildGraphTooltips(nodes: CompiledGraphNode[]): Map<string, TooltipContent> {\n const descriptors = new Map<string, TooltipContent>();\n\n for (const node of nodes) {\n const fields: TooltipField[] = [];\n\n // Add community if present\n if (node.community != null) {\n fields.push({\n label: 'Community',\n value: node.community,\n color: node.fill,\n });\n }\n\n // Add all data fields (excluding id since it's the title)\n for (const [key, value] of Object.entries(node.data)) {\n if (key === 'id') continue;\n if (value == null) continue;\n\n fields.push({\n label: key,\n value: typeof value === 'number' ? value.toLocaleString() : String(value),\n });\n }\n\n descriptors.set(node.id, {\n title: node.label ?? node.id,\n fields,\n });\n }\n\n return descriptors;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a graph spec into a GraphCompilation.\n *\n * Pipeline:\n * 1. Validate + normalize via the shared compiler pipeline\n * 2. Resolve theme (merge spec + options, apply dark mode)\n * 3. Resolve node visuals (size, color, label, stroke)\n * 4. Assign communities if layout.clustering is set\n * 5. Apply community colors (override nodeColor)\n * 6. Resolve edge visuals (width, color)\n * 7. Build legend from communities or nodeColor\n * 8. Build tooltip descriptors for each node\n * 9. Build a11y metadata\n * 10. Build simulation config from spec layout\n * 11. Build chrome from spec + theme\n * 12. Return GraphCompilation\n *\n * @param spec - Raw graph spec (validated at runtime).\n * @param options - Compile options (width, height, theme, darkMode).\n * @returns GraphCompilation with resolved visual properties.\n * @throws Error if spec is invalid or not a graph type.\n */\nexport function compileGraph(spec: unknown, options: CompileOptions): GraphCompilation {\n // 1. Validate + normalize\n const { spec: normalized } = compileSpec(spec);\n\n if (normalized.type !== 'graph') {\n throw new Error(\n `compileGraph received a ${normalized.type} spec. Use compileChart or compileTable instead.`,\n );\n }\n\n const graphSpec = normalized as NormalizedGraphSpec;\n\n // 2. Resolve theme\n const mergedThemeConfig = options.theme\n ? { ...graphSpec.theme, ...options.theme }\n : graphSpec.theme;\n let theme: ResolvedTheme = resolveTheme(mergedThemeConfig);\n if (options.darkMode) {\n theme = adaptTheme(theme);\n }\n\n // 3. Resolve node visuals\n const compiledNodes = resolveNodeVisuals(\n graphSpec.nodes,\n graphSpec.encoding,\n graphSpec.edges,\n theme,\n graphSpec.nodeOverrides,\n );\n\n // 4. Assign communities\n const clusteringField = graphSpec.layout.clustering?.field;\n const hasCommunities = !!clusteringField;\n assignCommunities(compiledNodes, clusteringField);\n\n // 5. Apply community colors\n let communityColorMap = new Map<string, string>();\n if (hasCommunities) {\n communityColorMap = buildCommunityColorMap(compiledNodes, theme);\n applyCommunityColors(compiledNodes, communityColorMap);\n }\n\n // 6. Resolve edge visuals\n const compiledEdges = resolveEdgeVisuals(graphSpec.edges, graphSpec.encoding, theme);\n\n // 7. Build legend\n const legend = buildGraphLegend(compiledNodes, communityColorMap, hasCommunities, theme);\n\n // 8. Build tooltips\n const tooltipDescriptors = buildGraphTooltips(compiledNodes);\n\n // 9. Build a11y metadata\n const communityCount = communityColorMap.size;\n const altParts = [\n `Network graph with ${compiledNodes.length} nodes and ${compiledEdges.length} edges`,\n ];\n if (communityCount > 0) {\n altParts.push(`organized into ${communityCount} communities`);\n }\n const a11y = {\n altText: altParts.join(', '),\n dataTableFallback: compiledNodes.map((n) => [n.id, n.community ?? '', n.label ?? '']),\n role: 'img',\n keyboardNavigable: compiledNodes.length > 0,\n };\n\n // 10. Build simulation config\n const collisionPadding = graphSpec.layout.collisionPadding ?? 2;\n const maxRadius =\n compiledNodes.length > 0\n ? Math.max(...compiledNodes.map((n) => n.radius))\n : DEFAULT_COLLISION_PADDING;\n const simulationConfig: SimulationConfig = {\n chargeStrength: graphSpec.layout.chargeStrength ?? -300,\n linkDistance: graphSpec.layout.linkDistance ?? 30,\n clustering: clusteringField ? { field: clusteringField, strength: 0.5 } : null,\n alphaDecay: 0.0228,\n velocityDecay: 0.4,\n collisionRadius: maxRadius + collisionPadding,\n collisionPadding,\n linkStrength: graphSpec.layout.linkStrength,\n centerForce: graphSpec.layout.centerForce,\n };\n\n // 11. Build chrome\n const chrome = computeChrome(\n {\n title: graphSpec.chrome.title,\n subtitle: graphSpec.chrome.subtitle,\n source: graphSpec.chrome.source,\n byline: graphSpec.chrome.byline,\n footer: graphSpec.chrome.footer,\n },\n theme,\n options.width,\n options.measureText,\n );\n\n // 12. Return compilation\n return {\n nodes: compiledNodes,\n edges: compiledEdges,\n legend,\n chrome,\n tooltipDescriptors,\n a11y,\n theme,\n dimensions: {\n width: options.width,\n height: options.height,\n },\n simulationConfig,\n };\n}\n\n/** Default padding for collision radius when there are no nodes. */\nconst DEFAULT_COLLISION_PADDING = 5;\n","/**\n * Graph encoding resolution.\n *\n * Maps graph encoding channels (nodeSize, nodeColor, edgeWidth, edgeColor,\n * nodeLabel) to computed visual properties on nodes and edges. Uses d3 scales\n * the same way scatter/bubble charts do: scaleSqrt for size, scaleOrdinal\n * for categorical color, scaleLinear for quantitative color.\n */\n\nimport type {\n GraphEdge,\n GraphEncoding,\n GraphNode,\n NodeOverride,\n ResolvedTheme,\n} from '@opendata-ai/openchart-core';\nimport { max, min } from 'd3-array';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } from 'd3-scale';\n\nimport type { CompiledGraphEdge, CompiledGraphNode } from './types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_NODE_RADIUS = 5;\nconst MIN_NODE_RADIUS = 3;\nconst MAX_NODE_RADIUS = 12;\n\nconst DEFAULT_EDGE_WIDTH = 1;\nconst MIN_EDGE_WIDTH = 0.5;\nconst MAX_EDGE_WIDTH = 4;\n\nconst DEFAULT_STROKE_WIDTH = 1;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Darken a hex color by a percentage.\n *\n * Doesn't use d3-color (engine doesn't depend on it). Operates directly\n * on hex RGB channels. Falls back to the original color on parse failure.\n */\nexport function darkenColor(hex: string, amount: number = 0.2): string {\n // Strip # prefix\n const clean = hex.replace(/^#/, '');\n if (clean.length !== 6 && clean.length !== 3) return hex;\n\n // Expand shorthand\n const full =\n clean.length === 3\n ? clean\n .split('')\n .map((c) => c + c)\n .join('')\n : clean;\n\n const r = Math.max(0, Math.round(parseInt(full.substring(0, 2), 16) * (1 - amount)));\n const g = Math.max(0, Math.round(parseInt(full.substring(2, 4), 16) * (1 - amount)));\n const b = Math.max(0, Math.round(parseInt(full.substring(4, 6), 16) * (1 - amount)));\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Apply opacity to a hex color, returning an rgba string.\n */\nfunction hexWithOpacity(hex: string, opacity: number): string {\n const clean = hex.replace(/^#/, '');\n if (clean.length !== 6 && clean.length !== 3) {\n // Non-hex input: return as-is with opacity via CSS\n return hex;\n }\n\n const full =\n clean.length === 3\n ? clean\n .split('')\n .map((c) => c + c)\n .join('')\n : clean;\n\n const r = parseInt(full.substring(0, 2), 16);\n const g = parseInt(full.substring(2, 4), 16);\n const b = parseInt(full.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\n/**\n * Compute the degree of each node (number of edges touching it).\n */\nfunction computeDegrees(nodes: GraphNode[], edges: GraphEdge[]): Map<string, number> {\n const degrees = new Map<string, number>();\n for (const node of nodes) {\n degrees.set(node.id, 0);\n }\n for (const edge of edges) {\n degrees.set(edge.source, (degrees.get(edge.source) ?? 0) + 1);\n degrees.set(edge.target, (degrees.get(edge.target) ?? 0) + 1);\n }\n return degrees;\n}\n\n// ---------------------------------------------------------------------------\n// Node visual resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve visual properties for all graph nodes.\n *\n * Applies nodeSize, nodeColor, and nodeLabel encoding channels from the\n * spec to produce CompiledGraphNode objects with computed fill, radius,\n * stroke, label, and label priority.\n */\nexport function resolveNodeVisuals(\n nodes: GraphNode[],\n encoding: GraphEncoding,\n edges: GraphEdge[],\n theme: ResolvedTheme,\n nodeOverrides?: Record<string, NodeOverride>,\n): CompiledGraphNode[] {\n const degrees = computeDegrees(nodes, edges);\n const maxDegree = Math.max(1, ...degrees.values());\n\n // Build node size scale\n let sizeScale: ((v: number) => number) | undefined;\n if (encoding.nodeSize?.field) {\n const field = encoding.nodeSize.field;\n const values = nodes.map((n) => Number(n[field])).filter((v) => Number.isFinite(v));\n\n const sizeMin = min(values) ?? 0;\n const sizeMax = max(values) ?? 1;\n\n sizeScale = scaleSqrt().domain([sizeMin, sizeMax]).range([MIN_NODE_RADIUS, MAX_NODE_RADIUS]);\n }\n\n // Build node color scale\n let colorFn: ((node: GraphNode) => string) | undefined;\n if (encoding.nodeColor?.field) {\n const field = encoding.nodeColor.field;\n const fieldType = encoding.nodeColor.type ?? 'nominal';\n\n if (fieldType === 'quantitative') {\n const values = nodes.map((n) => Number(n[field])).filter((v) => Number.isFinite(v));\n const colorMin = min(values) ?? 0;\n const colorMax = max(values) ?? 1;\n\n // Use first sequential palette\n const seqPalettes = Object.values(theme.colors.sequential);\n const palette = seqPalettes.length > 0 ? seqPalettes[0] : ['#ccc', '#333'];\n const colorScale = scaleLinear<string>()\n .domain([colorMin, colorMax])\n .range([palette[0], palette[palette.length - 1]]);\n\n colorFn = (node: GraphNode) => {\n const val = Number(node[field]);\n return Number.isFinite(val) ? colorScale(val) : theme.colors.categorical[0];\n };\n } else {\n // nominal/ordinal\n const uniqueValues = [...new Set(nodes.map((n) => String(n[field] ?? '')))];\n const ordinalScale = scaleOrdinal<string>()\n .domain(uniqueValues)\n .range(theme.colors.categorical);\n\n colorFn = (node: GraphNode) => ordinalScale(String(node[field] ?? ''));\n }\n }\n\n const defaultColor = theme.colors.categorical[0];\n\n return nodes.map((node) => {\n // Radius\n let radius = DEFAULT_NODE_RADIUS;\n if (sizeScale && encoding.nodeSize?.field) {\n const val = Number(node[encoding.nodeSize.field]);\n if (Number.isFinite(val)) {\n radius = sizeScale(val);\n }\n }\n\n // Color\n const fill = colorFn ? colorFn(node) : defaultColor;\n\n // Stroke: darken fill by 20%\n const stroke = darkenColor(fill);\n\n // Label\n let label: string | undefined;\n if (encoding.nodeLabel?.field) {\n const labelVal = node[encoding.nodeLabel.field];\n label = labelVal != null ? String(labelVal) : undefined;\n } else {\n label = node.id;\n }\n\n // Label priority: degree / maxDegree (0 to 1)\n const degree = degrees.get(node.id) ?? 0;\n const labelPriority = maxDegree > 0 ? degree / maxDegree : 0;\n\n // Data: spread all original node fields\n const { id: _id, ...rest } = node;\n const data: Record<string, unknown> = { id: node.id, ...rest };\n\n // Apply per-node overrides if present\n const override = nodeOverrides?.[node.id];\n const finalFill = override?.fill ?? fill;\n const finalRadius = override?.radius ?? radius;\n const finalStrokeWidth = override?.strokeWidth ?? DEFAULT_STROKE_WIDTH;\n const finalStroke = override?.stroke ?? stroke;\n const finalLabelPriority = override?.alwaysShowLabel ? Infinity : labelPriority;\n\n return {\n id: node.id,\n radius: finalRadius,\n fill: finalFill,\n stroke: finalStroke,\n strokeWidth: finalStrokeWidth,\n label,\n labelPriority: finalLabelPriority,\n community: undefined,\n data,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Edge visual resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve visual properties for all graph edges.\n *\n * Applies edgeWidth and edgeColor encoding channels to produce\n * CompiledGraphEdge objects with computed stroke, strokeWidth, and style.\n */\nexport function resolveEdgeVisuals(\n edges: GraphEdge[],\n encoding: GraphEncoding,\n theme: ResolvedTheme,\n): CompiledGraphEdge[] {\n // Edge width scale\n let widthScale: ((v: number) => number) | undefined;\n if (encoding.edgeWidth?.field) {\n const field = encoding.edgeWidth.field;\n const values = edges.map((e) => Number(e[field])).filter((v) => Number.isFinite(v));\n\n const widthMin = min(values) ?? 0;\n const widthMax = max(values) ?? 1;\n\n widthScale = scaleLinear().domain([widthMin, widthMax]).range([MIN_EDGE_WIDTH, MAX_EDGE_WIDTH]);\n }\n\n // Edge color scale\n let edgeColorFn: ((edge: GraphEdge) => string) | undefined;\n if (encoding.edgeColor?.field) {\n const field = encoding.edgeColor.field;\n const fieldType = encoding.edgeColor.type ?? 'nominal';\n\n if (fieldType === 'quantitative') {\n const values = edges.map((e) => Number(e[field])).filter((v) => Number.isFinite(v));\n const colorMin = min(values) ?? 0;\n const colorMax = max(values) ?? 1;\n\n const seqPalettes = Object.values(theme.colors.sequential);\n const palette = seqPalettes.length > 0 ? seqPalettes[0] : ['#ccc', '#333'];\n const colorScale = scaleLinear<string>()\n .domain([colorMin, colorMax])\n .range([palette[0], palette[palette.length - 1]]);\n\n edgeColorFn = (edge: GraphEdge) => {\n const val = Number(edge[field]);\n return Number.isFinite(val) ? colorScale(val) : hexWithOpacity(theme.colors.axis, 0.4);\n };\n } else {\n const uniqueValues = [...new Set(edges.map((e) => String(e[field] ?? '')))];\n const ordinalScale = scaleOrdinal<string>()\n .domain(uniqueValues)\n .range(theme.colors.categorical);\n\n edgeColorFn = (edge: GraphEdge) => ordinalScale(String(edge[field] ?? ''));\n }\n }\n\n const defaultEdgeColor = hexWithOpacity(theme.colors.axis, 0.4);\n\n // Edge style mapping (ordinal: map unique field values to solid/dashed/dotted)\n const EDGE_STYLES: Array<'solid' | 'dashed' | 'dotted'> = ['solid', 'dashed', 'dotted'];\n let styleFn: ((edge: GraphEdge) => 'solid' | 'dashed' | 'dotted') | undefined;\n if (encoding.edgeStyle?.field) {\n const field = encoding.edgeStyle.field;\n const uniqueValues = [...new Set(edges.map((e) => String(e[field] ?? '')))];\n const styleMap = new Map<string, 'solid' | 'dashed' | 'dotted'>();\n for (let i = 0; i < uniqueValues.length; i++) {\n styleMap.set(uniqueValues[i], EDGE_STYLES[i % EDGE_STYLES.length]);\n }\n styleFn = (edge: GraphEdge) => styleMap.get(String(edge[field] ?? '')) ?? 'solid';\n }\n\n return edges.map((edge) => {\n const { source, target, ...rest } = edge;\n\n let strokeWidth = DEFAULT_EDGE_WIDTH;\n if (widthScale && encoding.edgeWidth?.field) {\n const val = Number(edge[encoding.edgeWidth.field]);\n if (Number.isFinite(val)) {\n strokeWidth = widthScale(val);\n }\n }\n\n const stroke = edgeColorFn ? edgeColorFn(edge) : defaultEdgeColor;\n const style = styleFn ? styleFn(edge) : ('solid' as const);\n\n return {\n source,\n target,\n stroke,\n strokeWidth,\n style,\n data: { source, target, ...rest } as Record<string, unknown>,\n };\n });\n}\n","/**\n * Community assignment and color mapping for graph clustering.\n *\n * When a graph spec has layout.clustering.field, nodes are grouped into\n * communities based on their data values for that field. Each community\n * gets a color from the theme's categorical palette. Community colors\n * override nodeColor encoding when clustering is active.\n */\n\nimport type { ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { darkenColor } from './encoding';\nimport type { CompiledGraphNode } from './types';\n\n// ---------------------------------------------------------------------------\n// Community assignment\n// ---------------------------------------------------------------------------\n\n/**\n * Assign community labels to compiled nodes based on a clustering field.\n *\n * Reads node.data[clusteringField] as the community label. If the field\n * is missing on a node, community remains undefined.\n *\n * Mutates nodes in-place for efficiency (no copy needed since we just\n * built them in the compilation pipeline).\n */\nexport function assignCommunities(\n nodes: CompiledGraphNode[],\n clusteringField: string | undefined,\n): void {\n if (!clusteringField) return;\n\n for (const node of nodes) {\n const value = node.data[clusteringField];\n node.community = value != null ? String(value) : undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Community color mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Build a map from community label to color.\n *\n * Collects unique community values (in order of first appearance),\n * then assigns theme categorical colors round-robin.\n */\nexport function buildCommunityColorMap(\n nodes: CompiledGraphNode[],\n theme: ResolvedTheme,\n): Map<string, string> {\n const colorMap = new Map<string, string>();\n const palette = theme.colors.categorical;\n let colorIndex = 0;\n\n for (const node of nodes) {\n if (node.community != null && !colorMap.has(node.community)) {\n colorMap.set(node.community, palette[colorIndex % palette.length]);\n colorIndex++;\n }\n }\n\n return colorMap;\n}\n\n// ---------------------------------------------------------------------------\n// Apply community colors\n// ---------------------------------------------------------------------------\n\n/**\n * Override node fill and stroke colors with community colors.\n *\n * Only affects nodes that have a community assignment. Nodes without\n * a community keep their existing fill/stroke from encoding resolution.\n *\n * Mutates nodes in-place.\n */\nexport function applyCommunityColors(\n nodes: CompiledGraphNode[],\n colorMap: Map<string, string>,\n): void {\n for (const node of nodes) {\n if (node.community != null) {\n const communityColor = colorMap.get(node.community);\n if (communityColor) {\n node.fill = communityColor;\n node.stroke = darkenColor(communityColor);\n }\n }\n }\n}\n","/**\n * Axis computation: tick positions, labels, and axis lines.\n *\n * Generates ticks manually (no d3-axis) so we have full control over\n * responsive tick density and formatting.\n */\n\nimport type {\n AxisLabelDensity,\n AxisLayout,\n AxisTick,\n Gridline,\n LayoutStrategy,\n MeasureTextFn,\n Rect,\n ResolvedTheme,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport {\n abbreviateNumber,\n buildD3Formatter,\n estimateTextWidth,\n formatDate,\n formatNumber,\n} from '@opendata-ai/openchart-core';\nimport type { ScaleBand } from 'd3-scale';\nimport type {\n D3CategoricalScale,\n D3ContinuousScale,\n ResolvedScale,\n ResolvedScales,\n} from './scales';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Base tick counts by axis label density. */\nconst TICK_COUNTS: Record<AxisLabelDensity, number> = {\n full: 8,\n reduced: 5,\n minimal: 3,\n};\n\n/**\n * Height thresholds for reducing y-axis tick density.\n * Below these pixel heights, we step down the density regardless of the\n * width-based strategy. This prevents overlapping y-axis labels in short\n * containers like thumbnail previews.\n */\nconst HEIGHT_MINIMAL_THRESHOLD = 120;\nconst HEIGHT_REDUCED_THRESHOLD = 200;\n\n/**\n * Width thresholds for reducing x-axis tick density.\n * Mirrors the height logic for the x-axis: narrow containers get fewer ticks.\n */\nconst WIDTH_MINIMAL_THRESHOLD = 150;\nconst WIDTH_REDUCED_THRESHOLD = 300;\n\n/**\n * Minimum gap between adjacent tick labels as a multiple of font size.\n * At the default 12px axis font, this yields ~12px of breathing room.\n */\nconst MIN_TICK_GAP_FACTOR = 1.0;\n\n/** Always show at least this many ticks, even if they overlap. */\nconst MIN_TICK_COUNT = 2;\n\n/** Ordered densities from most to fewest ticks. */\nconst DENSITY_ORDER: AxisLabelDensity[] = ['full', 'reduced', 'minimal'];\n\n/**\n * Compute effective axis tick density by considering available space.\n *\n * The width-based breakpoint system sets a base density, but it doesn't know\n * about the actual chart area dimensions (which shrink after chrome/legend\n * allocation). This function steps density down further when the axis\n * dimension is too small for the requested tick count.\n *\n * @param baseDensity - The density from the responsive layout strategy.\n * @param axisLength - Available pixels along this axis (height for y, width for x).\n * @param minimalThreshold - Below this pixel size, force minimal density.\n * @param reducedThreshold - Below this pixel size, cap at reduced density.\n * @returns The effective density, never looser than the base.\n */\nexport function effectiveDensity(\n baseDensity: AxisLabelDensity,\n axisLength: number,\n minimalThreshold: number,\n reducedThreshold: number,\n): AxisLabelDensity {\n let density = baseDensity;\n\n if (axisLength < minimalThreshold) {\n density = 'minimal';\n } else if (axisLength < reducedThreshold) {\n // Don't increase density beyond what the base strategy allows.\n // If base is already 'minimal', keep it.\n const baseIdx = DENSITY_ORDER.indexOf(baseDensity);\n const reducedIdx = DENSITY_ORDER.indexOf('reduced');\n density = DENSITY_ORDER[Math.max(baseIdx, reducedIdx)];\n }\n\n return density;\n}\n\n// ---------------------------------------------------------------------------\n// Label overlap detection and thinning\n// ---------------------------------------------------------------------------\n\n/** Measure a single label's width using real measurement or heuristic fallback. */\nfunction measureLabel(\n text: string,\n fontSize: number,\n fontWeight: number,\n measureText?: MeasureTextFn,\n): number {\n return measureText\n ? measureText(text, fontSize, fontWeight).width\n : estimateTextWidth(text, fontSize, fontWeight);\n}\n\n/** Check whether any adjacent tick labels overlap horizontally. */\nexport function ticksOverlap(\n ticks: AxisTick[],\n fontSize: number,\n fontWeight: number,\n measureText?: MeasureTextFn,\n): boolean {\n if (ticks.length < 2) return false;\n const minGap = fontSize * MIN_TICK_GAP_FACTOR;\n for (let i = 0; i < ticks.length - 1; i++) {\n const aWidth = measureLabel(ticks[i].label, fontSize, fontWeight, measureText);\n const bWidth = measureLabel(ticks[i + 1].label, fontSize, fontWeight, measureText);\n const aRight = ticks[i].position + aWidth / 2;\n const bLeft = ticks[i + 1].position - bWidth / 2;\n if (aRight + minGap > bLeft) return true;\n }\n return false;\n}\n\n/**\n * Thin a tick array by removing every other tick until labels don't overlap.\n * Always keeps first and last tick. O(log n) iterations max.\n * Returns the original array if no thinning is needed.\n */\nexport function thinTicksUntilFit(\n ticks: AxisTick[],\n fontSize: number,\n fontWeight: number,\n measureText?: MeasureTextFn,\n): AxisTick[] {\n if (!ticksOverlap(ticks, fontSize, fontWeight, measureText)) return ticks;\n\n let current = ticks;\n while (current.length > MIN_TICK_COUNT) {\n // Keep first, last, and every other tick in between\n const thinned = [current[0]];\n for (let i = 2; i < current.length - 1; i += 2) {\n thinned.push(current[i]);\n }\n if (current.length > 1) thinned.push(current[current.length - 1]);\n current = thinned;\n\n if (!ticksOverlap(current, fontSize, fontWeight, measureText)) break;\n }\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Tick generation\n// ---------------------------------------------------------------------------\n\n/** Generate ticks for a continuous scale (linear, time, log). */\nfunction continuousTicks(\n resolvedScale: ResolvedScale,\n density: AxisLabelDensity,\n fontSize: number,\n fontWeight: number,\n measureText?: MeasureTextFn,\n): AxisTick[] {\n const scale = resolvedScale.scale as D3ContinuousScale;\n const explicitCount = resolvedScale.channel.axis?.tickCount;\n const count = explicitCount ?? TICK_COUNTS[density];\n const rawTicks: unknown[] = scale.ticks(count);\n\n const ticks = rawTicks.map((value: unknown) => ({\n value,\n position: scale(value as number & Date) as number,\n label: formatTickLabel(value, resolvedScale),\n }));\n\n // Respect explicit tickCount: user asked for this many, don't override\n if (explicitCount) return ticks;\n\n return thinTicksUntilFit(ticks, fontSize, fontWeight, measureText);\n}\n\n/** Generate ticks for a band/point/ordinal scale. */\nfunction categoricalTicks(\n resolvedScale: ResolvedScale,\n density: AxisLabelDensity,\n fontSize: number,\n fontWeight: number,\n measureText?: MeasureTextFn,\n): AxisTick[] {\n const scale = resolvedScale.scale as D3CategoricalScale;\n const domain: string[] = scale.domain();\n const explicitTickCount = resolvedScale.channel.axis?.tickCount;\n const maxTicks = explicitTickCount ?? TICK_COUNTS[density];\n\n // Band scales (bar charts) show all category labels by default.\n // Only thin when there's an explicit tickCount override or for point/ordinal scales.\n let selectedValues = domain;\n if ((resolvedScale.type !== 'band' || explicitTickCount) && domain.length > maxTicks) {\n const step = Math.ceil(domain.length / maxTicks);\n selectedValues = domain.filter((_: string, i: number) => i % step === 0);\n }\n\n const ticks = selectedValues.map((value: string) => {\n // Band scales: use the center of the band\n const bandScale = resolvedScale.type === 'band' ? (scale as ScaleBand<string>) : null;\n const pos = bandScale\n ? (bandScale(value) ?? 0) + bandScale.bandwidth() / 2\n : ((scale(value) as number | undefined) ?? 0);\n\n return {\n value,\n position: pos,\n label: value,\n };\n });\n\n // For non-band scales without explicit tickCount, thin based on label width\n if (resolvedScale.type !== 'band' && !explicitTickCount) {\n return thinTicksUntilFit(ticks, fontSize, fontWeight, measureText);\n }\n\n return ticks;\n}\n\n/** Format a tick value based on the scale type. */\nfunction formatTickLabel(value: unknown, resolvedScale: ResolvedScale): string {\n const formatStr = resolvedScale.channel.axis?.format;\n\n if (resolvedScale.type === 'time') {\n if (formatStr) return String(value); // Custom format not implemented yet\n return formatDate(value as Date);\n }\n\n if (resolvedScale.type === 'linear' || resolvedScale.type === 'log') {\n const num = value as number;\n if (formatStr) {\n const fmt = buildD3Formatter(formatStr);\n if (fmt) return fmt(num);\n }\n // Abbreviate large numbers for axis labels\n if (Math.abs(num) >= 1000) return abbreviateNumber(num);\n return formatNumber(num);\n }\n\n return String(value);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Output of computeAxes. */\nexport interface AxesResult {\n x?: AxisLayout;\n y?: AxisLayout;\n}\n\n/**\n * Compute axis layouts with tick positions, labels, and axis lines.\n *\n * @param scales - Resolved scales from computeScales.\n * @param chartArea - The chart drawing area.\n * @param strategy - Responsive layout strategy.\n * @param theme - Resolved theme for styling.\n * @param measureText - Optional real text measurement from the adapter.\n */\nexport function computeAxes(\n scales: ResolvedScales,\n chartArea: Rect,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n measureText?: MeasureTextFn,\n): AxesResult {\n const result: AxesResult = {};\n const baseDensity = strategy.axisLabelDensity;\n\n // Compute per-axis density based on available space.\n // Y-axis density adapts to chart height; X-axis density adapts to chart width.\n const yDensity = effectiveDensity(\n baseDensity,\n chartArea.height,\n HEIGHT_MINIMAL_THRESHOLD,\n HEIGHT_REDUCED_THRESHOLD,\n );\n const xDensity = effectiveDensity(\n baseDensity,\n chartArea.width,\n WIDTH_MINIMAL_THRESHOLD,\n WIDTH_REDUCED_THRESHOLD,\n );\n\n const tickLabelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.axisTick,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.axis,\n lineHeight: 1.2,\n fontVariant: 'tabular-nums',\n };\n\n const axisLabelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.body,\n fontWeight: theme.fonts.weights.medium,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n const { fontSize } = tickLabelStyle;\n const { fontWeight } = tickLabelStyle;\n\n if (scales.x) {\n const ticks =\n scales.x.type === 'band' || scales.x.type === 'point' || scales.x.type === 'ordinal'\n ? categoricalTicks(scales.x, xDensity, fontSize, fontWeight, measureText)\n : continuousTicks(scales.x, xDensity, fontSize, fontWeight, measureText);\n\n const gridlines: Gridline[] = ticks.map((t) => ({\n position: t.position,\n major: true,\n }));\n\n // Auto-rotate labels when band scale labels would overlap.\n // Uses max label width (not average) since one long label is enough to overlap.\n let tickAngle = scales.x.channel.axis?.tickAngle;\n if (tickAngle === undefined && scales.x.type === 'band' && ticks.length > 1) {\n const bandwidth = (scales.x.scale as ScaleBand<string>).bandwidth();\n let maxLabelWidth = 0;\n for (const t of ticks) {\n const w = measureLabel(t.label, fontSize, fontWeight, measureText);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n // If the widest label exceeds 85% of the bandwidth, rotate to avoid overlap\n if (maxLabelWidth > bandwidth * 0.85) {\n tickAngle = -45;\n }\n }\n\n result.x = {\n ticks,\n gridlines: scales.x.channel.axis?.grid ? gridlines : [],\n label: scales.x.channel.axis?.label,\n labelStyle: axisLabelStyle,\n tickLabelStyle,\n tickAngle,\n start: { x: chartArea.x, y: chartArea.y + chartArea.height },\n end: { x: chartArea.x + chartArea.width, y: chartArea.y + chartArea.height },\n };\n }\n\n if (scales.y) {\n const ticks =\n scales.y.type === 'band' || scales.y.type === 'point' || scales.y.type === 'ordinal'\n ? categoricalTicks(scales.y, yDensity, fontSize, fontWeight, measureText)\n : continuousTicks(scales.y, yDensity, fontSize, fontWeight, measureText);\n\n const gridlines: Gridline[] = ticks.map((t) => ({\n position: t.position,\n major: true,\n }));\n\n result.y = {\n ticks,\n // Y-axis gridlines are shown by default (standard editorial practice)\n gridlines,\n label: scales.y.channel.axis?.label,\n labelStyle: axisLabelStyle,\n tickLabelStyle,\n tickAngle: scales.y.channel.axis?.tickAngle,\n start: { x: chartArea.x, y: chartArea.y },\n end: { x: chartArea.x, y: chartArea.y + chartArea.height },\n };\n }\n\n return result;\n}\n","/**\n * Dimension computation for the chart layout.\n *\n * Takes the normalized spec + compile options + legend layout and produces\n * LayoutDimensions with the total area, chrome layout, chart drawing area,\n * and margins. The chart area is what's left after subtracting chrome,\n * legend space, and axis margins.\n *\n * Padding and chrome scale down at smaller container sizes to maximize\n * the usable chart area. When the chart area is still too small after\n * scaling, chrome is progressively stripped as a fallback.\n */\n\nimport type {\n CompileOptions,\n Encoding,\n LayoutStrategy,\n LegendLayout,\n Margins,\n Rect,\n ResolvedChrome,\n ResolvedTheme,\n} from '@opendata-ai/openchart-core';\nimport { computeChrome, estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec, NormalizedChrome } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The complete dimension layout for a chart. */\nexport interface LayoutDimensions {\n /** Total available space. */\n total: Rect;\n /** Resolved chrome (title, subtitle, source, etc.). */\n chrome: ResolvedChrome;\n /** The chart drawing area (after subtracting chrome, legend, margins). */\n chartArea: Rect;\n /** Margins around the chart area. */\n margins: Margins;\n /** Resolved theme used for this layout. */\n theme: ResolvedTheme;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Convert NormalizedChrome back to a Chrome-compatible shape for computeChrome. */\nfunction chromeToInput(chrome: NormalizedChrome): import('@opendata-ai/openchart-core').Chrome {\n return {\n title: chrome.title,\n subtitle: chrome.subtitle,\n source: chrome.source,\n byline: chrome.byline,\n footer: chrome.footer,\n };\n}\n\n/**\n * Scale padding based on the smaller container dimension.\n * At >= 500px, padding is unchanged. At <= 200px, padding is halved (min 4px).\n * Linear interpolation between 200-500px.\n */\nfunction scalePadding(basePadding: number, width: number, height: number): number {\n const minDim = Math.min(width, height);\n if (minDim >= 500) return basePadding;\n if (minDim <= 200) return Math.max(Math.round(basePadding * 0.5), 4);\n const t = (minDim - 200) / 300;\n return Math.max(Math.round(basePadding * (0.5 + t * 0.5)), 4);\n}\n\n/** Minimum chart area dimensions before guardrails kick in. */\nconst MIN_CHART_WIDTH = 60;\nconst MIN_CHART_HEIGHT = 40;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute chart dimensions, reserving space for chrome, legend, and axes.\n *\n * @param spec - Normalized chart spec.\n * @param options - Compile options (width, height, theme, darkMode).\n * @param legendLayout - Pre-computed legend layout (used to reserve space).\n * @param theme - Already-resolved theme (resolved once in compileChart).\n * @param strategy - Responsive layout strategy (controls chrome mode).\n * @returns LayoutDimensions with chart area rect.\n */\nexport function computeDimensions(\n spec: NormalizedChartSpec,\n options: CompileOptions,\n legendLayout: LegendLayout,\n theme: ResolvedTheme,\n strategy?: LayoutStrategy,\n): LayoutDimensions {\n const { width, height } = options;\n\n const padding = scalePadding(theme.spacing.padding, width, height);\n const axisMargin = theme.spacing.axisMargin;\n const chromeMode = strategy?.chromeMode ?? 'full';\n\n // Compute chrome with mode and scaled padding\n const chrome = computeChrome(\n chromeToInput(spec.chrome),\n theme,\n width,\n options.measureText,\n chromeMode,\n padding,\n );\n\n // Start with the total rect\n const total: Rect = { x: 0, y: 0, width, height };\n\n // Radial charts (pie/donut) don't have axes, so skip axis space\n const isRadial = spec.type === 'pie' || spec.type === 'donut';\n const encoding = spec.encoding as Encoding;\n\n // Estimate x-axis height below chart area: tick labels sit 14px below,\n // axis title sits 35px below. These extend past the chart area bottom\n // and source/footer chrome must be positioned below them.\n const xAxis = encoding.x?.axis as (Record<string, unknown> & { tickAngle?: number }) | undefined;\n const hasXAxisLabel = !!xAxis?.label;\n const xTickAngle = xAxis?.tickAngle;\n\n let xAxisHeight: number;\n if (isRadial) {\n xAxisHeight = 0;\n } else if (xTickAngle && Math.abs(xTickAngle) > 10) {\n // Rotated labels: estimate height from the longest label text.\n // At -90 degrees, the label height = text width. At -45, it's width * sin(45).\n const angleRad = Math.abs(xTickAngle) * (Math.PI / 180);\n const xField = encoding.x?.field;\n let maxLabelWidth = 40; // fallback\n if (xField) {\n for (const row of spec.data) {\n const label = String(row[xField] ?? '');\n const w = estimateTextWidth(label, theme.fonts.sizes.axisTick, theme.fonts.weights.normal);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n }\n // Rotated label height: width * sin(angle), plus a small gap\n const rotatedHeight = maxLabelWidth * Math.sin(angleRad) + 6;\n // Cap at a reasonable max to avoid absurd margins\n const labelHeight = Math.min(rotatedHeight, 120);\n xAxisHeight = hasXAxisLabel ? labelHeight + 20 : labelHeight;\n } else {\n xAxisHeight = hasXAxisLabel ? 48 : 26;\n }\n\n // Build margins: padding + chrome + axis space\n const margins: Margins = {\n top: padding + chrome.topHeight + axisMargin,\n right: padding + (isRadial ? padding : axisMargin),\n bottom: padding + chrome.bottomHeight + xAxisHeight,\n left: padding + (isRadial ? padding : axisMargin),\n };\n\n // Dynamic right margin for line/area end-of-line labels.\n // Only reserve space when labels will actually render (density != 'none').\n const labelDensity = spec.labels.density;\n if ((spec.type === 'line' || spec.type === 'area') && labelDensity !== 'none') {\n // Estimate label width from longest series name (color encoding domain)\n const colorField = encoding.color?.field;\n if (colorField) {\n let maxLabelWidth = 0;\n const seen = new Set<string>();\n for (const row of spec.data) {\n const label = String(row[colorField] ?? '');\n if (!seen.has(label)) {\n seen.add(label);\n const w = estimateTextWidth(label, 11, 600);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n }\n if (maxLabelWidth > 0) {\n margins.right = Math.max(margins.right, padding + maxLabelWidth + 16);\n }\n }\n }\n\n // Dynamic left margin for y-axis labels\n if (encoding.y && !isRadial) {\n if (\n spec.type === 'bar' ||\n spec.type === 'dot' ||\n encoding.y.type === 'nominal' ||\n encoding.y.type === 'ordinal'\n ) {\n // Category labels on the left for bar/dot charts\n const yField = encoding.y.field;\n let maxLabelWidth = 0;\n for (const row of spec.data) {\n const label = String(row[yField] ?? '');\n const w = estimateTextWidth(label, theme.fonts.sizes.axisTick, theme.fonts.weights.normal);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n if (maxLabelWidth > 0) {\n margins.left = Math.max(margins.left, padding + maxLabelWidth + 12);\n }\n } else if (encoding.y.type === 'quantitative' || encoding.y.type === 'temporal') {\n // Numeric tick labels on the left. Estimate width from the data range.\n const yField = encoding.y.field;\n let maxAbsVal = 0;\n for (const row of spec.data) {\n const v = Number(row[yField]);\n if (Number.isFinite(v) && Math.abs(v) > maxAbsVal) maxAbsVal = Math.abs(v);\n }\n // Estimate the formatted label: abbreviateNumber for >= 1000, formatNumber otherwise\n let sampleLabel: string;\n if (maxAbsVal >= 1_000_000_000) sampleLabel = '1.5B';\n else if (maxAbsVal >= 1_000_000) sampleLabel = '1.5M';\n else if (maxAbsVal >= 1_000) sampleLabel = '1.5K';\n else if (maxAbsVal >= 100) sampleLabel = '100';\n else if (maxAbsVal >= 10) sampleLabel = '10';\n else sampleLabel = '0.0';\n // Account for negative sign\n const negPrefix = spec.data.some((r) => Number(r[yField]) < 0) ? '-' : '';\n const labelEst = negPrefix + sampleLabel;\n const labelWidth = estimateTextWidth(\n labelEst,\n theme.fonts.sizes.axisTick,\n theme.fonts.weights.normal,\n );\n // 6px gap between label and chart area edge\n margins.left = Math.max(margins.left, padding + labelWidth + 10);\n }\n }\n\n // Rotated y-axis label needs extra left margin (rendered at area.x - 45 in SVG)\n if (encoding.y?.axis && (encoding.y.axis as Record<string, unknown>).label && !isRadial) {\n const rotatedLabelMargin = 45 + Math.ceil(theme.fonts.sizes.body / 2) + 4;\n margins.left = Math.max(margins.left, padding + rotatedLabelMargin);\n }\n\n // Reserve legend space\n if (legendLayout.entries.length > 0) {\n if (legendLayout.position === 'right' || legendLayout.position === 'bottom-right') {\n margins.right += legendLayout.bounds.width + 8;\n } else if (legendLayout.position === 'top') {\n margins.top += legendLayout.bounds.height + 4;\n } else if (legendLayout.position === 'bottom') {\n margins.bottom += legendLayout.bounds.height + 4;\n }\n }\n\n // Chart area is what's left after margins\n let chartArea: Rect = {\n x: margins.left,\n y: margins.top,\n width: Math.max(0, width - margins.left - margins.right),\n height: Math.max(0, height - margins.top - margins.bottom),\n };\n\n // Guardrail: if chart area is too small, progressively strip chrome\n if (\n (chartArea.width < MIN_CHART_WIDTH || chartArea.height < MIN_CHART_HEIGHT) &&\n chromeMode !== 'hidden'\n ) {\n // Try compact first, then hidden\n const fallbackMode = chromeMode === 'full' ? 'compact' : 'hidden';\n const fallbackChrome = computeChrome(\n chromeToInput(spec.chrome),\n theme,\n width,\n options.measureText,\n fallbackMode as 'compact' | 'hidden',\n padding,\n );\n\n // Recalculate top/bottom margins with stripped chrome\n const newTop = padding + fallbackChrome.topHeight + axisMargin;\n const topDelta = margins.top - newTop;\n const newBottom = padding + fallbackChrome.bottomHeight + xAxisHeight;\n const bottomDelta = margins.bottom - newBottom;\n\n if (topDelta > 0 || bottomDelta > 0) {\n margins.top =\n newTop +\n (legendLayout.entries.length > 0 && legendLayout.position === 'top'\n ? legendLayout.bounds.height + 4\n : 0);\n margins.bottom = newBottom;\n\n chartArea = {\n x: margins.left,\n y: margins.top,\n width: Math.max(0, width - margins.left - margins.right),\n height: Math.max(0, height - margins.top - margins.bottom),\n };\n\n return { total, chrome: fallbackChrome, chartArea, margins, theme };\n }\n }\n\n return { total, chrome, chartArea, margins, theme };\n}\n","/**\n * Gridline computation.\n *\n * Produces horizontal gridlines at y-axis tick positions and optional\n * vertical gridlines at x-axis tick positions.\n */\n\nimport type { Rect } from '@opendata-ai/openchart-core';\nimport type { AxesResult } from './axes';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single gridline with start/end positions. */\nexport interface GridlineSpec {\n /** Start x. */\n x1: number;\n /** Start y. */\n y1: number;\n /** End x. */\n x2: number;\n /** End y. */\n y2: number;\n /** Whether this is a major gridline. */\n major: boolean;\n}\n\n/** Complete gridline layout. */\nexport interface GridlineLayout {\n horizontal: GridlineSpec[];\n vertical: GridlineSpec[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute gridlines from axis layouts.\n *\n * Horizontal gridlines span the chart width at y-axis tick positions.\n * Vertical gridlines span the chart height at x-axis tick positions.\n *\n * @param axes - Computed axis layouts.\n * @param chartArea - The chart drawing area.\n * @param showVertical - Whether to include vertical gridlines (default: false).\n */\nexport function computeGridlines(\n axes: AxesResult,\n chartArea: Rect,\n showVertical = false,\n): GridlineLayout {\n const horizontal: GridlineSpec[] = [];\n const vertical: GridlineSpec[] = [];\n\n // Horizontal gridlines at y-axis ticks\n if (axes.y) {\n for (const gridline of axes.y.gridlines) {\n horizontal.push({\n x1: chartArea.x,\n y1: gridline.position,\n x2: chartArea.x + chartArea.width,\n y2: gridline.position,\n major: gridline.major,\n });\n }\n }\n\n // Vertical gridlines at x-axis ticks (off by default)\n if (showVertical && axes.x) {\n for (const gridline of axes.x.gridlines) {\n vertical.push({\n x1: gridline.position,\n y1: chartArea.y,\n x2: gridline.position,\n y2: chartArea.y + chartArea.height,\n major: gridline.major,\n });\n }\n }\n\n return { horizontal, vertical };\n}\n","/**\n * Scale computation from encoding spec + data.\n *\n * Creates D3 scales that map data values to pixel positions.\n * Temporal -> scaleTime(), quantitative -> scaleLinear(),\n * nominal/ordinal -> scaleBand() or scaleOrdinal(), depending on context.\n */\n\nimport type { DataRow, Encoding, EncodingChannel, Rect } from '@opendata-ai/openchart-core';\nimport { extent, max, min } from 'd3-array';\nimport type {\n ScaleBand,\n ScaleLinear,\n ScaleLogarithmic,\n ScaleOrdinal,\n ScalePoint,\n ScaleTime,\n} from 'd3-scale';\nimport { scaleBand, scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleTime } from 'd3-scale';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Continuous D3 scales (linear, time, log) that support .ticks() and .nice(). */\nexport type D3ContinuousScale =\n | ScaleLinear<number, number>\n | ScaleTime<number, number>\n | ScaleLogarithmic<number, number>;\n\n/** Categorical D3 scales (band, point, ordinal) that support .domain() as string[]. */\nexport type D3CategoricalScale =\n | ScaleBand<string>\n | ScalePoint<string>\n | ScaleOrdinal<string, string>;\n\n/** Union of all D3 scale types used by the engine. */\nexport type D3Scale = D3ContinuousScale | D3CategoricalScale;\n\n/** A sequential color scale mapping numbers to color strings. */\nexport type D3SequentialColorScale = ScaleLinear<string, string>;\n\n/**\n * A resolved scale wrapping a d3 scale with type metadata.\n * We need to carry the scale type around so axes and marks know\n * how to interpret the domain/range. Consumers use the `type` discriminant\n * to determine which D3 methods are available on the scale.\n */\nexport interface ResolvedScale {\n /** The d3 scale function. Maps domain value -> pixel position or color. */\n scale: D3Scale;\n /** The scale type for downstream use. */\n type: 'linear' | 'time' | 'band' | 'ordinal' | 'point' | 'log' | 'sequential';\n /** The encoding channel this scale was derived from. */\n channel: EncodingChannel;\n}\n\n/** All resolved scales for a chart. */\nexport interface ResolvedScales {\n x?: ResolvedScale;\n y?: ResolvedScale;\n color?: ResolvedScale;\n size?: ResolvedScale;\n /** Default color for single-series charts (first categorical palette color). */\n defaultColor?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Extract all non-null values for a field from data. */\nfunction fieldValues(data: DataRow[], field: string): unknown[] {\n return data.map((d) => d[field]).filter((v) => v != null);\n}\n\n/** Parse values to dates. */\nfunction parseDates(values: unknown[]): Date[] {\n return values\n .map((v) => (v instanceof Date ? v : new Date(String(v))))\n .filter((d) => !Number.isNaN(d.getTime()));\n}\n\n/** Parse values to numbers. */\nfunction parseNumbers(values: unknown[]): number[] {\n return values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((n) => Number.isFinite(n));\n}\n\n/** Get unique string values preserving order. */\nfunction uniqueStrings(values: unknown[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const v of values) {\n const s = String(v);\n if (!seen.has(s)) {\n seen.add(s);\n result.push(s);\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Scale builders\n// ---------------------------------------------------------------------------\n\nfunction buildTimeScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseDates(fieldValues(data, channel.field));\n const domain = channel.scale?.domain\n ? [new Date(channel.scale.domain[0] as string), new Date(channel.scale.domain[1] as string)]\n : (extent(values) as [Date, Date]);\n\n const scale = scaleTime().domain(domain).range([rangeStart, rangeEnd]);\n\n if (channel.scale?.nice !== false) {\n scale.nice();\n }\n\n return { scale, type: 'time', channel };\n}\n\nfunction buildLinearScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field));\n\n let domainMin: number;\n let domainMax: number;\n\n if (channel.scale?.domain) {\n const [d0, d1] = channel.scale.domain as [number, number];\n domainMin = d0;\n domainMax = d1;\n } else {\n domainMin = min(values) ?? 0;\n domainMax = max(values) ?? 1;\n\n // Include zero by default for quantitative scales\n if (channel.scale?.zero !== false) {\n domainMin = Math.min(0, domainMin);\n domainMax = Math.max(0, domainMax);\n }\n }\n\n const scale = scaleLinear().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]);\n\n if (channel.scale?.nice !== false) {\n scale.nice();\n }\n\n return { scale, type: 'linear', channel };\n}\n\nfunction buildLogScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field)).filter((v) => v > 0);\n const domainMin = min(values) ?? 1;\n const domainMax = max(values) ?? 10;\n\n const scale = scaleLog().domain([domainMin, domainMax]).range([rangeStart, rangeEnd]).nice();\n\n return { scale, type: 'log', channel };\n}\n\nfunction buildBandScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = channel.scale?.domain\n ? (channel.scale.domain as string[])\n : uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scaleBand().domain(values).range([rangeStart, rangeEnd]).padding(0.35);\n\n return { scale, type: 'band', channel };\n}\n\nfunction buildPointScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n): ResolvedScale {\n const values = channel.scale?.domain\n ? (channel.scale.domain as string[])\n : uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scalePoint().domain(values).range([rangeStart, rangeEnd]).padding(0.5);\n\n return { scale, type: 'point', channel };\n}\n\nfunction buildOrdinalColorScale(\n channel: EncodingChannel,\n data: DataRow[],\n palette: string[],\n): ResolvedScale {\n const values = uniqueStrings(fieldValues(data, channel.field));\n\n const scale = scaleOrdinal<string>().domain(values).range(palette);\n\n return { scale, type: 'ordinal', channel };\n}\n\nfunction buildSequentialColorScale(\n channel: EncodingChannel,\n data: DataRow[],\n palette: string[],\n): ResolvedScale {\n const values = parseNumbers(fieldValues(data, channel.field));\n const domainMin = min(values) ?? 0;\n const domainMax = max(values) ?? 1;\n\n const scale = scaleLinear<string>()\n .domain([domainMin, domainMax])\n .range([palette[0], palette[palette.length - 1]])\n .clamp(true);\n\n // Cast: sequential color scale (number -> string) is structurally incompatible\n // with D3Scale (number -> number), but is only ever accessed via scales.color\n // where consumers already cast appropriately.\n return { scale: scale as unknown as D3Scale, type: 'sequential', channel };\n}\n\n// ---------------------------------------------------------------------------\n// Positional scale selection\n// ---------------------------------------------------------------------------\n\n/**\n * Choose the right scale type for a positional channel (x or y).\n * Respects explicit scale.type overrides from the spec.\n */\nfunction buildPositionalScale(\n channel: EncodingChannel,\n data: DataRow[],\n rangeStart: number,\n rangeEnd: number,\n chartType: string,\n axis: 'x' | 'y',\n): ResolvedScale {\n // Explicit scale type override\n if (channel.scale?.type) {\n switch (channel.scale.type) {\n case 'time':\n return buildTimeScale(channel, data, rangeStart, rangeEnd);\n case 'linear':\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n case 'log':\n return buildLogScale(channel, data, rangeStart, rangeEnd);\n case 'band':\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n case 'point':\n return buildPointScale(channel, data, rangeStart, rangeEnd);\n case 'ordinal':\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n }\n }\n\n // Infer from field type\n switch (channel.type) {\n case 'temporal':\n return buildTimeScale(channel, data, rangeStart, rangeEnd);\n case 'quantitative':\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n case 'nominal':\n case 'ordinal':\n // Bar/column charts use band scales for their categorical axis\n if (\n (chartType === 'bar' && axis === 'y') ||\n (chartType === 'column' && axis === 'x') ||\n (chartType === 'dot' && axis === 'y')\n ) {\n return buildBandScale(channel, data, rangeStart, rangeEnd);\n }\n return buildPointScale(channel, data, rangeStart, rangeEnd);\n default:\n return buildLinearScale(channel, data, rangeStart, rangeEnd);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute D3 scales from encoding channels and data.\n *\n * @param spec - Normalized chart spec.\n * @param chartArea - The computed chart drawing area.\n * @param data - Data rows.\n * @returns ResolvedScales with d3 scale instances.\n */\nexport function computeScales(\n spec: NormalizedChartSpec,\n chartArea: Rect,\n data: DataRow[],\n): ResolvedScales {\n const result: ResolvedScales = {};\n const encoding = spec.encoding as Encoding;\n\n // Scatter/bubble charts should NOT include zero by default (tight domain fits data range)\n if (spec.type === 'scatter') {\n if (encoding.x?.type === 'quantitative' && encoding.x.scale?.zero === undefined) {\n if (!encoding.x.scale) {\n (encoding.x as { scale?: Record<string, unknown> }).scale = { zero: false };\n } else {\n (encoding.x.scale as Record<string, unknown>).zero = false;\n }\n }\n if (encoding.y?.type === 'quantitative' && encoding.y.scale?.zero === undefined) {\n if (!encoding.y.scale) {\n (encoding.y as { scale?: Record<string, unknown> }).scale = { zero: false };\n } else {\n (encoding.y.scale as Record<string, unknown>).zero = false;\n }\n }\n }\n\n if (encoding.x) {\n // For stacked bars, the x-domain needs the max category sum, not max individual value.\n // Without this, stacked bars would clip past the chart area.\n let xData = data;\n if (spec.type === 'bar' && encoding.color && encoding.x.type === 'quantitative') {\n const yField = encoding.y?.field;\n const xField = encoding.x.field;\n if (yField) {\n const sums = new Map<string, number>();\n for (const row of data) {\n const cat = String(row[yField] ?? '');\n const val = Number(row[xField] ?? 0);\n if (Number.isFinite(val) && val > 0) {\n sums.set(cat, (sums.get(cat) ?? 0) + val);\n }\n }\n const maxSum = Math.max(...sums.values(), 0);\n // Create a synthetic row with the max stack sum so buildLinearScale sees it\n xData = [...data, { [xField]: maxSum } as DataRow];\n }\n }\n\n result.x = buildPositionalScale(\n encoding.x,\n xData,\n chartArea.x,\n chartArea.x + chartArea.width,\n spec.type,\n 'x',\n );\n }\n\n if (encoding.y) {\n // For stacked columns and stacked areas, the y-domain needs the max category\n // sum, not the max individual value. Without this, stacked marks would clip\n // above the chart area.\n let yData = data;\n if (\n (spec.type === 'column' || spec.type === 'area') &&\n encoding.color &&\n encoding.y.type === 'quantitative'\n ) {\n const xField = encoding.x?.field;\n const yField = encoding.y.field;\n if (xField) {\n const sums = new Map<string, number>();\n for (const row of data) {\n const cat = String(row[xField] ?? '');\n const val = Number(row[yField] ?? 0);\n if (Number.isFinite(val) && val > 0) {\n sums.set(cat, (sums.get(cat) ?? 0) + val);\n }\n }\n const maxSum = Math.max(...sums.values(), 0);\n // Create a synthetic row with the max stack sum so buildLinearScale sees it\n yData = [...data, { [yField]: maxSum } as DataRow];\n }\n }\n\n // Y axis: range is inverted (SVG y goes down, data y goes up)\n result.y = buildPositionalScale(\n encoding.y,\n yData,\n chartArea.y + chartArea.height,\n chartArea.y,\n spec.type,\n 'y',\n );\n }\n\n if (encoding.color) {\n const defaultPalette = [\n '#1b7fa3',\n '#c44e52',\n '#6a9f58',\n '#d47215',\n '#507e79',\n '#9a6a8d',\n '#c4636b',\n '#9c755f',\n '#a88f22',\n '#858078',\n ];\n\n if (encoding.color.type === 'quantitative') {\n // Sequential color scale for value-based coloring\n result.color = buildSequentialColorScale(encoding.color, data, defaultPalette);\n } else {\n // Categorical color scale for nominal/ordinal grouping\n result.color = buildOrdinalColorScale(encoding.color, data, defaultPalette);\n }\n }\n\n return result;\n}\n","/**\n * Legend computation.\n *\n * Derives legend entries from the color encoding's unique values in data,\n * computes position based on layout strategy, and returns a LegendLayout\n * that dimensions.ts uses to reserve space in the chart area.\n *\n * The legend is computed early (before marks) so the chartArea accounts\n * for legend space. Entries come from data + encoding, not marks.\n *\n * Overflow protection: when there are too many entries for the available\n * space, entries are truncated and a \"+N more\" indicator is appended.\n */\n\nimport type {\n LayoutStrategy,\n LegendEntry,\n LegendLayout,\n Rect,\n ResolvedTheme,\n TextStyle,\n} from '@opendata-ai/openchart-core';\nimport { BRAND_RESERVE_WIDTH, estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SWATCH_SIZE = 12;\nconst SWATCH_GAP = 6;\nconst ENTRY_GAP = 16;\nconst LEGEND_PADDING = 8;\nconst LEGEND_RIGHT_WIDTH = 120;\n\n/** Max fraction of chart area height for right-positioned legends. */\nconst RIGHT_LEGEND_MAX_HEIGHT_RATIO = 0.4;\n\n/** Max number of rows for top-positioned legends before truncation. */\nconst TOP_LEGEND_MAX_ROWS = 2;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Determine the swatch shape based on chart type. */\nfunction swatchShapeForType(chartType: string): LegendEntry['shape'] {\n switch (chartType) {\n case 'line':\n return 'line';\n case 'scatter':\n case 'dot':\n return 'circle';\n default:\n return 'square';\n }\n}\n\n/** Extract unique color values from data based on the color encoding. */\nfunction extractColorEntries(spec: NormalizedChartSpec, theme: ResolvedTheme): LegendEntry[] {\n const colorEnc = spec.encoding.color;\n if (!colorEnc) return [];\n\n // Sequential (quantitative) color doesn't produce discrete legend entries\n if (colorEnc.type === 'quantitative') return [];\n\n const uniqueValues = [...new Set(spec.data.map((d) => String(d[colorEnc.field])))];\n const palette = theme.colors.categorical;\n const shape = swatchShapeForType(spec.type);\n\n return uniqueValues.map((value, i) => ({\n label: value,\n color: palette[i % palette.length],\n shape,\n active: true,\n }));\n}\n\n/**\n * Calculate how many entries fit within a given number of horizontal rows.\n */\nfunction entriesThatFit(\n entries: LegendEntry[],\n maxWidth: number,\n maxRows: number,\n labelStyle: TextStyle,\n): number {\n let row = 1;\n let rowWidth = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const labelWidth = estimateTextWidth(\n entries[i].label,\n labelStyle.fontSize,\n labelStyle.fontWeight,\n );\n const entryWidth = SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n\n if (rowWidth + entryWidth > maxWidth && rowWidth > 0) {\n row++;\n rowWidth = entryWidth;\n if (row > maxRows) return i;\n } else {\n rowWidth += entryWidth;\n }\n }\n\n return entries.length;\n}\n\n/**\n * Truncate entries and add a \"+N more\" indicator if needed.\n */\nfunction truncateEntries(entries: LegendEntry[], maxCount: number): LegendEntry[] {\n if (maxCount >= entries.length || maxCount <= 0) return entries;\n\n const truncated = entries.slice(0, maxCount);\n const remaining = entries.length - maxCount;\n truncated.push({\n label: `+${remaining} more`,\n color: '#999999',\n shape: 'square',\n active: false,\n overflow: true,\n });\n\n return truncated;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute legend layout for a chart spec.\n *\n * @param spec - Normalized chart spec.\n * @param strategy - Responsive layout strategy.\n * @param theme - Resolved theme.\n * @param chartArea - The available chart area (before legend space is reserved).\n * @returns LegendLayout with position, entries, and bounds.\n */\nexport function computeLegend(\n spec: NormalizedChartSpec,\n strategy: LayoutStrategy,\n theme: ResolvedTheme,\n chartArea: Rect,\n): LegendLayout {\n // Legend explicitly hidden via show: false, or height strategy says no legend\n if (spec.legend?.show === false || strategy.legendMaxHeight === 0) {\n return {\n position: 'top',\n entries: [],\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle: {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n },\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n }\n\n let entries = extractColorEntries(spec, theme);\n\n const labelStyle: TextStyle = {\n fontFamily: theme.fonts.family,\n fontSize: theme.fonts.sizes.small,\n fontWeight: theme.fonts.weights.normal,\n fill: theme.colors.text,\n lineHeight: 1.3,\n };\n\n // Resolve position: spec-level override wins, then responsive strategy\n const resolvedPosition =\n spec.legend?.position ?? (strategy.legendPosition === 'right' ? 'right' : 'top');\n\n // No entries = empty legend with no space\n if (entries.length === 0) {\n return {\n position: resolvedPosition,\n entries: [],\n bounds: { x: 0, y: 0, width: 0, height: 0 },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n }\n\n if (resolvedPosition === 'right' || resolvedPosition === 'bottom-right') {\n // Right-positioned legend: vertical stack\n const maxLabelWidth = Math.max(\n ...entries.map((e) => estimateTextWidth(e.label, labelStyle.fontSize, labelStyle.fontWeight)),\n );\n const legendWidth = Math.min(\n LEGEND_RIGHT_WIDTH,\n SWATCH_SIZE + SWATCH_GAP + maxLabelWidth + LEGEND_PADDING * 2,\n );\n const entryHeight = Math.max(SWATCH_SIZE, labelStyle.fontSize * labelStyle.lineHeight);\n\n // Apply max height ratio (default 40% of chart area, strategy can override)\n const maxHeightRatio =\n strategy.legendMaxHeight > 0 ? strategy.legendMaxHeight : RIGHT_LEGEND_MAX_HEIGHT_RATIO;\n const maxLegendHeight = chartArea.height * maxHeightRatio;\n\n // Calculate how many entries fit\n const maxEntries = Math.max(\n 1,\n Math.floor((maxLegendHeight - LEGEND_PADDING * 2) / (entryHeight + 4)),\n );\n if (entries.length > maxEntries) {\n entries = truncateEntries(entries, maxEntries);\n }\n\n const legendHeight =\n entries.length * entryHeight + (entries.length - 1) * 4 + LEGEND_PADDING * 2;\n const clampedHeight = Math.min(legendHeight, chartArea.height);\n\n // bottom-right anchors to the bottom of the chart area\n const legendY =\n resolvedPosition === 'bottom-right'\n ? chartArea.y + chartArea.height - clampedHeight\n : chartArea.y;\n\n // Apply user-provided legend offset\n const offsetDx = spec.legend?.offset?.dx ?? 0;\n const offsetDy = spec.legend?.offset?.dy ?? 0;\n\n return {\n position: resolvedPosition,\n entries,\n bounds: {\n x: chartArea.x + chartArea.width - legendWidth + offsetDx,\n y: legendY + offsetDy,\n width: legendWidth,\n height: clampedHeight,\n },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: 4,\n };\n }\n\n // Top/bottom-positioned legend: horizontal flow with overflow protection.\n // Reserve space on the right so legend entries don't overlap the brand watermark.\n const availableWidth = chartArea.width - LEGEND_PADDING * 2 - BRAND_RESERVE_WIDTH;\n const maxFit = entriesThatFit(entries, availableWidth, TOP_LEGEND_MAX_ROWS, labelStyle);\n\n if (maxFit < entries.length) {\n entries = truncateEntries(entries, maxFit);\n }\n\n const totalWidth = entries.reduce((sum, entry) => {\n const labelWidth = estimateTextWidth(entry.label, labelStyle.fontSize, labelStyle.fontWeight);\n return sum + SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n }, 0);\n\n // Calculate actual row count for height\n let rowCount = 1;\n let rowWidth = 0;\n for (const entry of entries) {\n const labelWidth = estimateTextWidth(entry.label, labelStyle.fontSize, labelStyle.fontWeight);\n const entryWidth = SWATCH_SIZE + SWATCH_GAP + labelWidth + ENTRY_GAP;\n if (rowWidth + entryWidth > availableWidth && rowWidth > 0) {\n rowCount++;\n rowWidth = entryWidth;\n } else {\n rowWidth += entryWidth;\n }\n }\n\n const rowHeight = SWATCH_SIZE + 4;\n const legendHeight = rowCount * rowHeight + LEGEND_PADDING * 2;\n\n // Apply user-provided legend offset\n const offsetDx = spec.legend?.offset?.dx ?? 0;\n const offsetDy = spec.legend?.offset?.dy ?? 0;\n\n return {\n position: resolvedPosition,\n entries,\n bounds: {\n x: chartArea.x + offsetDx,\n y:\n (resolvedPosition === 'bottom'\n ? chartArea.y + chartArea.height - legendHeight\n : chartArea.y) + offsetDy,\n width: Math.min(totalWidth, availableWidth),\n height: legendHeight,\n },\n labelStyle,\n swatchSize: SWATCH_SIZE,\n swatchGap: SWATCH_GAP,\n entryGap: ENTRY_GAP,\n };\n}\n","/**\n * Table compilation pipeline.\n *\n * Takes a NormalizedTableSpec and produces a fully resolved TableLayout:\n * resolve columns -> build search index -> sort data -> filter by search ->\n * paginate -> format visible cells -> apply visual enhancements -> return\n */\n\nimport type {\n CellStyle,\n ColumnConfig,\n CompileTableOptions,\n PaginationState,\n ResolvedColumn,\n ResolvedTheme,\n TableCell,\n TableLayout,\n TableRow,\n} from '@opendata-ai/openchart-core';\nimport { computeChrome, estimateTextWidth } from '@opendata-ai/openchart-core';\n\nimport type { NormalizedTableSpec } from '../compiler/types';\nimport { computeBarCell, computeColumnMax, computeColumnMin } from './bar-column';\nimport { computeCategoryColors } from './category-colors';\nimport { formatCell } from './format-cells';\nimport { computeHeatmapColors } from './heatmap';\nimport { paginateData } from './pagination';\nimport { buildSearchIndex, filterBySearch } from './search';\nimport { sortData } from './sort';\nimport { computeSparklineForRow, type SparklineData } from './sparkline';\n\n// ---------------------------------------------------------------------------\n// Column resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the cell type for a column based on its config.\n * Precedence: sparkline > bar > heatmap > image > flag > categoryColors > text\n */\nfunction determineCellType(col: ColumnConfig): ResolvedColumn['cellType'] {\n if (col.sparkline) return 'sparkline';\n if (col.bar) return 'bar';\n if (col.heatmap) return 'heatmap';\n if (col.image) return 'image';\n if (col.flag) return 'flag';\n if (col.categoryColors) return 'category';\n return 'text';\n}\n\n/**\n * Infer alignment for a column.\n * Explicit align wins. Otherwise: right for numeric data, left for everything else.\n */\nfunction inferAlignment(\n col: ColumnConfig,\n data: Record<string, unknown>[],\n): 'left' | 'center' | 'right' {\n if (col.align) return col.align;\n\n // Check first non-null value in the data\n for (const row of data) {\n const val = row[col.key];\n if (val != null) {\n return typeof val === 'number' ? 'right' : 'left';\n }\n }\n return 'left';\n}\n\n/**\n * Estimate the needed width for a column by measuring header and data values.\n * Samples up to 100 rows for estimation.\n */\nfunction estimateColumnWidth(\n col: ColumnConfig,\n data: Record<string, unknown>[],\n fontSize: number,\n): number {\n const MIN_WIDTH = 60;\n const PADDING = 24; // cell padding\n\n // Visual columns get fixed widths (they render graphics, not text)\n if (col.sparkline) return 140;\n if (col.image) return (col.image.width ?? 24) + PADDING;\n if (col.flag) return 60;\n\n // Header width\n const label = col.label ?? col.key;\n const headerWidth = estimateTextWidth(label, fontSize, 600) + PADDING;\n\n // Sample data values\n const sampleSize = Math.min(100, data.length);\n let maxDataWidth = 0;\n\n for (let i = 0; i < sampleSize; i++) {\n const val = data[i][col.key];\n const text = val == null ? '' : String(val);\n const width = estimateTextWidth(text, fontSize, 400) + PADDING;\n if (width > maxDataWidth) maxDataWidth = width;\n }\n\n return Math.max(MIN_WIDTH, headerWidth, maxDataWidth);\n}\n\n/**\n * Resolve all columns: compute widths, types, alignment.\n */\nfunction resolveColumns(\n columns: ColumnConfig[],\n data: Record<string, unknown>[],\n totalWidth: number,\n theme: ResolvedTheme,\n): ResolvedColumn[] {\n const fontSize = theme.fonts.sizes.body;\n\n // Compute natural widths and identify fixed-width visual columns.\n // Visual columns (sparkline, image, flag) get fixed sizes; only text\n // columns participate in proportional scaling to fill the container.\n const isFixed = columns.map((col) => !!(col.sparkline || col.image || col.flag));\n\n const naturalWidths = columns.map((col) => {\n if (col.width) {\n // Parse explicit width\n if (col.width.endsWith('px')) {\n return parseInt(col.width, 10) || 100;\n }\n if (col.width.endsWith('%')) {\n return (parseFloat(col.width) / 100) * totalWidth || 100;\n }\n return parseInt(col.width, 10) || 100;\n }\n return estimateColumnWidth(col, data, fontSize);\n });\n\n // Fixed columns keep their natural width; remaining space goes to text columns\n const fixedTotal = naturalWidths.reduce((sum, w, i) => sum + (isFixed[i] ? w : 0), 0);\n const flexTotal = naturalWidths.reduce((sum, w, i) => sum + (isFixed[i] ? 0 : w), 0);\n const remainingWidth = totalWidth - fixedTotal;\n const flexScale = flexTotal > 0 && remainingWidth > 0 ? remainingWidth / flexTotal : 1;\n\n return columns.map((col, i) => ({\n key: col.key,\n label: col.label ?? col.key,\n width: Math.max(60, isFixed[i] ? naturalWidths[i] : Math.round(naturalWidths[i] * flexScale)),\n sortable: col.sortable ?? true,\n align: inferAlignment(col, data),\n cellType: determineCellType(col),\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Cell building\n// ---------------------------------------------------------------------------\n\n/**\n * Build a fully resolved TableCell from a data value and column config.\n */\nfunction buildCell(\n value: unknown,\n column: ColumnConfig,\n resolvedColumn: ResolvedColumn,\n heatmapStyle: CellStyle | undefined,\n categoryStyle: CellStyle | undefined,\n barData:\n | { barPercent: number; barOffset: number; barColor: string; isNegative: boolean }\n | undefined,\n sparklineData: SparklineData | null,\n): TableCell {\n const base = formatCell(value, column);\n\n // Apply font variant for number columns\n if (typeof value === 'number') {\n base.style = { ...base.style, fontVariant: 'tabular-nums' };\n }\n\n const cellType = resolvedColumn.cellType;\n\n switch (cellType) {\n case 'heatmap': {\n const merged = heatmapStyle ? { ...base.style, ...heatmapStyle } : base.style;\n return {\n ...base,\n cellType: 'heatmap',\n style: merged,\n };\n }\n case 'category': {\n const merged = categoryStyle ? { ...base.style, ...categoryStyle } : base.style;\n return {\n ...base,\n cellType: 'category',\n style: merged,\n };\n }\n case 'bar': {\n return {\n ...base,\n cellType: 'bar',\n barWidth: barData?.barPercent ?? 0,\n barOffset: barData?.barOffset ?? 0,\n barColor: barData?.barColor ?? '#ccc',\n isNegative: barData?.isNegative ?? false,\n };\n }\n case 'sparkline': {\n return {\n ...base,\n cellType: 'sparkline',\n sparklineData,\n };\n }\n case 'image': {\n const src = typeof value === 'string' ? value : '';\n const imgConfig = column.image ?? {};\n return {\n ...base,\n cellType: 'image',\n src,\n imageWidth: imgConfig.width ?? 24,\n imageHeight: imgConfig.height ?? 24,\n rounded: imgConfig.rounded ?? false,\n };\n }\n case 'flag': {\n const code = typeof value === 'string' ? value : '';\n return {\n ...base,\n cellType: 'flag',\n countryCode: code,\n };\n }\n default: {\n return {\n ...base,\n cellType: 'text',\n };\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main pipeline\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a normalized table spec into a TableLayout.\n *\n * Pipeline:\n * 1. Resolve columns (widths, types, alignment)\n * 2. Build search index\n * 3. Sort data\n * 4. Filter by search\n * 5. Paginate\n * 6. Format visible cells and apply visual enhancements\n * 7. Return TableLayout\n */\nexport function compileTableLayout(\n spec: NormalizedTableSpec,\n options: CompileTableOptions,\n theme: ResolvedTheme,\n): TableLayout {\n const data = spec.data;\n const darkMode = theme.isDark;\n\n // 1. Resolve columns\n const resolvedColumns = resolveColumns(spec.columns, data, options.width, theme);\n\n // 2. Build search index (over full dataset, using original indices)\n const searchIndex = spec.search\n ? buildSearchIndex(data, spec.columns)\n : new Map<number, string>();\n\n // 3. Track original indices through the pipeline\n let currentData = data;\n let originalIndices = data.map((_, i) => i);\n\n // 4. Sort\n if (options.sort) {\n const sorted = sortData(currentData, options.sort);\n // Map sorted originalIndices back through our current index mapping\n originalIndices = sorted.originalIndices.map((i) => originalIndices[i]);\n currentData = sorted.data;\n }\n\n // 5. Filter by search\n if (spec.search && options.search) {\n const filtered = filterBySearch(currentData, options.search, searchIndex, originalIndices);\n currentData = filtered.data;\n originalIndices = filtered.indices;\n }\n\n const totalFiltered = currentData.length;\n\n // 6. Paginate\n let pageSize = 0;\n let currentPage = 0;\n let paginationState: PaginationState | undefined;\n\n if (spec.pagination) {\n pageSize =\n options.pageSize ?? (typeof spec.pagination === 'object' ? spec.pagination.pageSize : 25);\n currentPage = options.page ?? 0;\n const paginated = paginateData(currentData, currentPage, pageSize);\n\n // Slice indices too\n const start = paginated.page * pageSize;\n const end = start + paginated.rows.length;\n const pageIndices = originalIndices.slice(start, end);\n\n currentData = paginated.rows;\n originalIndices = pageIndices;\n\n paginationState = {\n page: paginated.page,\n pageSize,\n totalRows: paginated.totalRows,\n totalPages: paginated.totalPages,\n };\n }\n\n // 7. Pre-compute visual enhancements for visible data columns\n // We need heatmap/category colors computed over the FULL dataset, then\n // applied only to visible rows.\n const heatmapMaps = new Map<string, Map<number, CellStyle>>();\n const categoryMaps = new Map<string, Map<number, CellStyle>>();\n const barMaxes = new Map<string, number>();\n const barMins = new Map<string, number>();\n\n for (let c = 0; c < spec.columns.length; c++) {\n const col = spec.columns[c];\n const resolved = resolvedColumns[c];\n\n if (resolved.cellType === 'heatmap' && col.heatmap) {\n heatmapMaps.set(col.key, computeHeatmapColors(data, col, theme, darkMode));\n }\n if (resolved.cellType === 'category' && col.categoryColors) {\n categoryMaps.set(col.key, computeCategoryColors(data, col, theme, darkMode));\n }\n if (resolved.cellType === 'bar' && col.bar) {\n barMaxes.set(col.key, computeColumnMax(data, col.key));\n barMins.set(col.key, computeColumnMin(data, col.key));\n }\n }\n\n // 8. Build rows from visible data\n const rows: TableRow[] = currentData.map((row, i) => {\n const origIdx = originalIndices[i];\n const rowId = spec.rowKey ? String(row[spec.rowKey] ?? origIdx) : String(origIdx);\n\n const cells: TableCell[] = spec.columns.map((col, c) => {\n const resolved = resolvedColumns[c];\n const value = row[col.key];\n\n // Lookup visual enhancement data\n const heatmapStyle = heatmapMaps.get(col.key)?.get(origIdx);\n const categoryStyle = categoryMaps.get(col.key)?.get(origIdx);\n\n let barData:\n | { barPercent: number; barOffset: number; barColor: string; isNegative: boolean }\n | undefined;\n if (resolved.cellType === 'bar' && col.bar && typeof value === 'number') {\n barData = computeBarCell(\n value,\n col.bar,\n barMaxes.get(col.key) ?? 0,\n barMins.get(col.key) ?? 0,\n theme,\n darkMode,\n );\n }\n\n let sparklineData: SparklineData | null = null;\n if (resolved.cellType === 'sparkline' && col.sparkline) {\n sparklineData = computeSparklineForRow(row, col.key, col.sparkline, theme, darkMode);\n }\n\n return buildCell(value, col, resolved, heatmapStyle, categoryStyle, barData, sparklineData);\n });\n\n return { id: rowId, cells, data: row };\n });\n\n // 9. Compute chrome\n const chrome = computeChrome(\n {\n title: spec.chrome.title,\n subtitle: spec.chrome.subtitle,\n source: spec.chrome.source,\n byline: spec.chrome.byline,\n footer: spec.chrome.footer,\n },\n theme,\n options.width,\n options.measureText,\n );\n\n // 10. Build a11y\n const titleText = spec.chrome.title?.text ?? '';\n const caption = titleText ? `Table: ${titleText}` : `Data table with ${data.length} rows`;\n\n return {\n chrome,\n columns: resolvedColumns,\n rows,\n sort: options.sort,\n pagination: paginationState,\n search: {\n enabled: spec.search,\n placeholder: 'Search...',\n query: options.search ?? '',\n },\n stickyFirstColumn: spec.stickyFirstColumn,\n compact: spec.compact,\n a11y: {\n caption,\n summary: `${resolvedColumns.length} columns, ${totalFiltered} rows`,\n },\n theme,\n };\n}\n","/**\n * Bar column computation for inline bar visualization in table cells.\n *\n * Computes bar width as a proportion of the max value.\n * Supports negative values with bidirectional bars.\n */\n\nimport type { BarColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\n\nconst NEGATIVE_BAR_COLOR = '#c44e52';\n\n/**\n * Compute the bar percentage, offset, and color for a single cell value.\n *\n * barPercent is 0-1. barOffset is 0-1 (left edge position).\n * When the column has negative values, bars extend bidirectionally from a zero line.\n */\nexport function computeBarCell(\n value: number,\n config: BarColumnConfig,\n columnMax: number,\n columnMin: number,\n theme: ResolvedTheme,\n _darkMode: boolean,\n): { barPercent: number; barOffset: number; barColor: string; isNegative: boolean } {\n const barColor = config.color ?? theme.colors.categorical[0];\n const hasNegatives = columnMin < 0;\n\n if (!Number.isFinite(value)) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n\n if (!hasNegatives) {\n // Positive-only column: simple left-to-right bars\n const maxValue = config.maxValue ?? columnMax;\n if (maxValue <= 0) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n const barPercent = Math.max(0, Math.min(1, value / maxValue));\n return { barPercent, barOffset: 0, barColor, isNegative: false };\n }\n\n // Bidirectional: zero line position proportional to data range\n const maxPos = config.maxValue ?? columnMax;\n const absMin = Math.abs(columnMin);\n const totalRange = maxPos + absMin;\n if (totalRange === 0) {\n return { barPercent: 0, barOffset: 0, barColor, isNegative: false };\n }\n\n const zeroPos = absMin / totalRange;\n\n if (value >= 0) {\n const barPercent = value / totalRange;\n return { barPercent, barOffset: zeroPos, barColor, isNegative: false };\n }\n\n // Negative value: red bar extending left from zero\n const barPercent = Math.abs(value) / totalRange;\n return {\n barPercent,\n barOffset: zeroPos - barPercent,\n barColor: config.color ?? NEGATIVE_BAR_COLOR,\n isNegative: true,\n };\n}\n\n/**\n * Compute the column max and min from data for bar scaling.\n */\nexport function computeColumnMax(data: Record<string, unknown>[], key: string): number {\n let max = 0;\n for (const row of data) {\n const val = row[key];\n if (typeof val === 'number' && Number.isFinite(val) && val > max) {\n max = val;\n }\n }\n return max;\n}\n\n/**\n * Compute the column minimum from data (for negative bar support).\n */\nexport function computeColumnMin(data: Record<string, unknown>[], key: string): number {\n let min = 0;\n for (const row of data) {\n const val = row[key];\n if (typeof val === 'number' && Number.isFinite(val) && val < min) {\n min = val;\n }\n }\n return min;\n}\n","/**\n * Category color assignment for table columns.\n *\n * Maps categorical values to colors using explicit mappings or\n * theme categorical palette, with AA-contrast text colors.\n */\n\nimport type { CellStyle, ColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { adaptColorForDarkMode } from '@opendata-ai/openchart-core';\nimport { accessibleTextColor } from './utils';\n\n/**\n * Compute category-colored cell styles for a column.\n *\n * Uses column.categoryColors for explicit value-to-color mappings.\n * Unmapped values get colors from the theme's categorical palette.\n *\n * Returns a Map keyed by original data index with background and text colors.\n */\nexport function computeCategoryColors(\n data: Record<string, unknown>[],\n column: ColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): Map<number, CellStyle> {\n const result = new Map<number, CellStyle>();\n const explicitMap = column.categoryColors;\n if (!explicitMap) return result;\n\n const categoricalPalette = theme.colors.categorical;\n let nextPaletteIndex = 0;\n const autoAssigned = new Map<string, string>();\n const lightBg = '#ffffff';\n const darkBg = theme.colors.background;\n\n for (let i = 0; i < data.length; i++) {\n const raw = data[i][column.key];\n if (raw == null) continue;\n\n const key = String(raw);\n let bg: string;\n\n if (explicitMap[key]) {\n bg = explicitMap[key];\n } else if (autoAssigned.has(key)) {\n bg = autoAssigned.get(key)!;\n } else {\n // Assign from categorical palette\n bg = categoricalPalette[nextPaletteIndex % categoricalPalette.length];\n nextPaletteIndex++;\n autoAssigned.set(key, bg);\n }\n\n // Dark mode adaptation\n if (darkMode) {\n bg = adaptColorForDarkMode(bg, lightBg, darkBg);\n }\n\n const textColor = accessibleTextColor(bg);\n result.set(i, {\n backgroundColor: bg,\n color: textColor,\n });\n }\n\n return result;\n}\n","/**\n * Shared utilities for table column computations.\n */\n\nimport { contrastRatio } from '@opendata-ai/openchart-core';\n\n/**\n * Pick a text color (black or white) that meets better contrast against the background.\n */\nexport function accessibleTextColor(bg: string): string {\n const white = '#ffffff';\n const black = '#000000';\n const whiteRatio = contrastRatio(white, bg);\n const blackRatio = contrastRatio(black, bg);\n return whiteRatio >= blackRatio ? white : black;\n}\n","/**\n * Cell value formatting for table columns.\n *\n * Handles number formatting (d3-format), date formatting, and\n * null/undefined values. Produces the formattedValue string and\n * base style for each cell.\n */\n\nimport type { CellStyle, ColumnConfig, TableCellBase } from '@opendata-ai/openchart-core';\nimport { formatDate, formatNumber } from '@opendata-ai/openchart-core';\nimport { format as d3Format } from 'd3-format';\n\n/**\n * Check if a value is numeric (finite number or parseable numeric string).\n */\nfunction isNumericValue(value: unknown): value is number {\n if (typeof value === 'number') return Number.isFinite(value);\n return false;\n}\n\n/**\n * Check if a value is a date.\n */\nfunction isDateValue(value: unknown): boolean {\n if (value instanceof Date) return !Number.isNaN(value.getTime());\n return false;\n}\n\n/**\n * Format a raw cell value into a display string with styling.\n *\n * Formatting precedence:\n * 1. null/undefined -> \"\"\n * 2. column.format (d3-format string) for numbers\n * 3. Auto-format: numbers via formatNumber, dates via formatDate\n * 4. Fallback: String(value)\n */\nexport function formatCell(value: unknown, column: ColumnConfig): TableCellBase {\n const style: CellStyle = {};\n\n // Null/undefined -> empty\n if (value == null) {\n return {\n value,\n formattedValue: '',\n style,\n };\n }\n\n // If column has a d3-format string and value is numeric\n if (column.format && isNumericValue(value)) {\n try {\n const formatter = d3Format(column.format);\n return {\n value,\n formattedValue: formatter(value),\n style,\n };\n } catch {\n // Fall through to auto-format if format string is invalid\n }\n }\n\n // Auto-format numbers\n if (isNumericValue(value)) {\n return {\n value,\n formattedValue: formatNumber(value),\n style,\n };\n }\n\n // Auto-format dates\n if (isDateValue(value)) {\n return {\n value,\n formattedValue: formatDate(value as Date),\n style,\n };\n }\n\n // String and everything else\n return {\n value,\n formattedValue: String(value),\n style,\n };\n}\n\n/**\n * Format a value into a string for search indexing.\n * Uses d3-format for numeric columns, otherwise String().\n */\nexport function formatValueForSearch(value: unknown, column: ColumnConfig): string {\n if (value == null) return '';\n\n if (column.format && isNumericValue(value)) {\n try {\n return d3Format(column.format)(value);\n } catch {\n // Fall through\n }\n }\n\n if (isNumericValue(value)) {\n return formatNumber(value);\n }\n\n return String(value);\n}\n","/**\n * Heatmap coloring for table columns.\n *\n * Colors cell backgrounds using sequential or diverging color scales,\n * then picks an accessible text color for each background.\n */\n\nimport type { CellStyle, ColumnConfig, ResolvedTheme } from '@opendata-ai/openchart-core';\nimport { adaptColorForDarkMode } from '@opendata-ai/openchart-core';\nimport { interpolateRgb } from 'd3-interpolate';\nimport { scaleSequential } from 'd3-scale';\nimport { accessibleTextColor } from './utils';\n\n/**\n * Build an interpolator from an array of color stops.\n * Uses d3-interpolate for smooth color transitions.\n */\nfunction interpolatorFromStops(stops: string[]): (t: number) => string {\n if (stops.length === 0) return () => '#ffffff';\n if (stops.length === 1) return () => stops[0];\n\n return (t: number) => {\n const clamped = Math.max(0, Math.min(1, t));\n const segment = clamped * (stops.length - 1);\n const lo = Math.floor(segment);\n const hi = Math.min(lo + 1, stops.length - 1);\n const frac = segment - lo;\n return interpolateRgb(stops[lo], stops[hi])(frac);\n };\n}\n\n/**\n * Resolve palette from column config or theme.\n *\n * - If palette is an array of color stops, use directly\n * - If palette is a string name, look it up in theme sequential then diverging\n * - If no palette specified, use the first sequential palette from the theme\n */\nfunction resolvePalette(palette: string | string[] | undefined, theme: ResolvedTheme): string[] {\n if (Array.isArray(palette)) return palette;\n\n const seqPalettes = theme.colors.sequential;\n const divPalettes = theme.colors.diverging;\n\n if (typeof palette === 'string') {\n if (seqPalettes[palette]) return seqPalettes[palette];\n if (divPalettes[palette]) return divPalettes[palette];\n }\n\n // Default: first sequential palette\n const firstSeqKey = Object.keys(seqPalettes)[0];\n return firstSeqKey ? seqPalettes[firstSeqKey] : ['#deebf7', '#08519c'];\n}\n\n/**\n * Compute heatmap cell styles for a column.\n *\n * Returns a Map keyed by original data index with background and text colors.\n */\nexport function computeHeatmapColors(\n data: Record<string, unknown>[],\n column: ColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): Map<number, CellStyle> {\n const result = new Map<number, CellStyle>();\n const config = column.heatmap;\n if (!config) return result;\n\n // Determine which field provides the color values\n const colorField = config.colorByField ?? column.key;\n\n // Extract numeric values and compute domain\n const numericValues: { index: number; value: number }[] = [];\n for (let i = 0; i < data.length; i++) {\n const raw = data[i][colorField];\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n numericValues.push({ index: i, value: raw });\n }\n }\n\n if (numericValues.length === 0) return result;\n\n // Domain: from config or data min/max\n let domain: [number, number];\n if (config.domain) {\n domain = config.domain;\n } else {\n let min = Infinity;\n let max = -Infinity;\n for (const { value } of numericValues) {\n if (value < min) min = value;\n if (value > max) max = value;\n }\n domain = [min, max];\n }\n\n // Resolve palette and build scale\n let stops = resolvePalette(config.palette, theme);\n if (darkMode) {\n const lightBg = '#ffffff';\n const darkBg = theme.colors.background;\n stops = stops.map((c) => adaptColorForDarkMode(c, lightBg, darkBg));\n }\n\n const interpolator = interpolatorFromStops(stops);\n const scale = scaleSequential(interpolator).domain(domain).clamp(true);\n\n // Apply to each row\n for (const { index, value } of numericValues) {\n const bg = scale(value);\n const textColor = accessibleTextColor(bg);\n\n result.set(index, {\n backgroundColor: bg,\n color: textColor,\n });\n }\n\n return result;\n}\n","/**\n * Table pagination: slice data into pages.\n */\n\n/**\n * Paginate data rows.\n *\n * Returns the current page's rows along with pagination metadata.\n * Page is 0-indexed and clamped to valid range.\n * If pageSize is 0 or negative, pagination is disabled (returns all rows).\n */\nexport function paginateData(\n data: Record<string, unknown>[],\n page: number,\n pageSize: number,\n): {\n rows: Record<string, unknown>[];\n totalRows: number;\n totalPages: number;\n page: number;\n} {\n const totalRows = data.length;\n\n // Disabled pagination\n if (pageSize <= 0) {\n return {\n rows: data,\n totalRows,\n totalPages: 1,\n page: 0,\n };\n }\n\n const totalPages = Math.max(1, Math.ceil(totalRows / pageSize));\n // Clamp page to valid range\n const clampedPage = Math.max(0, Math.min(page, totalPages - 1));\n const start = clampedPage * pageSize;\n const end = Math.min(start + pageSize, totalRows);\n\n return {\n rows: data.slice(start, end),\n totalRows,\n totalPages,\n page: clampedPage,\n };\n}\n","/**\n * Table search: build a search index and filter rows by query.\n *\n * The search index concatenates formatted cell values per row so\n * substring matching works across all columns.\n */\n\nimport type { ColumnConfig } from '@opendata-ai/openchart-core';\nimport { formatValueForSearch } from './format-cells';\n\n/**\n * Build a search index mapping original data indices to searchable strings.\n * Each row's searchable string is the concatenation of all column values,\n * separated by spaces, lowercased.\n */\nexport function buildSearchIndex(\n data: Record<string, unknown>[],\n columns: ColumnConfig[],\n): Map<number, string> {\n const index = new Map<number, string>();\n\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const parts: string[] = [];\n\n for (const col of columns) {\n parts.push(formatValueForSearch(row[col.key], col));\n }\n\n index.set(i, parts.join(' ').toLowerCase());\n }\n\n return index;\n}\n\n/**\n * Filter data by a search query using the pre-built search index.\n *\n * Returns the filtered data and the original indices of matching rows.\n * Empty query returns all data.\n */\nexport function filterBySearch(\n data: Record<string, unknown>[],\n query: string,\n searchIndex: Map<number, string>,\n originalIndices: number[],\n): { data: Record<string, unknown>[]; indices: number[] } {\n if (!query || query.trim() === '') {\n return { data, indices: originalIndices };\n }\n\n const lowerQuery = query.toLowerCase();\n const filteredData: Record<string, unknown>[] = [];\n const filteredIndices: number[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const originalIdx = originalIndices[i];\n const searchText = searchIndex.get(originalIdx);\n if (searchText?.includes(lowerQuery)) {\n filteredData.push(data[i]);\n filteredIndices.push(originalIdx);\n }\n }\n\n return { data: filteredData, indices: filteredIndices };\n}\n","/**\n * Stable sort for table data.\n *\n * Sorts data by a column key with type-aware comparison:\n * - Numbers: numeric comparison\n * - Strings: localeCompare\n * - Dates: timestamp comparison\n * - Nulls: always sorted last regardless of direction\n */\n\nimport type { SortState } from '@opendata-ai/openchart-core';\n\n/** Result of sorting: sorted data rows with their original indices preserved. */\nexport interface SortResult {\n data: Record<string, unknown>[];\n originalIndices: number[];\n}\n\n/**\n * Sort data rows by the specified column.\n * Returns a new array (no mutation). Stable sort preserves\n * original order for rows with equal values.\n *\n * Also returns the original indices so callers can track\n * which row came from where (needed for heatmap/category color lookups).\n */\nexport function sortData(data: Record<string, unknown>[], sort: SortState): SortResult {\n const { column, direction } = sort;\n const multiplier = direction === 'asc' ? 1 : -1;\n\n // Create index-value pairs for stable sort\n const indexed = data.map((row, i) => ({ row, index: i }));\n\n indexed.sort((a, b) => {\n const aVal = a.row[column];\n const bVal = b.row[column];\n\n // Nulls always last\n const aNull = aVal == null;\n const bNull = bVal == null;\n if (aNull && bNull) return a.index - b.index; // preserve order\n if (aNull) return 1;\n if (bNull) return -1;\n\n let cmp = 0;\n\n // Number comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal;\n }\n // Date comparison\n else if (aVal instanceof Date && bVal instanceof Date) {\n cmp = aVal.getTime() - bVal.getTime();\n }\n // String comparison (or mixed types)\n else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n // Stable sort: fall back to original index for equal values\n if (cmp === 0) return a.index - b.index;\n return cmp * multiplier;\n });\n\n return {\n data: indexed.map((item) => item.row),\n originalIndices: indexed.map((item) => item.index),\n };\n}\n","/**\n * Sparkline computation for inline mini-charts in table cells.\n *\n * Produces normalized data points (0-1 range) for sparkline rendering.\n * The adapter handles the actual drawing.\n */\n\nimport type {\n ResolvedTheme,\n SparklineColumnConfig,\n SparklineData,\n} from '@opendata-ai/openchart-core';\n\nexport type { SparklineData };\n\n/**\n * Extract numeric values from a row for sparkline rendering.\n *\n * If valuesField is specified, reads an array from that field.\n * Otherwise uses the column's own key (expects an array value).\n */\nfunction extractValues(\n row: Record<string, unknown>,\n columnKey: string,\n config: SparklineColumnConfig,\n): number[] {\n const field = config.valuesField ?? columnKey;\n const raw = row[field];\n\n if (!Array.isArray(raw)) return [];\n\n return raw\n .map((v) => (typeof v === 'number' && Number.isFinite(v) ? v : null))\n .filter((v): v is number => v !== null);\n}\n\n/**\n * Compute sparkline data for a single row.\n *\n * Normalizes values to 0-1 range. Returns null if no valid values.\n */\nexport function computeSparkline(\n values: number[],\n config: SparklineColumnConfig,\n theme: ResolvedTheme,\n _darkMode: boolean,\n): SparklineData | null {\n if (values.length === 0) return null;\n\n const type = config.type ?? 'line';\n const color = config.color ?? theme.colors.categorical[0];\n\n let min = Infinity;\n let max = -Infinity;\n for (const v of values) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n\n const range = max - min;\n const normalize = (v: number): number => (range === 0 ? 0.5 : (v - min) / range);\n\n const startValue = values[0];\n const endValue = values[values.length - 1];\n\n if (type === 'line') {\n const points = values.map((v, i) => ({\n x: values.length === 1 ? 0.5 : i / (values.length - 1),\n y: normalize(v),\n }));\n\n return {\n type,\n points,\n bars: [],\n color,\n count: values.length,\n startValue,\n endValue,\n };\n }\n\n // Bar (horizontal) or column (vertical): normalized as proportions\n const bars = values.map(normalize);\n const points = values.map((v, i) => ({\n x: values.length === 1 ? 0.5 : i / (values.length - 1),\n y: normalize(v),\n }));\n\n return {\n type,\n points,\n bars,\n color,\n count: values.length,\n startValue,\n endValue,\n };\n}\n\n/**\n * Extract values and compute sparkline data for a cell.\n */\nexport function computeSparklineForRow(\n row: Record<string, unknown>,\n columnKey: string,\n config: SparklineColumnConfig,\n theme: ResolvedTheme,\n darkMode: boolean,\n): SparklineData | null {\n const values = extractValues(row, columnKey, config);\n return computeSparkline(values, config, theme, darkMode);\n}\n","/**\n * Tooltip descriptor computation.\n *\n * Generates a Map of mark-id -> TooltipContent from the spec encoding and marks.\n * Each mark gets a tooltip that shows relevant field values formatted for display.\n * The mark-id keys match the data-mark-id attributes set by the SVG renderer.\n */\n\nimport type {\n ArcMark,\n AreaMark,\n DataRow,\n Encoding,\n LineMark,\n Mark,\n PointMark,\n RectMark,\n TooltipContent,\n TooltipField,\n} from '@opendata-ai/openchart-core';\nimport { formatDate, formatNumber } from '@opendata-ai/openchart-core';\nimport { format as d3Format } from 'd3-format';\n\nimport type { NormalizedChartSpec } from '../compiler/types';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Format a raw data value for tooltip display. */\nfunction formatValue(value: unknown, fieldType?: string, format?: string): string {\n if (value == null) return '';\n\n if (fieldType === 'temporal' || value instanceof Date) {\n return formatDate(value as Date | string | number);\n }\n\n if (typeof value === 'number') {\n if (format) {\n try {\n return d3Format(format)(value);\n } catch {\n return formatNumber(value);\n }\n }\n return formatNumber(value);\n }\n\n return String(value);\n}\n\n/** Build tooltip fields from a data row based on the spec encoding. */\nfunction buildFields(row: DataRow, encoding: Encoding, color?: string): TooltipField[] {\n const fields: TooltipField[] = [];\n\n // Y-axis value (the \"main\" value in most charts)\n if (encoding.y) {\n fields.push({\n label: encoding.y.axis?.label ?? encoding.y.field,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color,\n });\n }\n\n // X-axis value (often the category or date)\n if (encoding.x) {\n fields.push({\n label: encoding.x.axis?.label ?? encoding.x.field,\n value: formatValue(row[encoding.x.field], encoding.x.type, encoding.x.axis?.format),\n });\n }\n\n // Size (for scatter/bubble)\n if (encoding.size) {\n fields.push({\n label: encoding.size.axis?.label ?? encoding.size.field,\n value: formatValue(row[encoding.size.field], encoding.size.type, encoding.size.axis?.format),\n });\n }\n\n return fields;\n}\n\n/** Determine the title for a tooltip based on encoding. */\nfunction getTooltipTitle(row: DataRow, encoding: Encoding): string | undefined {\n // Detail channel provides an explicit label (e.g. district name in scatter)\n if (encoding.detail) {\n return String(row[encoding.detail.field] ?? '');\n }\n\n // For charts with a temporal x-axis, use the date as the title\n if (encoding.x?.type === 'temporal') {\n return formatValue(row[encoding.x.field], 'temporal');\n }\n\n // For nominal x, use the category\n if (encoding.x?.type === 'nominal' || encoding.x?.type === 'ordinal') {\n return String(row[encoding.x.field] ?? '');\n }\n\n // For nominal y (e.g. horizontal bar charts), use the category\n if (encoding.y?.type === 'nominal' || encoding.y?.type === 'ordinal') {\n return String(row[encoding.y.field] ?? '');\n }\n\n // For color-encoded series, use the series name\n if (encoding.color) {\n return String(row[encoding.color.field] ?? '');\n }\n\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Per-mark-type tooltip generation\n// ---------------------------------------------------------------------------\n\nfunction tooltipsForLine(\n _mark: LineMark,\n _encoding: Encoding,\n _markIndex: number,\n): Array<[string, TooltipContent]> {\n // Line marks themselves don't get individual tooltips.\n // The point marks at each data point handle that.\n return [];\n}\n\nfunction tooltipsForPoint(\n mark: PointMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const title = getTooltipTitle(mark.data, encoding);\n const fields = buildFields(mark.data, encoding, mark.fill);\n\n return [[`point-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForRect(\n mark: RectMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const title = getTooltipTitle(mark.data, encoding);\n const fields = buildFields(mark.data, encoding, mark.fill);\n\n return [[`rect-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForArc(\n mark: ArcMark,\n encoding: Encoding,\n markIndex: number,\n): Array<[string, TooltipContent]> {\n const row = mark.data;\n const fields: TooltipField[] = [];\n\n // For pie/donut, show the category and its value\n if (encoding.color) {\n const categoryName = String(row[encoding.color.field] ?? '');\n if (encoding.y) {\n fields.push({\n label: categoryName,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color: mark.fill,\n });\n }\n } else if (encoding.y) {\n fields.push({\n label: encoding.y.field,\n value: formatValue(row[encoding.y.field], encoding.y.type, encoding.y.axis?.format),\n color: mark.fill,\n });\n }\n\n const title = encoding.color ? String(row[encoding.color.field] ?? '') : undefined;\n\n return [[`arc-${markIndex}`, { title, fields }]];\n}\n\nfunction tooltipsForArea(\n _mark: AreaMark,\n _encoding: Encoding,\n _markIndex: number,\n): Array<[string, TooltipContent]> {\n // Area marks are background fills; point marks on top handle tooltips.\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute tooltip descriptors for all marks in the layout.\n *\n * Returns a Map keyed by data-mark-id (matching the SVG attribute)\n * to TooltipContent objects. The vanilla adapter uses this to show\n * tooltips on hover/tap/keyboard focus.\n */\nexport function computeTooltipDescriptors(\n spec: NormalizedChartSpec,\n marks: Mark[],\n): Map<string, TooltipContent> {\n const encoding = spec.encoding as Encoding;\n const descriptors = new Map<string, TooltipContent>();\n\n for (let i = 0; i < marks.length; i++) {\n const mark = marks[i];\n let entries: Array<[string, TooltipContent]> = [];\n\n switch (mark.type) {\n case 'line':\n entries = tooltipsForLine(mark, encoding, i);\n break;\n case 'area':\n entries = tooltipsForArea(mark, encoding, i);\n break;\n case 'point':\n entries = tooltipsForPoint(mark, encoding, i);\n break;\n case 'rect':\n entries = tooltipsForRect(mark, encoding, i);\n break;\n case 'arc':\n entries = tooltipsForArc(mark, encoding, i);\n break;\n }\n\n for (const [key, content] of entries) {\n descriptors.set(key, content);\n }\n }\n\n return descriptors;\n}\n"],"mappings":"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","names":["adaptTheme","BRAND_RESERVE_WIDTH","resolveTheme","date","strValue","x","y","defaultStroke","date","color","estimateTextWidth","abbreviateNumber","formatNumber","abbreviateNumber","formatNumber","color","y","buildD3Formatter","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","color","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","x","x","pi","tau","epsilon","x","y","path","t0","t1","x","x","y","x","y","path","path","i","j","x","t0","t1","y","none_default","none_default","color","none_default","color","point","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","LABEL_OFFSET_X","slice","color","path","estimateTextWidth","resolveCollisions","LABEL_FONT_SIZE","LABEL_FONT_WEIGHT","x","x","min","max","key","ticks","max","min","range","range","range","copy","point","format","min","max","t1","constant_default","x","y","y","constant_default","y","color","rgb","x","x","zero","i","constant_default","x","number","x","x","range","i","y","number","x","x","x","x","x","identity_default","x","locale","identity_default","sign","zero","format","formatPrefix","value","max","linear","x","x","sqrt","date","range","date","date","date","date","date","date","date","date","ticks","step","date","y","locale","formats","pad","format","sign","locale","defaultLocale","number","ticks","second","format","formatYear","tickFormat","date","y","transformer","t0","t1","x","range","copy","DEFAULT_POINT_RADIUS","min","max","sqrt","color","date","rules","DEFAULT_STROKE_WIDTH","hex","min","max","sqrt","linear","color","abbreviateNumber","buildD3Formatter","estimateTextWidth","formatNumber","ticks","computeChrome","estimateTextWidth","min","max","linear","point","estimateTextWidth","SWATCH_SIZE","SWATCH_GAP","ENTRY_GAP","legendHeight","offsetDx","offsetDy","computeChrome","estimateTextWidth","barPercent","max","min","formatDate","formatNumber","formatNumber","formatDate","adaptColorForDarkMode","min","max","adaptColorForDarkMode","color","min","max","range","normalize","points","estimateTextWidth","computeChrome","formatDate","formatNumber","format","formatDate","formatNumber","color","resolveTheme","adaptTheme","BRAND_RESERVE_WIDTH","compileGraph"]}