@pixerate/editor-react 0.38.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/chart/index.ts","../../src/chart/useChartEditor.ts","../../src/chart/styles.ts","../../src/chart/ChartCanvas.tsx","../../src/chart/ChartDataGrid.tsx","../../src/chart/ChartInspector.tsx","../../src/chart/ChartEditor.tsx","../../src/chart/ChartStreamingView.tsx"],"sourcesContent":["export * from './useChartEditor';\nexport * from './styles';\nexport * from './ChartCanvas';\nexport * from './ChartDataGrid';\nexport * from './ChartInspector';\nexport * from './ChartEditor';\nexport * from './ChartStreamingView';\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport type { ToolRegistry } from '@pixerate/editor/tools';\nimport {\n ChartController,\n ChartDirector,\n ChartPresence,\n createChartCommands,\n createChartRasterizer,\n createChartToolProvider,\n layoutChart,\n type ChartScene,\n type ChartToolProviderOptions,\n type ChartActionResult,\n type ChartCommandOptions,\n type ChartControllerOptions,\n type ChartSelection,\n type ChartSpecPatch,\n type ChartState,\n type ChartType,\n} from '@pixerate/editor/chart';\n\n/** A `ChartController` created once for the component's lifetime. */\nexport function useChartController(options: ChartControllerOptions = {}): ChartController {\n const ref = useRef<ChartController | null>(null);\n if (!ref.current) ref.current = new ChartController(options);\n return ref.current;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useChartState(controller: ChartController): ChartState {\n return useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\nexport interface UseChartEditorResult {\n controller: ChartController;\n state: ChartState;\n spec: ChartState['spec'];\n selection: ChartSelection | null;\n update: (patch: ChartSpecPatch) => ChartActionResult;\n setType: (type: ChartType) => ChartActionResult;\n setValue: (seriesId: string, index: number, value: unknown) => ChartActionResult;\n select: (selection: ChartSelection | null) => void;\n undo: () => void;\n redo: () => void;\n}\n\n/**\n * Subscribes to a chart controller and exposes its state with bound actions. Pass options\n * instead of a controller to create one for the component's lifetime.\n */\nexport function useChartEditor(controllerOrOptions: ChartController | ChartControllerOptions = {}): UseChartEditorResult {\n const own = useRef<ChartController | null>(null);\n let controller: ChartController;\n if (controllerOrOptions instanceof ChartController) controller = controllerOrOptions;\n else {\n if (!own.current) own.current = new ChartController(controllerOrOptions);\n controller = own.current;\n }\n const state = useChartState(controller);\n const actions = useMemo(\n () => ({\n update: (patch: ChartSpecPatch) => controller.update(patch),\n setType: (type: ChartType) => controller.setType(type),\n setValue: (seriesId: string, index: number, value: unknown) => controller.setValue(seriesId, index, value),\n select: (selection: ChartSelection | null) => controller.select(selection),\n undo: () => void controller.undo(),\n redo: () => void controller.redo(),\n }),\n [controller],\n );\n return { controller, state, spec: state.spec, selection: state.selection, ...actions };\n}\n\n/** Anything with `register(specs) → unregister` (a `CommandRegistry`). */\nexport interface ChartCommandTarget {\n register(specs: any): () => void;\n}\n\n/**\n * Registers the controller's palette / agent commands (`chart.describe`, `chart.update`,\n * `chart.setValues`, …) in `registry` while mounted.\n */\nexport function useChartCommands(registry: ChartCommandTarget | null | undefined, controller: ChartController, options: ChartCommandOptions = {}): void {\n const { prefix, group, scope } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createChartCommands(controller, { prefix, group, scope }));\n }, [registry, controller, prefix, group, scope]);\n}\n\n/** `useChartToolProvider` options: `rasterize` defaults to a canvas rasterizer in the browser (`false` turns PNG off). */\nexport type ChartToolProviderHookOptions = Omit<ChartToolProviderOptions, 'rasterize'> & { rasterize?: ChartToolProviderOptions['rasterize'] | false };\n\n/**\n * Registers the chart's agent tools (`createChartToolProvider`) with a `ToolRegistry` while\n * mounted. Options are read when the controller or registry changes. In the browser,\n * `render_chart { format: \"png\" }` works out of the box (`createChartRasterizer`).\n */\nexport function useChartToolProvider(registry: ToolRegistry | null | undefined, controller: ChartController, options: ChartToolProviderHookOptions = {}): void {\n const latest = useRef(options);\n latest.current = options;\n const { id, namespace } = options;\n useEffect(() => {\n if (!registry) return;\n const { rasterize, ...rest } = latest.current;\n return registry.register(createChartToolProvider(controller, { ...rest, id, namespace, rasterize: rasterize === false ? undefined : (rasterize ?? createChartRasterizer()) }));\n }, [registry, controller, id, namespace]);\n}\n\n/**\n * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to\n * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a\n * cursor.\n */\nexport function useChartDirector(controller: ChartController, options: { speed?: number; size?: { width: number; height: number } } = {}) {\n const sceneRef = useRef<ChartScene | null>(null);\n const ref = useRef<{ presence: ChartPresence; director: ChartDirector } | null>(null);\n if (!ref.current) {\n const presence = new ChartPresence();\n const size = options.size ?? { width: 640, height: 400 };\n const director = new ChartDirector(controller, presence, { scene: () => sceneRef.current ?? layoutChart(controller.getSpec(), size), speed: options.speed });\n ref.current = { presence, director };\n }\n return { ...ref.current, sceneRef };\n}\n","// Class names shared by the chart components (the same as the Svelte package's).\nexport const chartInputClass =\n 'h-7 w-full min-w-0 rounded-md border border-input bg-background px-2 text-xs text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:cursor-not-allowed disabled:opacity-50';\nexport const chartButtonClass =\n 'inline-flex h-7 items-center justify-center gap-1 rounded-md border border-input bg-background px-2 text-xs text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-50';\nexport const chartIconButtonClass =\n 'inline-flex h-6 w-6 shrink-0 items-center justify-center rounded text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-40';\nexport const chartSegmentClass = (active: boolean) =>\n `inline-flex h-7 flex-1 items-center justify-center rounded px-2 text-xs focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary ${\n active ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'\n }`;\nexport const chartLabelClass = 'text-[11px] font-medium text-muted-foreground';\nexport const chartSectionClass = 'space-y-2 border-b border-border pb-3 last:border-b-0';\nexport const chartCellClass =\n 'h-7 w-full min-w-[4.5rem] bg-transparent px-2 text-right text-xs tabular-nums text-foreground focus-visible:bg-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-primary';\n","import React, { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport {\n CSS_VARIABLE_CHART_THEME,\n chartClientToScene,\n chartTextBaseline,\n chartTextTransform,\n describeChartSelection,\n handleChartKey,\n layoutChart,\n startChartPointDrag,\n type ChartController,\n type ChartMark,\n type ChartPointDrag,\n type ChartPresence,\n type ChartScene,\n type ChartTextMeasure,\n type ChartTheme,\n} from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\n\nexport interface ChartCanvasProps {\n controller: ChartController;\n /** Scene width; with `responsive` this is only the fallback before the container is measured (default 640). */\n width?: number;\n /** Scene height in pixels (default 400). */\n height?: number;\n /** Follow the container's width (default `true`). */\n responsive?: boolean;\n /** Colours and type (default: shadcn-style CSS variables). */\n theme?: Partial<ChartTheme>;\n /** Click to select, drag bars and points, keyboard editing (default `true`). */\n editable?: boolean;\n /** Text width for layout (default: an estimate). */\n measureText?: ChartTextMeasure;\n emptyMessage?: string;\n className?: string;\n /** Agent cursors to draw over the chart (see `ChartDirector`). */\n presence?: ChartPresence;\n /** Receives the scene as drawn (e.g. for `ChartDirector`'s `scene`). */\n sceneRef?: { current: ChartScene | null };\n}\n\n/** SVG attributes for one mark (colours go in `style` so CSS variables work). */\nexport function renderChartMark(mark: ChartMark, fontFamily: string, interactive: boolean): React.ReactNode {\n const common = {\n 'data-role': mark.role,\n 'data-chart-key': mark.target ? mark.key : undefined,\n 'data-selected': mark.selected ? '' : undefined,\n opacity: mark.opacity,\n pointerEvents: mark.role === 'selection' || mark.role === 'drag-readout' || (!mark.target && mark.role !== 'background') ? ('none' as const) : undefined,\n cursor: interactive && mark.target && mark.role !== 'background' ? 'pointer' : undefined,\n };\n switch (mark.kind) {\n case 'rect':\n return <rect key={mark.key} {...common} x={mark.x} y={mark.y} width={mark.width} height={mark.height} rx={mark.radius} style={{ fill: mark.fill, stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'path':\n return (\n <path\n key={mark.key}\n {...common}\n d={mark.d}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n strokeDasharray={mark.dash}\n style={{ fill: mark.fill ?? 'none', stroke: mark.stroke, strokeWidth: mark.strokeWidth }}\n />\n );\n case 'circle':\n return <circle key={mark.key} {...common} cx={mark.cx} cy={mark.cy} r={mark.r} style={{ fill: mark.fill, stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'line':\n return <line key={mark.key} {...common} x1={mark.x1} y1={mark.y1} x2={mark.x2} y2={mark.y2} strokeDasharray={mark.dash} style={{ stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'text':\n return (\n <text\n key={mark.key}\n {...common}\n x={mark.x}\n y={mark.y}\n textAnchor={mark.anchor}\n dominantBaseline={chartTextBaseline(mark.baseline)}\n transform={chartTextTransform(mark)}\n style={{ fill: mark.fill, fontSize: mark.size, fontWeight: mark.weight, fontFamily, userSelect: 'none' }}\n >\n {mark.text}\n </text>\n );\n }\n}\n\n/** Agent cursors and notes, drawn in scene coordinates inside the chart's SVG. */\nexport function ChartPresenceLayer({ presence }: { presence: ChartPresence }) {\n const { actors } = useSyncExternalStore(presence.subscribe, presence.getState, presence.getState);\n return (\n <g data-chart-presence=\"\" pointerEvents=\"none\">\n {actors.map((a) => (\n <g key={a.id} transform={`translate(${a.x} ${a.y})`} data-actor={a.id}>\n <path d=\"M0,0 L0,14 L4,10.5 L7,17 L9.5,16 L6.5,9.5 L11.5,9.5 Z\" style={{ fill: a.color, stroke: '#ffffff', strokeWidth: 1 }} transform={a.pressed ? 'scale(0.9)' : undefined} />\n <g transform=\"translate(13 16)\">\n <rect x={0} y={0} rx={4} height={18} width={Math.max(28, (a.message ?? a.name).length * 6.4 + 12)} style={{ fill: a.color }} />\n <text x={6} y={9} dominantBaseline=\"central\" style={{ fill: '#ffffff', fontSize: 11, fontWeight: 600, fontFamily: 'inherit' }}>\n {a.message ?? a.name}\n </text>\n </g>\n </g>\n ))}\n </g>\n );\n}\n\n/** A laid-out scene as an SVG (no interaction): for read-only views, streaming and exports. */\nexport function ChartSceneSvg({ scene, label, className }: { scene: ChartScene; label?: string; className?: string }) {\n return (\n <svg width={scene.width} height={scene.height} viewBox={`0 0 ${scene.width} ${scene.height}`} role=\"img\" aria-label={label} className={`block max-w-full ${className ?? ''}`}>\n {scene.marks.map((m) => renderChartMark(m, scene.theme.fontFamily, false))}\n </svg>\n );\n}\n\ninterface Frozen {\n valueDomain: ChartPointDrag['valueDomain'];\n valueDomain2: ChartPointDrag['valueDomain2'] | null;\n xDomain: ChartPointDrag['xDomain'] | null;\n readout: ChartPointDrag['target'];\n}\n\n/**\n * Draws a chart controller's spec as SVG. Click a mark to select it, drag a bar or point to\n * change its value (one undo step; Alt for fine steps, Shift to keep one axis on scatter\n * charts, Ctrl / ⌘ to skip snapping, Escape to cancel), and with the chart focused use\n * ← → ↑ ↓, Delete and Escape (see `handleChartKey`).\n */\nexport function ChartCanvas({ controller, width = 640, height = 400, responsive = true, theme, editable = true, measureText, emptyMessage, className, presence, sceneRef }: ChartCanvasProps) {\n const state = useChartState(controller);\n const wrapper = useRef<HTMLDivElement>(null);\n const svg = useRef<SVGSVGElement>(null);\n const drag = useRef<ChartPointDrag | null>(null);\n const [measured, setMeasured] = useState<number | null>(null);\n // Frozen while a point is dragged so the axes do not rescale under the pointer.\n const [frozen, setFrozen] = useState<Frozen | null>(null);\n\n useEffect(() => {\n const el = wrapper.current;\n if (!responsive || !el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => {\n const w = Math.round(entry.contentRect.width);\n if (w > 0) setMeasured(w);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [responsive]);\n\n const sceneWidth = (responsive && measured) || width;\n const fullTheme = useMemo(() => ({ ...CSS_VARIABLE_CHART_THEME, ...theme }), [theme]);\n const scene = useMemo(\n () =>\n layoutChart(state.spec, {\n width: sceneWidth,\n height,\n theme: fullTheme,\n selection: editable ? state.selection : null,\n measureText,\n emptyMessage,\n valueDomain: frozen?.valueDomain,\n valueDomain2: frozen?.valueDomain2,\n xDomain: frozen?.xDomain,\n readout: frozen?.readout,\n }),\n [state.spec, state.selection, sceneWidth, height, fullTheme, editable, measureText, emptyMessage, frozen],\n );\n if (sceneRef) sceneRef.current = scene;\n const byKey = useMemo(() => new Map(scene.marks.map((m) => [m.key, m])), [scene]);\n\n useEffect(() => () => drag.current?.end(), []);\n\n const scenePoint = (e: React.PointerEvent) => chartClientToScene(scene, svg.current!.getBoundingClientRect(), e.clientX, e.clientY);\n\n const onPointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n if (!editable || e.button !== 0) return;\n const key = (e.target as Element).closest?.('[data-chart-key]')?.getAttribute('data-chart-key');\n const target = key ? byKey.get(key)?.target : undefined;\n controller.select(target ?? null);\n drag.current = startChartPointDrag(controller, scene, target, scenePoint(e));\n if (drag.current) {\n const d = drag.current;\n setFrozen({ valueDomain: d.valueDomain, valueDomain2: d.valueDomain2 ?? null, xDomain: d.xDomain ?? null, readout: d.target });\n svg.current?.setPointerCapture?.(e.pointerId);\n }\n };\n const onPointerMove = (e: React.PointerEvent<SVGSVGElement>) => {\n if (drag.current) drag.current.move(scenePoint(e), { fine: e.altKey, lockAxis: e.shiftKey, noSnap: e.ctrlKey || e.metaKey });\n };\n const endDrag = () => {\n drag.current?.end();\n drag.current = null;\n setFrozen(null);\n };\n const onKeyDown = (e: React.KeyboardEvent<SVGSVGElement>) => {\n if (drag.current && e.key === 'Escape') {\n drag.current.cancel();\n drag.current = null;\n setFrozen(null);\n e.preventDefault();\n return;\n }\n if (editable && handleChartKey(controller, scene, e)) e.preventDefault();\n };\n\n const label = state.spec.title || 'Chart';\n return (\n <div ref={wrapper} className={`w-full ${className ?? ''}`} data-chart-canvas=\"\">\n <svg\n ref={svg}\n width={sceneWidth}\n height={height}\n viewBox={`0 0 ${scene.width} ${scene.height}`}\n role=\"img\"\n aria-label={editable ? `${label}. ${describeChartSelection(controller, state.selection)}` : label}\n tabIndex={editable ? 0 : undefined}\n className=\"block max-w-full touch-none select-none rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n >\n {scene.marks.map((m) => renderChartMark(m, scene.theme.fontFamily, editable))}\n {presence && <ChartPresenceLayer presence={presence} />}\n </svg>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { chartColorInputValue, chartSeriesColor, formatChartNumber, type ChartController } from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\nimport { chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass } from './styles';\n\ntype CommitInputProps = {\n value: string;\n /** Called with the typed text. Return `false` to show the stored value again (a refused edit). */\n onCommit: (value: string) => boolean | void;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'defaultValue'>;\n\n/** A text box that commits on blur or Enter and resets on Escape. Follows `value` unless the user is typing. */\nexport function ChartCommitInput({ value, onCommit, onKeyDown, onBlur, ...rest }: CommitInputProps) {\n const [draft, setDraft] = useState(value);\n const typing = useRef(false);\n useEffect(() => {\n if (!typing.current) setDraft(value);\n }, [value]);\n const commit = () => {\n if (!typing.current) return;\n typing.current = false;\n if (draft === value) return;\n if (onCommit(draft) === false) setDraft(value);\n };\n return (\n <input\n {...rest}\n value={draft}\n onChange={(e) => {\n typing.current = true;\n setDraft(e.currentTarget.value);\n }}\n onBlur={(e) => {\n onBlur?.(e);\n commit();\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n } else if (e.key === 'Escape') {\n typing.current = false;\n setDraft(value);\n }\n }}\n />\n );\n}\n\nexport interface ChartDataGridProps {\n controller: ChartController;\n /** Header of the category column (default \"Category\"). */\n categoryHeader?: string;\n /** Hide the add / delete buttons. */\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * The chart's data as an editable grid: categories down the side, one column per series\n * (name, colour, show / hide, delete). Cells take numbers as people type them (`1,200`,\n * `12%`, blank for a gap); pasting TSV or CSV fills and grows the grid from the cell.\n */\nexport function ChartDataGrid({ controller, categoryHeader = 'Category', readOnly = false, className }: ChartDataGridProps) {\n const { spec, selection } = useChartState(controller);\n const paste = (row: number, column: number) => (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData?.getData('text/plain') ?? '';\n if (!/[\\t\\n]/.test(text.replace(/\\n$/, ''))) return;\n e.preventDefault();\n controller.pasteCells(row, column, text);\n };\n return (\n <div className={`overflow-auto rounded-md border border-border ${className ?? ''}`} data-chart-grid=\"\">\n <table className=\"w-full border-collapse text-xs\">\n <thead className=\"bg-muted/50\">\n <tr>\n <th className=\"border-b border-r border-border px-2 py-1 text-left font-medium text-muted-foreground\">{categoryHeader}</th>\n {spec.series.map((s, si) => {\n const color = chartSeriesColor(spec, si);\n const selected = selection?.kind === 'series' && selection.seriesId === s.id;\n return (\n <th key={s.id} data-series-id={s.id} className={`border-b border-r border-border px-1 py-1 font-medium ${selected ? 'bg-primary/10' : ''}`}>\n <div className=\"flex items-center gap-1\">\n <input\n type=\"color\"\n aria-label={`${s.name} colour`}\n value={chartColorInputValue(color)}\n disabled={readOnly}\n onPointerDown={() => controller.beginGesture(`color:${s.id}`)}\n onChange={(e) => controller.updateSeries(s.id, { color: e.currentTarget.value })}\n onBlur={() => controller.endGesture()}\n className=\"h-5 w-5 shrink-0 cursor-pointer rounded border-0 bg-transparent p-0\"\n />\n <ChartCommitInput\n value={s.name}\n aria-label=\"Series name\"\n onFocus={() => controller.select({ kind: 'series', seriesId: s.id })}\n onCommit={(name) => void controller.updateSeries(s.id, { name })}\n className={`${chartInputClass} h-6 min-w-[5rem] border-transparent bg-transparent font-medium ${s.hidden ? 'text-muted-foreground line-through' : ''}`}\n />\n {!readOnly && (\n <>\n <button\n type=\"button\"\n className={chartIconButtonClass}\n title={s.hidden ? 'Show series' : 'Hide series'}\n aria-label={s.hidden ? `Show ${s.name}` : `Hide ${s.name}`}\n aria-pressed={!s.hidden}\n data-action=\"toggle-series\"\n onClick={() => controller.toggleSeries(s.id)}\n >\n {s.hidden ? '○' : '●'}\n </button>\n <button type=\"button\" className={chartIconButtonClass} title=\"Delete series\" aria-label={`Delete ${s.name}`} data-action=\"remove-series\" onClick={() => controller.removeSeries(s.id)}>\n ×\n </button>\n </>\n )}\n </div>\n </th>\n );\n })}\n {!readOnly && (\n <th className=\"w-8 border-b border-border px-1\">\n <button type=\"button\" className={chartIconButtonClass} title=\"Add series\" aria-label=\"Add series\" data-action=\"add-series\" onClick={() => controller.addSeries()}>\n +\n </button>\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {spec.categories.map((category, i) => {\n const rowSelected = selection?.kind === 'category' && selection.index === i;\n return (\n <tr key={i} data-category-index={i} className={rowSelected ? 'bg-primary/10' : undefined}>\n <th className=\"border-b border-r border-border p-0 text-left font-normal\">\n <ChartCommitInput\n value={category}\n aria-label={`Category ${i + 1}`}\n onFocus={() => controller.select({ kind: 'category', index: i })}\n onPaste={paste(i, -1)}\n onCommit={(label) => void controller.renameCategory(i, label)}\n className={`${chartCellClass} text-left`}\n />\n </th>\n {spec.series.map((s) => {\n const value = s.values[i];\n const selected = selection?.kind === 'point' && selection.seriesId === s.id && selection.index === i;\n return (\n <td key={s.id} className={`border-b border-r border-border p-0 ${selected ? 'bg-primary/10' : ''}`}>\n <ChartCommitInput\n value={value === null || value === undefined ? '' : String(value)}\n inputMode=\"decimal\"\n aria-label={`${s.name}, ${category}`}\n title={value === null ? undefined : formatChartNumber(value, spec.yAxis.format)}\n data-cell={`${s.id}:${i}`}\n onFocus={() => controller.select({ kind: 'point', seriesId: s.id, index: i })}\n onPaste={paste(i, spec.series.indexOf(s))}\n onCommit={(text) => controller.setValue(s.id, i, text).ok}\n className={chartCellClass}\n />\n </td>\n );\n })}\n {!readOnly && (\n <td className=\"border-b border-border px-1\">\n <button type=\"button\" className={chartIconButtonClass} title=\"Delete category\" aria-label={`Delete ${category}`} data-action=\"remove-category\" onClick={() => controller.removeCategory(i)}>\n ×\n </button>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-1\">\n <button type=\"button\" className={`${chartButtonClass} h-6 border-dashed`} data-action=\"add-category\" onClick={() => controller.addCategory()}>\n + Add category\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useId } from 'react';\nimport {\n CHART_COLOR_SCHEMES,\n CHART_LABEL_POSITIONS,\n CHART_LAYOUT_PRESETS,\n CHART_MARKERS,\n CHART_TRENDLINE_TYPES,\n checkChartColors,\n chartFamily,\n chartSupportsTrendlines,\n chartTrendlineName,\n CHART_CURVES,\n CHART_LEGEND_POSITIONS,\n CHART_NUMBER_STYLES,\n CHART_SERIES_TYPES,\n CHART_STACKINGS,\n CHART_TYPE_LABELS,\n CHART_TYPES,\n chartColorInputValue,\n chartSeriesColor,\n chartSeriesType,\n isCartesianChart,\n type ChartAxis,\n type ChartController,\n type ChartNumberFormat,\n} from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\nimport { ChartCommitInput } from './ChartDataGrid';\nimport { chartButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass } from './styles';\n\nexport interface ChartInspectorProps {\n controller: ChartController;\n /** Which sections to show (default: all that apply to the chart). */\n sections?: readonly ChartInspectorSection[];\n className?: string;\n}\n\nexport type ChartInspectorSection = 'type' | 'style' | 'titles' | 'options' | 'legend' | 'axes' | 'series';\n\nconst cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\nfunction Field({ label, htmlFor, children }: { label: string; htmlFor?: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <label htmlFor={htmlFor} className={`${chartLabelClass} w-20 shrink-0`}>\n {label}\n </label>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n\nfunction Toggle({ label, checked, onChange, name }: { label: string; checked: boolean; onChange: (checked: boolean) => void; name: string }) {\n return (\n <label className=\"flex cursor-pointer items-center gap-2 text-xs text-foreground\">\n <input type=\"checkbox\" className=\"h-3.5 w-3.5 accent-primary\" checked={checked} data-option={name} onChange={(e) => onChange(e.currentTarget.checked)} />\n {label}\n </label>\n );\n}\n\nfunction Select<T extends string>({ id, value, options, onChange, name, labels }: { id?: string; value: T; options: readonly T[]; onChange: (value: T) => void; name: string; labels?: Partial<Record<T, string>> }) {\n return (\n <select id={id} className={chartInputClass} value={value} data-option={name} onChange={(e) => onChange(e.currentTarget.value as T)}>\n {options.map((o) => (\n <option key={o} value={o}>\n {labels?.[o] ?? cap(o)}\n </option>\n ))}\n </select>\n );\n}\n\nfunction AxisSection({ controller, axis, value, idBase, horizontal, numeric = false }: { controller: ChartController; axis: 'x' | 'y' | 'y2'; value: ChartAxis; idBase: string; horizontal: boolean; numeric?: boolean }) {\n const set = (patch: Partial<ChartAxis>) => controller.setAxis(axis, patch);\n const setFormat = (patch: Partial<ChartNumberFormat>) => set({ format: { ...value.format, ...patch } });\n const bound = (key: 'min' | 'max') => (\n <ChartCommitInput\n id={`${idBase}-${axis}-${key}`}\n value={value[key] === null ? '' : String(value[key])}\n placeholder=\"Auto\"\n inputMode=\"decimal\"\n data-option={`${axis}Axis.${key}`}\n className={chartInputClass}\n onCommit={(text) => set({ [key]: text.trim() === '' ? null : Number(text) }).ok}\n />\n );\n const name = axis === 'x' ? (numeric ? 'X axis' : 'Category axis') : axis === 'y' ? 'Value axis' : 'Secondary axis';\n const valueAxis = axis !== 'x' || numeric;\n const key = axis === 'y2' ? 'yAxis2' : `${axis}Axis`;\n return (\n <div className={chartSectionClass} data-section={`axis-${axis}`}>\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-foreground\">\n {name}\n <span className=\"ml-1 font-normal text-muted-foreground\">({axis === 'x' ? (horizontal ? 'left' : 'bottom') : axis === 'y2' ? (horizontal ? 'top' : 'right') : horizontal ? 'bottom' : 'left'})</span>\n </h4>\n <Toggle label=\"Show\" name={`${axis}Axis.show`} checked={value.show} onChange={(show) => set({ show })} />\n </div>\n <Field label=\"Title\" htmlFor={`${idBase}-${axis}-title`}>\n <ChartCommitInput id={`${idBase}-${axis}-title`} value={value.title} data-option={`${axis}Axis.title`} className={chartInputClass} onCommit={(title) => void set({ title })} />\n </Field>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n <Toggle label=\"Grid lines\" name={`${key}.gridlines`} checked={value.gridlines} onChange={(gridlines) => set({ gridlines })} />\n {axis === 'x' && !numeric && <Toggle label=\"Dates\" name=\"xAxis.kind\" checked={value.kind === 'date'} onChange={(dates) => set({ kind: dates ? 'date' : undefined } as Partial<ChartAxis>)} />}\n </div>\n {valueAxis && (\n <Field label=\"Step\" htmlFor={`${idBase}-${axis}-step`}>\n <ChartCommitInput\n id={`${idBase}-${axis}-step`}\n value={value.step === null ? '' : String(value.step)}\n placeholder=\"Auto\"\n inputMode=\"decimal\"\n data-option={`${key}.step`}\n className={chartInputClass}\n onCommit={(text) => set({ step: text.trim() === '' ? null : Number(text) }).ok}\n />\n </Field>\n )}\n {valueAxis && (\n <>\n <Field label=\"Min / max\">\n <div className=\"flex gap-1\">\n {bound('min')}\n {bound('max')}\n </div>\n </Field>\n <Field label=\"Format\" htmlFor={`${idBase}-${axis}-format`}>\n <div className=\"flex gap-1\">\n <Select id={`${idBase}-${axis}-format`} name={`${key}.format.style`} value={value.format.style ?? 'number'} options={CHART_NUMBER_STYLES} onChange={(style) => setFormat({ style })} />\n <ChartCommitInput\n value={value.format.decimals === undefined ? '' : String(value.format.decimals)}\n placeholder=\"Auto\"\n aria-label=\"Decimals\"\n title=\"Decimals\"\n inputMode=\"numeric\"\n data-option={`${key}.format.decimals`}\n className={`${chartInputClass} w-14 shrink-0`}\n onCommit={(text) => {\n const format = { ...value.format };\n if (text.trim() === '') delete format.decimals;\n else format.decimals = Number(text);\n return set({ format }).ok;\n }}\n />\n </div>\n </Field>\n {value.format.style === 'currency' && (\n <Field label=\"Currency\" htmlFor={`${idBase}-${axis}-currency`}>\n <ChartCommitInput id={`${idBase}-${axis}-currency`} value={value.format.currency ?? 'USD'} data-option={`${key}.format.currency`} className={chartInputClass} onCommit={(currency) => void setFormat({ currency: currency.toUpperCase() })} />\n </Field>\n )}\n <Field label=\"Code\" htmlFor={`${idBase}-${axis}-code`}>\n <ChartCommitInput\n id={`${idBase}-${axis}-code`}\n value={value.format.code ?? ''}\n placeholder={'e.g. #,##0.0,,\"M\"'}\n data-option={`${key}.format.code`}\n className={chartInputClass}\n onCommit={(code) => {\n const format = { ...value.format };\n if (code.trim()) format.code = code.trim();\n else delete format.code;\n return set({ format }).ok;\n }}\n />\n </Field>\n </>\n )}\n </div>\n );\n}\n\n/**\n * Settings for a chart controller: type, titles, stacking and line options, legend, both\n * axes and the selected series. Every change is one undo step.\n */\nexport function ChartInspector({ controller, sections, className }: ChartInspectorProps) {\n const { spec, selectedSeries } = useChartState(controller);\n const idBase = useId();\n const show = (section: ChartInspectorSection) => !sections || sections.includes(section);\n const cartesian = isCartesianChart(spec.type);\n const family = chartFamily(spec);\n const hasAxes = family === 'cartesian' || family === 'xy' || family === 'waterfall' || family === 'histogram' || family === 'box';\n const types = spec.series.map((s) => chartSeriesType(spec, s));\n const usesSecondary = family === 'cartesian' && spec.series.some((s) => s.axis === 'secondary' && !s.hidden);\n const colorCheck = checkChartColors(spec.series.filter((s) => !s.hidden).map((s) => chartSeriesColor(spec, spec.series.indexOf(s))));\n const hasBars = cartesian && types.includes('bar');\n const hasLines = cartesian && types.some((t) => t === 'line' || t === 'area');\n const seriesIndex = selectedSeries ? spec.series.findIndex((s) => s.id === selectedSeries.id) : -1;\n\n return (\n <div className={`space-y-3 text-xs ${className ?? ''}`} data-chart-inspector=\"\">\n {show('type') && (\n <div className={chartSectionClass} data-section=\"type\">\n <div className=\"grid grid-cols-3 gap-0.5 rounded-md bg-muted p-0.5\" role=\"radiogroup\" aria-label=\"Chart type\">\n {CHART_TYPES.map((type) => (\n <button key={type} type=\"button\" role=\"radio\" aria-checked={spec.type === type} data-chart-type={type} className={chartSegmentClass(spec.type === type)} onClick={() => controller.setType(type)}>\n {CHART_TYPE_LABELS[type]}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {show('style') && (\n <div className={chartSectionClass} data-section=\"style\">\n <Field label=\"Layout\" htmlFor={`${idBase}-layout`}>\n <select id={`${idBase}-layout`} className={chartInputClass} value=\"\" data-option=\"preset.layout\" onChange={(e) => e.currentTarget.value && controller.applyPreset({ layout: e.currentTarget.value })}>\n <option value=\"\">Quick layout…</option>\n {CHART_LAYOUT_PRESETS.map((p) => (\n <option key={p.id} value={p.id} title={p.description}>\n {p.label}\n </option>\n ))}\n </select>\n </Field>\n <Field label=\"Colours\" htmlFor={`${idBase}-colors`}>\n <select id={`${idBase}-colors`} className={chartInputClass} value={CHART_COLOR_SCHEMES.find((c) => c.palette.join() === spec.palette.join())?.id ?? ''} data-option=\"preset.colors\" onChange={(e) => e.currentTarget.value && controller.applyPreset({ colors: e.currentTarget.value })}>\n <option value=\"\">Custom</option>\n {CHART_COLOR_SCHEMES.map((c) => (\n <option key={c.id} value={c.id} title={c.description}>\n {c.label}\n </option>\n ))}\n </select>\n </Field>\n {!colorCheck.ok && (\n <p className=\"text-[11px] leading-snug text-amber-600 dark:text-amber-400\" data-chart-color-warning=\"\">\n {colorCheck.issues[0]}\n </p>\n )}\n <button type=\"button\" className={chartButtonClass} data-action=\"transpose\" onClick={() => controller.transpose()}>\n Switch rows and columns\n </button>\n </div>\n )}\n\n {show('titles') && (\n <div className={chartSectionClass} data-section=\"titles\">\n <Field label=\"Title\" htmlFor={`${idBase}-title`}>\n <ChartCommitInput id={`${idBase}-title`} value={spec.title} data-option=\"title\" className={chartInputClass} onCommit={(title) => void controller.setTitle(title)} />\n </Field>\n <Field label=\"Subtitle\" htmlFor={`${idBase}-subtitle`}>\n <ChartCommitInput id={`${idBase}-subtitle`} value={spec.subtitle} data-option=\"subtitle\" className={chartInputClass} onCommit={(subtitle) => void controller.setSubtitle(subtitle)} />\n </Field>\n </div>\n )}\n\n {show('options') && (\n <div className={chartSectionClass} data-section=\"options\">\n {cartesian && (\n <Field label=\"Stacking\" htmlFor={`${idBase}-stacking`}>\n <Select id={`${idBase}-stacking`} name=\"stacking\" value={spec.stacking} options={CHART_STACKINGS} labels={{ none: 'None', stacked: 'Stacked', percent: '100%' }} onChange={(stacking) => controller.update({ stacking })} />\n </Field>\n )}\n {hasBars && (\n <Field label=\"Bars\">\n <div className=\"flex gap-0.5 rounded-md bg-muted p-0.5\">\n {(['vertical', 'horizontal'] as const).map((o) => (\n <button key={o} type=\"button\" aria-pressed={spec.orientation === o} data-option={`orientation.${o}`} className={chartSegmentClass(spec.orientation === o)} onClick={() => controller.update({ orientation: o })}>\n {cap(o)}\n </button>\n ))}\n </div>\n </Field>\n )}\n {hasLines && (\n <Field label=\"Lines\" htmlFor={`${idBase}-curve`}>\n <Select id={`${idBase}-curve`} name=\"curve\" value={spec.curve} options={CHART_CURVES} onChange={(curve) => controller.update({ curve })} />\n </Field>\n )}\n {spec.type === 'donut' && (\n <Field label=\"Hole\" htmlFor={`${idBase}-hole`}>\n <input\n id={`${idBase}-hole`}\n type=\"range\"\n min={0}\n max={0.9}\n step={0.05}\n value={spec.innerRadius}\n data-option=\"innerRadius\"\n className=\"w-full accent-primary\"\n onPointerDown={() => controller.beginGesture('innerRadius')}\n onPointerUp={() => controller.endGesture()}\n onChange={(e) => controller.update({ innerRadius: Number(e.currentTarget.value) })}\n />\n </Field>\n )}\n {hasBars && (\n <Field label=\"Spacing\" htmlFor={`${idBase}-gap`}>\n <input\n id={`${idBase}-gap`}\n type=\"range\"\n min={0}\n max={0.9}\n step={0.02}\n value={spec.gapWidth}\n data-option=\"gapWidth\"\n className=\"w-full accent-primary\"\n onPointerDown={() => controller.beginGesture('gapWidth')}\n onPointerUp={() => controller.endGesture()}\n onChange={(e) => controller.update({ gapWidth: Number(e.currentTarget.value) })}\n />\n </Field>\n )}\n {spec.dataLabels && hasBars && (\n <Field label=\"Labels\" htmlFor={`${idBase}-label-position`}>\n <Select id={`${idBase}-label-position`} name=\"labelPosition\" value={spec.labelPosition} options={CHART_LABEL_POSITIONS} onChange={(labelPosition) => controller.update({ labelPosition })} />\n </Field>\n )}\n {spec.type === 'histogram' && (\n <Field label=\"Bins\" htmlFor={`${idBase}-bins`}>\n <ChartCommitInput id={`${idBase}-bins`} value={spec.bins === null ? '' : String(spec.bins)} placeholder=\"Auto\" inputMode=\"numeric\" data-option=\"bins\" className={chartInputClass} onCommit={(text) => controller.update({ bins: text.trim() === '' ? null : Number(text) }).ok} />\n </Field>\n )}\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {spec.type === 'waterfall' && <Toggle label=\"Total bar\" name=\"showTotal\" checked={spec.showTotal} onChange={(showTotal) => controller.update({ showTotal })} />}\n {hasLines && <Toggle label=\"Points\" name=\"points\" checked={spec.points} onChange={(points) => controller.update({ points })} />}\n <Toggle label=\"Data labels\" name=\"dataLabels\" checked={spec.dataLabels} onChange={(dataLabels) => controller.update({ dataLabels })} />\n </div>\n </div>\n )}\n\n {show('legend') && (\n <div className={chartSectionClass} data-section=\"legend\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-foreground\">Legend</h4>\n <Toggle label=\"Show\" name=\"legend.show\" checked={spec.legend.show} onChange={(v) => controller.setLegend({ show: v })} />\n </div>\n {spec.legend.show && (\n <div className=\"flex gap-0.5 rounded-md bg-muted p-0.5\">\n {CHART_LEGEND_POSITIONS.map((p) => (\n <button key={p} type=\"button\" aria-pressed={spec.legend.position === p} data-option={`legend.${p}`} className={chartSegmentClass(spec.legend.position === p)} onClick={() => controller.setLegend({ position: p })}>\n {cap(p)}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {show('axes') && hasAxes && (\n <>\n {family !== 'box' && family !== 'histogram' && <AxisSection controller={controller} axis=\"x\" value={spec.xAxis} idBase={idBase} horizontal={spec.orientation === 'horizontal'} numeric={family === 'xy'} />}\n <AxisSection controller={controller} axis=\"y\" value={spec.yAxis} idBase={idBase} horizontal={spec.orientation === 'horizontal'} />\n {usesSecondary && <AxisSection controller={controller} axis=\"y2\" value={spec.yAxis2} idBase={idBase} horizontal={spec.orientation === 'horizontal'} />}\n </>\n )}\n\n {show('series') && selectedSeries && (\n <div className={chartSectionClass} data-section=\"series\" data-series-id={selectedSeries.id}>\n <h4 className=\"text-xs font-semibold text-foreground\">Series</h4>\n <Field label=\"Name\" htmlFor={`${idBase}-series-name`}>\n <ChartCommitInput id={`${idBase}-series-name`} value={selectedSeries.name} data-option=\"series.name\" className={chartInputClass} onCommit={(name) => void controller.updateSeries(selectedSeries.id, { name })} />\n </Field>\n <Field label=\"Colour\" htmlFor={`${idBase}-series-color`}>\n <div className=\"flex items-center gap-1\">\n <input\n id={`${idBase}-series-color`}\n type=\"color\"\n value={chartColorInputValue(chartSeriesColor(spec, seriesIndex))}\n data-option=\"series.color\"\n className=\"h-7 w-9 shrink-0 cursor-pointer rounded border border-input bg-background p-0.5\"\n onPointerDown={() => controller.beginGesture(`color:${selectedSeries.id}`)}\n onBlur={() => controller.endGesture()}\n onChange={(e) => controller.updateSeries(selectedSeries.id, { color: e.currentTarget.value })}\n />\n {selectedSeries.color && (\n <button type=\"button\" className={chartButtonClass} data-action=\"reset-color\" onClick={() => controller.updateSeries(selectedSeries.id, { color: null })}>\n Palette\n </button>\n )}\n </div>\n </Field>\n {cartesian && (\n <Field label=\"Draw as\" htmlFor={`${idBase}-series-type`}>\n <select\n id={`${idBase}-series-type`}\n className={chartInputClass}\n value={selectedSeries.type ?? ''}\n data-option=\"series.type\"\n onChange={(e) => controller.updateSeries(selectedSeries.id, { type: (e.currentTarget.value || null) as any })}\n >\n <option value=\"\">Chart type</option>\n {CHART_SERIES_TYPES.map((t) => (\n <option key={t} value={t}>\n {CHART_TYPE_LABELS[t]}\n </option>\n ))}\n </select>\n </Field>\n )}\n {(cartesian || family === 'xy') && ['line', 'area', 'scatter'].includes(chartSeriesType(spec, selectedSeries)) && (\n <Field label=\"Marker\" htmlFor={`${idBase}-series-marker`}>\n <select\n id={`${idBase}-series-marker`}\n className={chartInputClass}\n value={selectedSeries.marker ?? ''}\n data-option=\"series.marker\"\n onChange={(e) => controller.updateSeries(selectedSeries.id, { marker: (e.currentTarget.value || null) as any })}\n >\n <option value=\"\">Default</option>\n {CHART_MARKERS.map((m) => (\n <option key={m} value={m}>\n {cap(m)}\n </option>\n ))}\n </select>\n </Field>\n )}\n {chartSupportsTrendlines(spec.type, spec.stacking) && (\n <div className=\"space-y-1\" data-section=\"trendlines\">\n {(selectedSeries.trendlines ?? []).map((t, i) => (\n <div key={i} className=\"flex items-center gap-1\" data-trendline={i}>\n <span className=\"flex-1 truncate text-muted-foreground\">{chartTrendlineName(t, selectedSeries.name)}</span>\n <Toggle label=\"R²\" name={`trendline.${i}.showR2`} checked={!!t.showR2} onChange={(showR2) => controller.updateTrendline(selectedSeries.id, i, { showR2 })} />\n <button type=\"button\" className={chartButtonClass} aria-label=\"Delete trendline\" data-action=\"trendline-delete\" onClick={() => controller.removeTrendline(selectedSeries.id, i)}>\n ×\n </button>\n </div>\n ))}\n <select\n className={chartInputClass}\n value=\"\"\n aria-label=\"Add trendline\"\n data-option=\"trendline.add\"\n onChange={(e) => e.currentTarget.value && controller.addTrendline(selectedSeries.id, { type: e.currentTarget.value as any })}\n >\n <option value=\"\">Add trendline…</option>\n {CHART_TRENDLINE_TYPES.map((t) => (\n <option key={t} value={t}>\n {cap(t.replace('-', ' '))}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1\">\n <Toggle label=\"Hidden\" name=\"series.hidden\" checked={!!selectedSeries.hidden} onChange={(hidden) => controller.updateSeries(selectedSeries.id, { hidden })} />\n {family === 'cartesian' && <Toggle label=\"Secondary axis\" name=\"series.axis\" checked={selectedSeries.axis === 'secondary'} onChange={(secondary) => controller.updateSeries(selectedSeries.id, { axis: secondary ? 'secondary' : null })} />}\n <span className=\"flex-1\" />\n <button type=\"button\" className={chartButtonClass} disabled={seriesIndex <= 0} aria-label=\"Move series earlier\" data-action=\"series-up\" onClick={() => controller.moveSeries(selectedSeries.id, seriesIndex - 1)}>\n ↑\n </button>\n <button type=\"button\" className={chartButtonClass} disabled={seriesIndex >= spec.series.length - 1} aria-label=\"Move series later\" data-action=\"series-down\" onClick={() => controller.moveSeries(selectedSeries.id, seriesIndex + 1)}>\n ↓\n </button>\n <button type=\"button\" className={`${chartButtonClass} text-destructive`} data-action=\"series-delete\" onClick={() => controller.removeSeries(selectedSeries.id)}>\n Delete\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { describeChartSelection, downloadChartPng, type ChartController, type DownloadChartPngOptions } from '@pixerate/editor/chart';\nimport { ChartCanvas, type ChartCanvasProps } from './ChartCanvas';\nimport { ChartDataGrid } from './ChartDataGrid';\nimport { ChartInspector } from './ChartInspector';\nimport { useChartState } from './useChartEditor';\nimport { chartButtonClass } from './styles';\n\nexport interface ChartEditorProps {\n controller: ChartController;\n /** The settings sidebar (default `true`). */\n showInspector?: boolean;\n /** The data grid under the chart (default `true`). */\n showDataGrid?: boolean;\n /** Undo / redo, Download PNG and the selection readout (default `true`). */\n showToolbar?: boolean;\n /** Size, theme, scale and file name for the toolbar's Download PNG (default 800 × 450, light theme). */\n pngOptions?: DownloadChartPngOptions;\n /** Chart height in pixels (default 380). */\n height?: number;\n canvasProps?: Omit<ChartCanvasProps, 'controller' | 'height'>;\n className?: string;\n}\n\n/** Toolbar, chart, settings sidebar and data grid for a `ChartController`. */\nexport function ChartEditor({ controller, showInspector = true, showDataGrid = true, showToolbar = true, pngOptions, height = 380, canvasProps, className }: ChartEditorProps) {\n const state = useChartState(controller);\n const [pngError, setPngError] = useState<string | null>(null);\n const downloadPng = () => {\n setPngError(null);\n downloadChartPng(controller.toJSON(), pngOptions).catch((error: unknown) => setPngError(error instanceof Error ? error.message : String(error)));\n };\n return (\n <div className={`flex flex-col gap-2 ${className ?? ''}`} data-chart-editor=\"\">\n {showToolbar && (\n <div className=\"flex items-center gap-1\" data-chart-toolbar=\"\">\n <button type=\"button\" className={chartButtonClass} disabled={!state.canUndo} title={state.undoLabel ? `Undo ${state.undoLabel}` : 'Undo'} data-action=\"undo\" onClick={() => controller.undo()}>\n Undo\n </button>\n <button type=\"button\" className={chartButtonClass} disabled={!state.canRedo} title={state.redoLabel ? `Redo ${state.redoLabel}` : 'Redo'} data-action=\"redo\" onClick={() => controller.redo()}>\n Redo\n </button>\n <button type=\"button\" className={chartButtonClass} title=\"Download the chart as a PNG image\" data-action=\"download-png\" onClick={downloadPng}>\n Download PNG\n </button>\n <span className=\"ml-2 truncate text-xs text-muted-foreground\" data-chart-selection=\"\" aria-live=\"polite\">\n {describeChartSelection(controller, state.selection)}\n </span>\n </div>\n )}\n {pngError && (\n <p role=\"alert\" className=\"rounded-md border border-destructive/40 bg-destructive/10 px-2 py-1 text-xs text-destructive\" data-chart-png-error=\"\">\n {pngError}\n </p>\n )}\n {state.issues.length > 0 && (\n <p role=\"alert\" className=\"rounded-md border border-destructive/40 bg-destructive/10 px-2 py-1 text-xs text-destructive\" data-chart-issues=\"\">\n {state.issues.map((i) => i.message).join(' ')}\n </p>\n )}\n <div className=\"flex min-h-0 flex-col gap-2 md:flex-row\">\n <div className=\"min-w-0 flex-1 rounded-md border border-border bg-background p-1\">\n <ChartCanvas controller={controller} height={height} {...canvasProps} />\n </div>\n {showInspector && <ChartInspector controller={controller} className=\"w-full shrink-0 overflow-y-auto rounded-md border border-border p-3 md:w-64\" />}\n </div>\n {showDataGrid && <ChartDataGrid controller={controller} />}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n CSS_VARIABLE_CHART_THEME,\n ChartStream,\n blendChartScenes,\n easeChartTween,\n layoutChart,\n layoutSparkline,\n type ChartScene,\n type ChartSparklineOptions,\n type ChartStreamFormat,\n type ChartTheme,\n type ChartValue,\n} from '@pixerate/editor/chart';\nimport { ChartSceneSvg } from './ChartCanvas';\n\nexport interface ChartStreamingViewProps {\n /** Mermaid (xychart-beta, pie, radar-beta) or a JSON chart spec, as far as it has arrived. */\n source: string;\n /** Nothing more will arrive: the final chart is drawn at once and problems are reported. */\n complete?: boolean;\n format?: ChartStreamFormat;\n width?: number;\n height?: number;\n theme?: Partial<ChartTheme>;\n /** How often a new layout is adopted while streaming (ms, default 300). */\n adoptInterval?: number;\n /** Tween length between layouts (ms, default 450; 0 to switch at once). */\n tween?: number;\n /** Shown before anything can be drawn. */\n placeholder?: React.ReactNode;\n /** Called with the parse problems once `complete`. */\n onIssues?: (issues: { message: string; line?: number }[]) => void;\n className?: string;\n}\n\n/**\n * Draws a chart whose source is still arriving (e.g. from a model): series appear as their\n * values come in, the value axis only grows so it does not jump, and each new layout tweens\n * from the last. Read-only; load the final spec into a `ChartController` to edit it.\n */\nexport function ChartStreamingView({ source, complete = false, format = 'auto', width = 640, height = 360, theme, adoptInterval = 300, tween = 450, placeholder, onIssues, className }: ChartStreamingViewProps) {\n const stream = useMemo(() => new ChartStream(format), [format]);\n const fullTheme = useMemo(() => ({ ...CSS_VARIABLE_CHART_THEME, ...theme }), [theme]);\n const [scene, setScene] = useState<ChartScene | null>(null);\n const shown = useRef<ChartScene | null>(null);\n const lastAdopt = useRef(0);\n const frame = useRef<number | null>(null);\n const pending = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const adopt = () => {\n const read = stream.update(source, complete);\n if (complete && onIssues) onIssues(read.issues);\n if (!read.spec) return;\n const next = layoutChart(read.spec, { width, height, theme: fullTheme, valueDomain: read.valueDomain });\n const from = shown.current;\n lastAdopt.current = Date.now();\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n if (!from || tween <= 0 || typeof requestAnimationFrame === 'undefined') {\n shown.current = next;\n setScene(next);\n return;\n }\n const start = performance.now();\n const step = () => {\n const t = easeChartTween((performance.now() - start) / tween);\n const s = blendChartScenes(from, next, t);\n shown.current = s;\n setScene(s);\n frame.current = t < 1 ? requestAnimationFrame(step) : null;\n };\n frame.current = requestAnimationFrame(step);\n };\n if (pending.current) clearTimeout(pending.current);\n const wait = complete ? 0 : Math.max(0, adoptInterval - (Date.now() - lastAdopt.current));\n if (wait === 0) adopt();\n else pending.current = setTimeout(adopt, wait);\n return () => {\n if (pending.current) clearTimeout(pending.current);\n };\n }, [source, complete, stream, width, height, fullTheme, adoptInterval, tween, onIssues]);\n\n useEffect(() => () => {\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n }, []);\n\n return (\n <div className={className} data-chart-streaming={complete ? 'complete' : 'streaming'} aria-busy={!complete}>\n {scene ? <ChartSceneSvg scene={scene} label={complete ? undefined : 'Chart loading'} /> : (placeholder ?? <div style={{ height }} className=\"flex items-center justify-center text-xs text-muted-foreground\">Drawing chart…</div>)}\n </div>\n );\n}\n\nexport interface ChartSparklineProps extends Omit<ChartSparklineOptions, 'width' | 'height'> {\n values: readonly ChartValue[];\n width?: number;\n height?: number;\n /** Accessible label (default: first and last value). */\n label?: string;\n className?: string;\n}\n\n/** A word-sized chart: line, column or win/loss. */\nexport function ChartSparkline({ values, width = 80, height = 20, label, className, ...options }: ChartSparklineProps) {\n const scene = useMemo(() => layoutSparkline(values, { ...options, width, height }), [values, width, height, options.kind, options.color, options.negativeColor, options.markers, options.highLow, options.min, options.max]);\n const present = values.filter((v): v is number => v !== null);\n return <ChartSceneSvg scene={scene} label={label ?? (present.length ? `Trend from ${present[0]} to ${present[present.length - 1]}` : 'No data')} className={`inline-block align-middle ${className ?? ''}`} />;\n}\n"],"mappings":"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","names":["import_react","import_chart","import_react","import_chart","import_jsx_runtime","import_react","import_chart","import_jsx_runtime","key","import_react","import_chart","import_jsx_runtime","import_react","import_chart","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/chart/index.ts","../../src/chart/useChartEditor.ts","../../src/chart/styles.ts","../../src/chart/ChartCanvas.tsx","../../src/chart/ChartDataGrid.tsx","../../src/chart/ChartInspector.tsx","../../src/chart/ChartEditor.tsx","../../src/chart/ChartStreamingView.tsx"],"sourcesContent":["export * from './useChartEditor';\nexport * from './styles';\nexport * from './ChartCanvas';\nexport * from './ChartDataGrid';\nexport * from './ChartInspector';\nexport * from './ChartEditor';\nexport * from './ChartStreamingView';\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport type { ToolRegistry } from '@pixerate/editor/tools';\nimport {\n ChartController,\n ChartDirector,\n ChartPresence,\n createChartCommands,\n createChartRasterizer,\n createChartToolProvider,\n createOfficeChartToolProvider,\n type OfficeChartToolProviderOptions,\n layoutChart,\n type ChartScene,\n type ChartToolProviderOptions,\n type ChartActionResult,\n type ChartCommandOptions,\n type ChartControllerOptions,\n type ChartSelection,\n type ChartSpecPatch,\n type ChartState,\n type ChartType,\n} from '@pixerate/editor/chart';\n\n/** A `ChartController` created once for the component's lifetime. */\nexport function useChartController(options: ChartControllerOptions = {}): ChartController {\n const ref = useRef<ChartController | null>(null);\n if (!ref.current) ref.current = new ChartController(options);\n return ref.current;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useChartState(controller: ChartController): ChartState {\n return useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\nexport interface UseChartEditorResult {\n controller: ChartController;\n state: ChartState;\n spec: ChartState['spec'];\n selection: ChartSelection | null;\n update: (patch: ChartSpecPatch) => ChartActionResult;\n setType: (type: ChartType) => ChartActionResult;\n setValue: (seriesId: string, index: number, value: unknown) => ChartActionResult;\n select: (selection: ChartSelection | null) => void;\n undo: () => void;\n redo: () => void;\n}\n\n/**\n * Subscribes to a chart controller and exposes its state with bound actions. Pass options\n * instead of a controller to create one for the component's lifetime.\n */\nexport function useChartEditor(controllerOrOptions: ChartController | ChartControllerOptions = {}): UseChartEditorResult {\n const own = useRef<ChartController | null>(null);\n let controller: ChartController;\n if (controllerOrOptions instanceof ChartController) controller = controllerOrOptions;\n else {\n if (!own.current) own.current = new ChartController(controllerOrOptions);\n controller = own.current;\n }\n const state = useChartState(controller);\n const actions = useMemo(\n () => ({\n update: (patch: ChartSpecPatch) => controller.update(patch),\n setType: (type: ChartType) => controller.setType(type),\n setValue: (seriesId: string, index: number, value: unknown) => controller.setValue(seriesId, index, value),\n select: (selection: ChartSelection | null) => controller.select(selection),\n undo: () => void controller.undo(),\n redo: () => void controller.redo(),\n }),\n [controller],\n );\n return { controller, state, spec: state.spec, selection: state.selection, ...actions };\n}\n\n/** Anything with `register(specs) → unregister` (a `CommandRegistry`). */\nexport interface ChartCommandTarget {\n register(specs: any): () => void;\n}\n\n/**\n * Registers the controller's palette / agent commands (`chart.describe`, `chart.update`,\n * `chart.setValues`, …) in `registry` while mounted.\n */\nexport function useChartCommands(registry: ChartCommandTarget | null | undefined, controller: ChartController, options: ChartCommandOptions = {}): void {\n const { prefix, group, scope } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createChartCommands(controller, { prefix, group, scope }));\n }, [registry, controller, prefix, group, scope]);\n}\n\n/** `useChartToolProvider` options: `rasterize` defaults to a canvas rasterizer in the browser (`false` turns PNG off). */\nexport type ChartToolProviderHookOptions = Omit<ChartToolProviderOptions, 'rasterize'> & { rasterize?: ChartToolProviderOptions['rasterize'] | false };\n\n/**\n * Registers the chart's agent tools (`createChartToolProvider`) with a `ToolRegistry` while\n * mounted. Options are read when the controller or registry changes. In the browser,\n * `render_chart { format: \"png\" }` works out of the box (`createChartRasterizer`).\n */\nexport function useChartToolProvider(registry: ToolRegistry | null | undefined, controller: ChartController, options: ChartToolProviderHookOptions = {}): void {\n const latest = useRef(options);\n latest.current = options;\n const { id, namespace } = options;\n useEffect(() => {\n if (!registry) return;\n const { rasterize, ...rest } = latest.current;\n return registry.register(createChartToolProvider(controller, { ...rest, id, namespace, rasterize: rasterize === false ? undefined : (rasterize ?? createChartRasterizer()) }));\n }, [registry, controller, id, namespace]);\n}\n\n/**\n * Registers the Office-file chart tools (`createOfficeChartToolProvider`: `list_file_charts`,\n * `get_file_chart`, and `load_file_chart` with a `controller`) while mounted. `files` and\n * `readOnly` are read on every call, so they can change without re-registering.\n */\nexport function useOfficeChartToolProvider(registry: ToolRegistry | null | undefined, options: OfficeChartToolProviderOptions = {}): void {\n const latest = useRef(options);\n latest.current = options;\n const { id, namespace, controller } = options;\n const hasFiles = !!options.files;\n useEffect(() => {\n if (!registry) return;\n const current = latest.current;\n return registry.register(\n createOfficeChartToolProvider({\n ...current,\n id,\n namespace,\n controller,\n files: hasFiles ? () => latest.current.files?.() ?? [] : undefined,\n readOnly: () => {\n const r = latest.current.readOnly;\n return (typeof r === 'function' ? r() : r) ?? false;\n },\n }),\n );\n }, [registry, id, namespace, controller, hasFiles]);\n}\n\n/**\n * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to\n * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a\n * cursor.\n */\nexport function useChartDirector(controller: ChartController, options: { speed?: number; size?: { width: number; height: number } } = {}) {\n const sceneRef = useRef<ChartScene | null>(null);\n const ref = useRef<{ presence: ChartPresence; director: ChartDirector } | null>(null);\n if (!ref.current) {\n const presence = new ChartPresence();\n const size = options.size ?? { width: 640, height: 400 };\n const director = new ChartDirector(controller, presence, { scene: () => sceneRef.current ?? layoutChart(controller.getSpec(), size), speed: options.speed });\n ref.current = { presence, director };\n }\n return { ...ref.current, sceneRef };\n}\n","// Class names shared by the chart components (the same as the Svelte package's).\nexport const chartInputClass =\n 'h-7 w-full min-w-0 rounded-md border border-input bg-background px-2 text-xs text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:cursor-not-allowed disabled:opacity-50';\nexport const chartButtonClass =\n 'inline-flex h-7 items-center justify-center gap-1 rounded-md border border-input bg-background px-2 text-xs text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-50';\nexport const chartIconButtonClass =\n 'inline-flex h-6 w-6 shrink-0 items-center justify-center rounded text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:pointer-events-none disabled:opacity-40';\nexport const chartSegmentClass = (active: boolean) =>\n `inline-flex h-7 flex-1 items-center justify-center rounded px-2 text-xs focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary ${\n active ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'\n }`;\nexport const chartLabelClass = 'text-[11px] font-medium text-muted-foreground';\nexport const chartSectionClass = 'space-y-2 border-b border-border pb-3 last:border-b-0';\nexport const chartCellClass =\n 'h-7 w-full min-w-[4.5rem] bg-transparent px-2 text-right text-xs tabular-nums text-foreground focus-visible:bg-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-primary';\n","import React, { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport {\n CSS_VARIABLE_CHART_THEME,\n chartClientToScene,\n chartTextBaseline,\n chartTextTransform,\n describeChartSelection,\n handleChartKey,\n layoutChart,\n startChartPointDrag,\n type ChartController,\n type ChartMark,\n type ChartPointDrag,\n type ChartPresence,\n type ChartScene,\n type ChartTextMeasure,\n type ChartTheme,\n} from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\n\nexport interface ChartCanvasProps {\n controller: ChartController;\n /** Scene width; with `responsive` this is only the fallback before the container is measured (default 640). */\n width?: number;\n /** Scene height in pixels (default 400). */\n height?: number;\n /** Follow the container's width (default `true`). */\n responsive?: boolean;\n /** Colours and type (default: shadcn-style CSS variables). */\n theme?: Partial<ChartTheme>;\n /** Click to select, drag bars and points, keyboard editing (default `true`). */\n editable?: boolean;\n /** Text width for layout (default: an estimate). */\n measureText?: ChartTextMeasure;\n emptyMessage?: string;\n className?: string;\n /** Agent cursors to draw over the chart (see `ChartDirector`). */\n presence?: ChartPresence;\n /** Receives the scene as drawn (e.g. for `ChartDirector`'s `scene`). */\n sceneRef?: { current: ChartScene | null };\n}\n\n/** SVG attributes for one mark (colours go in `style` so CSS variables work). */\nexport function renderChartMark(mark: ChartMark, fontFamily: string, interactive: boolean): React.ReactNode {\n const common = {\n 'data-role': mark.role,\n 'data-chart-key': mark.target ? mark.key : undefined,\n 'data-selected': mark.selected ? '' : undefined,\n opacity: mark.opacity,\n pointerEvents: mark.role === 'selection' || mark.role === 'drag-readout' || (!mark.target && mark.role !== 'background') ? ('none' as const) : undefined,\n cursor: interactive && mark.target && mark.role !== 'background' ? 'pointer' : undefined,\n };\n switch (mark.kind) {\n case 'rect':\n return <rect key={mark.key} {...common} x={mark.x} y={mark.y} width={mark.width} height={mark.height} rx={mark.radius} style={{ fill: mark.fill, stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'path':\n return (\n <path\n key={mark.key}\n {...common}\n d={mark.d}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n strokeDasharray={mark.dash}\n style={{ fill: mark.fill ?? 'none', stroke: mark.stroke, strokeWidth: mark.strokeWidth }}\n />\n );\n case 'circle':\n return <circle key={mark.key} {...common} cx={mark.cx} cy={mark.cy} r={mark.r} style={{ fill: mark.fill, stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'line':\n return <line key={mark.key} {...common} x1={mark.x1} y1={mark.y1} x2={mark.x2} y2={mark.y2} strokeDasharray={mark.dash} style={{ stroke: mark.stroke, strokeWidth: mark.strokeWidth }} />;\n case 'text':\n return (\n <text\n key={mark.key}\n {...common}\n x={mark.x}\n y={mark.y}\n textAnchor={mark.anchor}\n dominantBaseline={chartTextBaseline(mark.baseline)}\n transform={chartTextTransform(mark)}\n style={{ fill: mark.fill, fontSize: mark.size, fontWeight: mark.weight, fontFamily, userSelect: 'none' }}\n >\n {mark.text}\n </text>\n );\n }\n}\n\n/** Agent cursors and notes, drawn in scene coordinates inside the chart's SVG. */\nexport function ChartPresenceLayer({ presence }: { presence: ChartPresence }) {\n const { actors } = useSyncExternalStore(presence.subscribe, presence.getState, presence.getState);\n return (\n <g data-chart-presence=\"\" pointerEvents=\"none\">\n {actors.map((a) => (\n <g key={a.id} transform={`translate(${a.x} ${a.y})`} data-actor={a.id}>\n <path d=\"M0,0 L0,14 L4,10.5 L7,17 L9.5,16 L6.5,9.5 L11.5,9.5 Z\" style={{ fill: a.color, stroke: '#ffffff', strokeWidth: 1 }} transform={a.pressed ? 'scale(0.9)' : undefined} />\n <g transform=\"translate(13 16)\">\n <rect x={0} y={0} rx={4} height={18} width={Math.max(28, (a.message ?? a.name).length * 6.4 + 12)} style={{ fill: a.color }} />\n <text x={6} y={9} dominantBaseline=\"central\" style={{ fill: '#ffffff', fontSize: 11, fontWeight: 600, fontFamily: 'inherit' }}>\n {a.message ?? a.name}\n </text>\n </g>\n </g>\n ))}\n </g>\n );\n}\n\n/** A laid-out scene as an SVG (no interaction): for read-only views, streaming and exports. */\nexport function ChartSceneSvg({ scene, label, className }: { scene: ChartScene; label?: string; className?: string }) {\n return (\n <svg width={scene.width} height={scene.height} viewBox={`0 0 ${scene.width} ${scene.height}`} role=\"img\" aria-label={label} className={`block max-w-full ${className ?? ''}`}>\n {scene.marks.map((m) => renderChartMark(m, scene.theme.fontFamily, false))}\n </svg>\n );\n}\n\ninterface Frozen {\n valueDomain: ChartPointDrag['valueDomain'];\n valueDomain2: ChartPointDrag['valueDomain2'] | null;\n xDomain: ChartPointDrag['xDomain'] | null;\n readout: ChartPointDrag['target'];\n}\n\n/**\n * Draws a chart controller's spec as SVG. Click a mark to select it, drag a bar or point to\n * change its value (one undo step; Alt for fine steps, Shift to keep one axis on scatter\n * charts, Ctrl / ⌘ to skip snapping, Escape to cancel), and with the chart focused use\n * ← → ↑ ↓, Delete and Escape (see `handleChartKey`).\n */\nexport function ChartCanvas({ controller, width = 640, height = 400, responsive = true, theme, editable = true, measureText, emptyMessage, className, presence, sceneRef }: ChartCanvasProps) {\n const state = useChartState(controller);\n const wrapper = useRef<HTMLDivElement>(null);\n const svg = useRef<SVGSVGElement>(null);\n const drag = useRef<ChartPointDrag | null>(null);\n const [measured, setMeasured] = useState<number | null>(null);\n // Frozen while a point is dragged so the axes do not rescale under the pointer.\n const [frozen, setFrozen] = useState<Frozen | null>(null);\n\n useEffect(() => {\n const el = wrapper.current;\n if (!responsive || !el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => {\n const w = Math.round(entry.contentRect.width);\n if (w > 0) setMeasured(w);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [responsive]);\n\n const sceneWidth = (responsive && measured) || width;\n const fullTheme = useMemo(() => ({ ...CSS_VARIABLE_CHART_THEME, ...theme }), [theme]);\n const scene = useMemo(\n () =>\n layoutChart(state.spec, {\n width: sceneWidth,\n height,\n theme: fullTheme,\n selection: editable ? state.selection : null,\n measureText,\n emptyMessage,\n valueDomain: frozen?.valueDomain,\n valueDomain2: frozen?.valueDomain2,\n xDomain: frozen?.xDomain,\n readout: frozen?.readout,\n }),\n [state.spec, state.selection, sceneWidth, height, fullTheme, editable, measureText, emptyMessage, frozen],\n );\n if (sceneRef) sceneRef.current = scene;\n const byKey = useMemo(() => new Map(scene.marks.map((m) => [m.key, m])), [scene]);\n\n useEffect(() => () => drag.current?.end(), []);\n\n const scenePoint = (e: React.PointerEvent) => chartClientToScene(scene, svg.current!.getBoundingClientRect(), e.clientX, e.clientY);\n\n const onPointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n if (!editable || e.button !== 0) return;\n const key = (e.target as Element).closest?.('[data-chart-key]')?.getAttribute('data-chart-key');\n const target = key ? byKey.get(key)?.target : undefined;\n controller.select(target ?? null);\n drag.current = startChartPointDrag(controller, scene, target, scenePoint(e));\n if (drag.current) {\n const d = drag.current;\n setFrozen({ valueDomain: d.valueDomain, valueDomain2: d.valueDomain2 ?? null, xDomain: d.xDomain ?? null, readout: d.target });\n svg.current?.setPointerCapture?.(e.pointerId);\n }\n };\n const onPointerMove = (e: React.PointerEvent<SVGSVGElement>) => {\n if (drag.current) drag.current.move(scenePoint(e), { fine: e.altKey, lockAxis: e.shiftKey, noSnap: e.ctrlKey || e.metaKey });\n };\n const endDrag = () => {\n drag.current?.end();\n drag.current = null;\n setFrozen(null);\n };\n const onKeyDown = (e: React.KeyboardEvent<SVGSVGElement>) => {\n if (drag.current && e.key === 'Escape') {\n drag.current.cancel();\n drag.current = null;\n setFrozen(null);\n e.preventDefault();\n return;\n }\n if (editable && handleChartKey(controller, scene, e)) e.preventDefault();\n };\n\n const label = state.spec.title || 'Chart';\n return (\n <div ref={wrapper} className={`w-full ${className ?? ''}`} data-chart-canvas=\"\">\n <svg\n ref={svg}\n width={sceneWidth}\n height={height}\n viewBox={`0 0 ${scene.width} ${scene.height}`}\n role=\"img\"\n aria-label={editable ? `${label}. ${describeChartSelection(controller, state.selection)}` : label}\n tabIndex={editable ? 0 : undefined}\n className=\"block max-w-full touch-none select-none rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n >\n {scene.marks.map((m) => renderChartMark(m, scene.theme.fontFamily, editable))}\n {presence && <ChartPresenceLayer presence={presence} />}\n </svg>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { chartColorInputValue, chartSeriesColor, formatChartNumber, type ChartController } from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\nimport { chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass } from './styles';\n\ntype CommitInputProps = {\n value: string;\n /** Called with the typed text. Return `false` to show the stored value again (a refused edit). */\n onCommit: (value: string) => boolean | void;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'defaultValue'>;\n\n/** A text box that commits on blur or Enter and resets on Escape. Follows `value` unless the user is typing. */\nexport function ChartCommitInput({ value, onCommit, onKeyDown, onBlur, ...rest }: CommitInputProps) {\n const [draft, setDraft] = useState(value);\n const typing = useRef(false);\n useEffect(() => {\n if (!typing.current) setDraft(value);\n }, [value]);\n const commit = () => {\n if (!typing.current) return;\n typing.current = false;\n if (draft === value) return;\n if (onCommit(draft) === false) setDraft(value);\n };\n return (\n <input\n {...rest}\n value={draft}\n onChange={(e) => {\n typing.current = true;\n setDraft(e.currentTarget.value);\n }}\n onBlur={(e) => {\n onBlur?.(e);\n commit();\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n } else if (e.key === 'Escape') {\n typing.current = false;\n setDraft(value);\n }\n }}\n />\n );\n}\n\nexport interface ChartDataGridProps {\n controller: ChartController;\n /** Header of the category column (default \"Category\"). */\n categoryHeader?: string;\n /** Hide the add / delete buttons. */\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * The chart's data as an editable grid: categories down the side, one column per series\n * (name, colour, show / hide, delete). Cells take numbers as people type them (`1,200`,\n * `12%`, blank for a gap); pasting TSV or CSV fills and grows the grid from the cell.\n */\nexport function ChartDataGrid({ controller, categoryHeader = 'Category', readOnly = false, className }: ChartDataGridProps) {\n const { spec, selection } = useChartState(controller);\n const paste = (row: number, column: number) => (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData?.getData('text/plain') ?? '';\n if (!/[\\t\\n]/.test(text.replace(/\\n$/, ''))) return;\n e.preventDefault();\n controller.pasteCells(row, column, text);\n };\n return (\n <div className={`overflow-auto rounded-md border border-border ${className ?? ''}`} data-chart-grid=\"\">\n <table className=\"w-full border-collapse text-xs\">\n <thead className=\"bg-muted/50\">\n <tr>\n <th className=\"border-b border-r border-border px-2 py-1 text-left font-medium text-muted-foreground\">{categoryHeader}</th>\n {spec.series.map((s, si) => {\n const color = chartSeriesColor(spec, si);\n const selected = selection?.kind === 'series' && selection.seriesId === s.id;\n return (\n <th key={s.id} data-series-id={s.id} className={`border-b border-r border-border px-1 py-1 font-medium ${selected ? 'bg-primary/10' : ''}`}>\n <div className=\"flex items-center gap-1\">\n <input\n type=\"color\"\n aria-label={`${s.name} colour`}\n value={chartColorInputValue(color)}\n disabled={readOnly}\n onPointerDown={() => controller.beginGesture(`color:${s.id}`)}\n onChange={(e) => controller.updateSeries(s.id, { color: e.currentTarget.value })}\n onBlur={() => controller.endGesture()}\n className=\"h-5 w-5 shrink-0 cursor-pointer rounded border-0 bg-transparent p-0\"\n />\n <ChartCommitInput\n value={s.name}\n aria-label=\"Series name\"\n onFocus={() => controller.select({ kind: 'series', seriesId: s.id })}\n onCommit={(name) => void controller.updateSeries(s.id, { name })}\n className={`${chartInputClass} h-6 min-w-[5rem] border-transparent bg-transparent font-medium ${s.hidden ? 'text-muted-foreground line-through' : ''}`}\n />\n {!readOnly && (\n <>\n <button\n type=\"button\"\n className={chartIconButtonClass}\n title={s.hidden ? 'Show series' : 'Hide series'}\n aria-label={s.hidden ? `Show ${s.name}` : `Hide ${s.name}`}\n aria-pressed={!s.hidden}\n data-action=\"toggle-series\"\n onClick={() => controller.toggleSeries(s.id)}\n >\n {s.hidden ? '○' : '●'}\n </button>\n <button type=\"button\" className={chartIconButtonClass} title=\"Delete series\" aria-label={`Delete ${s.name}`} data-action=\"remove-series\" onClick={() => controller.removeSeries(s.id)}>\n ×\n </button>\n </>\n )}\n </div>\n </th>\n );\n })}\n {!readOnly && (\n <th className=\"w-8 border-b border-border px-1\">\n <button type=\"button\" className={chartIconButtonClass} title=\"Add series\" aria-label=\"Add series\" data-action=\"add-series\" onClick={() => controller.addSeries()}>\n +\n </button>\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {spec.categories.map((category, i) => {\n const rowSelected = selection?.kind === 'category' && selection.index === i;\n return (\n <tr key={i} data-category-index={i} className={rowSelected ? 'bg-primary/10' : undefined}>\n <th className=\"border-b border-r border-border p-0 text-left font-normal\">\n <ChartCommitInput\n value={category}\n aria-label={`Category ${i + 1}`}\n onFocus={() => controller.select({ kind: 'category', index: i })}\n onPaste={paste(i, -1)}\n onCommit={(label) => void controller.renameCategory(i, label)}\n className={`${chartCellClass} text-left`}\n />\n </th>\n {spec.series.map((s) => {\n const value = s.values[i];\n const selected = selection?.kind === 'point' && selection.seriesId === s.id && selection.index === i;\n return (\n <td key={s.id} className={`border-b border-r border-border p-0 ${selected ? 'bg-primary/10' : ''}`}>\n <ChartCommitInput\n value={value === null || value === undefined ? '' : String(value)}\n inputMode=\"decimal\"\n aria-label={`${s.name}, ${category}`}\n title={value === null ? undefined : formatChartNumber(value, spec.yAxis.format)}\n data-cell={`${s.id}:${i}`}\n onFocus={() => controller.select({ kind: 'point', seriesId: s.id, index: i })}\n onPaste={paste(i, spec.series.indexOf(s))}\n onCommit={(text) => controller.setValue(s.id, i, text).ok}\n className={chartCellClass}\n />\n </td>\n );\n })}\n {!readOnly && (\n <td className=\"border-b border-border px-1\">\n <button type=\"button\" className={chartIconButtonClass} title=\"Delete category\" aria-label={`Delete ${category}`} data-action=\"remove-category\" onClick={() => controller.removeCategory(i)}>\n ×\n </button>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-1\">\n <button type=\"button\" className={`${chartButtonClass} h-6 border-dashed`} data-action=\"add-category\" onClick={() => controller.addCategory()}>\n + Add category\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useId } from 'react';\nimport {\n CHART_COLOR_SCHEMES,\n CHART_ERROR_BAR_DIRECTIONS,\n CHART_ERROR_BAR_LABELS,\n CHART_ERROR_BAR_TYPES,\n CHART_LABEL_POSITIONS,\n CHART_LAYOUT_PRESETS,\n CHART_MARKERS,\n CHART_TRENDLINE_TYPES,\n checkChartColors,\n chartFamily,\n chartSupportsTrendlines,\n chartTrendlineName,\n CHART_CURVES,\n CHART_LEGEND_POSITIONS,\n CHART_NUMBER_STYLES,\n CHART_SERIES_TYPES,\n CHART_STACKINGS,\n CHART_TYPE_LABELS,\n CHART_TYPES,\n chartColorInputValue,\n chartErrorBarsOfType,\n chartSeriesColor,\n defaultChartErrorBarValue,\n formatChartAmountList,\n parseChartAmountList,\n chartSeriesType,\n isCartesianChart,\n type ChartAxis,\n type ChartController,\n type ChartErrorBars,\n type ChartErrorBarType,\n type ChartNumberFormat,\n type ChartSeries,\n} from '@pixerate/editor/chart';\nimport { useChartState } from './useChartEditor';\nimport { ChartCommitInput } from './ChartDataGrid';\nimport { chartButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass } from './styles';\n\nexport interface ChartInspectorProps {\n controller: ChartController;\n /** Which sections to show (default: all that apply to the chart). */\n sections?: readonly ChartInspectorSection[];\n className?: string;\n}\n\nexport type ChartInspectorSection = 'type' | 'style' | 'titles' | 'options' | 'legend' | 'axes' | 'series';\n\nconst cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\nfunction Field({ label, htmlFor, children }: { label: string; htmlFor?: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <label htmlFor={htmlFor} className={`${chartLabelClass} w-20 shrink-0`}>\n {label}\n </label>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n\nfunction Toggle({ label, checked, onChange, name }: { label: string; checked: boolean; onChange: (checked: boolean) => void; name: string }) {\n return (\n <label className=\"flex cursor-pointer items-center gap-2 text-xs text-foreground\">\n <input type=\"checkbox\" className=\"h-3.5 w-3.5 accent-primary\" checked={checked} data-option={name} onChange={(e) => onChange(e.currentTarget.checked)} />\n {label}\n </label>\n );\n}\n\nfunction Select<T extends string>({ id, value, options, onChange, name, labels }: { id?: string; value: T; options: readonly T[]; onChange: (value: T) => void; name: string; labels?: Partial<Record<T, string>> }) {\n return (\n <select id={id} className={chartInputClass} value={value} data-option={name} onChange={(e) => onChange(e.currentTarget.value as T)}>\n {options.map((o) => (\n <option key={o} value={o}>\n {labels?.[o] ?? cap(o)}\n </option>\n ))}\n </select>\n );\n}\n\nfunction AxisSection({ controller, axis, value, idBase, horizontal, numeric = false, scales = false }: { controller: ChartController; axis: 'x' | 'y' | 'y2'; value: ChartAxis; idBase: string; horizontal: boolean; numeric?: boolean; scales?: boolean }) {\n const set = (patch: Partial<ChartAxis>) => controller.setAxis(axis, patch);\n const setFormat = (patch: Partial<ChartNumberFormat>) => set({ format: { ...value.format, ...patch } });\n const bound = (key: 'min' | 'max') => (\n <ChartCommitInput\n id={`${idBase}-${axis}-${key}`}\n value={value[key] === null ? '' : String(value[key])}\n placeholder=\"Auto\"\n inputMode=\"decimal\"\n data-option={`${axis}Axis.${key}`}\n className={chartInputClass}\n onCommit={(text) => set({ [key]: text.trim() === '' ? null : Number(text) }).ok}\n />\n );\n const name = axis === 'x' ? (numeric ? 'X axis' : 'Category axis') : axis === 'y' ? 'Value axis' : 'Secondary axis';\n const valueAxis = axis !== 'x' || numeric;\n const key = axis === 'y2' ? 'yAxis2' : `${axis}Axis`;\n return (\n <div className={chartSectionClass} data-section={`axis-${axis}`}>\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-foreground\">\n {name}\n <span className=\"ml-1 font-normal text-muted-foreground\">({axis === 'x' ? (horizontal ? 'left' : 'bottom') : axis === 'y2' ? (horizontal ? 'top' : 'right') : horizontal ? 'bottom' : 'left'})</span>\n </h4>\n <Toggle label=\"Show\" name={`${axis}Axis.show`} checked={value.show} onChange={(show) => set({ show })} />\n </div>\n <Field label=\"Title\" htmlFor={`${idBase}-${axis}-title`}>\n <ChartCommitInput id={`${idBase}-${axis}-title`} value={value.title} data-option={`${axis}Axis.title`} className={chartInputClass} onCommit={(title) => void set({ title })} />\n </Field>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n <Toggle label=\"Grid lines\" name={`${key}.gridlines`} checked={value.gridlines} onChange={(gridlines) => set({ gridlines })} />\n {axis === 'x' && !numeric && <Toggle label=\"Dates\" name=\"xAxis.kind\" checked={value.kind === 'date'} onChange={(dates) => set({ kind: dates ? 'date' : undefined } as Partial<ChartAxis>)} />}\n {scales && <Toggle label=\"Reverse\" name={`${key}.reverse`} checked={!!value.reverse} onChange={(reverse) => set({ reverse })} />}\n {scales && valueAxis && <Toggle label=\"Log scale\" name={`${key}.scale`} checked={value.scale === 'log'} onChange={(log) => set({ scale: log ? 'log' : 'linear' })} />}\n </div>\n {scales && valueAxis && value.scale === 'log' && (\n <Field label=\"Log base\" htmlFor={`${idBase}-${axis}-log-base`}>\n <ChartCommitInput\n id={`${idBase}-${axis}-log-base`}\n value={String(value.logBase ?? 10)}\n inputMode=\"decimal\"\n data-option={`${key}.logBase`}\n className={chartInputClass}\n onCommit={(text) => set({ logBase: text.trim() === '' ? undefined : Number(text) }).ok}\n />\n </Field>\n )}\n {valueAxis && value.scale !== 'log' && (\n <Field label=\"Step\" htmlFor={`${idBase}-${axis}-step`}>\n <ChartCommitInput\n id={`${idBase}-${axis}-step`}\n value={value.step === null ? '' : String(value.step)}\n placeholder=\"Auto\"\n inputMode=\"decimal\"\n data-option={`${key}.step`}\n className={chartInputClass}\n onCommit={(text) => set({ step: text.trim() === '' ? null : Number(text) }).ok}\n />\n </Field>\n )}\n {valueAxis && (\n <>\n <Field label=\"Min / max\">\n <div className=\"flex gap-1\">\n {bound('min')}\n {bound('max')}\n </div>\n </Field>\n <Field label=\"Format\" htmlFor={`${idBase}-${axis}-format`}>\n <div className=\"flex gap-1\">\n <Select id={`${idBase}-${axis}-format`} name={`${key}.format.style`} value={value.format.style ?? 'number'} options={CHART_NUMBER_STYLES} onChange={(style) => setFormat({ style })} />\n <ChartCommitInput\n value={value.format.decimals === undefined ? '' : String(value.format.decimals)}\n placeholder=\"Auto\"\n aria-label=\"Decimals\"\n title=\"Decimals\"\n inputMode=\"numeric\"\n data-option={`${key}.format.decimals`}\n className={`${chartInputClass} w-14 shrink-0`}\n onCommit={(text) => {\n const format = { ...value.format };\n if (text.trim() === '') delete format.decimals;\n else format.decimals = Number(text);\n return set({ format }).ok;\n }}\n />\n </div>\n </Field>\n {value.format.style === 'currency' && (\n <Field label=\"Currency\" htmlFor={`${idBase}-${axis}-currency`}>\n <ChartCommitInput id={`${idBase}-${axis}-currency`} value={value.format.currency ?? 'USD'} data-option={`${key}.format.currency`} className={chartInputClass} onCommit={(currency) => void setFormat({ currency: currency.toUpperCase() })} />\n </Field>\n )}\n <Field label=\"Code\" htmlFor={`${idBase}-${axis}-code`}>\n <ChartCommitInput\n id={`${idBase}-${axis}-code`}\n value={value.format.code ?? ''}\n placeholder={'e.g. #,##0.0,,\"M\"'}\n data-option={`${key}.format.code`}\n className={chartInputClass}\n onCommit={(code) => {\n const format = { ...value.format };\n if (code.trim()) format.code = code.trim();\n else delete format.code;\n return set({ format }).ok;\n }}\n />\n </Field>\n </>\n )}\n </div>\n );\n}\n\n/** Error bar type, amount, direction and caps for one series (`which`: y or x error bars). */\nfunction ErrorBarFields({ controller, series, which, idBase }: { controller: ChartController; series: ChartSeries; which: 'errorBars' | 'xErrorBars'; idBase: string }) {\n const bars = series[which];\n const key = `series.${which}`;\n const id = `${idBase}-${which}`;\n const values = which === 'xErrorBars' ? (series.x ?? []) : series.values;\n const set = (next: ChartErrorBars | null) => controller.updateSeries(series.id, { [which]: next });\n const patch = (p: Partial<ChartErrorBars>) => bars && set({ ...bars, ...p });\n return (\n <div className=\"space-y-1.5\" data-section={which === 'errorBars' ? 'error-bars' : 'x-error-bars'}>\n <Field label={which === 'errorBars' ? 'Error bars' : 'X error bars'} htmlFor={`${id}-type`}>\n <select id={`${id}-type`} className={chartInputClass} value={bars?.type ?? ''} data-option={`${key}.type`} onChange={(e) => set(chartErrorBarsOfType(e.currentTarget.value as ChartErrorBarType | '', bars, values))}>\n <option value=\"\">None</option>\n {CHART_ERROR_BAR_TYPES.map((t) => (\n <option key={t} value={t}>\n {CHART_ERROR_BAR_LABELS[t]}\n </option>\n ))}\n </select>\n </Field>\n {bars && (bars.type === 'fixed' || bars.type === 'percent' || bars.type === 'stddev') && (\n <Field label={bars.type === 'percent' ? 'Percent' : bars.type === 'stddev' ? 'Deviations' : 'Amount'} htmlFor={`${id}-value`}>\n <ChartCommitInput id={`${id}-value`} value={String(bars.value ?? defaultChartErrorBarValue(bars.type))} inputMode=\"decimal\" data-option={`${key}.value`} className={chartInputClass} onCommit={(text) => !!patch({ value: text.trim() === '' ? undefined : Number(text) })?.ok} />\n </Field>\n )}\n {bars?.type === 'custom' && (\n <>\n <Field label=\"Plus\" htmlFor={`${id}-plus`}>\n <ChartCommitInput id={`${id}-plus`} value={formatChartAmountList(bars.plus)} placeholder=\"1, 2, -, 0.5\" data-option={`${key}.plus`} className={chartInputClass} onCommit={(text) => !!patch({ plus: parseChartAmountList(text) as ChartErrorBars['plus'] })?.ok} />\n </Field>\n <Field label=\"Minus\" htmlFor={`${id}-minus`}>\n <ChartCommitInput\n id={`${id}-minus`}\n value={formatChartAmountList(bars.minus)}\n placeholder=\"Same as plus\"\n data-option={`${key}.minus`}\n className={chartInputClass}\n onCommit={(text) => {\n const next = { ...bars };\n if (text.trim()) next.minus = parseChartAmountList(text) as ChartErrorBars['minus'];\n else delete next.minus;\n return set(next).ok;\n }}\n />\n </Field>\n </>\n )}\n {bars && (\n <div className=\"flex items-center gap-2\">\n <select className={`${chartInputClass} flex-1`} aria-label=\"Error bar direction\" value={bars.direction ?? 'both'} data-option={`${key}.direction`} onChange={(e) => patch({ direction: e.currentTarget.value as ChartErrorBars['direction'] })}>\n {CHART_ERROR_BAR_DIRECTIONS.map((d) => (\n <option key={d} value={d}>\n {d === 'both' ? 'Both ways' : d === 'plus' ? 'Plus only' : 'Minus only'}\n </option>\n ))}\n </select>\n <Toggle label=\"Caps\" name={`${key}.cap`} checked={bars.cap !== false} onChange={(cap) => patch({ cap })} />\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Settings for a chart controller: type, titles, stacking and line options, legend, both\n * axes and the selected series. Every change is one undo step.\n */\nexport function ChartInspector({ controller, sections, className }: ChartInspectorProps) {\n const { spec, selectedSeries } = useChartState(controller);\n const idBase = useId();\n const show = (section: ChartInspectorSection) => !sections || sections.includes(section);\n const cartesian = isCartesianChart(spec.type);\n const family = chartFamily(spec);\n const hasAxes = family === 'cartesian' || family === 'xy' || family === 'waterfall' || family === 'histogram' || family === 'box';\n const types = spec.series.map((s) => chartSeriesType(spec, s));\n const usesSecondary = family === 'cartesian' && spec.series.some((s) => s.axis === 'secondary' && !s.hidden);\n const colorCheck = checkChartColors(spec.series.filter((s) => !s.hidden).map((s) => chartSeriesColor(spec, spec.series.indexOf(s))));\n const hasBars = cartesian && types.includes('bar');\n const hasLines = cartesian && types.some((t) => t === 'line' || t === 'area');\n const seriesIndex = selectedSeries ? spec.series.findIndex((s) => s.id === selectedSeries.id) : -1;\n // Log and reversed axes and error bars are drawn by the bar / line / area / scatter layouts.\n const scales = family === 'cartesian' || family === 'xy';\n\n return (\n <div className={`space-y-3 text-xs ${className ?? ''}`} data-chart-inspector=\"\">\n {show('type') && (\n <div className={chartSectionClass} data-section=\"type\">\n <div className=\"grid grid-cols-3 gap-0.5 rounded-md bg-muted p-0.5\" role=\"radiogroup\" aria-label=\"Chart type\">\n {CHART_TYPES.map((type) => (\n <button key={type} type=\"button\" role=\"radio\" aria-checked={spec.type === type} data-chart-type={type} className={chartSegmentClass(spec.type === type)} onClick={() => controller.setType(type)}>\n {CHART_TYPE_LABELS[type]}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {show('style') && (\n <div className={chartSectionClass} data-section=\"style\">\n <Field label=\"Layout\" htmlFor={`${idBase}-layout`}>\n <select id={`${idBase}-layout`} className={chartInputClass} value=\"\" data-option=\"preset.layout\" onChange={(e) => e.currentTarget.value && controller.applyPreset({ layout: e.currentTarget.value })}>\n <option value=\"\">Quick layout…</option>\n {CHART_LAYOUT_PRESETS.map((p) => (\n <option key={p.id} value={p.id} title={p.description}>\n {p.label}\n </option>\n ))}\n </select>\n </Field>\n <Field label=\"Colours\" htmlFor={`${idBase}-colors`}>\n <select id={`${idBase}-colors`} className={chartInputClass} value={CHART_COLOR_SCHEMES.find((c) => c.palette.join() === spec.palette.join())?.id ?? ''} data-option=\"preset.colors\" onChange={(e) => e.currentTarget.value && controller.applyPreset({ colors: e.currentTarget.value })}>\n <option value=\"\">Custom</option>\n {CHART_COLOR_SCHEMES.map((c) => (\n <option key={c.id} value={c.id} title={c.description}>\n {c.label}\n </option>\n ))}\n </select>\n </Field>\n {!colorCheck.ok && (\n <p className=\"text-[11px] leading-snug text-amber-600 dark:text-amber-400\" data-chart-color-warning=\"\">\n {colorCheck.issues[0]}\n </p>\n )}\n <button type=\"button\" className={chartButtonClass} data-action=\"transpose\" onClick={() => controller.transpose()}>\n Switch rows and columns\n </button>\n </div>\n )}\n\n {show('titles') && (\n <div className={chartSectionClass} data-section=\"titles\">\n <Field label=\"Title\" htmlFor={`${idBase}-title`}>\n <ChartCommitInput id={`${idBase}-title`} value={spec.title} data-option=\"title\" className={chartInputClass} onCommit={(title) => void controller.setTitle(title)} />\n </Field>\n <Field label=\"Subtitle\" htmlFor={`${idBase}-subtitle`}>\n <ChartCommitInput id={`${idBase}-subtitle`} value={spec.subtitle} data-option=\"subtitle\" className={chartInputClass} onCommit={(subtitle) => void controller.setSubtitle(subtitle)} />\n </Field>\n </div>\n )}\n\n {show('options') && (\n <div className={chartSectionClass} data-section=\"options\">\n {cartesian && (\n <Field label=\"Stacking\" htmlFor={`${idBase}-stacking`}>\n <Select id={`${idBase}-stacking`} name=\"stacking\" value={spec.stacking} options={CHART_STACKINGS} labels={{ none: 'None', stacked: 'Stacked', percent: '100%' }} onChange={(stacking) => controller.update({ stacking })} />\n </Field>\n )}\n {hasBars && (\n <Field label=\"Bars\">\n <div className=\"flex gap-0.5 rounded-md bg-muted p-0.5\">\n {(['vertical', 'horizontal'] as const).map((o) => (\n <button key={o} type=\"button\" aria-pressed={spec.orientation === o} data-option={`orientation.${o}`} className={chartSegmentClass(spec.orientation === o)} onClick={() => controller.update({ orientation: o })}>\n {cap(o)}\n </button>\n ))}\n </div>\n </Field>\n )}\n {hasLines && (\n <Field label=\"Lines\" htmlFor={`${idBase}-curve`}>\n <Select id={`${idBase}-curve`} name=\"curve\" value={spec.curve} options={CHART_CURVES} onChange={(curve) => controller.update({ curve })} />\n </Field>\n )}\n {spec.type === 'donut' && (\n <Field label=\"Hole\" htmlFor={`${idBase}-hole`}>\n <input\n id={`${idBase}-hole`}\n type=\"range\"\n min={0}\n max={0.9}\n step={0.05}\n value={spec.innerRadius}\n data-option=\"innerRadius\"\n className=\"w-full accent-primary\"\n onPointerDown={() => controller.beginGesture('innerRadius')}\n onPointerUp={() => controller.endGesture()}\n onChange={(e) => controller.update({ innerRadius: Number(e.currentTarget.value) })}\n />\n </Field>\n )}\n {hasBars && (\n <Field label=\"Spacing\" htmlFor={`${idBase}-gap`}>\n <input\n id={`${idBase}-gap`}\n type=\"range\"\n min={0}\n max={0.9}\n step={0.02}\n value={spec.gapWidth}\n data-option=\"gapWidth\"\n className=\"w-full accent-primary\"\n onPointerDown={() => controller.beginGesture('gapWidth')}\n onPointerUp={() => controller.endGesture()}\n onChange={(e) => controller.update({ gapWidth: Number(e.currentTarget.value) })}\n />\n </Field>\n )}\n {spec.dataLabels && hasBars && (\n <Field label=\"Labels\" htmlFor={`${idBase}-label-position`}>\n <Select id={`${idBase}-label-position`} name=\"labelPosition\" value={spec.labelPosition} options={CHART_LABEL_POSITIONS} onChange={(labelPosition) => controller.update({ labelPosition })} />\n </Field>\n )}\n {spec.type === 'histogram' && (\n <Field label=\"Bins\" htmlFor={`${idBase}-bins`}>\n <ChartCommitInput id={`${idBase}-bins`} value={spec.bins === null ? '' : String(spec.bins)} placeholder=\"Auto\" inputMode=\"numeric\" data-option=\"bins\" className={chartInputClass} onCommit={(text) => controller.update({ bins: text.trim() === '' ? null : Number(text) }).ok} />\n </Field>\n )}\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {spec.type === 'waterfall' && <Toggle label=\"Total bar\" name=\"showTotal\" checked={spec.showTotal} onChange={(showTotal) => controller.update({ showTotal })} />}\n {hasLines && <Toggle label=\"Points\" name=\"points\" checked={spec.points} onChange={(points) => controller.update({ points })} />}\n <Toggle label=\"Data labels\" name=\"dataLabels\" checked={spec.dataLabels} onChange={(dataLabels) => controller.update({ dataLabels })} />\n </div>\n </div>\n )}\n\n {show('legend') && (\n <div className={chartSectionClass} data-section=\"legend\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-foreground\">Legend</h4>\n <Toggle label=\"Show\" name=\"legend.show\" checked={spec.legend.show} onChange={(v) => controller.setLegend({ show: v })} />\n </div>\n {spec.legend.show && (\n <div className=\"flex gap-0.5 rounded-md bg-muted p-0.5\">\n {CHART_LEGEND_POSITIONS.map((p) => (\n <button key={p} type=\"button\" aria-pressed={spec.legend.position === p} data-option={`legend.${p}`} className={chartSegmentClass(spec.legend.position === p)} onClick={() => controller.setLegend({ position: p })}>\n {cap(p)}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {show('axes') && hasAxes && (\n <>\n {family !== 'box' && family !== 'histogram' && <AxisSection controller={controller} axis=\"x\" value={spec.xAxis} idBase={idBase} horizontal={spec.orientation === 'horizontal'} numeric={family === 'xy'} scales={scales} />}\n <AxisSection controller={controller} axis=\"y\" value={spec.yAxis} idBase={idBase} horizontal={spec.orientation === 'horizontal'} scales={scales} />\n {usesSecondary && <AxisSection controller={controller} axis=\"y2\" value={spec.yAxis2} idBase={idBase} horizontal={spec.orientation === 'horizontal'} scales={scales} />}\n </>\n )}\n\n {show('series') && selectedSeries && (\n <div className={chartSectionClass} data-section=\"series\" data-series-id={selectedSeries.id}>\n <h4 className=\"text-xs font-semibold text-foreground\">Series</h4>\n <Field label=\"Name\" htmlFor={`${idBase}-series-name`}>\n <ChartCommitInput id={`${idBase}-series-name`} value={selectedSeries.name} data-option=\"series.name\" className={chartInputClass} onCommit={(name) => void controller.updateSeries(selectedSeries.id, { name })} />\n </Field>\n <Field label=\"Colour\" htmlFor={`${idBase}-series-color`}>\n <div className=\"flex items-center gap-1\">\n <input\n id={`${idBase}-series-color`}\n type=\"color\"\n value={chartColorInputValue(chartSeriesColor(spec, seriesIndex))}\n data-option=\"series.color\"\n className=\"h-7 w-9 shrink-0 cursor-pointer rounded border border-input bg-background p-0.5\"\n onPointerDown={() => controller.beginGesture(`color:${selectedSeries.id}`)}\n onBlur={() => controller.endGesture()}\n onChange={(e) => controller.updateSeries(selectedSeries.id, { color: e.currentTarget.value })}\n />\n {selectedSeries.color && (\n <button type=\"button\" className={chartButtonClass} data-action=\"reset-color\" onClick={() => controller.updateSeries(selectedSeries.id, { color: null })}>\n Palette\n </button>\n )}\n </div>\n </Field>\n {cartesian && (\n <Field label=\"Draw as\" htmlFor={`${idBase}-series-type`}>\n <select\n id={`${idBase}-series-type`}\n className={chartInputClass}\n value={selectedSeries.type ?? ''}\n data-option=\"series.type\"\n onChange={(e) => controller.updateSeries(selectedSeries.id, { type: (e.currentTarget.value || null) as any })}\n >\n <option value=\"\">Chart type</option>\n {CHART_SERIES_TYPES.map((t) => (\n <option key={t} value={t}>\n {CHART_TYPE_LABELS[t]}\n </option>\n ))}\n </select>\n </Field>\n )}\n {(cartesian || family === 'xy') && ['line', 'area', 'scatter'].includes(chartSeriesType(spec, selectedSeries)) && (\n <Field label=\"Marker\" htmlFor={`${idBase}-series-marker`}>\n <select\n id={`${idBase}-series-marker`}\n className={chartInputClass}\n value={selectedSeries.marker ?? ''}\n data-option=\"series.marker\"\n onChange={(e) => controller.updateSeries(selectedSeries.id, { marker: (e.currentTarget.value || null) as any })}\n >\n <option value=\"\">Default</option>\n {CHART_MARKERS.map((m) => (\n <option key={m} value={m}>\n {cap(m)}\n </option>\n ))}\n </select>\n </Field>\n )}\n {scales && <ErrorBarFields controller={controller} series={selectedSeries} which=\"errorBars\" idBase={idBase} />}\n {family === 'xy' && <ErrorBarFields controller={controller} series={selectedSeries} which=\"xErrorBars\" idBase={idBase} />}\n {chartSupportsTrendlines(spec.type, spec.stacking) && (\n <div className=\"space-y-1\" data-section=\"trendlines\">\n {(selectedSeries.trendlines ?? []).map((t, i) => (\n <div key={i} className=\"flex items-center gap-1\" data-trendline={i}>\n <span className=\"flex-1 truncate text-muted-foreground\">{chartTrendlineName(t, selectedSeries.name)}</span>\n <Toggle label=\"R²\" name={`trendline.${i}.showR2`} checked={!!t.showR2} onChange={(showR2) => controller.updateTrendline(selectedSeries.id, i, { showR2 })} />\n <button type=\"button\" className={chartButtonClass} aria-label=\"Delete trendline\" data-action=\"trendline-delete\" onClick={() => controller.removeTrendline(selectedSeries.id, i)}>\n ×\n </button>\n </div>\n ))}\n <select\n className={chartInputClass}\n value=\"\"\n aria-label=\"Add trendline\"\n data-option=\"trendline.add\"\n onChange={(e) => e.currentTarget.value && controller.addTrendline(selectedSeries.id, { type: e.currentTarget.value as any })}\n >\n <option value=\"\">Add trendline…</option>\n {CHART_TRENDLINE_TYPES.map((t) => (\n <option key={t} value={t}>\n {cap(t.replace('-', ' '))}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1\">\n <Toggle label=\"Hidden\" name=\"series.hidden\" checked={!!selectedSeries.hidden} onChange={(hidden) => controller.updateSeries(selectedSeries.id, { hidden })} />\n {family === 'cartesian' && <Toggle label=\"Secondary axis\" name=\"series.axis\" checked={selectedSeries.axis === 'secondary'} onChange={(secondary) => controller.updateSeries(selectedSeries.id, { axis: secondary ? 'secondary' : null })} />}\n <span className=\"flex-1\" />\n <button type=\"button\" className={chartButtonClass} disabled={seriesIndex <= 0} aria-label=\"Move series earlier\" data-action=\"series-up\" onClick={() => controller.moveSeries(selectedSeries.id, seriesIndex - 1)}>\n ↑\n </button>\n <button type=\"button\" className={chartButtonClass} disabled={seriesIndex >= spec.series.length - 1} aria-label=\"Move series later\" data-action=\"series-down\" onClick={() => controller.moveSeries(selectedSeries.id, seriesIndex + 1)}>\n ↓\n </button>\n <button type=\"button\" className={`${chartButtonClass} text-destructive`} data-action=\"series-delete\" onClick={() => controller.removeSeries(selectedSeries.id)}>\n Delete\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { describeChartSelection, downloadChartPng, type ChartController, type DownloadChartPngOptions } from '@pixerate/editor/chart';\nimport { ChartCanvas, type ChartCanvasProps } from './ChartCanvas';\nimport { ChartDataGrid } from './ChartDataGrid';\nimport { ChartInspector } from './ChartInspector';\nimport { useChartState } from './useChartEditor';\nimport { chartButtonClass } from './styles';\n\nexport interface ChartEditorProps {\n controller: ChartController;\n /** The settings sidebar (default `true`). */\n showInspector?: boolean;\n /** The data grid under the chart (default `true`). */\n showDataGrid?: boolean;\n /** Undo / redo, Download PNG and the selection readout (default `true`). */\n showToolbar?: boolean;\n /** Size, theme, scale and file name for the toolbar's Download PNG (default 800 × 450, light theme). */\n pngOptions?: DownloadChartPngOptions;\n /** Chart height in pixels (default 380). */\n height?: number;\n canvasProps?: Omit<ChartCanvasProps, 'controller' | 'height'>;\n className?: string;\n}\n\n/** Toolbar, chart, settings sidebar and data grid for a `ChartController`. */\nexport function ChartEditor({ controller, showInspector = true, showDataGrid = true, showToolbar = true, pngOptions, height = 380, canvasProps, className }: ChartEditorProps) {\n const state = useChartState(controller);\n const [pngError, setPngError] = useState<string | null>(null);\n const downloadPng = () => {\n setPngError(null);\n downloadChartPng(controller.toJSON(), pngOptions).catch((error: unknown) => setPngError(error instanceof Error ? error.message : String(error)));\n };\n return (\n <div className={`flex flex-col gap-2 ${className ?? ''}`} data-chart-editor=\"\">\n {showToolbar && (\n <div className=\"flex items-center gap-1\" data-chart-toolbar=\"\">\n <button type=\"button\" className={chartButtonClass} disabled={!state.canUndo} title={state.undoLabel ? `Undo ${state.undoLabel}` : 'Undo'} data-action=\"undo\" onClick={() => controller.undo()}>\n Undo\n </button>\n <button type=\"button\" className={chartButtonClass} disabled={!state.canRedo} title={state.redoLabel ? `Redo ${state.redoLabel}` : 'Redo'} data-action=\"redo\" onClick={() => controller.redo()}>\n Redo\n </button>\n <button type=\"button\" className={chartButtonClass} title=\"Download the chart as a PNG image\" data-action=\"download-png\" onClick={downloadPng}>\n Download PNG\n </button>\n <span className=\"ml-2 truncate text-xs text-muted-foreground\" data-chart-selection=\"\" aria-live=\"polite\">\n {describeChartSelection(controller, state.selection)}\n </span>\n </div>\n )}\n {pngError && (\n <p role=\"alert\" className=\"rounded-md border border-destructive/40 bg-destructive/10 px-2 py-1 text-xs text-destructive\" data-chart-png-error=\"\">\n {pngError}\n </p>\n )}\n {state.issues.length > 0 && (\n <p role=\"alert\" className=\"rounded-md border border-destructive/40 bg-destructive/10 px-2 py-1 text-xs text-destructive\" data-chart-issues=\"\">\n {state.issues.map((i) => i.message).join(' ')}\n </p>\n )}\n <div className=\"flex min-h-0 flex-col gap-2 md:flex-row\">\n <div className=\"min-w-0 flex-1 rounded-md border border-border bg-background p-1\">\n <ChartCanvas controller={controller} height={height} {...canvasProps} />\n </div>\n {showInspector && <ChartInspector controller={controller} className=\"w-full shrink-0 overflow-y-auto rounded-md border border-border p-3 md:w-64\" />}\n </div>\n {showDataGrid && <ChartDataGrid controller={controller} />}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n CSS_VARIABLE_CHART_THEME,\n ChartStream,\n blendChartScenes,\n easeChartTween,\n layoutChart,\n layoutSparkline,\n type ChartScene,\n type ChartSparklineOptions,\n type ChartStreamFormat,\n type ChartTheme,\n type ChartValue,\n} from '@pixerate/editor/chart';\nimport { ChartSceneSvg } from './ChartCanvas';\n\nexport interface ChartStreamingViewProps {\n /** Mermaid (xychart-beta, pie, radar-beta) or a JSON chart spec, as far as it has arrived. */\n source: string;\n /** Nothing more will arrive: the final chart is drawn at once and problems are reported. */\n complete?: boolean;\n format?: ChartStreamFormat;\n width?: number;\n height?: number;\n theme?: Partial<ChartTheme>;\n /** How often a new layout is adopted while streaming (ms, default 300). */\n adoptInterval?: number;\n /** Tween length between layouts (ms, default 450; 0 to switch at once). */\n tween?: number;\n /** Shown before anything can be drawn. */\n placeholder?: React.ReactNode;\n /** Called with the parse problems once `complete`. */\n onIssues?: (issues: { message: string; line?: number }[]) => void;\n className?: string;\n}\n\n/**\n * Draws a chart whose source is still arriving (e.g. from a model): series appear as their\n * values come in, the value axis only grows so it does not jump, and each new layout tweens\n * from the last. Read-only; load the final spec into a `ChartController` to edit it.\n */\nexport function ChartStreamingView({ source, complete = false, format = 'auto', width = 640, height = 360, theme, adoptInterval = 300, tween = 450, placeholder, onIssues, className }: ChartStreamingViewProps) {\n const stream = useMemo(() => new ChartStream(format), [format]);\n const fullTheme = useMemo(() => ({ ...CSS_VARIABLE_CHART_THEME, ...theme }), [theme]);\n const [scene, setScene] = useState<ChartScene | null>(null);\n const shown = useRef<ChartScene | null>(null);\n const lastAdopt = useRef(0);\n const frame = useRef<number | null>(null);\n const pending = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const adopt = () => {\n const read = stream.update(source, complete);\n if (complete && onIssues) onIssues(read.issues);\n if (!read.spec) return;\n const next = layoutChart(read.spec, { width, height, theme: fullTheme, valueDomain: read.valueDomain });\n const from = shown.current;\n lastAdopt.current = Date.now();\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n if (!from || tween <= 0 || typeof requestAnimationFrame === 'undefined') {\n shown.current = next;\n setScene(next);\n return;\n }\n const start = performance.now();\n const step = () => {\n const t = easeChartTween((performance.now() - start) / tween);\n const s = blendChartScenes(from, next, t);\n shown.current = s;\n setScene(s);\n frame.current = t < 1 ? requestAnimationFrame(step) : null;\n };\n frame.current = requestAnimationFrame(step);\n };\n if (pending.current) clearTimeout(pending.current);\n const wait = complete ? 0 : Math.max(0, adoptInterval - (Date.now() - lastAdopt.current));\n if (wait === 0) adopt();\n else pending.current = setTimeout(adopt, wait);\n return () => {\n if (pending.current) clearTimeout(pending.current);\n };\n }, [source, complete, stream, width, height, fullTheme, adoptInterval, tween, onIssues]);\n\n useEffect(() => () => {\n if (frame.current !== null) cancelAnimationFrame(frame.current);\n }, []);\n\n return (\n <div className={className} data-chart-streaming={complete ? 'complete' : 'streaming'} aria-busy={!complete}>\n {scene ? <ChartSceneSvg scene={scene} label={complete ? undefined : 'Chart loading'} /> : (placeholder ?? <div style={{ height }} className=\"flex items-center justify-center text-xs text-muted-foreground\">Drawing chart…</div>)}\n </div>\n );\n}\n\nexport interface ChartSparklineProps extends Omit<ChartSparklineOptions, 'width' | 'height'> {\n values: readonly ChartValue[];\n width?: number;\n height?: number;\n /** Accessible label (default: first and last value). */\n label?: string;\n className?: string;\n}\n\n/** A word-sized chart: line, column or win/loss. */\nexport function ChartSparkline({ values, width = 80, height = 20, label, className, ...options }: ChartSparklineProps) {\n const scene = useMemo(() => layoutSparkline(values, { ...options, width, height }), [values, width, height, options.kind, options.color, options.negativeColor, options.markers, options.highLow, options.min, options.max]);\n const present = values.filter((v): v is number => v !== null);\n return <ChartSceneSvg scene={scene} label={label ?? (present.length ? `Trend from ${present[0]} to ${present[present.length - 1]}` : 'No data')} className={`inline-block align-middle ${className ?? ''}`} />;\n}\n"],"mappings":"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","names":["import_react","import_chart","import_react","import_chart","import_jsx_runtime","import_react","import_chart","import_jsx_runtime","key","cap","import_react","import_chart","import_jsx_runtime","import_react","import_chart","import_jsx_runtime"]}
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import React__default from 'react';
3
3
  import { ToolRegistry } from '@pixerate/editor/tools';
