{"version":3,"sources":["../src/types/brand.ts","../src/vibe/presets.ts","../src/vibe/resolveVibe.ts","../src/vibe/VibeProvider.tsx","../src/core/palette.ts","../src/brand/resolveBrand.ts","../src/brand/useColorScheme.ts","../src/brand/BrandProvider.tsx","../src/core/geometry.ts","../src/core/scales.ts","../src/core/shapes.ts","../src/core/hierarchy.ts","../src/core/dag.ts","../src/core/diagram.ts","../src/core/radial.ts","../src/core/routing.ts","../src/core/text.ts","../src/core/architecture.ts","../src/core/sequence.ts","../src/core/er.ts","../src/core/timeline.ts","../src/core/mermaid.ts","../src/core/sankey.ts","../src/core/treemap.ts","../src/core/polar.ts","../src/core/ticks.ts","../src/core/arc.ts","../src/core/colorScales.ts","../src/core/dataTable.ts","../src/core/profile.ts","../src/core/recommend.ts","../src/core/compile.ts","../src/core/queryParse.ts","../src/core/planChart.ts","../src/core/texture.ts","../src/core/critique.ts","../src/core/transform.ts","../src/core/format.ts","../src/core/axisFormat.ts","../src/core/emphasis.ts","../src/render/roughGenerator.ts","../src/primitives/SketchPaths.tsx","../src/primitives/RoughPath.tsx","../src/primitives/RoughLine.tsx","../src/primitives/RoughRectangle.tsx","../src/primitives/RoughCircle.tsx","../src/primitives/RoughText.tsx","../src/render/clientExport.ts","../src/components/PaperTexture.tsx","../src/components/Surface.tsx","../src/components/ResponsiveContainer.tsx","../src/core/a11yDescribe.ts","../src/core/transition.ts","../src/interactive/useDataTransition.ts","../src/core/stack.ts","../src/components/Axis.tsx","../src/components/Grid.tsx","../src/core/legend.ts","../src/components/SeriesVisibilityContext.tsx","../src/components/Legend.tsx","../src/components/Annotations.tsx","../src/core/interaction.ts","../src/components/BarChart.tsx","../src/components/LineChart.tsx","../src/components/AreaChart.tsx","../src/components/ScatterPlot.tsx","../src/components/PieChart.tsx","../src/core/nodeSize.ts","../src/components/Diagram.tsx","../src/components/Flowchart.tsx","../src/components/MindMap.tsx","../src/components/OrgChart.tsx","../src/components/ArchitectureDiagram.tsx","../src/components/SequenceDiagram.tsx","../src/components/ERDiagram.tsx","../src/components/Timeline.tsx","../src/components/renderDiagram.ts","../src/components/SankeyChart.tsx","../src/components/TreemapChart.tsx","../src/components/HeatmapChart.tsx","../src/components/RadarChart.tsx","../src/components/AutoChart.tsx","../src/core/badgeIcons.ts","../src/components/Badge.tsx","../src/core/fusioncharts.ts"],"names":["config","createContext","useMemo","useContext","useState","useEffect","jsx","scaleLinear","scaleBand","scalePoint","scaleSqrt","curveLinear","curveBasis","curveCatmullRom","curveMonotoneX","generator","line","area","stratify","tree","count","pad","group","base","toBox","step","laid","mid","treemapSquarify","treemapBinary","treemapSlice","treemapDice","treemap","d3pie","d3arc","clamp01","i","num","g","round","scaleLog","scaleTime","rough","useId","jsxs","color","useRef","dir","xScale","yScale","computed","Fragment","PAD_X","createElement","_","str"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { VibeOverrides } from './vibe';\n\n/** Corner the brand logo is pinned to on the chart surface. */\nexport type BrandLogoPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n/**\n * A brand logo / wordmark drawn onto the surface. `src` is a URL or data-URI —\n * the library never bundles image bytes. Sizing keeps the image undistorted\n * (rendered with `preserveAspectRatio=\"xMidYMid meet\"` inside a width×height box).\n */\nexport interface BrandLogo {\n  src: string;\n  /** Default `'bottom-right'`. */\n  position?: BrandLogoPosition;\n  /** Box width in px. Default 64. */\n  width?: number;\n  /** Box height in px. Defaults to `width` (a square box; the logo scales to fit). */\n  height?: number;\n  /** 0–1, clamped. Default 1. */\n  opacity?: number;\n  /** Inset from the surface edge in px. Default 12. */\n  margin?: number;\n}\n\n/**\n * A user's brand identity, layered on top of a `vibe`. The vibe controls *how*\n * a chart is drawn (texture, roughness, the hand-drawn feel); the brand controls\n * *identity* — colours, font and logo. Every field is optional; omit one to\n * inherit whatever the vibe provides.\n */\nexport interface Brand {\n  /** Categorical hues for multi-series / pie. Replaces the default palette. */\n  palette?: string[];\n  /** Primary brand fill (single-series bars, accents). Maps to the vibe `fill`. */\n  primary?: string;\n  /** Line / stroke colour. Maps to the vibe `stroke`. */\n  ink?: string;\n  /** Page / canvas colour. Maps to the vibe `background`. */\n  page?: string;\n  /** Font family for all chart text. Maps to the vibe `fontFamily`. */\n  font?: string;\n  /** Optional corner logo / wordmark. */\n  logo?: BrandLogo;\n}\n\n/** Which colour scheme to pick from a `ThemedBrand`. `'auto'` follows the OS. */\nexport type BrandMode = 'light' | 'dark' | 'auto';\n\n/**\n * A pair of brands tagged for light and dark colour schemes. Pass one of\n * these to a chart's `brand` prop (or to `<BrandProvider>`) to follow the\n * user's OS theme; explicit `mode` forces a side.\n */\nexport interface ThemedBrand {\n  /** `'auto'` (default) follows `prefers-color-scheme`; otherwise pinned. */\n  mode?: BrandMode;\n  light: Brand;\n  dark: Brand;\n}\n\n/** What consumers pass to `<Surface>`/charts: a plain brand or a themed pair. */\nexport type BrandConfig = Brand | ThemedBrand;\n\n/** Type guard for the themed shape. */\nexport function isThemedBrand(brand?: BrandConfig): brand is ThemedBrand {\n  return !!brand && typeof brand === 'object' && 'light' in brand && 'dark' in brand;\n}\n\n/** A logo with every layout field filled in. */\nexport interface ResolvedBrandLogo extends Required<BrandLogo> {}\n\n/**\n * The vibe knobs a brand can recolour. Layered between the preset defaults and\n * any explicit per-call vibe overrides, so a brand recolours any vibe while an\n * explicit override still wins.\n */\nexport type BrandVibeOverrides = Partial<\n  Pick<VibeOverrides, 'stroke' | 'fill' | 'background' | 'fontFamily'>\n>;\n\n/** A `Brand` resolved into the pieces the renderer consumes. */\nexport interface ResolvedBrand {\n  /** Categorical palette (the brand's, or the library default). */\n  palette: string[];\n  /** Logo with defaults applied, or `undefined` when no logo was given. */\n  logo?: ResolvedBrandLogo;\n  /** Vibe colour/font overrides derived from the brand. */\n  vibeOverrides: BrandVibeOverrides;\n}\n","import type { ResolvedVibe, VibePreset } from '../types/vibe';\n\n/**\n * Fully-resolved aesthetics. These are the single source of truth for what each\n * semantic preset \"feels\" like; `resolveVibe` layers user overrides on top.\n */\nexport const VIBE_PRESETS: Record<VibePreset, ResolvedVibe> = {\n  messy_sketch: {\n    preset: 'messy_sketch',\n    roughness: 1.6,\n    bowing: 1.5,\n    strokeWidth: 1.5,\n    stroke: '#1f2937',\n    fill: '#1f2937',\n    fillStyle: 'hachure',\n    fillWeight: 1,\n    hachureAngle: -41,\n    hachureGap: 4,\n    curveStepCount: 9,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 1,\n    fontFamily: '\"Comic Neue\", \"Comic Sans MS\", \"Segoe Print\", cursive',\n    fontSize: 14,\n  },\n  clean_blueprint: {\n    preset: 'clean_blueprint',\n    roughness: 0.6,\n    bowing: 0.4,\n    strokeWidth: 1.25,\n    stroke: '#1d4ed8',\n    fill: '#3b82f6',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.5,\n    hachureAngle: 45,\n    hachureGap: 6,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 7,\n    fontFamily: '\"Cousine\", \"Courier New\", ui-monospace, monospace',\n    fontSize: 13,\n  },\n  // PRISM \"Quiet Indigo\": calm indigo ink and a soft hachure on a clean digital\n  // surface. oklch(0.52 0.18 270) → sRGB #435BCF.\n  quiet_indigo: {\n    preset: 'quiet_indigo',\n    roughness: 0.6,\n    bowing: 0.4,\n    strokeWidth: 1.25,\n    stroke: '#435BCF',\n    fill: '#435BCF',\n    fillStyle: 'hachure',\n    fillWeight: 0.5,\n    hachureAngle: -30,\n    hachureGap: 6,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 11,\n    fontFamily: '\"IBM Plex Sans\", system-ui, sans-serif',\n    fontSize: 13,\n  },\n  chaotic_notebook: {\n    preset: 'chaotic_notebook',\n    roughness: 2.8,\n    bowing: 2.5,\n    strokeWidth: 2,\n    stroke: '#111827',\n    fill: '#f59e0b',\n    fillStyle: 'zigzag',\n    fillWeight: 1.5,\n    hachureAngle: 17,\n    hachureGap: 3,\n    curveStepCount: 6,\n    curveTightness: 0.2,\n    disableMultiStroke: false,\n    seed: 13,\n    fontFamily: '\"Gloria Hallelujah\", \"Comic Sans MS\", \"Segoe Print\", cursive',\n    fontSize: 15,\n  },\n  pencil: {\n    preset: 'pencil',\n    roughness: 1.2,\n    bowing: 1,\n    strokeWidth: 0.9,\n    stroke: '#4b5563',\n    fill: '#9ca3af',\n    fillStyle: 'hachure',\n    fillWeight: 0.6,\n    hachureAngle: -35,\n    hachureGap: 3,\n    curveStepCount: 11,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 3,\n    fontFamily: '\"Caveat\", \"Segoe Print\", \"Bradley Hand\", cursive',\n    fontSize: 13,\n  },\n  marker: {\n    preset: 'marker',\n    roughness: 1,\n    bowing: 0.8,\n    strokeWidth: 3.5,\n    stroke: '#0f172a',\n    fill: '#38bdf8',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 5,\n    curveStepCount: 10,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 5,\n    fontFamily: '\"Permanent Marker\", \"Marker Felt\", cursive',\n    fontSize: 15,\n  },\n  ink: {\n    preset: 'ink',\n    roughness: 0.8,\n    bowing: 0.6,\n    strokeWidth: 1.6,\n    stroke: '#0b1020',\n    fill: '#1e293b',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.7,\n    hachureAngle: 41,\n    hachureGap: 5,\n    curveStepCount: 13,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 9,\n    fontFamily: '\"Spectral\", \"Iowan Old Style\", Georgia, serif',\n    fontSize: 14,\n  },\n  crayon: {\n    preset: 'crayon',\n    roughness: 2.2,\n    bowing: 1.8,\n    strokeWidth: 2.8,\n    stroke: '#7c2d12',\n    fill: '#fb923c',\n    fillStyle: 'zigzag',\n    fillWeight: 2.5,\n    hachureAngle: 25,\n    hachureGap: 4,\n    curveStepCount: 7,\n    curveTightness: 0.15,\n    disableMultiStroke: false,\n    seed: 21,\n    fontFamily: '\"Schoolbell\", \"Comic Sans MS\", \"Chalkboard\", cursive',\n    fontSize: 15,\n  },\n  // Leonardo's notebooks: fine, confident iron-gall (sepia) pen on a warm\n  // sienna cross-hatch. The negative hachure angle mimics his left-handed\n  // shading, which slants top-left → bottom-right. Seed = his birth year.\n  davinci_journal: {\n    preset: 'davinci_journal',\n    roughness: 1,\n    bowing: 0.7,\n    strokeWidth: 1.1,\n    stroke: '#4a3520',\n    fill: '#b08a55',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.45,\n    hachureAngle: -52,\n    hachureGap: 7,\n    curveStepCount: 14,\n    curveTightness: 0,\n    // Single-stroke so connectors and outlines read as one confident pen line\n    // rather than a doubled, scratchy one. (Fill hatching is unaffected.)\n    disableMultiStroke: true,\n    seed: 1452,\n    fontFamily:\n      '\"EB Garamond\", \"Iowan Old Style\", \"Palatino Linotype\", Palatino, \"Book Antiqua\", Georgia, serif',\n    fontSize: 14,\n    // Aged-parchment page so the ink has somewhere to sit; this also drives the\n    // node fill and the gap behind zone labels, so no stark-white seams show.\n    background: '#f2e8cf',\n  },\n  // Classic drafting blueprint: crisp white/cyan ink on a deep blue page — the\n  // inverse of clean_blueprint.\n  blueprint_dark: {\n    preset: 'blueprint_dark',\n    roughness: 0.6,\n    bowing: 0.4,\n    strokeWidth: 1.25,\n    stroke: '#dbeafe',\n    fill: '#93c5fd',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.5,\n    hachureAngle: 45,\n    hachureGap: 6,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 23,\n    fontFamily: '\"Cousine\", \"Courier New\", ui-monospace, monospace',\n    fontSize: 13,\n    background: '#0e3a66',\n  },\n  // Chalk on a slate board: dusty white strokes and hachure, casual hand.\n  chalkboard: {\n    preset: 'chalkboard',\n    roughness: 1.4,\n    bowing: 1.1,\n    strokeWidth: 1.4,\n    stroke: '#eef0e9',\n    fill: '#cdd3c8',\n    fillStyle: 'hachure',\n    fillWeight: 0.7,\n    hachureAngle: -30,\n    hachureGap: 4,\n    curveStepCount: 9,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 28,\n    fontFamily: '\"Schoolbell\", \"Comic Sans MS\", cursive',\n    fontSize: 15,\n    background: '#2e3b35',\n  },\n  // Neon signage: bright cyan tubes and a fuchsia cross-hatch on near-black.\n  neon: {\n    preset: 'neon',\n    roughness: 0.5,\n    bowing: 0.3,\n    strokeWidth: 1.7,\n    stroke: '#22d3ee',\n    fill: '#d946ef',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.6,\n    hachureAngle: 45,\n    hachureGap: 7,\n    curveStepCount: 16,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 31,\n    fontFamily: '\"Orbitron\", ui-monospace, monospace',\n    fontSize: 13,\n    background: '#0a0a12',\n  },\n  // Comic book: thick black ink outlines and bold solid fills, punchy lettering.\n  comic_book: {\n    preset: 'comic_book',\n    roughness: 0.9,\n    bowing: 0.6,\n    strokeWidth: 2.8,\n    stroke: '#111111',\n    fill: '#ef4444',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 5,\n    curveStepCount: 12,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 37,\n    fontFamily: '\"Bangers\", \"Comic Sans MS\", cursive',\n    fontSize: 16,\n    background: '#fffdf6',\n  },\n  // Phosphor-green CRT terminal: crisp green glyphs and sparse hatch on black.\n  terminal: {\n    preset: 'terminal',\n    roughness: 0.6,\n    bowing: 0.3,\n    strokeWidth: 1.3,\n    stroke: '#4ade80',\n    fill: '#22c55e',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.5,\n    hachureAngle: 0,\n    hachureGap: 7,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 41,\n    fontFamily: '\"VT323\", ui-monospace, monospace',\n    fontSize: 17,\n    background: '#08120b',\n  },\n  // Watercolour: soft muted ink, pale solid washes, gently wavy edges on paper.\n  watercolor: {\n    preset: 'watercolor',\n    roughness: 0.9,\n    bowing: 1.2,\n    strokeWidth: 1.1,\n    stroke: '#5b6b7a',\n    fill: '#bcd3e6',\n    fillStyle: 'solid',\n    fillWeight: 1,\n    hachureAngle: 60,\n    hachureGap: 5,\n    curveStepCount: 16,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 47,\n    fontFamily: '\"Quicksand\", system-ui, sans-serif',\n    fontSize: 14,\n    background: '#fbfaf5',\n  },\n  // Newsprint: high-contrast black ink and dense cross-hatch on cream stock.\n  newsprint: {\n    preset: 'newsprint',\n    roughness: 0.8,\n    bowing: 0.5,\n    strokeWidth: 1.3,\n    stroke: '#1a1a1a',\n    fill: '#3f3f46',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.6,\n    hachureAngle: 45,\n    hachureGap: 4,\n    curveStepCount: 13,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 53,\n    fontFamily: '\"Playfair Display\", Georgia, serif',\n    fontSize: 14,\n    background: '#f1ece0',\n  },\n  // Dry-erase whiteboard: bold blue marker and a light wash on a clean board.\n  whiteboard: {\n    preset: 'whiteboard',\n    roughness: 1,\n    bowing: 0.7,\n    strokeWidth: 2.2,\n    stroke: '#2563eb',\n    fill: '#bfdbfe',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 5,\n    curveStepCount: 11,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 59,\n    fontFamily: '\"Comic Neue\", \"Comic Sans MS\", cursive',\n    fontSize: 14,\n    background: '#fbfdff',\n  },\n  // Typewriter: faded, slightly uneven ink and a thin hatch on cream paper.\n  typewriter: {\n    preset: 'typewriter',\n    roughness: 1,\n    bowing: 0.5,\n    strokeWidth: 1.1,\n    stroke: '#2b2b2b',\n    fill: '#bdb9ab',\n    fillStyle: 'hachure',\n    fillWeight: 0.5,\n    hachureAngle: -30,\n    hachureGap: 5,\n    curveStepCount: 11,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 61,\n    fontFamily: '\"Special Elite\", \"Courier New\", ui-monospace, monospace',\n    fontSize: 13,\n    background: '#f5f1e6',\n  },\n  // Midnight dashboard: cool light ink and a crisp accent fill on deep slate.\n  midnight: {\n    preset: 'midnight',\n    roughness: 0.6,\n    bowing: 0.3,\n    strokeWidth: 1.3,\n    stroke: '#cbd5e1',\n    fill: '#0ea5e9',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 6,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 67,\n    fontFamily: '\"IBM Plex Sans\", system-ui, sans-serif',\n    fontSize: 13,\n    background: '#0f172a',\n  },\n  // Art deco: elegant gold lines and a sparse gilt hatch on midnight navy.\n  art_deco: {\n    preset: 'art_deco',\n    roughness: 0.5,\n    bowing: 0.3,\n    strokeWidth: 1.3,\n    stroke: '#d4af37',\n    fill: '#caa83a',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.4,\n    hachureAngle: 45,\n    hachureGap: 8,\n    curveStepCount: 16,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 71,\n    fontFamily: '\"Cinzel\", Georgia, serif',\n    fontSize: 13,\n    background: '#0c1c3a',\n  },\n  // Manga: bold black ink and a dotted screentone fill on white.\n  manga: {\n    preset: 'manga',\n    roughness: 0.8,\n    bowing: 0.5,\n    strokeWidth: 1.8,\n    stroke: '#111111',\n    fill: '#1a1a1a',\n    fillStyle: 'dots',\n    fillWeight: 1,\n    hachureAngle: 0,\n    hachureGap: 4,\n    curveStepCount: 12,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 73,\n    fontFamily: '\"Bangers\", \"Comic Sans MS\", cursive',\n    fontSize: 15,\n    background: '#fdfdfd',\n  },\n  // Highlighter: thin pen lines under a bright marker swipe, on notebook white.\n  highlighter: {\n    preset: 'highlighter',\n    roughness: 1.1,\n    bowing: 0.9,\n    strokeWidth: 1.1,\n    stroke: '#374151',\n    fill: '#fde047',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 5,\n    curveStepCount: 11,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 79,\n    fontFamily: '\"Caveat\", \"Segoe Print\", cursive',\n    fontSize: 15,\n    background: '#fffef9',\n  },\n  // Kraft: dark stamped ink and a brown hatch on recycled cardboard.\n  kraft: {\n    preset: 'kraft',\n    roughness: 1.1,\n    bowing: 0.7,\n    strokeWidth: 1.4,\n    stroke: '#3b2f23',\n    fill: '#9c7b4f',\n    fillStyle: 'hachure',\n    fillWeight: 0.7,\n    hachureAngle: -45,\n    hachureGap: 4,\n    curveStepCount: 11,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 83,\n    fontFamily: '\"Special Elite\", \"Courier New\", ui-monospace, monospace',\n    fontSize: 13,\n    background: '#c9aa77',\n  },\n  // Synthwave: hot-magenta tubes and a purple cross-hatch on deep indigo.\n  synthwave: {\n    preset: 'synthwave',\n    roughness: 0.5,\n    bowing: 0.3,\n    strokeWidth: 1.7,\n    stroke: '#ff4fd8',\n    fill: '#7c3aed',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.6,\n    hachureAngle: 45,\n    hachureGap: 6,\n    curveStepCount: 16,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 89,\n    fontFamily: '\"Orbitron\", ui-monospace, monospace',\n    fontSize: 13,\n    background: '#190a36',\n  },\n  // Botanical plate: fine green ink and a soft sage hatch on aged ivory.\n  botanical: {\n    preset: 'botanical',\n    roughness: 1,\n    bowing: 0.8,\n    strokeWidth: 1,\n    stroke: '#3e5a36',\n    fill: '#8aa06a',\n    fillStyle: 'hachure',\n    fillWeight: 0.5,\n    hachureAngle: -40,\n    hachureGap: 5,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 97,\n    fontFamily: '\"EB Garamond\", Georgia, serif',\n    fontSize: 14,\n    background: '#f4f1e4',\n  },\n  // Risograph: bold fluoro-pink fills and a blue keyline on uncoated stock.\n  risograph: {\n    preset: 'risograph',\n    roughness: 0.8,\n    bowing: 0.6,\n    strokeWidth: 1.6,\n    stroke: '#2742d6',\n    fill: '#ff5fa2',\n    fillStyle: 'solid',\n    fillWeight: 2,\n    hachureAngle: 0,\n    hachureGap: 5,\n    curveStepCount: 12,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 101,\n    fontFamily: '\"IBM Plex Sans\", system-ui, sans-serif',\n    fontSize: 13,\n    background: '#f4f0e7',\n  },\n  // Sticky note: casual pen and a faint hatch on a bright square of paper.\n  sticky_note: {\n    preset: 'sticky_note',\n    roughness: 1.3,\n    bowing: 1,\n    strokeWidth: 1.3,\n    stroke: '#3f3a33',\n    fill: '#eab308',\n    fillStyle: 'hachure',\n    fillWeight: 0.6,\n    hachureAngle: -35,\n    hachureGap: 4,\n    curveStepCount: 9,\n    curveTightness: 0,\n    disableMultiStroke: false,\n    seed: 103,\n    fontFamily: '\"Caveat\", \"Segoe Print\", cursive',\n    fontSize: 16,\n    background: '#ffe27a',\n  },\n  // Amber CRT: warm amber phosphor glyphs and a sparse hatch on near-black.\n  amber_crt: {\n    preset: 'amber_crt',\n    roughness: 0.6,\n    bowing: 0.3,\n    strokeWidth: 1.3,\n    stroke: '#ffb000',\n    fill: '#cc8800',\n    fillStyle: 'cross-hatch',\n    fillWeight: 0.5,\n    hachureAngle: 0,\n    hachureGap: 7,\n    curveStepCount: 14,\n    curveTightness: 0,\n    disableMultiStroke: true,\n    seed: 107,\n    fontFamily: '\"VT323\", ui-monospace, monospace',\n    fontSize: 17,\n    background: '#0d0a05',\n  },\n};\n\nexport const DEFAULT_VIBE: VibePreset = 'messy_sketch';\n\n/**\n * Matte / physical-media presets get a faint paper-grain background so they\n * don't read as a flat fill. Digital or deliberately-crisp presets (blueprint,\n * neon, terminal, midnight, synthwave, amber_crt, whiteboard, …) stay clean.\n */\nconst PAPER_TEXTURED: VibePreset[] = [\n  'messy_sketch',\n  'chaotic_notebook',\n  'pencil',\n  'crayon',\n  'davinci_journal',\n  'chalkboard',\n  'watercolor',\n  'newsprint',\n  'kraft',\n  'botanical',\n  'risograph',\n  'sticky_note',\n  'typewriter',\n];\nfor (const p of PAPER_TEXTURED) {\n  VIBE_PRESETS[p].texture = 'paper';\n}\n","import type { ResolvedVibe, RoughOptions, VibeConfig, VibeOverrides } from '../types/vibe';\nimport { DEFAULT_VIBE, VIBE_PRESETS } from './presets';\n\n/**\n * Look up a preset, falling back to the default (with a dev warning) when the\n * name isn't one we ship. Guards against a typo'd preset name producing\n * `undefined` and a cryptic downstream crash.\n */\nfunction presetOrDefault(preset: string | undefined): ResolvedVibe {\n  if (preset === undefined) {\n    return VIBE_PRESETS[DEFAULT_VIBE];\n  }\n  const found = VIBE_PRESETS[preset as keyof typeof VIBE_PRESETS];\n  if (found === undefined) {\n    console.warn(\n      `[goldenchart] Unknown vibe preset \"${preset}\"; falling back to \"${DEFAULT_VIBE}\". ` +\n        `Valid presets: ${Object.keys(VIBE_PRESETS).join(', ')}.`,\n    );\n    return VIBE_PRESETS[DEFAULT_VIBE];\n  }\n  return found;\n}\n\n/** Copy each defined key of `source` onto `target`, skipping `undefined`. */\nfunction applyDefined(target: ResolvedVibe, source: Record<string, unknown>): void {\n  const mutable = target as unknown as Record<string, unknown>;\n  for (const key of Object.keys(source)) {\n    const value = source[key];\n    if (value !== undefined) {\n      mutable[key] = value;\n    }\n  }\n}\n\n/**\n * Collapse any `VibeConfig` (a bare preset name, or a preset + overrides, or\n * just overrides) into a fully-resolved vibe. This is the single boundary\n * between the loose user-facing config and the strict internal shape.\n *\n * `brandOverrides` (colour/font knobs derived from a `Brand`) layer between the\n * preset defaults and the caller's explicit overrides, giving the precedence:\n * preset → brand → explicit vibe overrides. A brand thus recolours any vibe\n * while an explicit per-call override still wins.\n */\nexport function resolveVibe(\n  config?: VibeConfig,\n  brandOverrides?: Partial<VibeOverrides>,\n): ResolvedVibe {\n  const hasBrand = brandOverrides !== undefined && Object.keys(brandOverrides).length > 0;\n\n  // Fast path: a bare/absent config with no brand returns the shared preset.\n  if (config === undefined && !hasBrand) {\n    return VIBE_PRESETS[DEFAULT_VIBE];\n  }\n  if (typeof config === 'string' && !hasBrand) {\n    return presetOrDefault(config);\n  }\n\n  const base =\n    typeof config === 'string' || config === undefined\n      ? presetOrDefault(config)\n      : presetOrDefault(config.preset);\n  const merged: ResolvedVibe = { ...base };\n\n  // Brand colour/font knobs first, so explicit overrides win over them.\n  if (hasBrand) {\n    applyDefined(merged, brandOverrides as Record<string, unknown>);\n  }\n\n  // Then the caller's explicit overrides (only when config is the object form).\n  if (typeof config === 'object' && config !== undefined) {\n    // `fill` is handled explicitly because `null` (\"no fill\") is meaningful.\n    const { preset: _preset, fill, ...overrides } = config;\n    applyDefined(merged, overrides as Record<string, unknown>);\n    if (fill !== undefined) {\n      merged.fill = fill;\n    }\n  }\n\n  return merged;\n}\n\n/**\n * Translate a resolved vibe into the exact options object Rough.js consumes.\n * Keeping this isolated means the rendering layer never reasons about presets.\n */\nexport function vibeToRoughOptions(vibe: ResolvedVibe, seedOverride?: number): RoughOptions {\n  const options: RoughOptions = {\n    roughness: vibe.roughness,\n    bowing: vibe.bowing,\n    stroke: vibe.stroke,\n    strokeWidth: vibe.strokeWidth,\n    fillStyle: vibe.fillStyle,\n    fillWeight: vibe.fillWeight,\n    hachureAngle: vibe.hachureAngle,\n    hachureGap: vibe.hachureGap,\n    curveStepCount: vibe.curveStepCount,\n    curveTightness: vibe.curveTightness,\n    disableMultiStroke: vibe.disableMultiStroke,\n    seed: seedOverride ?? vibe.seed,\n  };\n\n  // Rough.js treats the absence of `fill` as \"stroke only\"; never pass null.\n  if (vibe.fill !== null) {\n    options.fill = vibe.fill;\n  }\n\n  return options;\n}\n","import { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { ResolvedVibe, VibeConfig, VibeOverrides } from '../types/vibe';\nimport { resolveVibe } from './resolveVibe';\nimport { VIBE_PRESETS, DEFAULT_VIBE } from './presets';\n\nconst VibeContext = createContext<ResolvedVibe>(VIBE_PRESETS[DEFAULT_VIBE]);\n\nexport interface VibeProviderProps {\n  vibe?: VibeConfig;\n  /**\n   * Colour/font knobs from a `Brand`, layered under the explicit `vibe` so\n   * descendant primitives inherit branded stroke/fill/font. See `resolveVibe`.\n   */\n  brandOverrides?: Partial<VibeOverrides>;\n  children: ReactNode;\n}\n\n/**\n * Makes a resolved vibe available to every descendant primitive. Charts wrap\n * their subtree in this so individual `<RoughPath>`s don't each take a vibe.\n */\nexport function VibeProvider({ vibe, brandOverrides, children }: VibeProviderProps) {\n  const resolved = useMemo(() => resolveVibe(vibe, brandOverrides), [vibe, brandOverrides]);\n  return <VibeContext.Provider value={resolved}>{children}</VibeContext.Provider>;\n}\n\n/** Read the ambient resolved vibe. Used internally by every primitive. */\nexport function useVibeContext(): ResolvedVibe {\n  return useContext(VibeContext);\n}\n\n/**\n * Resolve the effective vibe for a primitive: a local `vibe` prop wins over the\n * surrounding context, and an explicit `seed` overrides whatever it resolves to.\n */\nexport function useResolvedVibe(localVibe?: VibeConfig, seed?: number): ResolvedVibe {\n  const contextVibe = useVibeContext();\n  return useMemo(() => {\n    const base = localVibe === undefined ? contextVibe : resolveVibe(localVibe);\n    return seed === undefined ? base : { ...base, seed };\n  }, [localVibe, contextVibe, seed]);\n}\n","/**\n * Default categorical palette for charts that need many distinct colors\n * (pie slices, multi-series). Vibe-independent on purpose — the vibe controls\n * texture/roughness, the palette controls hue.\n */\nexport const DEFAULT_PALETTE = [\n  '#ef4444',\n  '#f59e0b',\n  '#10b981',\n  '#3b82f6',\n  '#8b5cf6',\n  '#ec4899',\n  '#14b8a6',\n  '#f97316',\n];\n\nexport function colorAt(index: number, palette: string[] = DEFAULT_PALETTE): string {\n  return palette[((index % palette.length) + palette.length) % palette.length];\n}\n","import { DEFAULT_PALETTE } from '../core/palette';\nimport type {\n  Brand,\n  BrandConfig,\n  BrandLogo,\n  BrandVibeOverrides,\n  ResolvedBrand,\n  ResolvedBrandLogo,\n} from '../types/brand';\nimport { isThemedBrand } from '../types/brand';\n\nconst DEFAULT_LOGO_POSITION = 'bottom-right' as const;\nconst DEFAULT_LOGO_WIDTH = 64;\nconst DEFAULT_LOGO_MARGIN = 12;\n\nconst clamp01 = (n: number): number => Math.max(0, Math.min(1, n));\n\nfunction resolveLogo(logo: BrandLogo): ResolvedBrandLogo {\n  const width = logo.width ?? DEFAULT_LOGO_WIDTH;\n  return {\n    src: logo.src,\n    position: logo.position ?? DEFAULT_LOGO_POSITION,\n    width,\n    // A square box by default; the image scales to fit without distortion.\n    height: logo.height ?? width,\n    opacity: logo.opacity === undefined ? 1 : clamp01(logo.opacity),\n    margin: logo.margin ?? DEFAULT_LOGO_MARGIN,\n  };\n}\n\n/**\n * Translate a brand's identity fields into the vibe knobs they map to. Only\n * fields the brand actually set appear, so they never clobber a preset value.\n */\nexport function brandVibeOverrides(brand: Brand): BrandVibeOverrides {\n  const overrides: BrandVibeOverrides = {};\n  if (brand.ink !== undefined) overrides.stroke = brand.ink;\n  if (brand.primary !== undefined) overrides.fill = brand.primary;\n  if (brand.page !== undefined) overrides.background = brand.page;\n  if (brand.font !== undefined) overrides.fontFamily = brand.font;\n  return overrides;\n}\n\n/**\n * Collapse a `BrandConfig` into the pieces the renderer consumes: the\n * categorical palette, an optional resolved logo, and the vibe overrides the\n * brand contributes. The single boundary between loose brand config and the\n * strict internal shape — mirrors `resolveVibe`.\n */\nexport function resolveBrand(\n  brand?: BrandConfig,\n  /** Forces a side of a `ThemedBrand`. Defaults to `'light'` (SSR-safe). */\n  scheme: 'light' | 'dark' = 'light',\n): ResolvedBrand {\n  if (brand === undefined) {\n    return { palette: DEFAULT_PALETTE, vibeOverrides: {} };\n  }\n  const plain: Brand = isThemedBrand(brand) ? brand[scheme] : brand;\n  return {\n    palette: plain.palette && plain.palette.length > 0 ? plain.palette : DEFAULT_PALETTE,\n    logo: plain.logo ? resolveLogo(plain.logo) : undefined,\n    vibeOverrides: brandVibeOverrides(plain),\n  };\n}\n","import { useEffect, useState } from 'react';\nimport type { BrandConfig, BrandMode, ResolvedBrand } from '../types/brand';\nimport { isThemedBrand } from '../types/brand';\nimport { resolveBrand } from './resolveBrand';\n\nconst MEDIA_QUERY = '(prefers-color-scheme: dark)';\n\nfunction readSystemScheme(defaultScheme: 'light' | 'dark'): 'light' | 'dark' {\n  if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n    return defaultScheme;\n  }\n  return window.matchMedia(MEDIA_QUERY).matches ? 'dark' : 'light';\n}\n\n/**\n * Subscribes to the OS colour-scheme preference. SSR-safe: returns\n * `defaultScheme` (default `'light'`) until a browser is available, then\n * resolves to the live `prefers-color-scheme` value.\n */\nexport function useColorScheme(defaultScheme: 'light' | 'dark' = 'light'): 'light' | 'dark' {\n  const [scheme, setScheme] = useState<'light' | 'dark'>(defaultScheme);\n\n  useEffect(() => {\n    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n    const mq = window.matchMedia(MEDIA_QUERY);\n    const sync = () => setScheme(mq.matches ? 'dark' : 'light');\n    sync();\n    mq.addEventListener('change', sync);\n    return () => mq.removeEventListener('change', sync);\n  }, []);\n\n  return scheme;\n}\n\n/**\n * Resolve a brand, honouring a `ThemedBrand`'s `mode`:\n *   `'auto'` (default) — follows `useColorScheme()`\n *   `'light'` / `'dark'` — pinned\n *\n * For plain `Brand`s this is just `resolveBrand(brand)`. Charts that want\n * to follow the OS theme should swap `resolveBrand(brand)` for this hook.\n */\nexport function useResolvedBrand(brand?: BrandConfig): ResolvedBrand {\n  const systemScheme = useColorScheme();\n  if (!isThemedBrand(brand)) return resolveBrand(brand);\n  const mode: BrandMode = brand.mode ?? 'auto';\n  const scheme: 'light' | 'dark' = mode === 'auto' ? systemScheme : mode;\n  return resolveBrand(brand, scheme);\n}\n\nexport { readSystemScheme as __readSystemSchemeForTest };\n","import { createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport type { BrandConfig, ResolvedBrand } from '../types/brand';\nimport { resolveBrand } from './resolveBrand';\nimport { useResolvedBrand } from './useColorScheme';\n\nconst BrandContext = createContext<ResolvedBrand>(resolveBrand());\n\nexport interface BrandProviderProps {\n  brand?: BrandConfig;\n  children: ReactNode;\n}\n\n/**\n * Makes a resolved brand (palette + logo) available to descendants. `<Surface>`\n * wraps its subtree in this so custom compositions can read the brand without\n * threading it manually. Mirrors `VibeProvider`. Themed brands follow the OS\n * colour scheme via `useResolvedBrand`.\n */\nexport function BrandProvider({ brand, children }: BrandProviderProps) {\n  const resolved = useResolvedBrand(brand);\n  return <BrandContext.Provider value={resolved}>{children}</BrandContext.Provider>;\n}\n\n/** Read the ambient resolved brand. */\nexport function useBrand(): ResolvedBrand {\n  return useContext(BrandContext);\n}\n","import type { BoundingBox, Margin, PlotArea, Point } from '../types/geometry';\n\nexport const DEFAULT_MARGIN: Margin = { top: 24, right: 24, bottom: 32, left: 40 };\n\nexport function resolveMargin(margin?: Partial<Margin>): Margin {\n  return { ...DEFAULT_MARGIN, ...margin };\n}\n\n/** Inner drawing area once margins are removed from the outer surface. */\nexport function getPlotArea(width: number, height: number, margin?: Partial<Margin>): PlotArea {\n  const m = resolveMargin(margin);\n  return {\n    x: m.left,\n    y: m.top,\n    width: Math.max(0, width - m.left - m.right),\n    height: Math.max(0, height - m.top - m.bottom),\n  };\n}\n\n/** Axis-aligned bounding box for a set of points. */\nexport function boundsOf(points: Point[]): BoundingBox {\n  if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n  let minX = Infinity;\n  let minY = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n  for (const { x, y } of points) {\n    if (x < minX) minX = x;\n    if (y < minY) minY = y;\n    if (x > maxX) maxX = x;\n    if (y > maxY) maxY = y;\n  }\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import { scaleBand, scaleLinear, scalePoint, scaleSqrt } from 'd3-scale';\nimport type { ScaleBand, ScaleLinear, ScalePoint, ScalePower } from 'd3-scale';\n\n/**\n * Thin wrappers over d3-scale. Pure math: given a domain and a pixel range they\n * return functions mapping data -> coordinates. No DOM, no rendering.\n */\n\nexport function linearScale(\n  domain: [number, number],\n  range: [number, number],\n): ScaleLinear<number, number> {\n  return scaleLinear().domain(domain).range(range);\n}\n\nexport function bandScale(\n  domain: string[],\n  range: [number, number],\n  padding = 0.2,\n): ScaleBand<string> {\n  return scaleBand().domain(domain).range(range).padding(padding);\n}\n\nexport function pointScale(\n  domain: string[],\n  range: [number, number],\n  padding = 0.5,\n): ScalePoint<string> {\n  return scalePoint().domain(domain).range(range).padding(padding);\n}\n\n/** Square-root scale — the correct mapping for bubble *radii* (area ∝ value). */\nexport function sqrtScale(\n  domain: [number, number],\n  range: [number, number],\n): ScalePower<number, number> {\n  return scaleSqrt().domain(domain).range(range);\n}\n\n/** Convenience: nice min/max for a numeric series, with optional zero baseline. */\nexport function extentOf(values: number[], includeZero = true): [number, number] {\n  // Drop NaN/±Infinity so one bad datum can't poison the whole domain (a NaN\n  // extent flows into scales and ultimately hangs Rough.js' hachure fill).\n  const finite = values.filter((v) => Number.isFinite(v));\n  if (finite.length === 0) return [0, 1];\n  let min = Math.min(...finite);\n  let max = Math.max(...finite);\n  if (includeZero) {\n    min = Math.min(min, 0);\n    max = Math.max(max, 0);\n  }\n  if (min === max) max = min + 1;\n  return [min, max];\n}\n","import { area, line, curveBasis, curveCatmullRom, curveLinear, curveMonotoneX } from 'd3-shape';\nimport type { CurveFactory } from 'd3-shape';\nimport type { Point } from '../types/geometry';\n\nexport type CurveName = 'linear' | 'basis' | 'catmullRom' | 'monotoneX';\n\nconst CURVES: Record<CurveName, CurveFactory> = {\n  linear: curveLinear,\n  basis: curveBasis,\n  catmullRom: curveCatmullRom,\n  monotoneX: curveMonotoneX,\n};\n\n/**\n * Build an SVG path `d` string for a poly-line through points. This string is\n * what gets handed to `<RoughPath>` — D3 computes geometry, never draws it.\n */\nexport function linePath(points: Point[], curve: CurveName = 'linear'): string {\n  const generator = line<Point>()\n    .x((p) => p.x)\n    .y((p) => p.y)\n    .curve(CURVES[curve]);\n  return generator(points) ?? '';\n}\n\n/** SVG path for a filled area between `points` and a baseline `y0`. */\nexport function areaPath(points: Point[], y0: number, curve: CurveName = 'linear'): string {\n  const generator = area<Point>()\n    .x((p) => p.x)\n    .y0(y0)\n    .y1((p) => p.y)\n    .curve(CURVES[curve]);\n  return generator(points) ?? '';\n}\n\nexport type LinkOrientation = 'vertical' | 'horizontal';\n\n/**\n * The point on the border of a centred box where the ray from its centre toward\n * `toward` exits. Used to stop connector lines at a node's edge instead of\n * running into its centre.\n */\nexport function boxEdgePoint(center: Point, width: number, height: number, toward: Point): Point {\n  const dx = toward.x - center.x;\n  const dy = toward.y - center.y;\n  if (dx === 0 && dy === 0) return { x: center.x, y: center.y };\n  const scale = 1 / Math.max(Math.abs(dx) / (width / 2), Math.abs(dy) / (height / 2));\n  return { x: center.x + dx * scale, y: center.y + dy * scale };\n}\n\n/** SVG path for a smooth cubic link between two points (flowchart edges). */\nexport function linkPath(\n  from: Point,\n  to: Point,\n  orientation: LinkOrientation = 'vertical',\n): string {\n  if (orientation === 'horizontal') {\n    const midX = (from.x + to.x) / 2;\n    return `M${from.x},${from.y} C${midX},${from.y} ${midX},${to.y} ${to.x},${to.y}`;\n  }\n  const midY = (from.y + to.y) / 2;\n  return `M${from.x},${from.y} C${from.x},${midY} ${to.x},${midY} ${to.x},${to.y}`;\n}\n\n/**\n * Vertices of an elbow (orthogonal) connector: it leaves `from` along the flow\n * axis, jogs across at the midpoint, then arrives at `to` along the flow axis.\n * The final segment is axis-aligned, so an arrowhead reads as a clean right\n * angle into the target.\n */\nexport function orthogonalPoints(\n  from: Point,\n  to: Point,\n  orientation: LinkOrientation = 'vertical',\n): Point[] {\n  if (orientation === 'horizontal') {\n    const midX = (from.x + to.x) / 2;\n    return [from, { x: midX, y: from.y }, { x: midX, y: to.y }, to];\n  }\n  const midY = (from.y + to.y) / 2;\n  return [from, { x: from.x, y: midY }, { x: to.x, y: midY }, to];\n}\n\n/** SVG path for an elbow (orthogonal) connector between two points. */\nexport function orthogonalPath(\n  from: Point,\n  to: Point,\n  orientation: LinkOrientation = 'vertical',\n): string {\n  const [head, ...rest] = orthogonalPoints(from, to, orientation);\n  return `M${head.x},${head.y} ` + rest.map((p) => `L${p.x},${p.y}`).join(' ');\n}\n\n/** SVG path for a diamond centered at (cx, cy) — flowchart decision nodes. */\nexport function diamondPath(cx: number, cy: number, width: number, height: number): string {\n  const hw = width / 2;\n  const hh = height / 2;\n  return `M${cx},${cy - hh} L${cx + hw},${cy} L${cx},${cy + hh} L${cx - hw},${cy} Z`;\n}\n\n/** SVG path for an ellipse centered at (cx, cy) — flowchart terminal nodes. */\nexport function ellipsePath(cx: number, cy: number, rx: number, ry: number): string {\n  return `M${cx - rx},${cy} a${rx},${ry} 0 1,0 ${rx * 2},0 a${rx},${ry} 0 1,0 ${-rx * 2},0 Z`;\n}\n\nexport type ConnectorRouting = 'straight' | 'curved' | 'orthogonal';\n\n/** Geometry for an arrow connecting two points: shaft `d`, head tails, label spot. */\nexport interface Connector {\n  /** SVG path `d` for the shaft. */\n  d: string;\n  /** Tail the end head (at `to`) points away from: `arrowHeadPath(endHeadTail, to)`. */\n  endHeadTail: Point;\n  /** Tail the start head (at `from`) points away from: `arrowHeadPath(startHeadTail, from)`. */\n  startHeadTail: Point;\n  /** Where a midpoint label sits. */\n  labelAt: Point;\n}\n\n/**\n * Build the geometry for an arrow connecting `from` to `to`. The shaft is a\n * straight line, a smooth `linkPath` cubic, or an `orthogonalPath` elbow.\n * Orientation defaults to the dominant axis (ties -> horizontal). DOM-free.\n */\nexport function connectorPath(\n  from: Point,\n  to: Point,\n  opts: { routing?: ConnectorRouting; orientation?: LinkOrientation } = {},\n): Connector {\n  const routing = opts.routing ?? 'straight';\n  const orientation =\n    opts.orientation ??\n    (Math.abs(to.x - from.x) >= Math.abs(to.y - from.y) ? 'horizontal' : 'vertical');\n  const midpoint = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n\n  if (routing === 'orthogonal') {\n    const points = orthogonalPoints(from, to, orientation);\n    // Centre the label on the middle (cross) segment rather than on the elbow vertex.\n    const a = points[1];\n    const b = points[2];\n    return {\n      d: orthogonalPath(from, to, orientation),\n      endHeadTail: points[points.length - 2],\n      startHeadTail: points[1],\n      labelAt: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n    };\n  }\n  if (routing === 'curved') {\n    return {\n      d: linkPath(from, to, orientation),\n      endHeadTail: from,\n      startHeadTail: to,\n      labelAt: midpoint,\n    };\n  }\n  return {\n    d: `M${from.x},${from.y} L${to.x},${to.y}`,\n    endHeadTail: from,\n    startHeadTail: to,\n    labelAt: midpoint,\n  };\n}\n\n/**\n * Arrowhead at `to`, pointing along the `from -> to` direction. By default an\n * open two-stroke head (`left -> tip -> right`); when `filled` is true the path\n * is closed into a solid triangle.\n */\nexport function arrowHeadPath(from: Point, to: Point, size = 9, filled = false): string {\n  const angle = Math.atan2(to.y - from.y, to.x - from.x);\n  const spread = Math.PI / 7;\n  const left = {\n    x: to.x - size * Math.cos(angle - spread),\n    y: to.y - size * Math.sin(angle - spread),\n  };\n  const right = {\n    x: to.x - size * Math.cos(angle + spread),\n    y: to.y - size * Math.sin(angle + spread),\n  };\n  const d = `M${left.x},${left.y} L${to.x},${to.y} L${right.x},${right.y}`;\n  return filled ? `${d} Z` : d;\n}\n","import { stratify, tree } from 'd3-hierarchy';\nimport type { HierarchyNode } from 'd3-hierarchy';\nimport type { FlowDirection, FlowEdge, FlowNode, FlowNodeShape } from '../types/charts';\nimport type { Point } from '../types/geometry';\n\nexport interface LaidOutNode {\n  id: string;\n  label: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  shape: FlowNodeShape;\n  data: FlowNode;\n}\n\nexport interface LaidOutEdge {\n  from: string;\n  to: string;\n  label?: string;\n  sx: number;\n  sy: number;\n  tx: number;\n  ty: number;\n  /**\n   * Explicit waypoints for the connector, source boundary → target boundary\n   * (e.g. obstacle-routed architecture edges or straight mind-map spokes). When\n   * present the renderer draws this polyline instead of deriving a curve/elbow.\n   */\n  points?: Point[];\n}\n\nexport interface FlowLayout {\n  nodes: LaidOutNode[];\n  edges: LaidOutEdge[];\n}\n\nexport const DEFAULT_NODE_W = 120;\nexport const DEFAULT_NODE_H = 48;\n\nexport function isHorizontal(direction: FlowDirection): boolean {\n  return direction === 'LR' || direction === 'RL';\n}\n\n/**\n * Offset an edge's endpoints from node centers to the node boundaries facing\n * the flow direction, so links start/end at an edge rather than the middle.\n * Shared by the tree and DAG layout engines.\n */\nexport function connectEdge(\n  s: LaidOutNode,\n  t: LaidOutNode,\n  direction: FlowDirection,\n): { sx: number; sy: number; tx: number; ty: number } {\n  let sx = s.x;\n  let sy = s.y;\n  let tx = t.x;\n  let ty = t.y;\n  switch (direction) {\n    case 'TB':\n      sy = s.y + s.height / 2;\n      ty = t.y - t.height / 2;\n      break;\n    case 'BT':\n      sy = s.y - s.height / 2;\n      ty = t.y + t.height / 2;\n      break;\n    case 'LR':\n      sx = s.x + s.width / 2;\n      tx = t.x - t.width / 2;\n      break;\n    case 'RL':\n      sx = s.x - s.width / 2;\n      tx = t.x + t.width / 2;\n      break;\n  }\n  return { sx, sy, tx, ty };\n}\n\n/**\n * Lay out a parent/child node list into a tidy tree using d3-hierarchy, in any\n * of the four cardinal directions. Returns absolute pixel coordinates and edge\n * endpoints — pure math, ready for the rendering layer to draw.\n */\nexport function layoutTree(\n  nodes: FlowNode[],\n  size: [number, number],\n  explicitEdges?: FlowEdge[],\n  direction: FlowDirection = 'TB',\n): FlowLayout {\n  if (nodes.length === 0) return { nodes: [], edges: [] };\n\n  const [width, height] = size;\n  const horizontal = isHorizontal(direction);\n\n  const root: HierarchyNode<FlowNode> = stratify<FlowNode>()\n    .id((n) => n.id)\n    .parentId((n) => n.parent)(nodes);\n\n  // For horizontal layouts, depth runs along x, so the tree's own size is swapped.\n  const layout = tree<FlowNode>()\n    .size(horizontal ? [height, width] : [width, height])\n    .separation((a, b) => (a.parent === b.parent ? 1 : 1.4));\n  const positioned = layout(root);\n\n  const place = (dx: number, dy: number): { x: number; y: number } => {\n    switch (direction) {\n      case 'BT':\n        return { x: dx, y: height - dy };\n      case 'LR':\n        return { x: dy, y: dx };\n      case 'RL':\n        return { x: width - dy, y: dx };\n      case 'TB':\n      default:\n        return { x: dx, y: dy };\n    }\n  };\n\n  const byId = new Map<string, LaidOutNode>();\n  const laidOutNodes: LaidOutNode[] = positioned.descendants().map((d) => {\n    const { x, y } = place(d.x, d.y);\n    const node: LaidOutNode = {\n      id: d.data.id,\n      label: d.data.label,\n      x,\n      y,\n      width: d.data.width ?? DEFAULT_NODE_W,\n      height: d.data.height ?? DEFAULT_NODE_H,\n      shape: d.data.shape ?? 'rect',\n      data: d.data,\n    };\n    byId.set(node.id, node);\n    return node;\n  });\n\n  const edgeSource: FlowEdge[] =\n    explicitEdges ??\n    positioned.links().map((l) => ({ from: l.source.data.id, to: l.target.data.id }));\n\n  const laidOutEdges: LaidOutEdge[] = edgeSource.flatMap((e) => {\n    const s = byId.get(e.from);\n    const t = byId.get(e.to);\n    if (!s || !t) return [];\n    return [{ from: e.from, to: e.to, label: e.label, ...connectEdge(s, t, direction) }];\n  });\n\n  return { nodes: laidOutNodes, edges: laidOutEdges };\n}\n","import type { FlowDirection, FlowEdge, FlowNode } from '../types/charts';\nimport { DEFAULT_NODE_H, DEFAULT_NODE_W, connectEdge, isHorizontal, layoutTree } from './hierarchy';\nimport type { FlowLayout, LaidOutEdge, LaidOutNode } from './hierarchy';\n\n/** Edges as given, or derived from each node's `parent` link when absent. */\nfunction effectiveEdges(nodes: FlowNode[], explicit?: FlowEdge[]): FlowEdge[] {\n  if (explicit && explicit.length > 0) return explicit;\n  return nodes.filter((n) => n.parent != null).map((n) => ({ from: n.parent as string, to: n.id }));\n}\n\n/**\n * A graph is \"tree-like\" — and therefore better served by the tidy d3 tree\n * layout — when it has exactly one root, no node with more than one parent, and\n * no cycles. Everything else (merges, multiple roots, cycles) needs the layered\n * DAG layout.\n */\nfunction isTreeLike(nodes: FlowNode[], edges: FlowEdge[]): boolean {\n  const ids = new Set(nodes.map((n) => n.id));\n  const indeg = new Map<string, number>(nodes.map((n) => [n.id, 0]));\n  for (const e of edges) {\n    if (!ids.has(e.from) || !ids.has(e.to) || e.from === e.to) return false;\n    const next = (indeg.get(e.to) ?? 0) + 1;\n    if (next > 1) return false;\n    indeg.set(e.to, next);\n  }\n  const roots = nodes.filter((n) => (indeg.get(n.id) ?? 0) === 0);\n  if (roots.length !== 1) return false;\n\n  // Acyclic check: every node is reachable from the single root in exactly one\n  // path (guaranteed acyclic + connected given the indegree constraints above).\n  const children = new Map<string, string[]>(nodes.map((n) => [n.id, []]));\n  for (const e of edges) children.get(e.from)!.push(e.to);\n  const seen = new Set<string>();\n  const stack = [roots[0].id];\n  while (stack.length) {\n    const id = stack.pop()!;\n    if (seen.has(id)) return false; // revisit ⇒ cycle reachable from root\n    seen.add(id);\n    for (const c of children.get(id)!) stack.push(c);\n  }\n  return seen.size === nodes.length;\n}\n\n/**\n * Longest-path layer assignment via bounded relaxation: every node sits one\n * layer below its deepest parent; roots stay at 0. The iteration cap guarantees\n * termination even with cycles. Shared by the DAG layout and the Sankey chart.\n */\nexport function assignLayers(\n  nodeIds: string[],\n  links: { from: string; to: string }[],\n): Map<string, number> {\n  const layer = new Map<string, number>(nodeIds.map((id) => [id, 0]));\n  for (let iter = 0; iter < nodeIds.length; iter++) {\n    let changed = false;\n    for (const e of links) {\n      if (!layer.has(e.from) || !layer.has(e.to)) continue;\n      const want = layer.get(e.from)! + 1;\n      if (want > layer.get(e.to)!) {\n        layer.set(e.to, want);\n        changed = true;\n      }\n    }\n    if (!changed) break;\n  }\n  return layer;\n}\n\n/**\n * Lay out a general directed graph using a layered (Sugiyama-style) approach:\n * longest-path layering, a median heuristic to reduce edge crossings, then even\n * spacing within each layer. Handles merges (multiple parents), multiple roots\n * and cycles (degenerate, but won't loop). Pure math — pixel coordinates ready\n * for the renderer, mirroring `layoutTree`'s output shape.\n */\nexport function layoutDag(\n  nodes: FlowNode[],\n  size: [number, number],\n  edges: FlowEdge[],\n  direction: FlowDirection = 'TB',\n): FlowLayout {\n  if (nodes.length === 0) return { nodes: [], edges: [] };\n\n  const [width, height] = size;\n  const horizontal = isHorizontal(direction);\n  const ids = new Set(nodes.map((n) => n.id));\n  const links = edges.filter((e) => ids.has(e.from) && ids.has(e.to) && e.from !== e.to);\n\n  const children = new Map<string, string[]>(nodes.map((n) => [n.id, []]));\n  const parents = new Map<string, string[]>(nodes.map((n) => [n.id, []]));\n  for (const e of links) {\n    children.get(e.from)!.push(e.to);\n    parents.get(e.to)!.push(e.from);\n  }\n\n  const layer = assignLayers(\n    nodes.map((n) => n.id),\n    links,\n  );\n  const maxLayer = Math.max(...nodes.map((n) => layer.get(n.id)!));\n  const byLayer: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n  for (const n of nodes) byLayer[layer.get(n.id)!].push(n.id);\n\n  // Crossing reduction: alternate down/up median sweeps. A node moves to the\n  // median position of its already-ordered neighbours in the adjacent layer.\n  const pos = new Map<string, number>();\n  const reindex = (ord: string[]) => ord.forEach((id, i) => pos.set(id, i));\n  byLayer.forEach(reindex);\n\n  const median = (id: string, neighbours: Map<string, string[]>): number => {\n    const ps = neighbours\n      .get(id)!\n      .map((nb) => pos.get(nb)!)\n      .filter((p) => p != null);\n    if (ps.length === 0) return pos.get(id)!; // no anchor ⇒ keep current slot\n    ps.sort((a, b) => a - b);\n    const mid = Math.floor(ps.length / 2);\n    return ps.length % 2 ? ps[mid] : (ps[mid - 1] + ps[mid]) / 2;\n  };\n\n  const sweep = (neighbours: Map<string, string[]>, order: number[]) => {\n    for (const l of order) {\n      const keyed = byLayer[l].map((id, i) => ({ id, key: median(id, neighbours), i }));\n      keyed.sort((a, b) => a.key - b.key || a.i - b.i);\n      byLayer[l] = keyed.map((k) => k.id);\n      reindex(byLayer[l]);\n    }\n  };\n\n  const down = Array.from({ length: maxLayer }, (_, i) => i + 1); // layers 1..max\n  const up = down\n    .slice()\n    .reverse()\n    .map((l) => l - 1); // layers max-1..0\n  for (let i = 0; i < 2; i++) {\n    sweep(parents, down);\n    sweep(children, up);\n  }\n\n  // Coordinate assignment: layer index drives the flow (depth) axis, slot index\n  // spreads nodes evenly across the cross (breadth) axis.\n  const depthFrac = (l: number) => (maxLayer === 0 ? 0.5 : l / maxLayer);\n  const byId = new Map<string, LaidOutNode>();\n  const laidOutNodes: LaidOutNode[] = nodes.map((n) => {\n    const l = layer.get(n.id)!;\n    const slots = byLayer[l];\n    const breadthFrac = (slots.indexOf(n.id) + 1) / (slots.length + 1);\n    const depthPx = (horizontal ? width : height) * depthFrac(l);\n    const breadthPx = (horizontal ? height : width) * breadthFrac;\n\n    let x: number;\n    let y: number;\n    switch (direction) {\n      case 'BT':\n        x = breadthPx;\n        y = height - depthPx;\n        break;\n      case 'LR':\n        x = depthPx;\n        y = breadthPx;\n        break;\n      case 'RL':\n        x = width - depthPx;\n        y = breadthPx;\n        break;\n      case 'TB':\n      default:\n        x = breadthPx;\n        y = depthPx;\n        break;\n    }\n\n    const node: LaidOutNode = {\n      id: n.id,\n      label: n.label,\n      x,\n      y,\n      width: n.width ?? DEFAULT_NODE_W,\n      height: n.height ?? DEFAULT_NODE_H,\n      shape: n.shape ?? 'rect',\n      data: n,\n    };\n    byId.set(node.id, node);\n    return node;\n  });\n\n  const laidOutEdges: LaidOutEdge[] = links.flatMap((e) => {\n    const s = byId.get(e.from);\n    const t = byId.get(e.to);\n    if (!s || !t) return [];\n    return [{ from: e.from, to: e.to, label: e.label, ...connectEdge(s, t, direction) }];\n  });\n\n  return { nodes: laidOutNodes, edges: laidOutEdges };\n}\n\n/**\n * Lay out a flowchart, automatically choosing the engine: the tidy d3 tree\n * layout for single-root trees, the layered DAG layout for everything else\n * (merges, multiple roots, cycles). Keeps the common tree case unchanged while\n * supporting arbitrary directed graphs.\n */\nexport function layoutFlow(\n  nodes: FlowNode[],\n  size: [number, number],\n  edges?: FlowEdge[],\n  direction: FlowDirection = 'TB',\n  engine: 'auto' | 'tree' | 'dag' = 'auto',\n): FlowLayout {\n  if (nodes.length === 0) return { nodes: [], edges: [] };\n\n  const eff = effectiveEdges(nodes, edges);\n  // `dag` forces the layered engine; `tree`/`auto` use the tidy tree only when\n  // the graph is actually stratifiable (single root, no merges/cycles), else\n  // fall back to the DAG engine rather than crash d3 `stratify`.\n  const useTree = engine !== 'dag' && isTreeLike(nodes, eff);\n  if (useTree) {\n    // Ensure `parent` is set so d3 `stratify` can build the hierarchy even when\n    // the structure was supplied purely as explicit edges.\n    const parentOf = new Map<string, string>(eff.map((e) => [e.to, e.from]));\n    const augmented = nodes.map((n) =>\n      n.parent != null || !parentOf.has(n.id) ? n : { ...n, parent: parentOf.get(n.id) },\n    );\n    return layoutTree(augmented, size, edges, direction);\n  }\n\n  return layoutDag(nodes, size, eff, direction);\n}\n","import type { FlowDirection, FlowEdge, FlowNode, LayoutOptions } from '../types/charts';\nimport type { Point } from '../types/geometry';\nimport { layoutFlow } from './dag';\nimport type { FlowLayout, LaidOutNode } from './hierarchy';\n\n/**\n * Shared diagram model. A `LayoutEngine` turns nodes + edges into a positioned\n * `DiagramScene`; the `Diagram` component renders any scene. Specific diagram\n * types (flowchart, sequence, mind-map, …) are just a layout engine plus the\n * shared renderer — pure geometry here, no DOM.\n */\n\nexport type { LaidOutEdge, LaidOutNode } from './hierarchy';\n\nexport type DiagramOrientation = 'vertical' | 'horizontal';\n\n/** A labelled container bounding a set of member nodes. */\nexport interface LaidGroup {\n  id: string;\n  label?: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  /**\n   * Where to draw the label, when the layout wants it somewhere other than the\n   * default top-left-on-the-border spot — e.g. swimlane titles sat in a gutter\n   * clear of the connector flow. `labelAnchor` is the text anchor at that point.\n   */\n  labelPoint?: Point;\n  labelAnchor?: 'start' | 'middle';\n}\n\nexport interface DiagramScene extends FlowLayout {\n  orientation: DiagramOrientation;\n  groups?: LaidGroup[];\n}\n\n/** Position a node/edge set within `size`. Bound to its options by a factory. */\nexport type LayoutEngine = (\n  nodes: FlowNode[],\n  edges: FlowEdge[] | undefined,\n  size: [number, number],\n) => DiagramScene;\n\n/** The flowchart layout (tidy tree or layered DAG) as a `LayoutEngine`. */\nexport function flowLayout(direction: FlowDirection = 'TB', options?: LayoutOptions): LayoutEngine {\n  return (nodes, edges, size) => ({\n    ...layoutFlow(nodes, size, edges, direction, options?.engine ?? 'auto'),\n    orientation: direction === 'LR' || direction === 'RL' ? 'horizontal' : 'vertical',\n  });\n}\n\n/**\n * Bounding boxes for node groups, keyed off each node's `group` field. Used by\n * diagram types that draw subgraph/lane containers (e.g. architecture diagrams).\n */\nexport function computeGroups(nodes: LaidOutNode[], padding = 12): LaidGroup[] {\n  const byGroup = new Map<string, LaidOutNode[]>();\n  for (const n of nodes) {\n    const g = n.data.group;\n    if (!g) continue;\n    const list = byGroup.get(g);\n    if (list) list.push(n);\n    else byGroup.set(g, [n]);\n  }\n\n  return [...byGroup].map(([id, members]) => {\n    const x0 = Math.min(...members.map((m) => m.x - m.width / 2)) - padding;\n    const y0 = Math.min(...members.map((m) => m.y - m.height / 2)) - padding;\n    const x1 = Math.max(...members.map((m) => m.x + m.width / 2)) + padding;\n    const y1 = Math.max(...members.map((m) => m.y + m.height / 2)) + padding;\n    return { id, label: id, x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n  });\n}\n","import { stratify, tree } from 'd3-hierarchy';\nimport type { FlowNode } from '../types/charts';\nimport type { Point } from '../types/geometry';\nimport type { LayoutEngine } from './diagram';\nimport { DEFAULT_NODE_H, DEFAULT_NODE_W } from './hierarchy';\nimport type { LaidOutEdge, LaidOutNode } from './hierarchy';\n\n/**\n * Radial tree layout for mind-maps: the root sits at the plot centre and each\n * generation fans out onto a concentric ring, leaves spread evenly by angle.\n * Edges are straight centre-to-centre spokes (the renderer draws nodes on top,\n * so the overlap is hidden). Pure geometry, returned as a `DiagramScene`.\n */\nexport function radialLayout(): LayoutEngine {\n  return (nodes, edges, size) => {\n    const [width, height] = size;\n    if (nodes.length === 0) return { nodes: [], edges: [], orientation: 'vertical' };\n\n    // Resolve the tree structure: explicit `parent`, otherwise derived from edges.\n    const parentOf = new Map<string, string>();\n    for (const e of edges ?? []) parentOf.set(e.to, e.from);\n    const withParent = nodes.map((n) =>\n      n.parent != null || !parentOf.has(n.id) ? n : { ...n, parent: parentOf.get(n.id) },\n    );\n\n    const root = stratify<FlowNode>()\n      .id((n) => n.id)\n      .parentId((n) => n.parent)(withParent);\n\n    const cx = width / 2;\n    const cy = height / 2;\n\n    // Size the radius from the content, not the canvas: each generation needs a\n    // ring gap of roughly a node height, and the outer ring's circumference must\n    // fit every leaf at its measured width. `Diagram` scales the result to fit.\n    const widths = withParent.map((n) => n.width ?? DEFAULT_NODE_W);\n    const heights = withParent.map((n) => n.height ?? DEFAULT_NODE_H);\n    const maxW = Math.max(DEFAULT_NODE_W / 2, ...widths);\n    const maxH = Math.max(DEFAULT_NODE_H / 2, ...heights);\n    const depth = Math.max(1, root.height);\n    const gap = 28;\n    // Generous ring spacing so generations clear each other. The binding\n    // dimension near the centre is node *width* (a child can sit beside the\n    // root), so factor that in — height alone left the root overlapping its\n    // first ring.\n    const ringStep = Math.max(maxH * 2.2, maxW * 1.15);\n    let radius = depth * ringStep;\n    // ...and enough total radius that *every* ring's circumference fits its\n    // nodes at the measured width (the inner rings are usually the binding\n    // constraint — few nodes, but a small radius).\n    const countByDepth = new Map<number, number>();\n    for (const d of root.descendants())\n      countByDepth.set(d.depth, (countByDepth.get(d.depth) ?? 0) + 1);\n    for (const [d, count] of countByDepth) {\n      if (d === 0) continue;\n      radius = Math.max(radius, (count * (maxW + gap) * depth) / (2 * Math.PI * d));\n    }\n\n    const layout = tree<FlowNode>()\n      .size([2 * Math.PI, radius])\n      .separation((a, b) => (a.parent === b.parent ? 1 : 2) / Math.max(1, a.depth));\n    const positioned = layout(root);\n\n    const polar = (angle: number, r: number): Point => ({\n      x: cx + r * Math.cos(angle - Math.PI / 2),\n      y: cy + r * Math.sin(angle - Math.PI / 2),\n    });\n\n    const byId = new Map<string, LaidOutNode>();\n    const laidOutNodes: LaidOutNode[] = positioned.descendants().map((d) => {\n      const { x, y } = polar(d.x, d.y);\n      const node: LaidOutNode = {\n        id: d.data.id,\n        label: d.data.label,\n        x,\n        y,\n        width: d.data.width ?? DEFAULT_NODE_W,\n        height: d.data.height ?? DEFAULT_NODE_H,\n        shape: d.data.shape ?? 'rect',\n        data: d.data,\n      };\n      byId.set(node.id, node);\n      return node;\n    });\n\n    const laidOutEdges: LaidOutEdge[] = positioned.links().flatMap((l) => {\n      const s = byId.get(l.source.data.id);\n      const t = byId.get(l.target.data.id);\n      if (!s || !t) return [];\n      const from = { x: s.x, y: s.y };\n      const to = { x: t.x, y: t.y };\n      return [\n        { from: s.id, to: t.id, sx: from.x, sy: from.y, tx: to.x, ty: to.y, points: [from, to] },\n      ];\n    });\n\n    return { nodes: laidOutNodes, edges: laidOutEdges, orientation: 'vertical' };\n  };\n}\n","import type { Point } from '../types/geometry';\n\n/** An axis-aligned rectangle (top-left origin) the router must steer around. */\nexport interface Obstacle {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/** Midpoint of the box side facing `toward` — a connector's port on that box. */\nexport function boxPort(box: Obstacle, toward: Point): Point {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  const dx = toward.x - cx;\n  const dy = toward.y - cy;\n  if (Math.abs(dx) >= Math.abs(dy)) {\n    return { x: cx + (dx >= 0 ? box.width / 2 : -box.width / 2), y: cy };\n  }\n  return { x: cx, y: cy + (dy >= 0 ? box.height / 2 : -box.height / 2) };\n}\n\nexport interface RouteOptions {\n  /** Clearance kept between a connector and every obstacle. */\n  padding?: number;\n  /** Extra cost per 90° turn, biasing the route toward few straight runs. */\n  turnPenalty?: number;\n}\n\ninterface InflatedRect {\n  x0: number;\n  y0: number;\n  x1: number;\n  y1: number;\n}\n\nconst sortedUnique = (values: number[]): number[] =>\n  [...new Set(values.map((v) => Math.round(v * 100) / 100))].sort((a, b) => a - b);\n\n/** True when the axis-aligned segment p→q passes through any rectangle's interior. */\nfunction blocked(p: Point, q: Point, rects: InflatedRect[]): boolean {\n  if (p.y === q.y) {\n    const y = p.y;\n    const x0 = Math.min(p.x, q.x);\n    const x1 = Math.max(p.x, q.x);\n    return rects.some((r) => y > r.y0 && y < r.y1 && x0 < r.x1 && x1 > r.x0);\n  }\n  const x = p.x;\n  const y0 = Math.min(p.y, q.y);\n  const y1 = Math.max(p.y, q.y);\n  return rects.some((r) => x > r.x0 && x < r.x1 && y0 < r.y1 && y1 > r.y0);\n}\n\n/**\n * Hand-rolled orthogonal connector router. Rather than a uniform pixel grid it\n * builds a sparse lattice from the \"interesting\" coordinates — every obstacle's\n * padded edges plus the two endpoints — so ports always land on the graph and\n * every lattice segment is axis-aligned. A* then searches that lattice with a\n * per-turn penalty, yielding clean L/Z routes that keep `padding` clearance\n * from other boxes. Pure geometry; returns the simplified polyline from `from`\n * to `to` (or a direct elbow when the lattice is fully blocked).\n */\nexport function routeOrthogonal(\n  from: Point,\n  to: Point,\n  obstacles: Obstacle[],\n  opts: RouteOptions = {},\n): Point[] {\n  const pad = opts.padding ?? 10;\n  const turnPenalty = opts.turnPenalty ?? 20;\n\n  const rects: InflatedRect[] = obstacles.map((o) => ({\n    x0: o.x - pad,\n    y0: o.y - pad,\n    x1: o.x + o.width + pad,\n    y1: o.y + o.height + pad,\n  }));\n\n  const xs = sortedUnique([from.x, to.x, ...rects.flatMap((r) => [r.x0, r.x1])]);\n  const ys = sortedUnique([from.y, to.y, ...rects.flatMap((r) => [r.y0, r.y1])]);\n  const xi = new Map(xs.map((v, i) => [v, i]));\n  const yi = new Map(ys.map((v, i) => [v, i]));\n\n  const elbow = (): Point[] => {\n    const corner = { x: to.x, y: from.y };\n    return simplify([from, corner, to]);\n  };\n  const startX = xi.get(Math.round(from.x * 100) / 100);\n  const startY = yi.get(Math.round(from.y * 100) / 100);\n  const goalX = xi.get(Math.round(to.x * 100) / 100);\n  const goalY = yi.get(Math.round(to.y * 100) / 100);\n  if (startX == null || startY == null || goalX == null || goalY == null) return elbow();\n\n  const cols = xs.length;\n  const key = (cx: number, cy: number) => cy * cols + cx;\n  const pointAt = (cx: number, cy: number): Point => ({ x: xs[cx], y: ys[cy] });\n\n  const start = key(startX, startY);\n  const goal = key(goalX, goalY);\n  const h = (cx: number, cy: number) => Math.abs(xs[cx] - to.x) + Math.abs(ys[cy] - to.y);\n\n  const gScore = new Map<number, number>([[start, 0]]);\n  const cameFrom = new Map<number, number>();\n  const open: { k: number; f: number }[] = [{ k: start, f: h(startX, startY) }];\n\n  const colOf = (k: number) => k % cols;\n  const rowOf = (k: number) => Math.floor(k / cols);\n\n  while (open.length) {\n    let bi = 0;\n    for (let i = 1; i < open.length; i++) if (open[i].f < open[bi].f) bi = i;\n    const { k: current } = open.splice(bi, 1)[0];\n    if (current === goal) break;\n\n    const ccx = colOf(current);\n    const ccy = rowOf(current);\n    const prev = cameFrom.get(current);\n    const prevDir = prev == null ? null : { dx: ccx - colOf(prev), dy: ccy - rowOf(prev) };\n\n    const neighbours = [\n      [ccx + 1, ccy],\n      [ccx - 1, ccy],\n      [ccx, ccy + 1],\n      [ccx, ccy - 1],\n    ];\n    for (const [ncx, ncy] of neighbours) {\n      if (ncx < 0 || ncy < 0 || ncx >= cols || ncy >= ys.length) continue;\n      const a = pointAt(ccx, ccy);\n      const b = pointAt(ncx, ncy);\n      if (blocked(a, b, rects)) continue;\n      const step = Math.abs(b.x - a.x) + Math.abs(b.y - a.y);\n      const dir = { dx: ncx - ccx, dy: ncy - ccy };\n      const turn = prevDir && (prevDir.dx !== dir.dx || prevDir.dy !== dir.dy) ? turnPenalty : 0;\n      const tentative = gScore.get(current)! + step + turn;\n      const nk = key(ncx, ncy);\n      if (tentative < (gScore.get(nk) ?? Infinity)) {\n        cameFrom.set(nk, current);\n        gScore.set(nk, tentative);\n        open.push({ k: nk, f: tentative + h(ncx, ncy) });\n      }\n    }\n  }\n\n  if (!cameFrom.has(goal) && start !== goal) return elbow();\n\n  const path: Point[] = [];\n  let node: number | undefined = goal;\n  while (node != null) {\n    path.unshift(pointAt(colOf(node), rowOf(node)));\n    node = cameFrom.get(node);\n  }\n  return simplify(path);\n}\n\n/** Drop collinear interior points so the polyline is just its corners. */\nexport function simplify(points: Point[]): Point[] {\n  if (points.length <= 2) return points;\n  const out: Point[] = [points[0]];\n  for (let i = 1; i < points.length - 1; i++) {\n    const a = out[out.length - 1];\n    const b = points[i];\n    const c = points[i + 1];\n    const collinear = (a.x === b.x && b.x === c.x) || (a.y === b.y && b.y === c.y);\n    if (!collinear) out.push(b);\n  }\n  out.push(points[points.length - 1]);\n  return out;\n}\n","import type { Margin } from '../types/geometry';\n\n/**\n * Headless text metrics. The MCP server renders via `renderToStaticMarkup` with\n * no canvas/DOM, so measurement is analytic: a per-character em-width table\n * (approximating a proportional sans-serif) scaled by font size. An\n * approximation, but deterministic and identical across the library and the\n * headless build.\n */\n\n/**\n * Per-glyph advance widths for Helvetica (Adobe AFM, 1000 units/em). Treating\n * every proportional sans-serif as Helvetica-metric is a far better analytic\n * estimate than coarse width buckets, and stays deterministic and DOM-free —\n * the headless build has no canvas to measure with.\n */\nconst HELVETICA_1000: Record<string, number> = {\n  ' ': 278,\n  '!': 278,\n  '\"': 355,\n  '#': 556,\n  $: 556,\n  '%': 889,\n  '&': 667,\n  \"'\": 191,\n  '(': 333,\n  ')': 333,\n  '*': 389,\n  '+': 584,\n  ',': 278,\n  '-': 333,\n  '.': 278,\n  '/': 278,\n  '0': 556,\n  '1': 556,\n  '2': 556,\n  '3': 556,\n  '4': 556,\n  '5': 556,\n  '6': 556,\n  '7': 556,\n  '8': 556,\n  '9': 556,\n  ':': 278,\n  ';': 278,\n  '<': 584,\n  '=': 584,\n  '>': 584,\n  '?': 556,\n  '@': 1015,\n  A: 667,\n  B: 667,\n  C: 722,\n  D: 722,\n  E: 667,\n  F: 611,\n  G: 778,\n  H: 722,\n  I: 278,\n  J: 500,\n  K: 667,\n  L: 556,\n  M: 833,\n  N: 722,\n  O: 778,\n  P: 667,\n  Q: 778,\n  R: 722,\n  S: 667,\n  T: 611,\n  U: 722,\n  V: 667,\n  W: 944,\n  X: 667,\n  Y: 667,\n  Z: 611,\n  '[': 278,\n  '\\\\': 278,\n  ']': 278,\n  '^': 469,\n  _: 556,\n  '`': 333,\n  a: 556,\n  b: 556,\n  c: 500,\n  d: 556,\n  e: 556,\n  f: 278,\n  g: 556,\n  h: 556,\n  i: 222,\n  j: 222,\n  k: 500,\n  l: 222,\n  m: 833,\n  n: 556,\n  o: 556,\n  p: 556,\n  q: 556,\n  r: 333,\n  s: 500,\n  t: 278,\n  u: 556,\n  v: 500,\n  w: 722,\n  x: 500,\n  y: 500,\n  z: 500,\n  '{': 334,\n  '|': 260,\n  '}': 334,\n  '~': 584,\n};\n\n/** Advance width of a single character, in em (relative to fontSize). */\nfunction charEm(ch: string): number {\n  return (HELVETICA_1000[ch] ?? 556) / 1000;\n}\n\nfunction familyFactor(fontFamily: string): { fixed: number | null; scale: number } {\n  const f = fontFamily.toLowerCase();\n  if (f.includes('mono') || f.includes('courier')) return { fixed: 0.6, scale: 1 };\n  if (f.includes('comic') || f.includes('print') || f.includes('cursive'))\n    return { fixed: null, scale: 1.08 };\n  return { fixed: null, scale: 1 };\n}\n\n/** Estimate the rendered size of a single line of text. */\nexport function measureText(\n  text: string,\n  fontSize: number,\n  fontFamily: string,\n): { width: number; height: number } {\n  const { fixed, scale } = familyFactor(fontFamily);\n  let em = 0;\n  for (const ch of text) em += fixed ?? charEm(ch);\n  return { width: em * fontSize * scale, height: fontSize * 1.2 };\n}\n\n/** Greedy word-wrap to a pixel width; hard-breaks any single word that overflows. */\nexport function wrapText(\n  text: string,\n  maxWidth: number,\n  fontSize: number,\n  fontFamily: string,\n): string[] {\n  const words = text.split(/\\s+/).filter(Boolean);\n  if (words.length === 0) return [];\n  const lines: string[] = [];\n  let line = '';\n\n  const fits = (s: string) => measureText(s, fontSize, fontFamily).width <= maxWidth;\n\n  for (const word of words) {\n    const candidate = line ? `${line} ${word}` : word;\n    if (fits(candidate) || !line) {\n      if (fits(candidate)) {\n        line = candidate;\n        continue;\n      }\n      // `word` alone overflows an empty line: hard-break it by character.\n      let chunk = '';\n      for (const ch of word) {\n        if (chunk && !fits(chunk + ch)) {\n          lines.push(chunk);\n          chunk = ch;\n        } else {\n          chunk += ch;\n        }\n      }\n      line = chunk;\n    } else {\n      lines.push(line);\n      line = word;\n    }\n  }\n  if (line) lines.push(line);\n  return lines;\n}\n\n/**\n * Grow a base margin so the widest label fits on the left (y-axis tick labels)\n * and a line of text fits along the bottom (x-axis tick labels). Pure helper for\n * charts that want their margins to adapt to their data.\n */\nexport function autoMargin(\n  labels: string[],\n  fontSize: number,\n  fontFamily: string,\n  base: Margin,\n  pad = 8,\n): Margin {\n  const widest = labels.reduce(\n    (max, l) => Math.max(max, measureText(l, fontSize, fontFamily).width),\n    0,\n  );\n  const lineHeight = fontSize * 1.2;\n  return {\n    ...base,\n    left: Math.max(base.left, Math.ceil(widest + pad)),\n    bottom: Math.max(base.bottom, Math.ceil(lineHeight + pad)),\n  };\n}\n","import type { FlowDirection, LayoutOptions } from '../types/charts';\nimport type { Point } from '../types/geometry';\nimport type { LaidGroup, LayoutEngine } from './diagram';\nimport { layoutFlow } from './dag';\nimport { isHorizontal } from './hierarchy';\nimport type { LaidOutEdge, LaidOutNode } from './hierarchy';\nimport { boxPort, routeOrthogonal, simplify, type Obstacle } from './routing';\nimport { measureText } from './text';\n\nconst toBox = (n: LaidOutNode): Obstacle => ({\n  x: n.x - n.width / 2,\n  y: n.y - n.height / 2,\n  width: n.width,\n  height: n.height,\n});\n\n/** Length of the straight lead-in/out kept perpendicular to each box face. */\nconst STUB = 14;\n\n/** Outward unit normal of the box side a port sits on. */\nfunction portNormal(box: Obstacle, port: Point): Point {\n  if (Math.abs(port.x - box.x) < 0.5) return { x: -1, y: 0 };\n  if (Math.abs(port.x - (box.x + box.width)) < 0.5) return { x: 1, y: 0 };\n  if (Math.abs(port.y - box.y) < 0.5) return { x: 0, y: -1 };\n  return { x: 0, y: 1 };\n}\n\nconst along = (p: Point, n: Point, d: number): Point => ({ x: p.x + n.x * d, y: p.y + n.y * d });\n\n/** Gap between members within a band, and between consecutive bands. */\nconst MEMBER_GAP = 36;\nconst BAND_GAP = 56;\n/** Padding between a lane's border and its member nodes. */\nconst LANE_PAD = 14;\n\nconst DENSITY_MUL: Record<NonNullable<LayoutOptions['density']>, number> = {\n  compact: 0.7,\n  cozy: 1,\n  comfortable: 1.4,\n};\n/** Breathing room on either side of a swimlane title within its gutter. */\nconst LABEL_MARGIN = 10;\n// The layout runs before a vibe is resolved, so titles are sized with a\n// representative font just to reserve the gutter; the renderer measures again\n// with the real font when it draws.\nconst LABEL_FONT_PX = 14;\nconst LABEL_FONT = 'serif';\n\ninterface BandLayout {\n  placed: LaidOutNode[];\n  groups: LaidGroup[];\n}\n\n/**\n * Lay each `group` out as a swimlane: a band across the flow (a row in TB/BT, a\n * column in LR/RL), with the title parked in a gutter on the lane's leading\n * cross-edge — left for vertical flow, top for horizontal. Because members sit\n * in the lane *body* past that gutter, connectors flowing band-to-band never\n * cross a title. Lanes share one cross-extent so they read as aligned tracks,\n * and can never overlap on the flow axis. The base flow layout is reused only\n * for ordering (bands by mean flow position, members by cross position), so the\n * existing crossing-reduction still informs the result. Ungrouped nodes each\n * occupy a singleton, container-less band.\n */\nfunction bandLayout(\n  base: LaidOutNode[],\n  direction: FlowDirection,\n  size: [number, number],\n  options?: LayoutOptions,\n): BandLayout {\n  if (base.length === 0) return { placed: base, groups: [] };\n  const horizontal = isHorizontal(direction);\n  const mul = DENSITY_MUL[options?.density ?? 'cozy'];\n  const memberGap = options?.nodeSpacing ?? MEMBER_GAP * mul;\n  const bandGap = options?.rankSpacing ?? BAND_GAP * mul;\n  const extraGutter = options?.laneGutter ?? 0;\n  const flowKey = (n: LaidOutNode) => (horizontal ? n.x : n.y);\n  const crossKey = (n: LaidOutNode) => (horizontal ? n.y : n.x);\n  const flowExt = (n: LaidOutNode) => (horizontal ? n.width : n.height);\n  const crossExt = (n: LaidOutNode) => (horizontal ? n.height : n.width);\n  const mean = (xs: number[]) => xs.reduce((s, v) => s + v, 0) / xs.length;\n\n  const order: string[] = [];\n  const bands = new Map<string, LaidOutNode[]>();\n  for (const n of base) {\n    const key = n.data.group ?? `__node__:${n.id}`;\n    const list = bands.get(key);\n    if (list) list.push(n);\n    else {\n      bands.set(key, [n]);\n      order.push(key);\n    }\n  }\n\n  const laidBands = order\n    .map((key) => {\n      const members = bands\n        .get(key)!\n        .slice()\n        .sort((a, b) => crossKey(a) - crossKey(b));\n      const group = key.startsWith('__node__:') ? undefined : key;\n      return { group, members, flowAt: mean(members.map(flowKey)) };\n    })\n    .sort((a, b) => a.flowAt - b.flowAt);\n\n  // Title gutter on the leading cross-edge, sized to the widest title.\n  const titleDims = laidBands.map((b) =>\n    b.group ? measureText(b.group, LABEL_FONT_PX, LABEL_FONT) : null,\n  );\n  const gutter = (() => {\n    const dims = titleDims.filter((d): d is { width: number; height: number } => d != null);\n    if (dims.length === 0) return 0;\n    const base = horizontal\n      ? Math.max(...dims.map((d) => d.height)) + LABEL_MARGIN * 2\n      : Math.max(...dims.map((d) => d.width)) + LABEL_MARGIN * 2;\n    return base + extraGutter;\n  })();\n\n  const bandFlow = laidBands.map((b) => Math.max(...b.members.map(flowExt)));\n  const bandCross = laidBands.map(\n    (b) => b.members.reduce((s, m) => s + crossExt(m), 0) + memberGap * (b.members.length - 1),\n  );\n  const contentFlow = bandFlow.reduce((s, v) => s + v, 0) + bandGap * (laidBands.length - 1);\n  const contentCross = Math.max(...bandCross);\n\n  const flowSpan = horizontal ? size[0] : size[1];\n  const crossSpan = horizontal ? size[1] : size[0];\n  const flowOrigin = (flowSpan - contentFlow) / 2;\n  // A lane spans: pad | gutter | body(contentCross) | pad. Centre that block.\n  const laneCross = LANE_PAD + gutter + contentCross + LANE_PAD;\n  const laneCrossStart = (crossSpan - laneCross) / 2;\n  const bodyStart = laneCrossStart + LANE_PAD + gutter;\n  // Mirror the flow axis for BT/RL so source bands sit at the bottom/right.\n  const flip = direction === 'BT' || direction === 'RL';\n  const toFlow = (f: number) => (flip ? 2 * flowOrigin + contentFlow - f : f);\n\n  const placed: LaidOutNode[] = [];\n  const groups: LaidGroup[] = [];\n  let flowCursor = flowOrigin;\n  laidBands.forEach((band, i) => {\n    const flowCenter = toFlow(flowCursor + bandFlow[i] / 2);\n    let crossCursor = bodyStart + (contentCross - bandCross[i]) / 2;\n    for (const m of band.members) {\n      const crossCenter = crossCursor + crossExt(m) / 2;\n      placed.push(\n        horizontal\n          ? { ...m, x: flowCenter, y: crossCenter }\n          : { ...m, x: crossCenter, y: flowCenter },\n      );\n      crossCursor += crossExt(m) + memberGap;\n    }\n\n    if (band.group) {\n      const fa = toFlow(flowCursor - LANE_PAD);\n      const fb = toFlow(flowCursor + bandFlow[i] + LANE_PAD);\n      const flowLo = Math.min(fa, fb);\n      const flowSize = Math.abs(fb - fa);\n      const rect = horizontal\n        ? { x: flowLo, y: laneCrossStart, width: flowSize, height: laneCross }\n        : { x: laneCrossStart, y: flowLo, width: laneCross, height: flowSize };\n      // Title sits in the gutter: centred along the lane for a top gutter\n      // (horizontal flow), left-aligned for a side gutter (vertical flow).\n      const labelPoint = horizontal\n        ? {\n            x: flowCenter,\n            y: laneCrossStart + LANE_PAD + (gutter - LABEL_MARGIN * 2) / 2 + LABEL_MARGIN,\n          }\n        : { x: laneCrossStart + LANE_PAD + LABEL_MARGIN, y: flowCenter };\n      groups.push({\n        id: band.group,\n        label: band.group,\n        ...rect,\n        labelPoint,\n        labelAnchor: horizontal ? 'middle' : 'start',\n      });\n    }\n    flowCursor += bandFlow[i] + bandGap;\n  });\n  return { placed, groups };\n}\n\n/**\n * Architecture / network layout: position components into per-`group` bands so\n * the zone containers tile cleanly, then route every connector orthogonally\n * around the other boxes (hand-rolled A* router). Ports sit on the box side\n * facing the peer, and connectors leave and arrive square-on via perpendicular\n * stubs.\n */\nexport function architectureLayout(\n  direction: FlowDirection = 'TB',\n  options?: LayoutOptions,\n): LayoutEngine {\n  return (nodes, edges, size) => {\n    const base = layoutFlow(nodes, size, edges, direction);\n    const { placed, groups } = bandLayout(base.nodes, direction, size, options);\n    const byId = new Map(placed.map((n) => [n.id, n]));\n\n    // Keep connectors off the swimlane titles too, not just the boxes.\n    const labelBoxes: Obstacle[] = groups.flatMap((g) => {\n      if (!g.label || !g.labelPoint) return [];\n      const m = measureText(g.label, LABEL_FONT_PX, LABEL_FONT);\n      const x = g.labelAnchor === 'middle' ? g.labelPoint.x - m.width / 2 : g.labelPoint.x;\n      return [{ x, y: g.labelPoint.y - m.height / 2, width: m.width, height: m.height }];\n    });\n\n    const routed: LaidOutEdge[] = base.edges.flatMap((e) => {\n      const s = byId.get(e.from);\n      const t = byId.get(e.to);\n      if (!s || !t) return [];\n      const sBox = toBox(s);\n      const tBox = toBox(t);\n      const sPort = boxPort(sBox, { x: t.x, y: t.y });\n      const tPort = boxPort(tBox, { x: s.x, y: s.y });\n      // Route between short stubs set off each face's normal, then re-attach the\n      // ports. This forces the connector to leave and arrive perpendicular to the\n      // box — so the arrowhead always points squarely into the target rather than\n      // grazing along its edge when the route had to approach from the side.\n      const sStub = along(sPort, portNormal(sBox, sPort), STUB);\n      const tStub = along(tPort, portNormal(tBox, tPort), STUB);\n      const obstacles = placed\n        .filter((n) => n.id !== e.from && n.id !== e.to)\n        .map(toBox)\n        .concat(labelBoxes);\n      const route = routeOrthogonal(sStub, tStub, obstacles, { padding: 10 });\n      // The router snaps lattice nodes to 2dp; round the exact ports to match so\n      // the perpendicular joins stay precisely axis-aligned (not off by ~1e-9).\n      const snap = (p: Point): Point => ({\n        x: Math.round(p.x * 100) / 100,\n        y: Math.round(p.y * 100) / 100,\n      });\n      const points = simplify([sPort, ...route, tPort].map(snap));\n      return [{ ...e, sx: sPort.x, sy: sPort.y, tx: tPort.x, ty: tPort.y, points }];\n    });\n\n    return {\n      nodes: placed,\n      edges: routed,\n      groups,\n      orientation: isHorizontal(direction) ? 'horizontal' : 'vertical',\n    };\n  };\n}\n","/**\n * Sequence-diagram layout. Actors become evenly spaced columns with a header\n * box and a lifeline running down the plot; messages are ordered top-to-bottom\n * as horizontal arrows between lifelines (self-messages loop back). Pure\n * geometry — pixel coordinates ready for the renderer.\n */\n\nexport interface SequenceActorInput {\n  id: string;\n  label?: string;\n}\n\nexport type SequenceMessageKind = 'sync' | 'async' | 'reply';\n\nexport interface SequenceMessageInput {\n  from: string;\n  to: string;\n  label?: string;\n  /** `reply` renders dashed; `sync`/`async` solid. Defaults to `sync`. */\n  kind?: SequenceMessageKind;\n}\n\nexport interface LaidActor {\n  id: string;\n  label: string;\n  x: number;\n  boxX: number;\n  boxY: number;\n  boxWidth: number;\n  boxHeight: number;\n  lifelineTop: number;\n  lifelineBottom: number;\n}\n\nexport interface LaidMessage {\n  from: string;\n  to: string;\n  label?: string;\n  x1: number;\n  x2: number;\n  y: number;\n  dashed: boolean;\n  self: boolean;\n}\n\nexport interface SequenceLayout {\n  actors: LaidActor[];\n  messages: LaidMessage[];\n}\n\nexport interface SequenceOptions {\n  actorHeight?: number;\n  topPadding?: number;\n}\n\nexport const SELF_LOOP_WIDTH = 44;\n\nexport function computeSequence(\n  actors: SequenceActorInput[],\n  messages: SequenceMessageInput[],\n  size: [number, number],\n  opts: SequenceOptions = {},\n): SequenceLayout {\n  const [width, height] = size;\n  if (actors.length === 0) return { actors: [], messages: [] };\n\n  const actorHeight = opts.actorHeight ?? 36;\n  const topPadding = opts.topPadding ?? 28;\n  const colWidth = width / actors.length;\n  const boxWidth = Math.max(50, Math.min(colWidth - 16, 150));\n\n  const laidActors: LaidActor[] = actors.map((a, i) => {\n    const x = colWidth * (i + 0.5);\n    return {\n      id: a.id,\n      label: a.label ?? a.id,\n      x,\n      boxX: x - boxWidth / 2,\n      boxY: 0,\n      boxWidth,\n      boxHeight: actorHeight,\n      lifelineTop: actorHeight,\n      lifelineBottom: height,\n    };\n  });\n\n  const xOf = new Map(laidActors.map((a) => [a.id, a.x]));\n\n  const top = actorHeight + topPadding;\n  const bottom = height - 8;\n  const valid = messages.filter((m) => xOf.has(m.from) && xOf.has(m.to));\n\n  // A self-message draws a downward loop, so it needs roughly two rows of height;\n  // weight the row slots so it doesn't collide with the next message.\n  const weights = valid.map((m) => (m.from === m.to ? 2.2 : 1));\n  const totalWeight = weights.reduce((sum, w) => sum + w, 0);\n  const unit = (bottom - top) / Math.max(1, totalWeight);\n\n  let acc = 0;\n  const laidMessages: LaidMessage[] = valid.map((m, k) => {\n    const w = weights[k];\n    const y = top + (acc + w / 2) * unit;\n    acc += w;\n    return {\n      from: m.from,\n      to: m.to,\n      label: m.label,\n      x1: xOf.get(m.from)!,\n      x2: xOf.get(m.to)!,\n      y,\n      dashed: m.kind === 'reply',\n      self: m.from === m.to,\n    };\n  });\n\n  return { actors: laidActors, messages: laidMessages };\n}\n","import type { FlowDirection, FlowNode } from '../types/charts';\nimport type { Point } from '../types/geometry';\nimport { layoutFlow } from './dag';\nimport { boxPort, routeOrthogonal, type Obstacle } from './routing';\nimport { measureText } from './text';\n\n/**\n * Entity-relationship layout. Each entity is a titled box with a row per field;\n * boxes are positioned by the flow engine (treating relationships as edges) and\n * connectors route orthogonally around the other boxes, with cardinality labels\n * pinned near each endpoint. Pure geometry, ready for the renderer.\n */\n\nexport type ERKey = 'PK' | 'FK';\n\nexport interface ERField {\n  name: string;\n  type?: string;\n  key?: ERKey;\n}\n\nexport interface EREntityInput {\n  id: string;\n  label?: string;\n  fields?: ERField[];\n}\n\nexport interface ERRelationshipInput {\n  from: string;\n  to: string;\n  label?: string;\n  fromCardinality?: string;\n  toCardinality?: string;\n}\n\nexport interface ERFieldRow {\n  text: string;\n  key?: ERKey;\n  /** Centre y of the row, relative to the entity box top. */\n  y: number;\n}\n\nexport interface LaidEntity {\n  id: string;\n  label: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  headerHeight: number;\n  rows: ERFieldRow[];\n}\n\nexport interface LaidRelationship {\n  from: string;\n  to: string;\n  label?: string;\n  points: Point[];\n  fromCardinality?: string;\n  toCardinality?: string;\n  fromLabelAt: Point;\n  toLabelAt: Point;\n}\n\nexport interface ERLayout {\n  entities: LaidEntity[];\n  relationships: LaidRelationship[];\n}\n\nexport interface EROptions {\n  direction?: FlowDirection;\n}\n\nconst HEADER_H = 30;\nconst ROW_H = 24;\nconst PAD_X = 16;\nconst FONT = 13;\nconst FAMILY = 'sans-serif';\n\nconst fieldText = (f: ERField): string => (f.type ? `${f.name}: ${f.type}` : f.name);\n\nconst toBox = (e: LaidEntity): Obstacle => ({\n  x: e.x - e.width / 2,\n  y: e.y - e.height / 2,\n  width: e.width,\n  height: e.height,\n});\n\nexport function computeER(\n  entities: EREntityInput[],\n  relationships: ERRelationshipInput[],\n  size: [number, number],\n  opts: EROptions = {},\n): ERLayout {\n  if (entities.length === 0) return { entities: [], relationships: [] };\n\n  // Size every entity box from its title and field rows.\n  const sized = entities.map((e) => {\n    const label = e.label ?? e.id;\n    const fields = e.fields ?? [];\n    const labelW = measureText(label, FONT + 1, FAMILY).width;\n    const fieldsW = fields.reduce((max, f) => {\n      const prefix = f.key ? `${f.key} ` : '';\n      return Math.max(max, measureText(prefix + fieldText(f), FONT, FAMILY).width);\n    }, 0);\n    const width = Math.max(90, Math.min(240, Math.ceil(Math.max(labelW, fieldsW) + PAD_X * 2)));\n    const height = HEADER_H + Math.max(1, fields.length) * ROW_H;\n    return { input: e, label, fields, width, height };\n  });\n\n  const flowNodes: FlowNode[] = sized.map((s) => ({\n    id: s.input.id,\n    label: s.label,\n    width: s.width,\n    height: s.height,\n  }));\n\n  const ids = new Set(flowNodes.map((n) => n.id));\n  const edges = relationships\n    .filter((r) => ids.has(r.from) && ids.has(r.to))\n    .map((r) => ({ from: r.from, to: r.to }));\n\n  // layoutFlow positions box centres within the area it's given, so the end\n  // boxes would spill half their width past the canvas. Shrink the area by the\n  // largest box's half-extent (plus a little breathing room) and offset the\n  // result, so every entity sits fully inside the plot.\n  const PAD = 8;\n  const offX = Math.max(...sized.map((s) => s.width)) / 2 + PAD;\n  const offY = Math.max(...sized.map((s) => s.height)) / 2 + PAD;\n  const inner: [number, number] = [\n    Math.max(1, size[0] - 2 * offX),\n    Math.max(1, size[1] - 2 * offY),\n  ];\n\n  const positioned = layoutFlow(flowNodes, inner, edges, opts.direction ?? 'LR');\n  const posById = new Map(positioned.nodes.map((n) => [n.id, n]));\n\n  const laidEntities: LaidEntity[] = sized.map((s) => {\n    const p = posById.get(s.input.id)!;\n    const rows: ERFieldRow[] = s.fields.map((f, i) => ({\n      text: fieldText(f),\n      key: f.key,\n      y: HEADER_H + i * ROW_H + ROW_H / 2,\n    }));\n    return {\n      id: s.input.id,\n      label: s.label,\n      x: p.x + offX,\n      y: p.y + offY,\n      width: s.width,\n      height: s.height,\n      headerHeight: HEADER_H,\n      rows,\n    };\n  });\n\n  const entityById = new Map(laidEntities.map((e) => [e.id, e]));\n  const obstacles = laidEntities.map(toBox);\n\n  const laidRelationships: LaidRelationship[] = relationships.flatMap((r) => {\n    const s = entityById.get(r.from);\n    const t = entityById.get(r.to);\n    if (!s || !t) return [];\n    const sBox = toBox(s);\n    const tBox = toBox(t);\n    const sPort = boxPort(sBox, { x: t.x, y: t.y });\n    const tPort = boxPort(tBox, { x: s.x, y: s.y });\n    const others = obstacles.filter(\n      (_, i) => laidEntities[i].id !== r.from && laidEntities[i].id !== r.to,\n    );\n    const points = routeOrthogonal(sPort, tPort, others, { padding: 10 });\n    const near = (port: Point, next: Point): Point => ({\n      x: port.x + (next.x - port.x) * 0.28,\n      y: port.y + (next.y - port.y) * 0.28 - 6,\n    });\n    return [\n      {\n        from: r.from,\n        to: r.to,\n        label: r.label,\n        points,\n        fromCardinality: r.fromCardinality,\n        toCardinality: r.toCardinality,\n        fromLabelAt: near(sPort, points[1] ?? tPort),\n        toLabelAt: near(tPort, points[points.length - 2] ?? sPort),\n      },\n    ];\n  });\n\n  return { entities: laidEntities, relationships: laidRelationships };\n}\n","import type { Point } from '../types/geometry';\n\n/**\n * Timeline layout. Events are placed in order along a central axis (horizontal\n * or vertical) at even intervals, with their label blocks alternating to either\n * side of the axis so they don't collide. Pure geometry for the renderer.\n */\n\nexport interface TimelineEventInput {\n  label: string;\n  date?: string;\n  detail?: string;\n}\n\nexport type TimelineOrientation = 'horizontal' | 'vertical';\n\nexport interface LaidTimelineEvent {\n  label: string;\n  date?: string;\n  detail?: string;\n  marker: Point;\n  /** Anchor point for the label block. */\n  label_at: Point;\n  /** Text anchor for the label block. */\n  anchor: 'start' | 'middle' | 'end';\n  /** Which side of the axis the label sits on: +1 or -1. */\n  side: 1 | -1;\n}\n\nexport interface TimelineLayout {\n  orientation: TimelineOrientation;\n  axis: { x1: number; y1: number; x2: number; y2: number };\n  events: LaidTimelineEvent[];\n}\n\nexport interface TimelineOptions {\n  orientation?: TimelineOrientation;\n}\n\nconst LABEL_OFFSET = 34;\n\nexport function computeTimeline(\n  events: TimelineEventInput[],\n  size: [number, number],\n  opts: TimelineOptions = {},\n): TimelineLayout {\n  const [width, height] = size;\n  const orientation = opts.orientation ?? 'horizontal';\n  const n = events.length;\n\n  if (orientation === 'vertical') {\n    const axisX = width / 2;\n    const step = height / Math.max(1, n);\n    const laid: LaidTimelineEvent[] = events.map((e, i) => {\n      const my = step * (i + 0.5);\n      const side: 1 | -1 = i % 2 === 0 ? 1 : -1;\n      return {\n        label: e.label,\n        date: e.date,\n        detail: e.detail,\n        marker: { x: axisX, y: my },\n        label_at: { x: axisX + side * LABEL_OFFSET, y: my },\n        anchor: side === 1 ? 'start' : 'end',\n        side,\n      };\n    });\n    return { orientation, axis: { x1: axisX, y1: 0, x2: axisX, y2: height }, events: laid };\n  }\n\n  const axisY = height / 2;\n  const step = width / Math.max(1, n);\n  const laid: LaidTimelineEvent[] = events.map((e, i) => {\n    const mx = step * (i + 0.5);\n    const side: 1 | -1 = i % 2 === 0 ? -1 : 1; // first event above the axis\n    return {\n      label: e.label,\n      date: e.date,\n      detail: e.detail,\n      marker: { x: mx, y: axisY },\n      label_at: { x: mx, y: axisY + side * LABEL_OFFSET },\n      anchor: 'middle',\n      side,\n    };\n  });\n  return { orientation, axis: { x1: 0, y1: axisY, x2: width, y2: axisY }, events: laid };\n}\n","import type { FlowDirection, FlowEdge, FlowNode, FlowNodeShape } from '../types/charts';\nimport type { SequenceActorInput, SequenceMessageInput } from './sequence';\nimport type { DiagramSpec } from './spec';\n\n/**\n * A dependency-light, hand-rolled parser for a **subset** of Mermaid, producing\n * a {@link DiagramSpec}. Supported: `flowchart`/`graph` (nodes, shapes, edges,\n * labels, direction), `sequenceDiagram` (participants + messages), and\n * `mindmap` (indentation-nested nodes). Anything else — including recognised but\n * unhandled constructs (notes, loops, erDiagram, …) — raises a\n * {@link MermaidParseError} rather than silently dropping content.\n */\n\nexport class MermaidParseError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'MermaidParseError';\n  }\n}\n\nconst stripQuotes = (s: string): string => s.replace(/^\"(.*)\"$/, '$1').trim();\n\nconst cleanLines = (source: string): string[] =>\n  source\n    .split('\\n')\n    .map((l) => l.replace(/;\\s*$/, '').trimEnd())\n    .filter((l) => l.trim() !== '' && !l.trim().startsWith('%%'));\n\nexport function parseMermaid(source: string): DiagramSpec {\n  const lines = cleanLines(source);\n  if (lines.length === 0) throw new MermaidParseError('Empty Mermaid source.');\n\n  const header = lines[0].trim();\n  const keyword = header.split(/\\s+/)[0];\n\n  switch (keyword) {\n    case 'flowchart':\n    case 'graph':\n      return parseFlowchart(header, lines.slice(1));\n    case 'sequenceDiagram':\n      return parseSequence(lines.slice(1));\n    case 'mindmap':\n      return parseMindmap(lines.slice(1));\n    case 'erDiagram':\n      throw new MermaidParseError('erDiagram parsing is not yet supported.');\n    default:\n      throw new MermaidParseError(\n        `Unrecognized Mermaid diagram type: \"${keyword}\". Supported: flowchart, graph, sequenceDiagram, mindmap.`,\n      );\n  }\n}\n\n// ---- flowchart -------------------------------------------------------------\n\nconst DIRECTIONS: Record<string, FlowDirection> = {\n  TB: 'TB',\n  TD: 'TB',\n  BT: 'BT',\n  LR: 'LR',\n  RL: 'RL',\n};\n\nfunction parseNodeToken(raw: string): { id: string; label?: string; shape?: FlowNodeShape } {\n  const tok = raw.trim();\n  let m: RegExpMatchArray | null;\n  if ((m = tok.match(/^([A-Za-z0-9_]+)\\(\\((.*)\\)\\)$/)))\n    return { id: m[1], label: stripQuotes(m[2]), shape: 'ellipse' };\n  if ((m = tok.match(/^([A-Za-z0-9_]+)\\(\\[(.*)\\]\\)$/)))\n    return { id: m[1], label: stripQuotes(m[2]), shape: 'ellipse' };\n  if ((m = tok.match(/^([A-Za-z0-9_]+)\\[(.*)\\]$/)))\n    return { id: m[1], label: stripQuotes(m[2]), shape: 'rect' };\n  if ((m = tok.match(/^([A-Za-z0-9_]+)\\((.*)\\)$/)))\n    return { id: m[1], label: stripQuotes(m[2]), shape: 'ellipse' };\n  if ((m = tok.match(/^([A-Za-z0-9_]+)\\{(.*)\\}$/)))\n    return { id: m[1], label: stripQuotes(m[2]), shape: 'diamond' };\n  if ((m = tok.match(/^([A-Za-z0-9_]+)$/))) return { id: m[1] };\n  throw new MermaidParseError(`Unrecognized flowchart node: \"${tok}\".`);\n}\n\nfunction parseFlowchart(header: string, body: string[]): DiagramSpec {\n  const dirToken = header.split(/\\s+/)[1];\n  const direction = dirToken ? DIRECTIONS[dirToken.toUpperCase()] : undefined;\n  if (dirToken && !direction)\n    throw new MermaidParseError(`Unknown flowchart direction: \"${dirToken}\".`);\n\n  const nodes = new Map<string, FlowNode>();\n  const edges: FlowEdge[] = [];\n\n  const register = (token: string): string => {\n    const parsed = parseNodeToken(token);\n    const existing = nodes.get(parsed.id);\n    if (existing) {\n      if (parsed.label) existing.label = parsed.label;\n      if (parsed.shape) existing.shape = parsed.shape;\n    } else {\n      nodes.set(parsed.id, {\n        id: parsed.id,\n        label: parsed.label ?? parsed.id,\n        shape: parsed.shape,\n      });\n    }\n    return parsed.id;\n  };\n\n  const addEdge = (lhs: string, rhs: string, label?: string) => {\n    const from = register(lhs);\n    const to = register(rhs);\n    edges.push({ from, to, label: label ? stripQuotes(label) : undefined });\n  };\n\n  for (const line of body) {\n    const stmt = line.trim();\n    let m: RegExpMatchArray | null;\n    if ((m = stmt.match(/^(.+?)\\s*--+>\\s*\\|([^|]*)\\|\\s*(.+)$/))) addEdge(m[1], m[3], m[2]);\n    else if ((m = stmt.match(/^(.+?)\\s*--\\s*([^|>][^>]*?)\\s*--+>\\s*(.+)$/)))\n      addEdge(m[1], m[3], m[2]);\n    else if ((m = stmt.match(/^(.+?)\\s*--+>\\s*(.+)$/))) addEdge(m[1], m[2]);\n    else if ((m = stmt.match(/^(.+?)\\s*---+\\s*(.+)$/))) addEdge(m[1], m[2]);\n    else register(stmt);\n  }\n\n  return { kind: 'flowchart', nodes: [...nodes.values()], edges, direction };\n}\n\n// ---- sequenceDiagram -------------------------------------------------------\n\nconst SEQ_UNSUPPORTED = [\n  'note',\n  'loop',\n  'alt',\n  'opt',\n  'par',\n  'activate',\n  'deactivate',\n  'rect',\n  'critical',\n  'break',\n];\n\nfunction parseSequence(body: string[]): DiagramSpec {\n  const actors = new Map<string, SequenceActorInput>();\n  const order: string[] = [];\n  const messages: SequenceMessageInput[] = [];\n\n  const ensureActor = (id: string, label?: string) => {\n    if (!actors.has(id)) {\n      actors.set(id, { id, label: label ?? id });\n      order.push(id);\n    } else if (label) {\n      actors.get(id)!.label = label;\n    }\n  };\n\n  for (const line of body) {\n    const stmt = line.trim();\n    let m: RegExpMatchArray | null;\n    if ((m = stmt.match(/^(?:participant|actor)\\s+([A-Za-z0-9_]+)(?:\\s+as\\s+(.+))?$/))) {\n      ensureActor(m[1], m[2] ? stripQuotes(m[2]) : undefined);\n      continue;\n    }\n    if ((m = stmt.match(/^([A-Za-z0-9_]+)\\s*(--?(?:>>|>|x|\\)))\\s*([A-Za-z0-9_]+)\\s*:\\s*(.+)$/))) {\n      const [, from, arrow, to, label] = m;\n      ensureActor(from);\n      ensureActor(to);\n      messages.push({\n        from,\n        to,\n        label: stripQuotes(label),\n        kind: arrow.startsWith('--') ? 'reply' : 'sync',\n      });\n      continue;\n    }\n    const lead = stmt.split(/\\s+/)[0].toLowerCase();\n    if (SEQ_UNSUPPORTED.includes(lead)) {\n      throw new MermaidParseError(`Unsupported sequenceDiagram construct: \"${lead}\".`);\n    }\n    throw new MermaidParseError(`Unrecognized sequenceDiagram line: \"${stmt}\".`);\n  }\n\n  return { kind: 'sequence', actors: order.map((id) => actors.get(id)!), messages };\n}\n\n// ---- mindmap ---------------------------------------------------------------\n\nfunction parseMindmapLabel(raw: string): { label: string; shape?: FlowNodeShape } {\n  const tok = raw.trim();\n  let m: RegExpMatchArray | null;\n  if ((m = tok.match(/^[A-Za-z0-9_]*\\(\\((.*)\\)\\)$/)))\n    return { label: stripQuotes(m[1]), shape: 'ellipse' };\n  if ((m = tok.match(/^[A-Za-z0-9_]*\\[(.*)\\]$/)))\n    return { label: stripQuotes(m[1]), shape: 'rect' };\n  if ((m = tok.match(/^[A-Za-z0-9_]*\\((.*)\\)$/)))\n    return { label: stripQuotes(m[1]), shape: 'ellipse' };\n  return { label: stripQuotes(tok) };\n}\n\nfunction parseMindmap(body: string[]): DiagramSpec {\n  const nodes: FlowNode[] = [];\n  const stack: { indent: number; id: string }[] = [];\n  let counter = 0;\n\n  for (const line of body) {\n    const indent = line.length - line.trimStart().length;\n    const { label, shape } = parseMindmapLabel(line);\n    const id = `m${counter++}`;\n\n    while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop();\n    const parent = stack.length ? stack[stack.length - 1].id : undefined;\n    nodes.push({ id, label, shape, parent });\n    stack.push({ indent, id });\n  }\n\n  const roots = nodes.filter((n) => n.parent == null);\n  if (roots.length !== 1) {\n    throw new MermaidParseError(`A mindmap needs exactly one root, found ${roots.length}.`);\n  }\n  return { kind: 'mindmap', nodes };\n}\n","import { assignLayers } from './dag';\n\n/**\n * Weighted flow-diagram layout. Reuses the longest-path layering from the DAG\n * engine (`assignLayers`), sizes nodes by throughput, and stacks proportional\n * link ribbons on each node edge. Pure geometry — pixel coordinates + ribbon\n * path strings, ready for the renderer.\n */\n\nexport interface SankeyNodeInput {\n  id: string;\n  label?: string;\n  color?: string;\n}\n\nexport interface SankeyLinkInput {\n  source: string;\n  target: string;\n  value: number;\n}\n\nexport type SankeyOrientation = 'LR' | 'TB';\n\nexport interface SankeyLaidNode {\n  id: string;\n  label?: string;\n  color?: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  value: number;\n}\n\nexport interface SankeyLaidLink {\n  source: string;\n  target: string;\n  value: number;\n  width: number;\n  path: string;\n  color?: string;\n}\n\nexport interface SankeyLayout {\n  nodes: SankeyLaidNode[];\n  links: SankeyLaidLink[];\n}\n\nexport interface SankeyOptions {\n  direction?: SankeyOrientation;\n  nodeWidth?: number;\n  nodePadding?: number;\n}\n\ninterface Band {\n  s0: number;\n  t0: number;\n  w: number;\n}\n\nfunction ribbonPath(s: SankeyLaidNode, t: SankeyLaidNode, band: Band, horizontal: boolean): string {\n  if (horizontal) {\n    const sx = s.x + s.width;\n    const tx = t.x;\n    const sy0 = band.s0;\n    const sy1 = band.s0 + band.w;\n    const ty0 = band.t0;\n    const ty1 = band.t0 + band.w;\n    const mid = (sx + tx) / 2;\n    return (\n      `M${sx},${sy0} C${mid},${sy0} ${mid},${ty0} ${tx},${ty0} ` +\n      `L${tx},${ty1} C${mid},${ty1} ${mid},${sy1} ${sx},${sy1} Z`\n    );\n  }\n  const sy = s.y + s.height;\n  const ty = t.y;\n  const sx0 = band.s0;\n  const sx1 = band.s0 + band.w;\n  const tx0 = band.t0;\n  const tx1 = band.t0 + band.w;\n  const mid = (sy + ty) / 2;\n  return (\n    `M${sx0},${sy} C${sx0},${mid} ${tx0},${mid} ${tx0},${ty} ` +\n    `L${tx1},${ty} C${tx1},${mid} ${sx1},${mid} ${sx1},${sy} Z`\n  );\n}\n\nconst pushTo = <T>(map: Map<string, T[]>, key: string, value: T): void => {\n  const list = map.get(key);\n  if (list) list.push(value);\n  else map.set(key, [value]);\n};\n\nexport function computeSankey(\n  nodes: SankeyNodeInput[],\n  links: SankeyLinkInput[],\n  size: [number, number],\n  opts: SankeyOptions = {},\n): SankeyLayout {\n  if (nodes.length === 0) return { nodes: [], links: [] };\n\n  const direction = opts.direction ?? 'LR';\n  const nodeWidth = opts.nodeWidth ?? 16;\n  const nodePadding = opts.nodePadding ?? 12;\n  const [width, height] = size;\n  const horizontal = direction === 'LR';\n  const depthExtent = horizontal ? width : height;\n  const breadthExtent = horizontal ? height : width;\n\n  const ids = new Set(nodes.map((n) => n.id));\n  const valid = links.filter(\n    (l) => ids.has(l.source) && ids.has(l.target) && l.source !== l.target && l.value > 0,\n  );\n\n  const layer = assignLayers(\n    nodes.map((n) => n.id),\n    valid.map((l) => ({ from: l.source, to: l.target })),\n  );\n  const maxLayer = Math.max(...nodes.map((n) => layer.get(n.id)!));\n\n  const inSum = new Map<string, number>();\n  const outSum = new Map<string, number>();\n  for (const l of valid) {\n    outSum.set(l.source, (outSum.get(l.source) ?? 0) + l.value);\n    inSum.set(l.target, (inSum.get(l.target) ?? 0) + l.value);\n  }\n  const throughput = (id: string) => Math.max(inSum.get(id) ?? 0, outSum.get(id) ?? 0, 0);\n\n  const byLayer: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n  for (const n of nodes) byLayer[layer.get(n.id)!].push(n.id);\n\n  // Value→pixel scale so the densest layer fits the breadth axis.\n  let scale = Infinity;\n  for (const layerIds of byLayer) {\n    const sum = layerIds.reduce((s, id) => s + throughput(id), 0);\n    const avail = breadthExtent - Math.max(0, layerIds.length - 1) * nodePadding;\n    if (sum > 0) scale = Math.min(scale, avail / sum);\n  }\n  if (!Number.isFinite(scale) || scale <= 0) scale = 1;\n\n  const nodeById = new Map(nodes.map((n) => [n.id, n]));\n  const laid = new Map<string, SankeyLaidNode>();\n  byLayer.forEach((layerIds, l) => {\n    const thicknessOf = (id: string) => Math.max(throughput(id) * scale, 2);\n    const total =\n      layerIds.reduce((s, id) => s + thicknessOf(id), 0) +\n      Math.max(0, layerIds.length - 1) * nodePadding;\n    let cursor = (breadthExtent - total) / 2;\n    const depthPos =\n      maxLayer === 0 ? (depthExtent - nodeWidth) / 2 : (l / maxLayer) * (depthExtent - nodeWidth);\n    for (const id of layerIds) {\n      const node = nodeById.get(id)!;\n      const thickness = thicknessOf(id);\n      laid.set(id, {\n        id,\n        label: node.label,\n        color: node.color,\n        value: throughput(id),\n        x: horizontal ? depthPos : cursor,\n        y: horizontal ? cursor : depthPos,\n        width: horizontal ? nodeWidth : thickness,\n        height: horizontal ? thickness : nodeWidth,\n      });\n      cursor += thickness + nodePadding;\n    }\n  });\n\n  const breadthCenter = (id: string) => {\n    const n = laid.get(id)!;\n    return horizontal ? n.y + n.height / 2 : n.x + n.width / 2;\n  };\n\n  const outgoing = new Map<string, SankeyLinkInput[]>();\n  const incoming = new Map<string, SankeyLinkInput[]>();\n  for (const l of valid) {\n    pushTo(outgoing, l.source, l);\n    pushTo(incoming, l.target, l);\n  }\n  outgoing.forEach((list) =>\n    list.sort((a, b) => breadthCenter(a.target) - breadthCenter(b.target)),\n  );\n  incoming.forEach((list) =>\n    list.sort((a, b) => breadthCenter(a.source) - breadthCenter(b.source)),\n  );\n\n  const bands = new Map<SankeyLinkInput, Band>();\n  outgoing.forEach((list, src) => {\n    const node = laid.get(src)!;\n    let c = horizontal ? node.y : node.x;\n    for (const l of list) {\n      const w = l.value * scale;\n      bands.set(l, { s0: c, t0: 0, w });\n      c += w;\n    }\n  });\n  incoming.forEach((list, tgt) => {\n    const node = laid.get(tgt)!;\n    let c = horizontal ? node.y : node.x;\n    for (const l of list) {\n      bands.get(l)!.t0 = c;\n      c += bands.get(l)!.w;\n    }\n  });\n\n  const laidLinks: SankeyLaidLink[] = valid.map((l) => {\n    const s = laid.get(l.source)!;\n    const t = laid.get(l.target)!;\n    const band = bands.get(l)!;\n    return {\n      source: l.source,\n      target: l.target,\n      value: l.value,\n      width: band.w,\n      path: ribbonPath(s, t, band, horizontal),\n      color: s.color,\n    };\n  });\n\n  return { nodes: Array.from(laid.values()), links: laidLinks };\n}\n","import {\n  stratify,\n  treemap,\n  treemapBinary,\n  treemapDice,\n  treemapSlice,\n  treemapSquarify,\n} from 'd3-hierarchy';\nimport type { HierarchyRectangularNode } from 'd3-hierarchy';\n\ntype TileFn = (\n  node: HierarchyRectangularNode<TreemapDatum>,\n  x0: number,\n  y0: number,\n  x1: number,\n  y1: number,\n) => void;\n\n/**\n * Treemap layout via d3-hierarchy (already a dependency). Pure: takes a flat\n * parent-linked list, returns leaf rectangles. The renderer tiles them with\n * `<RoughRectangle>`.\n */\n\nexport interface TreemapDatum {\n  id: string;\n  parent?: string;\n  value?: number;\n  label?: string;\n  color?: string;\n}\n\nexport type TreemapTile = 'squarify' | 'binary' | 'slice' | 'dice';\n\nexport interface TreemapLeaf {\n  id: string;\n  label?: string;\n  color?: string;\n  groupId: string;\n  x0: number;\n  y0: number;\n  x1: number;\n  y1: number;\n  value: number;\n  depth: number;\n  datum: TreemapDatum;\n}\n\nexport interface TreemapOptions {\n  padding?: number;\n  tile?: TreemapTile;\n}\n\nconst TILES: Record<TreemapTile, TileFn> = {\n  squarify: treemapSquarify,\n  binary: treemapBinary,\n  slice: treemapSlice,\n  dice: treemapDice,\n};\n\nexport function computeTreemap(\n  data: TreemapDatum[],\n  size: [number, number],\n  opts: TreemapOptions = {},\n): TreemapLeaf[] {\n  if (data.length === 0) return [];\n\n  const root = stratify<TreemapDatum>()\n    .id((d) => d.id)\n    .parentId((d) => d.parent)(data);\n  root.sum((d) => Math.max(0, d.value ?? 0));\n\n  const laid = treemap<TreemapDatum>()\n    .tile(TILES[opts.tile ?? 'squarify'])\n    .size(size)\n    .paddingInner(opts.padding ?? 1)(root);\n\n  return laid.leaves().map((leaf) => {\n    const group = leaf.ancestors().find((a) => a.depth === 1) ?? leaf;\n    return {\n      id: leaf.data.id,\n      label: leaf.data.label,\n      color: leaf.data.color,\n      groupId: group.data.id,\n      x0: leaf.x0,\n      y0: leaf.y0,\n      x1: leaf.x1,\n      y1: leaf.y1,\n      value: leaf.value ?? 0,\n      depth: leaf.depth,\n      datum: leaf.data,\n    };\n  });\n}\n","import type { Point } from '../types/geometry';\n\n/**\n * Polar coordinate helpers for radial charts (radar, gauge, future arc work).\n * Pure trigonometry — no DOM.\n */\n\n/** Cartesian point at `radius` and `angleRad` from center `(cx, cy)`. */\nexport function polarToCartesian(cx: number, cy: number, radius: number, angleRad: number): Point {\n  return { x: cx + radius * Math.cos(angleRad), y: cy + radius * Math.sin(angleRad) };\n}\n\n/** Angle (radians) of axis `index` of `count`, starting at the top, clockwise. */\nexport function axisAngle(index: number, count: number): number {\n  return -Math.PI / 2 + (index / count) * 2 * Math.PI;\n}\n\n/** Closed SVG path through a ring of points (e.g. a radar polygon or grid ring). */\nexport function polygonPath(points: Point[]): string {\n  if (points.length === 0) return '';\n  return `M${points.map((p) => `${p.x},${p.y}`).join(' L')} Z`;\n}\n\nconst TWO_PI = 2 * Math.PI;\n/** Forward (clockwise) angular span in `[0, 2π)`, robust to wrapped/unordered inputs. */\nconst forwardSpan = (startRad: number, endRad: number) =>\n  (((endRad - startRad) % TWO_PI) + TWO_PI) % TWO_PI;\n/** Polygon vertices step from the top (12 o'clock), like `axisAngle`, so rotation 0 points up. */\nconst TOP = -Math.PI / 2;\n\n/**\n * Closed regular n-gon centered at `(cx, cy)`. The first vertex sits at the top\n * (12 o'clock) when `rotationRad` is 0; `rotationRad` rotates clockwise from there.\n */\nexport function regularPolygonPath(\n  cx: number,\n  cy: number,\n  r: number,\n  sides: number,\n  rotationRad = 0,\n): string {\n  const points = Array.from({ length: sides }, (_, i) =>\n    polarToCartesian(cx, cy, r, TOP + rotationRad + (i / sides) * TWO_PI),\n  );\n  return polygonPath(points);\n}\n\n/**\n * Closed `points`-pointed star, alternating between `outerR` and `innerR`. The\n * first (outer) vertex sits at the top when `rotationRad` is 0; clockwise from there.\n */\nexport function starPath(\n  cx: number,\n  cy: number,\n  outerR: number,\n  innerR: number,\n  points: number,\n  rotationRad = 0,\n): string {\n  const vertices = Array.from({ length: points * 2 }, (_, i) => {\n    const radius = i % 2 === 0 ? outerR : innerR;\n    return polarToCartesian(cx, cy, radius, TOP + rotationRad + (i / (points * 2)) * TWO_PI);\n  });\n  return polygonPath(vertices);\n}\n\n/**\n * Open arc stroke from `startRad` to `endRad` (0 = east). Always drawn in the\n * increasing-angle (clockwise on screen) direction, so wrapped/unordered angles\n * (e.g. 350°→10°) still produce the intended short arc. No fill — unclosed.\n */\nexport function arcStrokePath(\n  cx: number,\n  cy: number,\n  r: number,\n  startRad: number,\n  endRad: number,\n): string {\n  const start = polarToCartesian(cx, cy, r, startRad);\n  const end = polarToCartesian(cx, cy, r, endRad);\n  const largeArc = forwardSpan(startRad, endRad) > Math.PI ? 1 : 0;\n  return `M${start.x},${start.y} A${r},${r} 0 ${largeArc},1 ${end.x},${end.y}`;\n}\n\n/**\n * Closed pie wedge from `startRad` to `endRad`, drawn clockwise (robust to\n * wrapped angles). When `innerR` is set, draws an annular wedge (ring segment)\n * instead of a slice meeting at the center.\n */\nexport function wedgePath(\n  cx: number,\n  cy: number,\n  r: number,\n  startRad: number,\n  endRad: number,\n  innerR?: number,\n): string {\n  const largeArc = forwardSpan(startRad, endRad) > Math.PI ? 1 : 0;\n  const oStart = polarToCartesian(cx, cy, r, startRad);\n  const oEnd = polarToCartesian(cx, cy, r, endRad);\n  if (innerR === undefined || innerR <= 0) {\n    return `M${cx},${cy} L${oStart.x},${oStart.y} A${r},${r} 0 ${largeArc},1 ${oEnd.x},${oEnd.y} Z`;\n  }\n  const iEnd = polarToCartesian(cx, cy, innerR, endRad);\n  const iStart = polarToCartesian(cx, cy, innerR, startRad);\n  // Outer arc runs forward (sweep 1); the inner arc traces back the other way (sweep 0).\n  return (\n    `M${oStart.x},${oStart.y} A${r},${r} 0 ${largeArc},1 ${oEnd.x},${oEnd.y} ` +\n    `L${iEnd.x},${iEnd.y} A${innerR},${innerR} 0 ${largeArc},0 ${iStart.x},${iStart.y} Z`\n  );\n}\n","import type { ScaleBand, ScaleLinear, ScalePoint } from 'd3-scale';\n\nexport type AnyScale = ScaleLinear<number, number> | ScaleBand<string> | ScalePoint<string>;\n\nexport interface Tick {\n  value: string | number;\n  /** Pixel position along the scale's range. */\n  offset: number;\n}\n\n/**\n * Produce tick positions for any supported scale. Pure and DOM-free: callers\n * render the result with `<RoughLine>` / `<RoughText>`.\n *\n * Band scales center their tick on the band; point scales fall out of the same\n * branch because their `bandwidth()` is 0.\n */\nexport function ticksForScale(scale: AnyScale, count = 5): Tick[] {\n  if ('ticks' in scale) {\n    const linear = scale as ScaleLinear<number, number>;\n    return linear.ticks(count).map((v) => ({ value: v, offset: linear(v) }));\n  }\n\n  const banded = scale as ScaleBand<string>;\n  const half = banded.bandwidth() / 2;\n  return banded.domain().map((v) => ({ value: v, offset: (banded(v) ?? 0) + half }));\n}\n","import { arc as d3arc, pie as d3pie } from 'd3-shape';\nimport type { PieArcDatum } from 'd3-shape';\nimport type { ChartDatum } from '../types/charts';\n\nexport interface PieSlice {\n  /** SVG path `d` for the slice, ready to hand to `<RoughPath>`. */\n  path: string;\n  /** Label anchor point, in the same local coords as `path`. */\n  centroid: [number, number];\n  startAngle: number;\n  endAngle: number;\n  datum: ChartDatum;\n  index: number;\n}\n\n/**\n * Turn category values into pie/donut slice geometry using d3-shape. Pure and\n * DOM-free; coordinates are centered on (0, 0), so the renderer translates to\n * the chart center. `innerRadius > 0` yields a donut.\n */\nexport function computePie(\n  data: ChartDatum[],\n  outerRadius: number,\n  innerRadius = 0,\n  padAngle = 0,\n): PieSlice[] {\n  const pieGen = d3pie<ChartDatum>()\n    .value((d) => d.value)\n    .padAngle(padAngle)\n    .sort(null);\n\n  const arcGen = d3arc<PieArcDatum<ChartDatum>>().innerRadius(innerRadius).outerRadius(outerRadius);\n\n  return pieGen(data).map((slice, index) => ({\n    path: arcGen(slice) ?? '',\n    centroid: arcGen.centroid(slice),\n    startAngle: slice.startAngle,\n    endAngle: slice.endAngle,\n    datum: slice.data,\n    index,\n  }));\n}\n","import { DEFAULT_PALETTE } from './palette';\n\n/**\n * Color scales for value-driven fills (heatmaps, treemaps, ramp legends). Pure\n * and DOM-free: ramps are fixed hex control points interpolated in RGB, so\n * output is deterministic and identical in the library and the headless MCP\n * build (no `d3-scale-chromatic` dependency).\n */\n\nexport type SequentialScaleName = 'viridis' | 'magma' | 'inferno' | 'blues' | 'greens' | 'oranges';\nexport type DivergingScaleName = 'rdbu' | 'rdylgn' | 'spectral';\nexport type ColorScaleName = SequentialScaleName | DivergingScaleName;\n\nconst RAMPS: Record<ColorScaleName, string[]> = {\n  viridis: ['#440154', '#443983', '#31688e', '#21918c', '#35b779', '#90d743', '#fde725'],\n  magma: ['#000004', '#3b0f70', '#8c2981', '#de4968', '#fe9f6d', '#fcfdbf'],\n  inferno: ['#000004', '#420a68', '#932667', '#dd513a', '#fca50a', '#fcffa4'],\n  blues: ['#f7fbff', '#c6dbef', '#6baed6', '#2171b5', '#08306b'],\n  greens: ['#f7fcf5', '#c7e9c0', '#74c476', '#238b45', '#00441b'],\n  oranges: ['#fff5eb', '#fdd0a2', '#fd8d3c', '#d94801', '#7f2704'],\n  rdbu: ['#b2182b', '#ef8a62', '#fddbc7', '#f7f7f7', '#d1e5f0', '#67a9cf', '#2166ac'],\n  rdylgn: ['#d73027', '#fc8d59', '#fee08b', '#ffffbf', '#d9ef8b', '#91cf60', '#1a9850'],\n  spectral: ['#d53e4f', '#fc8d59', '#fee08b', '#ffffbf', '#e6f598', '#99d594', '#3288bd'],\n};\n\nconst clamp01 = (t: number): number => (t < 0 ? 0 : t > 1 ? 1 : t);\n\nfunction hexToRgb(hex: string): [number, number, number] {\n  const h = hex.replace('#', '');\n  return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n  const c = (n: number) =>\n    Math.round(clamp01(n / 255) * 255)\n      .toString(16)\n      .padStart(2, '0');\n  return `#${c(r)}${c(g)}${c(b)}`;\n}\n\n/** Interpolate a list of hex stops at `t` in [0,1], lerping in RGB space. */\nexport function interpolateRamp(stops: string[], t: number): string {\n  if (stops.length === 0) return '#000000';\n  if (stops.length === 1) return stops[0];\n  const x = clamp01(t) * (stops.length - 1);\n  const i = Math.min(Math.floor(x), stops.length - 2);\n  const f = x - i;\n  const [r1, g1, b1] = hexToRgb(stops[i]);\n  const [r2, g2, b2] = hexToRgb(stops[i + 1]);\n  return rgbToHex(r1 + (r2 - r1) * f, g1 + (g2 - g1) * f, b1 + (b2 - b1) * f);\n}\n\n/** Map a numeric domain `[min,max]` onto a sequential ramp. */\nexport function sequentialColor(\n  name: ColorScaleName,\n  domain: [number, number],\n): (v: number) => string {\n  const stops = RAMPS[name];\n  const [min, max] = domain;\n  const span = max - min || 1;\n  return (v: number) => interpolateRamp(stops, (v - min) / span);\n}\n\n/** Lighten a hex colour toward white by `t` in [0,1]. */\nfunction lighten(hex: string, t: number): string {\n  const [r, g, b] = hexToRgb(hex);\n  return rgbToHex(r + (255 - r) * t, g + (255 - g) * t, b + (255 - b) * t);\n}\n\n/**\n * A monochrome sequential scale built from a single theme colour, so a heatmap\n * reads in the vibe's own hue (graphite for `pencil`, teal for a blueprint, …)\n * rather than a generic scientific ramp. Ramps a light tint → the strong colour.\n */\nexport function vibeColorScale(strong: string, domain: [number, number]): (v: number) => string {\n  const stops = [lighten(strong, 0.85), lighten(strong, 0.5), strong];\n  const [min, max] = domain;\n  const span = max - min || 1;\n  return (v: number) => interpolateRamp(stops, (v - min) / span);\n}\n\n/** Map a 3-stop domain `[min,mid,max]` onto a diverging ramp, centered on `mid`. */\nexport function divergingColor(\n  name: ColorScaleName,\n  domain: [number, number, number],\n): (v: number) => string {\n  const stops = RAMPS[name];\n  const [min, mid, max] = domain;\n  const lo = mid - min || 1;\n  const hi = max - mid || 1;\n  return (v: number) => {\n    const t = v < mid ? 0.5 * ((v - min) / lo) : 0.5 + 0.5 * ((v - mid) / hi);\n    return interpolateRamp(stops, t);\n  };\n}\n\n/** Stable categorical color for a string key (cycles through the palette). */\nexport function ordinalColor(\n  values: string[],\n  palette: string[] = DEFAULT_PALETTE,\n): (v: string) => string {\n  const index = new Map<string, number>();\n  for (const v of values) {\n    if (!index.has(v)) index.set(v, index.size);\n  }\n  return (v: string) => {\n    const i = index.get(v) ?? index.size;\n    return palette[((i % palette.length) + palette.length) % palette.length];\n  };\n}\n\n/** Evenly sample `steps` colors from a ramp — handy for legends/keys. */\nexport function colorRamp(name: ColorScaleName, steps: number): string[] {\n  const stops = RAMPS[name];\n  if (steps <= 1) return [interpolateRamp(stops, 0)];\n  return Array.from({ length: steps }, (_, i) => interpolateRamp(stops, i / (steps - 1)));\n}\n\n/** Names available for a color scale, useful for tool/resource enumeration. */\nexport const COLOR_SCALE_NAMES = Object.keys(RAMPS) as ColorScaleName[];\n","import type { ChartDatum, DataTableModel, Series } from '../types/charts';\n\n/**\n * Build screen-reader data-table models from chart inputs. Pure data shaping —\n * keeps the accessibility fallback in lockstep with what each chart draws.\n */\n\nexport function datumTable(data: ChartDatum[], caption?: string): DataTableModel {\n  return {\n    caption,\n    columns: ['Label', 'Value'],\n    rows: data.map((d) => [d.label, d.value]),\n  };\n}\n\nexport function seriesTable(series: Series[], caption?: string): DataTableModel {\n  return {\n    caption,\n    columns: ['Series', 'X', 'Y'],\n    rows: series.flatMap((s) => s.points.map((p) => [s.id, p.x, p.y] as (string | number)[])),\n  };\n}\n","/**\n * Data profiling for the `visualize` pipeline. Pure and DOM-free: inspect an\n * array of records and report each field's type/cardinality plus the dataset's\n * overall shape, so the recommendation engine can reason over structure rather\n * than raw values.\n */\n\nexport type FieldType = 'quantitative' | 'categorical' | 'temporal' | 'identifier';\n\nexport type DataShape =\n  | 'single-series'\n  | 'multi-series'\n  | 'hierarchy'\n  | 'graph'\n  | 'matrix'\n  | 'flat-records';\n\nexport interface FieldProfile {\n  name: string;\n  type: FieldType;\n  cardinality: number;\n  min?: number;\n  max?: number;\n  example: unknown;\n}\n\nexport interface DataProfile {\n  rowCount: number;\n  fields: FieldProfile[];\n  shape: DataShape;\n}\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2})?/;\n\nfunction isTemporal(values: unknown[]): boolean {\n  return values.every(\n    (v) =>\n      v instanceof Date ||\n      (typeof v === 'string' && ISO_DATE.test(v) && !Number.isNaN(Date.parse(v))),\n  );\n}\n\nfunction isNumeric(values: unknown[]): boolean {\n  return values.every((v) => typeof v === 'number' && Number.isFinite(v));\n}\n\nconst ID_NAME = /(^id$|_id$|^uuid$|^key$|^code$|^slug$)/i;\n\nfunction profileField(name: string, rows: Record<string, unknown>[]): FieldProfile {\n  const values = rows.map((r) => r[name]).filter((v) => v !== undefined && v !== null);\n  const unique = new Set(values.map((v) => (v instanceof Date ? v.getTime() : v)));\n  const cardinality = unique.size;\n  const example = values[0];\n  const allUnique = cardinality === values.length && values.length > 1;\n\n  // Numeric columns are measures, unless the field name marks them as an id key.\n  if (values.length > 0 && isNumeric(values)) {\n    if (ID_NAME.test(name) && allUnique) return { name, type: 'identifier', cardinality, example };\n    const nums = values as number[];\n    return {\n      name,\n      type: 'quantitative',\n      cardinality,\n      min: Math.min(...nums),\n      max: Math.max(...nums),\n      example,\n    };\n  }\n\n  if (values.length > 0 && isTemporal(values)) {\n    return { name, type: 'temporal', cardinality, example };\n  }\n\n  // Strings: identifier only for id-like names or large all-unique columns.\n  const type: FieldType =\n    ID_NAME.test(name) || (allUnique && rows.length >= 6) ? 'identifier' : 'categorical';\n  return { name, type, cardinality, example };\n}\n\nfunction detectShape(fields: FieldProfile[]): DataShape {\n  const names = new Set(fields.map((f) => f.name.toLowerCase()));\n\n  if ((names.has('source') && names.has('target')) || (names.has('from') && names.has('to')))\n    return 'graph';\n  if (names.has('id') && names.has('parent')) return 'hierarchy';\n\n  const quantitative = fields.filter((f) => f.type === 'quantitative');\n  const categorical = fields.filter((f) => f.type === 'categorical');\n  const temporal = fields.filter((f) => f.type === 'temporal');\n\n  if (categorical.length >= 1 && quantitative.length >= 3) return 'matrix';\n  // long-format multi-series: an x dimension + a series dimension + one measure\n  if (quantitative.length === 1 && categorical.length + temporal.length >= 2) return 'multi-series';\n  if (quantitative.length === 1 && categorical.length + temporal.length === 1)\n    return 'single-series';\n  return 'flat-records';\n}\n\nexport function profileData(data: Record<string, unknown>[]): DataProfile {\n  if (data.length === 0) return { rowCount: 0, fields: [], shape: 'flat-records' };\n\n  const names: string[] = [];\n  const seen = new Set<string>();\n  for (const row of data) {\n    for (const key of Object.keys(row)) {\n      if (!seen.has(key)) {\n        seen.add(key);\n        names.push(key);\n      }\n    }\n  }\n\n  const fields = names.map((name) => profileField(name, data));\n  return { rowCount: data.length, fields, shape: detectShape(fields) };\n}\n","import type { DataProfile, FieldProfile } from './profile';\n\n/**\n * Heuristic chart recommendation. Given a data profile (and an optional intent)\n * it returns ranked chart choices with a field→role encoding and a\n * human-readable rationale. Pure and deterministic — the rationale makes every\n * choice explainable.\n */\n\nexport type Intent =\n  | 'trend'\n  | 'compare'\n  | 'composition'\n  | 'distribution'\n  | 'correlation'\n  | 'flow'\n  | 'hierarchy';\n\nexport type ChartType =\n  | 'bar'\n  | 'line'\n  | 'area'\n  | 'scatter'\n  | 'pie'\n  | 'heatmap'\n  | 'sankey'\n  | 'treemap'\n  | 'radar';\n\nexport interface ChartRecommendation {\n  chartType: ChartType;\n  encoding: Record<string, string>;\n  confidence: number;\n  rationale: string;\n}\n\nconst all = (fields: FieldProfile[], type: FieldProfile['type']) =>\n  fields.filter((f) => f.type === type);\n\n/** Intent → chart types it should boost. */\nconst INTENT_BOOST: Record<Intent, ChartType[]> = {\n  trend: ['line', 'area'],\n  compare: ['bar', 'radar'],\n  composition: ['pie', 'treemap', 'area'],\n  distribution: ['bar', 'scatter'],\n  correlation: ['scatter', 'heatmap'],\n  flow: ['sankey'],\n  hierarchy: ['treemap'],\n};\n\nexport function recommendChart(profile: DataProfile, intent?: Intent): ChartRecommendation[] {\n  const { fields, shape } = profile;\n  const recs: ChartRecommendation[] = [];\n  const q = all(fields, 'quantitative');\n  const c = all(fields, 'categorical');\n  const t = all(fields, 'temporal');\n\n  const push = (r: ChartRecommendation) => recs.push(r);\n\n  if (shape === 'graph') {\n    const value = q[0]?.name ?? 'value';\n    push({\n      chartType: 'sankey',\n      encoding: { source: 'source', target: 'target', value },\n      confidence: 0.9,\n      rationale: 'Source/target/value fields describe a flow between nodes.',\n    });\n  } else if (shape === 'hierarchy') {\n    push({\n      chartType: 'treemap',\n      encoding: { id: 'id', parent: 'parent', value: q[0]?.name ?? 'value' },\n      confidence: 0.9,\n      rationale: 'id/parent fields describe a hierarchy; area encodes value.',\n    });\n  } else if (shape === 'matrix' && c[0]) {\n    push({\n      chartType: 'radar',\n      encoding: { group: c[0].name, axes: q.map((f) => f.name).join(',') },\n      confidence: 0.6,\n      rationale: 'One category with several measures compares well on a radar.',\n    });\n    push({\n      chartType: 'heatmap',\n      encoding: { x: c[0].name, y: 'measure', value: 'value' },\n      confidence: 0.5,\n      rationale: 'A category × measures grid reads as a heatmap.',\n    });\n  } else if (t[0] && q[0]) {\n    const enc = { x: t[0].name, y: q[0].name, ...(c[0] ? { series: c[0].name } : {}) };\n    push({\n      chartType: 'line',\n      encoding: enc,\n      confidence: 0.85,\n      rationale: 'A measure over time is a trend — use a line.',\n    });\n    push({\n      chartType: 'area',\n      encoding: enc,\n      confidence: 0.6,\n      rationale: 'Area emphasizes magnitude over time.',\n    });\n  } else if (q.length >= 2 && c.length === 0) {\n    push({\n      chartType: 'scatter',\n      encoding: { x: q[0].name, y: q[1].name },\n      confidence: 0.8,\n      rationale: 'Two quantitative fields show correlation as a scatter.',\n    });\n  } else if (c[0] && q[0]) {\n    const multi = c.length >= 2;\n    push({\n      chartType: 'bar',\n      encoding: multi\n        ? { x: c[0].name, series: c[1].name, y: q[0].name }\n        : { x: c[0].name, y: q[0].name },\n      confidence: 0.8,\n      rationale: multi\n        ? 'A category split by a second category — grouped/stacked bars.'\n        : 'One category, one measure — a bar chart.',\n    });\n    if (!multi && c[0].cardinality <= 6) {\n      push({\n        chartType: 'pie',\n        encoding: { label: c[0].name, value: q[0].name },\n        confidence: 0.5,\n        rationale: 'Few categories summing to a whole can read as a pie.',\n      });\n    }\n  }\n\n  if (recs.length === 0) {\n    push({\n      chartType: 'bar',\n      encoding: c[0] && q[0] ? { x: c[0].name, y: q[0].name } : {},\n      confidence: 0.3,\n      rationale: 'Fallback: a bar chart is the safest default.',\n    });\n  }\n\n  if (intent) {\n    const boosted = new Set(INTENT_BOOST[intent]);\n    for (const r of recs)\n      if (boosted.has(r.chartType)) r.confidence = Math.min(1, r.confidence + 0.15);\n  }\n\n  return recs.sort((a, b) => b.confidence - a.confidence);\n}\n","import type { ChartRecommendation } from './recommend';\n\n/**\n * Compile a (data, recommendation) pair into concrete props for the matching\n * chart component — including reshaping raw records into the component's data\n * structure. Pure: no rendering, just data shaping.\n */\n\nexport type ComponentName =\n  | 'BarChart'\n  | 'LineChart'\n  | 'AreaChart'\n  | 'ScatterPlot'\n  | 'PieChart'\n  | 'HeatmapChart'\n  | 'SankeyChart'\n  | 'TreemapChart'\n  | 'RadarChart';\n\nexport interface CompiledChart {\n  component: ComponentName;\n  props: Record<string, unknown>;\n}\n\ntype Row = Record<string, unknown>;\n\nconst num = (v: unknown): number =>\n  typeof v === 'number' ? v : typeof v === 'string' ? Date.parse(v) || Number(v) || 0 : 0;\nconst str = (v: unknown): string => String(v ?? '');\n\nfunction groupBy(rows: Row[], key: string): Map<string, Row[]> {\n  const m = new Map<string, Row[]>();\n  for (const r of rows) {\n    const k = str(r[key]);\n    const list = m.get(k);\n    if (list) list.push(r);\n    else m.set(k, [r]);\n  }\n  return m;\n}\n\nexport function compileChart(data: Row[], rec: ChartRecommendation): CompiledChart {\n  const e = rec.encoding;\n\n  switch (rec.chartType) {\n    case 'line':\n    case 'area': {\n      const component = rec.chartType === 'line' ? 'LineChart' : 'AreaChart';\n      // Line/area need a numeric x. Numbers and parseable dates map directly; a\n      // categorical x (e.g. month names) would all coerce to 0, so fall back to\n      // the category's position so the line actually spreads across the axis.\n      const xNumeric = data.every((r) => {\n        const v = r[e.x];\n        return typeof v === 'number' || (typeof v === 'string' && !Number.isNaN(Date.parse(v)));\n      });\n      const order = [...new Set(data.map((r) => str(r[e.x])))];\n      const xOf = (r: Row) => (xNumeric ? num(r[e.x]) : order.indexOf(str(r[e.x])));\n      const series = e.series\n        ? [...groupBy(data, e.series)].map(([id, rows]) => ({\n            id,\n            points: rows.map((r) => ({ x: xOf(r), y: num(r[e.y]) })),\n          }))\n        : [{ id: e.y, points: data.map((r) => ({ x: xOf(r), y: num(r[e.y]) })) }];\n      return { component, props: { series, title: `${e.y} by ${e.x}` } };\n    }\n\n    case 'scatter':\n      return {\n        component: 'ScatterPlot',\n        props: {\n          data: data.map((r) => ({ x: num(r[e.x]), y: num(r[e.y]) })),\n          title: `${e.y} vs ${e.x}`,\n        },\n      };\n\n    case 'pie':\n      return {\n        component: 'PieChart',\n        props: {\n          data: data.map((r) => ({ label: str(r[e.label]), value: num(r[e.value]) })),\n          title: e.value,\n        },\n      };\n\n    case 'bar': {\n      if (e.series) {\n        const keys = [...new Set(data.map((r) => str(r[e.series])))];\n        const byX = groupBy(data, e.x);\n        const multi = [...byX].map(([label, rows]) => ({\n          label,\n          values: Object.fromEntries(rows.map((r) => [str(r[e.series]), num(r[e.y])])),\n        }));\n        return {\n          component: 'BarChart',\n          props: { data: multi, mode: 'grouped', seriesKeys: keys, title: `${e.y} by ${e.x}` },\n        };\n      }\n      return {\n        component: 'BarChart',\n        props: {\n          data: data.map((r) => ({ label: str(r[e.x]), value: num(r[e.y]) })),\n          title: `${e.y} by ${e.x}`,\n        },\n      };\n    }\n\n    case 'sankey':\n      return {\n        component: 'SankeyChart',\n        props: {\n          nodes: [...new Set(data.flatMap((r) => [str(r[e.source]), str(r[e.target])]))].map(\n            (id) => ({ id }),\n          ),\n          links: data.map((r) => ({\n            source: str(r[e.source]),\n            target: str(r[e.target]),\n            value: num(r[e.value]),\n          })),\n        },\n      };\n\n    case 'treemap':\n      return {\n        component: 'TreemapChart',\n        props: {\n          data: data.map((r) => ({\n            id: str(r[e.id]),\n            parent: r[e.parent] != null ? str(r[e.parent]) : undefined,\n            value: e.value ? num(r[e.value]) : undefined,\n            label: str(r[e.id]),\n          })),\n        },\n      };\n\n    case 'radar': {\n      const axes = (e.axes ?? '').split(',').filter(Boolean);\n      const series = data.map((r) => ({ id: str(r[e.group]), values: axes.map((a) => num(r[a])) }));\n      return { component: 'RadarChart', props: { axes, series } };\n    }\n\n    case 'heatmap': {\n      // Melt the numeric columns of a matrix into (x, y=column, value) cells.\n      const xField = e.x;\n      const valueCols = Object.keys(data[0] ?? {}).filter(\n        (k) => k !== xField && typeof data[0]?.[k] === 'number',\n      );\n      const cells = data.flatMap((r) =>\n        valueCols.map((col) => ({ x: str(r[xField]), y: col, value: num(r[col]) })),\n      );\n      return { component: 'HeatmapChart', props: { data: cells } };\n    }\n  }\n}\n","import type { DataProfile, FieldProfile } from './profile';\nimport type { ChartType } from './recommend';\nimport type { VibeConfig } from '../types/vibe';\nimport { VIBE_PRESETS } from '../vibe/presets';\n\n/**\n * Heuristic, deterministic natural-language → chart hints. Pure and DOM-free:\n * given an English query and a data profile it extracts the intent, an optional\n * chart-type override, field-role assignments, and a vibe — never picks a chart\n * itself, only nudges the recommender (see `planChart`). Never throws.\n */\nexport interface ChartHints {\n  intent?: Intent;\n  chartType?: ChartType;\n  /** Encoding patch in a neutral role vocabulary: x, y, series, source, target. */\n  roles?: Record<string, string>;\n  vibe?: VibeConfig;\n  /** Extra props implied by the query, e.g. `innerRadius` for \"donut\". */\n  props?: Record<string, unknown>;\n  /** Non-stopword words the parser couldn't map — surfaced for explainability. */\n  unresolved: string[];\n  confidence: number;\n}\n\nimport type { Intent } from './recommend';\n\n// --- small string helpers -------------------------------------------------\n\nconst norm = (s: string) => s.toLowerCase().replace(/[^a-z0-9]+/g, '');\nconst singular = (s: string) => (s.length > 3 && s.endsWith('s') ? s.slice(0, -1) : s);\n\n/** True when two strings are within one single-character edit (Levenshtein ≤ 1). */\nfunction withinOneEdit(a: string, b: string): boolean {\n  if (a === b) return true;\n  const dl = a.length - b.length;\n  if (dl > 1 || dl < -1) return false;\n  if (a.length === b.length) {\n    let diffs = 0;\n    for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) diffs++;\n    return diffs === 1;\n  }\n  // One insertion/deletion: the shorter must embed in the longer with one skip.\n  const [short, long] = a.length < b.length ? [a, b] : [b, a];\n  let i = 0;\n  let j = 0;\n  let skipped = false;\n  while (i < short.length && j < long.length) {\n    if (short[i] === long[j]) {\n      i++;\n      j++;\n    } else if (!skipped) {\n      skipped = true;\n      j++;\n    } else {\n      return false;\n    }\n  }\n  return true;\n}\n\n// --- intent ----------------------------------------------------------------\n\n/** Ordered so the more specific intents win when several could match. */\nconst INTENT_KEYWORDS: [Intent, string[]][] = [\n  ['correlation', ['correlation', 'correlate', 'relationship', 'related', 'against']],\n  ['flow', ['flow', 'funnel', 'pipeline']],\n  ['hierarchy', ['hierarchy', 'tree', 'nested', 'org chart', 'drilldown', 'drill down']],\n  [\n    'composition',\n    [\n      'breakdown',\n      'share',\n      'proportion',\n      'proportions',\n      'percentage',\n      'composition',\n      'makeup',\n      'part of',\n    ],\n  ],\n  ['distribution', ['distribution', 'spread', 'histogram', 'frequency']],\n  ['trend', ['over time', 'trend', 'growth', 'decline', 'trajectory', 'history', 'timeline']],\n  [\n    'compare',\n    [\n      'compare',\n      'comparison',\n      'versus',\n      'ranking',\n      'rank',\n      'top',\n      'largest',\n      'biggest',\n      'highest',\n      'lowest',\n    ],\n  ],\n];\n\n// --- chart type ------------------------------------------------------------\n\nconst CHART_KEYWORDS: [ChartType, string[]][] = [\n  ['scatter', ['scatter', 'bubble']],\n  ['line', ['line']],\n  ['area', ['area']],\n  ['pie', ['pie']],\n  ['heatmap', ['heatmap', 'heat map', 'matrix']],\n  ['sankey', ['sankey']],\n  ['treemap', ['treemap', 'tree map']],\n  ['radar', ['radar', 'spider']],\n  ['bar', ['bar', 'column']],\n];\n\n// --- vibe ------------------------------------------------------------------\n\nconst MOOD_TO_PRESET: Record<string, string> = {\n  professional: 'clean_blueprint',\n  clean: 'clean_blueprint',\n  blueprint: 'clean_blueprint',\n  playful: 'comic_book',\n  fun: 'comic_book',\n  comic: 'comic_book',\n  dark: 'midnight',\n  retro: 'amber_crt',\n  neon: 'neon',\n  chalk: 'chalkboard',\n  sketchy: 'messy_sketch',\n  handdrawn: 'messy_sketch',\n};\n\nconst PRESET_NAMES = Object.keys(VIBE_PRESETS);\n\nconst STOPWORDS = new Set([\n  'a',\n  'an',\n  'the',\n  'as',\n  'in',\n  'on',\n  'of',\n  'to',\n  'and',\n  'with',\n  'show',\n  'me',\n  'it',\n  'make',\n  'chart',\n  'graph',\n  'plot',\n  'this',\n  'that',\n  'please',\n  'using',\n  'use',\n  'for',\n  'between',\n  'into',\n  'my',\n  'data',\n  'is',\n  'are',\n  'be',\n  'render',\n  'draw',\n  'display',\n]);\n\nconst BY_WORDS = new Set(['by', 'per', 'across']);\nconst SERIES_WORDS = new Set([\n  'split',\n  'grouped',\n  'group',\n  'colored',\n  'color',\n  'stacked',\n  'series',\n]);\n\n// --- field matching --------------------------------------------------------\n\nfunction matchField(token: string | undefined, profile: DataProfile): FieldProfile | undefined {\n  if (!token) return undefined;\n  const t = norm(token);\n  if (!t) return undefined;\n  const fields = profile.fields;\n  return (\n    fields.find((f) => norm(f.name) === t) ??\n    fields.find((f) => singular(norm(f.name)) === singular(t)) ??\n    fields.find((f) => norm(f.name).startsWith(t) || t.startsWith(norm(f.name))) ??\n    fields.find((f) => norm(f.name).includes(t) || t.includes(norm(f.name)))\n  );\n}\n\n// --- the parser ------------------------------------------------------------\n\nexport function parseChartQuery(query: string, profile: DataProfile): ChartHints {\n  const lower = (query ?? '').toLowerCase();\n  const tokens = lower.split(/[^a-z0-9]+/).filter(Boolean);\n  const consumed = new Set<number>(); // token indices the parser has explained\n  const roles: Record<string, string> = {};\n  const props: Record<string, unknown> = {};\n\n  const hasPhrase = (kw: string) => (kw.includes(' ') ? lower.includes(kw) : tokens.includes(kw));\n  const consumePhrase = (kw: string) => {\n    for (const w of kw.split(' ')) {\n      const i = tokens.indexOf(w);\n      if (i >= 0) consumed.add(i);\n    }\n  };\n\n  // intent\n  let intent: Intent | undefined;\n  for (const [name, kws] of INTENT_KEYWORDS) {\n    const hit = kws.find(hasPhrase);\n    if (hit) {\n      intent = name;\n      consumePhrase(hit);\n      break;\n    }\n  }\n\n  // chart type (+ donut → pie with an inner radius)\n  let chartType: ChartType | undefined;\n  if (hasPhrase('donut') || hasPhrase('doughnut')) {\n    chartType = 'pie';\n    props.innerRadius = 60;\n    consumePhrase('donut');\n    consumePhrase('doughnut');\n  } else {\n    for (const [name, kws] of CHART_KEYWORDS) {\n      const hit = kws.find(hasPhrase);\n      if (hit) {\n        chartType = name;\n        consumePhrase(hit);\n        break;\n      }\n    }\n  }\n\n  const setRole = (key: string, field: FieldProfile | undefined, ...tokenIdx: number[]) => {\n    if (field && !roles[key]) {\n      roles[key] = field.name;\n      for (const i of tokenIdx) if (i >= 0) consumed.add(i);\n      const fi = tokens.findIndex(\n        (t) => norm(t) === norm(field.name) || singular(norm(t)) === singular(norm(field.name)),\n      );\n      if (fi >= 0) consumed.add(fi);\n    }\n  };\n\n  // explicit \"X vs Y\" / \"X against Y\"\n  for (let i = 1; i < tokens.length - 1; i++) {\n    if (tokens[i] === 'vs' || tokens[i] === 'versus' || tokens[i] === 'against') {\n      setRole('x', matchField(tokens[i - 1], profile), i - 1, i);\n      setRole('y', matchField(tokens[i + 1], profile), i + 1);\n    }\n  }\n\n  // \"between A and B\"\n  const between = tokens.indexOf('between');\n  if (between >= 0) {\n    const a = tokens[between + 1];\n    const andAt = tokens.indexOf('and', between);\n    const b = andAt >= 0 ? tokens[andAt + 1] : undefined;\n    setRole('x', matchField(a, profile), between, between + 1);\n    if (andAt >= 0) setRole('y', matchField(b, profile), andAt, andAt + 1);\n  }\n\n  // \"from A to B\"\n  const fromAt = tokens.indexOf('from');\n  if (fromAt >= 0) {\n    const toAt = tokens.indexOf('to', fromAt);\n    setRole('source', matchField(tokens[fromAt + 1], profile), fromAt, fromAt + 1);\n    if (toAt >= 0) setRole('target', matchField(tokens[toAt + 1], profile), toAt, toAt + 1);\n  }\n\n  // \"by/per/across X\" (series when preceded by split/grouped/colored/…)\n  for (let i = 0; i < tokens.length - 1; i++) {\n    if (BY_WORDS.has(tokens[i])) {\n      const field = matchField(tokens[i + 1], profile);\n      const prev = tokens[i - 1];\n      if (prev && SERIES_WORDS.has(prev)) {\n        setRole('series', field, i, i - 1);\n      } else {\n        setRole('x', field, i);\n      }\n    }\n  }\n\n  // bare field mentions fill remaining roles by type\n  for (let i = 0; i < tokens.length; i++) {\n    if (consumed.has(i)) continue;\n    const field = matchField(tokens[i], profile);\n    if (!field) continue;\n    consumed.add(i);\n    if (field.type === 'quantitative') {\n      if (!roles.y) roles.y = field.name;\n      else if (!roles.x) roles.x = field.name;\n    } else if (!roles.x) {\n      roles.x = field.name;\n    } else if (!roles.series) {\n      roles.series = field.name;\n    }\n  }\n\n  // vibe: preset name (fuzzy, underscores↔spaces) then mood word\n  let vibe: VibeConfig | undefined;\n  for (let i = 0; i < tokens.length; i++) {\n    if (consumed.has(i) || STOPWORDS.has(tokens[i])) continue;\n    const t = tokens[i];\n    const preset = PRESET_NAMES.find((p) => {\n      const parts = p.split('_');\n      // Exact match on the full name or a word part; fuzzy only for longer\n      // tokens so short stopwords like \"in\" can't drift into \"ink\".\n      return (\n        p === t ||\n        parts.includes(t) ||\n        (t.length >= 4 && parts.some((part) => part.length >= 4 && withinOneEdit(part, t)))\n      );\n    });\n    if (preset) {\n      vibe = preset as VibeConfig;\n      consumed.add(i);\n      // consume an adjacent word for multi-word presets like \"sticky note\"\n      const parts = preset.split('_');\n      if (parts.length > 1) {\n        for (const p of parts) {\n          const j = tokens.indexOf(p);\n          if (j >= 0) consumed.add(j);\n        }\n      }\n      break;\n    }\n  }\n  if (!vibe) {\n    for (let i = 0; i < tokens.length; i++) {\n      if (consumed.has(i)) continue;\n      const mood = MOOD_TO_PRESET[tokens[i]];\n      if (mood) {\n        vibe = mood as VibeConfig;\n        consumed.add(i);\n        break;\n      }\n    }\n  }\n\n  // leftover, non-stopword words are unresolved\n  const unresolved = tokens.filter(\n    (t, i) => !consumed.has(i) && !STOPWORDS.has(t) && Number.isNaN(Number(t)),\n  );\n\n  const hasRole = Object.keys(roles).length > 0;\n  const confidence = Math.min(\n    1,\n    0.2 + (intent ? 0.3 : 0) + (hasRole ? 0.3 : 0) + (chartType ? 0.2 : 0),\n  );\n\n  return {\n    intent,\n    chartType,\n    roles: hasRole ? roles : undefined,\n    vibe,\n    props: Object.keys(props).length ? props : undefined,\n    unresolved,\n    confidence,\n  };\n}\n","import { profileData } from './profile';\nimport { recommendChart } from './recommend';\nimport type { ChartRecommendation, ChartType, Intent } from './recommend';\nimport { compileChart } from './compile';\nimport type { CompiledChart } from './compile';\nimport { parseChartQuery } from './queryParse';\nimport type { ChartHints } from './queryParse';\n\ntype Row = Record<string, unknown>;\n\n/**\n * The shared orchestrator behind the natural-language front door. Profiles the\n * data, parses the query into hints, lets the existing recommender pick a chart\n * (nudged by the parsed intent), applies any explicit chart-type/role/vibe\n * overrides, and compiles concrete props. Pure and DOM-free; the parser only\n * nudges the recommender so the two can never disagree.\n */\nexport interface ChartPlan {\n  hints: ChartHints;\n  recommendation: ChartRecommendation;\n  alternatives: ChartRecommendation[];\n  compiled: CompiledChart;\n}\n\nconst EMPTY_HINTS: ChartHints = { unresolved: [], confidence: 0 };\n\n/** Translate a neutral role (x/y/series/source/target) to a chart's encoding key. */\nfunction encodingKeyFor(chartType: ChartType, role: string): string {\n  if (chartType === 'pie') return role === 'x' ? 'label' : role === 'y' ? 'value' : role;\n  if (chartType === 'treemap') return role === 'x' ? 'id' : role === 'y' ? 'value' : role;\n  if (chartType === 'sankey') return role === 'y' ? 'value' : role;\n  return role; // bar/line/area/scatter use x/y/series/source/target directly\n}\n\n/** Re-key an encoding so it satisfies a chart we're forcing it into. */\nfunction adaptEncoding(base: Record<string, string>, chartType: ChartType): Record<string, string> {\n  switch (chartType) {\n    case 'pie':\n      return { label: base.label ?? base.x ?? base.id, value: base.value ?? base.y };\n    case 'treemap':\n      return { id: base.id ?? base.x, parent: base.parent, value: base.value ?? base.y };\n    case 'sankey':\n      return { source: base.source ?? base.x, target: base.target, value: base.value ?? base.y };\n    case 'scatter':\n    case 'line':\n    case 'area':\n    case 'bar':\n      return { x: base.x ?? base.label, y: base.y ?? base.value, series: base.series };\n    default:\n      return { ...base };\n  }\n}\n\nexport function planChart(data: Row[], opts: { query?: string; intent?: Intent } = {}): ChartPlan {\n  const profile = profileData(data);\n  const hints = opts.query ? parseChartQuery(opts.query, profile) : EMPTY_HINTS;\n\n  const intent = hints.intent ?? opts.intent;\n  const recs = recommendChart(profile, intent);\n\n  // Pick the chart: an explicit override wins; otherwise the top recommendation.\n  let chosen: ChartRecommendation;\n  if (hints.chartType) {\n    const match = recs.find((r) => r.chartType === hints.chartType);\n    chosen = match ?? {\n      chartType: hints.chartType,\n      encoding: adaptEncoding(recs[0]?.encoding ?? {}, hints.chartType),\n      confidence: Math.max(0.4, hints.confidence),\n      rationale: `Requested explicitly as a ${hints.chartType}.`,\n    };\n  } else {\n    chosen = recs[0] ?? {\n      chartType: 'bar',\n      encoding: {},\n      confidence: 0.3,\n      rationale: 'Fallback bar chart.',\n    };\n  }\n\n  // Patch the encoding with parsed field roles, mapped to this chart's keys.\n  if (hints.roles) {\n    const patch: Record<string, string> = {};\n    for (const [role, field] of Object.entries(hints.roles)) {\n      patch[encodingKeyFor(chosen.chartType, role)] = field;\n    }\n    const encoding = { ...chosen.encoding, ...patch };\n    // An override can leave a stale series identical to the x/y field — a\n    // degenerate group that renders a redundant legend over the bars. Drop it\n    // unless the query explicitly asked for that series.\n    if (\n      encoding.series &&\n      encoding.series !== patch.series &&\n      (encoding.series === encoding.x || encoding.series === encoding.y)\n    ) {\n      delete encoding.series;\n    }\n    chosen = { ...chosen, encoding };\n  }\n\n  const compiled = compileChart(data, chosen);\n  if (hints.props) Object.assign(compiled.props, hints.props);\n  if (hints.vibe !== undefined) compiled.props.vibe = hints.vibe;\n\n  return {\n    hints,\n    recommendation: chosen,\n    alternatives: recs.filter((r) => r !== chosen),\n    compiled,\n  };\n}\n","/**\n * Deterministic paper-grain speckle. Pure and DOM-free: given a surface size and\n * a seed it returns faint specks the renderer paints behind the data so matte\n * vibes read as textured paper rather than a flat fill. Seeded so output stays\n * byte-stable across renders/SSR (and golden snapshots).\n */\n\nexport interface Speck {\n  cx: number;\n  cy: number;\n  r: number;\n  opacity: number;\n}\n\n/** Speckle intensity tier. `medium` is the original (and default) look. */\nexport type SpeckleTier = 'subtle' | 'medium';\n\ninterface TierConfig {\n  /** One speck per ~this many px² (bigger = sparser). */\n  divisor: number;\n  rMin: number;\n  rMax: number;\n  oMin: number;\n  oMax: number;\n}\n\n// Tiers chosen against the live before/after comparison. `medium` keeps the\n// exact constants (and rand() call order) the feature shipped with, so the\n// presets that default to it render byte-identically.\nconst TIERS: Record<SpeckleTier, TierConfig> = {\n  subtle: { divisor: 950, rMin: 0.4, rMax: 0.9, oMin: 0.04, oMax: 0.1 },\n  medium: { divisor: 550, rMin: 0.5, rMax: 1.0, oMin: 0.05, oMax: 0.13 },\n};\n\n/** Small, fast, seedable PRNG (mulberry32) — stable across platforms. */\nfunction mulberry32(seed: number): () => number {\n  let s = seed >>> 0 || 1;\n  return () => {\n    s = (s + 0x6d2b79f5) | 0;\n    let t = Math.imul(s ^ (s >>> 15), 1 | s);\n    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n  };\n}\n\nconst round = (n: number, dp = 1) => Math.round(n * 10 ** dp) / 10 ** dp;\n\nexport function paperSpeckles(\n  width: number,\n  height: number,\n  seed: number,\n  tier: SpeckleTier = 'medium',\n): Speck[] {\n  if (width <= 0 || height <= 0) return [];\n  const t = TIERS[tier];\n  const rand = mulberry32(seed);\n  const count = Math.round((width * height) / t.divisor);\n  const specks: Speck[] = [];\n  for (let i = 0; i < count; i++) {\n    specks.push({\n      cx: round(rand() * width),\n      cy: round(rand() * height),\n      r: round(t.rMin + rand() * (t.rMax - t.rMin), 2),\n      opacity: round(t.oMin + rand() * (t.oMax - t.oMin), 3),\n    });\n  }\n  return specks;\n}\n\n/**\n * Map a vibe `texture` value to the speckle tier to render, or `null` when no\n * texture should be painted (`'none'` or unset). Keeps the texture vocabulary in\n * one place so the renderer doesn't hard-code the mapping.\n */\nexport function speckleTierFor(texture: string | undefined): SpeckleTier | null {\n  switch (texture) {\n    case 'paper':\n    case 'paper-medium':\n      return 'medium';\n    case 'paper-subtle':\n      return 'subtle';\n    default:\n      return null;\n  }\n}\n\n/** Whether a `#rrggbb` colour is dark, so specks can be tinted for contrast. */\nexport function isDarkColor(hex: string | undefined): boolean {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex ?? '');\n  if (!m) return false;\n  const n = parseInt(m[1], 16);\n  const r = (n >> 16) & 255;\n  const g = (n >> 8) & 255;\n  const b = n & 255;\n  return (0.299 * r + 0.587 * g + 0.114 * b) / 255 < 0.5;\n}\n","import type { CompiledChart } from './compile';\nimport type { DataProfile } from './profile';\nimport { DEFAULT_PALETTE } from './palette';\nimport { measureText } from './text';\n\n/**\n * Chart critique: flag common dataviz mistakes in a compiled chart so an agent\n * can refine it. Each rule fires on a concrete, testable condition and carries a\n * human-readable message plus an optional `fix` patch describing the change.\n * Pure: it inspects the compiled props + data profile, never renders.\n */\n\nexport interface Critique {\n  severity: 'info' | 'warn';\n  /** Stable rule id, for dedup / filtering in a refine loop. */\n  rule: string;\n  message: string;\n  /** A concrete, machine-readable patch an agent can apply, where applicable. */\n  fix?: Record<string, unknown>;\n}\n\nexport interface CritiqueOptions {\n  /** Plot width (px) used for label-collision detection. */\n  width?: number;\n}\n\nconst FONT_SIZE = 12;\nconst FONT_FAMILY = 'sans-serif';\nconst SERIES_SOFT_LIMIT = 7;\n\ninterface DatumLike {\n  label: string;\n  value: number;\n}\n\nconst isSingleBar = (c: CompiledChart): boolean =>\n  c.component === 'BarChart' && Array.isArray(c.props.data) && c.props.mode == null;\n\n/** Series count for color-bearing charts, or null when colour isn't the encoding. */\nfunction seriesColorCount(c: CompiledChart): number | null {\n  const { component, props } = c;\n  if (\n    (component === 'LineChart' || component === 'AreaChart' || component === 'RadarChart') &&\n    Array.isArray(props.series)\n  ) {\n    return props.series.length;\n  }\n  if (component === 'BarChart' && Array.isArray(props.seriesKeys)) return props.seriesKeys.length;\n  return null;\n}\n\nexport function critiqueChart(\n  compiled: CompiledChart,\n  profile: DataProfile,\n  opts: CritiqueOptions = {},\n): Critique[] {\n  const critiques: Critique[] = [];\n  const { component, props } = compiled;\n  const width = opts.width ?? 640;\n\n  // Too many categories — bars or pie slices.\n  if (isSingleBar(compiled)) {\n    const data = props.data as DatumLike[];\n    if (data.length > 12) {\n      critiques.push({\n        severity: 'warn',\n        rule: 'too-many-categories',\n        message: `A bar chart with ${data.length} bars is hard to scan; keep the top ~12 and group the rest into \"Other\".`,\n        fix: { keepTopCategories: 12, groupRemainderAs: 'Other' },\n      });\n    }\n  }\n  if (component === 'PieChart' && Array.isArray(props.data)) {\n    const data = props.data as DatumLike[];\n    if (data.length > 6) {\n      critiques.push({\n        severity: 'warn',\n        rule: 'too-many-categories',\n        message: `A pie with ${data.length} slices is hard to compare; a bar chart ranks ${data.length} categories more clearly.`,\n        fix: { chartType: 'bar' },\n      });\n    }\n    if (data.some((d) => d.value < 0)) {\n      critiques.push({\n        severity: 'warn',\n        rule: 'pie-not-part-of-whole',\n        message:\n          'A pie chart shows parts of a whole; negative values have no meaningful slice — use a bar chart.',\n        fix: { chartType: 'bar' },\n      });\n    }\n  }\n\n  // Bars are always zero-based here, so the risk isn't truncation but low\n  // contrast: values clustered high above zero look nearly identical.\n  if (isSingleBar(compiled)) {\n    const values = (props.data as DatumLike[]).map((d) => d.value);\n    if (values.length >= 2 && values.every((v) => v > 0)) {\n      const min = Math.min(...values);\n      const max = Math.max(...values);\n      if (max > 0 && min / max > 0.7) {\n        critiques.push({\n          severity: 'info',\n          rule: 'low-bar-contrast',\n          message: `Bars are correctly zero-based, but the values cluster between ${min} and ${max}, so they look nearly identical; a line or dot plot would surface the differences.`,\n          fix: { chartType: 'line' },\n        });\n      }\n    }\n  }\n\n  // A time field plus a bar chart usually wants to be a trend line.\n  if (component === 'BarChart' && profile.fields.some((f) => f.type === 'temporal')) {\n    critiques.push({\n      severity: 'info',\n      rule: 'temporal-trend',\n      message:\n        'The data has a time field; a line or area chart shows a trend over time more clearly than bars.',\n      fix: { chartType: 'line' },\n    });\n  }\n\n  // Axis-label collision — real text metrics, not guesses.\n  if (isSingleBar(compiled)) {\n    const data = props.data as DatumLike[];\n    if (data.length > 0) {\n      const band = width / data.length;\n      const widest = Math.max(\n        ...data.map((d) => measureText(d.label, FONT_SIZE, FONT_FAMILY).width),\n      );\n      if (widest > band - 4) {\n        critiques.push({\n          severity: 'warn',\n          rule: 'axis-label-collision',\n          message: `The widest x-axis label (~${Math.round(widest)}px) is wider than its ${Math.round(band)}px slot, so labels will overlap; rotate or wrap them.`,\n          fix: { rotateLabels: 45 },\n        });\n      }\n    }\n  }\n\n  // Too many series colours — beyond the palette, colours repeat.\n  const seriesCount = seriesColorCount(compiled);\n  if (seriesCount != null) {\n    if (seriesCount > DEFAULT_PALETTE.length) {\n      critiques.push({\n        severity: 'warn',\n        rule: 'too-many-series-colors',\n        message: `${seriesCount} series exceed the ${DEFAULT_PALETTE.length}-colour palette, so colours repeat and become ambiguous; cap the series or use a sequential colour scale.`,\n        fix: { maxSeries: DEFAULT_PALETTE.length },\n      });\n    } else if (seriesCount > SERIES_SOFT_LIMIT) {\n      critiques.push({\n        severity: 'info',\n        rule: 'too-many-series-colors',\n        message: `${seriesCount} series approach the limit of distinguishable colours; consider grouping the smaller series.`,\n        fix: { maxSeries: SERIES_SOFT_LIMIT },\n      });\n    }\n  }\n\n  return critiques;\n}\n","import { scaleLog, scaleTime } from 'd3-scale';\nimport type { ScaleLogarithmic, ScaleTime } from 'd3-scale';\n\n/**\n * Declarative, DOM-free data shaping run *before* a chart encodes its rows.\n * Each transform is a small pure function; `applyTransforms` folds a pipeline\n * left-to-right. This lets an agent say \"top 10 by revenue, descending\" instead\n * of wrangling the data itself. No dependencies beyond the math here.\n */\n\nexport type Row = Record<string, unknown>;\n\nexport type Comparator = '==' | '!=' | '>' | '>=' | '<' | '<=' | 'in';\n\nexport type Transform =\n  | { op: 'sort'; by: string; dir?: 'asc' | 'desc' }\n  | { op: 'filter'; field: string; cmp: Comparator; value: unknown }\n  | {\n      op: 'topN';\n      by: string;\n      n: number;\n      rest?: 'drop' | 'group-other';\n      labelField?: string;\n      otherLabel?: string;\n    }\n  | { op: 'aggregate'; groupBy: string[]; field: string; reducer: Reducer; as?: string }\n  | { op: 'bin'; field: string; bins: number; as?: string; countAs?: string }\n  | { op: 'rolling'; field: string; window: number; reducer: 'mean' | 'sum'; as?: string }\n  | { op: 'pivot'; index: string; column: string; value: string };\n\nexport type Reducer = 'sum' | 'mean' | 'count' | 'min' | 'max' | 'median';\n\nconst num = (v: unknown): number => {\n  const n = typeof v === 'number' ? v : Number(v);\n  return Number.isFinite(n) ? n : 0;\n};\n\nfunction compareValues(a: unknown, b: unknown): number {\n  const an = typeof a === 'number' ? a : Number(a);\n  const bn = typeof b === 'number' ? b : Number(b);\n  if (Number.isFinite(an) && Number.isFinite(bn)) return an - bn;\n  return String(a).localeCompare(String(b));\n}\n\nfunction reduce(values: number[], reducer: Reducer): number {\n  if (reducer === 'count') return values.length;\n  if (values.length === 0) return 0;\n  switch (reducer) {\n    case 'sum':\n      return values.reduce((s, v) => s + v, 0);\n    case 'mean':\n      return values.reduce((s, v) => s + v, 0) / values.length;\n    case 'min':\n      return Math.min(...values);\n    case 'max':\n      return Math.max(...values);\n    case 'median': {\n      const sorted = [...values].sort((a, b) => a - b);\n      const mid = Math.floor(sorted.length / 2);\n      return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n    }\n  }\n}\n\nconst matches = (cell: unknown, cmp: Comparator, value: unknown): boolean => {\n  switch (cmp) {\n    case '==':\n      return cell === value;\n    case '!=':\n      return cell !== value;\n    case 'in':\n      return Array.isArray(value) && value.includes(cell);\n    case '>':\n      return num(cell) > num(value);\n    case '>=':\n      return num(cell) >= num(value);\n    case '<':\n      return num(cell) < num(value);\n    case '<=':\n      return num(cell) <= num(value);\n  }\n};\n\nfunction applyOne(rows: Row[], t: Transform): Row[] {\n  switch (t.op) {\n    case 'sort': {\n      const dir = t.dir === 'desc' ? -1 : 1;\n      // Stable sort preserving input order for equal keys.\n      return rows\n        .map((row, i) => ({ row, i }))\n        .sort((a, b) => compareValues(a.row[t.by], b.row[t.by]) * dir || a.i - b.i)\n        .map(({ row }) => row);\n    }\n    case 'filter':\n      return rows.filter((r) => matches(r[t.field], t.cmp, t.value));\n    case 'topN': {\n      const ranked = [...rows].sort((a, b) => compareValues(b[t.by], a[t.by]));\n      const head = ranked.slice(0, Math.max(0, t.n));\n      if (t.rest !== 'group-other' || ranked.length <= t.n) return head;\n      const tail = ranked.slice(t.n);\n      const other: Row = { [t.by]: tail.reduce((s, r) => s + num(r[t.by]), 0) };\n      if (t.labelField) other[t.labelField] = t.otherLabel ?? 'Other';\n      return [...head, other];\n    }\n    case 'aggregate': {\n      const groups = new Map<string, { keys: Row; values: number[] }>();\n      for (const r of rows) {\n        const key = t.groupBy.map((g) => String(r[g])).join('\u0000');\n        let g = groups.get(key);\n        if (!g) {\n          g = { keys: Object.fromEntries(t.groupBy.map((k) => [k, r[k]])), values: [] };\n          groups.set(key, g);\n        }\n        g.values.push(num(r[t.field]));\n      }\n      return [...groups.values()].map((g) => ({\n        ...g.keys,\n        [t.as ?? t.field]: reduce(g.values, t.reducer),\n      }));\n    }\n    case 'bin': {\n      const xs = rows.map((r) => num(r[t.field]));\n      if (xs.length === 0 || t.bins < 1) return [];\n      const min = Math.min(...xs);\n      const max = Math.max(...xs);\n      const width = (max - min) / t.bins || 1;\n      const counts = new Array(t.bins).fill(0);\n      for (const x of xs) {\n        const idx = Math.min(t.bins - 1, Math.floor((x - min) / width));\n        counts[idx] += 1;\n      }\n      const round = (n: number) => Math.round(n * 100) / 100;\n      return counts.map((count, i) => ({\n        [t.as ?? `${t.field}_bin`]: `${round(min + i * width)}–${round(min + (i + 1) * width)}`,\n        [t.countAs ?? 'count']: count,\n      }));\n    }\n    case 'rolling': {\n      const out: Row[] = [];\n      const win: number[] = [];\n      for (const r of rows) {\n        win.push(num(r[t.field]));\n        if (win.length > t.window) win.shift();\n        out.push({\n          ...r,\n          [t.as ?? `${t.field}_rolling`]: reduce(win, t.reducer === 'sum' ? 'sum' : 'mean'),\n        });\n      }\n      return out;\n    }\n    case 'pivot': {\n      const byIndex = new Map<string, Row>();\n      const order: string[] = [];\n      for (const r of rows) {\n        const key = String(r[t.index]);\n        let row = byIndex.get(key);\n        if (!row) {\n          row = { [t.index]: r[t.index] };\n          byIndex.set(key, row);\n          order.push(key);\n        }\n        row[String(r[t.column])] = r[t.value];\n      }\n      return order.map((k) => byIndex.get(k)!);\n    }\n  }\n}\n\n/** Fold a transform pipeline over rows, left to right. Pure; never mutates input. */\nexport function applyTransforms(rows: Row[], pipeline: Transform[]): Row[] {\n  return pipeline.reduce((acc, t) => applyOne(acc, t), rows);\n}\n\n/** Log scale (d3) for positive quantitative axes. */\nexport function logScale(\n  domain: [number, number],\n  range: [number, number],\n): ScaleLogarithmic<number, number> {\n  return scaleLog().domain(domain).range(range);\n}\n\n/** Time scale (d3) over epoch-millisecond domains. */\nexport function timeScale(\n  domain: [number, number],\n  range: [number, number],\n): ScaleTime<number, number> {\n  return scaleTime().domain(domain).range(range);\n}\n","/**\n * Tiny, dependency-free value formatters for axis ticks and labels. Covers the\n * common cases an agent reaches for — fixed decimals, thousands grouping, SI\n * suffixes, currency, percent, and a strftime subset — without pulling in\n * d3-format / d3-time-format.\n */\n\nconst MONTHS = [\n  'January',\n  'February',\n  'March',\n  'April',\n  'May',\n  'June',\n  'July',\n  'August',\n  'September',\n  'October',\n  'November',\n  'December',\n];\nconst SI = ['', 'k', 'M', 'B', 'T'];\n\nconst pad = (n: number, w = 2) => String(Math.floor(Math.abs(n))).padStart(w, '0');\n\nfunction group(intPart: string): string {\n  return intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nfunction formatNumber(value: number, spec: string): string {\n  // Subset of d3-format: [$][,][.precision][f|s|%]\n  const m = /^(\\$)?(,)?(?:\\.(\\d+))?([fs%])?$/.exec(spec);\n  if (!m) return String(value);\n  const [, currency, comma, precRaw, type] = m;\n  const precision = precRaw != null ? Number(precRaw) : type === 's' ? 1 : type === '%' ? 0 : 2;\n\n  let n = value;\n  let suffix = '';\n  if (type === '%') {\n    n = value * 100;\n    suffix = '%';\n  } else if (type === 's') {\n    const tier =\n      value === 0 ? 0 : Math.min(SI.length - 1, Math.floor(Math.log10(Math.abs(value)) / 3));\n    n = value / 10 ** (tier * 3);\n    suffix = SI[tier];\n  }\n\n  const sign = n < 0 ? '-' : '';\n  const fixed = Math.abs(n).toFixed(precision);\n  const [intPartRaw, frac] = fixed.split('.');\n  const intPart = comma ? group(intPartRaw) : intPartRaw;\n  const body = frac ? `${intPart}.${frac}` : intPart;\n  return `${sign}${currency ?? ''}${body}${suffix}`;\n}\n\nfunction formatDate(value: number, pattern: string): string {\n  const d = new Date(value);\n  const tokens: Record<string, () => string> = {\n    '%Y': () => String(d.getFullYear()),\n    '%y': () => pad(d.getFullYear() % 100),\n    '%m': () => pad(d.getMonth() + 1),\n    '%B': () => MONTHS[d.getMonth()],\n    '%b': () => MONTHS[d.getMonth()].slice(0, 3),\n    '%d': () => pad(d.getDate()),\n    '%H': () => pad(d.getHours()),\n    '%M': () => pad(d.getMinutes()),\n    '%S': () => pad(d.getSeconds()),\n  };\n  return pattern.replace(/%[YymBbdHMS]/g, (tok) => tokens[tok]?.() ?? tok);\n}\n\n/**\n * Format a value with an optional d3-ish number/date `spec` and a `unit` suffix.\n * A spec containing `%` *with a letter* (e.g. `%b %Y`) is treated as a date\n * pattern; a bare `%` (e.g. `.0%`) is the percent number type.\n */\nexport function formatValue(value: string | number, spec?: string, unit?: string): string {\n  if (spec == null) return unit ? `${value}${unit}` : String(value);\n  const n = typeof value === 'number' ? value : Number(value);\n  const isDatePattern = /%[YymBbdHMS]/.test(spec);\n  let out: string;\n  if (isDatePattern) out = formatDate(n, spec);\n  else if (Number.isFinite(n)) out = formatNumber(n, spec);\n  else out = String(value);\n  return unit ? `${out}${unit}` : out;\n}\n","import type { AxisFormat } from '../types/charts';\nimport { linearScale } from './scales';\nimport { formatValue } from './format';\n\n/**\n * Resolve an `AxisFormat.domain` against a chart's values. Returns the default\n * extent when no override is given, so callers stay default-preserving.\n */\nexport function resolveDomain(\n  values: number[],\n  fallback: [number, number],\n  axis?: AxisFormat,\n): [number, number] {\n  const d = axis?.domain;\n  if (Array.isArray(d)) return d;\n  if (d === 'zero') {\n    const lo = Math.min(0, ...values);\n    const hi = Math.max(0, ...values);\n    return [lo, hi === lo ? lo + 1 : hi];\n  }\n  if (d === 'nice') {\n    return linearScale(fallback, [0, 1]).nice().domain() as [number, number];\n  }\n  return fallback;\n}\n\n/** A tick formatter for an axis, or `undefined` to keep the chart default. */\nexport function tickFormatter(axis?: AxisFormat): ((v: string | number) => string) | undefined {\n  if (!axis || (axis.format == null && axis.unit == null)) return undefined;\n  return (v) => formatValue(v, axis.format, axis.unit);\n}\n","import type { Series, SeriesPoint } from '../types/charts';\nimport type { Annotation, EmphasisSpec } from './annotations';\n\n/** Least-squares fit of `y = slope·x + intercept` over a point set. */\nexport function linearRegression(points: SeriesPoint[]): { slope: number; intercept: number } {\n  const n = points.length;\n  if (n === 0) return { slope: 0, intercept: 0 };\n  let sx = 0;\n  let sy = 0;\n  let sxy = 0;\n  let sxx = 0;\n  for (const p of points) {\n    sx += p.x;\n    sy += p.y;\n    sxy += p.x * p.y;\n    sxx += p.x * p.x;\n  }\n  const denom = n * sxx - sx * sx;\n  if (denom === 0) return { slope: 0, intercept: sy / n };\n  const slope = (n * sxy - sx * sy) / denom;\n  return { slope, intercept: (sy - slope * sx) / n };\n}\n\n/** The point a `pick` strategy selects (by y for max/min/peak, by order otherwise). */\nexport function pickPoint(\n  points: SeriesPoint[],\n  pick: 'max' | 'min' | 'first' | 'last' | 'peak',\n): SeriesPoint | undefined {\n  if (points.length === 0) return undefined;\n  switch (pick) {\n    case 'first':\n      return points[0];\n    case 'last':\n      return points[points.length - 1];\n    case 'min':\n      return points.reduce((a, b) => (b.y < a.y ? b : a));\n    case 'max':\n    case 'peak':\n      return points.reduce((a, b) => (b.y > a.y ? b : a));\n  }\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n\nfunction fillTemplate(tpl: string, point: SeriesPoint, seriesId: string): string {\n  return tpl\n    .replace(/\\{label\\}/g, String(point.x))\n    .replace(/\\{value\\}/g, String(round(point.y)))\n    .replace(/\\{series\\}/g, seriesId);\n}\n\nexport interface ResolvedEmphasis {\n  /** Concrete overlay annotations (trend segments, auto-callouts). */\n  annotations: Annotation[];\n  /** Series ids to render faded (highlight-series with mode `mute-others`). */\n  muted: Set<string>;\n  /** Series ids to emphasize. */\n  emphasized: Set<string>;\n}\n\nconst seriesFor = (series: Series[], id?: string): Series | undefined =>\n  id == null ? series[0] : series.find((s) => s.id === id);\n\n/**\n * Turn data-relative `EmphasisSpec`s into drawable annotations plus per-series\n * highlight state. Pure; degrades to no-ops when a target series is missing.\n */\nexport function resolveEmphasis(series: Series[], specs: EmphasisSpec[]): ResolvedEmphasis {\n  const annotations: Annotation[] = [];\n  const muted = new Set<string>();\n  const emphasized = new Set<string>();\n  let anyHighlight = false;\n\n  for (const spec of specs) {\n    if (spec.kind === 'highlight-series') {\n      emphasized.add(spec.id);\n      if ((spec.mode ?? 'mute-others') === 'mute-others') anyHighlight = true;\n      continue;\n    }\n\n    const target = seriesFor(series, spec.series);\n    const points = target?.points ?? [];\n    if (points.length === 0) continue;\n\n    if (spec.kind === 'trend') {\n      const xs = points.map((p) => p.x);\n      const x1 = Math.min(...xs);\n      const x2 = Math.max(...xs);\n      if (spec.method === 'mean') {\n        const mean = points.reduce((s, p) => s + p.y, 0) / points.length;\n        annotations.push({\n          kind: 'segment',\n          x1,\n          y1: mean,\n          x2,\n          y2: mean,\n          color: spec.color,\n          label: 'mean',\n        });\n      } else {\n        const { slope, intercept } = linearRegression(points);\n        annotations.push({\n          kind: 'segment',\n          x1,\n          y1: slope * x1 + intercept,\n          x2,\n          y2: slope * x2 + intercept,\n          color: spec.color,\n        });\n      }\n    } else if (spec.kind === 'auto-callout') {\n      const pt = pickPoint(points, spec.pick);\n      if (pt) {\n        const text = fillTemplate(spec.template ?? '{label}: {value}', pt, target?.id ?? '');\n        annotations.push({ kind: 'point-callout', x: pt.x, y: pt.y, text, color: spec.color });\n      }\n    }\n  }\n\n  if (anyHighlight) {\n    for (const s of series) if (!emphasized.has(s.id)) muted.add(s.id);\n  }\n  return { annotations, muted, emphasized };\n}\n","import rough from 'roughjs';\nimport type { RoughGenerator } from 'roughjs/bin/generator';\nimport type { Drawable } from 'roughjs/bin/core';\n\n/**\n * A single, DOM-free Rough.js generator shared by every primitive. The\n * generator only does math (path string -> sketchy path strings); it never\n * touches the DOM, which is exactly what keeps rendering React/SSR-safe.\n */\nlet generator: RoughGenerator | null = null;\n\nexport function getRoughGenerator(): RoughGenerator {\n  if (generator === null) {\n    generator = rough.generator();\n  }\n  return generator;\n}\n\n/**\n * Whether every coordinate is a finite number. Primitives call this before\n * handing geometry to Rough.js: a NaN/Infinity width or radius sends Rough.js'\n * hachure fill into an unbounded loop (it steps by `hachureGap` across an\n * infinite span), so we skip drawing degenerate shapes instead.\n */\nexport function allFinite(...nums: number[]): boolean {\n  return nums.every((n) => Number.isFinite(n));\n}\n\n/** Whether a path string is safe to draw — non-empty and free of NaN/Infinity. */\nexport function pathIsRenderable(d: string): boolean {\n  if (d.trim() === '') return false;\n  return !/NaN|Infinity/.test(d);\n}\n\n/** Whether a path is the sketch outline or part of the fill/hatching. */\nexport type RoughPathKind = 'stroke' | 'fill';\n\n/** Flat description of one `<path>` element to render for a sketchy drawable. */\nexport interface RoughPathInfo {\n  d: string;\n  stroke: string;\n  strokeWidth: number;\n  fill: string;\n  /** `stroke` = the sketch outline; `fill` = solid fill or hachure lines. */\n  kind: RoughPathKind;\n}\n\n/**\n * Turn a Rough.js `Drawable` into plain `<path>` descriptors. Rough.js emits\n * separate ops for the outline, the solid fill, and the hatching sketch — we\n * render each as its own path so React owns the DOM, not Rough.js.\n *\n * `toPaths` emits exactly one path per op-set, in order, so the returned paths\n * line up 1:1 with `drawable.sets`: a `path` set is the outline; `fillPath` and\n * `fillSketch` are the fill. We surface that as `kind` so callers can clip the\n * fill to the shape and animate only the outline.\n */\nexport function drawableToPaths(drawable: Drawable): RoughPathInfo[] {\n  const infos = getRoughGenerator().toPaths(drawable) as Omit<RoughPathInfo, 'kind'>[];\n  const sets = drawable.sets ?? [];\n  return infos.map((info, i) => ({\n    ...info,\n    kind: sets[i]?.type === 'path' ? 'stroke' : 'fill',\n  }));\n}\n","import { useId } from 'react';\nimport type { CSSProperties, MouseEvent, PointerEvent, ReactNode } from 'react';\nimport type { RoughPathInfo } from '../render/roughGenerator';\n\ninterface SketchPathsProps {\n  paths: RoughPathInfo[];\n  className?: string;\n  style?: CSSProperties;\n  onClick?: (event: MouseEvent<SVGElement>) => void;\n  /** Inert `data-*` attributes (e.g. from `markAttrs`) spread onto the group. */\n  dataAttrs?: Record<string, string>;\n  onPointerEnter?: (event: PointerEvent<SVGElement>) => void;\n  onPointerMove?: (event: PointerEvent<SVGElement>) => void;\n  onPointerLeave?: (event: PointerEvent<SVGElement>) => void;\n  onPointerDown?: (event: PointerEvent<SVGElement>) => void;\n  onPointerUp?: (event: PointerEvent<SVGElement>) => void;\n  children?: ReactNode;\n  /** Normalize path length to 1 so the draw-on reveal animation can dash it. */\n  animate?: boolean;\n  /**\n   * Geometric (un-roughened) outline `d` for the shape. When set, fill/hachure\n   * paths are clipped to it so the hatching can't bleed past the shape edge.\n   * The sketch outline stays unclipped, preserving the loose hand-drawn look.\n   */\n  clip?: string | null;\n}\n\n/**\n * Internal: renders Rough.js path descriptors as real SVG `<path>` elements so\n * React—not Rough.js—owns the DOM. Shared by every primitive. Clips fill paths\n * to the shape (when a `clip` outline is supplied) and, during the draw-on\n * reveal, dashes only the outline while the fill fades in.\n */\nexport function SketchPaths({\n  paths,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n  children,\n  animate,\n  clip,\n}: SketchPathsProps) {\n  const rawId = useId();\n  const hasFill = paths.some((p) => p.kind === 'fill');\n  const clipId = clip && hasFill ? `gc-clip-${rawId.replace(/:/g, '')}` : null;\n\n  return (\n    <g\n      className={className}\n      style={style}\n      onClick={onClick}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      {...dataAttrs}\n    >\n      {clipId ? (\n        <clipPath id={clipId}>\n          <path d={clip!} />\n        </clipPath>\n      ) : null}\n      {/* Solid (transparent) hit area for interactive marks, so hover/click\n          register across the whole shape and not just the hand-drawn strokes\n          (hachure fills leave gaps that otherwise flicker the hover state).\n          Only emitted for tagged marks, so non-interactive output is unchanged. */}\n      {dataAttrs && clip ? <path d={clip} fill=\"transparent\" stroke=\"none\" data-gc-hit=\"\" /> : null}\n      {paths.map((p, i) => {\n        const isStroke = p.kind === 'stroke';\n        return (\n          <path\n            key={i}\n            d={p.d}\n            stroke={p.stroke}\n            strokeWidth={p.strokeWidth}\n            fill={p.fill}\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            clipPath={!isStroke && clipId ? `url(#${clipId})` : undefined}\n            className={animate ? (isStroke ? 'gc-draw-stroke' : 'gc-draw-fill') : undefined}\n            pathLength={animate && isStroke ? 1 : undefined}\n          />\n        );\n      })}\n      {children}\n    </g>\n  );\n}\n","import { useMemo } from 'react';\nimport type { RoughPathProps } from '../types/primitives';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { vibeToRoughOptions } from '../vibe/resolveVibe';\nimport { getRoughGenerator, drawableToPaths, pathIsRenderable } from '../render/roughGenerator';\nimport { SketchPaths } from './SketchPaths';\n\n/**\n * The foundational primitive. Takes an SVG path `d` string (typically produced\n * by the D3 calculation layer) and renders it as a hand-drawn sketch using the\n * resolved vibe. Every higher-level shape and chart is built on top of this.\n *\n * D3 decides *where* the path goes; the vibe decides *how* it looks.\n */\nexport function RoughPath({\n  d,\n  vibe,\n  seed,\n  stroke,\n  fill,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n  children,\n}: RoughPathProps) {\n  const resolved = useResolvedVibe(vibe, seed);\n\n  const paths = useMemo(() => {\n    if (!pathIsRenderable(d)) return [];\n\n    // Per-shape stroke/fill overrides win over the vibe, but only for this path.\n    const shapeVibe = {\n      ...resolved,\n      stroke: stroke ?? resolved.stroke,\n      fill: fill === undefined ? resolved.fill : fill,\n    };\n\n    const options = vibeToRoughOptions(shapeVibe, shapeVibe.seed);\n    const drawable = getRoughGenerator().path(d, options);\n    return drawableToPaths(drawable);\n  }, [d, resolved, stroke, fill]);\n\n  return (\n    <SketchPaths\n      paths={paths}\n      className={className}\n      style={style}\n      onClick={onClick}\n      dataAttrs={dataAttrs}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      animate={!!resolved.animate?.drawOn}\n      clip={pathIsRenderable(d) ? d : undefined}\n    >\n      {children}\n    </SketchPaths>\n  );\n}\n","import { useMemo } from 'react';\nimport type { RoughLineProps } from '../types/primitives';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { vibeToRoughOptions } from '../vibe/resolveVibe';\nimport { allFinite, getRoughGenerator, drawableToPaths } from '../render/roughGenerator';\nimport { SketchPaths } from './SketchPaths';\n\n/** A sketchy straight line between two D3-computed coordinates. */\nexport function RoughLine({\n  x1,\n  y1,\n  x2,\n  y2,\n  vibe,\n  seed,\n  stroke,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n}: RoughLineProps) {\n  const resolved = useResolvedVibe(vibe, seed);\n\n  const paths = useMemo(() => {\n    if (!allFinite(x1, y1, x2, y2)) return [];\n    const options = vibeToRoughOptions(\n      { ...resolved, stroke: stroke ?? resolved.stroke },\n      resolved.seed,\n    );\n    const drawable = getRoughGenerator().line(x1, y1, x2, y2, options);\n    return drawableToPaths(drawable);\n  }, [x1, y1, x2, y2, resolved, stroke]);\n\n  return (\n    <SketchPaths\n      paths={paths}\n      className={className}\n      style={style}\n      onClick={onClick}\n      dataAttrs={dataAttrs}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      animate={!!resolved.animate?.drawOn}\n    />\n  );\n}\n","import { useMemo } from 'react';\nimport type { RoughRectangleProps } from '../types/primitives';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { vibeToRoughOptions } from '../vibe/resolveVibe';\nimport { allFinite, getRoughGenerator, drawableToPaths } from '../render/roughGenerator';\nimport { SketchPaths } from './SketchPaths';\n\n/** A sketchy rectangle — the workhorse for bars and flowchart nodes. */\nexport function RoughRectangle({\n  x,\n  y,\n  width,\n  height,\n  vibe,\n  seed,\n  stroke,\n  fill,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n  children,\n}: RoughRectangleProps) {\n  const resolved = useResolvedVibe(vibe, seed);\n\n  const paths = useMemo(() => {\n    if (!allFinite(x, y, width, height)) return [];\n    const shapeVibe = {\n      ...resolved,\n      stroke: stroke ?? resolved.stroke,\n      fill: fill === undefined ? resolved.fill : fill,\n    };\n    const options = vibeToRoughOptions(shapeVibe, shapeVibe.seed);\n    const drawable = getRoughGenerator().rectangle(x, y, width, height, options);\n    return drawableToPaths(drawable);\n  }, [x, y, width, height, resolved, stroke, fill]);\n\n  const clip = allFinite(x, y, width, height)\n    ? `M${x},${y}h${width}v${height}h${-width}z`\n    : undefined;\n\n  return (\n    <SketchPaths\n      paths={paths}\n      className={className}\n      style={style}\n      onClick={onClick}\n      dataAttrs={dataAttrs}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      animate={!!resolved.animate?.drawOn}\n      clip={clip}\n    >\n      {children}\n    </SketchPaths>\n  );\n}\n","import { useMemo } from 'react';\nimport type { RoughCircleProps } from '../types/primitives';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { vibeToRoughOptions } from '../vibe/resolveVibe';\nimport { allFinite, getRoughGenerator, drawableToPaths } from '../render/roughGenerator';\nimport { SketchPaths } from './SketchPaths';\n\n/** A sketchy circle — scatter points, pie wedges' guides, flowchart terminals. */\nexport function RoughCircle({\n  cx,\n  cy,\n  diameter,\n  vibe,\n  seed,\n  stroke,\n  fill,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n  children,\n}: RoughCircleProps) {\n  const resolved = useResolvedVibe(vibe, seed);\n\n  const paths = useMemo(() => {\n    if (!allFinite(cx, cy, diameter)) return [];\n    const shapeVibe = {\n      ...resolved,\n      stroke: stroke ?? resolved.stroke,\n      fill: fill === undefined ? resolved.fill : fill,\n    };\n    const options = vibeToRoughOptions(shapeVibe, shapeVibe.seed);\n    const drawable = getRoughGenerator().circle(cx, cy, diameter, options);\n    return drawableToPaths(drawable);\n  }, [cx, cy, diameter, resolved, stroke, fill]);\n\n  const r = diameter / 2;\n  const clip = allFinite(cx, cy, diameter)\n    ? `M${cx - r},${cy}a${r},${r} 0 1,0 ${diameter},0a${r},${r} 0 1,0 ${-diameter},0z`\n    : undefined;\n\n  return (\n    <SketchPaths\n      paths={paths}\n      className={className}\n      style={style}\n      onClick={onClick}\n      dataAttrs={dataAttrs}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      animate={!!resolved.animate?.drawOn}\n      clip={clip}\n    >\n      {children}\n    </SketchPaths>\n  );\n}\n","import type { RoughTextProps } from '../types/primitives';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { measureText, wrapText } from '../core/text';\n\nconst BASELINE_MAP = {\n  auto: 'auto',\n  middle: 'central',\n  hanging: 'hanging',\n} as const;\n\nconst LINE_EM = 1.2;\n\n/**\n * Vibe-aware text. The glyphs themselves aren't sketched — the vibe only swaps\n * the font family/size and supplies the fill color, so axis ticks, labels,\n * legends, and flowchart nodes all read consistently.\n */\nexport function RoughText({\n  x,\n  y,\n  children,\n  anchor = 'middle',\n  baseline = 'middle',\n  rotate,\n  vibe,\n  seed,\n  fill,\n  haloColor,\n  knockout,\n  maxWidth,\n  className,\n  style,\n  onClick,\n  dataAttrs,\n  onPointerEnter,\n  onPointerMove,\n  onPointerLeave,\n  onPointerDown,\n  onPointerUp,\n}: RoughTextProps) {\n  const resolved = useResolvedVibe(vibe, seed);\n  const lines = maxWidth\n    ? wrapText(children, maxWidth, resolved.fontSize, resolved.fontFamily)\n    : null;\n\n  // Paint a halo in the page colour behind the glyphs so labels stay legible on\n  // dark/textured backgrounds and over hachure fills. `paint-order: stroke`\n  // keeps the stroke behind the fill, so it reads as a knockout, not an outline.\n  // Callers can force one (`haloColor`) where the vibe has no background but the\n  // label still sits over a fill — e.g. pie slices.\n  // A `knockout` box already covers the glyphs, so skip the per-glyph halo —\n  // doubling them up just bleeds the stroke past the rect edge.\n  const halo = knockout ? undefined : (haloColor ?? resolved.background);\n  const haloWidth = halo ? Math.max(2, resolved.fontSize * 0.18) : undefined;\n\n  // Vertically center a wrapped block by lifting the first line half its height.\n  const content =\n    lines && lines.length > 1\n      ? lines.map((line, i) => (\n          <tspan key={i} x={x} dy={`${i === 0 ? -((lines.length - 1) * LINE_EM) / 2 : LINE_EM}em`}>\n            {line}\n          </tspan>\n        ))\n      : children;\n\n  const knockoutRect = knockout\n    ? buildKnockoutRect({\n        x,\n        y,\n        lines: lines ?? [children],\n        anchor,\n        baseline,\n        fontSize: resolved.fontSize,\n        fontFamily: resolved.fontFamily,\n        color: typeof knockout === 'string' ? knockout : (resolved.background ?? '#ffffff'),\n      })\n    : null;\n\n  const text = (\n    <text\n      x={x}\n      y={y}\n      textAnchor={anchor}\n      dominantBaseline={BASELINE_MAP[baseline]}\n      transform={rotate ? `rotate(${rotate} ${x} ${y})` : undefined}\n      fontFamily={resolved.fontFamily}\n      fontSize={resolved.fontSize}\n      fill={fill ?? resolved.stroke}\n      stroke={halo}\n      strokeWidth={haloWidth}\n      strokeLinejoin=\"round\"\n      paintOrder={halo ? 'stroke' : undefined}\n      textRendering=\"geometricPrecision\"\n      className={className}\n      style={style}\n      onClick={onClick}\n      onPointerEnter={onPointerEnter}\n      onPointerMove={onPointerMove}\n      onPointerLeave={onPointerLeave}\n      onPointerDown={onPointerDown}\n      onPointerUp={onPointerUp}\n      {...dataAttrs}\n    >\n      {content}\n    </text>\n  );\n\n  if (!knockoutRect) return text;\n  return (\n    <g>\n      {knockoutRect}\n      {text}\n    </g>\n  );\n}\n\n/**\n * Build the solid knockout rect sized to the label's measured box. The box is\n * positioned to match the text's anchor (horizontal) and baseline (vertical);\n * multi-line wrapped blocks are centred on `y`, mirroring the tspan layout.\n */\nfunction buildKnockoutRect({\n  x,\n  y,\n  lines,\n  anchor,\n  baseline,\n  fontSize,\n  fontFamily,\n  color,\n}: {\n  x: number;\n  y: number;\n  lines: string[];\n  anchor: 'start' | 'middle' | 'end';\n  baseline: 'auto' | 'middle' | 'hanging';\n  fontSize: number;\n  fontFamily: string;\n  color: string;\n}) {\n  const width = lines.reduce(\n    (max, line) => Math.max(max, measureText(line, fontSize, fontFamily).width),\n    0,\n  );\n  const lineHeight = fontSize * LINE_EM;\n  const blockHeight = Math.max(1, lines.length) * lineHeight;\n  const padX = fontSize * 0.18;\n  const padY = fontSize * 0.06;\n\n  const left = anchor === 'middle' ? x - width / 2 : anchor === 'end' ? x - width : x;\n\n  // Multi-line blocks are vertically centred on `y` regardless of baseline (the\n  // tspan layout lifts the first line). Single lines follow their baseline.\n  let top: number;\n  if (lines.length > 1) top = y - blockHeight / 2;\n  else if (baseline === 'middle') top = y - lineHeight / 2;\n  else if (baseline === 'hanging') top = y;\n  else top = y - fontSize * 0.8; // alphabetic baseline sits near the bottom\n\n  return (\n    <rect\n      x={left - padX}\n      y={top - padY}\n      width={width + padX * 2}\n      height={blockHeight + padY * 2}\n      fill={color}\n      stroke=\"none\"\n    />\n  );\n}\n","/**\n * Browser-side export helpers: serialize a live `<svg>` to a string, rasterize\n * it to a PNG blob, trigger a download, or copy it to the clipboard.\n *\n * No font embedding: the browser is already painting the chart, so any font\n * the consumer has loaded via CSS will be present. For standalone SVGs that\n * must render with no font installed, use `goldenchart/server`'s\n * `renderToSVGString` instead — that path embeds `@font-face` rules.\n */\n\nexport type ExportFormat = 'svg' | 'png';\n\nexport interface ToPngOptions {\n  /** Pixel-density multiplier for the rasterised image. Default 2. */\n  scale?: number;\n  /** Override the output width (px). Defaults to the SVG's viewport width. */\n  width?: number;\n  /** Override the output height (px). Defaults to the SVG's viewport height. */\n  height?: number;\n  /** Solid background colour painted under the SVG. Default: transparent. */\n  background?: string;\n}\n\nexport interface DownloadOptions extends ToPngOptions {\n  /** File name *without* extension; the format's extension is appended. */\n  filename: string;\n  format: ExportFormat;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Returns the SVG string for a live `<svg>` element (no font embedding). */\nexport function toSvgString(svg: SVGSVGElement): string {\n  const clone = svg.cloneNode(true) as SVGSVGElement;\n  if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', SVG_NS);\n  return new XMLSerializer().serializeToString(clone);\n}\n\n/** Default size for a rasterised SVG; honours `width`/`height` attrs or viewBox. */\nexport function svgPixelSize(svg: SVGSVGElement): { width: number; height: number } {\n  const widthAttr = svg.getAttribute('width');\n  const heightAttr = svg.getAttribute('height');\n  const w = widthAttr ? Number.parseFloat(widthAttr) : NaN;\n  const h = heightAttr ? Number.parseFloat(heightAttr) : NaN;\n  if (Number.isFinite(w) && Number.isFinite(h)) return { width: w, height: h };\n  const vb = svg.getAttribute('viewBox');\n  if (vb) {\n    const parts = vb.split(/\\s+/).map(Number);\n    if (parts.length === 4 && parts.every(Number.isFinite)) {\n      return { width: parts[2], height: parts[3] };\n    }\n  }\n  const bbox = svg.getBoundingClientRect();\n  return { width: bbox.width, height: bbox.height };\n}\n\n/** File extension for an export format (no leading dot). */\nexport function extensionFor(format: ExportFormat): string {\n  return format;\n}\n\n/** MIME type for an export format. */\nexport function mimeFor(format: ExportFormat): string {\n  return format === 'svg' ? 'image/svg+xml' : 'image/png';\n}\n\n/** Rasterises an SVG to a PNG blob via an off-DOM `<canvas>`. */\nexport async function toPng(svg: SVGSVGElement, opts: ToPngOptions = {}): Promise<Blob> {\n  const { scale = 2, background } = opts;\n  const { width: nativeWidth, height: nativeHeight } = svgPixelSize(svg);\n  const width = opts.width ?? nativeWidth;\n  const height = opts.height ?? nativeHeight;\n  if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n    throw new Error('toPng: could not determine SVG pixel size');\n  }\n\n  const svgBlob = new Blob([toSvgString(svg)], { type: 'image/svg+xml;charset=utf-8' });\n  const url = URL.createObjectURL(svgBlob);\n  try {\n    const image = await loadImage(url);\n    const canvas = document.createElement('canvas');\n    canvas.width = Math.round(width * scale);\n    canvas.height = Math.round(height * scale);\n    const ctx = canvas.getContext('2d');\n    if (!ctx) throw new Error('toPng: 2d canvas context unavailable');\n    if (background) {\n      ctx.fillStyle = background;\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n    }\n    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n    return await new Promise<Blob>((resolve, reject) => {\n      canvas.toBlob((blob) => {\n        if (blob) resolve(blob);\n        else reject(new Error('toPng: canvas.toBlob returned null'));\n      }, 'image/png');\n    });\n  } finally {\n    URL.revokeObjectURL(url);\n  }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const image = new Image();\n    image.onload = () => resolve(image);\n    image.onerror = () => reject(new Error('toPng: SVG failed to load into an Image'));\n    image.src = src;\n  });\n}\n\n/** Triggers a browser download of the chart in the chosen format. */\nexport async function downloadChart(svg: SVGSVGElement, opts: DownloadOptions): Promise<void> {\n  const blob =\n    opts.format === 'svg'\n      ? new Blob([toSvgString(svg)], { type: mimeFor('svg') })\n      : await toPng(svg, opts);\n  const url = URL.createObjectURL(blob);\n  try {\n    const anchor = document.createElement('a');\n    anchor.href = url;\n    anchor.download = `${opts.filename}.${extensionFor(opts.format)}`;\n    document.body.appendChild(anchor);\n    anchor.click();\n    anchor.remove();\n  } finally {\n    URL.revokeObjectURL(url);\n  }\n}\n\n/** Best-effort: writes the chart to the clipboard. Requires HTTPS + user gesture. */\nexport async function copyToClipboard(\n  svg: SVGSVGElement,\n  format: ExportFormat = 'svg',\n): Promise<void> {\n  const clipboard = (globalThis as { navigator?: { clipboard?: Clipboard } }).navigator?.clipboard;\n  if (!clipboard) throw new Error('copyToClipboard: navigator.clipboard unavailable');\n  if (format === 'svg') {\n    if (typeof clipboard.writeText !== 'function') {\n      throw new Error('copyToClipboard: writeText unavailable');\n    }\n    await clipboard.writeText(toSvgString(svg));\n    return;\n  }\n  if (typeof ClipboardItem === 'undefined' || typeof clipboard.write !== 'function') {\n    throw new Error('copyToClipboard: ClipboardItem unavailable; cannot copy PNG');\n  }\n  const blob = await toPng(svg);\n  await clipboard.write([new ClipboardItem({ [mimeFor('png')]: blob })]);\n}\n\n/** Convenience: find the `<svg>` inside a chart container (e.g. a ref's `current`). */\nexport function chartSvgFrom(container: Element | null): SVGSVGElement | null {\n  if (!container) return null;\n  if (container.tagName?.toLowerCase() === 'svg') return container as SVGSVGElement;\n  return container.querySelector('svg');\n}\n","import { useMemo } from 'react';\nimport { isDarkColor, paperSpeckles, type SpeckleTier } from '../core/texture';\n\nexport interface PaperTextureProps {\n  width: number;\n  height: number;\n  /** Seed for the deterministic speckle (use the resolved vibe seed). */\n  seed: number;\n  /** Speckle intensity. Defaults to the original `medium` look. */\n  tier?: SpeckleTier;\n  /** Surface colour; specks are tinted light on dark grounds and vice versa. */\n  background?: string;\n}\n\n/**\n * A faint, deterministic paper grain painted behind the data on matte vibes, so\n * the background reads as textured paper rather than a flat fill. Decorative —\n * hidden from assistive tech.\n */\nexport function PaperTexture({\n  width,\n  height,\n  seed,\n  tier = 'medium',\n  background,\n}: PaperTextureProps) {\n  const tint = isDarkColor(background) ? '#ffffff' : '#3c3223';\n  const specks = useMemo(\n    () => paperSpeckles(width, height, seed, tier),\n    [width, height, seed, tier],\n  );\n  return (\n    <g aria-hidden=\"true\">\n      {specks.map((s, i) => (\n        <circle key={i} cx={s.cx} cy={s.cy} r={s.r} fill={tint} fillOpacity={s.opacity} />\n      ))}\n    </g>\n  );\n}\n","import { useMemo } from 'react';\nimport type { CSSProperties, ReactNode, Ref } from 'react';\nimport type { VibeConfig } from '../types/vibe';\nimport type { BrandConfig, ResolvedBrandLogo } from '../types/brand';\nimport type { DataTableModel } from '../types/charts';\nimport { VibeProvider } from '../vibe/VibeProvider';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { BrandProvider } from '../brand/BrandProvider';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { PaperTexture } from './PaperTexture';\nimport { speckleTierFor } from '../core/texture';\n\nexport type { DataTableModel };\n\nexport interface SurfaceProps {\n  width: number;\n  height: number;\n  vibe?: VibeConfig;\n  /** Brand identity (palette/colours/font/logo) layered on top of the vibe. */\n  brand?: BrandConfig;\n  title?: string;\n  /** Longer accessible description, rendered as `<desc>`. */\n  description?: string;\n  /** Explicit aria-label; falls back to `title`. */\n  ariaLabel?: string;\n  /** Visually-hidden data table mirroring the chart, for screen readers. */\n  dataTable?: DataTableModel;\n  /** Tailwind classes for the outer container element. */\n  className?: string;\n  /** Tailwind classes applied to the inner `<svg>`. */\n  svgClassName?: string;\n  style?: CSSProperties;\n  children?: ReactNode;\n  /**\n   * Render only the `<svg>` (no Tailwind wrapper `<div>`) with an explicit\n   * `xmlns`, producing a standalone, serializable SVG. Used by the headless\n   * `renderToSVGString` path and the MCP server.\n   */\n  bare?: boolean;\n  /** Attach a ref to the inner `<svg>` — handy for client-side export. */\n  svgRef?: Ref<SVGSVGElement>;\n}\n\nconst DRAW_ON_CLASS = 'gc-draw-on';\n\n/**\n * CSS for the draw-on reveal, gated behind `prefers-reduced-motion`. The outline\n * dashes itself on like a pen stroke; fills fade in once the stroke is mostly\n * drawn, so the hatching no longer dashes around and the reveal reads as\n * intentional.\n */\nfunction drawOnCss(durationMs: number): string {\n  const fillDelay = Math.round(durationMs * 0.6);\n  const fillDuration = Math.round(durationMs * 0.5);\n  return (\n    `@keyframes gc-draw-on{to{stroke-dashoffset:0}}` +\n    `@keyframes gc-fade-in{from{opacity:0}to{opacity:1}}` +\n    `@media (prefers-reduced-motion: no-preference){` +\n    `.${DRAW_ON_CLASS} .gc-draw-stroke{stroke-dasharray:1;stroke-dashoffset:1;` +\n    `animation:gc-draw-on ${durationMs}ms ease forwards}` +\n    `.${DRAW_ON_CLASS} .gc-draw-fill{opacity:0;` +\n    `animation:gc-fade-in ${fillDuration}ms ease ${fillDelay}ms forwards}}`\n  );\n}\n\nconst SR_ONLY: CSSProperties = {\n  position: 'absolute',\n  width: 1,\n  height: 1,\n  padding: 0,\n  margin: -1,\n  overflow: 'hidden',\n  clip: 'rect(0 0 0 0)',\n  whiteSpace: 'nowrap',\n  border: 0,\n};\n\n/**\n * The container every chart renders into: a Tailwind-styled wrapper around a\n * single `<svg>`, with a `VibeProvider` so descendant primitives inherit the\n * aesthetic. Owns accessibility (role/title/desc/aria-label, optional data\n * table) and the optional draw-on reveal animation.\n */\nexport function Surface({\n  width,\n  height,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  dataTable,\n  className = 'inline-block max-w-full overflow-visible',\n  svgClassName = 'block h-auto w-full',\n  style,\n  children,\n  bare = false,\n  svgRef,\n}: SurfaceProps) {\n  const resolvedBrand = useMemo(() => resolveBrand(brand), [brand]);\n  const resolved = resolveVibe(vibe, resolvedBrand.vibeOverrides);\n  const drawOn = resolved.animate?.drawOn ?? false;\n  const duration = resolved.animate?.durationMs ?? 800;\n  const speckleTier = speckleTierFor(resolved.texture);\n\n  const body = drawOn ? <g className={DRAW_ON_CLASS}>{children}</g> : children;\n\n  const svg = (\n    <svg\n      ref={svgRef}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      width={width}\n      height={height}\n      className={bare ? undefined : svgClassName}\n      role=\"img\"\n      aria-label={ariaLabel ?? title}\n    >\n      {title ? <title>{title}</title> : null}\n      {description ? <desc>{description}</desc> : null}\n      {drawOn ? <style dangerouslySetInnerHTML={{ __html: drawOnCss(duration) }} /> : null}\n      {resolved.background ? (\n        <rect x={0} y={0} width={width} height={height} fill={resolved.background} />\n      ) : null}\n      {speckleTier ? (\n        <PaperTexture\n          width={width}\n          height={height}\n          seed={resolved.seed}\n          tier={speckleTier}\n          background={resolved.background}\n        />\n      ) : null}\n      {body}\n      {/* Logo sits above the data and outside the draw-on group so it never animates. */}\n      {resolvedBrand.logo ? (\n        <BrandLogoMark logo={resolvedBrand.logo} surfaceWidth={width} surfaceHeight={height} />\n      ) : null}\n    </svg>\n  );\n\n  return (\n    <BrandProvider brand={brand}>\n      <VibeProvider vibe={vibe} brandOverrides={resolvedBrand.vibeOverrides}>\n        {bare ? (\n          svg\n        ) : (\n          <div className={className} style={style}>\n            {svg}\n            {dataTable ? <DataTable model={dataTable} /> : null}\n          </div>\n        )}\n      </VibeProvider>\n    </BrandProvider>\n  );\n}\n\n/** Pin the brand logo into a corner, inset by its margin, scaled to fit undistorted. */\nfunction BrandLogoMark({\n  logo,\n  surfaceWidth,\n  surfaceHeight,\n}: {\n  logo: ResolvedBrandLogo;\n  surfaceWidth: number;\n  surfaceHeight: number;\n}) {\n  const x = logo.position.endsWith('right') ? surfaceWidth - logo.width - logo.margin : logo.margin;\n  const y = logo.position.startsWith('bottom')\n    ? surfaceHeight - logo.height - logo.margin\n    : logo.margin;\n  return (\n    <image\n      href={logo.src}\n      x={x}\n      y={y}\n      width={logo.width}\n      height={logo.height}\n      opacity={logo.opacity}\n      preserveAspectRatio=\"xMidYMid meet\"\n    />\n  );\n}\n\nfunction DataTable({ model }: { model: DataTableModel }) {\n  return (\n    <table style={SR_ONLY}>\n      {model.caption ? <caption>{model.caption}</caption> : null}\n      <thead>\n        <tr>\n          {model.columns.map((c) => (\n            <th key={c} scope=\"col\">\n              {c}\n            </th>\n          ))}\n        </tr>\n      </thead>\n      <tbody>\n        {model.rows.map((row, i) => (\n          <tr key={i}>\n            {row.map((cell, j) => (\n              <td key={j}>{cell}</td>\n            ))}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nexport interface ResponsiveSize {\n  width: number;\n  height: number;\n}\n\nexport interface ResponsiveContainerProps {\n  /** Render-prop receiving the measured size in pixels. */\n  children: (size: ResponsiveSize) => ReactNode;\n  /** Width-to-height ratio used to derive `height` from observed width. Default 16/9. */\n  aspectRatio?: number;\n  /** Lower bound on the emitted width. */\n  minWidth?: number;\n  /** Lower bound on the emitted height. */\n  minHeight?: number;\n  /** Upper bound on the emitted height. */\n  maxHeight?: number;\n  /** Resize debounce in ms. Default 80. */\n  debounceMs?: number;\n  /**\n   * Initial size used during SSR / before the first measurement. When omitted,\n   * the container renders nothing until it has measured its parent — which is\n   * the safe default but means a one-frame layout shift in the browser.\n   */\n  defaultSize?: ResponsiveSize;\n  className?: string;\n  style?: CSSProperties;\n}\n\nfunction clamp(value: number, min?: number, max?: number): number {\n  let out = value;\n  if (typeof min === 'number') out = Math.max(out, min);\n  if (typeof max === 'number') out = Math.min(out, max);\n  return out;\n}\n\n/**\n * Pure size derivation: takes a parent's observed rect plus the container's\n * `aspectRatio` / clamp options and returns the size that will be passed to\n * the render-prop. Extracted so we can unit-test it without mounting React.\n */\nexport function computeResponsiveSize(\n  rect: { width: number; height: number },\n  opts: {\n    aspectRatio?: number;\n    minWidth?: number;\n    minHeight?: number;\n    maxHeight?: number;\n  } = {},\n): ResponsiveSize {\n  const { aspectRatio = 16 / 9, minWidth, minHeight, maxHeight } = opts;\n  const width = clamp(rect.width, minWidth);\n  const derived = width / Math.max(aspectRatio, 0.01);\n  const observed = rect.height > 1 ? rect.height : derived;\n  const height = clamp(observed, minHeight, maxHeight);\n  return { width, height };\n}\n\n/**\n * Width-driven render-prop wrapper. Measures its own `<div>` with\n * `ResizeObserver` and hands `{ width, height }` to its child render fn so\n * GoldenChart components — which require explicit pixel dimensions — fill the\n * available width.\n *\n * SSR-safe: when no `defaultSize` is provided the container renders nothing\n * until the first measurement. Pass `defaultSize` to render markup during SSR\n * (it will be replaced by the measured size on hydration).\n */\nexport function ResponsiveContainer({\n  children,\n  aspectRatio = 16 / 9,\n  minWidth,\n  minHeight,\n  maxHeight,\n  debounceMs = 80,\n  defaultSize,\n  className,\n  style,\n}: ResponsiveContainerProps) {\n  const ref = useRef<HTMLDivElement | null>(null);\n  const [size, setSize] = useState<ResponsiveSize | null>(defaultSize ?? null);\n\n  useEffect(() => {\n    const node = ref.current;\n    if (!node || typeof ResizeObserver === 'undefined') return;\n\n    let timer: ReturnType<typeof setTimeout> | null = null;\n    const apply = (rect: { width: number; height: number }) => {\n      setSize(computeResponsiveSize(rect, { aspectRatio, minWidth, minHeight, maxHeight }));\n    };\n\n    const observer = new ResizeObserver((entries) => {\n      const entry = entries[0];\n      if (!entry) return;\n      const rect = entry.contentRect;\n      if (debounceMs > 0) {\n        if (timer) clearTimeout(timer);\n        timer = setTimeout(() => apply(rect), debounceMs);\n      } else {\n        apply(rect);\n      }\n    });\n    observer.observe(node);\n    return () => {\n      observer.disconnect();\n      if (timer) clearTimeout(timer);\n    };\n  }, [aspectRatio, minWidth, minHeight, maxHeight, debounceMs]);\n\n  return (\n    <div ref={ref} className={className} style={{ width: '100%', ...style }}>\n      {size ? children(size) : null}\n    </div>\n  );\n}\n","import type { ChartDatum, MultiSeriesDatum, Series } from '../types/charts';\n\n/**\n * Fallback `<desc>` text generators. Each returns a short sentence summarising\n * the chart's shape so screen-reader users get *something* useful when a\n * consumer doesn't supply an explicit `description`. Kept deterministic and\n * dependency-free; charts call these in the same expression that passes\n * `description` to `<Surface>`.\n */\n\nfunction isMultiSeries(data: ChartDatum[] | MultiSeriesDatum[]): data is MultiSeriesDatum[] {\n  return data.length > 0 && 'values' in (data[0] as object);\n}\n\nfunction fmt(n: number): string {\n  if (!Number.isFinite(n)) return String(n);\n  if (Number.isInteger(n)) return String(n);\n  return n.toFixed(2).replace(/\\.?0+$/, '');\n}\n\nfunction rangeOf(values: number[]): string {\n  if (values.length === 0) return '';\n  let min = values[0];\n  let max = values[0];\n  for (const v of values) {\n    if (v < min) min = v;\n    if (v > max) max = v;\n  }\n  return min === max ? `value ${fmt(min)}` : `values from ${fmt(min)} to ${fmt(max)}`;\n}\n\nexport function describeBars(data: ChartDatum[] | MultiSeriesDatum[]): string {\n  if (data.length === 0) return 'Bar chart with no data.';\n  if (isMultiSeries(data)) {\n    const seriesKeys = new Set<string>();\n    const allValues: number[] = [];\n    for (const d of data) {\n      for (const k of Object.keys(d.values)) seriesKeys.add(k);\n      for (const v of Object.values(d.values)) allValues.push(v);\n    }\n    return (\n      `Bar chart with ${data.length} categor${data.length === 1 ? 'y' : 'ies'} ` +\n      `across ${seriesKeys.size} series, ${rangeOf(allValues)}.`\n    );\n  }\n  const single = data as ChartDatum[];\n  return (\n    `Bar chart with ${single.length} categor${single.length === 1 ? 'y' : 'ies'}, ` +\n    `${rangeOf(single.map((d) => d.value))}.`\n  );\n}\n\nexport function describeSeries(series: Series[], kind: 'Line' | 'Area' = 'Line'): string {\n  if (series.length === 0) return `${kind} chart with no data.`;\n  const total = series.reduce((s, d) => s + d.points.length, 0);\n  const ys = series.flatMap((s) => s.points.map((p) => p.y));\n  return (\n    `${kind} chart with ${series.length} series and ${total} ` +\n    `point${total === 1 ? '' : 's'}, y ${rangeOf(ys)}.`\n  );\n}\n\nexport function describePie(data: ChartDatum[]): string {\n  if (data.length === 0) return 'Pie chart with no data.';\n  const total = data.reduce((s, d) => s + d.value, 0);\n  return (\n    `Pie chart with ${data.length} slice${data.length === 1 ? '' : 's'} ` +\n    `totaling ${fmt(total)}.`\n  );\n}\n\n/** Scatter takes a flat point array (no series wrapper); describes count only. */\nexport function describeScatter(data: { x: number; y: number }[]): string {\n  if (data.length === 0) return 'Scatter plot with no data.';\n  return `Scatter plot with ${data.length} point${data.length === 1 ? '' : 's'}.`;\n}\n\n/** Pluralise a noun by count: `count(2, 'node')` → `'2 nodes'`. */\nfunction count(n: number, noun: string, plural = `${noun}s`): string {\n  return `${n} ${n === 1 ? noun : plural}`;\n}\n\n// Diagram-family fallbacks describe topology by count only — the field names\n// vary by chart (FlowEdge from/to, Sankey source/target), so these accept any\n// array and read just its length.\n\n/**\n * Node/edge diagrams (Flowchart, OrgChart, MindMap, ArchitectureDiagram all go\n * through `<Diagram>`). Counts only — the topology is the message.\n */\nexport function describeDiagram(nodes: readonly unknown[], edges: readonly unknown[] = []): string {\n  if (nodes.length === 0) return 'Diagram with no nodes.';\n  return `Diagram with ${count(nodes.length, 'node')} and ${count(edges.length, 'edge')}.`;\n}\n\n/** Entity-relationship diagrams: entity + relationship counts. */\nexport function describeER(\n  entities: readonly unknown[],\n  relationships: readonly unknown[] = [],\n): string {\n  if (entities.length === 0) return 'Entity-relationship diagram with no entities.';\n  return (\n    `Entity-relationship diagram with ${count(entities.length, 'entity', 'entities')} ` +\n    `and ${count(relationships.length, 'relationship')}.`\n  );\n}\n\n/** Weighted flow (Sankey): node + link counts. */\nexport function describeSankey(nodes: readonly unknown[], links: readonly unknown[] = []): string {\n  if (nodes.length === 0) return 'Sankey diagram with no nodes.';\n  return `Sankey diagram with ${count(nodes.length, 'node')} and ${count(links.length, 'link')}.`;\n}\n","/** Interpolation helpers for animated data transitions. Pure: no DOM, no rAF. */\n\n/** Linear blend between `a` and `b` at fraction `t` (0..1). */\nexport function lerp(a: number, b: number, t: number): number {\n  return a + (b - a) * t;\n}\n\n/**\n * Blend two numeric maps key-by-key. Keys missing from `from` snap to the `to`\n * value (an entering mark has no prior position to ease from).\n */\nexport function interpolateNumberMap(\n  from: Record<string, number>,\n  to: Record<string, number>,\n  t: number,\n): Record<string, number> {\n  const out: Record<string, number> = {};\n  for (const k of Object.keys(to)) {\n    out[k] = k in from ? lerp(from[k], to[k], t) : to[k];\n  }\n  return out;\n}\n\n/** Standard ease-in-out cubic; pins 0->0 and 1->1. */\nexport function easeInOutCubic(t: number): number {\n  return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n}\n\ntype Datum = { label: string; value: number };\ntype Pt = { x: number; y: number };\ntype Ser = { id: string; points: Pt[] };\n\nconst isDatumArray = (v: unknown): v is Datum[] =>\n  Array.isArray(v) &&\n  v.every((d) => d && typeof d.label === 'string' && typeof d.value === 'number');\nconst isSeriesArray = (v: unknown): v is Ser[] =>\n  Array.isArray(v) && v.every((s) => s && typeof s.id === 'string' && Array.isArray(s.points));\n\n/**\n * Interpolate a chart's data prop between two snapshots at fraction `t`.\n * Handles `{label,value}[]` (bar/pie, matched by label) and `{id,points}[]`\n * (line/area, matched by id then point index). Other shapes pass through as\n * `to`. Entering items (absent in `from`) snap to their target.\n */\nexport function interpolateChartData(from: unknown, to: unknown, t: number): unknown {\n  if (isDatumArray(from) && isDatumArray(to)) {\n    const prev = new Map(from.map((d) => [d.label, d.value]));\n    return to.map((d) => ({ ...d, value: lerp(prev.get(d.label) ?? d.value, d.value, t) }));\n  }\n  if (isSeriesArray(from) && isSeriesArray(to)) {\n    const prev = new Map(from.map((s) => [s.id, s.points]));\n    return to.map((s) => {\n      const pp = prev.get(s.id);\n      return {\n        ...s,\n        points: s.points.map((p, i) => ({ x: p.x, y: pp && pp[i] ? lerp(pp[i].y, p.y, t) : p.y })),\n      };\n    });\n  }\n  return to;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { easeInOutCubic, interpolateChartData } from '../core/transition';\n\n/** True when the user has requested reduced motion (SSR-safe). */\nexport function prefersReducedMotion(): boolean {\n  return (\n    typeof window !== 'undefined' &&\n    !!window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches\n  );\n}\n\n/**\n * Tween a chart's data prop whenever its identity changes, over `durationMs`,\n * easing the interpolation (via the pure `interpolateChartData`). Snaps\n * instantly when disabled or under `prefers-reduced-motion`. Returns the data to\n * feed the chart this frame.\n */\nexport function useDataTransition<T>(data: T, durationMs = 500, enabled = true): T {\n  const [frame, setFrame] = useState<T>(data);\n  const prev = useRef<T>(data);\n\n  useEffect(() => {\n    if (!enabled || prefersReducedMotion() || prev.current === data) {\n      setFrame(data);\n      prev.current = data;\n      return;\n    }\n    const from = prev.current;\n    const start = performance.now();\n    let raf = 0;\n    const tick = (now: number) => {\n      const t = Math.min(1, (now - start) / durationMs);\n      setFrame(interpolateChartData(from, data, easeInOutCubic(t)) as T);\n      if (t < 1) raf = requestAnimationFrame(tick);\n      else prev.current = data;\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [data, durationMs, enabled]);\n\n  return frame;\n}\n","import type { MultiSeriesDatum } from '../types/charts';\n\n/**\n * Pure helpers for grouped/stacked multi-series bar layouts. Geometry only —\n * the component turns these data-space spans into pixels via the scales.\n */\n\n/** Series keys in first-seen order across the data. */\nexport function seriesKeysOf(data: MultiSeriesDatum[]): string[] {\n  const keys: string[] = [];\n  const seen = new Set<string>();\n  for (const d of data) {\n    for (const k of Object.keys(d.values)) {\n      if (!seen.has(k)) {\n        seen.add(k);\n        keys.push(k);\n      }\n    }\n  }\n  return keys;\n}\n\nexport interface StackSegment {\n  label: string;\n  key: string;\n  start: number;\n  end: number;\n  value: number;\n}\n\n/** Cumulative [start,end] spans per category, stacked in `keys` order. */\nexport function stackLayout(data: MultiSeriesDatum[], keys: string[]): StackSegment[] {\n  const segments: StackSegment[] = [];\n  for (const d of data) {\n    let cursor = 0;\n    for (const key of keys) {\n      const value = d.values[key] ?? 0;\n      segments.push({ label: d.label, key, start: cursor, end: cursor + value, value });\n      cursor += value;\n    }\n  }\n  return segments;\n}\n\n/** Largest stacked total across categories (the stacked y-domain max). */\nexport function stackMax(data: MultiSeriesDatum[], keys: string[]): number {\n  return Math.max(0, ...data.map((d) => keys.reduce((sum, k) => sum + (d.values[k] ?? 0), 0)));\n}\n\n/** Largest single value across categories (the grouped y-domain max). */\nexport function groupMax(data: MultiSeriesDatum[], keys: string[]): number {\n  return Math.max(0, ...data.flatMap((d) => keys.map((k) => d.values[k] ?? 0)));\n}\n","import type { PlotArea } from '../types/geometry';\nimport type { AnyScale, Tick } from '../core/ticks';\nimport { ticksForScale } from '../core/ticks';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughText } from '../primitives/RoughText';\n\nexport type AxisOrientation = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface AxisProps {\n  scale: AnyScale;\n  orientation: AxisOrientation;\n  plot: PlotArea;\n  ticks?: number;\n  tickFormat?: (value: string | number) => string;\n  /** Length of each tick mark in px. */\n  tickSize?: number;\n}\n\n/**\n * A vibe-aware axis. Works in absolute surface coordinates, so charts can place\n * it without a transform as long as their scales are ranged in those same\n * coordinates. Tick positions come from the DOM-free `ticksForScale` helper.\n */\nexport function Axis({ scale, orientation, plot, ticks, tickFormat, tickSize = 6 }: AxisProps) {\n  const marks = ticksForScale(scale, ticks);\n  const format = tickFormat ?? ((v: string | number) => String(v));\n  const horizontal = orientation === 'top' || orientation === 'bottom';\n\n  if (horizontal) {\n    const y = orientation === 'bottom' ? plot.y + plot.height : plot.y;\n    const dir = orientation === 'bottom' ? 1 : -1;\n    return (\n      <g>\n        <RoughLine x1={plot.x} y1={y} x2={plot.x + plot.width} y2={y} />\n        {marks.map((t: Tick) => (\n          <g key={String(t.value)}>\n            <RoughLine x1={t.offset} y1={y} x2={t.offset} y2={y + dir * tickSize} />\n            <RoughText\n              x={t.offset}\n              y={y + dir * (tickSize + 6)}\n              anchor=\"middle\"\n              baseline={orientation === 'bottom' ? 'hanging' : 'auto'}\n            >\n              {format(t.value)}\n            </RoughText>\n          </g>\n        ))}\n      </g>\n    );\n  }\n\n  const x = orientation === 'left' ? plot.x : plot.x + plot.width;\n  const dir = orientation === 'left' ? -1 : 1;\n  return (\n    <g>\n      <RoughLine x1={x} y1={plot.y} x2={x} y2={plot.y + plot.height} />\n      {marks.map((t: Tick) => (\n        <g key={String(t.value)}>\n          <RoughLine x1={x} y1={t.offset} x2={x + dir * tickSize} y2={t.offset} />\n          <RoughText\n            x={x + dir * (tickSize + 4)}\n            y={t.offset}\n            anchor={orientation === 'left' ? 'end' : 'start'}\n            baseline=\"middle\"\n          >\n            {format(t.value)}\n          </RoughText>\n        </g>\n      ))}\n    </g>\n  );\n}\n","import type { PlotArea } from '../types/geometry';\nimport type { AnyScale } from '../core/ticks';\nimport { ticksForScale } from '../core/ticks';\nimport { isDarkColor } from '../core/texture';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { useVibeContext } from '../vibe/VibeProvider';\nimport type { VibeConfig } from '../types/vibe';\n\nexport interface GridProps {\n  plot: PlotArea;\n  xScale?: AnyScale;\n  yScale?: AnyScale;\n  ticks?: number;\n}\n\n/**\n * Faint gridlines aligned to axis ticks. Derives a calmer vibe from context so\n * the grid never competes with the data — same preset, a touch less roughness,\n * and a faint hairline whose colour follows the background (a dark line on light\n * vibes, a light line on dark vibes) so it never blows out on dark themes.\n */\nexport function Grid({ plot, xScale, yScale, ticks }: GridProps) {\n  const vibe = useVibeContext();\n  const onDark = isDarkColor(vibe.background);\n  const gridVibe: VibeConfig = {\n    preset: vibe.preset,\n    // Always visibly hand-drawn, regardless of how crisp the preset is: floor at\n    // 1.0 so even low-roughness presets get a sketched grid, capped at 1.4 so it\n    // never overpowers the data.\n    roughness: Math.min(Math.max(vibe.roughness, 1.0), 1.4),\n    strokeWidth: 0.75,\n    // Light line on dark grounds, dark line on light grounds — kept faint via\n    // opacity so the grid stays subordinate to the data on every theme.\n    stroke: onDark ? '#ffffff' : '#1f2937',\n  };\n  const faint = { opacity: onDark ? 0.16 : 0.14 } as const;\n\n  return (\n    <g>\n      {xScale &&\n        ticksForScale(xScale, ticks).map((t) => (\n          <RoughLine\n            key={`vx-${t.value}`}\n            x1={t.offset}\n            y1={plot.y}\n            x2={t.offset}\n            y2={plot.y + plot.height}\n            vibe={gridVibe}\n            style={faint}\n          />\n        ))}\n      {yScale &&\n        ticksForScale(yScale, ticks).map((t) => (\n          <RoughLine\n            key={`hy-${t.value}`}\n            x1={plot.x}\n            y1={t.offset}\n            x2={plot.x + plot.width}\n            y2={t.offset}\n            vibe={gridVibe}\n            style={faint}\n          />\n        ))}\n    </g>\n  );\n}\n","import { measureText } from './text';\n\n/**\n * Legend layout. Pure and DOM-free: flow a set of swatch+label items into one or\n * more centred horizontal rows that fit within `availableWidth`, wrapping as\n * needed. Charts use the returned `height` to reserve a band below the plot and\n * render each placed item at its `x,y`. Keeping this separate from the renderer\n * makes the (fiddly) wrapping/centering logic testable on its own.\n */\n\nexport interface LegendItem {\n  label: string;\n  color: string;\n}\n\nexport interface PlacedLegendItem extends LegendItem {\n  /** Left edge of the swatch, relative to the legend block. */\n  x: number;\n  /** Vertical centre of the row, relative to the legend block. */\n  y: number;\n}\n\nexport interface LegendLayout {\n  rows: PlacedLegendItem[];\n  width: number;\n  height: number;\n}\n\nexport interface LegendLayoutOptions {\n  swatchSize?: number;\n  /** Gap between a swatch and its label. */\n  swatchGap?: number;\n  /** Gap between items in a row. */\n  itemGap?: number;\n  rowHeight?: number;\n  fontSize?: number;\n  fontFamily?: string;\n}\n\nexport function layoutLegend(\n  items: LegendItem[],\n  availableWidth: number,\n  opts: LegendLayoutOptions = {},\n): LegendLayout {\n  if (items.length === 0) return { rows: [], width: 0, height: 0 };\n\n  const {\n    swatchSize = 14,\n    swatchGap = 6,\n    itemGap = 18,\n    rowHeight = 22,\n    fontSize = 14,\n    fontFamily = 'sans-serif',\n  } = opts;\n  const itemWidth = (it: LegendItem) =>\n    swatchSize + swatchGap + measureText(it.label, fontSize, fontFamily).width;\n\n  // Greedily group items into rows that fit the available width.\n  const grouped: LegendItem[][] = [];\n  let current: LegendItem[] = [];\n  let currentW = 0;\n  for (const it of items) {\n    const w = itemWidth(it);\n    const added = current.length ? itemGap + w : w;\n    if (current.length && currentW + added > availableWidth) {\n      grouped.push(current);\n      current = [];\n      currentW = 0;\n    }\n    current.push(it);\n    currentW += current.length === 1 ? w : itemGap + w;\n  }\n  if (current.length) grouped.push(current);\n\n  // Place each row centred within the available width.\n  const rows: PlacedLegendItem[] = [];\n  grouped.forEach((row, r) => {\n    const widths = row.map(itemWidth);\n    const rowW = widths.reduce((a, b) => a + b, 0) + itemGap * (row.length - 1);\n    let x = Math.max(0, (availableWidth - rowW) / 2);\n    const y = r * rowHeight + rowHeight / 2;\n    row.forEach((it, i) => {\n      rows.push({ ...it, x, y });\n      x += widths[i] + itemGap;\n    });\n  });\n\n  return { rows, width: availableWidth, height: grouped.length * rowHeight };\n}\n","import { createContext, useContext } from 'react';\n\nexport interface SeriesVisibility {\n  hidden: ReadonlySet<string>;\n  toggle: (series: string) => void;\n  /** When true, the Legend renders focusable toggle controls. Off by default so\n   *  the static/SSR/MCP render emits no extra interactive attributes. */\n  interactive: boolean;\n}\n\n/** No-op default: hides nothing, toggles nothing, not interactive. Keeps the\n *  static/SSR/MCP render byte-identical until an interactive provider mounts. */\nexport const defaultSeriesVisibility: SeriesVisibility = {\n  hidden: new Set(),\n  toggle: () => {},\n  interactive: false,\n};\n\nconst Ctx = createContext<SeriesVisibility>(defaultSeriesVisibility);\nexport const SeriesVisibilityProvider = Ctx.Provider;\n\n/** Read by charts and `Legend` in their own body (descendants of the provider\n *  that `InteractiveChart` mounts around the chart). */\nexport function useSeriesVisibility(): SeriesVisibility {\n  return useContext(Ctx);\n}\n","import type { KeyboardEvent } from 'react';\nimport { layoutLegend } from '../core/legend';\nimport type { LegendItem } from '../core/legend';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { useSeriesVisibility } from './SeriesVisibilityContext';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughText } from '../primitives/RoughText';\n\nexport type { LegendItem };\n\nexport interface LegendProps {\n  items: LegendItem[];\n  /** Top-left of the legend block. */\n  x: number;\n  y: number;\n  /** Width to centre/wrap the items within (typically the plot width). */\n  width: number;\n}\n\nconst SWATCH = 14;\nconst SWATCH_GAP = 6;\n\n/**\n * Vibe-aware legend: swatch + label per item, flowed into centred rows that wrap\n * within `width`. Lay it out below the plot (the chart reserves the band) so it\n * never overlaps the data. Geometry comes from the pure `layoutLegend`.\n */\nexport function Legend({ items, x, y, width }: LegendProps) {\n  const resolved = useResolvedVibe();\n  const { hidden, toggle, interactive } = useSeriesVisibility();\n  const layout = layoutLegend(items, width, {\n    swatchSize: SWATCH,\n    swatchGap: SWATCH_GAP,\n    fontSize: resolved.fontSize,\n    fontFamily: resolved.fontFamily,\n  });\n  return (\n    <g>\n      {layout.rows.map((it, i) => {\n        const isHidden = hidden.has(it.label);\n        // Interactive attributes are gated so the static (non-interactive) render\n        // is byte-identical; dimming is keyed on `hidden`, empty by default.\n        const interactiveProps = interactive\n          ? {\n              role: 'button' as const,\n              tabIndex: 0,\n              'aria-pressed': !isHidden,\n              style: { cursor: 'pointer' as const },\n              onClick: () => toggle(it.label),\n              onKeyDown: (e: KeyboardEvent) => {\n                if (e.key === 'Enter' || e.key === ' ') {\n                  e.preventDefault();\n                  toggle(it.label);\n                }\n              },\n            }\n          : {};\n        return (\n          <g key={it.label} opacity={isHidden ? 0.4 : undefined} {...interactiveProps}>\n            <RoughRectangle\n              x={x + it.x}\n              y={y + it.y - SWATCH / 2}\n              width={SWATCH}\n              height={SWATCH}\n              fill={it.color}\n              seed={i + 1}\n            />\n            <RoughText\n              x={x + it.x + SWATCH + SWATCH_GAP}\n              y={y + it.y}\n              anchor=\"start\"\n              baseline=\"middle\"\n            >\n              {it.label}\n            </RoughText>\n          </g>\n        );\n      })}\n    </g>\n  );\n}\n","import type { PlotArea } from '../types/geometry';\nimport type { Annotation } from '../core/annotations';\nimport { arrowHeadPath } from '../core/shapes';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughCircle } from '../primitives/RoughCircle';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\n\nexport type { Annotation };\n\nexport interface AnnotationsProps {\n  annotations: Annotation[];\n  plot: PlotArea;\n  /** Linear data→pixel scale for the x axis (omitted for band-x charts). */\n  xScale?: (value: number) => number;\n  yScale?: (value: number) => number;\n}\n\n// A muted slate so reference lines/callouts read as chart furniture, distinct\n// from the (palette-coloured) data series. Reference lines are also dashed.\nconst LINE_COLOR = '#64748b';\nconst REF_DASH = { strokeDasharray: '6 5' } as const;\nconst BAND_VIBE = { roughness: 0.8, fillStyle: 'hachure', fillWeight: 0.5 } as const;\n\n/**\n * Overlay annotations on a cartesian chart: reference lines/bands, callouts, and\n * circled points. Renders only the annotations whose required scale is present,\n * so it degrades gracefully on band-axis charts.\n */\nexport function Annotations({ annotations, plot, xScale, yScale }: AnnotationsProps) {\n  return (\n    <g>\n      {annotations.map((a, i) => {\n        const seed = i + 1;\n        const color = a.color ?? LINE_COLOR;\n\n        if (a.kind === 'y-line' && yScale) {\n          const y = yScale(a.value);\n          return (\n            <g key={i}>\n              <RoughLine\n                x1={plot.x}\n                y1={y}\n                x2={plot.x + plot.width}\n                y2={y}\n                stroke={color}\n                style={REF_DASH}\n                seed={seed}\n              />\n              {a.label && (\n                <RoughText\n                  x={plot.x + plot.width}\n                  y={y - 4}\n                  anchor=\"end\"\n                  baseline=\"auto\"\n                  fill={color}\n                >\n                  {a.label}\n                </RoughText>\n              )}\n            </g>\n          );\n        }\n\n        if (a.kind === 'x-line' && xScale) {\n          const x = xScale(a.value);\n          return (\n            <g key={i}>\n              <RoughLine\n                x1={x}\n                y1={plot.y}\n                x2={x}\n                y2={plot.y + plot.height}\n                stroke={color}\n                style={REF_DASH}\n                seed={seed}\n              />\n              {a.label && (\n                <RoughText x={x + 4} y={plot.y + 4} anchor=\"start\" baseline=\"hanging\" fill={color}>\n                  {a.label}\n                </RoughText>\n              )}\n            </g>\n          );\n        }\n\n        if (a.kind === 'y-band' && yScale) {\n          const y0 = yScale(a.from);\n          const y1 = yScale(a.to);\n          return (\n            <RoughRectangle\n              key={i}\n              x={plot.x}\n              y={Math.min(y0, y1)}\n              width={plot.width}\n              height={Math.abs(y1 - y0)}\n              fill={color}\n              vibe={BAND_VIBE}\n              seed={seed}\n            />\n          );\n        }\n\n        if (a.kind === 'x-band' && xScale) {\n          const x0 = xScale(a.from);\n          const x1 = xScale(a.to);\n          return (\n            <RoughRectangle\n              key={i}\n              x={Math.min(x0, x1)}\n              y={plot.y}\n              width={Math.abs(x1 - x0)}\n              height={plot.height}\n              fill={color}\n              vibe={BAND_VIBE}\n              seed={seed}\n            />\n          );\n        }\n\n        if (a.kind === 'circle' && xScale && yScale) {\n          const cx = xScale(a.x);\n          const cy = yScale(a.y);\n          return (\n            <g key={i}>\n              <RoughCircle\n                cx={cx}\n                cy={cy}\n                diameter={a.r * 2}\n                fill={null}\n                stroke={color}\n                seed={seed}\n              />\n              {a.label && (\n                <RoughText x={cx} y={cy - a.r - 4} anchor=\"middle\" baseline=\"auto\" fill={color}>\n                  {a.label}\n                </RoughText>\n              )}\n            </g>\n          );\n        }\n\n        if (a.kind === 'segment' && xScale && yScale) {\n          const x1 = xScale(a.x1);\n          const y1 = yScale(a.y1);\n          const x2 = xScale(a.x2);\n          const y2 = yScale(a.y2);\n          return (\n            <g key={i}>\n              <RoughLine x1={x1} y1={y1} x2={x2} y2={y2} stroke={color} seed={seed} />\n              {a.label && (\n                <RoughText x={x2} y={y2 - 4} anchor=\"end\" baseline=\"auto\" fill={color}>\n                  {a.label}\n                </RoughText>\n              )}\n            </g>\n          );\n        }\n\n        if (a.kind === 'point-callout' && xScale && yScale) {\n          const px = xScale(a.x);\n          const py = yScale(a.y);\n          const tx = px + (a.dx ?? 28);\n          const ty = py + (a.dy ?? -28);\n          return (\n            <g key={i}>\n              <RoughPath d={`M${tx},${ty} L${px},${py}`} stroke={color} fill={null} seed={seed} />\n              <RoughPath\n                d={arrowHeadPath({ x: tx, y: ty }, { x: px, y: py })}\n                stroke={color}\n                fill={null}\n                seed={seed}\n              />\n              <RoughText\n                x={tx}\n                y={ty}\n                anchor={tx >= px ? 'start' : 'end'}\n                baseline=\"middle\"\n                fill={color}\n              >\n                {a.text}\n              </RoughText>\n            </g>\n          );\n        }\n\n        return null;\n      })}\n    </g>\n  );\n}\n","import type { MarkMeta } from '../types/interaction';\n\n/**\n * Serialize MarkMeta to an inert `data-*` attribute bag for a primitive's `<g>`.\n * DOM-free, so it is safe to call from the static (server/MCP) render path.\n */\nexport function markAttrs(meta: MarkMeta): Record<string, string> {\n  const attrs: Record<string, string> = {\n    'data-gc-mark': meta.kind,\n    'data-gc-index': String(meta.index),\n    'data-gc-cx': String(meta.cx),\n    'data-gc-cy': String(meta.cy),\n    'data-gc-value':\n      typeof meta.value === 'number' ? String(meta.value) : JSON.stringify(meta.value),\n  };\n  if (meta.series !== undefined) attrs['data-gc-series'] = meta.series;\n  if (meta.label !== undefined) attrs['data-gc-label'] = meta.label;\n  return attrs;\n}\n","import { useMemo } from 'react';\nimport type {\n  AxisFormat,\n  BaseChartProps,\n  ChartDatum,\n  DataTableModel,\n  MultiSeriesDatum,\n} from '../types/charts';\nimport { bandScale, linearScale, extentOf } from '../core/scales';\nimport { resolveDomain, tickFormatter } from '../core/axisFormat';\nimport { getPlotArea } from '../core/geometry';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { datumTable } from '../core/dataTable';\nimport { describeBars } from '../core/a11yDescribe';\nimport { useDataTransition } from '../interactive/useDataTransition';\nimport { groupMax, seriesKeysOf, stackLayout, stackMax } from '../core/stack';\nimport { Surface } from './Surface';\nimport { Axis } from './Axis';\nimport { Grid } from './Grid';\nimport { Legend } from './Legend';\nimport { layoutLegend } from '../core/legend';\nimport type { LegendItem } from '../core/legend';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Annotations } from './Annotations';\nimport type { Annotation } from './Annotations';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { useVibeContext } from '../vibe/VibeProvider';\nimport { markAttrs } from '../core/interaction';\nimport { useSeriesVisibility } from './SeriesVisibilityContext';\n\nexport type BarMode = 'single' | 'grouped' | 'stacked';\n\nexport interface BarChartProps extends BaseChartProps {\n  data: ChartDatum[] | MultiSeriesDatum[];\n  /** `single` (default), `grouped` (side-by-side) or `stacked` multi-series. */\n  mode?: BarMode;\n  /** Series keys for multi-series modes; defaults to the union of value keys. */\n  seriesKeys?: string[];\n  showAxes?: boolean;\n  showGrid?: boolean;\n  showLegend?: boolean;\n  annotations?: Annotation[];\n  /** Value-axis scale/format overrides; category axis takes `xAxis` for labels. */\n  xAxis?: AxisFormat;\n  yAxis?: AxisFormat;\n}\n\ninterface LaidBar {\n  id: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  color?: string;\n  label: string;\n  value: number;\n  series?: string;\n}\n\n/**\n * The reference chart for the calc/render split: d3-scale computes bar geometry,\n * `<RoughRectangle>` draws each bar. Supports single, grouped and stacked\n * multi-series modes.\n */\nexport function BarChart({\n  data: rawData,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  dataTable,\n  className,\n  style,\n  bare,\n  mode = 'single',\n  seriesKeys,\n  showAxes = true,\n  showGrid = true,\n  showLegend = true,\n  annotations,\n  xAxis,\n  yAxis,\n  transitions,\n}: BarChartProps) {\n  const data = useDataTransition(\n    rawData,\n    transitions?.durationMs ?? 400,\n    transitions?.enabled ?? false,\n  );\n  const fullPlot = getPlotArea(width, height, margin);\n  const resolved = resolveVibe(vibe);\n  const palette = resolveBrand(brand).palette;\n  const { hidden } = useSeriesVisibility();\n\n  // Legend items depend only on the series, so compute them (and the legend's\n  // height) up front and reserve a band at the bottom — the plot shrinks so the\n  // legend never overlaps the bars.\n  const legendItems = useMemo<LegendItem[]>(() => {\n    if (mode === 'single' || !showLegend) return [];\n    const ids = seriesKeys ?? seriesKeysOf(data as MultiSeriesDatum[]);\n    return ids.map((k, i) => ({ label: k, color: colorAt(i, palette) }));\n  }, [mode, showLegend, seriesKeys, data, palette]);\n  const legendModel = legendItems.length\n    ? layoutLegend(legendItems, fullPlot.width, {\n        fontSize: resolved.fontSize,\n        fontFamily: resolved.fontFamily,\n      })\n    : null;\n  const plot = legendModel\n    ? { ...fullPlot, height: Math.max(1, fullPlot.height - legendModel.height - 36) }\n    : fullPlot;\n\n  const { x, y, bars, keys } = useMemo(() => {\n    if (mode === 'single') {\n      const single = data as ChartDatum[];\n      const xScale = bandScale(\n        single.map((d) => d.label),\n        [plot.x, plot.x + plot.width],\n      );\n      const values = single.map((d) => d.value);\n      const yScale = linearScale(resolveDomain(values, extentOf(values), yAxis), [\n        plot.y + plot.height,\n        plot.y,\n      ]);\n      const baseline = yScale(0);\n      const computed: LaidBar[] = single.map((d) => {\n        const top = yScale(d.value);\n        return {\n          id: d.label,\n          color: d.color,\n          x: xScale(d.label) ?? plot.x,\n          y: Math.min(top, baseline),\n          width: xScale.bandwidth(),\n          height: Math.abs(baseline - top),\n          label: d.label,\n          value: d.value,\n        };\n      });\n      return { x: xScale, y: yScale, bars: computed, keys: [] as string[] };\n    }\n\n    const multi = data as MultiSeriesDatum[];\n    // Color from the full id list so hiding a series never recolors the others;\n    // lay out only the visible ones.\n    const allIds = seriesKeys ?? seriesKeysOf(multi);\n    const seriesIds = allIds.filter((k) => !hidden.has(k));\n    const xScale = bandScale(\n      multi.map((d) => d.label),\n      [plot.x, plot.x + plot.width],\n    );\n    const colorByKey = (k: string) => colorAt(allIds.indexOf(k), palette);\n\n    let computed: LaidBar[];\n    let yScale: ReturnType<typeof linearScale>;\n\n    if (mode === 'stacked') {\n      yScale = linearScale([0, stackMax(multi, seriesIds)], [plot.y + plot.height, plot.y]);\n      computed = stackLayout(multi, seriesIds)\n        .filter((s) => s.value !== 0)\n        .map((s) => ({\n          id: `${s.label}-${s.key}`,\n          color: colorByKey(s.key),\n          x: xScale(s.label) ?? plot.x,\n          y: yScale(s.end),\n          width: xScale.bandwidth(),\n          height: yScale(s.start) - yScale(s.end),\n          label: s.label,\n          value: s.value,\n          series: s.key,\n        }));\n    } else {\n      yScale = linearScale([0, groupMax(multi, seriesIds)], [plot.y + plot.height, plot.y]);\n      const inner = bandScale(seriesIds, [0, xScale.bandwidth()], 0.1);\n      const baseline = yScale(0);\n      computed = multi.flatMap((d) =>\n        seriesIds.map((key) => {\n          const top = yScale(d.values[key] ?? 0);\n          return {\n            id: `${d.label}-${key}`,\n            color: colorByKey(key),\n            x: (xScale(d.label) ?? plot.x) + (inner(key) ?? 0),\n            y: Math.min(top, baseline),\n            width: inner.bandwidth(),\n            height: Math.abs(baseline - top),\n            label: d.label,\n            value: d.values[key] ?? 0,\n            series: key,\n          };\n        }),\n      );\n    }\n\n    return {\n      x: xScale,\n      y: yScale,\n      bars: computed,\n      keys: seriesIds,\n    };\n  }, [data, mode, seriesKeys, plot.x, plot.y, plot.width, plot.height, yAxis, palette, hidden]);\n\n  const table: DataTableModel | undefined = useMemo(() => {\n    if (!dataTable) return undefined;\n    if (mode === 'single') return datumTable(data as ChartDatum[], title);\n    const multi = data as MultiSeriesDatum[];\n    return {\n      caption: title,\n      columns: ['Label', ...keys],\n      rows: multi.map(\n        (d) => [d.label, ...keys.map((k) => d.values[k] ?? 0)] as (string | number)[],\n      ),\n    };\n  }, [dataTable, mode, data, keys, title]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeBars(data)}\n      ariaLabel={ariaLabel}\n      dataTable={table}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {showGrid && <Grid plot={plot} yScale={y} />}\n      {bars.map((bar, i) => (\n        // Index-suffix the key so degenerate data (duplicate or undefined labels,\n        // e.g. from an auto-picked chart) can't collide and trigger React warnings.\n        <BarChartBar key={`${bar.id}-${i}`} bar={bar} index={i} />\n      ))}\n      {annotations && <Annotations annotations={annotations} plot={plot} yScale={y} />}\n      {showAxes && (\n        <>\n          <Axis\n            scale={x}\n            orientation=\"bottom\"\n            plot={plot}\n            tickFormat={tickFormatter(xAxis)}\n            ticks={xAxis?.tickCount}\n          />\n          <Axis\n            scale={y}\n            orientation=\"left\"\n            plot={plot}\n            tickFormat={tickFormatter(yAxis)}\n            ticks={yAxis?.tickCount}\n          />\n        </>\n      )}\n      {legendModel && (\n        <Legend\n          items={legendItems}\n          x={fullPlot.x}\n          y={plot.y + plot.height + 30}\n          width={fullPlot.width}\n        />\n      )}\n    </Surface>\n  );\n}\n\nfunction BarChartBar({ bar, index }: { bar: LaidBar; index: number }) {\n  const vibe = useVibeContext();\n  // Vary the seed per bar so identical heights still look hand-drawn, not cloned.\n  return (\n    <RoughRectangle\n      x={bar.x}\n      y={bar.y}\n      width={bar.width}\n      height={bar.height}\n      fill={bar.color ?? vibe.fill}\n      seed={vibe.seed + index}\n      dataAttrs={markAttrs({\n        kind: 'bar',\n        series: bar.series,\n        index,\n        label: bar.label,\n        value: bar.value,\n        cx: bar.x + bar.width / 2,\n        cy: bar.y,\n      })}\n    />\n  );\n}\n","import { useMemo } from 'react';\nimport type { AxisFormat, BaseChartProps, Series } from '../types/charts';\nimport { linearScale, extentOf } from '../core/scales';\nimport { resolveDomain, tickFormatter } from '../core/axisFormat';\nimport { linePath } from '../core/shapes';\nimport type { CurveName } from '../core/shapes';\nimport { getPlotArea } from '../core/geometry';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { seriesTable } from '../core/dataTable';\nimport { describeSeries } from '../core/a11yDescribe';\nimport { useDataTransition } from '../interactive/useDataTransition';\nimport { layoutLegend } from '../core/legend';\nimport type { LegendItem } from '../core/legend';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { Axis } from './Axis';\nimport { Grid } from './Grid';\nimport { Legend } from './Legend';\nimport { Annotations } from './Annotations';\nimport type { Annotation } from './Annotations';\nimport type { EmphasisSpec } from '../core/annotations';\nimport { resolveEmphasis } from '../core/emphasis';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughCircle } from '../primitives/RoughCircle';\nimport { markAttrs } from '../core/interaction';\nimport { useSeriesVisibility } from './SeriesVisibilityContext';\n\nexport interface LineChartProps extends BaseChartProps {\n  series: Series[];\n  curve?: CurveName;\n  showPoints?: boolean;\n  showAxes?: boolean;\n  showGrid?: boolean;\n  /** Show a legend below the plot for multi-series data. Defaults to on. */\n  showLegend?: boolean;\n  annotations?: Annotation[];\n  /** Data-relative emphasis: trend lines, auto-callouts, series highlighting. */\n  emphasis?: EmphasisSpec[];\n  xAxis?: AxisFormat;\n  yAxis?: AxisFormat;\n}\n\n/** Multi-series line chart: d3-shape builds each path, `<RoughPath>` sketches it. */\nexport function LineChart({\n  series: rawSeries,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  dataTable,\n  className,\n  style,\n  bare,\n  curve = 'linear',\n  showPoints = false,\n  showAxes = true,\n  showGrid = true,\n  showLegend = true,\n  annotations,\n  emphasis,\n  xAxis,\n  yAxis,\n  transitions,\n}: LineChartProps) {\n  const series = useDataTransition(\n    rawSeries,\n    transitions?.durationMs ?? 400,\n    transitions?.enabled ?? false,\n  );\n  const fullPlot = getPlotArea(width, height, margin);\n  const rv = resolveVibe(vibe);\n  const palette = resolveBrand(brand).palette;\n  const { hidden } = useSeriesVisibility();\n  const legendItems: LegendItem[] =\n    showLegend && series.length > 1\n      ? series.map((s, i) => ({ label: s.id, color: s.color ?? colorAt(i, palette) }))\n      : [];\n  const legendModel = legendItems.length\n    ? layoutLegend(legendItems, fullPlot.width, {\n        fontSize: rv.fontSize,\n        fontFamily: rv.fontFamily,\n      })\n    : null;\n  const plot = legendModel\n    ? { ...fullPlot, height: Math.max(1, fullPlot.height - legendModel.height - 36) }\n    : fullPlot;\n\n  const resolved = useMemo(() => resolveEmphasis(series, emphasis ?? []), [series, emphasis]);\n  const overlay = emphasis ? [...(annotations ?? []), ...resolved.annotations] : annotations;\n\n  const { x, y, lines } = useMemo(() => {\n    // Lay out and rescale to the visible series only; keep colour tied to each\n    // series' original index so hiding one never recolours the rest.\n    const visible = series.filter((s) => !hidden.has(s.id));\n    const allPoints = visible.flatMap((s) => s.points);\n    const xs = allPoints.map((p) => p.x);\n    const ys = allPoints.map((p) => p.y);\n    const xScale = linearScale(resolveDomain(xs, extentOf(xs, false), xAxis), [\n      plot.x,\n      plot.x + plot.width,\n    ]);\n    const yScale = linearScale(resolveDomain(ys, extentOf(ys), yAxis), [\n      plot.y + plot.height,\n      plot.y,\n    ]);\n\n    const computed = visible.map((s) => {\n      const i = series.indexOf(s);\n      const pixels = s.points.map((p) => ({ x: xScale(p.x), y: yScale(p.y) }));\n      return {\n        id: s.id,\n        color: s.color ?? colorAt(i, palette),\n        d: linePath(pixels, curve),\n        pixels,\n        points: s.points,\n      };\n    });\n\n    return { x: xScale, y: yScale, lines: computed };\n  }, [series, curve, plot.x, plot.y, plot.width, plot.height, xAxis, yAxis, palette, hidden]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeSeries(series, 'Line')}\n      ariaLabel={ariaLabel}\n      dataTable={dataTable ? seriesTable(series, title) : undefined}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {showGrid && <Grid plot={plot} xScale={x} yScale={y} />}\n      {lines.map((line, i) => (\n        <g key={line.id} style={resolved.muted.has(line.id) ? { opacity: 0.22 } : undefined}>\n          <RoughPath d={line.d} stroke={line.color} fill={null} seed={i + 1} />\n          {showPoints &&\n            line.pixels.map((p, j) => (\n              <RoughCircle\n                key={j}\n                cx={p.x}\n                cy={p.y}\n                diameter={8}\n                fill={line.color}\n                seed={i * 100 + j + 1}\n              />\n            ))}\n          {/* Inert transparent hit targets per datum: the line is one merged path,\n              so per-point hover needs an addressable element. */}\n          {line.pixels.map((p, j) => (\n            <circle\n              key={`hit-${j}`}\n              cx={p.x}\n              cy={p.y}\n              r={10}\n              fill=\"transparent\"\n              {...markAttrs({\n                kind: 'point',\n                series: line.id,\n                index: j,\n                value: { x: line.points[j].x, y: line.points[j].y },\n                cx: p.x,\n                cy: p.y,\n              })}\n            />\n          ))}\n        </g>\n      ))}\n      {overlay && <Annotations annotations={overlay} plot={plot} xScale={x} yScale={y} />}\n      {showAxes && (\n        <>\n          <Axis\n            scale={x}\n            orientation=\"bottom\"\n            plot={plot}\n            tickFormat={tickFormatter(xAxis)}\n            ticks={xAxis?.tickCount}\n          />\n          <Axis\n            scale={y}\n            orientation=\"left\"\n            plot={plot}\n            tickFormat={tickFormatter(yAxis)}\n            ticks={yAxis?.tickCount}\n          />\n        </>\n      )}\n      {legendModel && (\n        <Legend\n          items={legendItems}\n          x={fullPlot.x}\n          y={plot.y + plot.height + 30}\n          width={fullPlot.width}\n        />\n      )}\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { AxisFormat, BaseChartProps, Series } from '../types/charts';\nimport { linearScale, extentOf } from '../core/scales';\nimport { resolveDomain, tickFormatter } from '../core/axisFormat';\nimport { areaPath, linePath } from '../core/shapes';\nimport type { CurveName } from '../core/shapes';\nimport { getPlotArea } from '../core/geometry';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { seriesTable } from '../core/dataTable';\nimport { describeSeries } from '../core/a11yDescribe';\nimport { useDataTransition } from '../interactive/useDataTransition';\nimport { layoutLegend } from '../core/legend';\nimport type { LegendItem } from '../core/legend';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { Axis } from './Axis';\nimport { Grid } from './Grid';\nimport { Legend } from './Legend';\nimport { Annotations } from './Annotations';\nimport type { Annotation } from './Annotations';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { markAttrs } from '../core/interaction';\nimport { useSeriesVisibility } from './SeriesVisibilityContext';\n\nexport interface AreaChartProps extends BaseChartProps {\n  series: Series[];\n  curve?: CurveName;\n  /** Data-space y-value the area fills down to. */\n  baseline?: number;\n  showLine?: boolean;\n  /** Stack series on top of each other (assumes points are index-aligned). */\n  stacked?: boolean;\n  showAxes?: boolean;\n  showGrid?: boolean;\n  /** Show a legend below the plot for multi-series data. Defaults to on. */\n  showLegend?: boolean;\n  annotations?: Annotation[];\n  xAxis?: AxisFormat;\n  yAxis?: AxisFormat;\n}\n\n/**\n * Filled area chart — the strongest showcase for Rough.js hachure/zigzag fills.\n * d3-shape's `area` builds the fill path; the vibe's `fillStyle` textures it.\n */\nexport function AreaChart({\n  series: rawSeries,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  dataTable,\n  className,\n  style,\n  bare,\n  curve = 'linear',\n  baseline = 0,\n  showLine = true,\n  stacked = false,\n  showAxes = true,\n  showGrid = true,\n  showLegend = true,\n  annotations,\n  xAxis,\n  yAxis,\n  transitions,\n}: AreaChartProps) {\n  const series = useDataTransition(\n    rawSeries,\n    transitions?.durationMs ?? 400,\n    transitions?.enabled ?? false,\n  );\n  const fullPlot = getPlotArea(width, height, margin);\n  const rv = resolveVibe(vibe);\n  const palette = resolveBrand(brand).palette;\n  const { hidden } = useSeriesVisibility();\n  const legendItems: LegendItem[] =\n    showLegend && series.length > 1\n      ? series.map((s, i) => ({ label: s.id, color: s.color ?? colorAt(i, palette) }))\n      : [];\n  const legendModel = legendItems.length\n    ? layoutLegend(legendItems, fullPlot.width, {\n        fontSize: rv.fontSize,\n        fontFamily: rv.fontFamily,\n      })\n    : null;\n  const plot = legendModel\n    ? { ...fullPlot, height: Math.max(1, fullPlot.height - legendModel.height - 36) }\n    : fullPlot;\n\n  const { x, y, areas } = useMemo(() => {\n    // Lay out, stack and rescale to the visible series only; colour stays tied to\n    // each series' original index so hiding one never recolours the rest.\n    const visible = series.filter((s) => !hidden.has(s.id));\n    const allPoints = visible.flatMap((s) => s.points);\n    const xs = allPoints.map((p) => p.x);\n    const xScale = linearScale(resolveDomain(xs, extentOf(xs, false), xAxis), [\n      plot.x,\n      plot.x + plot.width,\n    ]);\n\n    if (stacked) {\n      const count = Math.max(0, ...visible.map((s) => s.points.length));\n      const cumulative = new Array<number>(count).fill(0);\n      const totals = new Array<number>(count).fill(0);\n      for (const s of visible) s.points.forEach((p, idx) => (totals[idx] += p.y));\n      const yScale = linearScale([0, Math.max(1, ...totals)], [plot.y + plot.height, plot.y]);\n\n      const computed = visible.map((s) => {\n        const i = series.indexOf(s);\n        const top = s.points.map((p, idx) => ({\n          x: xScale(p.x),\n          y: yScale(cumulative[idx] + p.y),\n        }));\n        const bottom = s.points.map((p, idx) => ({ x: xScale(p.x), y: yScale(cumulative[idx]) }));\n        s.points.forEach((p, idx) => (cumulative[idx] += p.y));\n        const fill =\n          `M${top.map((p) => `${p.x},${p.y}`).join(' L')} ` +\n          `L${[...bottom]\n            .reverse()\n            .map((p) => `${p.x},${p.y}`)\n            .join(' L')} Z`;\n        return {\n          id: s.id,\n          color: s.color ?? colorAt(i, palette),\n          fill,\n          line: linePath(top, curve),\n          pixels: top,\n          points: s.points,\n        };\n      });\n\n      return { x: xScale, y: yScale, areas: computed };\n    }\n\n    const yValues = [...allPoints.map((p) => p.y), baseline];\n    const yScale = linearScale(resolveDomain(yValues, extentOf(yValues), yAxis), [\n      plot.y + plot.height,\n      plot.y,\n    ]);\n    const y0 = yScale(baseline);\n\n    const computed = visible.map((s) => {\n      const i = series.indexOf(s);\n      const pixels = s.points.map((p) => ({ x: xScale(p.x), y: yScale(p.y) }));\n      return {\n        id: s.id,\n        color: s.color ?? colorAt(i, palette),\n        fill: areaPath(pixels, y0, curve),\n        line: linePath(pixels, curve),\n        pixels,\n        points: s.points,\n      };\n    });\n\n    return { x: xScale, y: yScale, areas: computed };\n  }, [\n    series,\n    curve,\n    baseline,\n    stacked,\n    plot.x,\n    plot.y,\n    plot.width,\n    plot.height,\n    xAxis,\n    yAxis,\n    palette,\n    hidden,\n  ]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeSeries(series, 'Area')}\n      ariaLabel={ariaLabel}\n      dataTable={dataTable ? seriesTable(series, title) : undefined}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {showGrid && <Grid plot={plot} xScale={x} yScale={y} />}\n      {areas.map((a, i) => (\n        <g key={a.id}>\n          <RoughPath d={a.fill} fill={a.color} seed={i + 1} />\n          {showLine && <RoughPath d={a.line} stroke={a.color} fill={null} seed={i + 50} />}\n          {/* Inert transparent hit targets per datum (the area/line is a merged path). */}\n          {a.pixels.map((p, j) => (\n            <circle\n              key={`hit-${j}`}\n              cx={p.x}\n              cy={p.y}\n              r={10}\n              fill=\"transparent\"\n              {...markAttrs({\n                kind: 'point',\n                series: a.id,\n                index: j,\n                value: { x: a.points[j].x, y: a.points[j].y },\n                cx: p.x,\n                cy: p.y,\n              })}\n            />\n          ))}\n        </g>\n      ))}\n      {annotations && <Annotations annotations={annotations} plot={plot} xScale={x} yScale={y} />}\n      {showAxes && (\n        <>\n          <Axis\n            scale={x}\n            orientation=\"bottom\"\n            plot={plot}\n            tickFormat={tickFormatter(xAxis)}\n            ticks={xAxis?.tickCount}\n          />\n          <Axis\n            scale={y}\n            orientation=\"left\"\n            plot={plot}\n            tickFormat={tickFormatter(yAxis)}\n            ticks={yAxis?.tickCount}\n          />\n        </>\n      )}\n      {legendModel && (\n        <Legend\n          items={legendItems}\n          x={fullPlot.x}\n          y={plot.y + plot.height + 30}\n          width={fullPlot.width}\n        />\n      )}\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { AxisFormat, BaseChartProps } from '../types/charts';\nimport { linearScale, sqrtScale, extentOf } from '../core/scales';\nimport { resolveDomain, tickFormatter } from '../core/axisFormat';\nimport { getPlotArea } from '../core/geometry';\nimport { Surface } from './Surface';\nimport { Axis } from './Axis';\nimport { Grid } from './Grid';\nimport { Annotations } from './Annotations';\nimport type { Annotation } from './Annotations';\nimport type { EmphasisSpec } from '../core/annotations';\nimport { resolveEmphasis } from '../core/emphasis';\nimport { RoughCircle } from '../primitives/RoughCircle';\nimport { useVibeContext } from '../vibe/VibeProvider';\nimport { markAttrs } from '../core/interaction';\nimport { describeScatter } from '../core/a11yDescribe';\n\nexport interface ScatterDatum {\n  x: number;\n  y: number;\n  /** Optional data-space magnitude driving the bubble radius. */\n  r?: number;\n  color?: string;\n  label?: string;\n}\n\nexport interface ScatterPlotProps extends BaseChartProps {\n  data: ScatterDatum[];\n  /** Marker radius (px) used when a datum has no `r`. */\n  radius?: number;\n  /** Max bubble radius (px) when data carries `r`. */\n  maxRadius?: number;\n  showAxes?: boolean;\n  showGrid?: boolean;\n  annotations?: Annotation[];\n  /** Data-relative emphasis: a regression/mean trend line, auto-callouts. */\n  emphasis?: EmphasisSpec[];\n  xAxis?: AxisFormat;\n  yAxis?: AxisFormat;\n}\n\n/** Scatter / bubble chart: each datum maps to a sketchy `<RoughCircle>`. */\nexport function ScatterPlot({\n  data,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  className,\n  style,\n  bare,\n  description,\n  ariaLabel,\n  dataTable,\n  radius = 5,\n  maxRadius = 18,\n  showAxes = true,\n  showGrid = true,\n  annotations,\n  emphasis,\n  xAxis,\n  yAxis,\n}: ScatterPlotProps) {\n  const plot = getPlotArea(width, height, margin);\n  const overlay = useMemo(() => {\n    if (!emphasis) return annotations;\n    const synthetic = [{ id: 'data', points: data.map((d) => ({ x: d.x, y: d.y })) }];\n    return [...(annotations ?? []), ...resolveEmphasis(synthetic, emphasis).annotations];\n  }, [annotations, emphasis, data]);\n\n  const { x, y, points } = useMemo(() => {\n    const xs = data.map((d) => d.x);\n    const ys = data.map((d) => d.y);\n    const xScale = linearScale(resolveDomain(xs, extentOf(xs, false), xAxis), [\n      plot.x,\n      plot.x + plot.width,\n    ]);\n    const yScale = linearScale(resolveDomain(ys, extentOf(ys, false), yAxis), [\n      plot.y + plot.height,\n      plot.y,\n    ]);\n    const rValues = data.map((d) => d.r).filter((r): r is number => r !== undefined);\n    const rScale = rValues.length ? sqrtScale([0, Math.max(...rValues)], [2, maxRadius]) : null;\n\n    const computed = data.map((d) => ({\n      cx: xScale(d.x),\n      cy: yScale(d.y),\n      r: d.r !== undefined && rScale ? rScale(d.r) : radius,\n      color: d.color,\n      label: d.label,\n      dx: d.x,\n      dy: d.y,\n    }));\n\n    return { x: xScale, y: yScale, points: computed };\n  }, [data, radius, maxRadius, plot.x, plot.y, plot.width, plot.height, xAxis, yAxis]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeScatter(data)}\n      ariaLabel={ariaLabel}\n      dataTable={\n        dataTable\n          ? {\n              caption: title,\n              columns: ['X', 'Y'],\n              rows: data.map((d) => [d.x, d.y] as (string | number)[]),\n            }\n          : undefined\n      }\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {showGrid && <Grid plot={plot} xScale={x} yScale={y} />}\n      {points.map((p, i) => (\n        <ScatterDot key={i} point={p} index={i} />\n      ))}\n      {overlay && <Annotations annotations={overlay} plot={plot} xScale={x} yScale={y} />}\n      {showAxes && (\n        <>\n          <Axis\n            scale={x}\n            orientation=\"bottom\"\n            plot={plot}\n            tickFormat={tickFormatter(xAxis)}\n            ticks={xAxis?.tickCount}\n          />\n          <Axis\n            scale={y}\n            orientation=\"left\"\n            plot={plot}\n            tickFormat={tickFormatter(yAxis)}\n            ticks={yAxis?.tickCount}\n          />\n        </>\n      )}\n    </Surface>\n  );\n}\n\nfunction ScatterDot({\n  point,\n  index,\n}: {\n  point: {\n    cx: number;\n    cy: number;\n    r: number;\n    color?: string;\n    label?: string;\n    dx: number;\n    dy: number;\n  };\n  index: number;\n}) {\n  const vibe = useVibeContext();\n  return (\n    <RoughCircle\n      cx={point.cx}\n      cy={point.cy}\n      diameter={point.r * 2}\n      fill={point.color ?? vibe.fill}\n      seed={vibe.seed + index + 1}\n      dataAttrs={markAttrs({\n        kind: 'point',\n        index,\n        label: point.label,\n        value: { x: point.dx, y: point.dy },\n        cx: point.cx,\n        cy: point.cy,\n      })}\n    />\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps, ChartDatum } from '../types/charts';\nimport { getPlotArea } from '../core/geometry';\nimport { computePie } from '../core/arc';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { datumTable } from '../core/dataTable';\nimport { describePie } from '../core/a11yDescribe';\nimport { useDataTransition } from '../interactive/useDataTransition';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\nimport { markAttrs } from '../core/interaction';\n\nexport interface PieChartProps extends BaseChartProps {\n  data: ChartDatum[];\n  /** 0 = pie, > 0 = donut (px). */\n  innerRadius?: number;\n  padAngle?: number;\n  showLabels?: boolean;\n}\n\n/**\n * Pie / donut chart. d3-shape's `arc`+`pie` emit each slice's path string at the\n * origin; we translate to the plot center and let `<RoughPath>` sketch them.\n */\nexport function PieChart({\n  data: rawData,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  dataTable,\n  className,\n  style,\n  bare,\n  innerRadius = 0,\n  padAngle = 0.02,\n  showLabels = true,\n  transitions,\n}: PieChartProps) {\n  const data = useDataTransition(\n    rawData,\n    transitions?.durationMs ?? 400,\n    transitions?.enabled ?? false,\n  );\n  const plot = getPlotArea(width, height, margin);\n  const cx = plot.x + plot.width / 2;\n  const cy = plot.y + plot.height / 2;\n  const outerRadius = Math.max(0, Math.min(plot.width, plot.height) / 2 - 2);\n  // Labels sit over the (hachured, coloured) slices; give them a page-colour\n  // halo so they stay legible regardless of vibe/slice colour.\n  const haloColor = resolveVibe(vibe).background ?? '#ffffff';\n  const palette = resolveBrand(brand).palette;\n\n  const slices = useMemo(\n    () => computePie(data, outerRadius, innerRadius, padAngle),\n    [data, outerRadius, innerRadius, padAngle],\n  );\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describePie(data)}\n      ariaLabel={ariaLabel}\n      dataTable={dataTable ? datumTable(data, title) : undefined}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${cx}, ${cy})`}>\n        {slices.map((slice) => (\n          <g key={slice.datum.label}>\n            <RoughPath\n              d={slice.path}\n              fill={slice.datum.color ?? colorAt(slice.index, palette)}\n              seed={slice.index + 1}\n              dataAttrs={markAttrs({\n                kind: 'slice',\n                index: slice.index,\n                label: slice.datum.label,\n                value: slice.datum.value,\n                cx: cx + slice.centroid[0],\n                cy: cy + slice.centroid[1],\n              })}\n            />\n            {showLabels && slice.endAngle - slice.startAngle > 0.15 && (\n              <RoughText\n                x={slice.centroid[0]}\n                y={slice.centroid[1]}\n                anchor=\"middle\"\n                baseline=\"middle\"\n                haloColor={haloColor}\n              >\n                {slice.datum.label}\n              </RoughText>\n            )}\n          </g>\n        ))}\n      </g>\n    </Surface>\n  );\n}\n","import type { FlowNodeShape } from '../types/charts';\nimport { measureText } from './text';\n\n/**\n * Size a diagram node to its label. Pure and DOM-free (text metrics come from\n * `measureText`). The layout engines size nodes off this so labels never\n * overflow their box and neighbours don't collide. Non-rect shapes need extra\n * room because the label sits inside the inscribed rectangle of the shape.\n */\n\nconst PAD_X = 16;\nconst PAD_Y = 12;\nconst MIN_W = 56;\nconst MIN_H = 36;\nconst MAX_W = 240;\n\n// Extra room so a label fits inside the shape's inscribed box, not its bounds.\nconst SHAPE_FACTOR: Record<FlowNodeShape, { w: number; h: number }> = {\n  rect: { w: 1, h: 1 },\n  ellipse: { w: 1.4, h: 1.45 },\n  diamond: { w: 1.7, h: 1.9 },\n};\n\nexport function nodeSize(\n  label: string,\n  shape: FlowNodeShape,\n  fontSize: number,\n  fontFamily: string,\n): { width: number; height: number } {\n  const m = measureText(label, fontSize, fontFamily);\n  const f = SHAPE_FACTOR[shape] ?? SHAPE_FACTOR.rect;\n  const width = Math.max(MIN_W, Math.min((m.width + PAD_X * 2) * f.w, MAX_W));\n  const height = Math.max(MIN_H, (m.height + PAD_Y * 2) * f.h);\n  return { width: Math.round(width), height: Math.round(height) };\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps, EdgeRouting, FlowEdge, FlowNode } from '../types/charts';\nimport { getPlotArea } from '../core/geometry';\nimport type {\n  DiagramOrientation,\n  LaidGroup,\n  LaidOutEdge,\n  LaidOutNode,\n  LayoutEngine,\n} from '../core/diagram';\nimport {\n  arrowHeadPath,\n  boxEdgePoint,\n  diamondPath,\n  ellipsePath,\n  linkPath,\n  orthogonalPath,\n  orthogonalPoints,\n} from '../core/shapes';\nimport { measureText } from '../core/text';\nimport { describeDiagram } from '../core/a11yDescribe';\nimport { nodeSize } from '../core/nodeSize';\nimport { Surface } from './Surface';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface DiagramProps extends BaseChartProps {\n  nodes: FlowNode[];\n  edges?: FlowEdge[];\n  /** Layout engine that positions the scene (flow/tree/DAG, sequence, …). */\n  layout: LayoutEngine;\n  routing?: EdgeRouting;\n  showArrowheads?: boolean;\n}\n\n/**\n * The generic diagram renderer: a `LayoutEngine` positions nodes/edges/groups,\n * then this draws group containers, edges (curved or orthogonal, with optional\n * arrowheads + labels) and per-shape nodes. Flowchart and the other diagram\n * types are thin wrappers that pick a layout engine.\n */\nexport function Diagram({\n  nodes,\n  edges,\n  layout,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  routing = 'curved',\n  showArrowheads = true,\n}: DiagramProps) {\n  const plot = getPlotArea(width, height, margin);\n\n  // Size each node to its label (with the vibe's font) before layout, so the\n  // engine spaces them by real extent. Explicit width/height on a node win.\n  const sizedNodes = useMemo(() => {\n    const resolved = resolveVibe(vibe);\n    return nodes.map((n) => {\n      if (n.width != null && n.height != null) return n;\n      const s = nodeSize(n.label, n.shape ?? 'rect', resolved.fontSize, resolved.fontFamily);\n      return { ...n, width: n.width ?? s.width, height: n.height ?? s.height };\n    });\n  }, [nodes, vibe]);\n\n  const scene = useMemo(\n    () => layout(sizedNodes, edges, [plot.width, plot.height]),\n    [layout, sizedNodes, edges, plot.width, plot.height],\n  );\n\n  // Per-edge routing override, keyed by endpoints, falling back to the chart default.\n  const edgeRouting = useMemo(() => {\n    const map = new Map<string, EdgeRouting>();\n    for (const e of edges ?? []) if (e.routing) map.set(`${e.from}->${e.to}`, e.routing);\n    return map;\n  }, [edges]);\n\n  // Fit the laid-out scene into the plot: scale down (never up) and centre, so a\n  // layout that's wider/taller than the canvas is never clipped at the edge.\n  const fit = useMemo(() => {\n    let minX = Infinity;\n    let minY = Infinity;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n    for (const n of scene.nodes) {\n      minX = Math.min(minX, n.x - n.width / 2);\n      maxX = Math.max(maxX, n.x + n.width / 2);\n      minY = Math.min(minY, n.y - n.height / 2);\n      maxY = Math.max(maxY, n.y + n.height / 2);\n    }\n    for (const g of scene.groups ?? []) {\n      minX = Math.min(minX, g.x);\n      maxX = Math.max(maxX, g.x + g.width);\n      minY = Math.min(minY, g.y);\n      maxY = Math.max(maxY, g.y + g.height);\n    }\n    if (!Number.isFinite(minX)) return `translate(${plot.x}, ${plot.y})`;\n    const pad = 4;\n    const bw = maxX - minX || 1;\n    const bh = maxY - minY || 1;\n    const s = Math.min((plot.width - pad * 2) / bw, (plot.height - pad * 2) / bh, 1);\n    const tx = plot.x + pad + (plot.width - pad * 2 - bw * s) / 2 - minX * s;\n    const ty = plot.y + pad + (plot.height - pad * 2 - bh * s) / 2 - minY * s;\n    return `translate(${tx}, ${ty}) scale(${s})`;\n  }, [scene, plot.x, plot.y, plot.width, plot.height]);\n\n  // Stop each connector at the node's border instead of its centre, so lines\n  // don't run into the shapes.\n  const trimmedEdges = useMemo(() => {\n    const byId = new Map(scene.nodes.map((n) => [n.id, n]));\n    return scene.edges.map((e) => {\n      const s = byId.get(e.from);\n      const t = byId.get(e.to);\n      if (!s || !t) return e;\n      const sc = { x: s.x, y: s.y };\n      const tc = { x: t.x, y: t.y };\n      const sp = boxEdgePoint(sc, s.width, s.height, tc);\n      const tp = boxEdgePoint(tc, t.width, t.height, sc);\n      let points = e.points;\n      if (points && points.length >= 2) {\n        points = [...points];\n        points[0] = boxEdgePoint(sc, s.width, s.height, points[1]);\n        points[points.length - 1] = boxEdgePoint(tc, t.width, t.height, points[points.length - 2]);\n      }\n      return { ...e, sx: sp.x, sy: sp.y, tx: tp.x, ty: tp.y, points };\n    });\n  }, [scene]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeDiagram(nodes, edges)}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={fit}>\n        {scene.groups?.map((g) => (\n          <DiagramGroup key={g.id} group={g} />\n        ))}\n        {trimmedEdges.map((e) => (\n          <DiagramEdge\n            key={`${e.from}->${e.to}`}\n            edge={e}\n            orientation={scene.orientation}\n            routing={edgeRouting.get(`${e.from}->${e.to}`) ?? routing}\n            showArrowhead={showArrowheads}\n          />\n        ))}\n        {scene.nodes.map((n, i) => (\n          <DiagramNode key={n.id} node={n} index={i} />\n        ))}\n      </g>\n    </Surface>\n  );\n}\n\nfunction DiagramGroup({ group }: { group: LaidGroup }) {\n  const resolved = useResolvedVibe();\n  const m = group.label ? measureText(group.label, resolved.fontSize, resolved.fontFamily) : null;\n  const anchor = group.labelAnchor ?? 'start';\n  const at = group.labelPoint ?? { x: group.x + 8, y: group.y };\n  const padX = 4;\n  const padY = 1;\n  const tabX = anchor === 'middle' && m ? at.x - m.width / 2 - padX : at.x - padX;\n  return (\n    <g>\n      <RoughRectangle\n        x={group.x}\n        y={group.y}\n        width={group.width}\n        height={group.height}\n        fill={null}\n      />\n      {group.label && m && (\n        <>\n          {/* A page-coloured tab sits behind the title so it stays legible even\n              where a border or connector passes close by. */}\n          <rect\n            x={tabX}\n            y={at.y - m.height / 2 - padY}\n            width={m.width + padX * 2}\n            height={m.height + padY * 2}\n            fill={resolved.background ?? '#ffffff'}\n          />\n          <RoughText x={at.x} y={at.y} anchor={anchor} baseline=\"middle\">\n            {group.label}\n          </RoughText>\n        </>\n      )}\n    </g>\n  );\n}\n\nfunction DiagramEdge({\n  edge,\n  orientation,\n  routing,\n  showArrowhead,\n}: {\n  edge: LaidOutEdge;\n  orientation: DiagramOrientation;\n  routing: EdgeRouting;\n  showArrowhead: boolean;\n}) {\n  const from = { x: edge.sx, y: edge.sy };\n  const to = { x: edge.tx, y: edge.ty };\n  // For elbow links the head must align with the final (axis-aligned) segment,\n  // not the straight source->target line, so it reads as a clean right angle.\n  let d: string;\n  let arrowTail = from;\n  let labelAt = { x: (edge.sx + edge.tx) / 2, y: (edge.sy + edge.ty) / 2 };\n  if (edge.points && edge.points.length >= 2) {\n    const pts = edge.points;\n    d =\n      `M${pts[0].x},${pts[0].y} ` +\n      pts\n        .slice(1)\n        .map((p) => `L${p.x},${p.y}`)\n        .join(' ');\n    arrowTail = pts[pts.length - 2];\n    labelAt = pts[Math.floor((pts.length - 1) / 2)];\n  } else if (routing === 'orthogonal') {\n    const pts = orthogonalPoints(from, to, orientation);\n    d = orthogonalPath(from, to, orientation);\n    arrowTail = pts[pts.length - 2];\n  } else {\n    d = linkPath(from, to, orientation);\n  }\n  const resolved = useResolvedVibe();\n  const m = edge.label ? measureText(edge.label, resolved.fontSize, resolved.fontFamily) : null;\n  return (\n    <g>\n      <RoughPath d={d} fill={null} />\n      {showArrowhead && <RoughPath d={arrowHeadPath(arrowTail, to)} fill={null} />}\n      {edge.label && m && (\n        <>\n          {/* Page-coloured knockout so the label reads clearly over the connector. */}\n          <rect\n            x={labelAt.x - m.width / 2 - 3}\n            y={labelAt.y - m.height / 2 - 1}\n            width={m.width + 6}\n            height={m.height + 2}\n            fill={resolved.background ?? '#ffffff'}\n          />\n          <RoughText x={labelAt.x} y={labelAt.y} anchor=\"middle\" baseline=\"middle\">\n            {edge.label}\n          </RoughText>\n        </>\n      )}\n    </g>\n  );\n}\n\nfunction DiagramNode({ node, index }: { node: LaidOutNode; index: number }) {\n  const seed = index + 1;\n  const vibe = node.data.vibe;\n  const fill = useResolvedVibe(vibe).background ?? '#ffffff';\n\n  let outline;\n  if (node.shape === 'diamond') {\n    outline = (\n      <RoughPath\n        d={diamondPath(node.x, node.y, node.width, node.height)}\n        fill={fill}\n        vibe={vibe}\n        seed={seed}\n      />\n    );\n  } else if (node.shape === 'ellipse') {\n    outline = (\n      <RoughPath\n        d={ellipsePath(node.x, node.y, node.width / 2, node.height / 2)}\n        fill={fill}\n        vibe={vibe}\n        seed={seed}\n      />\n    );\n  } else {\n    outline = (\n      <RoughRectangle\n        x={node.x - node.width / 2}\n        y={node.y - node.height / 2}\n        width={node.width}\n        height={node.height}\n        fill={fill}\n        vibe={vibe}\n        seed={seed}\n      />\n    );\n  }\n\n  return (\n    <g>\n      {outline}\n      <RoughText x={node.x} y={node.y} anchor=\"middle\" baseline=\"middle\" vibe={vibe}>\n        {node.label}\n      </RoughText>\n    </g>\n  );\n}\n","import type {\n  BaseChartProps,\n  EdgeRouting,\n  FlowDirection,\n  FlowEdge,\n  FlowNode,\n  LayoutOptions,\n} from '../types/charts';\nimport { flowLayout } from '../core/diagram';\nimport { Diagram } from './Diagram';\n\nexport interface FlowchartProps extends BaseChartProps {\n  nodes: FlowNode[];\n  edges?: FlowEdge[];\n  direction?: FlowDirection;\n  showArrowheads?: boolean;\n  /** Edge connector style. `curved` (default) or `orthogonal` elbow links. */\n  routing?: EdgeRouting;\n  /** Layout knobs; `engine` forces tree vs DAG. */\n  layoutOptions?: LayoutOptions;\n}\n\n/**\n * Flowchart with automatic layout: a tidy d3-hierarchy tree for single-root\n * trees, a layered DAG layout for merges/multiple-roots/cycles (in any of four\n * directions). A thin wrapper over `<Diagram>` with the flow layout engine.\n */\nexport function Flowchart({\n  nodes,\n  edges,\n  direction = 'TB',\n  showArrowheads = true,\n  routing = 'curved',\n  layoutOptions,\n  ...rest\n}: FlowchartProps) {\n  return (\n    <Diagram\n      nodes={nodes}\n      edges={edges}\n      layout={flowLayout(direction, layoutOptions)}\n      routing={routing}\n      showArrowheads={showArrowheads}\n      {...rest}\n    />\n  );\n}\n","import type { BaseChartProps, FlowEdge, FlowNode } from '../types/charts';\nimport { radialLayout } from '../core/radial';\nimport { Diagram } from './Diagram';\n\nexport interface MindMapProps extends BaseChartProps {\n  nodes: FlowNode[];\n  edges?: FlowEdge[];\n}\n\n/**\n * Mind-map: a radial tree fanning out from a central root. A thin wrapper over\n * `<Diagram>` with the radial layout engine, straight spokes and no arrowheads.\n */\nexport function MindMap({ nodes, edges, ...rest }: MindMapProps) {\n  return (\n    <Diagram nodes={nodes} edges={edges} layout={radialLayout()} showArrowheads={false} {...rest} />\n  );\n}\n","import type { BaseChartProps, FlowDirection, FlowEdge, FlowNode } from '../types/charts';\nimport { flowLayout } from '../core/diagram';\nimport { Diagram } from './Diagram';\n\nexport interface OrgChartProps extends BaseChartProps {\n  nodes: FlowNode[];\n  edges?: FlowEdge[];\n  direction?: FlowDirection;\n}\n\n/**\n * Organisation chart: a tidy hierarchy of rectangular boxes joined by plain\n * elbow connectors (no arrowheads). A thin wrapper over `<Diagram>` with the\n * flow layout engine, forcing rectangular nodes regardless of any shape hint.\n */\nexport function OrgChart({ nodes, edges, direction = 'TB', ...rest }: OrgChartProps) {\n  const boxes = nodes.map((n) => (n.shape === 'rect' ? n : { ...n, shape: 'rect' as const }));\n  return (\n    <Diagram\n      nodes={boxes}\n      edges={edges}\n      layout={flowLayout(direction)}\n      routing=\"orthogonal\"\n      showArrowheads={false}\n      {...rest}\n    />\n  );\n}\n","import type {\n  BaseChartProps,\n  FlowDirection,\n  FlowEdge,\n  FlowNode,\n  LayoutOptions,\n} from '../types/charts';\nimport { architectureLayout } from '../core/architecture';\nimport { Diagram } from './Diagram';\n\nexport interface ArchitectureDiagramProps extends BaseChartProps {\n  nodes: FlowNode[];\n  edges?: FlowEdge[];\n  direction?: FlowDirection;\n  showArrowheads?: boolean;\n  /** Density/spacing/lane-gutter knobs for the swimlane layout. */\n  layoutOptions?: LayoutOptions;\n}\n\n/**\n * Architecture / network diagram: components (optionally grouped into zone\n * containers via each node's `group`) joined by connectors that route\n * orthogonally around the other boxes. A thin wrapper over `<Diagram>` with the\n * architecture layout engine, which supplies the routed edge waypoints.\n */\nexport function ArchitectureDiagram({\n  nodes,\n  edges,\n  direction = 'TB',\n  showArrowheads = true,\n  layoutOptions,\n  ...rest\n}: ArchitectureDiagramProps) {\n  return (\n    <Diagram\n      nodes={nodes}\n      edges={edges}\n      layout={architectureLayout(direction, layoutOptions)}\n      showArrowheads={showArrowheads}\n      {...rest}\n    />\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { SequenceActorInput, SequenceMessageInput } from '../core/sequence';\nimport { computeSequence, SELF_LOOP_WIDTH } from '../core/sequence';\nimport { getPlotArea } from '../core/geometry';\nimport { arrowHeadPath } from '../core/shapes';\nimport { Surface } from './Surface';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface SequenceDiagramProps extends BaseChartProps {\n  actors: SequenceActorInput[];\n  messages: SequenceMessageInput[];\n  actorHeight?: number;\n}\n\nconst DASHED = { strokeDasharray: '6 4' } as const;\nconst SELF_LOOP_HEIGHT = 18;\n\n/**\n * Sequence / interaction diagram: actors across the top, lifelines running\n * down, and messages as ordered horizontal arrows between them (reply messages\n * dashed, self-messages looping back). `computeSequence` does the geometry; the\n * sketch primitives draw it.\n */\nexport function SequenceDiagram({\n  actors,\n  messages,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  actorHeight,\n}: SequenceDiagramProps) {\n  const plot = getPlotArea(width, height, margin);\n\n  const layout = useMemo(\n    () => computeSequence(actors, messages, [plot.width, plot.height], { actorHeight }),\n    [actors, messages, plot.width, plot.height, actorHeight],\n  );\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${plot.x}, ${plot.y})`}>\n        {layout.actors.map((a, i) => (\n          <g key={a.id}>\n            <RoughLine\n              x1={a.x}\n              y1={a.lifelineTop}\n              x2={a.x}\n              y2={a.lifelineBottom}\n              style={DASHED}\n              seed={i + 1}\n            />\n            <RoughRectangle\n              x={a.boxX}\n              y={a.boxY}\n              width={a.boxWidth}\n              height={a.boxHeight}\n              fill=\"#ffffff\"\n              seed={i + 1}\n            />\n            <RoughText x={a.x} y={a.boxY + a.boxHeight / 2} anchor=\"middle\" baseline=\"middle\">\n              {a.label}\n            </RoughText>\n          </g>\n        ))}\n\n        {layout.messages.map((m, i) => {\n          const key = `${m.from}->${m.to}-${i}`;\n          if (m.self) {\n            const x = m.x1;\n            // Clamp the loop so it stays well within the actor's own column and\n            // can't reach the next lifeline to the right.\n            const rightX = layout.actors\n              .map((a) => a.x)\n              .filter((ax) => ax > x + 1)\n              .sort((a, b) => a - b)[0];\n            const loopW =\n              rightX != null ? Math.min(SELF_LOOP_WIDTH, (rightX - x) * 0.32) : SELF_LOOP_WIDTH;\n            const yb = m.y + SELF_LOOP_HEIGHT;\n            const d = `M${x},${m.y} L${x + loopW},${m.y} L${x + loopW},${yb} L${x},${yb}`;\n            return (\n              <g key={key}>\n                <RoughPath d={d} fill={null} style={m.dashed ? DASHED : undefined} seed={i + 1} />\n                <RoughPath d={arrowHeadPath({ x: x + loopW, y: yb }, { x, y: yb })} fill={null} />\n                {m.label && (\n                  // Label sits above the loop (centred over it), so it stays in\n                  // the column and never crosses the neighbouring lifeline.\n                  <RoughText x={x + loopW / 2} y={m.y - 6} anchor=\"middle\" baseline=\"auto\" knockout>\n                    {m.label}\n                  </RoughText>\n                )}\n              </g>\n            );\n          }\n          return (\n            <g key={key}>\n              <RoughLine\n                x1={m.x1}\n                y1={m.y}\n                x2={m.x2}\n                y2={m.y}\n                style={m.dashed ? DASHED : undefined}\n                seed={i + 1}\n              />\n              <RoughPath d={arrowHeadPath({ x: m.x1, y: m.y }, { x: m.x2, y: m.y })} fill={null} />\n              {m.label && (\n                <RoughText\n                  x={(m.x1 + m.x2) / 2}\n                  y={m.y - 7}\n                  anchor=\"middle\"\n                  baseline=\"auto\"\n                  knockout\n                >\n                  {m.label}\n                </RoughText>\n              )}\n            </g>\n          );\n        })}\n      </g>\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps, FlowDirection } from '../types/charts';\nimport type { EREntityInput, ERRelationshipInput } from '../core/er';\nimport { computeER } from '../core/er';\nimport { describeER } from '../core/a11yDescribe';\nimport { getPlotArea } from '../core/geometry';\nimport { Surface } from './Surface';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface ERDiagramProps extends BaseChartProps {\n  entities: EREntityInput[];\n  relationships?: ERRelationshipInput[];\n  direction?: FlowDirection;\n}\n\n/**\n * Entity-relationship diagram: titled entity boxes with field rows, joined by\n * orthogonally routed connectors carrying cardinality markers. `computeER` does\n * the geometry; the sketch primitives draw it.\n */\nexport function ERDiagram({\n  entities,\n  relationships,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  direction,\n}: ERDiagramProps) {\n  const plot = getPlotArea(width, height, margin);\n\n  const layout = useMemo(\n    () => computeER(entities, relationships ?? [], [plot.width, plot.height], { direction }),\n    [entities, relationships, plot.width, plot.height, direction],\n  );\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeER(entities, relationships ?? [])}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${plot.x}, ${plot.y})`}>\n        {layout.relationships.map((r, i) => {\n          const pts = r.points;\n          const d =\n            `M${pts[0].x},${pts[0].y} ` +\n            pts\n              .slice(1)\n              .map((p) => `L${p.x},${p.y}`)\n              .join(' ');\n          return (\n            <g key={`${r.from}->${r.to}-${i}`}>\n              <RoughPath d={d} fill={null} seed={i + 1} />\n              {r.fromCardinality && (\n                <RoughText\n                  x={r.fromLabelAt.x}\n                  y={r.fromLabelAt.y}\n                  anchor=\"middle\"\n                  baseline=\"middle\"\n                >\n                  {r.fromCardinality}\n                </RoughText>\n              )}\n              {r.toCardinality && (\n                <RoughText x={r.toLabelAt.x} y={r.toLabelAt.y} anchor=\"middle\" baseline=\"middle\">\n                  {r.toCardinality}\n                </RoughText>\n              )}\n            </g>\n          );\n        })}\n\n        {layout.entities.map((e, i) => {\n          const left = e.x - e.width / 2;\n          const top = e.y - e.height / 2;\n          return (\n            <g key={e.id}>\n              <RoughRectangle\n                x={left}\n                y={top}\n                width={e.width}\n                height={e.height}\n                fill=\"#ffffff\"\n                seed={i + 1}\n              />\n              <RoughLine\n                x1={left}\n                y1={top + e.headerHeight}\n                x2={left + e.width}\n                y2={top + e.headerHeight}\n                seed={i + 1}\n              />\n              <RoughText x={e.x} y={top + e.headerHeight / 2} anchor=\"middle\" baseline=\"middle\">\n                {e.label}\n              </RoughText>\n              {e.rows.map((row, ri) => (\n                <RoughText key={ri} x={left + 10} y={top + row.y} anchor=\"start\" baseline=\"middle\">\n                  {row.key ? `${row.key} ${row.text}` : row.text}\n                </RoughText>\n              ))}\n            </g>\n          );\n        })}\n      </g>\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { TimelineEventInput, TimelineOrientation } from '../core/timeline';\nimport { computeTimeline } from '../core/timeline';\nimport { getPlotArea } from '../core/geometry';\nimport { wrapText } from '../core/text';\nimport { Surface } from './Surface';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughCircle } from '../primitives/RoughCircle';\nimport { RoughText } from '../primitives/RoughText';\n\nconst NEAR_GAP = 16; // marker → nearest label line\nconst LINE_H = 15;\n\nexport interface TimelineProps extends BaseChartProps {\n  events: TimelineEventInput[];\n  orientation?: TimelineOrientation;\n}\n\n/**\n * Timeline: ordered events along a central axis, their label blocks alternating\n * to either side so they don't collide. `computeTimeline` does the geometry; a\n * marker, a connector stub and the date/title/detail text draw each event.\n */\nexport function Timeline({\n  events,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  orientation,\n}: TimelineProps) {\n  const plot = getPlotArea(width, height, margin);\n\n  const layout = useMemo(\n    () => computeTimeline(events, [plot.width, plot.height], { orientation }),\n    [events, plot.width, plot.height, orientation],\n  );\n\n  const resolved = useResolvedVibe(vibe);\n  const labelWidth =\n    layout.orientation === 'horizontal' ? plot.width / Math.max(1, events.length) - 8 : undefined;\n  // The sharp vector text reads as too crisp next to the sketchy axis/markers,\n  // so soften it: a touch smaller and slightly muted, letting it recede.\n  const textStyle = { fontSize: Math.round(resolved.fontSize * 0.92), opacity: 0.68 };\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${plot.x}, ${plot.y})`}>\n        <RoughLine\n          x1={layout.axis.x1}\n          y1={layout.axis.y1}\n          x2={layout.axis.x2}\n          y2={layout.axis.y2}\n        />\n\n        {layout.events.map((e, i) => {\n          // Build the label block as a flat list of single lines (date, label,\n          // wrapped detail) so we can place the whole block on one side of the\n          // axis with a fixed gap — no line ever crosses the axis.\n          const detailLines = e.detail\n            ? wrapText(e.detail, labelWidth ?? 9999, resolved.fontSize, resolved.fontFamily)\n            : [];\n          const lines = [...(e.date ? [e.date] : []), e.label, ...detailLines];\n          const blockH = lines.length * LINE_H;\n\n          let lineY: (k: number) => number;\n          let lineX = e.label_at.x;\n          let connTo = { x: e.marker.x, y: e.marker.y };\n          if (layout.orientation === 'horizontal') {\n            // Block sits fully above (side -1) or below (side +1) the axis.\n            const top = e.side === 1 ? e.marker.y + NEAR_GAP : e.marker.y - NEAR_GAP - blockH;\n            lineY = (k) => top + (k + 0.5) * LINE_H;\n            lineX = e.marker.x;\n            connTo = {\n              x: e.marker.x,\n              y: e.side === 1 ? e.marker.y + NEAR_GAP : e.marker.y - NEAR_GAP,\n            };\n          } else {\n            // Vertical axis: block to the left/right, vertically centred on the marker.\n            const top = e.marker.y - blockH / 2;\n            lineY = (k) => top + (k + 0.5) * LINE_H;\n            connTo = { x: e.label_at.x, y: e.marker.y };\n          }\n\n          return (\n            <g key={i}>\n              <RoughLine x1={e.marker.x} y1={e.marker.y} x2={connTo.x} y2={connTo.y} seed={i + 1} />\n              <RoughCircle\n                cx={e.marker.x}\n                cy={e.marker.y}\n                diameter={11}\n                fill=\"#ffffff\"\n                seed={i + 1}\n              />\n              {lines.map((ln, k) => (\n                <RoughText\n                  key={k}\n                  x={lineX}\n                  y={lineY(k)}\n                  anchor={e.anchor}\n                  baseline=\"middle\"\n                  style={textStyle}\n                >\n                  {ln}\n                </RoughText>\n              ))}\n            </g>\n          );\n        })}\n      </g>\n    </Surface>\n  );\n}\n","import { createElement } from 'react';\nimport type { ReactElement } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { DiagramSpec } from '../core/spec';\nimport { Flowchart } from './Flowchart';\nimport { SequenceDiagram } from './SequenceDiagram';\nimport { MindMap } from './MindMap';\nimport { ArchitectureDiagram } from './ArchitectureDiagram';\nimport { ERDiagram } from './ERDiagram';\nimport { Timeline } from './Timeline';\nimport { OrgChart } from './OrgChart';\n\nexport type DiagramRenderOptions = Omit<BaseChartProps, 'children'>;\n\n/**\n * Dispatch a {@link DiagramSpec} to its component. The single entry point behind\n * the `render_diagram` tool and the Mermaid bridge: `width`/`height`/`vibe` (and\n * any other base prop) come from `opts`. Mirrors `visualize` for charts.\n */\nexport function renderDiagram(spec: DiagramSpec, opts: DiagramRenderOptions): ReactElement {\n  switch (spec.kind) {\n    case 'flowchart':\n      return createElement(Flowchart, {\n        nodes: spec.nodes,\n        edges: spec.edges,\n        direction: spec.direction,\n        routing: spec.routing,\n        ...opts,\n      });\n    case 'sequence':\n      return createElement(SequenceDiagram, {\n        actors: spec.actors,\n        messages: spec.messages,\n        ...opts,\n      });\n    case 'mindmap':\n      return createElement(MindMap, { nodes: spec.nodes, edges: spec.edges, ...opts });\n    case 'arch':\n      return createElement(ArchitectureDiagram, {\n        nodes: spec.nodes,\n        edges: spec.edges,\n        direction: spec.direction,\n        ...opts,\n      });\n    case 'er':\n      return createElement(ERDiagram, {\n        entities: spec.entities,\n        relationships: spec.relationships,\n        direction: spec.direction,\n        ...opts,\n      });\n    case 'timeline':\n      return createElement(Timeline, {\n        events: spec.events,\n        orientation: spec.orientation,\n        ...opts,\n      });\n    case 'org':\n      return createElement(OrgChart, {\n        nodes: spec.nodes,\n        edges: spec.edges,\n        direction: spec.direction,\n        ...opts,\n      });\n  }\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { SankeyLinkInput, SankeyNodeInput, SankeyOrientation } from '../core/sankey';\nimport { computeSankey } from '../core/sankey';\nimport { describeSankey } from '../core/a11yDescribe';\nimport { getPlotArea } from '../core/geometry';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { measureText } from '../core/text';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface SankeyChartProps extends BaseChartProps {\n  nodes: SankeyNodeInput[];\n  links: SankeyLinkInput[];\n  direction?: SankeyOrientation;\n  nodeWidth?: number;\n  nodePadding?: number;\n  showValues?: boolean;\n}\n\n/**\n * Weighted flow diagram. `computeSankey` (built on the DAG layering) sizes nodes\n * by throughput and ribbons by value; `<RoughRectangle>` draws nodes and\n * `<RoughPath>` draws each translucent ribbon.\n */\nexport function SankeyChart({\n  nodes,\n  links,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  direction = 'LR',\n  nodeWidth = 16,\n  nodePadding = 12,\n  showValues = false,\n}: SankeyChartProps) {\n  const plot = getPlotArea(width, height, margin);\n  const horizontal = direction === 'LR';\n\n  // For LR flows the node labels sit to the right of each node; reserve a right\n  // margin (sized to the widest label + room for the value) so the last column's\n  // labels don't run off the canvas.\n  const rv = resolveVibe(vibe);\n  const maxLabelW = Math.max(\n    0,\n    ...nodes.map((n) => measureText(n.label ?? n.id, rv.fontSize, rv.fontFamily).width),\n  );\n  const rightPad = horizontal ? Math.ceil(maxLabelW + (showValues ? 44 : 8) + 6) : 0;\n  const layoutWidth = Math.max(1, plot.width - rightPad);\n\n  const layout = useMemo(\n    () =>\n      computeSankey(nodes, links, [layoutWidth, plot.height], {\n        direction,\n        nodeWidth,\n        nodePadding,\n      }),\n    [nodes, links, direction, nodeWidth, nodePadding, layoutWidth, plot.height],\n  );\n\n  const palette = resolveBrand(brand).palette;\n  const colorOf = useMemo(() => {\n    const map = new Map<string, string>();\n    layout.nodes.forEach((n, i) => map.set(n.id, n.color ?? colorAt(i, palette)));\n    return map;\n  }, [layout.nodes, palette]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description ?? describeSankey(nodes, links)}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${plot.x}, ${plot.y})`}>\n        {layout.links.map((link, i) => (\n          <RoughPath\n            key={`${link.source}->${link.target}-${i}`}\n            d={link.path}\n            stroke={colorOf.get(link.source)}\n            fill={colorOf.get(link.source)}\n            vibe={{ roughness: 0.6, fillStyle: 'solid', disableMultiStroke: true }}\n            style={{ opacity: 0.4 }}\n            seed={i + 1}\n          />\n        ))}\n        {layout.nodes.map((node, i) => (\n          <g key={node.id}>\n            <RoughRectangle\n              x={node.x}\n              y={node.y}\n              width={node.width}\n              height={node.height}\n              fill={colorOf.get(node.id)}\n              seed={i + 1}\n            />\n            <RoughText\n              x={horizontal ? node.x + node.width + 4 : node.x + node.width / 2}\n              y={horizontal ? node.y + node.height / 2 : node.y + node.height + 4}\n              anchor={horizontal ? 'start' : 'middle'}\n              baseline={horizontal ? 'middle' : 'hanging'}\n            >\n              {`${node.label ?? node.id}${showValues ? ` (${node.value})` : ''}`}\n            </RoughText>\n          </g>\n        ))}\n      </g>\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { TreemapDatum, TreemapTile } from '../core/treemap';\nimport { computeTreemap } from '../core/treemap';\nimport { getPlotArea } from '../core/geometry';\nimport { ordinalColor } from '../core/colorScales';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface TreemapChartProps extends BaseChartProps {\n  data: TreemapDatum[];\n  padding?: number;\n  tile?: TreemapTile;\n  showLabels?: boolean;\n}\n\nconst MIN_LABEL_W = 28;\nconst MIN_LABEL_H = 18;\n\n/**\n * Space-filling nested rectangles sized by value. `computeTreemap` (d3-hierarchy)\n * does the math; one `<RoughRectangle>` per leaf, colored by its top-level group.\n */\nexport function TreemapChart({\n  data,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  padding = 2,\n  tile = 'squarify',\n  showLabels = true,\n}: TreemapChartProps) {\n  const plot = getPlotArea(width, height, margin);\n\n  const leaves = useMemo(\n    () => computeTreemap(data, [plot.width, plot.height], { padding, tile }),\n    [data, padding, tile, plot.width, plot.height],\n  );\n\n  const colorOf = useMemo(() => ordinalColor(leaves.map((l) => l.groupId)), [leaves]);\n\n  // Airier hachure so the cell labels read clearly over the fill (the default\n  // dense fill competes with the text). Spread the resolved vibe so the theme is\n  // preserved — a bare override object would reset to the default preset.\n  const rv = resolveVibe(vibe);\n  const cellVibe = {\n    ...rv,\n    hachureGap: Math.max(rv.hachureGap, 7),\n    fillWeight: Math.min(rv.fillWeight, 0.7),\n  };\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      <g transform={`translate(${plot.x}, ${plot.y})`}>\n        {leaves.map((leaf, i) => {\n          const w = leaf.x1 - leaf.x0;\n          const h = leaf.y1 - leaf.y0;\n          const labelFits = showLabels && leaf.label && w >= MIN_LABEL_W && h >= MIN_LABEL_H;\n          return (\n            <g key={leaf.id}>\n              <RoughRectangle\n                x={leaf.x0}\n                y={leaf.y0}\n                width={w}\n                height={h}\n                fill={leaf.color ?? colorOf(leaf.groupId)}\n                vibe={cellVibe}\n                seed={i + 1}\n              />\n              {labelFits && (\n                <RoughText\n                  x={leaf.x0 + w / 2}\n                  y={leaf.y0 + h / 2}\n                  anchor=\"middle\"\n                  baseline=\"middle\"\n                  maxWidth={w - 6}\n                >\n                  {leaf.label as string}\n                </RoughText>\n              )}\n            </g>\n          );\n        })}\n      </g>\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { ColorScaleName } from '../core/colorScales';\nimport { sequentialColor, vibeColorScale } from '../core/colorScales';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { bandScale } from '../core/scales';\nimport { getPlotArea } from '../core/geometry';\nimport { Surface } from './Surface';\nimport { Axis } from './Axis';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface HeatmapDatum {\n  x: string | number;\n  y: string | number;\n  value: number;\n}\n\nexport interface HeatmapChartProps extends BaseChartProps {\n  data: HeatmapDatum[];\n  xLabels?: (string | number)[];\n  yLabels?: (string | number)[];\n  colorScale?: ColorScaleName | ((value: number) => string);\n  showValues?: boolean;\n  showAxes?: boolean;\n}\n\nfunction uniqueInOrder(values: (string | number)[]): string[] {\n  const seen = new Set<string>();\n  const out: string[] = [];\n  for (const v of values) {\n    const s = String(v);\n    if (!seen.has(s)) {\n      seen.add(s);\n      out.push(s);\n    }\n  }\n  return out;\n}\n\n/**\n * Grid of cells colored by value on a sequential color scale. Band scales place\n * the cells; `<RoughRectangle>` draws each one.\n */\nexport function HeatmapChart({\n  data,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  xLabels,\n  yLabels,\n  colorScale,\n  showValues = false,\n  showAxes = true,\n}: HeatmapChartProps) {\n  const plot = getPlotArea(width, height, margin);\n  // Default to a monochrome ramp in the vibe's own hue so the heatmap matches\n  // the theme; an explicit `colorScale` (named or function) still wins.\n  const resolved = resolveVibe(vibe);\n  const themeColor = resolved.fill ?? resolved.stroke;\n\n  const { cells, x, y } = useMemo(() => {\n    const xDomain = xLabels ? xLabels.map(String) : uniqueInOrder(data.map((d) => d.x));\n    const yDomain = yLabels ? yLabels.map(String) : uniqueInOrder(data.map((d) => d.y));\n    const xScale = bandScale(xDomain, [plot.x, plot.x + plot.width], 0.06);\n    const yScale = bandScale(yDomain, [plot.y, plot.y + plot.height], 0.06);\n\n    const values = data.map((d) => d.value);\n    const min = values.length ? Math.min(...values) : 0;\n    const max = values.length ? Math.max(...values) : 1;\n    const color =\n      typeof colorScale === 'function'\n        ? colorScale\n        : colorScale\n          ? sequentialColor(colorScale, [min, max])\n          : vibeColorScale(themeColor, [min, max]);\n\n    const computed = data.map((d) => ({\n      key: `${d.x}:${d.y}`,\n      x: xScale(String(d.x)) ?? plot.x,\n      y: yScale(String(d.y)) ?? plot.y,\n      width: xScale.bandwidth(),\n      height: yScale.bandwidth(),\n      fill: color(d.value),\n      value: d.value,\n    }));\n\n    return { cells: computed, x: xScale, y: yScale };\n  }, [data, xLabels, yLabels, colorScale, themeColor, plot.x, plot.y, plot.width, plot.height]);\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {cells.map((cell, i) => (\n        <g key={cell.key}>\n          <RoughRectangle\n            x={cell.x}\n            y={cell.y}\n            width={cell.width}\n            height={cell.height}\n            fill={cell.fill}\n            vibe={{ roughness: 0.5, fillStyle: 'solid', disableMultiStroke: true }}\n            seed={i + 1}\n          />\n          {showValues && (\n            <RoughText\n              x={cell.x + cell.width / 2}\n              y={cell.y + cell.height / 2}\n              anchor=\"middle\"\n              baseline=\"middle\"\n            >\n              {String(cell.value)}\n            </RoughText>\n          )}\n        </g>\n      ))}\n      {showAxes && (\n        <>\n          <Axis scale={x} orientation=\"bottom\" plot={plot} />\n          <Axis scale={y} orientation=\"left\" plot={plot} />\n        </>\n      )}\n    </Surface>\n  );\n}\n","import { useMemo } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport { axisAngle, polarToCartesian, polygonPath } from '../core/polar';\nimport { linearScale } from '../core/scales';\nimport { getPlotArea } from '../core/geometry';\nimport { colorAt } from '../core/palette';\nimport { resolveBrand } from '../brand/resolveBrand';\nimport { layoutLegend } from '../core/legend';\nimport type { LegendItem } from '../core/legend';\nimport { resolveVibe } from '../vibe/resolveVibe';\nimport { Surface } from './Surface';\nimport { Legend } from './Legend';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughLine } from '../primitives/RoughLine';\nimport { RoughCircle } from '../primitives/RoughCircle';\nimport { RoughText } from '../primitives/RoughText';\n\nexport interface RadarSeries {\n  id: string;\n  values: number[];\n  color?: string;\n}\n\nexport interface RadarChartProps extends BaseChartProps {\n  axes: string[];\n  series: RadarSeries[];\n  maxValue?: number;\n  levels?: number;\n  showDots?: boolean;\n  showLabels?: boolean;\n  /** Show a legend below the chart for multiple series. Defaults to on. */\n  showLegend?: boolean;\n}\n\n/**\n * Polar multi-axis (spider) chart. `core/polar.ts` maps each value to a point on\n * its axis; a closed `<RoughPath>` draws each series over faint grid rings.\n */\nexport function RadarChart({\n  axes,\n  series,\n  width,\n  height,\n  margin,\n  vibe,\n  brand,\n  title,\n  description,\n  ariaLabel,\n  className,\n  style,\n  bare,\n  maxValue,\n  levels = 4,\n  showDots = true,\n  showLabels = true,\n  showLegend = true,\n}: RadarChartProps) {\n  const fullPlot = getPlotArea(width, height, margin);\n  const rv = resolveVibe(vibe);\n  const palette = resolveBrand(brand).palette;\n  const legendItems: LegendItem[] =\n    showLegend && series.length > 1\n      ? series.map((s, i) => ({ label: s.id, color: s.color ?? colorAt(i, palette) }))\n      : [];\n  const legendModel = legendItems.length\n    ? layoutLegend(legendItems, fullPlot.width, {\n        fontSize: rv.fontSize,\n        fontFamily: rv.fontFamily,\n      })\n    : null;\n  const plot = legendModel\n    ? { ...fullPlot, height: Math.max(1, fullPlot.height - legendModel.height - 36) }\n    : fullPlot;\n\n  const geom = useMemo(() => {\n    const n = axes.length;\n    const cx = plot.x + plot.width / 2;\n    const cy = plot.y + plot.height / 2;\n    const radius = Math.max(0, Math.min(plot.width, plot.height) / 2 - 28);\n\n    const dataMax = Math.max(1, ...series.flatMap((s) => s.values));\n    const max = maxValue ?? dataMax;\n    const rScale = linearScale([0, max], [0, radius]);\n\n    const rings = Array.from({ length: levels }, (_, l) => {\n      const r = (radius * (l + 1)) / levels;\n      return polygonPath(\n        Array.from({ length: n }, (_, i) => polarToCartesian(cx, cy, r, axisAngle(i, n))),\n      );\n    });\n\n    const spokes = Array.from({ length: n }, (_, i) =>\n      polarToCartesian(cx, cy, radius, axisAngle(i, n)),\n    );\n    const labels = Array.from({ length: n }, (_, i) => ({\n      label: axes[i],\n      ...polarToCartesian(cx, cy, radius + 18, axisAngle(i, n)),\n    }));\n\n    const seriesGeom = series.map((s) => {\n      const pts = axes.map((_, i) =>\n        polarToCartesian(cx, cy, rScale(s.values[i] ?? 0), axisAngle(i, n)),\n      );\n      return { id: s.id, color: s.color, path: polygonPath(pts), points: pts };\n    });\n\n    return { cx, cy, rings, spokes, labels, seriesGeom };\n  }, [axes, series, maxValue, levels, plot.x, plot.y, plot.width, plot.height]);\n\n  const faint = { roughness: 0.5, fill: null, disableMultiStroke: true } as const;\n\n  return (\n    <Surface\n      width={width}\n      height={height}\n      vibe={vibe}\n      brand={brand}\n      title={title}\n      description={description}\n      ariaLabel={ariaLabel}\n      className={className}\n      style={style}\n      bare={bare}\n    >\n      {geom.rings.map((d, i) => (\n        <RoughPath key={`ring-${i}`} d={d} fill={null} vibe={faint} seed={i + 1} />\n      ))}\n      {geom.spokes.map((p, i) => (\n        <RoughLine\n          key={`spoke-${i}`}\n          x1={geom.cx}\n          y1={geom.cy}\n          x2={p.x}\n          y2={p.y}\n          vibe={faint}\n          seed={i + 1}\n        />\n      ))}\n      {geom.seriesGeom.map((s, i) => (\n        <g key={s.id}>\n          {/* Multiple series overlap, so draw outline-only (filled hachure of two\n              series tangles into noise); a single series keeps its fill. */}\n          <RoughPath\n            d={s.path}\n            stroke={s.color ?? colorAt(i, palette)}\n            fill={series.length > 1 ? null : (s.color ?? colorAt(i, palette))}\n            vibe={{ fillStyle: 'hachure', fillWeight: 1 }}\n            style={{ opacity: series.length > 1 ? 1 : 0.85 }}\n            seed={i + 1}\n          />\n          {showDots &&\n            s.points.map((p, j) => (\n              <RoughCircle\n                key={j}\n                cx={p.x}\n                cy={p.y}\n                diameter={7}\n                fill={s.color ?? colorAt(i, palette)}\n                seed={i * 10 + j + 1}\n              />\n            ))}\n        </g>\n      ))}\n      {showLabels &&\n        geom.labels.map((l, i) => (\n          <RoughText key={`label-${i}`} x={l.x} y={l.y} anchor=\"middle\" baseline=\"middle\">\n            {l.label}\n          </RoughText>\n        ))}\n      {legendModel && (\n        <Legend\n          items={legendItems}\n          x={fullPlot.x}\n          y={plot.y + plot.height + 30}\n          width={fullPlot.width}\n        />\n      )}\n    </Surface>\n  );\n}\n","import { createElement } from 'react';\nimport type { ComponentType, ReactElement } from 'react';\nimport type { BaseChartProps } from '../types/charts';\nimport type { ComponentName } from '../core/compile';\nimport type { Intent } from '../core/recommend';\nimport { planChart } from '../core/planChart';\nimport { BarChart } from './BarChart';\nimport { LineChart } from './LineChart';\nimport { AreaChart } from './AreaChart';\nimport { ScatterPlot } from './ScatterPlot';\nimport { PieChart } from './PieChart';\nimport { HeatmapChart } from './HeatmapChart';\nimport { SankeyChart } from './SankeyChart';\nimport { TreemapChart } from './TreemapChart';\nimport { RadarChart } from './RadarChart';\n\nconst REGISTRY: Record<ComponentName, ComponentType<any>> = {\n  BarChart,\n  LineChart,\n  AreaChart,\n  ScatterPlot,\n  PieChart,\n  HeatmapChart,\n  SankeyChart,\n  TreemapChart,\n  RadarChart,\n};\n\nexport interface VisualizeOptions extends Omit<BaseChartProps, 'children'> {\n  /** Steer the recommendation (trend/compare/composition/…). */\n  intent?: Intent;\n  /** Plain-English query — picks the chart, field roles, and vibe. Explicit props still win. */\n  query?: string;\n}\n\n/**\n * The one-call entry point: profile the data, recommend a chart (optionally\n * steered by a plain-English `query`), compile it to props, and return the\n * rendered element. `width`/`height` (and any other chart prop) come from `opts`\n * and win over both the auto-derived and query-derived props.\n */\nexport function visualize(data: Record<string, unknown>[], opts: VisualizeOptions): ReactElement {\n  const { intent, query, ...chartProps } = opts;\n  const { compiled } = planChart(data, { intent, query });\n  return createElement(REGISTRY[compiled.component], { ...compiled.props, ...chartProps });\n}\n\nexport interface AutoChartProps extends BaseChartProps {\n  data: Record<string, unknown>[];\n  intent?: Intent;\n  /** Plain-English query — picks the chart, field roles, and vibe. */\n  query?: string;\n}\n\n/** Component form of {@link visualize}. */\nexport function AutoChart({ data, intent, query, ...rest }: AutoChartProps): ReactElement {\n  return visualize(data, { intent, query, ...rest });\n}\n","/**\n * Icon stroke paths and fixed tone colors for `Badge`. Pure data, no React.\n *\n * Icon authoring contract (per spec):\n *  - viewBox 16x16\n *  - stroke-only (no `Z`, no fills)\n *  - single open sub-path preferred; if a glyph genuinely needs two strokes,\n *    the entry may be `string[]` and the component renders each as its own\n *    Rough path.\n */\n\nexport const BADGE_TONES = ['neutral', 'info', 'success', 'warn', 'danger'] as const;\nexport type BadgeTone = (typeof BADGE_TONES)[number];\n\nexport const BADGE_ICONS = [\n  'star',\n  'fork',\n  'issue',\n  'tag',\n  'commit',\n  'license',\n  'lang',\n  'check',\n] as const;\nexport type BadgeIcon = (typeof BADGE_ICONS)[number];\n\nexport const isBadgeTone = (x: unknown): x is BadgeTone =>\n  (BADGE_TONES as readonly string[]).includes(x as string);\nexport const isBadgeIcon = (x: unknown): x is BadgeIcon =>\n  (BADGE_ICONS as readonly string[]).includes(x as string);\n\n/** Stroke-only path data, authored against a 16x16 box. */\nexport const BADGE_ICON_PATHS: Record<BadgeIcon, string | string[]> = {\n  // Five-point star outline (open at the top tip so it remains an open stroke).\n  star: 'M8 1 L10 6 L15 6 L11 9.5 L12.5 14.5 L8 11.5 L3.5 14.5 L5 9.5 L1 6 L6 6',\n  // Two circles + a connector (git fork glyph).\n  fork: [\n    'M4 3 a2 2 0 1 0 0 4 a2 2 0 1 0 0 -4',\n    'M12 3 a2 2 0 1 0 0 4 a2 2 0 1 0 0 -4',\n    'M4 7 L4 11 a2 2 0 0 0 2 2 L10 13',\n    'M12 7 L12 9',\n  ],\n  // Circle with vertical bar (open issue indicator).\n  issue: ['M8 1 a7 7 0 1 0 0 14 a7 7 0 1 0 0 -14', 'M8 5 L8 9', 'M8 11 L8 12'],\n  // Price-tag silhouette (open stroke; no Z).\n  tag: 'M1 8 L8 1 L15 1 L15 8 L8 15',\n  // Git commit dot + line.\n  commit: ['M2 8 L6 8', 'M10 8 L14 8', 'M8 6 a2 2 0 1 0 0 4 a2 2 0 1 0 0 -4'],\n  // Scroll silhouette (open).\n  license: ['M3 2 L13 2 L13 13 L8 13', 'M3 2 L3 13 L8 13 L8 11', 'M5 5 L11 5', 'M5 8 L11 8'],\n  // Three vertical bars (language stack).\n  lang: ['M3 13 L3 5', 'M8 13 L8 3', 'M13 13 L13 7'],\n  // Check mark.\n  check: 'M2 9 L6 13 L14 3',\n};\n\nexport const BADGE_TONE_COLORS: Record<'success' | 'warn' | 'danger', string> = {\n  success: '#3a8a3a',\n  warn: '#b8860b',\n  danger: '#b13a3a',\n};\n","import { resolveBrand } from '../brand';\nimport { resolveVibe } from '../vibe';\nimport type { BrandConfig } from '../types/brand';\nimport type { VibeConfig } from '../types/vibe';\nimport { RoughPath } from '../primitives/RoughPath';\nimport { RoughText } from '../primitives/RoughText';\nimport { measureText } from '../core/text';\nimport {\n  BADGE_ICON_PATHS,\n  BADGE_TONE_COLORS,\n  type BadgeIcon,\n  type BadgeTone,\n} from '../core/badgeIcons';\n\n/**\n * Intrinsic-SVG GitHub-style badge: `[icon] label │ value` in a rounded pill.\n *\n * Renders without a `<Surface>` and without reading brand/vibe from React\n * context. Brand and vibe are resolved in the body, so the badge can be dropped\n * into any markdown / README / chart row at its own size. See CLAUDE.md's\n * \"brand-without-context\" pattern.\n */\n\nconst HEIGHT = 26;\nconst PAD_X = 8;\nconst ICON_SIZE = 16;\nconst ICON_GAP = 6;\nconst DIVIDER_GAP = 8;\nconst DIVIDER_W = 1;\n\nexport interface BadgeProps {\n  label: string;\n  value: string;\n  /** Default `'neutral'`. */\n  tone?: BadgeTone;\n  icon?: BadgeIcon;\n  vibe?: VibeConfig;\n  brand?: BrandConfig;\n  seed?: number;\n  className?: string;\n}\n\n/** Build an SVG path `d` for a rounded rectangle (open subpath closed via `Z`). */\nfunction roundedRectPath(x: number, y: number, w: number, h: number, r: number): string {\n  const rr = Math.min(r, w / 2, h / 2);\n  return (\n    `M${x + rr},${y}` +\n    `H${x + w - rr}` +\n    `A${rr},${rr} 0 0 1 ${x + w},${y + rr}` +\n    `V${y + h - rr}` +\n    `A${rr},${rr} 0 0 1 ${x + w - rr},${y + h}` +\n    `H${x + rr}` +\n    `A${rr},${rr} 0 0 1 ${x},${y + h - rr}` +\n    `V${y + rr}` +\n    `A${rr},${rr} 0 0 1 ${x + rr},${y}` +\n    `Z`\n  );\n}\n\nexport function Badge({\n  label,\n  value,\n  tone = 'neutral',\n  icon,\n  vibe,\n  brand,\n  seed,\n  className,\n}: BadgeProps) {\n  // Resolve brand + vibe directly in the body (no provider context). The\n  // resolved vibe carries the effective stroke/font/fontSize after the brand's\n  // ink/font knobs are layered onto whatever preset the caller chose.\n  const b = resolveBrand(brand);\n  const v = resolveVibe(vibe, b.vibeOverrides);\n  const ink = v.stroke;\n  const font = v.fontFamily;\n  const fontSize = v.fontSize;\n\n  const labelW = measureText(label, fontSize, font).width;\n  const valueW = measureText(value, fontSize, font).width;\n  const iconW = icon ? ICON_SIZE + ICON_GAP : 0;\n  const dividerX = PAD_X + iconW + labelW + DIVIDER_GAP;\n  const valueX = dividerX + DIVIDER_W + DIVIDER_GAP;\n  // Math.ceil so the row tool's integer-only regex can parse the width.\n  const width = Math.ceil(valueX + valueW + PAD_X);\n\n  // Tone → value fill colour.\n  const valueFill =\n    tone === 'neutral'\n      ? b.palette[0]\n      : tone === 'info'\n        ? (b.palette[1] ?? b.palette[0])\n        : BADGE_TONE_COLORS[tone];\n\n  // Vibe used by each `RoughText` so the badge's font/size/stroke override any\n  // ambient vibe context and stay deterministic across SSR.\n  const textVibe: VibeConfig = { fontFamily: font, fontSize, stroke: ink };\n\n  // Pill outline as a sketchy rounded-rectangle path. `RoughRectangle` doesn't\n  // expose `rx`/`ry`, so we feed a rounded-rect `d` to `RoughPath` instead of\n  // widening the primitive API.\n  const outlineD = roundedRectPath(0.5, 0.5, width - 1, HEIGHT - 1, 6);\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width={width}\n      height={HEIGHT}\n      viewBox={`0 0 ${width} ${HEIGHT}`}\n      className={className}\n    >\n      {/* Label half (ink wash @ 12%). Plain rect — flat fills don't want\n          sketchy hachure, and `RoughRectangle` has no `fillStyle`/`opacity`\n          surface to tune anyway. Clipped to the pill so the corners stay round. */}\n      <clipPath id={`gc-badge-clip-${width}`}>\n        <path d={outlineD} />\n      </clipPath>\n      <g clipPath={`url(#gc-badge-clip-${width})`}>\n        <rect x={0} y={0} width={dividerX} height={HEIGHT} fill={ink} fillOpacity={0.12} />\n        <rect\n          x={dividerX}\n          y={0}\n          width={width - dividerX}\n          height={HEIGHT}\n          fill={valueFill}\n          fillOpacity={0.18}\n        />\n      </g>\n      {/* Sketchy outline */}\n      <RoughPath d={outlineD} stroke={ink} fill={null} seed={seed} vibe={vibe} />\n      {/* Divider */}\n      <line\n        x1={dividerX}\n        y1={3}\n        x2={dividerX}\n        y2={HEIGHT - 3}\n        stroke={ink}\n        strokeWidth={DIVIDER_W}\n      />\n      {/* Optional icon */}\n      {icon ? renderIcon(icon, PAD_X, (HEIGHT - ICON_SIZE) / 2, ink, seed, vibe) : null}\n      {/* Label text */}\n      <RoughText\n        x={PAD_X + iconW + labelW / 2}\n        y={HEIGHT / 2}\n        anchor=\"middle\"\n        baseline=\"middle\"\n        fill={ink}\n        vibe={textVibe}\n      >\n        {label}\n      </RoughText>\n      {/* Value text */}\n      <RoughText\n        x={valueX + valueW / 2}\n        y={HEIGHT / 2}\n        anchor=\"middle\"\n        baseline=\"middle\"\n        fill={ink}\n        vibe={textVibe}\n      >\n        {value}\n      </RoughText>\n      {/* Mention the value-fill color even when it would otherwise only appear\n          as `fillOpacity`'d markup that the test regex still finds — the rect\n          above already carries it, this is just belt-and-braces for clarity. */}\n    </svg>\n  );\n}\n\nfunction renderIcon(\n  name: BadgeIcon,\n  ox: number,\n  oy: number,\n  stroke: string,\n  seed: number | undefined,\n  vibe: VibeConfig | undefined,\n) {\n  const entry = BADGE_ICON_PATHS[name];\n  const strokes = Array.isArray(entry) ? entry : [entry];\n  return (\n    <g transform={`translate(${ox}, ${oy})`}>\n      {strokes.map((d, i) => (\n        <RoughPath\n          key={i}\n          d={d}\n          stroke={stroke}\n          fill={null}\n          seed={seed === undefined ? undefined : seed + i}\n          vibe={vibe}\n        />\n      ))}\n    </g>\n  );\n}\n","import type { ComponentName } from './compile';\n\nexport type CrosswalkComponent = ComponentName | 'ChoroplethMap';\n\nexport type CrosswalkResult =\n  | { component: CrosswalkComponent; props: Record<string, unknown> }\n  | { unsupported: { type: string; reason: string } };\n\nconst num = (v: unknown): number =>\n  typeof v === 'number' ? v : typeof v === 'string' ? Number(v.replace(/,/g, '')) || 0 : 0;\nconst str = (v: unknown): string => String(v ?? '');\n/** FusionCharts allows hex without '#'; normalize to a CSS color. */\nconst color = (v: unknown): string | undefined => {\n  const s = str(v).trim();\n  if (!s) return undefined;\n  return /^[0-9a-fA-F]{6}$/.test(s) ? `#${s}` : s;\n};\n\ninterface FusionInput {\n  type?: string;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  dataSource?: any;\n}\n\nconst TYPE_MAP: Record<string, ComponentName> = {\n  line: 'LineChart',\n  spline: 'LineChart',\n  msline: 'LineChart',\n  msspline: 'LineChart',\n  zoomline: 'LineChart',\n  column2d: 'BarChart',\n  bar2d: 'BarChart',\n  mscolumn2d: 'BarChart',\n  msbar2d: 'BarChart',\n  stackedcolumn2d: 'BarChart',\n  stackedbar2d: 'BarChart',\n  area2d: 'AreaChart',\n  msarea2d: 'AreaChart',\n  stackedarea2d: 'AreaChart',\n  pie2d: 'PieChart',\n  pie3d: 'PieChart',\n  doughnut2d: 'PieChart',\n  doughnut3d: 'PieChart',\n  scatter: 'ScatterPlot',\n  bubble: 'ScatterPlot',\n  radar: 'RadarChart',\n  heatmap: 'HeatmapChart',\n  treemap: 'TreemapChart',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction config(chart: any): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  if (chart?.caption) out.title = str(chart.caption);\n  return out;\n}\n\nexport function fusionToGoldenChart(input: FusionInput): CrosswalkResult {\n  const type = str(input?.type).toLowerCase();\n  const dataSource = input?.dataSource ?? {};\n  const chart = dataSource.chart ?? {};\n  const cfg = config(chart);\n\n  // Maps\n  if (type.startsWith('maps/')) {\n    if (type === 'maps/usa') {\n      return {\n        component: 'ChoroplethMap',\n        props: {\n          ...cfg,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          data: (dataSource.data ?? []).map((d: any) => ({\n            region: str(d.id).toUpperCase(),\n            value: num(d.value),\n          })),\n        },\n      };\n    }\n    return { unsupported: { type, reason: 'only maps/usa is supported' } };\n  }\n\n  const component = TYPE_MAP[type];\n  if (!component)\n    return { unsupported: { type: type || '(none)', reason: 'no GoldenChart equivalent' } };\n\n  switch (component) {\n    case 'BarChart': {\n      const mode = type.startsWith('stacked')\n        ? 'stacked'\n        : type.startsWith('ms')\n          ? 'grouped'\n          : 'single';\n      if (mode === 'single') {\n        return {\n          component,\n          props: {\n            ...cfg,\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            data: (dataSource.data ?? []).map((d: any) => ({\n              label: str(d.label),\n              value: num(d.value),\n              color: color(d.color),\n            })),\n          },\n        };\n      }\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const cats = (dataSource.categories?.[0]?.category ?? []).map((c: any) => str(c.label));\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const seriesKeys = (dataSource.dataset ?? []).map((s: any) => str(s.seriesname));\n      const data = cats.map((label: string, i: number) => ({\n        label,\n        values: Object.fromEntries(\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (dataSource.dataset ?? []).map((s: any) => [str(s.seriesname), num(s.data?.[i]?.value)]),\n        ),\n      }));\n      return { component, props: { ...cfg, data, mode, seriesKeys } };\n    }\n    case 'LineChart':\n    case 'AreaChart': {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const series = (dataSource.dataset ?? []).map((s: any) => ({\n        id: str(s.seriesname),\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        points: (s.data ?? []).map((p: any, i: number) => ({ x: i, y: num(p.value) })),\n      }));\n      if (series.length === 0 && dataSource.data) {\n        series.push({\n          id: str(chart.caption) || 'series',\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          points: dataSource.data.map((p: any, i: number) => ({ x: i, y: num(p.value) })),\n        });\n      }\n      return { component, props: { ...cfg, series } };\n    }\n    case 'PieChart':\n      return {\n        component,\n        props: {\n          ...cfg,\n          innerRadius: type.startsWith('doughnut') ? 60 : 0,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          data: (dataSource.data ?? []).map((d: any) => ({\n            label: str(d.label),\n            value: num(d.value),\n            color: color(d.color),\n          })),\n        },\n      };\n    case 'ScatterPlot':\n      return {\n        component,\n        props: {\n          ...cfg,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          data: (dataSource.dataset?.[0]?.data ?? dataSource.data ?? []).map((d: any) => {\n            const p: { x: number; y: number; r?: number } = { x: num(d.x), y: num(d.y) };\n            if (d.z !== undefined) p.r = num(d.z);\n            return p;\n          }),\n        },\n      };\n    case 'RadarChart':\n    case 'HeatmapChart':\n    case 'TreemapChart':\n      // Supported types, but their FusionCharts data shapes differ enough that\n      // v1 returns `unsupported` rather than risk a silently-wrong render.\n      return { unsupported: { type, reason: `${component} crosswalk not implemented in v1` } };\n    default:\n      return { unsupported: { type, reason: 'no GoldenChart equivalent' } };\n  }\n}\n"]}