{"version":3,"sources":["../src/interactive/readMark.ts","../src/core/zoom.ts","../src/core/scales.ts","../src/interactive/useZoomPan.ts","../src/vibe/presets.ts","../src/vibe/resolveVibe.ts","../src/vibe/VibeProvider.tsx","../src/render/roughGenerator.ts","../src/primitives/SketchPaths.tsx","../src/primitives/RoughRectangle.tsx","../src/interactive/Brush.tsx","../src/core/brush.ts","../src/core/transition.ts","../src/interactive/useDataTransition.ts","../src/core/linkSelection.ts","../src/interactive/LinkedCharts.tsx","../src/components/SeriesVisibilityContext.tsx","../src/core/seriesVisibility.ts","../src/core/text.ts","../src/primitives/RoughText.tsx","../src/interactive/placeTooltip.ts","../src/interactive/defaultTooltipFormat.ts","../src/interactive/Tooltip.tsx","../src/primitives/RoughLine.tsx","../src/interactive/Crosshair.tsx","../src/interactive/hoverStyle.ts","../src/interactive/selectStyle.ts","../src/interactive/InteractiveChart.tsx","../src/interactive/embed.ts"],"names":["useState","useRef","useCallback","createContext","useMemo","useContext","rough","useId","jsxs","jsx","useEffect","cloneElement"],"mappings":"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;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA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","file":"interactive.cjs","sourcesContent":["import type { MarkKind, MarkMeta } from '../types/interaction';\n\n/**\n * Parse the nearest `data-gc-*` tagged ancestor (or self) into MarkMeta.\n * Client-only: call it on a pointer/focus event target. Returns null when the\n * element is not part of a tagged mark.\n */\nexport function readMark(el: Element): MarkMeta | null {\n  const host = el.closest('[data-gc-mark]');\n  if (!host) return null;\n  const get = (n: string) => host.getAttribute(n);\n  const raw = get('data-gc-value');\n  const value: MarkMeta['value'] =\n    raw == null ? 0 : raw.startsWith('{') ? JSON.parse(raw) : Number(raw);\n  const series = get('data-gc-series');\n  const label = get('data-gc-label');\n  return {\n    kind: get('data-gc-mark') as MarkKind,\n    index: Number(get('data-gc-index')),\n    value,\n    cx: Number(get('data-gc-cx')),\n    cy: Number(get('data-gc-cy')),\n    ...(series != null ? { series } : {}),\n    ...(label != null ? { label } : {}),\n  };\n}\n","/** Domain math for semantic zoom/pan. Pure: no DOM, no scales. */\nexport type Domain = [number, number];\n\n/**\n * Zoom around `focus`, a 0..1 fraction of the current domain (0 = low edge,\n * 1 = high edge). `factor < 1` zooms in, `factor > 1` zooms out. The focus point\n * stays stationary in data space.\n */\nexport function zoomDomain([lo, hi]: Domain, focus: number, factor: number): Domain {\n  const anchor = lo + (hi - lo) * focus;\n  return [anchor - (anchor - lo) * factor, anchor + (hi - anchor) * factor];\n}\n\n/** Shift the whole domain by a data-space delta. */\nexport function panDomain([lo, hi]: Domain, deltaData: number): Domain {\n  return [lo + deltaData, hi + deltaData];\n}\n\n/**\n * Clamp a domain inside `bounds`, capping the span to the bounds' span and\n * enforcing `minSpan`, then sliding it back inside if it ran past an edge.\n */\nexport function clampDomain([lo, hi]: Domain, [bLo, bHi]: Domain, minSpan: number): Domain {\n  const span = Math.max(minSpan, Math.min(hi - lo, bHi - bLo));\n  const nLo = Math.max(bLo, Math.min(lo, bHi - span));\n  return [nLo, nLo + span];\n}\n\n/** One wheel notch -> zoom factor. Scroll up (deltaY < 0) zooms in; reciprocals\n *  so a zoom-in then zoom-out returns to the original domain. */\nexport function wheelFactor(deltaY: number): number {\n  return deltaY < 0 ? 0.8 : 1.25;\n}\n\n/** Apply a wheel event to a domain: zoom around `focus` (0..1) then clamp. */\nexport function wheelZoom(\n  domain: Domain,\n  focus: number,\n  deltaY: number,\n  bounds: Domain,\n  minSpan: number,\n): Domain {\n  return clampDomain(zoomDomain(domain, focus, wheelFactor(deltaY)), bounds, minSpan);\n}\n\n/** Pointer position -> 0..1 fraction across an element, clamped to the edges. */\nexport function focusFraction(clientPos: number, edgeStart: number, length: number): number {\n  if (length <= 0) return 0;\n  return Math.max(0, Math.min(1, (clientPos - edgeStart) / length));\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 { useCallback, useRef, useState } from 'react';\nimport { wheelZoom, panDomain, clampDomain, focusFraction, type Domain } from '../core/zoom';\nimport { extentOf } from '../core/scales';\n\n/**\n * Pure: derive the continuous x data-extent from a wrapped chart's props.\n * Handles point series (`series[].points[].x`) and `{ x }` datum arrays\n * (scatter). Returns null for charts without a continuous x (e.g. categorical\n * bars), which disables zoom for them.\n */\nexport function chartXExtent(props: Record<string, unknown>): Domain | null {\n  const series = props.series as { points?: { x: number }[] }[] | undefined;\n  if (Array.isArray(series)) {\n    const xs = series.flatMap((s) => (s.points ?? []).map((p) => p.x));\n    return xs.length ? extentOf(xs, false) : null;\n  }\n  const data = props.data as { x?: number }[] | undefined;\n  if (Array.isArray(data) && data.length > 0 && data.every((d) => typeof d?.x === 'number')) {\n    return extentOf(\n      data.map((d) => d.x as number),\n      false,\n    );\n  }\n  return null;\n}\n\nexport interface UseZoomPan {\n  /** Current view domain, or null when not zoomed (chart uses its default extent). */\n  domain: Domain | null;\n  onWheel: (e: WheelEvent) => void;\n  onPointerDown: (e: PointerEvent) => void;\n  onPointerMove: (e: PointerEvent) => void;\n  onPointerUp: () => void;\n  reset: () => void;\n}\n\n/**\n * Track a view domain driven by wheel-zoom and (optionally) drag-pan, both\n * clamped to `bounds`. All domain math is delegated to the pure `core/zoom`\n * helpers; this hook only wires pointer state. No-op when `bounds` is null.\n */\nexport function useZoomPan(\n  bounds: Domain | null,\n  opts: { pan?: boolean; minSpan?: number } = {},\n): UseZoomPan {\n  const minSpan = opts.minSpan ?? (bounds ? (bounds[1] - bounds[0]) / 1000 || 1 : 1);\n  const [domain, setDomain] = useState<Domain | null>(null);\n  const drag = useRef<{ x: number; domain: Domain } | null>(null);\n\n  const onWheel = useCallback(\n    (e: WheelEvent) => {\n      if (!bounds) return;\n      e.preventDefault();\n      const rect = (e.currentTarget as Element).getBoundingClientRect();\n      const focus = focusFraction(e.clientX, rect.left, rect.width);\n      setDomain((d) => wheelZoom(d ?? bounds, focus, e.deltaY, bounds, minSpan));\n    },\n    [bounds, minSpan],\n  );\n\n  const onPointerDown = useCallback(\n    (e: PointerEvent) => {\n      if (!bounds || !opts.pan) return;\n      drag.current = { x: e.clientX, domain: domain ?? bounds };\n    },\n    [bounds, opts.pan, domain],\n  );\n\n  const onPointerMove = useCallback(\n    (e: PointerEvent) => {\n      const d = drag.current;\n      if (!d || !bounds) return;\n      const rect = (e.currentTarget as Element).getBoundingClientRect();\n      const span = d.domain[1] - d.domain[0];\n      const deltaData = -((e.clientX - d.x) / rect.width) * span; // drag right -> domain moves left\n      setDomain(clampDomain(panDomain(d.domain, deltaData), bounds, minSpan));\n    },\n    [bounds, minSpan],\n  );\n\n  const onPointerUp = useCallback(() => {\n    drag.current = null;\n  }, []);\n\n  const reset = useCallback(() => setDomain(null), []);\n\n  return { domain, onWheel, onPointerDown, onPointerMove, onPointerUp, reset };\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","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 { 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 { RoughRectangle } from '../primitives/RoughRectangle';\n\nexport interface BrushOverlayProps {\n  /** Rect origin in viewBox x. */\n  start: number;\n  /** Rect width in viewBox units. */\n  length: number;\n  /** Plot height to span. */\n  height: number;\n}\n\n/** A sketched translucent selection rectangle for an x-axis brush. */\nexport function Brush({ start, length, height }: BrushOverlayProps) {\n  if (length <= 0 || height <= 0) return null;\n  return (\n    <RoughRectangle x={start} y={0} width={length} height={height} style={{ opacity: 0.25 }} />\n  );\n}\n","/** Brush range math. Pure: no DOM, no scales. */\n\n/** Linearly invert a pixel position to a domain value (range edges may be reversed). */\nexport function pixelToValue(\n  px: number,\n  [p0, p1]: [number, number],\n  [v0, v1]: [number, number],\n): number {\n  if (p1 === p0) return v0;\n  return v0 + ((px - p0) / (p1 - p0)) * (v1 - v0);\n}\n\n/** Map a client (screen) coordinate into the chart's viewBox coordinate space. */\nexport function clientToViewBox(\n  client: number,\n  rectStart: number,\n  rectLength: number,\n  vbStart: number,\n  vbLength: number,\n): number {\n  if (rectLength <= 0) return vbStart;\n  return vbStart + ((client - rectStart) / rectLength) * vbLength;\n}\n\n/** Normalize two endpoints into a rect origin + length (handles backwards drag). */\nexport function brushRect(a: number, b: number): { start: number; length: number } {\n  return { start: Math.min(a, b), length: Math.abs(b - a) };\n}\n\nexport interface PixelMark {\n  key: string;\n  cx: number;\n  cy: number;\n}\n\n/**\n * Filter marks whose pixel anchor falls within a brushed range on the given axis.\n * The range is normalized, so a backwards drag still selects correctly.\n */\nexport function marksInPixelRange<M extends PixelMark>(\n  marks: M[],\n  range: [number, number],\n  axis: 'x' | 'y',\n): M[] {\n  const lo = Math.min(range[0], range[1]);\n  const hi = Math.max(range[0], range[1]);\n  return marks.filter((m) => {\n    const v = axis === 'x' ? m.cx : m.cy;\n    return v >= lo && v <= hi;\n  });\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","/**\n * Pure reducer for cross-chart linked selection. Each source chart contributes a\n * set of selected mark keys; the active filter is their union. No DOM, no React.\n */\nexport interface LinkState {\n  /** Selected keys keyed by source chart id. */\n  bySource: Record<string, string[]>;\n}\n\nexport function emptyLink(): LinkState {\n  return { bySource: {} };\n}\n\n/** Record (or, with an empty list, clear) a source chart's selected keys. */\nexport function setFilter(state: LinkState, source: string, keys: string[]): LinkState {\n  if (keys.length === 0) return clearFilter(state, source);\n  return { bySource: { ...state.bySource, [source]: keys } };\n}\n\n/** Drop a source chart's contribution. */\nexport function clearFilter(state: LinkState, source: string): LinkState {\n  if (!(source in state.bySource)) return state;\n  const next = { ...state.bySource };\n  delete next[source];\n  return { bySource: next };\n}\n\n/** The merged active filter: union of every source's keys, deduped and sorted. */\nexport function activeFilter(state: LinkState): string[] {\n  const all = new Set<string>();\n  for (const keys of Object.values(state.bySource)) for (const k of keys) all.add(k);\n  return [...all].sort();\n}\n","import { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { emptyLink, setFilter, activeFilter, type LinkState } from '../core/linkSelection';\n\nexport interface LinkGroupValue {\n  /** Merged active filter (union of every member chart's published keys). */\n  filter: string[];\n  /** Publish this chart's selected/brushed keys under its source id. */\n  publish: (source: string, keys: string[]) => void;\n}\n\nconst LinkContext = createContext<LinkGroupValue | null>(null);\n\n/**\n * Wrap a set of `<InteractiveChart linkGroup=\"...\">`s so a brush/selection in one\n * filters the others. Holds the shared selection state via the pure\n * `core/linkSelection` reducer; the active filter is the union across members.\n */\nexport function LinkedCharts({ children }: { children: ReactNode }) {\n  const [state, setState] = useState<LinkState>(emptyLink);\n  const publish = useCallback((source: string, keys: string[]) => {\n    setState((s) => setFilter(s, source, keys));\n  }, []);\n  const value = useMemo<LinkGroupValue>(\n    () => ({ filter: activeFilter(state), publish }),\n    [state, publish],\n  );\n  return <LinkContext.Provider value={value}>{children}</LinkContext.Provider>;\n}\n\n/** Read the surrounding link group, or null when not inside `<LinkedCharts>`. */\nexport function useLinkGroup(): LinkGroupValue | null {\n  return useContext(LinkContext);\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 { MarkMeta } from '../types/interaction';\n\n/** Stable per-mark key: `${series ?? ''}:${index}` (series disambiguates multi-series). */\nexport function markKey(mark: Pick<MarkMeta, 'series' | 'index'>): string {\n  return `${mark.series ?? ''}:${mark.index}`;\n}\n\n/** Pure selection toggle. Single-select replaces (or clears on re-click of the\n *  sole selection); multi-select toggles membership. */\nexport function toggleSelection(\n  current: ReadonlySet<string>,\n  key: string,\n  multi: boolean,\n): Set<string> {\n  if (!multi) return current.has(key) && current.size === 1 ? new Set() : new Set([key]);\n  const next = new Set(current);\n  if (next.has(key)) next.delete(key);\n  else next.add(key);\n  return next;\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 { 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","export interface Point {\n  x: number;\n  y: number;\n}\nexport interface Size {\n  width: number;\n  height: number;\n}\n\n/** Position a tooltip box near `anchor`, offset by `gap`, flipping at the right/\n *  bottom edges of `bounds` and clamping so it never leaves the near edges. */\nexport function placeTooltip(anchor: Point, size: Size, bounds: Size, gap = 8): Point {\n  let x = anchor.x + gap;\n  let y = anchor.y + gap;\n  if (x + size.width > bounds.width) x = anchor.x - gap - size.width;\n  if (y + size.height > bounds.height) y = anchor.y - gap - size.height;\n  return { x: Math.max(0, x), y: Math.max(0, y) };\n}\n","import type { MarkMeta } from '../types/interaction';\n\nexport interface TooltipContent {\n  title?: string;\n  rows: [string, string][];\n}\n\n/** Default MarkMeta -> tooltip content: label as the title, value(s) as rows. */\nexport function defaultTooltipFormat(mark: MarkMeta): TooltipContent {\n  const title = mark.label ?? mark.series;\n  const rows: [string, string][] =\n    typeof mark.value === 'number'\n      ? [['value', String(mark.value)]]\n      : Object.entries(mark.value).map(([k, v]) => [k, String(v)]);\n  return title !== undefined ? { title, rows } : { rows };\n}\n\n/** A flat accessible label for a mark, e.g. \"Q1, value 12\" or \"s1, x 1, y 3\". */\nexport function markAriaLabel(mark: MarkMeta): string {\n  const { title, rows } = defaultTooltipFormat(mark);\n  return [...(title ? [title] : []), ...rows.map(([k, v]) => `${k} ${v}`)].join(', ');\n}\n","import type { ReactNode } from 'react';\nimport type { MarkMeta } from '../types/interaction';\nimport { RoughRectangle } from '../primitives/RoughRectangle';\nimport { RoughText } from '../primitives/RoughText';\nimport { useResolvedVibe } from '../vibe/VibeProvider';\nimport { placeTooltip } from './placeTooltip';\nimport { defaultTooltipFormat, type TooltipContent } from './defaultTooltipFormat';\n\nexport type TooltipRenderer = (mark: MarkMeta) => ReactNode;\n\nexport interface TooltipProps {\n  mark: MarkMeta;\n  /** Mark anchor in svg/viewBox coordinates. */\n  anchor: { x: number; y: number };\n  /** Plot bounds (viewBox width/height) for edge-flipping + clamping. */\n  bounds: { width: number; height: number };\n  format?: (mark: MarkMeta) => TooltipContent;\n}\n\nconst PAD = 7;\nconst LINE = 15;\nconst CHAR_W = 7;\n\n/**\n * A sketched, vibe-aware tooltip: a solid page-coloured backing (for legibility\n * over the chart) under a sketched frame, placed beside the mark via\n * `placeTooltip` so it never sits on the mark or runs off the canvas.\n */\nexport function Tooltip({ mark, anchor, bounds, format = defaultTooltipFormat }: TooltipProps) {\n  const resolved = useResolvedVibe();\n  const { title, rows } = format(mark);\n  const lines = [...(title ? [title] : []), ...rows.map(([k, v]) => `${k}: ${v}`)];\n  const width = PAD * 2 + Math.max(0, ...lines.map((l) => l.length)) * CHAR_W;\n  const height = PAD * 2 + lines.length * LINE;\n  const { x, y } = placeTooltip(anchor, { width, height }, bounds);\n  const bg = resolved.background ?? '#ffffff';\n  return (\n    <g transform={`translate(${x}, ${y})`} pointerEvents=\"none\" aria-hidden=\"true\">\n      <rect x={0} y={0} width={width} height={height} rx={4} fill={bg} opacity={0.92} />\n      <RoughRectangle x={0} y={0} width={width} height={height} fill={null} />\n      {lines.map((line, i) => (\n        <RoughText\n          key={i}\n          x={PAD}\n          y={PAD + LINE * (i + 0.7)}\n          anchor=\"start\"\n          baseline=\"middle\"\n          haloColor={bg}\n        >\n          {line}\n        </RoughText>\n      ))}\n    </g>\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 { RoughLine } from '../primitives/RoughLine';\n\nexport interface PixelMark {\n  cx: number;\n  cy: number;\n}\n\n/** Nearest mark to (x, y) by pixel distance — used to snap a crosshair/selection\n *  to the closest datum without needing the chart's scales. Returns null when\n *  there are no marks. */\nexport function nearestMark<T extends PixelMark>(\n  marks: readonly T[],\n  x: number,\n  y: number,\n): T | null {\n  let best: T | null = null;\n  let bestD = Infinity;\n  for (const m of marks) {\n    const d = (m.cx - x) ** 2 + (m.cy - y) ** 2;\n    if (d < bestD) {\n      bestD = d;\n      best = m;\n    }\n  }\n  return best;\n}\n\nexport interface CrosshairProps {\n  /** Snapped x position (svg space). */\n  x: number;\n  /** Plot height to span. */\n  height: number;\n}\n\n/** A sketched vertical focus line at the snapped x. */\nexport function Crosshair({ x, height }: CrosshairProps) {\n  return <RoughLine x1={x} y1={0} x2={x} y2={height} />;\n}\n","/** Root attribute present only while something is hovered. */\nexport const HOVER_ATTR = 'data-gc-hover';\n/** Marks the currently-hovered mark group so the dim rule can exclude it. */\nexport const CURRENT_ATTR = 'data-gc-current';\n\n/** Render-free hover emphasis: dim every mark except the current one, but only\n *  while a hover is active. The opacity transition is gated behind reduced-motion\n *  so it stays instant for users who prefer that. */\nexport function hoverCss(dimOpacity = 0.35): string {\n  return (\n    `[${HOVER_ATTR}] [data-gc-mark]:not([${CURRENT_ATTR}]){opacity:${dimOpacity}}` +\n    `@media (prefers-reduced-motion: no-preference){` +\n    `[data-gc-mark]{transition:opacity 120ms ease}}`\n  );\n}\n","/** Root attribute present while a selection exists. */\nexport const SELECTED_ATTR = 'data-gc-selected';\n/** Marks a chosen mark group. */\nexport const CHOSEN_ATTR = 'data-gc-chosen';\n\n/** Persistent selection emphasis: chosen marks stay full-opacity; once any mark\n *  is chosen, the rest recede so the selection reads clearly. */\nexport function selectCss(dimOpacity = 0.5): string {\n  return (\n    `[data-gc-mark][${CHOSEN_ATTR}]{opacity:1}` +\n    `[${SELECTED_ATTR}] [data-gc-mark]:not([${CHOSEN_ATTR}]){opacity:${dimOpacity}}`\n  );\n}\n","import { cloneElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { readMark } from './readMark';\nimport { useZoomPan, chartXExtent } from './useZoomPan';\nimport type { Domain } from '../core/zoom';\nimport { Brush } from './Brush';\nimport { clientToViewBox, brushRect, marksInPixelRange } from '../core/brush';\nimport { useDataTransition } from './useDataTransition';\nimport { useLinkGroup } from './LinkedCharts';\nimport type { MarkMeta } from '../types/interaction';\nimport type { VibeConfig } from '../types/vibe';\nimport { VibeProvider } from '../vibe/VibeProvider';\nimport {\n  SeriesVisibilityProvider,\n  type SeriesVisibility,\n} from '../components/SeriesVisibilityContext';\nimport { markKey, toggleSelection } from '../core/seriesVisibility';\nimport { Tooltip, type TooltipRenderer } from './Tooltip';\nimport { Crosshair } from './Crosshair';\nimport { markAriaLabel } from './defaultTooltipFormat';\nimport { HOVER_ATTR, CURRENT_ATTR, hoverCss } from './hoverStyle';\nimport { SELECTED_ATTR, CHOSEN_ATTR, selectCss } from './selectStyle';\n\nexport interface InteractiveChartProps {\n  children: ReactElement;\n  /** `true` (default) draws the built-in sketched tooltip; a function renders a custom one. */\n  tooltip?: boolean | TooltipRenderer;\n  /** Dim non-hovered marks while hovering (render-free). Default `true`. */\n  highlight?: boolean;\n  onHover?: (mark: MarkMeta | null) => void;\n  /** Enable click/keyboard selection of marks. Default `false`. */\n  selectable?: boolean;\n  /** Controlled selection (mark keys). When set, internal state is ignored. */\n  selected?: string | string[] | null;\n  defaultSelected?: string | string[] | null;\n  multiSelect?: boolean;\n  onSelect?: (mark: MarkMeta, selectedKeys: string[]) => void;\n  /** Make the chart's legend toggle series visibility. Default `true`. */\n  legendToggle?: boolean;\n  /** Draw a sketched vertical focus line snapped to the hovered mark. Default `false`. */\n  crosshair?: boolean;\n  /** Wheel-zoom the continuous x-axis (line/area/scatter), re-sketching at the new domain. */\n  zoom?: boolean;\n  /** Drag to pan the zoomed x-axis. Implies a zoomable chart. Default `false`. */\n  pan?: boolean;\n  /** Drag a sketched x-range selection; emits the brushed marks. Takes precedence over pan. */\n  brush?: boolean;\n  onBrush?: (marks: MarkMeta[]) => void;\n  /** Animate the chart's data prop when it changes (snaps under reduced-motion). */\n  transition?: boolean | { durationMs?: number };\n  /** This chart's source id within a surrounding `<LinkedCharts>` group (crossfilter). */\n  linkGroup?: string;\n  /** Mirrors the wrapped chart's vibe so the tooltip is sketched to match. */\n  vibe?: VibeConfig;\n}\n\nexport interface HoverState {\n  mark: MarkMeta;\n  x: number;\n  y: number;\n}\n\n/** Resolve a pointer/focus target into the hovered mark + its anchor in svg\n *  coordinates. Anchors at the mark's own cx/cy so it is stable regardless of\n *  cursor jitter (and testable without layout). */\nexport function markFromEvent(\n  _svg: SVGSVGElement,\n  target: Element,\n  _clientX: number,\n  _clientY: number,\n): HoverState | null {\n  const mark = readMark(target);\n  if (!mark) return null;\n  return { mark, x: mark.cx, y: mark.cy };\n}\n\n/** Make every tagged mark keyboard-focusable with an accessible label, so the\n *  hover/selection path is reachable without a pointer. Idempotent. */\nexport function enhanceMarks(svg: SVGSVGElement): void {\n  svg.querySelectorAll('[data-gc-mark]').forEach((el) => {\n    const mark = readMark(el);\n    if (!mark) return;\n    el.setAttribute('tabindex', '0');\n    el.setAttribute('role', 'img');\n    el.setAttribute('aria-label', markAriaLabel(mark));\n  });\n}\n\nfunction toSet(v: string | string[] | null | undefined): Set<string> {\n  return new Set(v == null ? [] : Array.isArray(v) ? v : [v]);\n}\n\n/**\n * Client-only boundary that makes a wrapped GoldenChart interactive via event\n * delegation on its `<svg>`: hover tooltips + emphasis (Phase 1), click/keyboard\n * selection, and a legend that toggles series visibility (Phase 2). Hover and\n * selection are render-free (imperative attributes); legend toggles re-render the\n * wrapped chart through the SeriesVisibility context.\n */\nexport function InteractiveChart({\n  children,\n  tooltip = true,\n  highlight = true,\n  onHover,\n  selectable = false,\n  selected,\n  defaultSelected,\n  multiSelect = false,\n  onSelect,\n  legendToggle = true,\n  crosshair = false,\n  zoom = false,\n  pan = false,\n  brush = false,\n  onBrush,\n  transition = false,\n  linkGroup,\n  vibe,\n}: InteractiveChartProps) {\n  const link = useLinkGroup();\n  const svgRef = useRef<SVGSVGElement | null>(null);\n  const currentRef = useRef<Element | null>(null);\n  // Key of the currently-hovered mark, so pointermoves *within* the same mark\n  // don't re-fire state/onHover (which would re-render and re-sketch the chart).\n  const lastKeyRef = useRef<string | null>(null);\n  const [hover, setHover] = useState<HoverState | null>(null);\n  const [viewBox, setViewBox] = useState<string | undefined>(undefined);\n\n  const [internalSel, setInternalSel] = useState<Set<string>>(() => toSet(defaultSelected));\n  const selectedKeys = selected !== undefined ? toSet(selected) : internalSel;\n  const selSig = [...selectedKeys].sort().join('|');\n\n  const [hidden, setHidden] = useState<ReadonlySet<string>>(new Set());\n  const toggle = useCallback((series: string) => {\n    setHidden((prev) => {\n      const next = new Set(prev);\n      if (next.has(series)) next.delete(series);\n      else next.add(series);\n      return next;\n    });\n  }, []);\n  const visibility = useMemo<SeriesVisibility>(\n    () => ({ hidden, toggle, interactive: legendToggle }),\n    [hidden, toggle, legendToggle],\n  );\n\n  // Semantic zoom/pan: track a view domain and re-sketch the chart at it by\n  // cloning with a controlled `xAxis.domain` (re-scale, never a CSS transform).\n  const zoomBounds = useMemo<Domain | null>(\n    () => (zoom ? chartXExtent(children.props as Record<string, unknown>) : null),\n    [zoom, children],\n  );\n  const zp = useZoomPan(zoomBounds, { pan: pan && !brush });\n\n  // Animate the chart's data prop on change (line/area use `series`, others `data`).\n  const childProps = children.props as {\n    xAxis?: Record<string, unknown>;\n    data?: unknown;\n    series?: unknown;\n  };\n  const dataKey: 'series' | 'data' | null = Array.isArray(childProps.series)\n    ? 'series'\n    : Array.isArray(childProps.data)\n      ? 'data'\n      : null;\n  const transitionOn = !!transition && dataKey != null;\n  const durationMs = typeof transition === 'object' ? (transition.durationMs ?? 500) : 500;\n  const animatedData = useDataTransition(\n    dataKey ? childProps[dataKey] : undefined,\n    durationMs,\n    transitionOn,\n  );\n\n  // Re-sketch the wrapped chart with a controlled view domain and/or animated\n  // data by cloning it (re-scale, never a transform).\n  const overrides: Record<string, unknown> = {};\n  if (zp.domain) overrides.xAxis = { ...(childProps.xAxis ?? {}), domain: zp.domain };\n  if (transitionOn && dataKey) overrides[dataKey] = animatedData;\n  const content = Object.keys(overrides).length\n    ? cloneElement(children as ReactElement<Record<string, unknown>>, overrides)\n    : children;\n\n  // x-axis brush: track a drag rect in viewBox space; on release, emit the marks\n  // whose anchors fall inside it (via the pure marksInPixelRange helper).\n  const [brushPx, setBrushPx] = useState<{ a: number; b: number } | null>(null);\n  const brushing = useRef(false);\n\n  const clear = useCallback(() => {\n    const svg = svgRef.current;\n    if (svg) {\n      svg.removeAttribute(HOVER_ATTR);\n      currentRef.current?.removeAttribute(CURRENT_ATTR);\n      currentRef.current = null;\n    }\n    lastKeyRef.current = null;\n    setHover(null);\n    onHover?.(null);\n  }, [onHover]);\n\n  const onMove = useCallback(\n    (e: Event) => {\n      const svg = svgRef.current;\n      const target = e.target as Element | null;\n      if (!svg || !target) return;\n      const next = markFromEvent(svg, target, 0, 0);\n      if (!next) {\n        clear();\n        return;\n      }\n      // Same mark as last move? Nothing changed — skip the re-render/re-sketch.\n      const key = markKey(next.mark);\n      if (key === lastKeyRef.current) return;\n      lastKeyRef.current = key;\n      if (highlight) {\n        svg.setAttribute(HOVER_ATTR, '');\n        const group = target.closest('[data-gc-mark]');\n        if (group !== currentRef.current) {\n          currentRef.current?.removeAttribute(CURRENT_ATTR);\n          group?.setAttribute(CURRENT_ATTR, '');\n          currentRef.current = group;\n        }\n      }\n      setHover(next);\n      onHover?.(next.mark);\n    },\n    [highlight, onHover, clear],\n  );\n\n  const activate = useCallback(\n    (target: Element | null) => {\n      if (!selectable || !target) return;\n      const mark = readMark(target);\n      if (!mark) return;\n      const next = toggleSelection(selectedKeys, markKey(mark), multiSelect);\n      if (selected === undefined) setInternalSel(next);\n      onSelect?.(mark, [...next]);\n      if (linkGroup) link?.publish(linkGroup, [...next]);\n    },\n    [selectable, multiSelect, selected, onSelect, selSig, linkGroup, link], // selSig: stable signature of selectedKeys\n  );\n\n  const onClick = useCallback((e: Event) => activate(e.target as Element | null), [activate]);\n  const onKey = useCallback(\n    (e: Event) => {\n      const ke = e as KeyboardEvent;\n      if (ke.key !== 'Enter' && ke.key !== ' ') return;\n      ke.preventDefault?.();\n      activate(e.target as Element | null);\n    },\n    [activate],\n  );\n\n  const attach = useCallback((node: HTMLDivElement | null) => {\n    const svg = (node?.querySelector('svg') as SVGSVGElement | null) ?? null;\n    svgRef.current = svg;\n    setViewBox(svg?.getAttribute('viewBox') ?? undefined);\n    if (svg) enhanceMarks(svg);\n  }, []);\n\n  // Reflect emphasis onto the DOM (render-free): this chart's own selection plus\n  // any incoming filter from a surrounding LinkedCharts group (crossfilter).\n  const linkSig = linkGroup && link ? link.filter.join('|') : '';\n  useEffect(() => {\n    const svg = svgRef.current;\n    if (!svg) return;\n    const emphasized = new Set<string>([\n      ...selectedKeys,\n      ...(linkGroup && link ? link.filter : []),\n    ]);\n    if (emphasized.size > 0) svg.setAttribute(SELECTED_ATTR, '');\n    else svg.removeAttribute(SELECTED_ATTR);\n    svg.querySelectorAll('[data-gc-mark]').forEach((el) => {\n      const m = readMark(el);\n      if (m && emphasized.has(markKey(m))) el.setAttribute(CHOSEN_ATTR, '');\n      else el.removeAttribute(CHOSEN_ATTR);\n    });\n  }, [selSig, linkSig]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Zoom (wheel) + optional pan (drag), attached with passive:false so the\n  // wheel can preventDefault. Kept separate from the hover/selection listeners.\n  useEffect(() => {\n    const svg = svgRef.current;\n    if (!svg || !(zoom || pan)) return;\n    const wheel = (e: Event) => zp.onWheel(e as unknown as WheelEvent);\n    const down = (e: Event) => zp.onPointerDown(e as unknown as PointerEvent);\n    const move = (e: Event) => zp.onPointerMove(e as unknown as PointerEvent);\n    const up = () => zp.onPointerUp();\n    svg.addEventListener('wheel', wheel, { passive: false });\n    if (pan && !brush) {\n      svg.addEventListener('pointerdown', down);\n      svg.addEventListener('pointermove', move);\n      svg.addEventListener('pointerup', up);\n      svg.addEventListener('pointerleave', up);\n    }\n    return () => {\n      svg.removeEventListener('wheel', wheel);\n      svg.removeEventListener('pointerdown', down);\n      svg.removeEventListener('pointermove', move);\n      svg.removeEventListener('pointerup', up);\n      svg.removeEventListener('pointerleave', up);\n    };\n  }, [zoom, pan, brush, zp.onWheel, zp.onPointerDown, zp.onPointerMove, zp.onPointerUp]);\n\n  // Brush drag (takes precedence over pan). Coordinates are converted to viewBox\n  // space so they compare directly against the marks' baked data-gc anchors.\n  useEffect(() => {\n    const svg = svgRef.current;\n    if (!svg || !brush) return;\n    const vb = (viewBox ?? '0 0 0 0').split(/[\\s,]+/).map(Number);\n    const toVb = (clientX: number) => {\n      const r = svg.getBoundingClientRect();\n      return clientToViewBox(clientX, r.left, r.width, vb[0] ?? 0, vb[2] ?? 0);\n    };\n    const down = (e: Event) => {\n      brushing.current = true;\n      const x = toVb((e as PointerEvent).clientX);\n      setBrushPx({ a: x, b: x });\n    };\n    const move = (e: Event) => {\n      if (!brushing.current) return;\n      const x = toVb((e as PointerEvent).clientX);\n      setBrushPx((p) => (p ? { a: p.a, b: x } : null));\n    };\n    const up = () => {\n      if (!brushing.current) return;\n      brushing.current = false;\n      setBrushPx((p) => {\n        if (p && svgRef.current) {\n          const tagged: { meta: MarkMeta; key: string; cx: number; cy: number }[] = [];\n          svgRef.current.querySelectorAll('[data-gc-mark]').forEach((el) => {\n            const m = readMark(el);\n            if (m) tagged.push({ meta: m, key: markKey(m), cx: m.cx, cy: m.cy });\n          });\n          const hit = marksInPixelRange(tagged, [p.a, p.b], 'x').map((t) => t.meta);\n          onBrush?.(hit);\n          if (linkGroup) link?.publish(linkGroup, hit.map(markKey));\n        }\n        return null;\n      });\n    };\n    svg.addEventListener('pointerdown', down);\n    svg.addEventListener('pointermove', move);\n    svg.addEventListener('pointerup', up);\n    svg.addEventListener('pointerleave', up);\n    return () => {\n      svg.removeEventListener('pointerdown', down);\n      svg.removeEventListener('pointermove', move);\n      svg.removeEventListener('pointerup', up);\n      svg.removeEventListener('pointerleave', up);\n    };\n  }, [brush, viewBox, onBrush, linkGroup, link]);\n\n  useEffect(() => {\n    const svg = svgRef.current;\n    if (!svg) return;\n    svg.addEventListener('pointermove', onMove);\n    svg.addEventListener('pointerleave', clear);\n    svg.addEventListener('focusin', onMove);\n    svg.addEventListener('focusout', clear);\n    svg.addEventListener('click', onClick);\n    svg.addEventListener('keydown', onKey);\n    return () => {\n      svg.removeEventListener('pointermove', onMove);\n      svg.removeEventListener('pointerleave', clear);\n      svg.removeEventListener('focusin', onMove);\n      svg.removeEventListener('focusout', clear);\n      svg.removeEventListener('click', onClick);\n      svg.removeEventListener('keydown', onKey);\n    };\n  }, [onMove, clear, onClick, onKey]);\n\n  const renderTooltip = typeof tooltip === 'function' ? tooltip : undefined;\n  const vbParts = viewBox ? viewBox.split(/[\\s,]+/).map(Number) : undefined;\n  const vbWidth = vbParts?.[2];\n  const vbHeight = vbParts?.[3];\n  // Cursor affordance for the active interaction mode.\n  const cursor = brush ? 'crosshair' : pan ? 'grab' : zoom ? 'zoom-in' : undefined;\n  const zoomed = (zoom || pan) && zp.domain != null;\n  return (\n    <div\n      ref={attach}\n      style={{\n        position: 'relative',\n        display: 'inline-block',\n        overflow: zoom || pan ? 'hidden' : undefined,\n        cursor,\n      }}\n    >\n      <SeriesVisibilityProvider value={visibility}>{content}</SeriesVisibilityProvider>\n      {highlight ? <style>{hoverCss()}</style> : null}\n      {selectable || linkGroup ? <style>{selectCss()}</style> : null}\n      {selectable ? (\n        <style>{`[${HOVER_ATTR}] [data-gc-mark],[data-gc-mark]{cursor:pointer}`}</style>\n      ) : null}\n      {zoomed ? (\n        <button\n          type=\"button\"\n          onClick={() => zp.reset()}\n          style={{\n            position: 'absolute',\n            top: 6,\n            right: 6,\n            font: '11px system-ui, sans-serif',\n            padding: '2px 8px',\n            borderRadius: 4,\n            border: '1px solid rgba(0,0,0,0.25)',\n            background: 'rgba(255,255,255,0.85)',\n            cursor: 'pointer',\n          }}\n        >\n          Reset view\n        </button>\n      ) : null}\n      {brush && brushPx && vbHeight !== undefined ? (\n        <svg\n          viewBox={viewBox}\n          style={{\n            position: 'absolute',\n            inset: 0,\n            pointerEvents: 'none',\n            width: '100%',\n            height: '100%',\n          }}\n        >\n          <VibeProvider vibe={vibe}>\n            <Brush\n              start={brushRect(brushPx.a, brushPx.b).start}\n              length={brushRect(brushPx.a, brushPx.b).length}\n              height={vbHeight}\n            />\n          </VibeProvider>\n        </svg>\n      ) : null}\n      {hover && (tooltip || crosshair) ? (\n        <svg\n          viewBox={viewBox}\n          style={{\n            position: 'absolute',\n            inset: 0,\n            pointerEvents: 'none',\n            width: '100%',\n            height: '100%',\n          }}\n        >\n          <VibeProvider vibe={vibe}>\n            {crosshair && vbHeight !== undefined ? (\n              <Crosshair x={hover.x} height={vbHeight} />\n            ) : null}\n            {tooltip ? (\n              renderTooltip ? (\n                <g transform={`translate(${hover.x}, ${hover.y})`}>{renderTooltip(hover.mark)}</g>\n              ) : vbWidth !== undefined && vbHeight !== undefined ? (\n                <Tooltip\n                  mark={hover.mark}\n                  anchor={{ x: hover.x, y: hover.y }}\n                  bounds={{ width: vbWidth, height: vbHeight }}\n                />\n              ) : null\n            ) : null}\n          </VibeProvider>\n        </svg>\n      ) : null}\n    </div>\n  );\n}\n","export interface InteractiveEmbedOptions {\n  /** Include the hover-tooltip hydrator. Default `true`. */\n  tooltip?: boolean;\n  /** Document `<title>`. Default `'GoldenChart'`. */\n  title?: string;\n}\n\nfunction escapeHtml(s: string): string {\n  return s\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nconst TIP_CSS =\n  '#gc-tip{position:fixed;display:none;pointer-events:none;background:#111;color:#fff;' +\n  'font:12px/1.4 system-ui,sans-serif;padding:4px 8px;border-radius:4px;' +\n  'box-shadow:0 1px 4px rgba(0,0,0,.3);z-index:10}';\n\n// Vanilla (no-React) hover-tooltip hydrator. Reads the data-gc-* contract baked\n// into the static SVG. Kept free of template literals so it embeds cleanly.\nconst HYDRATOR =\n  '(function(){' +\n  \"var tip=document.getElementById('gc-tip');\" +\n  \"var root=document.querySelector('svg[data-gc]')||document.querySelector('svg');\" +\n  'if(!root||!tip)return;' +\n  \"root.addEventListener('pointermove',function(e){\" +\n  \"var g=e.target.closest&&e.target.closest('[data-gc-mark]');\" +\n  \"if(!g){tip.style.display='none';return;}\" +\n  \"var label=g.getAttribute('data-gc-label')||'';\" +\n  \"var value=g.getAttribute('data-gc-value')||'';\" +\n  \"tip.textContent=label?(label+': '+value):value;\" +\n  \"tip.style.display='block';\" +\n  \"tip.style.left=(e.clientX+12)+'px';\" +\n  \"tip.style.top=(e.clientY+12)+'px';\" +\n  '});' +\n  \"root.addEventListener('pointerleave',function(){tip.style.display='none';});\" +\n  '})();';\n\n/**\n * Wrap a static (already `data-gc-*` tagged) GoldenChart SVG into a\n * self-contained HTML document with a tiny vanilla hover-tooltip hydrator — no\n * React or runtime bundling. Renders identically offline (the SVG carries its\n * own embedded fonts when produced by the headless/server renderer).\n */\nexport function interactiveEmbed(svg: string, opts: InteractiveEmbedOptions = {}): string {\n  const tooltip = opts.tooltip !== false;\n  const title = escapeHtml(opts.title ?? 'GoldenChart');\n  const head =\n    '<!doctype html>\\n<html>\\n<head>\\n<meta charset=\"utf-8\">\\n<title>' +\n    title +\n    '</title>\\n' +\n    (tooltip ? '<style>' + TIP_CSS + '</style>\\n' : '') +\n    '</head>\\n<body>\\n';\n  const body =\n    svg + '\\n' + (tooltip ? '<div id=\"gc-tip\"></div>\\n<script>' + HYDRATOR + '</script>\\n' : '');\n  return head + body + '</body>\\n</html>\\n';\n}\n"]}