4
- import { ChartToolProviderOptions, ChartController, ChartState, ChartSelection, ChartSpecPatch, ChartActionResult, ChartType, ChartCommandOptions, ChartControllerOptions, ChartScene, ChartPresence, ChartDirector, ChartTheme, ChartTextMeasure, ChartMark, DownloadChartPngOptions, ChartSparklineOptions, ChartValue, ChartStreamFormat } from '@pixerate/editor/chart';
4
+ import { ChartToolProviderOptions, ChartController, ChartState, ChartSelection, ChartSpecPatch, ChartActionResult, ChartType, ChartCommandOptions, ChartControllerOptions, ChartScene, ChartPresence, ChartDirector, OfficeChartToolProviderOptions, ChartTheme, ChartTextMeasure, ChartMark, DownloadChartPngOptions, ChartSparklineOptions, ChartValue, ChartStreamFormat } from '@pixerate/editor/chart';
5
5
 
6
6
  /** A `ChartController` created once for the component's lifetime. */
7
7
  declare function useChartController(options?: ChartControllerOptions): ChartController;
@@ -43,6 +43,12 @@ type ChartToolProviderHookOptions = Omit<ChartToolProviderOptions, 'rasterize'>
43
43
  * `render_chart { format: "png" }` works out of the box (`createChartRasterizer`).
