@pixerate/editor 0.55.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +18 -17
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.js +3 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/canvas/index.cjs +2105 -172
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +319 -23
- package/dist/canvas/index.d.ts +319 -23
- package/dist/canvas/index.js +2081 -148
- package/dist/canvas/index.js.map +1 -1
- package/dist/chart/index.cjs +32 -30
- package/dist/chart/index.cjs.map +1 -1
- package/dist/chart/index.d.cts +4 -2
- package/dist/chart/index.d.ts +4 -2
- package/dist/chart/index.js +20 -18
- package/dist/chart/index.js.map +1 -1
- package/dist/{chunk-C3JHII3M.cjs → chunk-3I6V7PI4.cjs} +45 -45
- package/dist/{chunk-C3JHII3M.cjs.map → chunk-3I6V7PI4.cjs.map} +1 -1
- package/dist/{chunk-P43HUQRX.cjs → chunk-AHCENCU4.cjs} +12 -10
- package/dist/chunk-AHCENCU4.cjs.map +1 -0
- package/dist/chunk-II77MLHN.cjs +11106 -0
- package/dist/chunk-II77MLHN.cjs.map +1 -0
- package/dist/{chunk-OIKYP7XC.js → chunk-LMUDHBWR.js} +2 -2
- package/dist/{chunk-VODBAO32.js → chunk-OEFCLWZ3.js} +4 -1425
- package/dist/chunk-OEFCLWZ3.js.map +1 -0
- package/dist/{chunk-NK3WL5TJ.cjs → chunk-P2CTDJNF.cjs} +27 -1448
- package/dist/chunk-P2CTDJNF.cjs.map +1 -0
- package/dist/chunk-TKPPIVW7.cjs +1443 -0
- package/dist/chunk-TKPPIVW7.cjs.map +1 -0
- package/dist/chunk-WJSCGBJ2.js +11106 -0
- package/dist/chunk-WJSCGBJ2.js.map +1 -0
- package/dist/{chunk-RIXTW3C4.js → chunk-WLVZ235X.js} +5 -3
- package/dist/{chunk-RIXTW3C4.js.map → chunk-WLVZ235X.js.map} +1 -1
- package/dist/chunk-ZOH6X3VR.js +1443 -0
- package/dist/chunk-ZOH6X3VR.js.map +1 -0
- package/dist/{controller-DscWQbjO.d.ts → controller-D2rj5umx.d.ts} +2 -362
- package/dist/{controller-CX0QfSv0.d.cts → controller-R2biKk_E.d.cts} +2 -362
- package/dist/diagram/index.cjs +1457 -47
- package/dist/diagram/index.cjs.map +1 -1
- package/dist/diagram/index.d.cts +1734 -15
- package/dist/diagram/index.d.ts +1734 -15
- package/dist/diagram/index.js +1436 -26
- package/dist/diagram/index.js.map +1 -1
- package/dist/extensions/index.cjs +5 -4
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +4 -3
- package/dist/extensions/index.d.ts +4 -3
- package/dist/extensions/index.js +4 -3
- package/dist/{index-DIWB6xMf.d.cts → index-BcHyG0Wq.d.cts} +2 -1
- package/dist/{index-CALDD35B.d.ts → index-CTCc3m3C.d.ts} +2 -1
- package/dist/index.cjs +10 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/types-BRp-6zkY.d.cts +362 -0
- package/dist/types-BRp-6zkY.d.ts +362 -0
- package/dist/{types-BULrFyuQ.d.cts → types-DYkjhzdz.d.cts} +1 -1
- package/dist/{types-BULrFyuQ.d.ts → types-DYkjhzdz.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-H5K77C7Y.cjs +0 -3848
- package/dist/chunk-H5K77C7Y.cjs.map +0 -1
- package/dist/chunk-NK3WL5TJ.cjs.map +0 -1
- package/dist/chunk-P43HUQRX.cjs.map +0 -1
- package/dist/chunk-VODBAO32.js.map +0 -1
- package/dist/chunk-WWJNC7SX.js +0 -3848
- package/dist/chunk-WWJNC7SX.js.map +0 -1
- /package/dist/{chunk-OIKYP7XC.js.map → chunk-LMUDHBWR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chart/mermaid.ts","../src/chart/summary.ts","../src/chart/svg.ts","../src/chart/presets.ts","../src/chart/controller.ts","../src/chart/sparkline.ts"],"sourcesContent":["// The xychart-beta, pie and radar-beta grammars follow Ursula's statement adapters (src/xychart, src/pie,\n// src/radar), and the metadata comment follows its `%% @ursula` line (src/source/metadata.ts).\nimport { chartFamily, defaultChartAxis, normalizeChartSpec } from './spec.js';\nimport type { ChartAxis, ChartIssue, ChartSeries, ChartSpec, ChartValue } from './types.js';\n\n/** The comment line that carries what Mermaid cannot express. Every Mermaid tool ignores `%%` comments. */\nexport const CHART_MERMAID_META_PREFIX = '%% @pixerate ';\n\nexport type ChartMermaidFamily = 'xychart' | 'pie' | 'radar';\n\nexport interface ChartMermaidOptions {\n\t/** Write the `%% @pixerate {…}` line so the chart round-trips exactly (default `true`). */\n\tmeta?: boolean;\n\t/** Indentation of statements (default four spaces). */\n\tindent?: string;\n}\n\nconst quote = (text: string) => `\"${text.replace(/\"/g, '#quot;')}\"`;\nconst unquote = (text: string) => {\n\tconst t = text.trim();\n\treturn (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"') ? t.slice(1, -1) : t).replace(/#quot;/g, '\"');\n};\nconst word = (text: string) => (/^[A-Za-z0-9_]+$/.test(text) ? text : quote(text));\nconst num = (value: number) => (Number.isInteger(value) ? String(value) : String(Number(value.toPrecision(10))));\n\n/** Splits on `sep` outside quotes and brackets. */\nfunction splitOutside(text: string, sep: string): string[] {\n\tconst out: string[] = [];\n\tlet cur = '';\n\tlet quoted = false;\n\tlet depth = 0;\n\tfor (const ch of text) {\n\t\tif (ch === '\"') quoted = !quoted;\n\t\telse if (!quoted && (ch === '[' || ch === '{')) depth++;\n\t\telse if (!quoted && (ch === ']' || ch === '}')) depth--;\n\t\tif (ch === sep && !quoted && depth === 0) {\n\t\t\tout.push(cur);\n\t\t\tcur = '';\n\t\t} else cur += ch;\n\t}\n\tout.push(cur);\n\treturn out;\n}\n\n/** The Mermaid family a chart is written as. */\nexport function chartMermaidFamily(spec: Pick<ChartSpec, 'type' | 'series'>): ChartMermaidFamily {\n\tconst family = chartFamily(spec);\n\tif (family === 'pie' || family === 'funnel' || family === 'treemap') return 'pie';\n\tif (family === 'radar') return 'radar';\n\treturn 'xychart';\n}\n\nfunction slug(label: string, i: number, taken: Set<string>): string {\n\tlet base = label.normalize('NFKD').replace(/[^\\w-]+/g, '_').replace(/^_+|_+$/g, '') || `a${i + 1}`;\n\tif (!/^[A-Za-z_]/.test(base)) base = `a_${base}`;\n\tlet id = base;\n\tfor (let k = 2; taken.has(id); k++) id = `${base}_${k}`;\n\ttaken.add(id);\n\treturn id;\n}\n\n/** Fields that differ from what the Mermaid text alone would give, for the metadata line. */\nfunction metaFor(spec: ChartSpec, text: string): Record<string, unknown> | null {\n\tconst base = chartFromMermaid(text, { ignoreMeta: true }).spec;\n\tconst meta: Record<string, unknown> = {};\n\tconst same = (a: unknown, b: unknown) => JSON.stringify(a) === JSON.stringify(b);\n\tfor (const key of Object.keys(spec) as (keyof ChartSpec)[]) {\n\t\tif (key === 'series' || key === 'version') continue;\n\t\tif (!same(spec[key], base[key])) meta[key] = spec[key];\n\t}\n\tconst series = spec.series.map((s, i) => {\n\t\tconst b = base.series[i];\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [k, v] of Object.entries(s)) {\n\t\t\tif (k === 'values') {\n\t\t\t\t// Gaps are written as 0 in Mermaid; record where they are, and exact values that rounded.\n\t\t\t\tif (b && !same(v, b.values)) out.values = v;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!b || !same(v, (b as unknown as Record<string, unknown>)[k])) out[k] = v;\n\t\t}\n\t\treturn out;\n\t});\n\tif (series.some((s) => Object.keys(s).length) || spec.series.length !== base.series.length) meta.series = series;\n\treturn Object.keys(meta).length ? meta : null;\n}\n\n/**\n * Writes a chart as Mermaid: `xychart-beta` for bar, line, area and scatter charts (areas and\n * scatters drawn as lines), `pie` for pies, donuts, funnels and treemaps, `radar-beta` for\n * radars. Anything Mermaid cannot hold (stacking, colours, formats, gaps, trendlines, other\n * chart types) goes into one `%% @pixerate {…}` comment so `chartFromMermaid` gets the chart\n * back exactly, while any Mermaid renderer still draws the basic chart.\n */\nexport function chartToMermaid(spec: ChartSpec, options: ChartMermaidOptions = {}): string {\n\tconst ind = options.indent ?? ' ';\n\tconst family = chartMermaidFamily(spec);\n\tconst visible = spec.series.filter((s) => !s.hidden);\n\tconst lines: string[] = [];\n\tconst v = (x: ChartValue) => (x === null || !Number.isFinite(x) ? '0' : num(x));\n\tif (family === 'pie') {\n\t\tconst s = visible[0] ?? spec.series[0];\n\t\tlines.push(`pie${spec.dataLabels ? ' showData' : ''}`);\n\t\tif (spec.title) lines.push(`${ind}title ${spec.title}`);\n\t\tspec.categories.forEach((c, i) => {\n\t\t\tconst value = s?.values[i];\n\t\t\tif (value !== null && value !== undefined && Number.isFinite(value) && value > 0) lines.push(`${ind}${quote(c)} : ${num(value)}`);\n\t\t});\n\t} else if (family === 'radar') {\n\t\tlines.push('radar-beta');\n\t\tif (spec.title) lines.push(`${ind}title ${spec.title}`);\n\t\tconst taken = new Set<string>();\n\t\tconst ids = spec.categories.map((c, i) => slug(c, i, taken));\n\t\tlines.push(`${ind}axis ${ids.map((id, i) => (id === spec.categories[i] ? id : `${id}[\"${spec.categories[i].replace(/\"/g, \"'\")}\"]`)).join(', ')}`);\n\t\tconst seriesTaken = new Set<string>(ids);\n\t\tfor (const [i, s] of spec.series.entries()) {\n\t\t\tconst id = slug(s.id, i, seriesTaken);\n\t\t\tlines.push(`${ind}curve ${id}[\"${s.name.replace(/\"/g, \"'\")}\"]{${s.values.map(v).join(', ')}}`);\n\t\t}\n\t\tif (spec.yAxis.max !== null) lines.push(`${ind}max ${num(spec.yAxis.max)}`);\n\t\tif (spec.yAxis.min !== null) lines.push(`${ind}min ${num(spec.yAxis.min)}`);\n\t\tif (!spec.legend.show) lines.push(`${ind}showLegend false`);\n\t} else {\n\t\tlines.push(`xychart-beta${spec.orientation === 'horizontal' ? ' horizontal' : ''}`);\n\t\tif (spec.title) lines.push(`${ind}title ${quote(spec.title)}`);\n\t\tconst xTitle = spec.xAxis.title ? ` ${quote(spec.xAxis.title)}` : '';\n\t\tlines.push(`${ind}x-axis${xTitle} [${spec.categories.map(word).join(', ')}]`);\n\t\tconst y = spec.yAxis;\n\t\tif (y.title || y.min !== null || y.max !== null) {\n\t\t\tlet out = `${ind}y-axis`;\n\t\t\tif (y.title) out += ` ${quote(y.title)}`;\n\t\t\tif (y.min !== null || y.max !== null) {\n\t\t\t\t// Mermaid wants both ends; the missing one comes from the data.\n\t\t\t\tconst all = spec.series.flatMap((s) => s.values).filter((x): x is number => x !== null && Number.isFinite(x));\n\t\t\t\tconst lo = y.min ?? Math.min(0, ...all);\n\t\t\t\tconst hi = y.max ?? Math.max(lo + 1, ...all);\n\t\t\t\tout += ` ${num(lo)} --> ${num(hi)}`;\n\t\t\t}\n\t\t\tlines.push(out);\n\t\t}\n\t\tfor (const s of spec.series) {\n\t\t\tconst kind = (s.type ?? (spec.type === 'bar' ? 'bar' : 'line')) === 'bar' ? 'bar' : 'line';\n\t\t\tlines.push(`${ind}${kind} ${quote(s.name)} [${s.values.map(v).join(', ')}]`);\n\t\t}\n\t}\n\tlet text = `${lines.join('\\n')}\\n`;\n\tif (options.meta !== false) {\n\t\tconst meta = metaFor(spec, text);\n\t\tif (meta) {\n\t\t\tconst [header, ...rest] = lines;\n\t\t\ttext = `${[header, `${CHART_MERMAID_META_PREFIX}${JSON.stringify({ v: 1, ...meta })}`, ...rest].join('\\n')}\\n`;\n\t\t}\n\t}\n\treturn text;\n}\n\nexport interface ChartMermaidParseOptions {\n\t/** Accept a statement that is still being written (an unclosed `[` list): for streaming views. */\n\tpartial?: boolean;\n\t/** Ignore the `%% @pixerate` line (what the Mermaid text alone says). */\n\tignoreMeta?: boolean;\n}\n\nexport interface ChartMermaidResult {\n\tspec: ChartSpec;\n\t/** Problems, with 1-based `line` numbers. Lines that could not be read are listed and skipped. */\n\tissues: ChartIssue[];\n\tfamily: ChartMermaidFamily | null;\n\t/** The `%% @pixerate` line was found and applied. */\n\thasMeta: boolean;\n}\n\nconst RANGE = /^(-?\\d+(?:\\.\\d+)?)\\s*-->\\s*(-?\\d+(?:\\.\\d+)?)$/;\n\nfunction takeTitle(text: string): { title?: string; rest: string } {\n\tconst t = text.trim();\n\tif (t.startsWith('\"')) {\n\t\tconst end = t.indexOf('\"', 1);\n\t\tif (end > 0) return { title: unquote(t.slice(0, end + 1)), rest: t.slice(end + 1).trim() };\n\t}\n\tif (!t || t.startsWith('[') || RANGE.test(t) || /^-?\\d/.test(t)) return { rest: t };\n\tconst m = /^(\\S+)\\s*(.*)$/.exec(t)!;\n\treturn { title: m[1], rest: m[2].trim() };\n}\n\nfunction parseList(text: string, partial: boolean): string[] | undefined {\n\tconst t = text.trim();\n\tlet m = /^\\[(.*)\\]$/s.exec(t);\n\tif (!m && partial) m = /^\\[(.*)$/s.exec(t);\n\tif (!m) return undefined;\n\tif (!m[1].trim()) return [];\n\tconst items = splitOutside(m[1], ',').map((x) => x.trim());\n\t// A partial list may end mid-item: drop an empty or unfinished last entry.\n\tif (partial && !/\\]$/.test(t)) {\n\t\tconst last = items[items.length - 1];\n\t\tif (!last || (last.startsWith('\"') && !/\"$/.test(last.slice(1)))) items.pop();\n\t}\n\treturn items.map(unquote);\n}\n\n/**\n * Reads Mermaid `xychart-beta`, `pie` or `radar-beta` text as a chart. Never throws: lines it\n * cannot read are reported with their line numbers and skipped, and the result always draws.\n * A `%% @pixerate {…}` line written by `chartToMermaid` restores everything Mermaid cannot hold.\n */\nexport function chartFromMermaid(text: string, options: ChartMermaidParseOptions = {}): ChartMermaidResult {\n\tconst issues: ChartIssue[] = [];\n\tconst partial = !!options.partial;\n\tconst all = text.replace(/^/, '').split(/\\r?\\n/);\n\tlet start = 0;\n\tlet frontTitle: string | undefined;\n\t// Frontmatter (--- … ---) may carry a title.\n\tif (all[0]?.trim() === '---') {\n\t\tconst end = all.findIndex((l, i) => i > 0 && l.trim() === '---');\n\t\tif (end > 0) {\n\t\t\tfor (const l of all.slice(1, end)) {\n\t\t\t\tconst m = /^title:\\s*(.+)$/.exec(l.trim());\n\t\t\t\tif (m) frontTitle = unquote(m[1]);\n\t\t\t}\n\t\t\tstart = end + 1;\n\t\t}\n\t}\n\tlet family: ChartMermaidFamily | null = null;\n\tlet headerLine = -1;\n\tlet horizontal = false;\n\tlet showData = false;\n\tlet meta: Record<string, unknown> | null = null;\n\tfor (let i = start; i < all.length; i++) {\n\t\tconst t = all[i].trim();\n\t\tif (!t || t.startsWith('%%')) continue;\n\t\tlet m: RegExpExecArray | null;\n\t\tif ((m = /^xychart(?:-beta)?(?:\\s+(horizontal|vertical))?\\s*$/i.exec(t))) {\n\t\t\tfamily = 'xychart';\n\t\t\thorizontal = m[1]?.toLowerCase() === 'horizontal';\n\t\t} else if ((m = /^pie(\\s+showData)?(?:\\s+title\\s+(.*))?\\s*$/i.exec(t))) {\n\t\t\tfamily = 'pie';\n\t\t\tshowData = !!m[1];\n\t\t\tif (m[2]) frontTitle = m[2].trim();\n\t\t} else if (/^radar(?:-beta)?\\s*$/i.test(t)) family = 'radar';\n\t\telse issues.push({ path: 'header', line: i + 1, message: `Line ${i + 1}: expected a chart header (xychart-beta, pie or radar-beta), got \"${t.slice(0, 40)}\".` });\n\t\theaderLine = i;\n\t\tbreak;\n\t}\n\tlet title = frontTitle ?? '';\n\tconst categories: string[] = [];\n\tconst series: ChartSeries[] = [];\n\tconst xAxis: ChartAxis = defaultChartAxis(false);\n\tconst yAxis: ChartAxis = defaultChartAxis(true);\n\tconst radarAxes: { id: string; label: string }[] = [];\n\tconst pieSlices: { label: string; value: number }[] = [];\n\tlet legendShow = true;\n\tconst counts = { bar: 0, line: 0 };\n\tconst lineIssue = (i: number, message: string) => issues.push({ path: `line ${i + 1}`, line: i + 1, message: `Line ${i + 1}: ${message}` });\n\tfor (let i = headerLine + 1; family && i < all.length; i++) {\n\t\tconst raw = all[i];\n\t\tconst t = raw.trim();\n\t\tif (!t) continue;\n\t\tif (t.startsWith(CHART_MERMAID_META_PREFIX.trim())) {\n\t\t\tif (options.ignoreMeta) continue;\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(t.slice(CHART_MERMAID_META_PREFIX.trim().length).trim());\n\t\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) meta = parsed;\n\t\t\t\telse lineIssue(i, 'the @pixerate metadata is not a JSON object; it was ignored.');\n\t\t\t} catch {\n\t\t\t\tif (!partial) lineIssue(i, 'the @pixerate metadata is not valid JSON; it was ignored.');\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (t.startsWith('%%')) continue;\n\t\tconst isLast = i === all.length - 1 || all.slice(i + 1).every((l) => !l.trim());\n\t\tlet m: RegExpExecArray | null;\n\t\tif ((m = /^title\\s+(.+)$/i.exec(t))) {\n\t\t\ttitle = unquote(m[1]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (family === 'xychart') {\n\t\t\tif ((m = /^x-axis\\b(.*)$/i.exec(t))) {\n\t\t\t\tconst { title: xt, rest } = takeTitle(m[1]);\n\t\t\t\tif (xt) xAxis.title = xt;\n\t\t\t\tconst list = parseList(rest, partial && isLast);\n\t\t\t\tif (list) categories.splice(0, categories.length, ...list);\n\t\t\t\telse if (RANGE.test(rest)) {\n\t\t\t\t\tconst r = RANGE.exec(rest)!;\n\t\t\t\t\txAxis.min = Number(r[1]);\n\t\t\t\t\txAxis.max = Number(r[2]);\n\t\t\t\t} else if (rest) lineIssue(i, `expected x-axis [a, b, …] or a range \"min --> max\", got \"${rest.slice(0, 40)}\".`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((m = /^y-axis\\b(.*)$/i.exec(t))) {\n\t\t\t\tconst { title: yt, rest } = takeTitle(m[1]);\n\t\t\t\tif (yt) yAxis.title = yt;\n\t\t\t\tconst r = RANGE.exec(rest);\n\t\t\t\tif (r) {\n\t\t\t\t\tyAxis.min = Number(r[1]);\n\t\t\t\t\tyAxis.max = Number(r[2]);\n\t\t\t\t} else if (rest) lineIssue(i, `expected y-axis \"min --> max\", got \"${rest.slice(0, 40)}\".`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((m = /^(bar|line)\\b(.*)$/i.exec(t))) {\n\t\t\t\tconst kind = m[1].toLowerCase() as 'bar' | 'line';\n\t\t\t\tconst { title: st, rest } = takeTitle(m[2]);\n\t\t\t\tconst list = parseList(rest, partial && isLast);\n\t\t\t\tif (!list) {\n\t\t\t\t\tif (!(partial && isLast)) lineIssue(i, `expected ${kind} [1, 2, 3], got \"${rest.slice(0, 40)}\".`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst values = list.map((x) => (x.trim() === '' ? null : Number(x)));\n\t\t\t\tif (values.some((x) => x !== null && !Number.isFinite(x))) {\n\t\t\t\t\tlineIssue(i, `${kind} values must be numbers.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcounts[kind]++;\n\t\t\t\tseries.push({ id: `series-${series.length + 1}`, name: st ?? `${kind === 'bar' ? 'Bar' : 'Line'} ${counts[kind]}`, values: values as ChartValue[], type: kind });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (family === 'pie') {\n\t\t\tif ((m = /^\"((?:[^\"\\\\]|\\\\.)*)\"\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/.exec(t))) {\n\t\t\t\tpieSlices.push({ label: m[1].replace(/#quot;/g, '\"'), value: Number(m[2]) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (/^showData\\s*$/i.test(t)) {\n\t\t\t\tshowData = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (family === 'radar') {\n\t\t\tif ((m = /^axis\\s+(.+)$/.exec(t))) {\n\t\t\t\tfor (const part of splitOutside(m[1], ',')) {\n\t\t\t\t\tconst a = /^([A-Za-z_][\\w-]*)\\s*(?:\\[\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\])?$/.exec(part.trim());\n\t\t\t\t\tif (a) radarAxes.push({ id: a[1], label: a[2] ?? a[1] });\n\t\t\t\t\telse lineIssue(i, `could not read the axis \"${part.trim()}\".`);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((m = /^curve\\s+([A-Za-z_][\\w-]*)\\s*(?:\\[\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\])?\\s*\\{(.*)\\}?\\s*$/.exec(t))) {\n\t\t\t\tconst body = m[3].replace(/\\}\\s*$/, '');\n\t\t\t\tconst entries = body.trim() ? splitOutside(body, ',').map((x) => x.trim()).filter(Boolean) : [];\n\t\t\t\tconst ids = radarAxes.map((a) => a.id);\n\t\t\t\tconst values: ChartValue[] = ids.map(() => null);\n\t\t\t\tlet k = 0;\n\t\t\t\tfor (const e of entries) {\n\t\t\t\t\tconst keyed = /^([A-Za-z_][\\w-]*)\\s*:\\s*(-?\\d+(?:\\.\\d+)?)$/.exec(e);\n\t\t\t\t\tif (keyed) {\n\t\t\t\t\t\tconst at = ids.indexOf(keyed[1]);\n\t\t\t\t\t\tif (at >= 0) values[at] = Number(keyed[2]);\n\t\t\t\t\t\telse lineIssue(i, `curve ${m[1]} names an unknown axis \"${keyed[1]}\".`);\n\t\t\t\t\t} else if (/^-?\\d+(?:\\.\\d+)?$/.test(e)) {\n\t\t\t\t\t\tif (k < values.length) values[k] = Number(e);\n\t\t\t\t\t\telse values.push(Number(e));\n\t\t\t\t\t\tk++;\n\t\t\t\t\t} else lineIssue(i, `could not read \"${e}\" in curve ${m[1]}.`);\n\t\t\t\t}\n\t\t\t\tseries.push({ id: m[1], name: m[2] ?? m[1], values });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((m = /^(max|min|ticks|graticule|showLegend)\\s+(\\S+)$/.exec(t))) {\n\t\t\t\tif (m[1] === 'max') yAxis.max = Number(m[2]);\n\t\t\t\telse if (m[1] === 'min') yAxis.min = Number(m[2]);\n\t\t\t\telse if (m[1] === 'showLegend') legendShow = m[2] !== 'false';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (!(partial && isLast)) lineIssue(i, `could not read \"${t.slice(0, 60)}\"; it was skipped.`);\n\t}\n\n\tlet input: Record<string, unknown>;\n\tif (family === 'pie') {\n\t\tinput = {\n\t\t\ttype: 'pie',\n\t\t\ttitle,\n\t\t\tdataLabels: showData,\n\t\t\tcategories: pieSlices.map((s) => s.label),\n\t\t\tseries: [{ id: 'series-1', name: title || 'Values', values: pieSlices.map((s) => s.value) }]\n\t\t};\n\t} else if (family === 'radar') {\n\t\tinput = { type: 'radar', title, categories: radarAxes.map((a) => a.label), series, yAxis, legend: { show: legendShow, position: 'bottom' } };\n\t} else {\n\t\tconst allBar = series.length > 0 && series.every((s) => s.type === 'bar');\n\t\tconst allLine = series.length > 0 && series.every((s) => s.type === 'line');\n\t\tconst type = allLine ? 'line' : 'bar';\n\t\tconst longest = Math.max(0, ...series.map((s) => s.values.length));\n\t\tconst cats = categories.length ? categories : Array.from({ length: longest }, (_, i) => `${i + 1}`);\n\t\tinput = {\n\t\t\ttype,\n\t\t\ttitle,\n\t\t\torientation: horizontal ? 'horizontal' : 'vertical',\n\t\t\tcategories: cats,\n\t\t\txAxis,\n\t\t\tyAxis,\n\t\t\t// Series that match the chart type do not need their own type.\n\t\t\tseries: series.map((s) => (allBar || allLine || s.type === type ? { ...s, type: undefined } : s))\n\t\t};\n\t}\n\tif (meta) {\n\t\tconst { v: _v, series: metaSeries, ...rest } = meta as Record<string, unknown> & { v?: number; series?: Record<string, unknown>[] };\n\t\tObject.assign(input, rest);\n\t\tif (Array.isArray(metaSeries)) {\n\t\t\tconst base = (input.series as Record<string, unknown>[]) ?? [];\n\t\t\tinput.series = metaSeries.map((extra, i) => ({ ...(base[i] ?? {}), ...(extra ?? {}) }));\n\t\t}\n\t}\n\tconst { spec, issues: specIssues } = normalizeChartSpec(input);\n\tif (!family && !partial && !issues.length) issues.push({ path: 'header', message: 'The text is empty: expected a chart header (xychart-beta, pie or radar-beta).' });\n\treturn { spec, issues: [...issues, ...specIssues], family, hasMeta: !!meta };\n}\n\nexport interface FoundChartMermaid {\n\tsource: string;\n\tfamily: ChartMermaidFamily;\n\t/** 1-based line where the block starts in the input. */\n\tline: number;\n}\n\n/**\n * Finds Mermaid charts in Markdown or chat text: fenced ```mermaid blocks (and unlabelled\n * fences) whose header is xychart-beta, pie or radar-beta, else the whole text when it is one.\n */\nexport function findMermaidCharts(text: string): FoundChartMermaid[] {\n\tconst lines = text.replace(/^/, '').split(/\\r?\\n/);\n\tconst found: FoundChartMermaid[] = [];\n\tconst familyOf = (body: string): ChartMermaidFamily | null => {\n\t\tconst header = body.split(/\\r?\\n/).find((l) => l.trim() && !l.trim().startsWith('%%') && l.trim() !== '---');\n\t\tif (!header) return null;\n\t\tif (/^\\s*xychart(-beta)?\\b/.test(header)) return 'xychart';\n\t\tif (/^\\s*pie\\b/.test(header)) return 'pie';\n\t\tif (/^\\s*radar(-beta)?\\b/.test(header)) return 'radar';\n\t\treturn null;\n\t};\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst open = /^ {0,3}(`{3,}|~{3,})\\s*([\\w-]*)/.exec(lines[i]);\n\t\tif (!open) continue;\n\t\tconst fence = open[1];\n\t\tconst info = open[2].toLowerCase();\n\t\tlet end = i + 1;\n\t\twhile (end < lines.length && !new RegExp(`^ {0,3}${fence[0]}{${fence.length},}\\\\s*$`).test(lines[end])) end++;\n\t\tconst body = lines.slice(i + 1, end).join('\\n');\n\t\tif (!info || info === 'mermaid') {\n\t\t\tconst family = familyOf(body);\n\t\t\tif (family) found.push({ source: `${body.trimEnd()}\\n`, family, line: i + 2 });\n\t\t}\n\t\ti = end;\n\t}\n\tif (!found.length) {\n\t\tconst family = familyOf(text);\n\t\tif (family) found.push({ source: `${text.trim()}\\n`, family, line: 1 });\n\t}\n\treturn found;\n}\n\n","// Numeric summaries for agents that check visuals without looking follow\n// filmcraft-main/crates/scopes/src/summary.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See\n// THIRD_PARTY_NOTICES.md.\nimport { checkChartColors, type ChartColorCheck } from './color.js';\nimport { describeChartErrorBars } from './errorbars.js';\nimport { layoutChart } from './layout.js';\nimport type { ChartLayoutOptions } from './layout-shared.js';\nimport { formatChartNumber } from './scale.js';\nimport { chartColorsByCategory, chartFamily, chartSeriesColor, chartSliceColor, CHART_TYPE_LABELS } from './spec.js';\nimport { summarizeChartSeries, type ChartSeriesSummary } from './stats.js';\nimport type { ChartAxis, ChartScene, ChartSpec, ChartWarning } from './types.js';\n\n/** An axis as drawn. `logBase` is set on a logarithmic axis, `reversed` when it runs the other way. */\nexport interface ChartAxisSummary {\n\tmin: number;\n\tmax: number;\n\tticks: number[];\n\tlogBase?: number;\n\treversed?: boolean;\n}\n\nexport interface ChartSummary {\n\ttype: ChartSpec['type'];\n\ttitle: string;\n\tcategories: number;\n\tseries: ChartSeriesSummary[];\n\t/** The value axis as drawn: range and ticks (absent for pies and treemaps). */\n\tvalueAxis?: ChartAxisSummary;\n\tsecondaryAxis?: ChartAxisSummary;\n\txAxis?: ChartAxisSummary;\n\t/** What the layout left out at this size (hidden labels, thinned lines, …). */\n\twarnings: ChartWarning[];\n\t/** Whether the series colours can be told apart (also with colour-blindness). */\n\tcolors: Pick<ChartColorCheck, 'ok' | 'issues'>;\n\t/** A plain-language description (the SVG `<desc>`). */\n\tdescription: string;\n}\n\n/**\n * Numbers about a chart for agents and screen readers: per-series min / max / mean / trend,\n * the axes as drawn, layout warnings at `size`, a colour check and a one-paragraph\n * description. Lets an agent verify a chart without rendering it.\n */\nexport function summarizeChart(spec: ChartSpec, size: Pick<ChartLayoutOptions, 'width' | 'height' | 'measureText'> = { width: 640, height: 400 }, scene: ChartScene = layoutChart(spec, { ...size, selection: null })): ChartSummary {\n\tconst visible = spec.series.filter((s) => !s.hidden);\n\tconst series = visible.map((s) => summarizeChartSeries(s, spec.categories));\n\tconst colors = chartColorsByCategory(spec.type) ? spec.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(spec, i)) : visible.map((s) => chartSeriesColor(spec, spec.series.indexOf(s)));\n\tconst check = checkChartColors(colors, { surface: scene.theme.surface.startsWith('var(') ? '#ffffff' : scene.theme.surface });\n\tconst axis = (s: ChartScene['valueScale'], a: ChartAxis): ChartAxisSummary | undefined =>\n\t\ts ? { min: s.domain[0], max: s.domain[1], ticks: [...s.ticks], ...(s.logBase ? { logBase: s.logBase } : {}), ...(a.reverse ? { reversed: true } : {}) } : undefined;\n\treturn {\n\t\ttype: spec.type,\n\t\ttitle: spec.title,\n\t\tcategories: spec.categories.length,\n\t\tseries,\n\t\t...(scene.valueScale ? { valueAxis: axis(scene.valueScale, spec.yAxis) } : {}),\n\t\t...(scene.valueScale2 ? { secondaryAxis: axis(scene.valueScale2, spec.yAxis2) } : {}),\n\t\t...(scene.xScale ? { xAxis: axis(scene.xScale, spec.xAxis) } : {}),\n\t\twarnings: scene.warnings,\n\t\tcolors: { ok: check.ok, issues: check.issues },\n\t\tdescription: describeChart(spec, series)\n\t};\n}\n\n/** A plain-language description of a chart: type, what it compares, ranges and notable extremes. */\nexport function describeChart(spec: ChartSpec, series = spec.series.filter((s) => !s.hidden).map((s) => summarizeChartSeries(s, spec.categories))): string {\n\tconst kind = CHART_TYPE_LABELS[spec.type].toLowerCase();\n\tconst parts: string[] = [];\n\tconst family = chartFamily(spec);\n\tconst format = spec.yAxis.format;\n\tconst fmt = (v: number | null) => (v === null ? 'blank' : formatChartNumber(v, format));\n\tconst head = spec.title ? `${spec.title}: a ${kind} chart` : `A ${kind} chart`;\n\tif (!series.length || series.every((s) => s.count === 0)) return `${head} with no data.`;\n\tif (family === 'pie' || family === 'funnel' || family === 'treemap') {\n\t\tconst s = series[0];\n\t\tconst total = s.sum ?? 0;\n\t\tconst share = (v: number | null) => (total && v !== null ? ` (${Math.round((v / total) * 100)}%)` : '');\n\t\tparts.push(`${head} of ${s.name} across ${spec.categories.length} categories, totalling ${fmt(s.sum)}.`);\n\t\tparts.push(`The largest is ${s.maxAt} at ${fmt(s.max)}${share(s.max)}; the smallest is ${s.minAt} at ${fmt(s.min)}${share(s.min)}.`);\n\t\treturn parts.join(' ');\n\t}\n\tif (family === 'waterfall') {\n\t\tconst s = spec.series.find((x) => !x.hidden)!;\n\t\tconst steps = s.values.filter((v, i) => v !== null && Number.isFinite(v) && !/\\b(sub)?total\\b/i.test(spec.categories[i] ?? '')) as number[];\n\t\tconst total = steps.reduce((t, v) => t + v, 0);\n\t\tconst up = steps.filter((v) => v > 0).length;\n\t\tconst down = steps.filter((v) => v < 0).length;\n\t\treturn `${head} of ${s.name}: ${up} increase${up === 1 ? '' : 's'} and ${down} decrease${down === 1 ? '' : 's'} over ${spec.categories.length} steps, ending at a total of ${fmt(total)}.`;\n\t}\n\tif (family === 'histogram' || family === 'box') {\n\t\tparts.push(`${head} of ${series.map((s) => s.name).join(', ')}.`);\n\t\tfor (const s of series) parts.push(`${s.name}: ${s.count} values from ${fmt(s.min)} to ${fmt(s.max)}, mean ${fmt(s.mean)}.`);\n\t\treturn parts.join(' ');\n\t}\n\tconst what = family === 'xy' ? `${series.length} series of points` : `${series.length} series over ${spec.categories.length} categories${spec.categories.length ? ` (${spec.categories[0]} to ${spec.categories[spec.categories.length - 1]})` : ''}`;\n\tparts.push(`${head} showing ${what}.`);\n\tfor (const s of series.slice(0, 8)) {\n\t\tif (!s.count) {\n\t\t\tparts.push(`${s.name} has no values.`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst pct = s.change !== null ? Math.round(Math.abs(s.change) * 100) : 0;\n\t\tconst trend = s.trend && s.trend !== 'flat' ? `, ${s.trend}${pct ? `, ${s.change! > 0 ? 'up' : 'down'} ${pct}% from first to last` : ''}` : s.trend === 'flat' ? ', roughly flat' : '';\n\t\tparts.push(`${s.name} ranges from ${fmt(s.min)} (${s.minAt}) to ${fmt(s.max)} (${s.maxAt})${trend}.`);\n\t}\n\tif (series.length > 8) parts.push(`${series.length - 8} more series are not described.`);\n\t// Axis scales and error bars change how the picture reads.\n\tconst axes: string[] = [];\n\tfor (const [a, name] of [\n\t\t[spec.yAxis, 'value axis'],\n\t\t[spec.yAxis2, 'secondary value axis'],\n\t\t[spec.xAxis, family === 'xy' ? 'x axis' : 'category axis']\n\t] as const) {\n\t\tif (name === 'secondary value axis' && !spec.series.some((s) => !s.hidden && s.axis === 'secondary')) continue;\n\t\tconst log = a.scale === 'log' && (name !== 'category axis');\n\t\tif (log || a.reverse) axes.push(`The ${name} is ${[log ? `logarithmic (base ${a.logBase ?? 10})` : '', a.reverse ? 'reversed' : ''].filter(Boolean).join(' and ')}.`);\n\t}\n\tparts.push(...axes);\n\tfor (const s of spec.series.filter((x) => !x.hidden && (x.errorBars || x.xErrorBars)).slice(0, 8)) {\n\t\tconst bars = [s.errorBars ? describeChartErrorBars(s.errorBars) : '', s.xErrorBars ? `x ${describeChartErrorBars(s.xErrorBars)}` : ''].filter(Boolean).join(' and ');\n\t\tparts.push(`${s.name} has ${bars}.`);\n\t}\n\treturn parts.join(' ');\n}\n","// `<title>` and `<desc>` on exported SVG follow vectorcraft-main/crates/svg/src/export.rs (MIT OR Apache-2.0,\n// © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { layoutChart, type ChartLayoutOptions } from './layout.js';\nimport { describeChart } from './summary.js';\nimport type { ChartMark, ChartScene, ChartSpec, ChartTextMark } from './types.js';\n\n/** SVG `dominant-baseline` for a text mark's baseline (shared by every renderer). */\nexport function chartTextBaseline(baseline: ChartTextMark['baseline']): 'hanging' | 'central' | 'text-after-edge' {\n\treturn baseline === 'top' ? 'hanging' : baseline === 'middle' ? 'central' : 'text-after-edge';\n}\n\n/** SVG `transform` for a rotated text mark, if any. */\nexport function chartTextTransform(mark: ChartTextMark): string | undefined {\n\treturn mark.rotate ? `rotate(${mark.rotate} ${mark.x} ${mark.y})` : undefined;\n}\n\nconst escape = (text: string) => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n/** A mark as an SVG tag name, its attributes (unset ones dropped) and its text. */\nfunction markParts(mark: ChartMark, fontFamily: string): { tag: string; attrs: Record<string, string>; text?: string } {\n\tconst common = { opacity: mark.opacity, 'data-role': mark.role };\n\tconst parts = (tag: string, values: Record<string, string | number | undefined>, text?: string) => ({\n\t\ttag,\n\t\tattrs: Object.fromEntries(Object.entries(values).filter(([, v]) => v !== undefined && v !== '').map(([k, v]) => [k, String(v)])),\n\t\ttext\n\t});\n\tswitch (mark.kind) {\n\t\tcase 'rect':\n\t\t\treturn parts('rect', { x: mark.x, y: mark.y, width: mark.width, height: mark.height, rx: mark.radius, fill: mark.fill, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, ...common });\n\t\tcase 'path':\n\t\t\treturn parts('path', { d: mark.d, fill: mark.fill ?? 'none', stroke: mark.stroke, 'stroke-width': mark.strokeWidth, 'stroke-dasharray': mark.dash, 'stroke-linejoin': 'round', 'stroke-linecap': 'round', ...common });\n\t\tcase 'circle':\n\t\t\treturn parts('circle', { cx: mark.cx, cy: mark.cy, r: mark.r, fill: mark.fill, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, ...common });\n\t\tcase 'line':\n\t\t\treturn parts('line', { x1: mark.x1, y1: mark.y1, x2: mark.x2, y2: mark.y2, stroke: mark.stroke, 'stroke-width': mark.strokeWidth, 'stroke-dasharray': mark.dash, ...common });\n\t\tcase 'text':\n\t\t\treturn parts(\n\t\t\t\t'text',\n\t\t\t\t{\n\t\t\t\t\tx: mark.x,\n\t\t\t\t\ty: mark.y,\n\t\t\t\t\t'text-anchor': mark.anchor,\n\t\t\t\t\t'dominant-baseline': chartTextBaseline(mark.baseline),\n\t\t\t\t\t'font-size': mark.size,\n\t\t\t\t\t'font-weight': mark.weight,\n\t\t\t\t\t'font-family': fontFamily,\n\t\t\t\t\tfill: mark.fill,\n\t\t\t\t\ttransform: chartTextTransform(mark),\n\t\t\t\t\t...common\n\t\t\t\t},\n\t\t\t\tmark.text\n\t\t\t);\n\t}\n}\n\nfunction markToSvg(mark: ChartMark, fontFamily: string): string {\n\tconst { tag, attrs, text } = markParts(mark, fontFamily);\n\tconst attrText = Object.entries(attrs)\n\t\t.map(([k, v]) => ` ${k}=\"${escape(v)}\"`)\n\t\t.join('');\n\treturn text === undefined ? `<${tag}${attrText}/>` : `<${tag}${attrText}>${escape(text)}</${tag}>`;\n}\n\nexport interface ChartSvgOptions {\n\t/** Leave out selection outlines (default `true`: exports show the chart only). */\n\thideSelection?: boolean;\n\t/** Accessible title (default: the chart title). */\n\tariaLabel?: string;\n\t/** A longer description written as `<desc>` (`chartToSvg` defaults to `describeChart`). */\n\tdescription?: string;\n}\n\n/** Writes a laid-out scene as a standalone SVG document string. */\nexport function chartSceneToSvg(scene: ChartScene, options: ChartSvgOptions = {}): string {\n\tconst hide = options.hideSelection ?? true;\n\tconst font = scene.theme.fontFamily;\n\tconst body = scene.marks\n\t\t.filter((m) => !(hide && m.role === 'selection'))\n\t\t.map((m) => markToSvg(m, font))\n\t\t.join('');\n\tconst label = options.ariaLabel;\n\tconst desc = options.description;\n\tconst labelled = [label ? 'chart-title' : '', desc ? 'chart-desc' : ''].filter(Boolean).join(' ');\n\tconst head = `${label ? `<title id=\"chart-title\">${escape(label)}</title>` : ''}${desc ? `<desc id=\"chart-desc\">${escape(desc)}</desc>` : ''}`;\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${scene.width}\" height=\"${scene.height}\" viewBox=\"0 0 ${scene.width} ${scene.height}\" role=\"img\"${label ? ` aria-label=\"${escape(label)}\"` : ''}${labelled ? ` aria-labelledby=\"${labelled}\"` : ''}>${head}${body}</svg>`;\n}\n\n/** Lays out and writes a chart as SVG, e.g. for export or server rendering. */\nexport function chartToSvg(spec: ChartSpec, options: Omit<ChartLayoutOptions, 'selection'> & ChartSvgOptions): string {\n\tconst scene = layoutChart(spec, { ...options, selection: null });\n\treturn chartSceneToSvg(scene, { ...options, ariaLabel: options.ariaLabel ?? (spec.title || undefined), description: options.description ?? describeChart(spec) });\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** A ProseMirror / TipTap `DOMOutputSpec` array (kept structural so this module needs no TipTap types). */\nexport type ChartDomSpec = [string, Record<string, string>, ...(ChartDomSpec | string)[]];\n\n/**\n * Writes a laid-out scene as a ProseMirror `DOMOutputSpec` (SVG-namespaced tags), so a\n * TipTap node's `renderHTML` can draw a chart without parsing an SVG string. Same output\n * as `chartSceneToSvg`.\n */\nexport function chartSceneToDomSpec(scene: ChartScene, options: ChartSvgOptions & { attrs?: Record<string, string> } = {}): ChartDomSpec {\n\tconst hide = options.hideSelection ?? true;\n\tconst font = scene.theme.fontFamily;\n\tconst tag = (name: string) => `${SVG_NS} ${name}`;\n\tconst children: ChartDomSpec[] = [];\n\tif (options.ariaLabel) children.push([tag('title'), {}, options.ariaLabel]);\n\tif (options.description) children.push([tag('desc'), {}, options.description]);\n\tfor (const mark of scene.marks) {\n\t\tif (hide && mark.role === 'selection') continue;\n\t\tconst { tag: name, attrs, text } = markParts(mark, font);\n\t\tchildren.push(text === undefined ? [tag(name), attrs] : [tag(name), attrs, text]);\n\t}\n\tconst attrs: Record<string, string> = {\n\t\twidth: String(scene.width),\n\t\theight: String(scene.height),\n\t\tviewBox: `0 0 ${scene.width} ${scene.height}`,\n\t\trole: 'img',\n\t\t...(options.ariaLabel ? { 'aria-label': options.ariaLabel } : {}),\n\t\t...options.attrs\n\t};\n\treturn [tag('svg'), attrs, ...children];\n}\n","// Quick layouts and colour schemes, as GridCraft's `chart.quickLayout` and `chart.changeColors` offer them\n// (gridcraft-main/crates/engine/src/cmd/extra.rs; MIT OR Apache-2.0, © ArtCraft Team and contributors).\n// See THIRD_PARTY_NOTICES.md.\nimport { shadeChartColor } from './color.js';\nimport { DEFAULT_CHART_PALETTE } from './spec.js';\nimport type { ChartAxis, ChartLegend, ChartSpec } from './types.js';\n\n/** A partial change several fields at once (what `ChartController.update` takes). */\nexport type ChartPresetPatch = Partial<Omit<ChartSpec, 'version' | 'xAxis' | 'yAxis' | 'yAxis2' | 'legend' | 'series' | 'categories'>> & {\n\txAxis?: Partial<ChartAxis>;\n\tyAxis?: Partial<ChartAxis>;\n\tyAxis2?: Partial<ChartAxis>;\n\tlegend?: Partial<ChartLegend>;\n};\n\nexport interface ChartLayoutPreset {\n\tid: string;\n\tlabel: string;\n\tdescription: string;\n\tpatch: ChartPresetPatch;\n}\n\n/** Quick layouts: legend, labels and grid lines set together. */\nexport const CHART_LAYOUT_PRESETS: readonly ChartLayoutPreset[] = [\n\t{ id: 'standard', label: 'Standard', description: 'Legend at the bottom, value grid lines, no data labels.', patch: { legend: { show: true, position: 'bottom' }, dataLabels: false, xAxis: { gridlines: false, show: true }, yAxis: { gridlines: true, show: true } } },\n\t{ id: 'minimal', label: 'Minimal', description: 'No legend, grid lines or axis titles; the data speaks.', patch: { legend: { show: false }, dataLabels: false, xAxis: { gridlines: false, title: '' }, yAxis: { gridlines: false, title: '' } } },\n\t{ id: 'labelled', label: 'Labelled', description: 'Values written on the marks, no value axis or grid lines.', patch: { dataLabels: true, labelPosition: 'auto', yAxis: { show: false, gridlines: false }, xAxis: { gridlines: false } } },\n\t{ id: 'legend-right', label: 'Legend on the right', description: 'Legend beside the plot, value grid lines.', patch: { legend: { show: true, position: 'right' }, yAxis: { gridlines: true } } },\n\t{ id: 'presentation', label: 'Presentation', description: 'Legend on top, data labels, light grid.', patch: { legend: { show: true, position: 'top' }, dataLabels: true, yAxis: { gridlines: true }, xAxis: { gridlines: false } } },\n\t{ id: 'analysis', label: 'Analysis', description: 'Grid lines on both axes, point markers, legend at the bottom.', patch: { legend: { show: true, position: 'bottom' }, points: true, dataLabels: false, xAxis: { gridlines: true }, yAxis: { gridlines: true } } }\n];\n\nexport interface ChartColorScheme {\n\tid: string;\n\tlabel: string;\n\tdescription: string;\n\tpalette: readonly string[];\n}\n\n/** Shades of one hue, dark to light (for monochrome schemes). */\nexport function monochromeChartPalette(base: string, count = 6): string[] {\n\tconst steps = count <= 1 ? [0] : Array.from({ length: count }, (_, i) => -0.45 + (1.05 * i) / (count - 1));\n\treturn steps.map((t) => shadeChartColor(base, t));\n}\n\n/** Named palettes. `default` and `okabe-ito` are colour-blind friendly. */\nexport const CHART_COLOR_SCHEMES: readonly ChartColorScheme[] = [\n\t{ id: 'default', label: 'Default', description: 'Ten distinct colours, readable on light and dark backgrounds.', palette: DEFAULT_CHART_PALETTE },\n\t{ id: 'okabe-ito', label: 'Okabe–Ito', description: 'Eight colours chosen to stay distinct with colour-blindness.', palette: ['#e69f00', '#56b4e9', '#009e73', '#f0e442', '#0072b2', '#d55e00', '#cc79a7', '#000000'] },\n\t{ id: 'office', label: 'Office', description: 'The six accent colours of the default Office theme.', palette: ['#4472c4', '#ed7d31', '#a5a5a5', '#ffc000', '#5b9bd5', '#70ad47'] },\n\t{ id: 'warm', label: 'Warm', description: 'Reds, oranges and yellows.', palette: ['#b2182b', '#d6604d', '#f4a582', '#e08214', '#fdb863', '#8c510a'] },\n\t{ id: 'cool', label: 'Cool', description: 'Blues, teals and purples.', palette: ['#2166ac', '#4393c3', '#35978f', '#80cdc1', '#762a83', '#9970ab'] },\n\t{ id: 'monochrome-blue', label: 'Monochrome blue', description: 'Shades of one blue.', palette: monochromeChartPalette('#4269d0') },\n\t{ id: 'monochrome-green', label: 'Monochrome green', description: 'Shades of one green.', palette: monochromeChartPalette('#3ca951') },\n\t{ id: 'monochrome-orange', label: 'Monochrome orange', description: 'Shades of one orange.', palette: monochromeChartPalette('#e8710a') },\n\t{ id: 'monochrome-gray', label: 'Monochrome grey', description: 'Shades of grey.', palette: monochromeChartPalette('#6b7280') }\n];\n\n/** The change a named layout and / or colour scheme makes, or a sentence saying which names exist. */\nexport function chartPresetPatch(options: { layout?: string; colors?: string }): { ok: true; patch: ChartPresetPatch } | { ok: false; message: string } {\n\tconst patch: ChartPresetPatch = {};\n\tif (options.layout !== undefined) {\n\t\tconst preset = CHART_LAYOUT_PRESETS.find((p) => p.id === options.layout);\n\t\tif (!preset) return { ok: false, message: `There is no layout \"${options.layout}\"; expected one of ${CHART_LAYOUT_PRESETS.map((p) => `\"${p.id}\"`).join(', ')}.` };\n\t\tObject.assign(patch, preset.patch);\n\t}\n\tif (options.colors !== undefined) {\n\t\tconst scheme = CHART_COLOR_SCHEMES.find((p) => p.id === options.colors);\n\t\tif (!scheme) return { ok: false, message: `There is no colour scheme \"${options.colors}\"; expected one of ${CHART_COLOR_SCHEMES.map((p) => `\"${p.id}\"`).join(', ')}.` };\n\t\tpatch.palette = [...scheme.palette];\n\t}\n\tif (options.layout === undefined && options.colors === undefined) return { ok: false, message: 'Name a layout, a colour scheme or both.' };\n\treturn { ok: true, patch };\n}\n","import { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command, HistoryMark } from '../history/types.js';\nimport { parseCsv, parseTsv } from '../spreadsheet/csv.js';\nimport { sameChartSelection } from './layout.js';\nimport { chartPresetPatch } from './presets.js';\nimport { chartFamily } from './spec.js';\nimport { chartMovingAverage, chartSupportsTrendlines, fitChartTrendline, type ChartTrendFit } from './trend.js';\nimport {\n\tchartDataFromTable,\n\tnormalizeChartTrendline,\n\tcloneChartSeries,\n\tcloneChartSpec,\n\tnormalizeChartSpec,\n\tparseChartValue,\n\tuniqueChartSeriesId,\n\ttype ChartTableOptions\n} from './spec.js';\nimport type {\n\tChartAxis,\n\tChartIssue,\n\tChartCurve,\n\tChartErrorBars,\n\tChartLegend,\n\tChartMarker,\n\tChartNumberFormat,\n\tChartSelection,\n\tChartSeries,\n\tChartSeriesType,\n\tChartSpec,\n\tChartTrendline,\n\tChartType,\n\tChartValue\n} from './types.js';\n\n/** Structural equality of JSON-like values (specs are plain data; key order does not matter). */\nfunction sameChartJson(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return Number.isNaN(a) && Number.isNaN(b);\n\tif (Array.isArray(a) !== Array.isArray(b)) return false;\n\tif (Array.isArray(a)) {\n\t\tconst bb = b as unknown[];\n\t\treturn a.length === bb.length && a.every((v, i) => sameChartJson(v, bb[i]));\n\t}\n\tconst ao = a as Record<string, unknown>;\n\tconst bo = b as Record<string, unknown>;\n\tconst keys = Object.keys(ao).filter((k) => ao[k] !== undefined);\n\tif (keys.length !== Object.keys(bo).filter((k) => bo[k] !== undefined).length) return false;\n\treturn keys.every((k) => Object.prototype.hasOwnProperty.call(bo, k) && sameChartJson(ao[k], bo[k]));\n}\n\nexport interface ChartControllerOptions {\n\t/** Starting chart (any partial or saved spec; problems are reported in `state.issues`). */\n\tspec?: Partial<ChartSpec> | unknown;\n\t/** History to record into, e.g. one shared with the rest of the app (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Called after the spec changes (edit, undo, redo, load). */\n\tonChange?: (spec: Readonly<ChartSpec>) => void;\n}\n\n/** A snapshot of the controller. The same object is returned until something changes. */\nexport interface ChartState {\n\tspec: Readonly<ChartSpec>;\n\tselection: ChartSelection | null;\n\t/** The series the selection belongs to (a series, one of its points or one of its trendlines). */\n\tselectedSeries: ChartSeries | null;\n\t/** The category the selection belongs to (a category or a point). */\n\tselectedIndex: number | null;\n\t/** Problems from the last load or rejected edit, as sentences. */\n\tissues: readonly ChartIssue[];\n\t/** The gesture in progress (e.g. a bar drag), if any. */\n\tgesture: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nexport type ChartActionResult = { ok: true } | { ok: false; message: string; issues?: ChartIssue[] };\n\n/** Top-level fields with partial axes and legend. */\nexport type ChartSpecPatch = Partial<Omit<ChartSpec, 'version' | 'xAxis' | 'yAxis' | 'yAxis2' | 'legend'>> & {\n\txAxis?: Partial<ChartAxis>;\n\tyAxis?: Partial<ChartAxis>;\n\tyAxis2?: Partial<ChartAxis>;\n\tlegend?: Partial<ChartLegend>;\n};\n\nexport interface ChartSeriesInput {\n\tid?: string;\n\tname?: string;\n\tvalues?: readonly unknown[];\n\tcolor?: string;\n\ttype?: ChartSeriesType;\n\thidden?: boolean;\n\taxis?: 'primary' | 'secondary';\n\tx?: readonly unknown[];\n\tsizes?: readonly unknown[];\n\tpointColors?: readonly (string | null)[];\n\tmarker?: ChartMarker;\n\tcurve?: ChartCurve;\n\tdataLabels?: boolean;\n\tformat?: ChartNumberFormat;\n\ttrendlines?: readonly ChartTrendline[];\n\terrorBars?: ChartErrorBars;\n\txErrorBars?: ChartErrorBars;\n}\n\n/** Changes to one series; `null` resets a field to the chart's default. */\nexport interface ChartSeriesPatch {\n\tname?: string;\n\t/** `null` goes back to the palette colour. */\n\tcolor?: string | null;\n\t/** `null` follows the chart type. */\n\ttype?: ChartSeriesType | null;\n\thidden?: boolean;\n\taxis?: 'primary' | 'secondary' | null;\n\tx?: readonly unknown[] | null;\n\tsizes?: readonly unknown[] | null;\n\tpointColors?: readonly (string | null)[] | null;\n\tmarker?: ChartMarker | null;\n\tcurve?: ChartCurve | null;\n\tdataLabels?: boolean | null;\n\tformat?: ChartNumberFormat | null;\n\t/** `null` removes the error bars. */\n\terrorBars?: ChartErrorBars | null;\n\t/** `null` removes the x error bars. */\n\txErrorBars?: ChartErrorBars | null;\n}\n\nexport interface ChartEditOptions {\n\t/** Undo step label. */\n\tlabel?: string;\n}\n\nconst fail = (message: string, issues?: ChartIssue[]): ChartActionResult => ({ ok: false, message, ...(issues ? { issues } : {}) });\n\n/**\n * Headless state for a chart editor: a validated `ChartSpec`, a selection, and undoable\n * edits to data (values, series, categories, pasted grids, CSV) and presentation (type,\n * titles, axes, legend, stacking, …). Drags merge into one undo step (`beginGesture`).\n * `getState()` returns the same object until something changes, so it works with\n * `useSyncExternalStore` and Svelte runes alike.\n */\nexport class ChartController {\n\treadonly history: HistoryManager;\n\tprivate spec: ChartSpec;\n\tprivate selection: ChartSelection | null = null;\n\tprivate issues: ChartIssue[] = [];\n\tprivate gestureKey: string | null = null;\n\tprivate gestureCount = 0;\n\tprivate gestureStart: { spec: ChartSpec; mark: HistoryMark } | null = null;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate readonly onChange?: ChartControllerOptions['onChange'];\n\tprivate readonly listeners = new Set<(state: ChartState) => void>();\n\tprivate unsubscribeHistory?: () => void;\n\tprivate state!: ChartState;\n\n\tconstructor(options: ChartControllerOptions = {}) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.onChange = options.onChange;\n\t\tconst { spec, issues } = normalizeChartSpec(options.spec ?? {});\n\t\tthis.spec = spec;\n\t\tthis.issues = issues;\n\t\tthis.state = this.computeState();\n\t\tthis.connect();\n\t}\n\n\tprivate connect() {\n\t\tthis.unsubscribeHistory?.();\n\t\tthis.unsubscribeHistory = this.history.subscribe((h) => {\n\t\t\t// Edits notify as they apply; only re-notify when the undo/redo state moved on.\n\t\t\tconst s = this.state;\n\t\t\tif (this.applying || (s.canUndo === h.canUndo && s.canRedo === h.canRedo && s.undoLabel === h.undoName && s.redoLabel === h.redoName)) return;\n\t\t\tthis.notify(false);\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// State\n\t// -------------------------------------------------------------------------\n\n\t/** The current snapshot (stable until the next change). */\n\tgetState = (): ChartState => this.state;\n\n\t/** Calls `listener` after every change. Returns an unsubscribe function. */\n\tsubscribe = (listener: (state: ChartState) => void): (() => void) => {\n\t\t// Reconnect after `destroy()` so a remount (React StrictMode) keeps undo working.\n\t\tif (!this.unsubscribeHistory) this.connect();\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\t/** The current spec (do not mutate; edit through the controller). */\n\tgetSpec(): Readonly<ChartSpec> {\n\t\treturn this.spec;\n\t}\n\n\tgetSeries(id: string): ChartSeries | undefined {\n\t\treturn this.spec.series.find((s) => s.id === id);\n\t}\n\n\tprivate computeState(): ChartState {\n\t\tconst h = this.history.getState();\n\t\tconst sel = this.selection;\n\t\tconst seriesId = sel?.kind === 'series' || sel?.kind === 'point' || sel?.kind === 'trendline' ? sel.seriesId : null;\n\t\treturn {\n\t\t\tspec: this.spec,\n\t\t\tselection: sel,\n\t\t\tselectedSeries: seriesId ? (this.spec.series.find((s) => s.id === seriesId) ?? null) : null,\n\t\t\tselectedIndex: sel?.kind === 'point' || sel?.kind === 'category' ? sel.index : null,\n\t\t\tissues: this.issues,\n\t\t\tgesture: this.gestureKey,\n\t\t\tcanUndo: h.canUndo,\n\t\t\tcanRedo: h.canRedo,\n\t\t\tundoLabel: h.undoName,\n\t\t\tredoLabel: h.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify(specChanged: boolean) {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tif (specChanged) this.onChange?.(this.spec);\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[ChartController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Changes: every edit records a before / after snapshot of the spec\n\t// -------------------------------------------------------------------------\n\n\t/** Drops a selection that no longer points at anything. */\n\tprivate validSelection(sel: ChartSelection | null, spec: ChartSpec): ChartSelection | null {\n\t\tif (!sel) return null;\n\t\tswitch (sel.kind) {\n\t\t\tcase 'series':\n\t\t\t\treturn spec.series.some((s) => s.id === sel.seriesId) ? sel : null;\n\t\t\tcase 'point':\n\t\t\t\treturn spec.series.some((s) => s.id === sel.seriesId) && sel.index < spec.categories.length ? sel : null;\n\t\t\tcase 'category':\n\t\t\t\treturn sel.index < spec.categories.length ? sel : null;\n\t\t\tcase 'trendline':\n\t\t\t\treturn spec.series.find((s) => s.id === sel.seriesId)?.trendlines?.[sel.index] ? sel : null;\n\t\t\tcase 'title':\n\t\t\t\treturn spec.title ? sel : null;\n\t\t\tcase 'subtitle':\n\t\t\t\treturn spec.subtitle ? sel : null;\n\t\t\tdefault:\n\t\t\t\treturn sel;\n\t\t}\n\t}\n\n\tprivate applySpec(spec: ChartSpec) {\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tthis.spec = spec;\n\t\t\tthis.selection = this.validSelection(this.selection, spec);\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify(true);\n\t}\n\n\tprivate commit(label: string, next: ChartSpec, select?: ChartSelection | null) {\n\t\tconst before = this.spec;\n\t\tconst hadIssues = this.issues.length > 0;\n\t\tthis.issues = [];\n\t\t// A no-op edit (same value, same title, …) records no undo step.\n\t\tif (sameChartJson(before, next)) {\n\t\t\tconst reselect = select !== undefined && !sameChartSelection(this.selection, select) && !(select === null && this.selection === null);\n\t\t\tif (reselect) this.selection = select;\n\t\t\tif (reselect || hadIssues) this.notify(false);\n\t\t\treturn;\n\t\t}\n\t\tconst command: Command = {\n\t\t\tname: label,\n\t\t\ttag: 'chart',\n\t\t\texecute: () => this.applySpec(next),\n\t\t\tundo: () => this.applySpec(before),\n\t\t\tredo: () => this.applySpec(next)\n\t\t};\n\t\tif (select !== undefined) this.selection = select;\n\t\tif (this.gestureKey !== null) this.history.executeMerged(command, { key: `chart.gesture:${this.gestureKey}:${this.gestureCount}` });\n\t\telse this.history.execute(command);\n\t}\n\n\tprivate reject(message: string, issues: ChartIssue[] = []): ChartActionResult {\n\t\tthis.issues = issues.length ? issues : [{ path: '', message }];\n\t\tthis.notify(false);\n\t\treturn fail(message, issues.length ? issues : undefined);\n\t}\n\n\t/** A copy of the spec with `edit` applied (series and categories copied as needed). */\n\tprivate edited(edit: (draft: ChartSpec) => void): ChartSpec {\n\t\tconst draft = cloneChartSpec(this.spec);\n\t\tedit(draft);\n\t\treturn draft;\n\t}\n\n\tprivate unknownSeries(id: string): ChartActionResult {\n\t\tconst ids = this.spec.series.map((s) => `\"${s.id}\"`);\n\t\treturn fail(`There is no series \"${id}\"; ${ids.length ? `expected one of ${ids.join(', ')}` : 'the chart has no series yet'}.`);\n\t}\n\n\tprivate badIndex(index: number): ChartActionResult {\n\t\tconst n = this.spec.categories.length;\n\t\treturn fail(n ? `Category index ${index} is out of range; expected 0 to ${n - 1}.` : 'The chart has no categories yet.');\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Presentation\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Changes any presentation or data fields as one undo step. All-or-nothing: if anything\n\t * is invalid, nothing changes and every problem is returned (and shown in `state.issues`).\n\t */\n\tupdate(patch: ChartSpecPatch, options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst s = this.spec;\n\t\tconst merged = {\n\t\t\t...s,\n\t\t\t...patch,\n\t\t\txAxis: patch.xAxis ? { ...s.xAxis, ...patch.xAxis } : s.xAxis,\n\t\t\tyAxis: patch.yAxis ? { ...s.yAxis, ...patch.yAxis } : s.yAxis,\n\t\t\tyAxis2: patch.yAxis2 ? { ...s.yAxis2, ...patch.yAxis2 } : s.yAxis2,\n\t\t\tlegend: patch.legend ? { ...s.legend, ...patch.legend } : s.legend,\n\t\t\tversion: 1\n\t\t};\n\t\tconst { spec, issues } = normalizeChartSpec(merged);\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tif (JSON.stringify(spec) === JSON.stringify(s)) return { ok: true };\n\t\tthis.commit(options.label ?? updateLabel(patch), spec);\n\t\treturn { ok: true };\n\t}\n\n\tsetType(type: ChartType): ChartActionResult {\n\t\treturn this.update({ type }, { label: `Change chart type` });\n\t}\n\n\tsetTitle(title: string): ChartActionResult {\n\t\treturn this.update({ title }, { label: 'Edit title' });\n\t}\n\n\tsetSubtitle(subtitle: string): ChartActionResult {\n\t\treturn this.update({ subtitle }, { label: 'Edit subtitle' });\n\t}\n\n\t/** Changes the category (`x`), value (`y`) or secondary value (`y2`) axis. */\n\tsetAxis(axis: 'x' | 'y' | 'y2', patch: Partial<ChartAxis>): ChartActionResult {\n\t\tconst key = axis === 'x' ? 'xAxis' : axis === 'y' ? 'yAxis' : 'yAxis2';\n\t\treturn this.update({ [key]: patch }, { label: `Change ${axis === 'x' ? 'category' : axis === 'y' ? 'value' : 'secondary value'} axis` });\n\t}\n\n\t/**\n\t * Applies a named quick layout and / or colour scheme (see `CHART_LAYOUT_PRESETS` and\n\t * `CHART_COLOR_SCHEMES`) as one undo step.\n\t */\n\tapplyPreset(options: { layout?: string; colors?: string }): ChartActionResult {\n\t\tconst preset = chartPresetPatch(options);\n\t\tif (!preset.ok) return this.reject(preset.message);\n\t\tconst label = options.layout && options.colors ? 'Apply chart style' : options.layout ? 'Apply quick layout' : 'Change colours';\n\t\treturn this.update(preset.patch, { label });\n\t}\n\n\tsetLegend(patch: Partial<ChartLegend>): ChartActionResult {\n\t\treturn this.update({ legend: patch }, { label: 'Change legend' });\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Data\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Replaces categories and / or series as one undo step. Values are validated and padded\n\t * to the categories; all-or-nothing like `update`.\n\t */\n\tsetData(data: { categories?: readonly unknown[]; series?: readonly ChartSeriesInput[] }, options: ChartEditOptions = {}): ChartActionResult {\n\t\treturn this.update({ ...(data.categories ? { categories: data.categories as string[] } : {}), ...(data.series ? { series: data.series as ChartSeries[] } : {}) }, { label: options.label ?? 'Edit chart data' });\n\t}\n\n\t/**\n\t * Sets one value (numbers, numeric text such as `1,200` or `12%`, or blank for a gap).\n\t * One undo step, or part of the current gesture.\n\t */\n\tsetValue(seriesId: string, index: number, value: unknown, options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tconst parsed = parseChartValue(value);\n\t\tif (parsed === undefined) return this.reject(`\"${String(value)}\" is not a number; enter a number or leave the cell blank.`, [{ path: `${seriesId}[${index}]`, message: `\"${String(value)}\" is not a number.` }]);\n\t\tif (series.values[index] === parsed) {\n\t\t\tif (this.issues.length) {\n\t\t\t\tthis.issues = [];\n\t\t\t\tthis.notify(false);\n\t\t\t}\n\t\t\treturn { ok: true };\n\t\t}\n\t\tconst next = this.edited((d) => {\n\t\t\td.series.find((s) => s.id === seriesId)!.values[index] = parsed;\n\t\t});\n\t\tthis.commit(options.label ?? `Edit ${series.name} · ${this.spec.categories[index]}`, next);\n\t\treturn { ok: true };\n\t}\n\n\t/** Several values as one undo step (all-or-nothing). */\n\tsetValues(cells: readonly { seriesId: string; index: number; value: unknown }[], options: ChartEditOptions = {}): ChartActionResult {\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst parsed: { seriesId: string; index: number; value: ChartValue }[] = [];\n\t\tfor (const cell of cells) {\n\t\t\tif (!this.getSeries(cell.seriesId)) issues.push({ path: cell.seriesId, message: (this.unknownSeries(cell.seriesId) as { message: string }).message });\n\t\t\telse if (!Number.isInteger(cell.index) || cell.index < 0 || cell.index >= this.spec.categories.length) issues.push({ path: `${cell.seriesId}[${cell.index}]`, message: (this.badIndex(cell.index) as { message: string }).message });\n\t\t\telse {\n\t\t\t\tconst value = parseChartValue(cell.value);\n\t\t\t\tif (value === undefined) issues.push({ path: `${cell.seriesId}[${cell.index}]`, message: `\"${String(cell.value)}\" is not a number.` });\n\t\t\t\telse parsed.push({ seriesId: cell.seriesId, index: cell.index, value });\n\t\t\t}\n\t\t}\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tconst next = this.edited((d) => {\n\t\t\tfor (const cell of parsed) d.series.find((s) => s.id === cell.seriesId)!.values[cell.index] = cell.value;\n\t\t});\n\t\tif (JSON.stringify(next.series) !== JSON.stringify(this.spec.series)) this.commit(options.label ?? 'Edit values', next);\n\t\treturn { ok: true };\n\t}\n\n\t/** Adds a series (values padded to the categories) and selects it. Returns its id. */\n\taddSeries(input: ChartSeriesInput = {}, options: { at?: number } = {}): { ok: true; id: string } | { ok: false; message: string; issues?: ChartIssue[] } {\n\t\tconst id = input.id && !this.getSeries(input.id) ? input.id : uniqueChartSeriesId(this.spec.series);\n\t\tconst name = input.name ?? `Series ${this.spec.series.length + 1}`;\n\t\tconst at = Math.max(0, Math.min(this.spec.series.length, options.at ?? this.spec.series.length));\n\t\tconst series = [...this.spec.series];\n\t\tseries.splice(at, 0, { ...input, id, name, values: (input.values ?? []) as ChartValue[] } as unknown as ChartSeries);\n\t\tconst { spec, issues } = normalizeChartSpec({ ...this.spec, series });\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues) as { ok: false; message: string };\n\t\tthis.commit(`Add series \"${name}\"`, spec, { kind: 'series', seriesId: id });\n\t\treturn { ok: true, id };\n\t}\n\n\tremoveSeries(id: string): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\tthis.commit(\n\t\t\t`Delete series \"${series.name}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.series = d.series.filter((s) => s.id !== id);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\tupdateSeries(id: string, patch: ChartSeriesPatch): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\tconst next = cloneChartSeries(series);\n\t\tif (patch.name !== undefined) next.name = String(patch.name);\n\t\tif (patch.color === null || patch.color === '') delete next.color;\n\t\telse if (patch.color !== undefined) next.color = patch.color;\n\t\tif (patch.type === null) delete next.type;\n\t\telse if (patch.type !== undefined) next.type = patch.type;\n\t\tif (patch.hidden !== undefined) {\n\t\t\tif (patch.hidden) next.hidden = true;\n\t\t\telse delete next.hidden;\n\t\t}\n\t\tconst resettable = ['axis', 'x', 'sizes', 'pointColors', 'marker', 'curve', 'dataLabels', 'format', 'errorBars', 'xErrorBars'] as const;\n\t\tfor (const key of resettable) {\n\t\t\tif (!(key in patch) || patch[key] === undefined) continue;\n\t\t\tif (patch[key] === null) delete (next as any)[key];\n\t\t\telse (next as any)[key] = patch[key];\n\t\t}\n\t\tif (next.axis === 'primary') delete next.axis;\n\t\tconst series2 = this.spec.series.map((s) => (s.id === id ? next : s));\n\t\tconst { spec, issues } = normalizeChartSpec({ ...this.spec, series: series2 });\n\t\tif (issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tif (JSON.stringify(spec.series) === JSON.stringify(this.spec.series)) return { ok: true };\n\t\tconst label =\n\t\t\tpatch.hidden !== undefined && Object.keys(patch).length === 1\n\t\t\t\t? `${patch.hidden ? 'Hide' : 'Show'} \"${series.name}\"`\n\t\t\t\t: patch.name !== undefined && Object.keys(patch).length === 1\n\t\t\t\t\t? 'Rename series'\n\t\t\t\t\t: `Change series \"${series.name}\"`;\n\t\tthis.commit(label, spec);\n\t\treturn { ok: true };\n\t}\n\n\ttoggleSeries(id: string): ChartActionResult {\n\t\tconst series = this.getSeries(id);\n\t\tif (!series) return this.unknownSeries(id);\n\t\treturn this.updateSeries(id, { hidden: !series.hidden });\n\t}\n\n\t/** Moves a series to position `to` (drawing and legend order). */\n\tmoveSeries(id: string, to: number): ChartActionResult {\n\t\tconst from = this.spec.series.findIndex((s) => s.id === id);\n\t\tif (from < 0) return this.unknownSeries(id);\n\t\tconst target = Math.max(0, Math.min(this.spec.series.length - 1, to));\n\t\tif (target === from) return { ok: true };\n\t\tthis.commit(\n\t\t\t'Reorder series',\n\t\t\tthis.edited((d) => {\n\t\t\t\tconst [s] = d.series.splice(from, 1);\n\t\t\t\td.series.splice(target, 0, s);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\t/** Inserts a category (with gaps in every series) at `at` (default: the end). Returns its index. */\n\taddCategory(label?: string, options: { at?: number } = {}): { ok: true; index: number } {\n\t\tconst at = Math.max(0, Math.min(this.spec.categories.length, options.at ?? this.spec.categories.length));\n\t\tconst name = label ?? `${this.spec.categories.length + 1}`;\n\t\tthis.commit(\n\t\t\t`Add category \"${name}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories.splice(at, 0, name);\n\t\t\t\tfor (const s of d.series) s.values.splice(at, 0, null);\n\t\t\t}),\n\t\t\t{ kind: 'category', index: at }\n\t\t);\n\t\treturn { ok: true, index: at };\n\t}\n\n\tremoveCategory(index: number): ChartActionResult {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tthis.commit(\n\t\t\t`Delete category \"${this.spec.categories[index]}\"`,\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories.splice(index, 1);\n\t\t\t\tfor (const s of d.series) s.values.splice(index, 1);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\trenameCategory(index: number, label: string): ChartActionResult {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= this.spec.categories.length) return this.badIndex(index);\n\t\tif (this.spec.categories[index] === label) return { ok: true };\n\t\tthis.commit(\n\t\t\t'Rename category',\n\t\t\tthis.edited((d) => {\n\t\t\t\td.categories[index] = String(label);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\tmoveCategory(from: number, to: number): ChartActionResult {\n\t\tif (!Number.isInteger(from) || from < 0 || from >= this.spec.categories.length) return this.badIndex(from);\n\t\tconst target = Math.max(0, Math.min(this.spec.categories.length - 1, to));\n\t\tif (target === from) return { ok: true };\n\t\tconst move = <T>(list: T[]) => {\n\t\t\tconst [item] = list.splice(from, 1);\n\t\t\tlist.splice(target, 0, item);\n\t\t};\n\t\tthis.commit(\n\t\t\t'Reorder categories',\n\t\t\tthis.edited((d) => {\n\t\t\t\tmove(d.categories);\n\t\t\t\tfor (const s of d.series) move(s.values);\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\t/**\n\t * Pastes a block of cells (TSV / CSV text or rows) into the data grid with its top-left at\n\t * `row` (category index) and `column` (series index; `-1` is the category column). The\n\t * grid grows to fit. Non-numeric value cells become gaps and are reported in `issues`.\n\t */\n\tpasteCells(row: number, column: number, cells: string | ReadonlyArray<ReadonlyArray<unknown>>): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst rows: unknown[][] = typeof cells === 'string' ? (cells.includes('\\t') ? parseTsv(cells) : parseCsv(cells)) : cells.map((r) => [...r]);\n\t\tif (!rows.length) return { ok: true };\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst next = this.edited((d) => {\n\t\t\tconst width = Math.max(...rows.map((r) => r.length));\n\t\t\tconst lastSeries = column + width - 1;\n\t\t\twhile (d.series.length <= lastSeries) {\n\t\t\t\tconst id = uniqueChartSeriesId(d.series);\n\t\t\t\td.series.push({ id, name: `Series ${d.series.length + 1}`, values: d.categories.map(() => null) });\n\t\t\t}\n\t\t\tconst lastRow = row + rows.length - 1;\n\t\t\twhile (d.categories.length <= lastRow) {\n\t\t\t\td.categories.push(`${d.categories.length + 1}`);\n\t\t\t\tfor (const s of d.series) s.values.push(null);\n\t\t\t}\n\t\t\trows.forEach((cellsInRow, r) => {\n\t\t\t\tcellsInRow.forEach((cell, c) => {\n\t\t\t\t\tconst col = column + c;\n\t\t\t\t\tconst index = row + r;\n\t\t\t\t\tif (col < 0) d.categories[index] = cell === null || cell === undefined ? '' : String(cell).trim();\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst parsed = parseChartValue(cell);\n\t\t\t\t\t\tif (parsed === undefined) issues.push({ path: `${d.series[col].id}[${index}]`, message: `\"${String(cell)}\" is not a number; it was left blank.` });\n\t\t\t\t\t\td.series[col].values[index] = parsed ?? null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\tthis.commit('Paste cells', next);\n\t\tif (issues.length) {\n\t\t\tthis.issues = issues;\n\t\t\tthis.notify(false);\n\t\t}\n\t\treturn issues.length ? { ok: true, issues } : { ok: true };\n\t}\n\n\t/**\n\t * Replaces the data with a grid of cells (see `chartDataFromTable`): one undo step. Series\n\t * colours and types are kept by name.\n\t */\n\timportTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: ChartTableOptions = {}): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst data = chartDataFromTable(rows, options);\n\t\tif (!data.categories.length || !data.series.length) return this.reject('There is no data to import: expected a header row and at least one row of values.');\n\t\tconst byName = new Map(this.spec.series.map((s) => [s.name, s]));\n\t\tconst series = data.series.map((s) => {\n\t\t\tconst old = byName.get(s.name);\n\t\t\treturn { ...s, ...(old?.color ? { color: old.color } : {}), ...(old?.type ? { type: old.type } : {}), ...(old ? { id: old.id } : {}) };\n\t\t});\n\t\tconst { spec } = normalizeChartSpec({ ...this.spec, categories: data.categories, series });\n\t\tthis.commit('Import data', spec);\n\t\tif (data.issues.length) {\n\t\t\tthis.issues = data.issues;\n\t\t\tthis.notify(false);\n\t\t\treturn { ok: true, issues: data.issues };\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\t/** Imports CSV (or TSV, detected by tabs) text; see `importTable`. */\n\timportCsv(text: string, options: ChartTableOptions & { delimiter?: string } = {}): ChartActionResult & { issues?: ChartIssue[] } {\n\t\tconst delimiter = options.delimiter ?? (text.includes('\\t') ? '\\t' : ',');\n\t\treturn this.importTable(parseCsv(text, { delimiter }), options);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Trendlines\n\t// -------------------------------------------------------------------------\n\n\t/** Adds a trendline to a series and selects it. Returns its index (and the fit, when it can be computed). */\n\taddTrendline(seriesId: string, input: ChartTrendline): { ok: true; index: number; fit: ChartTrendFit | null } | { ok: false; message: string; issues?: ChartIssue[] } {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId) as { ok: false; message: string };\n\t\tif (!chartSupportsTrendlines(this.spec.type, this.spec.stacking))\n\t\t\treturn this.reject(`Trendlines need an unstacked bar, line, area, scatter or bubble chart; this is a ${this.spec.stacking !== 'none' ? `${this.spec.stacking} ` : ''}${this.spec.type} chart.`) as { ok: false; message: string };\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst line = normalizeChartTrendline(input, 'trendline', issues);\n\t\tif (!line || issues.length) return this.reject(issues.map((i) => i.message).join(' ') || 'The trendline is not valid.', issues) as { ok: false; message: string };\n\t\tconst index = series.trendlines?.length ?? 0;\n\t\tconst next = this.edited((d) => {\n\t\t\tconst s = d.series.find((x) => x.id === seriesId)!;\n\t\t\ts.trendlines = [...(s.trendlines ?? []), line];\n\t\t});\n\t\tthis.commit(`Add trendline to \"${series.name}\"`, next, { kind: 'trendline', seriesId, index });\n\t\treturn { ok: true, index, fit: this.trendlineFit(seriesId, index) };\n\t}\n\n\t/** Changes a trendline (all-or-nothing). */\n\tupdateTrendline(seriesId: string, index: number, patch: Partial<ChartTrendline>): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tconst current = series.trendlines?.[index];\n\t\tif (!current) return fail(`\"${series.name}\" has no trendline ${index}; ${series.trendlines?.length ? `expected 0 to ${series.trendlines.length - 1}` : 'it has none yet'}.`);\n\t\tconst issues: ChartIssue[] = [];\n\t\tconst merged: Record<string, unknown> = { ...current, ...patch };\n\t\tfor (const [k, v] of Object.entries(patch)) if (v === null) delete merged[k];\n\t\tconst line = normalizeChartTrendline(merged, 'trendline', issues);\n\t\tif (!line || issues.length) return this.reject(issues.map((i) => i.message).join(' '), issues);\n\t\tthis.commit(\n\t\t\t'Change trendline',\n\t\t\tthis.edited((d) => {\n\t\t\t\td.series.find((x) => x.id === seriesId)!.trendlines![index] = line;\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\tremoveTrendline(seriesId: string, index: number): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tif (!series.trendlines?.[index]) return fail(`\"${series.name}\" has no trendline ${index}.`);\n\t\tthis.commit(\n\t\t\t'Delete trendline',\n\t\t\tthis.edited((d) => {\n\t\t\t\tconst s = d.series.find((x) => x.id === seriesId)!;\n\t\t\t\ts.trendlines = s.trendlines!.filter((_, i) => i !== index);\n\t\t\t\tif (!s.trendlines.length) delete s.trendlines;\n\t\t\t})\n\t\t);\n\t\treturn { ok: true };\n\t}\n\n\t/** The points a series' trendlines are fitted to: (x, y) with x = 1, 2, 3 … on category charts. */\n\ttrendlinePoints(seriesId: string): [number, number][] {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return [];\n\t\tconst xy = chartFamily(this.spec) === 'xy';\n\t\tconst out: [number, number][] = [];\n\t\tseries.values.forEach((v, i) => {\n\t\t\tconst x = xy ? (series.x?.[i] ?? (this.spec.type === 'bubble' ? i + 1 : null)) : i + 1;\n\t\t\tif (v !== null && x !== null && Number.isFinite(v) && Number.isFinite(x)) out.push([x, v]);\n\t\t});\n\t\treturn out;\n\t}\n\n\t/** The fitted coefficients, R² and equation of a trendline (null for moving averages or unfittable data). */\n\ttrendlineFit(seriesId: string, index: number): ChartTrendFit | null {\n\t\tconst line = this.getSeries(seriesId)?.trendlines?.[index];\n\t\tif (!line) return null;\n\t\treturn fitChartTrendline(line, this.trendlinePoints(seriesId));\n\t}\n\n\t/** The moving-average points of a trendline (empty for other kinds). */\n\ttrendlineMovingAverage(seriesId: string, index: number): [number, number][] {\n\t\tconst line = this.getSeries(seriesId)?.trendlines?.[index];\n\t\tif (!line || line.type !== 'moving-average') return [];\n\t\treturn chartMovingAverage(this.trendlinePoints(seriesId), line.period ?? 2);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Reshaping\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Switches rows and columns: series become categories and categories become series (one\n\t * undo step). Series colours, types and other per-series settings are dropped.\n\t */\n\ttranspose(): ChartActionResult {\n\t\tconst s = this.spec;\n\t\tif (!s.series.length || !s.categories.length) return this.reject('There is no data to switch: the chart needs at least one series and one category.');\n\t\tconst used = new Set<string>();\n\t\tconst series: ChartSeries[] = s.categories.map((name, i) => {\n\t\t\tlet id = `series-${i + 1}`;\n\t\t\tfor (let k = i + 2; used.has(id); k++) id = `series-${k}`;\n\t\t\tused.add(id);\n\t\t\treturn { id, name, values: s.series.map((x) => x.values[i] ?? null) };\n\t\t});\n\t\tconst { spec } = normalizeChartSpec({ ...s, categories: s.series.map((x) => x.name), series });\n\t\tthis.commit('Switch rows and columns', spec, null);\n\t\treturn { ok: true };\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Selection and gestures\n\t// -------------------------------------------------------------------------\n\n\t/** Selects a chart element (view state; not an undo step). */\n\tselect(selection: ChartSelection | null): void {\n\t\tconst next = this.validSelection(selection, this.spec);\n\t\tif (sameChartSelection(next, this.selection) || (next === null && this.selection === null)) return;\n\t\tthis.selection = next;\n\t\tthis.notify(false);\n\t}\n\n\t/**\n\t * Deletes what is selected: a series or category is removed, a point becomes a gap, a\n\t * title is cleared, the legend or an axis is hidden.\n\t */\n\tdeleteSelection(): ChartActionResult {\n\t\tconst sel = this.selection;\n\t\tif (!sel) return fail('Nothing is selected.');\n\t\tswitch (sel.kind) {\n\t\t\tcase 'series':\n\t\t\t\treturn this.removeSeries(sel.seriesId);\n\t\t\tcase 'category':\n\t\t\t\treturn this.removeCategory(sel.index);\n\t\t\tcase 'point':\n\t\t\t\treturn this.setValue(sel.seriesId, sel.index, null, { label: 'Clear value' });\n\t\t\tcase 'title':\n\t\t\t\treturn this.setTitle('');\n\t\t\tcase 'subtitle':\n\t\t\t\treturn this.setSubtitle('');\n\t\t\tcase 'legend':\n\t\t\t\treturn this.setLegend({ show: false });\n\t\t\tcase 'axis':\n\t\t\t\treturn this.setAxis(sel.axis, { show: false });\n\t\t\tcase 'trendline':\n\t\t\t\treturn this.removeTrendline(sel.seriesId, sel.index);\n\t\t\tdefault:\n\t\t\t\treturn fail('The chart itself cannot be deleted.');\n\t\t}\n\t}\n\n\t/** Adds `delta` to a value (a gap counts as 0). */\n\tnudgeValue(seriesId: string, index: number, delta: number): ChartActionResult {\n\t\tconst series = this.getSeries(seriesId);\n\t\tif (!series) return this.unknownSeries(seriesId);\n\t\tconst current = series.values[index] ?? 0;\n\t\treturn this.setValue(seriesId, index, Number((current + delta).toPrecision(12)), { label: `Edit ${series.name} · ${this.spec.categories[index] ?? index}` });\n\t}\n\n\t/** Starts a continuous edit (a drag): every change until `endGesture()` is one undo step. */\n\tbeginGesture(key: string): void {\n\t\tif (this.gestureKey === key) return;\n\t\tthis.history.endGesture();\n\t\tthis.gestureKey = key;\n\t\tthis.gestureCount++;\n\t\tthis.gestureStart = { spec: this.spec, mark: this.history.mark() };\n\t\tthis.notify(false);\n\t}\n\n\t/**\n\t * Cancels the gesture in progress (Escape during a drag): everything it changed is taken\n\t * back and leaves no undo or redo step.\n\t */\n\tcancelGesture(): void {\n\t\tif (this.gestureKey === null) return;\n\t\tconst start = this.gestureStart;\n\t\tthis.gestureKey = null;\n\t\tthis.gestureStart = null;\n\t\tthis.history.endGesture();\n\t\tif (start) this.history.revertTo(start.mark);\n\t\tthis.notify(false);\n\t}\n\n\tendGesture(): void {\n\t\tif (this.gestureKey === null) return;\n\t\tthis.gestureKey = null;\n\t\tthis.history.endGesture();\n\t\t// A drag that ends where it started leaves no undo step behind.\n\t\tconst start = this.gestureStart;\n\t\tthis.gestureStart = null;\n\t\tif (start && sameChartJson(start.spec, this.spec)) this.history.revertTo(start.mark);\n\t\tthis.notify(false);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Persistence and history\n\t// -------------------------------------------------------------------------\n\n\t/** The spec, for saving (a copy). */\n\ttoJSON(): ChartSpec {\n\t\treturn cloneChartSpec(this.spec);\n\t}\n\n\t/**\n\t * Replaces the chart without an undo step (e.g. when opening a document). Problems are\n\t * fixed with defaults and reported in `state.issues` (and returned).\n\t */\n\tload(input: unknown, options: { clearHistory?: boolean } = {}): ChartIssue[] {\n\t\tconst { spec, issues } = normalizeChartSpec(input);\n\t\tthis.spec = spec;\n\t\tthis.issues = issues;\n\t\tthis.selection = this.validSelection(this.selection, spec);\n\t\tif (options.clearHistory) {\n\t\t\tthis.applying = true;\n\t\t\ttry {\n\t\t\t\tthis.history.clear();\n\t\t\t} finally {\n\t\t\t\tthis.applying = false;\n\t\t\t}\n\t\t}\n\t\tthis.notify(true);\n\t\treturn issues;\n\t}\n\n\tundo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.redo();\n\t}\n\n\t/** Stops listening to the history (reconnected by the next `subscribe`). */\n\tdestroy(): void {\n\t\tthis.unsubscribeHistory?.();\n\t\tthis.unsubscribeHistory = undefined;\n\t\tthis.listeners.clear();\n\t}\n}\n\nexport function createChartController(options: ChartControllerOptions = {}): ChartController {\n\treturn new ChartController(options);\n}\n\nfunction updateLabel(patch: ChartSpecPatch): string {\n\tconst keys = Object.keys(patch);\n\tif (keys.length !== 1) return 'Change chart';\n\tconst labels: Record<string, string> = {\n\t\ttype: 'Change chart type',\n\t\ttitle: 'Edit title',\n\t\tsubtitle: 'Edit subtitle',\n\t\tcategories: 'Edit categories',\n\t\tseries: 'Edit series',\n\t\txAxis: 'Change category axis',\n\t\tyAxis: 'Change value axis',\n\t\tyAxis2: 'Change secondary value axis',\n\t\tlabelPosition: 'Change label position',\n\t\tgapWidth: 'Change bar spacing',\n\t\toverlap: 'Change bar overlap',\n\t\tbins: 'Change histogram bins',\n\t\tshowTotal: 'Toggle waterfall total',\n\t\tlegend: 'Change legend',\n\t\tstacking: 'Change stacking',\n\t\torientation: 'Change orientation',\n\t\tcurve: 'Change line style',\n\t\tpoints: 'Toggle points',\n\t\tdataLabels: 'Toggle data labels',\n\t\tpalette: 'Change colours',\n\t\tinnerRadius: 'Change donut hole'\n\t};\n\treturn labels[keys[0]] ?? 'Change chart';\n}\n","// Ported from gridcraft-main/crates/chart/src/sparkline.rs (MIT OR Apache-2.0, © ArtCraft Team and\n// contributors). See THIRD_PARTY_NOTICES.md.\nimport { r2 } from './layout-shared.js';\nimport { chartSceneToSvg } from './svg.js';\nimport { DEFAULT_CHART_THEME } from './spec.js';\nimport type { ChartMark, ChartScene, ChartValue } from './types.js';\n\nexport type ChartSparklineKind = 'line' | 'column' | 'win-loss';\n\nexport interface ChartSparklineOptions {\n\tkind?: ChartSparklineKind;\n\twidth: number;\n\theight: number;\n\t/** Line, positive column and win colour (default the first palette colour). */\n\tcolor?: string;\n\t/** Negative column and loss colour (default red). */\n\tnegativeColor?: string;\n\t/** Dots on every line point (thinned past 500). */\n\tmarkers?: boolean;\n\t/** Highlight the highest and lowest point of a line (or column). */\n\thighLow?: boolean;\n\t/** Fixed value range (default: the data, including 0 for columns). */\n\tmin?: number;\n\tmax?: number;\n}\n\nconst MAX_POINTS = 100_000;\n\n/**\n * Lays out a word-sized chart (a sparkline) as marks: a line broken at gaps, columns\n * (negatives in `negativeColor`) or win/loss bars of equal height. Long lines are thinned past\n * 4000 points. Returns a scene with no axes, legend or targets.\n */\nexport function layoutSparkline(values: readonly ChartValue[], options: ChartSparklineOptions): ChartScene {\n\tconst kind = options.kind ?? 'line';\n\tconst w = Number.isFinite(options.width) ? Math.max(1, options.width) : 1;\n\tconst h = Number.isFinite(options.height) ? Math.max(1, options.height) : 1;\n\tconst color = options.color ?? '#4269d0';\n\tconst negative = options.negativeColor ?? '#e5484d';\n\tconst theme = { ...DEFAULT_CHART_THEME, background: 'transparent' };\n\tconst marks: ChartMark[] = [];\n\tconst scene: ChartScene = { width: w, height: h, plot: { x: 0, y: 0, width: w, height: h }, marks, percent: false, theme, warnings: [] };\n\tconst vals = values.slice(0, MAX_POINTS).map((v) => (v !== null && Number.isFinite(v) ? Math.max(-1e300, Math.min(1e300, v)) : null));\n\tconst n = vals.length;\n\tif (!n) return scene;\n\tconst pad = Math.max(0.5, Math.min(2, h * 0.1));\n\tconst x0 = pad;\n\tconst y0 = pad;\n\tconst iw = Math.max(0.5, w - 2 * pad);\n\tconst ih = Math.max(0.5, h - 2 * pad);\n\tlet lo = Infinity;\n\tlet hi = -Infinity;\n\tfor (const v of vals) if (v !== null) (lo = Math.min(lo, v)), (hi = Math.max(hi, v));\n\tif (!Number.isFinite(lo)) return scene;\n\tif (options.min !== undefined && Number.isFinite(options.min)) lo = options.min;\n\tif (options.max !== undefined && Number.isFinite(options.max)) hi = options.max;\n\tlet hiAt = -1;\n\tlet loAt = -1;\n\tvals.forEach((v, i) => {\n\t\tif (v === null) return;\n\t\tif (hiAt < 0 || v > vals[hiAt]!) hiAt = i;\n\t\tif (loAt < 0 || v < vals[loAt]!) loAt = i;\n\t});\n\tif (kind === 'line') {\n\t\tconst span = hi - lo;\n\t\tconst fy = (v: number) => y0 + ih - (span > 0 ? (v - lo) / span : 0.5) * ih;\n\t\tconst fx = (j: number) => (n > 1 ? x0 + (j / (n - 1)) * iw : x0 + iw / 2);\n\t\tlet d = '';\n\t\tlet run: [number, number][] = [];\n\t\tconst flush = () => {\n\t\t\tif (run.length >= 2) {\n\t\t\t\tconst pts = run.length > 4000 ? run.filter((_, i) => i % (Math.floor(run.length / 2000) + 1) === 0) : run;\n\t\t\t\td += pts.map(([x, y], i) => `${i ? 'L' : 'M'}${r2(x)},${r2(y)}`).join('');\n\t\t\t}\n\t\t\trun = [];\n\t\t};\n\t\tvals.forEach((v, j) => (v === null ? flush() : run.push([fx(j), fy(v)])));\n\t\tflush();\n\t\tif (d) marks.push({ kind: 'path', key: 'sparkline', role: 'line', d, fill: 'none', stroke: color, strokeWidth: 1.25 });\n\t\tconst r = Math.max(1, Math.min(3, h * 0.08));\n\t\tif (options.markers || n === 1) {\n\t\t\tconst step = Math.max(1, Math.floor(n / 500));\n\t\t\tvals.forEach((v, j) => {\n\t\t\t\tif (v !== null && j % step === 0) marks.push({ kind: 'circle', key: `point-${j}`, role: 'point', cx: fx(j), cy: fy(v), r, fill: color });\n\t\t\t});\n\t\t}\n\t\tif (options.highLow && n > 1) {\n\t\t\tif (hiAt >= 0) marks.push({ kind: 'circle', key: 'high', role: 'point', cx: fx(hiAt), cy: fy(vals[hiAt]!), r: r + 0.5, fill: color });\n\t\t\tif (loAt >= 0 && loAt !== hiAt) marks.push({ kind: 'circle', key: 'low', role: 'point', cx: fx(loAt), cy: fy(vals[loAt]!), r: r + 0.5, fill: negative });\n\t\t}\n\t\treturn scene;\n\t}\n\tconst slot = iw / n;\n\tconst bw = Math.max(0.25, slot * 0.8);\n\tconst win = kind === 'win-loss';\n\tconst lo0 = win ? -1 : Math.min(lo, 0);\n\tconst hi0 = win ? 1 : Math.max(hi, 0);\n\tconst span = hi0 - lo0;\n\tconst fy = (v: number) => (span > 0 ? y0 + ih - ((v - lo0) / span) * ih : y0 + ih);\n\tconst base = fy(0);\n\tvals.forEach((raw, j) => {\n\t\tif (raw === null) return;\n\t\tconst v = win ? Math.sign(raw) : raw;\n\t\tif (win && v === 0) return;\n\t\tconst top = fy(v);\n\t\tconst highlight = options.highLow && !win && (j === hiAt || j === loAt);\n\t\tmarks.push({ kind: 'rect', key: `bar-${j}`, role: 'bar', x: x0 + j * slot + (slot - bw) / 2, y: Math.min(top, base), width: bw, height: Math.max(0.5, Math.abs(top - base)), fill: v < 0 ? negative : color, opacity: options.highLow && !win && !highlight ? 0.6 : undefined });\n\t});\n\treturn scene;\n}\n\n/** A sparkline as a standalone SVG string (e.g. for an inline image in rich text). */\nexport function sparklineToSvg(values: readonly ChartValue[], options: ChartSparklineOptions & { ariaLabel?: string }): string {\n\treturn chartSceneToSvg(layoutSparkline(values, options), { ariaLabel: options.ariaLabel });\n}\n"],"mappings":"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","names":["attrs","span","fy"]}
|