44
44
  */
45
45
  declare function useChartToolProvider(registry: ToolRegistry | null | undefined, controller: ChartController, options?: ChartToolProviderHookOptions): void;
46
+ /**
47
+ * Registers the Office-file chart tools (`createOfficeChartToolProvider`: `list_file_charts`,
48
+ * `get_file_chart`, and `load_file_chart` with a `controller`) while mounted. `files` and
49
+ * `readOnly` are read on every call, so they can change without re-registering.
50
+ */
51
+ declare function useOfficeChartToolProvider(registry: ToolRegistry | null | undefined, options?: OfficeChartToolProviderOptions): void;
46
52
  /**
47
53
  * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to
48
54
  * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a
@@ -203,4 +209,4 @@ interface ChartSparklineProps extends Omit<ChartSparklineOptions, 'width' | 'hei
203
209
  /** A word-sized chart: line, column or win/loss. */
204
210
  declare function ChartSparkline({ values, width, height, label, className, ...options }: ChartSparklineProps): React__default.JSX.Element;
205
211
 
206
- export { ChartCanvas, type ChartCanvasProps, type ChartCommandTarget, ChartCommitInput, ChartDataGrid, type ChartDataGridProps, ChartEditor, type ChartEditorProps, ChartInspector, type ChartInspectorProps, type ChartInspectorSection, ChartPresenceLayer, ChartSceneSvg, ChartSparkline, type ChartSparklineProps, ChartStreamingView, type ChartStreamingViewProps, type ChartToolProviderHookOptions, type UseChartEditorResult, chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass, renderChartMark, useChartCommands, useChartController, useChartDirector, useChartEditor, useChartState, useChartToolProvider };
212
+ export { ChartCanvas, type ChartCanvasProps, type ChartCommandTarget, ChartCommitInput, ChartDataGrid, type ChartDataGridProps, ChartEditor, type ChartEditorProps, ChartInspector, type ChartInspectorProps, type ChartInspectorSection, ChartPresenceLayer, ChartSceneSvg, ChartSparkline, type ChartSparklineProps, ChartStreamingView, type ChartStreamingViewProps, type ChartToolProviderHookOptions, type UseChartEditorResult, chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass, renderChartMark, useChartCommands, useChartController, useChartDirector, useChartEditor, useChartState, useChartToolProvider, useOfficeChartToolProvider };
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import React__default from 'react';
3
3
  import { ToolRegistry } from '@pixerate/editor/tools';
4
- import { ChartToolProviderOptions, ChartController, ChartState, ChartSelection, ChartSpecPatch, ChartActionResult, ChartType, ChartCommandOptions, ChartControllerOptions, ChartScene, ChartPresence, ChartDirector, ChartTheme, ChartTextMeasure, ChartMark, DownloadChartPngOptions, ChartSparklineOptions, ChartValue, ChartStreamFormat } from '@pixerate/editor/chart';
4
+ import { ChartToolProviderOptions, ChartController, ChartState, ChartSelection, ChartSpecPatch, ChartActionResult, ChartType, ChartCommandOptions, ChartControllerOptions, ChartScene, ChartPresence, ChartDirector, OfficeChartToolProviderOptions, ChartTheme, ChartTextMeasure, ChartMark, DownloadChartPngOptions, ChartSparklineOptions, ChartValue, ChartStreamFormat } from '@pixerate/editor/chart';
5
5
 
6
6
  /** A `ChartController` created once for the component's lifetime. */
7
7
  declare function useChartController(options?: ChartControllerOptions): ChartController;
@@ -43,6 +43,12 @@ type ChartToolProviderHookOptions = Omit<ChartToolProviderOptions, 'rasterize'>
43
43
  * `render_chart { format: "png" }` works out of the box (`createChartRasterizer`).
44
44
  */
45
45
  declare function useChartToolProvider(registry: ToolRegistry | null | undefined, controller: ChartController, options?: ChartToolProviderHookOptions): void;
46
+ /**
47
+ * Registers the Office-file chart tools (`createOfficeChartToolProvider`: `list_file_charts`,
48
+ * `get_file_chart`, and `load_file_chart` with a `controller`) while mounted. `files` and
49
+ * `readOnly` are read on every call, so they can change without re-registering.
50
+ */
51
+ declare function useOfficeChartToolProvider(registry: ToolRegistry | null | undefined, options?: OfficeChartToolProviderOptions): void;
46
52
  /**
47
53
  * A `ChartPresence` and `ChartDirector` for a chart: pass `presence` and `sceneRef` to
48
54
  * `ChartCanvas`, and `director` to `useChartToolProvider` so agent edits are acted out with a
@@ -203,4 +209,4 @@ interface ChartSparklineProps extends Omit<ChartSparklineOptions, 'width' | 'hei
203
209
  /** A word-sized chart: line, column or win/loss. */
204
210
  declare function ChartSparkline({ values, width, height, label, className, ...options }: ChartSparklineProps): React__default.JSX.Element;
205
211
 
206
- export { ChartCanvas, type ChartCanvasProps, type ChartCommandTarget, ChartCommitInput, ChartDataGrid, type ChartDataGridProps, ChartEditor, type ChartEditorProps, ChartInspector, type ChartInspectorProps, type ChartInspectorSection, ChartPresenceLayer, ChartSceneSvg, ChartSparkline, type ChartSparklineProps, ChartStreamingView, type ChartStreamingViewProps, type ChartToolProviderHookOptions, type UseChartEditorResult, chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass, renderChartMark, useChartCommands, useChartController, useChartDirector, useChartEditor, useChartState, useChartToolProvider };
212
+ export { ChartCanvas, type ChartCanvasProps, type ChartCommandTarget, ChartCommitInput, ChartDataGrid, type ChartDataGridProps, ChartEditor, type ChartEditorProps, ChartInspector, type ChartInspectorProps, type ChartInspectorSection, ChartPresenceLayer, ChartSceneSvg, ChartSparkline, type ChartSparklineProps, ChartStreamingView, type ChartStreamingViewProps, type ChartToolProviderHookOptions, type UseChartEditorResult, chartButtonClass, chartCellClass, chartIconButtonClass, chartInputClass, chartLabelClass, chartSectionClass, chartSegmentClass, renderChartMark, useChartCommands, useChartController, useChartDirector, useChartEditor, useChartState, useChartToolProvider, useOfficeChartToolProvider };
@@ -18,8 +18,9 @@ import {
18
18
  useChartDirector,
19
19
  useChartEditor,
20
20
  useChartState,
21
- useChartToolProvider
22
- } from "../chunk-IH5ZIOK3.js";
21
+ useChartToolProvider,
22
+ useOfficeChartToolProvider
23
+ } from "../chunk-SIEOYRHX.js";
23
24
 
24
25
  // src/chart/ChartEditor.tsx
25
26
  import { useState } from "react";
@@ -133,6 +134,7 @@ export {
133
134
  useChartDirector,
134
135
  useChartEditor,
135
136
  useChartState,
136
- useChartToolProvider
137
+ useChartToolProvider,
138
+ useOfficeChartToolProvider
137
139
  };
138
140
  //# sourceMappingURL=index.js.map