mayacharts 0.1.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/LICENSE +21 -0
- package/README.md +619 -0
- package/dist/core/a11y.d.ts +10 -0
- package/dist/core/format.d.ts +2 -0
- package/dist/core/layout.d.ts +22 -0
- package/dist/core/marks/bar.d.ts +2 -0
- package/dist/core/marks/dumbbell.d.ts +3 -0
- package/dist/core/marks/heatmap.d.ts +3 -0
- package/dist/core/marks/kpi.d.ts +2 -0
- package/dist/core/marks/line.d.ts +4 -0
- package/dist/core/marks/scatter.d.ts +2 -0
- package/dist/core/registry.d.ts +13 -0
- package/dist/core/render.d.ts +8 -0
- package/dist/core/scale.d.ts +3 -0
- package/dist/core/shape.d.ts +14 -0
- package/dist/core/strings.d.ts +37 -0
- package/dist/core/svg.d.ts +13 -0
- package/dist/core/ticks.d.ts +2 -0
- package/dist/core/types.d.ts +424 -0
- package/dist/core/validate.d.ts +24 -0
- package/dist/element/animate.d.ts +13 -0
- package/dist/element/drill.d.ts +12 -0
- package/dist/element/html.d.ts +1 -0
- package/dist/element/maya-chart.d.ts +21 -0
- package/dist/element/measure.d.ts +9 -0
- package/dist/element/select.d.ts +14 -0
- package/dist/element/tooltip.d.ts +10 -0
- package/dist/element/zoom.d.ts +11 -0
- package/dist/element.d.ts +15 -0
- package/dist/element.js +4 -0
- package/dist/element.js.map +1 -0
- package/dist/flow.d.ts +3 -0
- package/dist/flow.js +3 -0
- package/dist/flow.js.map +1 -0
- package/dist/geo.d.ts +3 -0
- package/dist/geo.js +3 -0
- package/dist/geo.js.map +1 -0
- package/dist/global.d.ts +4 -0
- package/dist/hierarchy.d.ts +15 -0
- package/dist/hierarchy.js +3 -0
- package/dist/hierarchy.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/maya.global.js +4 -0
- package/dist/maya.global.js.map +1 -0
- package/dist/styles/theme.d.ts +1 -0
- package/dist/theme.css +1 -0
- package/llms.txt +102 -0
- package/package.json +105 -0
- package/schema.json +381 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["w","draw","S","css","css","TEXT","args","spec","key","i","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","OTHER","parts","p","hit","gw","gh","w","h","d","x","y","titleText","ROWS","CAP","describe","ti","f","noun","shaped","lo","hi","fmt","dataTable","cell","tn","tone","cap","rows","cols","row","keys","j","by","decimals","DATE_KEYS","DATE_PRESETS","formatter","field","step","e","locale","prefix","suffix","date","num","preset","opts","o","out","t","bandScale","domain","span","range","padInner","padOuter","start","linearScale","d0","d1","r0","r1","clean","niceTicks","max","min","base","target","best","cross","m","score","values","wide","tw","ch","w$1","maxW","clip","ticks","fixed","tk","frame","bx","ly","ry","W","H","size","bt","lt","bLab","lFull","lLab","rt","rTitle","yTitle","xTitle","left","bottom","plot","y2","grid","x2","ay","b","every","cy","tx","ax","ty","both","band","agg","acc","kind","shape","series","si","ci","sk","cat","reduce","rs","reduce2","cats","total","top","other","wf","spans","run","window","i1","i0","visible","hidden","cells","pos","neg","value","y0","y1","colorVals","cb","ser","steps","items","bar","val","v2","ctx","hz","inner","cvOf","marks","hits","th","len","cname","cv","text","est","cx","f2","slot","name","gap","dots","px","py","dumbbell","rad","pairs","links","mid","at","from","to","x1","ox","oy","down","side","heatmap","q","col","legend","PAD","draw$1","live","last","period","fs","payload","labels","prev","pct","vs","kpi","axes","draw","areas","lines","runs","fill","sh","line","area","MIN","points","xd","yd","sv","nv","scatter","x0","sx","sy","pts","scale","seen","id","VERSION","KEY","MODULES","CORE_TYPES","MODULE_OF","types","D","N","rng","S$1","Q","C","B","css$1","MayaSpecError","message","code","path","S","KEYS","CART","PATH","CPA","PTH","ONLY","AGGS","PRESETS","DATE","isDateOpts","TOKENS","USE","HORIZ","SIZED","PIE","GEO","EX","HINTS","ALIAS","FN","FAM","FONT","own","isObj","strs","show","dym","l","fail","headline","bad","want","css","ok","font","bFmt","format","dt","CHECKS","validateSpec","type","known","str","mod","isPath","need","pth","\"path\"","missing","colors","entries","theme","cart","colorBy","select","detail","found","unk","use","ys","arr","fields","opt","scan","g","numeric","validateOptions","unknown","inv","sel","vk","win","measure","drill","nonce","resolve","measures","view","full","drilled","CORE","kebab","build","mark","fmts","toneText","boxes","label","place","tp","markLegend","body","vars","style","svg","sheet","renderParts","render","shellInner","st","project","keep","renderShell","json"],"sources":["../src/core/strings.ts","../src/core/svg.ts","../src/core/a11y.ts","../src/core/format.ts","../src/core/scale.ts","../src/core/ticks.ts","../src/core/layout.ts","../src/core/shape.ts","../src/core/marks/bar.ts","../src/core/marks/dumbbell.ts","../src/core/marks/heatmap.ts","../src/core/marks/kpi.ts","../src/core/marks/line.ts","../src/core/marks/scatter.ts","../src/core/registry.ts","../src/styles/theme.ts","../src/core/validate.ts","../src/core/render.ts"],"sourcesContent":["/*\n * Every user-visible string the library writes (SVG, table, live region, controls).\n * `spec.text` overrides any key; `{0}`, `{1}`… are positional placeholders.\n */\nexport const TEXT = {\n noData: \"No data\",\n other: \"Other\",\n back: \"Back\",\n reset: \"Reset zoom\",\n /** Live region after a measure toggle: {0} = measure title. */\n showing: \"Showing {0}\",\n /** Live region after drill: {0} = branch path joined with \" / \". */\n drilledInto: \"Drilled into {0}\",\n /** Live region after zoom: {0}, {1} = first and last category (or range ends). */\n zoomedTo: \"Zoomed to {0} – {1}\",\n /** Live region after selection: {0} = count. */\n selected: \"{0} selected\",\n selectionCleared: \"Selection cleared\",\n /** Auto description: {0} = noun, {1} = y title, {2} = x title. */\n chartOf: \"{0} chart of {1} by {2}\",\n /** Table caption when rows are capped: {0} = shown, {1} = total. */\n firstOf: \"First {0} of {1} rows\",\n /** aria-label of the measure radiogroup. */\n measures: \"Measure\",\n /** aria-label of the breadcrumb nav. */\n crumbs: \"Drill path\",\n /** Tone text (never colour alone): colorBy \"sign\" and { target }. */\n positive: \"positive\",\n negative: \"negative\",\n above: \"above target\",\n below: \"below target\",\n /** kpi delta: {0} = signed change, {1} = previous period. */\n vs: \"{0} vs {1}\",\n /** kpi bullet: {0} = share of target, {1} = target. */\n ofTarget: \"{0} of target {1}\",\n} as const;\n\nexport type TextKey = keyof typeof TEXT;\n\n/** Localised string for `key` with `{n}` placeholders filled from `args`. */\nexport function t(\n spec: { text?: Partial<Record<TextKey, string>> | undefined },\n key: TextKey,\n ...args: (string | number)[]\n): string {\n const own = spec.text && Object.hasOwn(spec.text, key) ? spec.text[key] : undefined;\n return (own ?? TEXT[key]).replace(/\\{(\\d)\\}/g, (_, i: string) => String(args[+i] ?? \"\"));\n}\n","const ESC: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","import { t } from \"./strings.ts\";\nimport { esc } from \"./svg.ts\";\nimport type { ResolvedSpec, Shaped } from \"./types.ts\";\n\nexport const titleText = (spec: ResolvedSpec): string =>\n spec.title ??\n `${spec.titles.get(spec.y) ?? spec.y} by ${spec.titles.get(spec.x) ?? (spec.x || spec.path.join(\" / \"))}`;\n\n/** Types whose a11y table lists the raw rows (no category x series grid). */\nconst ROWS = [\"scatter\", \"treemap\", \"sunburst\", \"sankey\", \"hexmap\"];\nconst CAP = 1000;\n\nexport type Fmt = (field: string, v: unknown, step?: number) => string;\n\nexport function describe(spec: ResolvedSpec, shaped: Shaped, fmt: Fmt, noun: string): string {\n if (spec.description !== null) return spec.description;\n const ti = (f: string) => spec.titles.get(f) ?? f;\n let s = t(spec, \"chartOf\", noun, ti(spec.y), spec.x ? ti(spec.x) : spec.path.join(\" / \"));\n if (spec.series !== null && shaped.series.length)\n s += `, ${spec.stack ? \"stacked\" : \"grouped\"} by ${ti(spec.series)} (${shaped.series.join(\", \")})`;\n if (ROWS.includes(spec.type)) return `${s}. ${spec.data.length} rows.`;\n // Reduce loops: Math.min(...v) throws RangeError past ~65k values.\n let n = 0;\n let lo = Infinity;\n let hi = -Infinity;\n for (const c of shaped.cells)\n if (c.value !== null) (n++, (lo = Math.min(lo, c.value)), (hi = Math.max(hi, c.value)));\n const f = (v: number) => fmt(spec.y, v);\n if (!n) return s + \". No data.\";\n return n === 1 ? `${s}. 1 value: ${f(lo)}.` : `${s}. ${n} values from ${f(lo)} to ${f(hi)}.`;\n}\n\n/**\n * Visually hidden table. Cartesian/heatmap: category rows x series columns. Scatter and path\n * types: the raw rows, only the encoded fields. Capped at 1000 rows. `tone` returns the tone\n * word for a value (never colour alone) or null.\n */\nexport function dataTable(\n spec: ResolvedSpec,\n shaped: Shaped,\n fmt: Fmt,\n tone: (v: number) => string | null,\n): string {\n const ti = (f: string) => spec.titles.get(f) ?? f;\n const cell = (f: string, v: unknown) => {\n if (v == null) return \"\";\n const tn = f === spec.y && typeof v === \"number\" ? tone(v) : null;\n return esc(fmt(f, v)) + (tn ? ` (${esc(tn)})` : \"\");\n };\n const cap = (n: number) => (n > CAP ? t(spec, \"firstOf\", CAP, n) : titleText(spec));\n let h: string;\n let rows: string;\n let n: number;\n if (ROWS.includes(spec.type)) {\n const cols = [\n ...new Set(\n [\n spec.x,\n ...spec.path,\n spec.series,\n spec.name,\n spec.size,\n spec.y,\n typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null,\n ].filter((f): f is string => !!f),\n ),\n ];\n n = spec.data.length;\n h = cols.map((f) => `<th>${esc(ti(f))}</th>`).join(\"\");\n rows = spec.data\n .slice(0, CAP)\n .map((row) => `<tr>${cols.map((f) => `<td>${cell(f, row[f])}</td>`).join(\"\")}</tr>`)\n .join(\"\");\n } else {\n const keys = spec.series === null ? [ti(spec.y)] : shaped.visible.map((j) => shaped.series[j]!);\n n = shaped.categories.length;\n h = `<th>${esc(ti(spec.x))}</th>` + keys.map((k) => `<th>${esc(k)}</th>`).join(\"\");\n const by = new Map(shaped.cells.map((c) => [c.ci + \",\" + c.si, c.value]));\n rows = \"\";\n for (let i = 0; i < Math.min(n, CAP); i++) {\n rows += `<tr><th scope=\"row\">${esc(shaped.categories[i]!)}</th>`;\n for (const j of shaped.visible) rows += `<td>${cell(spec.y, by.get(i + \",\" + j))}</td>`;\n rows += \"</tr>\";\n }\n }\n return `<table class=\"maya-sr\"><caption>${esc(cap(n))}</caption><thead><tr>${h}</tr></thead><tbody>${rows}</tbody></table>`;\n}\n","import type { FieldFormat, ResolvedSpec } from \"./types.ts\";\n\nconst decimals = (s: number) => {\n for (let d = 0; d < 8; d++) if (Math.abs(s * 10 ** d - Math.round(s * 10 ** d)) < 1e-9) return d;\n return 8;\n};\n\nconst DATE_KEYS =\n \"year month day hour minute second weekday era timeZone dateStyle timeStyle fractionalSecondDigits hour12 dayPeriod timeZoneName\".split(\n \" \",\n );\nconst DATE_PRESETS: Record<string, Intl.DateTimeFormatOptions> = {\n date: { dateStyle: \"medium\" },\n month: { month: \"short\", year: \"numeric\" },\n year: { year: \"numeric\" },\n time: { timeStyle: \"short\" },\n datetime: { dateStyle: \"medium\", timeStyle: \"short\" },\n};\n\nexport function formatter(\n s: ResolvedSpec,\n field: string | number = s.y,\n step?: number,\n): (v: unknown) => string {\n if (typeof field === \"number\") [field, step] = [s.y, field]; // T0-era formatter(spec, step)\n const e: FieldFormat | undefined = s.format.get(field);\n const locale = Intl.NumberFormat.supportedLocalesOf(s.locale).length ? s.locale : \"en-US\";\n const d = step === undefined ? 2 : decimals(step);\n let prefix = \"\";\n let suffix = \"\";\n let date: Intl.DateTimeFormat | null = null;\n let num: Intl.NumberFormat | null = null;\n const preset = typeof e === \"string\" ? e : \"auto\";\n if (typeof e === \"string\" && Object.hasOwn(DATE_PRESETS, e)) {\n date = new Intl.DateTimeFormat(locale, { timeZone: \"UTC\", ...DATE_PRESETS[e] });\n } else if (typeof e === \"object\" && e !== null) {\n const { prefix: p = \"\", suffix: x = \"\", ...opts } = e as Record<string, unknown>;\n [prefix, suffix] = [String(p), String(x)];\n if (DATE_KEYS.some((k) => Object.hasOwn(opts, k)))\n date = new Intl.DateTimeFormat(locale, {\n timeZone: \"UTC\",\n ...opts,\n } as Intl.DateTimeFormatOptions);\n else num = new Intl.NumberFormat(locale, opts as Intl.NumberFormatOptions);\n }\n if (!date && !num) {\n const o: Intl.NumberFormatOptions =\n preset === \"integer\"\n ? { maximumFractionDigits: 0 }\n : preset === \"decimal\"\n ? { minimumFractionDigits: 2, maximumFractionDigits: 2 }\n : preset === \"compact\"\n ? { notation: \"compact\", maximumFractionDigits: 1 }\n : preset === \"percent\"\n ? {\n style: \"percent\",\n minimumFractionDigits: Math.max(0, d - 2),\n maximumFractionDigits: Math.max(1, d - 2),\n }\n : preset === \"currency\"\n ? {\n style: \"currency\",\n currency: s.currency,\n minimumFractionDigits: step !== undefined && step >= 1 ? 0 : d,\n maximumFractionDigits: step !== undefined && step >= 1 ? 0 : Math.max(d, 2),\n }\n : { maximumFractionDigits: Math.max(d, 2) };\n num = new Intl.NumberFormat(locale, o);\n }\n return (v) => {\n if (v == null) return \"\";\n let out: string;\n if (date) {\n // Band categories arrive as strings: \"1735689600000\" is epoch ms, not a date string.\n const t =\n typeof v === \"string\" && /^-?\\d+$/.test(v)\n ? new Date(+v)\n : typeof v === \"number\" || typeof v === \"string\" || v instanceof Date\n ? new Date(v)\n : NaN;\n out = Number.isNaN(+t) ? String(v) : date.format(t);\n } else out = typeof v === \"number\" ? num!.format(v) : String(v);\n return prefix + out + suffix;\n };\n}\n","import type { BandScale, LinearScale } from \"./types.ts\";\n\nexport function bandScale(\n domain: readonly string[],\n range: readonly [number, number],\n padInner = 0.2,\n padOuter = 0.1,\n): BandScale {\n const n = domain.length;\n const span = range[1] - range[0];\n const step = span / (n - padInner + padOuter * 2) || 1;\n const start = range[0] + (span - step * (n - padInner)) / 2;\n return { domain, step, bandwidth: step * (1 - padInner), at: (i) => start + step * i };\n}\n\nexport function linearScale(\n domain: readonly [number, number],\n range: readonly [number, number],\n): LinearScale {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n const k = d1 === d0 ? 0 : (r1 - r0) / (d1 - d0);\n return { domain, range, of: (v) => (d1 === d0 ? (r0 + r1) / 2 : r0 + (v - d0) * k) };\n}\n","import type { Ticks } from \"./types.ts\";\n\nconst clean = (n: number) => parseFloat(n.toPrecision(12));\n\nexport function niceTicks(min: number, max: number, target = 5): Ticks {\n if (max === min) {\n [min, max] = min === 0 ? [0, 1] : [min - 1, max + 1];\n }\n const base = 10 ** Math.floor(Math.log10((max - min) / target));\n let step = base;\n let best = Infinity;\n // Crossing zero, a coarse step pads the short side by a whole step (stacked negatives\n // reaching -200 for -40), so take the tightest domain with up to target + 3 ticks instead.\n const cross = min < 0 && max > 0;\n for (const m of [1, 2, 2.5, 5, 10]) {\n const s = base * m;\n const lo = Math.floor(min / s + 1e-9);\n const n = Math.ceil(max / s - 1e-9) - lo + 1;\n const score = cross\n ? n > target + 3\n ? Infinity\n : (n - 1 + Math.abs(n - target) / 1e3) * s\n : Math.abs(n - target);\n if (score < best - 1e-9 * Math.abs(score)) {\n best = score;\n step = s;\n }\n }\n const lo = Math.floor(min / step + 1e-9);\n const hi = Math.ceil(max / step - 1e-9);\n const values: number[] = [];\n for (let i = lo; i <= hi; i++) values.push(clean(i * step));\n return { domain: [clean(lo * step), clean(hi * step)], values, step: clean(step) };\n}\n","import { bandScale, linearScale } from \"./scale.ts\";\nimport { el, esc, r } from \"./svg.ts\";\nimport { niceTicks } from \"./ticks.ts\";\nimport type { Axis, Box, LinearScale, ResolvedSpec, Scale } from \"./types.ts\";\n\nconst wide = (c: number) =>\n (c >= 0x1100 && c <= 0x115f) ||\n (c >= 0x2e80 && c <= 0xa4cf) ||\n (c >= 0xac00 && c <= 0xd7a3) ||\n (c >= 0xf900 && c <= 0xfaff) ||\n (c >= 0xfe30 && c <= 0xfe4f) ||\n (c >= 0xff00 && c <= 0xff60) ||\n (c >= 0xffe0 && c <= 0xffe6);\n\n// ponytail: no text measurement in Node; 0.6 em per code point, 1 em for East-Asian-wide ones.\nconst tw = (s: string) => {\n let n = 0;\n let k = 0;\n for (const ch of s) wide(ch.codePointAt(0)!) ? k++ : n++;\n return n * 7.2 + k * 12;\n};\nconst w = (s: string) => tw(s) + 8;\nconst maxW = (a: readonly string[]) => a.reduce((m, s) => Math.max(m, w(s)), 0);\n\n/** Cut `s` to `max` px (by code point), ending in an ellipsis. */\nfunction clip(s: string, max: number): string {\n if (tw(s) <= max) return s;\n let o = \"\";\n let n = 0;\n for (const ch of s) {\n n += tw(ch);\n if (n + 7.2 > max) break;\n o += ch;\n }\n return o + \"…\";\n}\n\nexport interface Frame {\n plot: Box;\n /** Bottom and left scales; null when the mark has no such axis. */\n x: Scale | null;\n y: Scale | null;\n /** Right linear scale (third axis); null when the mark asks for none. */\n y2: LinearScale | null;\n grid: string;\n /** Inner markup of the axis-y and axis-x groups. */\n ay: string;\n ax: string;\n /** svg attributes: data-plot, data-n | data-xd + data-yd. */\n attrs: Record<string, string | number | null>;\n}\n\ntype Fmt = (field: string, v: unknown, step?: number) => string;\n\n/** Ticks of a linear axis; an explicit domain (yDomain, xDomain) replaces the nice one. */\nfunction ticks(spec: ResolvedSpec, a: Extract<NonNullable<Axis>, { kind: \"linear\" }>, fmt: Fmt) {\n const fixed = (a.field === spec.y ? spec.yDomain : spec.xDomain) ?? null;\n const [lo, hi] = fixed ?? a.domain;\n const tk = niceTicks(lo, hi);\n const values = fixed ? tk.values.filter((v) => v >= lo && v <= hi) : tk.values;\n return {\n domain: fixed ?? tk.domain,\n values,\n labels: values.map((v) => fmt(a.field, v, tk.step)),\n };\n}\n\n/** Axes, grid, plot box and scales for the two axes a mark asks for. */\nexport function frame(\n spec: ResolvedSpec,\n [bx, ly, ry]: [Axis, Axis, Axis?],\n size: { width: number; height: number },\n fmt: Fmt,\n): Frame {\n const { width: W, height: H } = size;\n const bt = bx && bx.kind === \"linear\" ? ticks(spec, bx, fmt) : null;\n const lt = ly && ly.kind === \"linear\" ? ticks(spec, ly, fmt) : null;\n // Band labels go through the field's format (month presets on x); left ones are cut at 40%.\n const bLab = bx && !bt ? (bx.domain as readonly string[]).map((c) => fmt(bx.field, c)) : [];\n const lFull = ly && !lt ? (ly.domain as readonly string[]).map((c) => fmt(ly.field, c)) : [];\n const lLab = lt ? lt.labels : lFull.map((c) => clip(c, W * 0.4 - 8));\n const rt = ry && ry.kind === \"linear\" ? ticks(spec, ry, fmt) : null;\n const rTitle = rt && ry && spec.titles.get(ry.field);\n const yTitle = ly && spec.titles.get(ly.field);\n const xTitle = bx && spec.titles.get(bx.field);\n const left = (spec.yAxis && ly ? maxW(lLab) + 10 : 8) + (yTitle ? 18 : 0);\n const bottom = (spec.xAxis && bx ? 24 : 8) + (xTitle ? 18 : 0);\n const plot = {\n x: left,\n y: 10,\n // Room for half of the last bottom tick label, which is centred on the plot's right edge.\n w: Math.max(\n 1,\n W -\n left -\n (rt\n ? (spec.yAxis ? maxW(rt.labels) + 4 : 8) + (rTitle ? 18 : 0)\n : Math.max(12, bt ? tw(bt.labels.at(-1) ?? \"\") / 2 + 2 : 0)),\n ),\n h: Math.max(1, H - 10 - bottom),\n };\n const x: Scale | null = bx\n ? bx.kind === \"band\"\n ? bandScale(bx.domain, [plot.x, plot.x + plot.w])\n : linearScale(bt!.domain, [plot.x, plot.x + plot.w])\n : null;\n const y: Scale | null = ly\n ? ly.kind === \"band\"\n ? bandScale(ly.domain, [plot.y, plot.y + plot.h])\n : linearScale(lt!.domain, [plot.y + plot.h, plot.y])\n : null;\n\n const y2 = rt ? linearScale(rt.domain, [plot.y + plot.h, plot.y]) : null;\n\n // Grid is perpendicular to each linear axis: one linear = value axis; two = both; none = none.\n let grid = \"\";\n if (spec.grid) {\n const x2 = r(plot.x + plot.w);\n if (lt)\n for (const v of lt.values) {\n const p = r((y as { of(v: number): number }).of(v));\n grid += el(\"line\", { x1: r(plot.x), x2, y1: p, y2: p });\n }\n if (bt)\n for (const v of bt.values) {\n const p = r((x as { of(v: number): number }).of(v));\n grid += el(\"line\", { x1: p, x2: p, y1: r(plot.y), y2: r(plot.y + plot.h) });\n }\n }\n\n let ay = \"\";\n if (spec.yAxis && ly) {\n if (lt)\n lt.values.forEach((v, i) => {\n ay += el(\n \"text\",\n {\n x: r(plot.x - 6),\n y: r((y as { of(v: number): number }).of(v)),\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n },\n esc(lt.labels[i]!),\n );\n });\n else {\n const b = y as { at(i: number): number; bandwidth: number };\n const every = Math.max(1, Math.ceil(14 / (plot.h / Math.max(1, ly.domain.length))));\n lFull.forEach((c, i) => {\n if (i % every) return;\n const t = lLab[i]!;\n ay += el(\n \"text\",\n {\n x: r(plot.x - 6),\n y: r(b.at(i) + b.bandwidth / 2),\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n },\n esc(t) + (t === c ? \"\" : el(\"title\", {}, esc(c))),\n );\n });\n }\n }\n if (yTitle) {\n const cy = r(plot.y + plot.h / 2);\n ay += el(\n \"text\",\n { x: 9, y: cy, \"text-anchor\": \"middle\", transform: `rotate(-90 9 ${cy})` },\n esc(yTitle),\n );\n }\n\n if (rt && y2) {\n if (spec.yAxis)\n rt.values.forEach((v, i) => {\n ay += el(\n \"text\",\n {\n x: r(plot.x + plot.w + 6),\n y: r(y2.of(v)),\n \"text-anchor\": \"start\",\n \"dominant-baseline\": \"middle\",\n },\n esc(rt.labels[i]!),\n );\n });\n if (rTitle) {\n const [tx, cy] = [W - 9, r(plot.y + plot.h / 2)];\n ay += el(\n \"text\",\n { x: tx, y: cy, \"text-anchor\": \"middle\", transform: `rotate(90 ${tx} ${cy})` },\n esc(rTitle),\n );\n }\n }\n\n let ax = \"\";\n if (spec.xAxis && bx) {\n const ty = r(plot.y + plot.h + 16);\n if (bt) {\n // Linear ticks are thinned like band labels when they would overlap.\n const every = Math.max(\n 1,\n Math.ceil(maxW(bt.labels) / (plot.w / Math.max(1, bt.values.length - 1))),\n );\n bt.values.forEach((v, i) => {\n if (i % every) return;\n ax += el(\n \"text\",\n { x: r((x as { of(v: number): number }).of(v)), y: ty, \"text-anchor\": \"middle\" },\n esc(bt.labels[i]!),\n );\n });\n } else {\n const b = x as { at(i: number): number; bandwidth: number };\n const every = Math.max(1, Math.ceil(maxW(bLab) / (plot.w / Math.max(1, bLab.length))));\n bLab.forEach((c, i) => {\n if (i % every === 0)\n ax += el(\n \"text\",\n { x: r(b.at(i) + b.bandwidth / 2), y: ty, \"text-anchor\": \"middle\" },\n esc(c),\n );\n });\n }\n }\n if (xTitle)\n ax += el(\"text\", { x: r(plot.x + plot.w / 2), y: H - 4, \"text-anchor\": \"middle\" }, esc(xTitle));\n\n const both = bt && lt;\n const band = bx?.kind === \"band\" ? bx : ly?.kind === \"band\" ? ly : null;\n return {\n plot,\n x,\n y,\n y2,\n grid,\n ay,\n ax,\n attrs: {\n \"data-plot\": `${r(plot.x)} ${r(plot.y)} ${r(plot.w)} ${r(plot.h)}`,\n \"data-n\": both || !band ? null : band.domain.length,\n \"data-xd\": both ? bt.domain.join(\" \") : null,\n \"data-yd\": both ? lt.domain.join(\" \") : null,\n },\n };\n}\n","import { OTHER } from \"./svg.ts\";\nimport type { Aggregate, Cell, ResolvedSpec, Shaped, View } from \"./types.ts\";\n\n/** Reducer for one aggregate; shared with hierarchy.ts. Empty: null (count: 0). */\nexport function agg(kind: Aggregate): { add(v: number): void; value(): number | null } {\n let n = 0;\n let acc = 0;\n return {\n add(v) {\n acc =\n n === 0 || kind === \"sum\" || kind === \"mean\"\n ? acc + v\n : kind === \"min\"\n ? Math.min(acc, v)\n : kind === \"max\"\n ? Math.max(acc, v)\n : acc;\n n++;\n },\n value: () => (kind === \"count\" ? n : n === 0 ? null : kind === \"mean\" ? acc / n : acc),\n };\n}\n\ntype R = readonly [si: number, v: unknown, v2?: unknown];\ninterface Cat {\n label: string;\n rows: R[];\n vals: (number | null)[];\n y2?: number | null;\n}\n\ninterface Opts {\n hidden?: readonly string[];\n window?: View[\"window\"];\n}\n\nexport function shape(s: ResolvedSpec, o: Opts | readonly string[] = {}): Shaped {\n const { hidden = [], window }: Opts = Array.isArray(o) ? { hidden: o } : (o as Opts);\n const series: string[] = [];\n const si = new Map<string, number>();\n const ci = new Map<string, Cat>();\n for (const row of s.data) {\n const c = String(row[s.x]);\n const sk = s.series === null ? \"\" : String(row[s.series]);\n let j = si.get(sk);\n if (j === undefined) si.set(sk, (j = series.push(sk) - 1));\n let cat = ci.get(c);\n if (!cat) ci.set(c, (cat = { label: c, rows: [], vals: [] }));\n cat.rows.push([j, row[s.y], s.y2 === null ? undefined : row[s.y2]]);\n }\n // aggregate: one reducer per (category, series); pairs with no row stay null.\n const reduce = (rows: readonly R[]) => {\n const rs = new Map<number, ReturnType<typeof agg>>();\n for (const [j, v] of rows) {\n let r = rs.get(j);\n if (!r) rs.set(j, (r = agg(s.aggregate)));\n if (typeof v === \"number\") r.add(v);\n }\n return series.map((_, j) => rs.get(j)?.value() ?? null);\n };\n // y2: one reducer over every row of the category, whatever the series.\n const reduce2 = (c: Cat) => {\n const a = agg(s.aggregate);\n for (const [, , v] of c.rows) if (typeof v === \"number\") a.add(v);\n c.y2 = a.value();\n };\n let cats = [...ci.values()];\n for (const c of cats) {\n c.vals = reduce(c.rows);\n reduce2(c);\n }\n const total = (c: Cat) => c.vals.reduce<number>((a, v) => a + (v ?? 0), 0);\n\n if (s.sort) {\n const d = s.sort === \"asc\" ? 1 : -1;\n cats = cats\n .map((c) => [c, total(c)] as const)\n .sort((a, b) => d * (a[1] - b[1]))\n .map((p) => p[0]);\n }\n if (s.limit !== null && cats.length > s.limit) {\n const top = new Set(\n cats\n .map((c) => [c, total(c)] as const)\n .sort((a, b) => b[1] - a[1])\n .slice(0, s.limit)\n .map((p) => p[0]),\n );\n const rest = cats.filter((c) => !top.has(c));\n const other: Cat = {\n label: OTHER,\n rows: rest.flatMap((c) => c.rows),\n vals: [],\n };\n other.vals = reduce(other.rows);\n reduce2(other);\n cats = [...cats.filter((c) => top.has(c)), other];\n }\n\n // waterfall spans use running totals over every category, before the window.\n const wf = s.type === \"waterfall\";\n const spans = new Map<Cat, [number, number]>();\n if (wf) {\n let run = 0;\n for (const c of cats) {\n if (s.totals.includes(c.label)) spans.set(c, [0, run]);\n else spans.set(c, [run, (run += total(c))]);\n }\n }\n if (window?.length === 2 && cats.length) {\n const i1 = Math.min(cats.length - 1, Math.max(0, Math.trunc(window[1])));\n const i0 = Math.min(i1, Math.max(0, Math.trunc(window[0])));\n cats = cats.slice(i0, i1 + 1);\n }\n\n const visible: number[] = [];\n series.forEach((k, j) => hidden.includes(k) || visible.push(j));\n const cells: Cell[] = [];\n let lo = 0;\n let hi = 0;\n cats.forEach((c, i) => {\n let pos = 0;\n let neg = 0;\n for (const j of visible) {\n const value = c.vals[j] ?? null;\n const v = value ?? 0;\n let [y0, y1] = wf ? spans.get(c)! : [0, v];\n if (s.stack) {\n if (v < 0) [y0, y1] = [neg, (neg += v)];\n else [y0, y1] = [pos, (pos += v)];\n }\n lo = Math.min(lo, y0, y1);\n hi = Math.max(hi, y0, y1);\n cells.push({ ci: i, si: j, value, y0, y1 });\n }\n });\n return {\n categories: cats.map((c) => c.label),\n totals: cats.map((c) => s.totals.includes(c.label)),\n series,\n visible,\n cells,\n extent: [lo, hi],\n y2: s.y2 === null ? [] : cats.map((c) => c.y2 ?? null),\n };\n}\n\n/** colorBy field aggregated per (category, series) like the marks; null without a field colorBy. */\nexport function colorVals(s: ResolvedSpec): (c: string, ser: string) => number | null {\n const cb = typeof s.colorBy === \"string\" && s.colorBy !== \"sign\" ? s.colorBy : null;\n const m = new Map<string, ReturnType<typeof agg>>();\n if (cb)\n for (const row of s.data) {\n const v = row[cb];\n if (typeof v !== \"number\") continue;\n const k = String(row[s.x]) + \"\\0\" + (s.series === null ? \"\" : String(row[s.series]));\n (m.get(k) ?? m.set(k, agg(s.aggregate)).get(k)!).add(v);\n }\n return (c, ser) => m.get(c + \"\\0\" + ser)?.value() ?? null;\n}\n","import { bandScale } from \"../scale.ts\";\nimport { colorVals } from \"../shape.ts\";\nimport { el, hit, key, OTHER, r } from \"../svg.ts\";\nimport type { Axis, BandScale, LinearScale, Mark, ResolvedSpec, Shaped } from \"../types.ts\";\n\ninterface Item {\n ci: number;\n si: number;\n y0: number;\n y1: number;\n /** Raw value shown (waterfall total: the running total). */\n v: number;\n /** data-s: series slot; waterfall 0 up / 1 down / 2 total. */\n s: number;\n}\n\n/** Waterfall: delta bars float on the running total; `totals` categories draw it from 0. */\nfunction steps(shaped: Shaped): Item[] {\n const by: (typeof shaped.cells)[number][] = [];\n for (const c of shaped.cells) by[c.ci] = c;\n const si = shaped.visible[0] ?? 0;\n let run = 0;\n const out: Item[] = [];\n shaped.categories.forEach((_, ci) => {\n const c = by[ci];\n if (!c) return;\n if (shaped.totals[ci]) return void out.push({ ci, si, y0: 0, y1: run, v: run, s: 2 });\n if (c.value === null) return;\n out.push({ ci, si, y0: run, y1: (run += c.value), v: c.value, s: c.value < 0 ? 1 : 0 });\n });\n return out;\n}\n\nconst items = (spec: ResolvedSpec, shaped: Shaped): Item[] =>\n spec.type === \"waterfall\"\n ? steps(shaped)\n : shaped.cells.flatMap((c) =>\n c.value === null\n ? []\n : [{ ci: c.ci, si: c.si, y0: c.y0, y1: c.y1, v: c.value, s: c.si % 8 }],\n );\n\nexport const bar: Mark = {\n noun: \"Bar\",\n axes(spec, shaped) {\n let lo = shaped.extent[0];\n let hi = shaped.extent[1];\n if (spec.type === \"waterfall\") {\n lo = hi = 0;\n for (const i of steps(shaped))\n ((lo = Math.min(lo, i.y0, i.y1)), (hi = Math.max(hi, i.y0, i.y1)));\n }\n const cat: Axis = { kind: \"band\", field: spec.x, domain: shaped.categories };\n const val: Axis = { kind: \"linear\", field: spec.y, domain: [lo, hi] };\n if (spec.y2 !== null) {\n const v2 = shaped.y2.filter((v): v is number => v !== null);\n const right: Axis = {\n kind: \"linear\",\n field: spec.y2,\n domain: [Math.min(0, ...v2), Math.max(0, ...v2)],\n };\n return [cat, val, right];\n }\n return spec.horizontal ? [val, cat] : [cat, val];\n },\n draw(ctx) {\n const { spec, shaped } = ctx;\n const hz = spec.horizontal;\n const cat = (hz ? ctx.y : ctx.x) as BandScale;\n const val = (hz ? ctx.x : ctx.y) as LinearScale;\n const keys = shaped.visible.map((j) => shaped.series[j]!);\n const inner = bandScale(keys, [0, cat.bandwidth], 0.1, 0);\n const cvOf = colorVals(spec);\n let marks = \"\";\n let hits = \"\";\n for (const c of items(spec, shaped)) {\n const k = shaped.visible.indexOf(c.si);\n const pos = cat.at(c.ci) + (spec.stack || spec.type === \"waterfall\" ? 0 : inner.at(k));\n const th = spec.stack || spec.type === \"waterfall\" ? cat.bandwidth : inner.bandwidth;\n const [a, b] = [val.of(c.y0), val.of(c.y1)];\n const lo = Math.min(a, b);\n const len = Math.abs(a - b);\n const [x, y, w, h] = hz ? [lo, pos, len, th] : [pos, lo, th, len];\n const cname = shaped.categories[c.ci]!;\n const ser = shaped.series[c.si]!;\n const cv = cvOf(cname, ser);\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": c.ci,\n \"data-s\": c.s,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-f\": ctx.fmt(spec.y, c.v),\n \"data-y\": c.v,\n \"data-neg\": c.v < 0,\n \"data-tone\": ctx.tone(c.v),\n \"data-q\": cv === null ? null : ctx.q(cv),\n \"data-other\": cname === OTHER,\n \"data-total\": shaped.totals[c.ci], // waterfall running total: neutral colour\n };\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n ...d,\n x: r(x),\n y: r(y),\n width: r(w),\n height: r(h),\n });\n hits += hit(d, x, y, w, h);\n if (spec.labels) {\n // Inside when it fits, else outside the bar end (collisions are dropped by ctx.label).\n const text = ctx.fmt(spec.y, c.v);\n const est = text.length * 7.2 + 4;\n const [cx, cy] = [x + w / 2, y + h / 2];\n const neg = c.v < 0;\n if (hz)\n est <= w && h >= 14\n ? ctx.label(cx, cy, text, \"center\")\n : ctx.label(neg ? x - 4 : x + w + 4, cy, text, neg ? \"end\" : \"start\");\n else\n est <= w && h >= 16\n ? ctx.label(cx, cy, text, \"center\")\n : ctx.label(cx, neg ? y + h : y, text, neg ? \"below\" : \"above\");\n }\n }\n if (ctx.y2 && spec.y2 !== null && shaped.y2.length) {\n // y2 line over the bars: unique keys (key(\"l\", NUL+\"y2\") / key(NUL+\"y2\", category)).\n const f2 = spec.y2;\n const slot = shaped.series.length % 8;\n const name = spec.titles.get(f2) ?? f2;\n let d = \"\";\n let gap = true;\n let dots = \"\";\n shaped.y2.forEach((v, ci) => {\n if (v === null) {\n gap = true;\n return;\n }\n const px = r(cat.at(ci) + cat.bandwidth / 2);\n const py = r(ctx.y2!.of(v));\n d += `${gap ? \"M\" : \"L\"}${px} ${py}`;\n gap = false;\n const cname = shaped.categories[ci]!;\n const p = {\n \"data-key\": key(\"\\u0000y2\", cname),\n \"data-c\": ci,\n \"data-s\": slot,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": name,\n \"data-f\": ctx.fmt(f2, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n };\n dots += el(\"circle\", { \"data-maya\": \"mark\", ...p, r: 3, cx: px, cy: py });\n hits += hit(p, +px - 3, +py - 3, 6, 6);\n if (spec.labels) ctx.label(+px, +py, ctx.fmt(f2, v), \"above\");\n });\n marks +=\n el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", \"\\u0000y2\"),\n \"data-s\": slot,\n pathLength: 1,\n d: d || null,\n }) + dots;\n }\n return { marks, hits };\n },\n};\n","import { el, hit, key, OTHER, r } from \"../svg.ts\";\nimport type { Axis, BandScale, LinearScale, Mark } from \"../types.ts\";\n\n/** Two dots per category (series 0 = from, 1 = to) joined by a connector toned by colorBy \"sign\". */\nexport const dumbbell: Mark = {\n noun: \"Dumbbell\",\n axes(spec, shaped) {\n const cat: Axis = { kind: \"band\", field: spec.x, domain: shaped.categories };\n const val: Axis = { kind: \"linear\", field: spec.y, domain: shaped.extent };\n return spec.horizontal ? [val, cat] : [cat, val];\n },\n draw(ctx) {\n const { spec, shaped } = ctx;\n const hz = spec.horizontal;\n const cat = (hz ? ctx.y : ctx.x) as BandScale;\n const val = (hz ? ctx.x : ctx.y) as LinearScale;\n const rad = Math.max(3, Math.min(5, cat.bandwidth / 2 - 1));\n // ponytail: sort stays shape's total-across-series order; sorting by the gap is out of scope.\n const pairs = new Map<number, [number?, number?]>();\n for (const c of shaped.cells)\n if (c.value !== null && c.si < 2)\n (pairs.get(c.ci) ?? pairs.set(c.ci, []).get(c.ci)!)[c.si] = c.value;\n let links = \"\";\n let dots = \"\";\n let hits = \"\";\n for (const [ci, p] of [...pairs].sort((a, b) => a[0] - b[0])) {\n const cname = shaped.categories[ci]!;\n const mid = cat.at(ci) + cat.bandwidth / 2;\n const at = (v: number): [number, number] => (hz ? [val.of(v), mid] : [mid, val.of(v)]);\n const [from, to] = p;\n if (from !== undefined && to !== undefined) {\n const [x1, y1] = at(from);\n const [x2, y2] = at(to);\n links += el(\"line\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", cname),\n \"data-c\": ci,\n \"data-tone\": ctx.tone(to - from),\n \"stroke-width\": 2,\n x1: r(x1),\n y1: r(y1),\n x2: r(x2),\n y2: r(y2),\n });\n }\n for (const si of [0, 1]) {\n const v = p[si];\n if (v === undefined) continue;\n const [cx, cy] = at(v);\n const ser = shaped.series[si]!;\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n \"data-other\": cname === OTHER,\n };\n dots += el(\"circle\", { \"data-maya\": \"mark\", ...d, cx: r(cx), cy: r(cy), r: rad });\n hits += hit(d, cx - rad, cy - rad, rad * 2, rad * 2);\n if (spec.labels) {\n // \"to\" beyond its dot, \"from\" on the other side; pixel direction of from -> to.\n const other = p[1 - si];\n const [ox, oy] = at(other ?? v);\n const text = ctx.fmt(spec.y, v);\n const down = hz ? cx >= ox : cy >= oy;\n const side = other === undefined ? hz : si === 1 ? down : !down;\n if (hz) ctx.label(cx + (side ? rad + 4 : -rad - 4), cy, text, side ? \"start\" : \"end\");\n else ctx.label(cx, cy + (side ? rad : -rad), text, side ? \"below\" : \"above\");\n }\n }\n }\n return { marks: links + dots, hits };\n },\n};\n","import { el, esc, hit, key, r } from \"../svg.ts\";\nimport type { BandScale, Mark } from \"../types.ts\";\n\n/** x = column category, series = row category; ramp legend; labels default on at >= 24 px. */\nexport const heatmap: Mark = {\n noun: \"Heatmap\",\n axes: (spec, shaped) => [\n { kind: \"band\", field: spec.x, domain: shaped.categories },\n { kind: \"band\", field: spec.series ?? \"\", domain: shaped.series },\n ],\n draw(ctx) {\n const { spec, shaped } = ctx;\n const cx = ctx.x as BandScale;\n const cy = ctx.y as BandScale;\n const cells = shaped.cells.filter((c) => c.value !== null);\n let lo = Infinity;\n let hi = -Infinity;\n for (const c of cells) ((lo = Math.min(lo, c.value!)), (hi = Math.max(hi, c.value!)));\n const q = (v: number) =>\n hi > lo ? Math.min(9, Math.max(0, Math.floor(((v - lo) / (hi - lo)) * 10))) : 9;\n let marks = \"\";\n let hits = \"\";\n for (const [n, c] of cells.entries()) {\n const v = c.value!;\n const row = shaped.visible.indexOf(c.si);\n const x = cx.at(c.ci) + 1;\n const y = cy.at(row) + 1;\n const w = Math.max(0, cx.bandwidth - 2);\n const h = Math.max(0, cy.bandwidth - 2);\n const col = shaped.categories[c.ci]!;\n const ser = shaped.series[c.si]!;\n const d = {\n \"data-key\": key(ser, col),\n \"data-c\": n,\n \"data-x\": ctx.fmt(spec.x, col),\n \"data-series\": ser,\n \"data-y\": v,\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-q\": q(v),\n };\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n ...d,\n x: r(x),\n y: r(y),\n width: r(w),\n height: r(h),\n });\n hits += hit(d, x, y, w, h);\n if (spec.labels !== false && w >= 24 && h >= 24)\n ctx.label(x + w / 2, y + h / 2, ctx.fmt(spec.y, v), \"center\");\n }\n const legend =\n cells.length > 0\n ? `<div class=\"maya-legend\" data-maya=\"ramp\"><span>${esc(ctx.fmt(spec.y, lo))}</span><i></i><span>${esc(ctx.fmt(spec.y, hi))}</span></div>`\n : \"\";\n return { marks, hits, grid: \"\", legend };\n },\n};\n","import { el, esc, key, r } from \"../svg.ts\";\nimport type { Cell, Mark, MarkCtx } from \"../types.ts\";\n\nconst PAD = 12;\nconst num = (v: unknown) => (typeof v === \"number\" ? v : null);\n\n/** Headline, delta vs previous period, sparkline, target bullet. No axes: everything from width/height. */\nfunction draw(ctx: MarkCtx) {\n const { spec, shaped, width: W, height: H } = ctx;\n const cats = spec.x ? shaped.categories : [];\n const cells: Cell[] = spec.x\n ? shaped.cells.filter((c) => c.si === 0).sort((a, b) => a.ci - b.ci)\n : [];\n const live = cells.filter((c) => c.value !== null);\n const last = live[live.length - 1];\n const value = spec.x\n ? (last?.value ?? null)\n : ctx.agg(spec.aggregate)(spec.data.map((row) => num(row[spec.y])));\n const mid = W / 2;\n if (value === null)\n return {\n marks: \"\",\n hits: \"\",\n labels: el(\n \"text\",\n { \"data-maya\": \"empty\", x: r(mid), y: r(H / 2), \"text-anchor\": \"middle\" },\n esc(ctx.t(\"noData\")),\n ),\n };\n\n const ci = last?.ci ?? 0;\n const period = spec.x ? ctx.fmt(spec.x, cats[ci]) : \"\";\n const f = ctx.fmt(spec.y, value);\n const fs = r(Math.max(16, Math.min(H * 0.32, 72, (W - 2 * PAD) / (f.length * 0.62))));\n const payload = {\n \"data-c\": ci,\n \"data-s\": 0,\n \"data-x\": period,\n \"data-series\": \"\",\n \"data-y\": value,\n \"data-f\": f,\n };\n const text = (a: Parameters<typeof el>[1], s: string) =>\n el(\"text\", { \"dominant-baseline\": \"hanging\", x: PAD, ...a }, esc(s));\n\n let marks = el(\n \"text\",\n {\n \"data-maya\": \"mark\",\n \"data-key\": \"v\",\n ...payload,\n \"font-size\": fs,\n x: PAD,\n y: PAD,\n \"dominant-baseline\": \"hanging\",\n },\n esc(f),\n );\n let labels = \"\";\n let hits = \"\";\n let top = PAD + fs + 4;\n const prev = live[live.length - 2];\n if (last && prev && prev.value) {\n const pct = (value - prev.value) / Math.abs(prev.value);\n const s = new Intl.NumberFormat(spec.locale, {\n style: \"percent\",\n maximumFractionDigits: 1,\n signDisplay: \"exceptZero\",\n }).format(pct);\n labels += text(\n {\n \"data-kpi\": \"delta\",\n \"data-tone\": pct > 0 ? \"good\" : pct < 0 ? \"bad\" : null,\n y: r(top),\n \"font-size\": 12,\n },\n ctx.t(\"vs\", s, ctx.fmt(spec.x, cats[prev.ci])),\n );\n top += 16;\n }\n if (period) labels += text({ \"data-kpi\": \"period\", y: r(top), \"font-size\": 11 }, period);\n top += 18;\n\n let grid = \"\";\n const target = typeof spec.colorBy === \"object\" && spec.colorBy ? spec.colorBy.target : null;\n let bottom = H - PAD;\n if (target) {\n const w = W - 2 * PAD;\n const k = Math.min(Math.max(value / target, 0), 1.2) / 1.2;\n const pct = new Intl.NumberFormat(spec.locale, { style: \"percent\", maximumFractionDigits: 1 });\n bottom -= 8;\n // Unkeyed parts live outside the marks group (the element diffs marks by data-key).\n grid = el(\"rect\", { \"data-kpi\": \"track\", x: PAD, y: bottom, width: r(w), height: 8, rx: 4 });\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n \"data-key\": \"b\",\n ...payload,\n \"data-kpi\": \"fill\",\n \"data-tone\": ctx.tone(value),\n x: PAD,\n y: bottom,\n width: r(w * k),\n height: 8,\n rx: 4,\n });\n labels += el(\"line\", {\n \"data-kpi\": \"target\",\n \"stroke-width\": 2,\n x1: r(PAD + w / 1.2),\n x2: r(PAD + w / 1.2),\n y1: bottom - 3,\n y2: bottom + 11,\n });\n labels += text(\n { \"data-kpi\": \"of\", y: bottom - 16, \"font-size\": 11 },\n ctx.t(\"ofTarget\", pct.format(value / target), ctx.fmt(spec.y, target)),\n );\n bottom -= 24;\n }\n\n // ponytail: sparkline needs 28px; with a target bullet and a short box the bullet wins.\n if (cats.length >= 3 && bottom - top >= 28) {\n const vs = live.map((c) => c.value!);\n const lo = Math.min(...vs);\n const span = Math.max(...vs) - lo || 1;\n const n = cats.length - 1;\n const step = (W - 2 * PAD) / n;\n const px = (i: number) => r(PAD + i * step);\n const py = (v: number) => r(bottom - ((v - lo) / span) * (bottom - top - 4) - 2);\n let d = \"\";\n let gap = true;\n cells.forEach((c) => {\n if (c.value === null) return void (gap = true);\n d += `${gap ? \"M\" : \"L\"}${px(c.ci)} ${py(c.value)}`;\n gap = false;\n marks += el(\"circle\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"\", cats[c.ci]),\n \"data-c\": c.ci,\n \"data-s\": 0,\n \"data-x\": ctx.fmt(spec.x, cats[c.ci]),\n \"data-series\": \"\",\n \"data-y\": c.value,\n \"data-f\": ctx.fmt(spec.y, c.value),\n \"data-neg\": c.value < 0,\n \"data-last\": c === last,\n r: 3,\n cx: px(c.ci),\n cy: py(c.value),\n });\n });\n marks =\n el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", \"\"),\n \"data-s\": 0,\n pathLength: 1,\n d: d || null,\n }) + marks;\n cats.forEach((_, i) => {\n hits += el(\"rect\", {\n \"data-maya\": \"hit\",\n \"data-c\": i,\n x: r(Math.max(0, PAD + i * step - step / 2)),\n y: 0,\n width: r(step),\n height: H,\n fill: \"transparent\",\n });\n });\n }\n return { marks, hits, labels, grid };\n}\n\nexport const kpi: Mark = { noun: \"KPI\", draw };\n","import { colorVals } from \"../shape.ts\";\nimport { el, key, OTHER, r } from \"../svg.ts\";\nimport type { Axis, BandScale, Cell, LinearScale, Mark, MarkCtx, MarkOut } from \"../types.ts\";\n\nconst axes: Mark[\"axes\"] = (spec, shaped) => [\n { kind: \"band\", field: spec.x, domain: shaped.categories } satisfies Axis,\n // ponytail: 0-anchored via shape's extent (also for line); yDomain overrides in layout.\n { kind: \"linear\", field: spec.y, domain: shaped.extent } satisfies Axis,\n];\n\nfunction draw(ctx: MarkCtx, fill: boolean): MarkOut {\n const { spec, shaped, plot } = ctx;\n const cat = ctx.x as BandScale;\n const val = ctx.y as LinearScale;\n const cvOf = colorVals(spec);\n const px = (ci: number) => r(cat.at(ci) + cat.bandwidth / 2);\n\n let areas = \"\";\n let lines = \"\";\n let dots = \"\";\n for (const si of shaped.visible) {\n const ser = shaped.series[si]!;\n const cells: Cell[] = shaped.cells.filter((c) => c.si === si).sort((a, b) => a.ci - b.ci);\n let d = \"\";\n let gap = true;\n // Area runs: stacked areas treat null as 0 (shape did), so they never break.\n const runs: Cell[][] = [[]];\n for (const c of cells) {\n if (c.value === null && !spec.stack) runs.push([]);\n else runs[runs.length - 1]!.push(c);\n if (c.value === null) {\n gap = true;\n continue;\n }\n d += `${gap ? \"M\" : \"L\"}${px(c.ci)} ${r(val.of(c.y1))}`;\n gap = false;\n\n const cname = shaped.categories[c.ci]!;\n const cv = cvOf(cname, ser);\n const other = cname === OTHER;\n const x = ctx.fmt(spec.x, cname); // display label: month presets, \"Other\"\n dots += el(\"circle\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(ser, cname),\n \"data-c\": c.ci,\n \"data-s\": si % 8,\n \"data-x\": x,\n \"data-series\": ser,\n \"data-y\": c.value,\n \"data-f\": ctx.fmt(spec.y, c.value),\n \"data-neg\": c.value < 0,\n \"data-tone\": ctx.tone(c.value),\n \"data-q\": cv === null ? null : ctx.q(cv),\n \"data-other\": other,\n r: 3,\n cx: px(c.ci),\n cy: r(val.of(c.y1)),\n });\n if (spec.labels) ctx.label(px(c.ci), val.of(c.y1), ctx.fmt(spec.y, c.value), \"above\");\n }\n if (fill) {\n const sh = runs\n .filter((run) => run.length > 0)\n .map(\n (run) =>\n run.map((c, i) => `${i ? \"L\" : \"M\"}${px(c.ci)} ${r(val.of(c.y1))}`).join(\"\") +\n [...run]\n .reverse()\n .map((c) => `L${px(c.ci)} ${r(val.of(c.y0))}`)\n .join(\"\") +\n \"Z\",\n )\n .join(\"\");\n if (sh)\n areas += el(\"path\", {\n \"data-maya\": \"area\",\n \"data-key\": key(\"a\", ser),\n \"data-s\": si % 8,\n d: sh,\n });\n }\n lines += el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", ser),\n \"data-s\": si % 8,\n pathLength: 1,\n d: d || null,\n });\n }\n\n let hits = \"\";\n shaped.categories.forEach((_, ci) => {\n hits += el(\"rect\", {\n \"data-maya\": \"hit\",\n \"data-c\": ci,\n x: r(cat.at(ci)),\n y: r(plot.y),\n width: r(cat.bandwidth),\n height: r(plot.h),\n fill: \"transparent\",\n });\n });\n return {\n marks: areas + lines + dots,\n hits,\n cross: el(\"line\", { x1: 0, x2: 0, y1: r(plot.y), y2: r(plot.y + plot.h) }),\n };\n}\n\n/** Line and area share one file: crosshair contract, stack for area. */\nexport const line: Mark = { noun: \"Line\", axes, draw: (ctx) => draw(ctx, false) };\nexport const area: Mark = { noun: \"Area\", axes, draw: (ctx) => draw(ctx, true) };\n","import { el, key, r } from \"../svg.ts\";\nimport type { Mark, ResolvedSpec, Row, Shaped } from \"../types.ts\";\n\nconst MIN = 24;\n\ninterface Pt {\n i: number;\n x: number;\n y: number;\n sz: number | null;\n si: number;\n name: string | null;\n row: Row;\n}\n\n/**\n * Visible points, in row order. Rows with a null/non-numeric x or y, hidden series, and points\n * outside an explicit xDomain/yDomain are skipped (domains clip; they never draw off-plot).\n * A 4-element view.window (scatter zoom box) clips the same way as the domains.\n */\nfunction points(spec: ResolvedSpec, shaped: Shaped): Pt[] {\n const out: Pt[] = [];\n const xd = spec.xDomain;\n const yd = spec.yDomain;\n const w = spec.window;\n spec.data.forEach((row, i) => {\n const x = row[spec.x];\n const y = row[spec.y];\n if (typeof x !== \"number\" || typeof y !== \"number\") return;\n if (xd && (x < xd[0] || x > xd[1])) return;\n if (yd && (y < yd[0] || y > yd[1])) return;\n if (w && (x < w[0] || x > w[1] || y < w[2] || y > w[3])) return;\n const si = shaped.series.indexOf(spec.series === null ? \"\" : String(row[spec.series]));\n if (!shaped.visible.includes(si)) return;\n const sv = spec.size === null ? null : row[spec.size];\n const nv = spec.name === null ? null : row[spec.name];\n out.push({\n i,\n x,\n y,\n sz: typeof sv === \"number\" ? sv : null,\n si,\n name: nv == null ? null : String(nv),\n row,\n });\n });\n return out;\n}\n\nexport const scatter: Mark = {\n noun: \"Scatter\",\n axes(spec, shaped) {\n let x0 = Infinity;\n let x1 = -Infinity;\n let y0 = Infinity;\n let y1 = -Infinity;\n for (const p of points(spec, shaped)) {\n x0 = Math.min(x0, p.x);\n x1 = Math.max(x1, p.x);\n y0 = Math.min(y0, p.y);\n y1 = Math.max(y1, p.y);\n }\n if (x0 > x1) ((x0 = x1 = 0), (y0 = y1 = 0));\n // Bubbles: pad 6% so the largest radius stays inside the plot.\n const px = spec.size === null ? 0 : (x1 - x0) * 0.06;\n const py = spec.size === null ? 0 : (y1 - y0) * 0.06;\n const lo = (v: number, p: number) => (v >= 0 ? Math.max(0, v - p) : v - p);\n [x0, x1, y0, y1] = [lo(x0, px), x1 + px, lo(y0, py), y1 + py];\n return [\n { kind: \"linear\", field: spec.x, domain: spec.xDomain ?? [x0, x1] },\n { kind: \"linear\", field: spec.y, domain: spec.yDomain ?? [y0, y1] },\n ];\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const sx = ctx.x as { of(v: number): number };\n const sy = ctx.y as { of(v: number): number };\n const pts = points(spec, shaped);\n let max = 0;\n for (const p of pts) if (p.sz !== null) max = Math.max(max, Math.abs(p.sz));\n const scale = Math.min(plot.w, plot.h) / 16;\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n\n const seen = new Map<string, number>();\n const items = pts.map((p) => {\n const rad = p.sz !== null && max > 0 ? 2 + Math.sqrt(Math.abs(p.sz) / max) * scale : 4;\n let id: string | number = p.i;\n if (p.name !== null) {\n const n = (seen.get(p.name) ?? 0) + 1;\n seen.set(p.name, n);\n id = n > 1 ? `${p.name}#${n}` : p.name;\n }\n const ser = shaped.series[p.si]!;\n const x = ctx.fmt(spec.x, p.x);\n const y = ctx.fmt(spec.y, p.y);\n const cv = cb ? p.row[cb] : null;\n const d = {\n \"data-key\": key(ser, id),\n \"data-c\": p.i,\n \"data-s\": p.si % 8,\n \"data-x\": p.name ?? x,\n \"data-series\": ser,\n \"data-y\": p.y,\n \"data-f\":\n p.name === null && p.sz === null\n ? y\n : [x, y, p.sz === null ? null : ctx.fmt(spec.size!, p.sz)]\n .filter((v) => v !== null)\n .join(\" · \"),\n \"data-neg\": p.y < 0,\n \"data-tone\": ctx.tone(p.y),\n \"data-q\": typeof cv === \"number\" ? ctx.q(cv) : null,\n };\n return { p, rad, d, cx: sx.of(p.x), cy: sy.of(p.y) };\n });\n // Big bubbles first so small ones stay on top; stable for ties.\n items.sort((a, b) => b.rad - a.rad);\n\n let marks = \"\";\n let hits = \"\";\n for (const { p, rad, d, cx, cy } of items) {\n marks += el(\"circle\", {\n \"data-maya\": \"mark\",\n ...d,\n r: r(rad),\n cx: r(cx),\n cy: r(cy),\n });\n if (rad * 2 < MIN)\n hits += el(\"circle\", {\n \"data-maya\": \"hit\",\n ...d,\n r: r(Math.max(rad, 12)),\n cx: r(cx),\n cy: r(cy),\n fill: \"transparent\",\n });\n if (spec.labels) ctx.label(cx, cy - rad, ctx.fmt(spec.y, p.y), \"above\");\n }\n return { marks, hits };\n },\n};\n","/*\n * Mark registry for optional modules (hierarchy, flow, geo). Imports nothing at runtime,\n * so every bundle that includes it (index, element, each module, the IIFE) shares one\n * table through a version-keyed global symbol. First definer wins; the property is\n * non-writable and non-configurable so a later bundle cannot swap the table.\n * Core marks are NOT here: they live in render.ts's static CORE map.\n */\nimport type { Mark } from \"./types.ts\";\n\n// ponytail: kept in sync with package.json by hand (one line, checked at release).\nexport const VERSION = \"0.1.0\";\n// ponytail: keyed by major; pre-1.0 Mark-contract breaks must bump this by hand.\nexport const MAJOR = \"0\";\n\nconst KEY = Symbol.for(\"mayacharts.marks@\" + MAJOR);\nif (!Object.hasOwn(globalThis, KEY))\n Object.defineProperty(globalThis, KEY, { value: new Map<string, Mark>() });\n\n/** type -> Mark for every registered module type (shared across bundles). */\nexport const MODULES = (globalThis as unknown as Record<symbol, Map<string, Mark>>)[KEY]!;\n\n/** Types that ship in core (static CORE map in render.ts). */\nexport const CORE_TYPES = [\n \"bar\",\n \"line\",\n \"area\",\n \"scatter\",\n \"heatmap\",\n \"waterfall\",\n \"kpi\",\n \"dumbbell\",\n] as const;\n\n/** Module types and the import that provides them (for the unknown-type hint). */\nexport const MODULE_OF: Readonly<Record<string, string>> = {\n treemap: \"hierarchy\",\n sunburst: \"hierarchy\",\n sankey: \"flow\",\n hexmap: \"geo\",\n};\n\n/** Not exported from the public entry: modules call it on import. First wins. */\nexport function register(type: string, mark: Mark): void {\n if (!MODULES.has(type)) MODULES.set(type, mark);\n // Connected <maya-chart>s re-render on this, so late module loads fix \"unknown type\".\n if (typeof globalThis.dispatchEvent === \"function\")\n globalThis.dispatchEvent(new Event(\"maya-register\"));\n}\n\n/** Registered module types. */\nexport const types = (): string[] => [...MODULES.keys()];\n","const L =\n \":host,.maya-root{--maya-font:system-ui,sans-serif;--maya-font-size:12px;--maya-fg:light-dark(#1f2328,#e6edf3);--maya-fg-muted:light-dark(#656d76,#9198a1);--maya-grid:color-mix(in oklab,var(--maya-fg) 12%,transparent);--maya-bg:light-dark(#fff,#0d1117);--maya-accent:oklch(.6 .17 255);--maya-radius:2px;--maya-tooltip-bg:var(--maya-fg);--maya-tooltip-fg:var(--maya-bg);--maya-focus:var(--maya-accent);--maya-good:light-dark(#1a7f37,#3fb950);--maya-bad:light-dark(#cf222e,#f85149);--maya-series-1:var(--maya-accent);--maya-series-2:oklch(.66 .16 50);--maya-series-3:oklch(.62 .15 160);--maya-series-4:oklch(.66 .17 330);--maya-series-5:oklch(.62 .14 90);--maya-series-6:oklch(.62 .12 205);--maya-series-7:oklch(.64 .19 22);--maya-series-8:oklch(.62 .16 295);color-scheme:light dark}\";\nconst D = \"--maya-fg:#1f2328;--maya-fg-muted:#656d76;--maya-bg:#fff\";\nconst N = \"--maya-fg:#e6edf3;--maya-fg-muted:#9198a1;--maya-bg:#0d1117\";\nconst rng = (n: number, from = 0) => Array.from({ length: n }, (_, i) => i + from);\nconst S = rng(8)\n .map((n) => `[data-s=\"${n}\"]{--c:var(--maya-series-${n + 1})}`)\n .join(\"\");\n// Ramp: 10 steps, 20% floor (about 32% in dark mode, see --b). ponytail: only steps >= 8 reach 3:1; values are also text everywhere.\nconst Q = rng(10)\n .map((n) => `[data-q=\"${n}\"]{--q:${Math.round(20 + (n * 80) / 9)}%}`)\n .join(\"\");\n// Legend hover: dim the other series' marks (slot match; :has needs no JS).\nconst H = rng(8)\n .map((n) => `.maya:has([data-s=\"${n}\"]:hover) [data-maya=mark]:not([data-s=\"${n}\"]){opacity:.3}`)\n .join(\"\");\n// Sliding indicator of .maya-ctl: data-n = options (2..4; ponytail: more options need more rules), data-i = checked index (set by the element).\nconst C =\n rng(3, 2)\n .map((n) => `.maya-ctl[data-n=\"${n}\"]::before{width:calc((100% - 4px)/${n})}`)\n .join(\"\") +\n rng(3, 1)\n .map((i) => `.maya-ctl[data-i=\"${i}\"]::before{transform:translateX(${i * 100}%)}`)\n .join(\"\");\nconst B =\n \"border:0;background:none;padding:0;font:inherit;color:var(--maya-fg-muted);cursor:pointer\";\nexport const css =\n L +\n `@supports not (color:light-dark(#000,#fff)){:host,.maya-root{${D}}@media (prefers-color-scheme:dark){:host,.maya-root{${N}}}}` +\n \":host{display:block;position:relative;container-type:inline-size;min-height:200px}\" +\n \".maya{display:flex;flex-direction:column;height:100%;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums;color:var(--maya-fg)}\" +\n \".maya-title{font-weight:600;font-size:14px}\" +\n \".maya-legend,.maya-crumbs{color:var(--maya-fg-muted);display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin:0 0 8px}\" +\n \".maya-crumbs{min-height:1.25em;line-height:1.25}\" +\n `.maya-legend button,.maya-crumbs button,.maya-reset{display:inline-flex;align-items:center;gap:6px;${B};border-radius:4px}` +\n \".maya-legend [aria-pressed=false]{opacity:.4}\" +\n \":is(.maya-legend,.maya-crumbs) button:focus-visible,.maya-reset:focus-visible,.maya-ctl :focus-visible{outline:2px solid var(--maya-focus);outline-offset:2px}\" +\n \"i{width:10px;height:10px;border-radius:3px;background:var(--c)}\" +\n \"[data-maya=ramp]{display:flex;align-items:center;gap:6px}\" +\n \"[data-maya=ramp] i{width:80px;height:8px;background:linear-gradient(90deg,color-mix(in oklab,var(--maya-accent) 20%,var(--b)),var(--maya-accent))}\" +\n // Ramp floor: the background, lifted toward the accent in dark mode so low steps stay visible.\n \"[data-q],[data-maya=ramp] i{--b:light-dark(var(--maya-bg),color-mix(in oklab,var(--maya-accent) 15%,var(--maya-bg)))}\" +\n \".maya-legend span{display:inline-flex;align-items:center;gap:6px}\" +\n \".maya-reset{position:absolute;top:4px;right:4px;border:1px solid var(--maya-grid);border-radius:99px;padding:2px 10px;background:var(--maya-bg)}\" +\n \".maya-ctl{position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:1fr;align-self:flex-start;margin:0 0 8px;padding:2px;border-radius:8px;background:var(--maya-grid)}\" +\n \".maya-ctl::before{content:'';position:absolute;inset:2px auto 2px 2px;width:calc(100% - 4px);border-radius:6px;background:var(--maya-bg);transition:transform .2s}\" +\n C +\n `.maya-ctl [role=radio]{${B};position:relative;padding:4px 12px;border-radius:6px}` +\n \".maya-ctl [aria-checked=true]{color:var(--maya-fg);font-weight:600}\" +\n \".maya-err{margin:0;padding:8px;color:var(--maya-bad);white-space:pre-wrap;font:12px monospace}\" +\n \".maya-box{flex:1;min-height:0;position:relative}\" +\n \".maya-box svg{display:block;width:100%;height:100%;overflow:visible}\" +\n \".maya-svg{direction:ltr;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums}\" +\n \".maya-svg text{fill:var(--maya-fg-muted);unicode-bidi:plaintext}\" +\n \"[data-maya=grid] *{stroke:var(--maya-grid);shape-rendering:crispEdges}\" +\n S +\n \"[data-other],[data-total]{--c:var(--maya-fg-muted)}\" +\n \"[data-tone=good]{--c:var(--maya-good)}[data-tone=bad]{--c:var(--maya-bad)}\" +\n \"[data-q]{--c:color-mix(in oklab,var(--maya-accent) var(--q),var(--b))}\" +\n Q +\n \"[data-maya=mark]{fill:var(--c,var(--maya-series-1));rx:var(--maya-radius);transform-box:fill-box;transform-origin:0 0}\" +\n \"[data-dir=h] [data-neg]{transform-origin:100% 0}\" +\n \"[data-maya=mark],[data-maya=link]{transition:opacity .2s}\" +\n \"[data-maya=mark][data-active]{fill:color-mix(in oklab,var(--c,var(--maya-series-1)),var(--maya-fg) 18%)}\" +\n \":where([data-xd] circle[data-maya=mark]){stroke:var(--maya-bg);stroke-width:1}\" +\n \"[data-maya=line]~circle[data-maya=mark]:not([data-active],[data-selected],[data-last]){fill-opacity:0}\" +\n \"[data-maya=line]{fill:none;stroke:var(--c);stroke-width:2;stroke-linejoin:round}\" +\n \"[data-maya=area]{fill:color-mix(in oklab,var(--c) 18%,transparent);stroke:none}\" +\n \"[data-maya=link]{fill:var(--c);opacity:.3}[data-maya=link][data-active]{opacity:.6}\" +\n // Dumbbell connector, kpi parts, y2 legend swatch.\n \"line[data-maya=link]{stroke:var(--c,var(--maya-fg-muted));opacity:1}\" +\n \"text[data-maya=mark]{fill:var(--maya-fg);font-weight:600}[data-kpi=track]{fill:var(--maya-grid)}[data-kpi=target]{stroke:var(--maya-fg)}\" +\n \"[data-maya=labels] [data-tone]{fill:var(--c)}[data-maya=labels] :is([data-kpi=period],[data-kpi=of]){fill:var(--maya-fg-muted)}\" +\n \"[data-line] i{height:2px;border-radius:1px}\" +\n \"[data-depth]{stroke:var(--maya-bg);stroke-width:1}\" +\n \"[data-maya=marks]:has([data-active]) [data-maya=mark]:not([data-active],text){opacity:.55}\" +\n \"[data-maya=marks]:has([data-selected]) [data-maya=mark]:not([data-selected]){opacity:.35}\" +\n \"[data-selected]{stroke:var(--maya-fg);stroke-width:2}\" +\n H +\n \"[data-maya=labels],[data-maya=cross]{pointer-events:none}[data-maya=cross]{opacity:0}\" +\n \"[data-maya=labels] text{fill:var(--maya-fg);paint-order:stroke;stroke:var(--maya-bg);stroke-width:3;stroke-linejoin:round}[data-maya=labels] [data-in]{stroke:none}\" +\n \"[data-maya=cross] line{stroke:var(--maya-fg-muted);stroke-dasharray:3 3}\" +\n \"[data-maya=brush]{fill:var(--maya-accent);fill-opacity:.12;stroke:var(--maya-accent);vector-effect:non-scaling-stroke;pointer-events:none}\" +\n \".maya-svg:focus-visible{outline:2px solid var(--maya-focus)}\" +\n \".maya-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\" +\n \".maya-probe{position:absolute;width:0;height:0;pointer-events:none;anchor-name:--maya-probe}\" +\n \".maya-tip{margin:0;inset:auto;border:0;padding:6px 8px;background:var(--maya-tooltip-bg);color:var(--maya-tooltip-fg);border-radius:6px;box-shadow:0 2px 8px #0003;font:var(--maya-font-size) var(--maya-font);pointer-events:none}\" +\n \"@supports (anchor-name:--x){.maya-tip{position-anchor:--maya-probe;position-area:block-start;position-try-fallbacks:flip-block,block-start span-inline-start,block-start span-inline-end;margin:8px}}\" +\n \".maya-tip{opacity:0;transition:opacity .12s}.maya-tip.maya-open{opacity:1}\" +\n \".maya-tip b{display:block}\" +\n \".maya-tip div{display:flex;align-items:center;gap:6px}.maya-tip i{outline:1px solid}\" +\n \".maya-tip [data-on]{font-weight:600}\" +\n \"@media (pointer:coarse){:is(.maya-legend,.maya-crumbs) button,.maya-ctl [role=radio],.maya-reset,.maya-crumbs{min-height:24px}}\" +\n \"@container (max-width:320px){.maya-legend{display:none}.maya-title{font-size:12px}}\" +\n \"@media (prefers-contrast:more){:host,.maya-root{--maya-fg-muted:var(--maya-fg);--maya-grid:color-mix(in oklab,var(--maya-fg) 40%,transparent)}}\" +\n \"@media (forced-colors:active){.maya-svg,i{forced-color-adjust:none}[data-maya=mark]{stroke:CanvasText;stroke-width:1}[data-tone=bad]{stroke-dasharray:4 2}}\" +\n \"@media (prefers-reduced-motion:reduce){*{transition:none!important}}\";\n","/*\n * Validation: hand-written guards, zero deps. Errors only. Every error:\n * mayacharts: <headline naming the spec path>\\n <detail lines>\\n -> https://bbekshr.github.io/mayacharts/errors.html#<code>\n * Order (first failure wins): object, unknown-option (HINTS, then \"did you mean\"), type, data/rows,\n * required fields, option types/values, ONLY + pair rules, field existence, numeric checks, Mark.check().\n * Codes:\n * spec-not-object spec is not a plain object\n * missing-field type/data/x|path/y absent (required fields + example)\n * unknown-type not core or registered (valid types, alias hint, \"did you mean\", or module import)\n * data-not-array data is not an array\n * row-not-object data[i] is not a plain object\n * unknown-field a field-valued option names no field in data\n * non-numeric-y data[i][y] not a finite number (null allowed; numeric strings get a coercion hint)\n * non-numeric-field size / scatter x / colorBy field, as above\n * non-positive-value treemap/sunburst/sankey y <= 0\n * unknown-option top-level key not in ChartSpec (HINTS, else \"did you mean\")\n * invalid-option wrong type/value for a known option\n * option-unsupported option not valid for this type or pair\n * stack-unsupported stack: true with type \"line\"\n * invalid-domain yDomain/xDomain not [lo, hi] with lo < hi\n * invalid-format unknown preset, bad Intl options, unsupported locale, bad currency\n * invalid-theme unknown theme token\n * unsafe-css-value colors/theme value outside the CSS allowlist\n * invalid-size RenderOptions width/height not finite > 0\n * unknown-state hexmap x names no US state (geo's Mark.check)\n * too-many-marks more than MAX_MARKS marks (thrown by render)\n * \"Did you mean\": smallest score (|len diff| + chars not shared; ties to longest prefix), only if <= 3.\n * Lookups keyed by user input go through Object.hasOwn or Array#includes.\n */\nimport { CORE_TYPES, MODULE_OF, MODULES, types } from \"./registry.ts\";\nimport { TEXT } from \"./strings.ts\";\nimport type {\n ChartSpec,\n ErrorCode,\n FieldFormat,\n RenderOptions,\n ResolvedSpec,\n View,\n} from \"./types.ts\";\n\nexport type { ErrorCode };\n\nexport class MayaSpecError extends Error {\n readonly code: ErrorCode;\n /** Spec path such as \"y\", \"data[3].revenue\", \"theme.accent\". */\n readonly path: string;\n constructor(code: ErrorCode, path: string, message: string) {\n super(message);\n this.name = \"MayaSpecError\";\n this.code = code;\n this.path = path;\n }\n}\n\n// ponytail: hard cap instead of virtualisation; suggest limit/aggregate.\nexport const MAX_MARKS = 5000;\n\nconst w = (s: string) => s.split(\" \");\nconst S: Record<string, \"string\" | \"boolean\"> = Object.fromEntries([\n ...w(\"$schema x y2 series size name title description locale currency\").map((k) => [k, \"string\"]),\n ...w(\"stack horizontal labels legend tooltip drill zoom grid xAxis yAxis table animate\").map(\n (k) => [k, \"boolean\"],\n ),\n]);\n/** Every spec key (schema.json is tested against this). */\nexport const KEYS = [\n ...w(\"type data y path totals aggregate sort limit format titles text yDomain xDomain select\"),\n ...w(\"colors colorBy theme\"),\n ...Object.keys(S),\n];\nconst CART = [\"bar\", \"line\", \"area\"];\nconst PATH = [\"treemap\", \"sunburst\", \"sankey\"];\n/** Option -> types that accept it (option-unsupported otherwise). */\nconst CPA = \"bar,line,area\";\nconst PTH = \"treemap,sunburst,sankey\";\nexport const ONLY: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n w(\n `horizontal:bar,dumbbell y2:bar size:scatter name:scatter path:${CPA},${PTH} totals:waterfall series:${CPA},scatter,heatmap,dumbbell sort:${CPA},heatmap,dumbbell limit:${CPA},heatmap,dumbbell stack:bar,area colorBy:${CPA},waterfall,scatter,dumbbell,kpi,treemap,sunburst,hexmap xDomain:scatter drill:${CPA},${PTH} select:${CPA},waterfall,scatter,heatmap,dumbbell,treemap,sunburst,hexmap zoom:line,area,scatter`,\n )\n .map((e) => e.split(\":\"))\n .map(([k, v]) => [k, v!.split(\",\")]),\n);\nconst AGGS = w(\"sum mean count min max\");\nconst PRESETS = w(\"auto integer decimal compact percent currency date month year time datetime\");\nconst DATE = w(\n \"dateStyle timeStyle weekday era year month day dayPeriod hour minute second fractionalSecondDigits timeZoneName timeZone hour12 hourCycle calendar\",\n);\n/** Format options holding any date key are Intl.DateTimeFormat options. */\nexport const isDateOpts = (o: object): boolean => DATE.some((k) => Object.hasOwn(o, k));\nconst TOKENS = [\n ...w(\"font fontSize fg fgMuted grid bg accent radius tooltipBg tooltipFg focus good bad\"),\n ...[1, 2, 3, 4, 5, 6, 7, 8].map((n) => \"series\" + n),\n];\nconst USE: Record<string, string> = {\n x: \"the category axis\",\n y: \"the plotted numbers\",\n y2: \"the right-axis line\",\n series: \"splitting rows into series\",\n size: \"bubble area\",\n name: \"point identity\",\n path: \"the hierarchy levels\",\n colorBy: \"colouring marks by value\",\n format: \"formatting that field\",\n titles: \"naming that field\",\n};\nconst HORIZ = \"Use horizontal: true to put categories on the left axis.\";\nconst SIZED = \"Size comes from the element's CSS box, or render(spec, { width, height }).\";\nconst PIE = 'Pie and donut charts are not supported: use \"bar\" or \"treemap\" to compare parts.';\nconst GEO = 'Use type: \"hexmap\" (import \"mayacharts/geo\").';\nconst EX =\n 'Example: { type: \"bar\", data: [{ month: \"Jan\", revenue: 10 }], x: \"month\", y: \"revenue\" }';\n/** Replacement text for foreign or retired option names, checked before \"did you mean\". */\nconst HINTS: Record<string, string> = {\n label: 'Use titles: { <field>: \"Name\" } for display names, or labels: true for values on marks.',\n xLabel:\n 'Use titles: { <x field>: \"Name\" }. titles is keyed by field and also names tooltips and table headers.',\n yLabel:\n 'Use titles: { <y field>: \"Name\" }. titles is keyed by field and also names tooltips, legend and table headers.',\n yFormat: 'Use format: \"compact\" (applies to every y), or format: { <field>: \"currency\" }.',\n dataKey: 'Use y: \"<field>\" for values and x: \"<field>\" for categories.',\n indexAxis: HORIZ,\n orientation: HORIZ,\n width: SIZED,\n height: SIZED,\n color: 'Use colors: [...] for the palette, or colorBy: \"sign\" | { target: n } | \"<field>\".',\n groupBy: 'Use series: \"<field>\".',\n formatter: \"Functions are not supported (the spec is JSON). Use format presets or Intl options.\",\n \"size:number\":\n \"spec.size names a field for bubble area. For chart size use CSS, or render(spec, { width, height }).\",\n \"select:boolean\": 'Use select: true or \"multi\"; omit it to disable selection.',\n};\n/** Foreign type names -> what to write instead. */\nconst ALIAS: Record<string, string> = {\n column: 'Use type: \"bar\".',\n barh: 'Use type: \"bar\" with horizontal: true.',\n bubble: 'Use type: \"scatter\" with size: \"<field>\".',\n choropleth: GEO,\n map: GEO,\n pie: PIE,\n donut: PIE,\n};\nconst FN = w(\"rgb rgba hsl hsla oklch oklab lab lch color color-mix light-dark var calc\");\nconst FAM = String.raw`\\s*(?:\"[\\w\\s.\\-]*\"|'[\\w\\s.\\-]*'|[\\w\\-]+(?:\\s+[\\w\\-]+)*)\\s*`;\nconst FONT = new RegExp(`^${FAM}(?:,${FAM})*$`);\n\nconst own = <T>(o: Readonly<Record<string, T>>, k: string): T | undefined =>\n Object.hasOwn(o, k) ? o[k] : undefined;\nconst isObj = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\nconst strs = (v: unknown, min = 0): v is string[] =>\n Array.isArray(v) && v.length >= min && v.every((c) => typeof c === \"string\");\nconst ty = (v: unknown) => (v === null ? \"null\" : Array.isArray(v) ? \"array\" : typeof v);\nconst show = (v: unknown) => {\n const t = typeof v === \"string\" || isObj(v) || Array.isArray(v) ? JSON.stringify(v) : String(v);\n return t.length > 60 ? t.slice(0, 59) + \"…\" : t;\n};\n\nexport const dym = (s: string, c: readonly string[]): string => {\n const a = s.toLowerCase();\n let best = \"\";\n let min = 40;\n for (const k of c) {\n const l = k.toLowerCase();\n const n = Math.abs(a.length - l.length) + [...l].filter((ch) => !a.includes(ch)).length;\n let p = 0; // ties go to the longest shared prefix\n while (p < 9 && a[p] !== undefined && a[p] === l[p]) p++;\n if (n < 4 && n * 10 - p < min) [min, best] = [n * 10 - p, k];\n }\n return best && `Did you mean \"${best}\"?`;\n};\n\nexport const fail = (code: ErrorCode, path: string, headline: string, ...d: string[]): never => {\n const lines = [...d, `-> https://bbekshr.github.io/mayacharts/errors.html#${code}`];\n const body = lines.filter(Boolean).map((l) => \" \" + l);\n throw new MayaSpecError(code, path, `mayacharts: ${headline}\\n${body.join(\"\\n\")}`);\n};\n\nconst bad = (k: string, v: unknown, want: string) =>\n fail(\n \"invalid-option\",\n k,\n `spec.${k} must be ${want}, received ${show(v)}.`,\n own(HINTS, `${k}:${ty(v)}`) ?? \"\",\n );\n\nconst css = (path: string, v: string, font: boolean) => {\n const ok = font\n ? FONT.test(v)\n : /^[#\\w\\s.,%()+\\-\\/]*$/.test(v) &&\n [...v.matchAll(/([\\w-]*)\\s*\\(/g)].every((m) => FN.includes(m[1]!.toLowerCase()));\n if (!v || !ok)\n fail(\n \"unsafe-css-value\",\n path,\n `spec.${path} = ${show(v)} is not a safe CSS value.`,\n `Allowed: colours, lengths, numbers and ${FN.join(\"() \")}(); fonts are family names.`,\n \"Not allowed: url(), image-set(), other functions, ; { } < > \\\\ and (outside fonts) quotes.\",\n );\n};\n\nconst bFmt = (p: string, headline: string, ...d: string[]) =>\n fail(\"invalid-format\", p, headline, ...d);\n\nconst format = (path: string, v: unknown, locale: string) => {\n if (typeof v === \"string\") {\n if (!PRESETS.includes(v))\n bFmt(\n path,\n `spec.${path} = ${show(v)} is not a format preset.`,\n `Presets: ${PRESETS.join(\", \")}. Or per field: { <field>: preset or Intl options }.`,\n dym(v, PRESETS),\n );\n return;\n }\n if (!isObj(v)) bFmt(path, `spec.${path} must be a preset or Intl options, received ${show(v)}.`);\n const { prefix, suffix, ...o } = v as Record<string, unknown>;\n for (const [k, a] of [\n [\"prefix\", prefix],\n [\"suffix\", suffix],\n ] as const)\n if (a !== undefined && typeof a !== \"string\")\n bFmt(`${path}.${k}`, `spec.${path}.${k} must be a string, received ${show(a)}.`);\n const dt = isDateOpts(o);\n try {\n void (dt ? new Intl.DateTimeFormat(locale, o) : new Intl.NumberFormat(locale, o));\n } catch (e) {\n bFmt(\n path,\n `spec.${path} = ${show(v)} is not valid ${dt ? \"Intl.DateTimeFormat\" : \"Intl.NumberFormat\"} options.`,\n e instanceof Error ? e.message : String(e),\n );\n }\n};\n\n/** Table-driven option checks: [key, expected shape, predicate]. Applied only when the key is set. */\nconst CHECKS: [string, string, (v: any) => boolean][] = [\n [\n \"y\",\n \"a field name or a non-empty array of field names\",\n (v) => typeof v === \"string\" || strs(v, 1),\n ],\n [\"path\", \"a non-empty array of field names\", (v) => strs(v, 1)],\n [\"totals\", \"an array of x values (strings)\", (v) => strs(v)],\n [\"aggregate\", `one of ${AGGS.join(\", \")}`, (v) => AGGS.includes(v)],\n [\"sort\", '\"asc\" or \"desc\"', (v) => v === \"asc\" || v === \"desc\"],\n [\"limit\", \"a positive integer\", (v) => Number.isInteger(v) && v > 0],\n [\"select\", 'true or \"multi\"', (v) => v === true || v === \"multi\"],\n [\n \"colorBy\",\n '\"sign\", { target: number } or a numeric field name',\n (v) =>\n (typeof v === \"string\" && !!v) ||\n (isObj(v) && Object.keys(v).join() === \"target\" && Number.isFinite(v.target)),\n ],\n [\n \"titles\",\n \"an object of strings keyed by field\",\n (v) => isObj(v) && Object.values(v).every((x) => typeof x === \"string\"),\n ],\n];\n\nexport function validateSpec(spec: unknown): asserts spec is ChartSpec {\n if (!isObj(spec))\n fail(\n \"spec-not-object\",\n \"spec\",\n `spec must be a plain object, received ${ty(spec)}.`,\n `Received: ${show(spec)}`,\n );\n const s = spec as Record<string, unknown>;\n for (const k of Object.keys(s))\n if (!KEYS.includes(k))\n fail(\n \"unknown-option\",\n k,\n `spec.${k} is not a known option.`,\n own(HINTS, k) ?? dym(k, KEYS),\n `Known options: ${KEYS.join(\", \")}.`,\n );\n\n const type = s.type;\n if (type === undefined)\n fail(\n \"missing-field\",\n \"type\",\n \"spec.type is required but missing.\",\n \"Required fields: type, data, x, y.\",\n EX,\n );\n const known = [...CORE_TYPES, ...types()];\n const str = typeof type === \"string\" ? type : undefined;\n if (str === undefined || !known.includes(str)) {\n const mod = str === undefined ? undefined : own(MODULE_OF, str);\n if (mod)\n fail(\n \"unknown-type\",\n \"type\",\n `spec.type = \"${type}\" needs the \"${mod}\" module, which is not loaded.`,\n `Add: import \"mayacharts/${mod}\"`,\n );\n fail(\n \"unknown-type\",\n \"type\",\n `spec.type = ${show(type)} is not a chart type.`,\n `Valid types: ${known.join(\", \")}.`,\n str === undefined ? \"\" : (own(ALIAS, str) ?? dym(str, [...known, ...Object.keys(MODULE_OF)])),\n );\n }\n const t = type as string;\n const isPath = PATH.includes(t);\n const need = isPath ? \"path\" : \"x\";\n const pth = (spec as Record<string, unknown>)[\"path\"];\n if (t === \"sankey\" && Array.isArray(pth) && pth.length < 2)\n fail(\n \"invalid-option\",\n \"path\",\n \"spec.path needs at least two levels for a sankey.\",\n 'Example: path: [\"region\", \"family\"]',\n );\n const missing = (f: string) =>\n fail(\n \"missing-field\",\n f,\n `spec.${f} is required but missing.`,\n `Required fields: type, data, ${need}, y.`,\n isPath\n ? `Example: { type: \"${t}\", data: [{ region: \"N\", state: \"NY\", sales: 10 }], path: [\"region\", \"state\"], y: \"sales\" }`\n : EX,\n );\n\n if (s.data === undefined) missing(\"data\");\n if (!Array.isArray(s.data))\n fail(\"data-not-array\", \"data\", `spec.data must be an array of rows, received ${ty(s.data)}.`);\n const rows = s.data as Record<string, unknown>[];\n rows.forEach((r, i) => {\n if (!isObj(r))\n fail(\n \"row-not-object\",\n `data[${i}]`,\n `spec.data[${i}] must be an object, received ${ty(r)}.`,\n `Received: ${show(r)}`,\n );\n });\n if (\n s[need] === undefined &&\n t !== \"kpi\" &&\n !(need === \"x\" && CART.includes(t) && s.path !== undefined)\n )\n missing(need);\n if (s.y === undefined) missing(\"y\");\n if (t === \"dumbbell\" && s.series === undefined) missing(\"series\");\n\n for (const k in S) if (s[k] !== undefined && typeof s[k] !== S[k]) bad(k, s[k], `a ${S[k]}`);\n for (const [k, want, ok] of CHECKS) if (s[k] !== undefined && !ok(s[k])) bad(k, s[k], want);\n const { y, path, select, colors, colorBy, theme, text } = s;\n if (text !== undefined) {\n if (!isObj(text)) bad(\"text\", text, \"an object of strings\");\n for (const [k, v] of Object.entries(text as object)) {\n if (!Object.hasOwn(TEXT, k))\n fail(\n \"invalid-option\",\n `text.${k}`,\n `spec.text.${k} is not a text key.`,\n dym(k, Object.keys(TEXT)),\n `Text keys: ${Object.keys(TEXT).join(\", \")}.`,\n );\n if (typeof v !== \"string\") bad(`text.${k}`, v, \"a string\");\n }\n }\n for (const k of [\"yDomain\", \"xDomain\"]) {\n const d = s[k] as number[] | undefined;\n if (\n d !== undefined &&\n !(\n Array.isArray(d) &&\n d.length === 2 &&\n Number.isFinite(d[0]) &&\n Number.isFinite(d[1]) &&\n d[0]! < d[1]!\n )\n )\n fail(\n \"invalid-domain\",\n k,\n `spec.${k} = ${show(d)} is not a valid domain.`,\n \"Expected [min, max] with finite numbers and min < max, e.g. [0, 100].\",\n );\n }\n\n let locale = \"en-US\";\n if (typeof s.locale === \"string\") {\n let ok = false;\n try {\n ok = Intl.NumberFormat.supportedLocalesOf(s.locale).length > 0;\n } catch {}\n if (!ok)\n bFmt(\n \"locale\",\n `spec.locale = ${show(s.locale)} is not a locale this runtime supports.`,\n 'Use a BCP 47 tag such as \"de-DE\". Node built with small ICU supports English only.',\n );\n locale = s.locale;\n }\n if (typeof s.currency === \"string\")\n try {\n new Intl.NumberFormat(locale, { style: \"currency\", currency: s.currency });\n } catch {\n bFmt(\n \"currency\",\n `spec.currency = ${show(s.currency)} is not an ISO 4217 currency code.`,\n 'Use a three-letter code such as \"USD\" or \"EUR\".',\n );\n }\n if (typeof s.format === \"string\") format(\"format\", s.format, locale);\n else if (s.format !== undefined) {\n if (!isObj(s.format)) bad(\"format\", s.format, \"a preset or an object keyed by field\");\n for (const [k, v] of Object.entries(s.format as object)) format(`format.${k}`, v, locale);\n }\n\n if (colors !== undefined) {\n const entries = Array.isArray(colors)\n ? colors.map((c, i) => [`[${i}]`, c])\n : isObj(colors)\n ? Object.entries(colors).map(([k, c]) => [`.${k}`, c])\n : null;\n if (!entries || !entries.every(([, c]) => typeof c === \"string\"))\n bad(\"colors\", colors, \"an array of colours, or an object of colours by series value\");\n if (entries!.length > 8)\n fail(\n \"invalid-option\",\n \"colors\",\n `spec.colors has ${entries!.length} colours; the palette has 8 slots.`,\n \"Pass at most 8. Series 9 and later reuse slots in order.\",\n );\n for (const [p, c] of entries!) css(`colors${p}`, c as string, false);\n }\n if (theme !== undefined) {\n if (!(isObj(theme) && Object.values(theme).every((c) => typeof c === \"string\")))\n bad(\"theme\", theme, \"an object of string values\");\n for (const k of Object.keys(theme as object))\n if (!TOKENS.includes(k))\n fail(\n \"invalid-theme\",\n `theme.${k}`,\n `spec.theme.${k} is not a theme token.`,\n `Valid tokens: ${TOKENS.join(\", \")}.`,\n dym(k, TOKENS),\n );\n for (const [k, v] of Object.entries(theme as Record<string, string>))\n css(`theme.${k}`, v, k === \"font\");\n }\n\n if (s.stack === true && t === \"line\")\n fail(\n \"stack-unsupported\",\n \"stack\",\n 'spec.stack is not supported with spec.type = \"line\".',\n 'Use type \"area\" (or \"bar\") to stack series.',\n );\n for (const k in ONLY)\n if (s[k] !== undefined && s[k] !== false && !ONLY[k]!.includes(t))\n fail(\n \"option-unsupported\",\n k,\n `spec.${k} is not supported with spec.type = \"${t}\".`,\n `spec.${k} works with: ${ONLY[k]!.join(\", \")}.`,\n );\n const cart = CART.includes(t);\n const pairs: [boolean, string, string, string][] = [\n [\n colorBy !== undefined && s.series !== undefined && t !== \"dumbbell\",\n \"colorBy\",\n \"spec.colorBy cannot be combined with spec.series.\",\n \"Series already set the colours; remove one of them.\",\n ],\n [\n s.yDomain !== undefined && Array.isArray(y),\n \"yDomain\",\n \"spec.yDomain cannot be combined with a y array.\",\n \"Each measure needs its own domain; use a single y or remove yDomain.\",\n ],\n [\n s.drill === true && select !== undefined,\n \"select\",\n \"spec.select cannot be combined with spec.drill.\",\n \"A click either drills or selects; choose one.\",\n ],\n [\n cart && path !== undefined && s.x !== undefined,\n \"x\",\n \"spec.x cannot be combined with spec.path.\",\n \"With path, the current drill level is the category; remove x.\",\n ],\n [\n s.y2 !== undefined && s.horizontal === true,\n \"y2\",\n \"spec.y2 cannot be combined with spec.horizontal.\",\n \"The y2 line needs a right value axis; draw vertical bars.\",\n ],\n [\n t === \"kpi\" && colorBy !== undefined && !isObj(colorBy),\n \"colorBy\",\n 'spec.colorBy on \"kpi\" must be { target: number }.',\n \"A kpi compares its headline with one target, drawn as a bullet bar.\",\n ],\n [\n cart && s.drill === true && path === undefined,\n \"drill\",\n `spec.drill on \"${t}\" needs spec.path.`,\n 'Replace x with path: [\"region\", \"state\"] (outer to inner).',\n ],\n ];\n for (const [hit, k, headline, detail] of pairs)\n if (hit) fail(\"option-unsupported\", k, headline, detail);\n\n if (rows.length) {\n const found = [...new Set(rows.flatMap((r) => Object.keys(r)))];\n const unk = (p: string, headline: string, f: string, use: string) =>\n fail(\n \"unknown-field\",\n p,\n headline,\n `Fields found: ${found.slice(0, 20).join(\", \")}.`,\n dym(f, found),\n use,\n );\n const ys = typeof y === \"string\" ? [y] : (y as string[]);\n const arr = (o: string, a: string[]): [string, string][] => a.map((f, i) => [`${o}[${i}]`, f]);\n const fields: [string, unknown][] = [\n [\"x\", s.x],\n ...(typeof y === \"string\" ? [[\"y\", y] as [string, string]] : arr(\"y\", ys)),\n [\"series\", s.series],\n [\"y2\", s.y2],\n [\"size\", s.size],\n [\"name\", s.name],\n ...arr(\"path\", (path as string[] | undefined) ?? []),\n [\"colorBy\", colorBy === \"sign\" ? undefined : colorBy],\n ];\n for (const [p, f] of fields) {\n if (typeof f !== \"string\" || found.includes(f)) continue;\n const opt = p.replace(/\\[.*/, \"\");\n unk(\n p,\n `spec.${p} = ${show(f)} is not a field in spec.data.`,\n f,\n `spec.${opt} names the field used for ${USE[opt]}.`,\n );\n }\n for (const opt of [\"format\", \"titles\"])\n if (isObj(s[opt]))\n for (const f of Object.keys(s[opt] as object))\n if (!found.includes(f))\n unk(\n `${opt}.${f}`,\n `spec.${opt} key \"${f}\" is not a field in spec.data.`,\n f,\n `spec.${opt} keys name fields, for ${USE[opt]}.`,\n );\n if (colorBy === \"sign\" && found.includes(\"sign\"))\n fail(\n \"invalid-option\",\n \"colorBy\",\n 'spec.colorBy = \"sign\" colours by the sign of y, but spec.data also has a field named \"sign\".',\n \"Rename that field (e.g. data.map(({ sign, ...r }) => ({ ...r, signValue: sign }))) to colour by it.\",\n );\n\n const scan = (f: string, g: (v: unknown, p: string) => void) =>\n rows.forEach((r, i) => g(r[f], `data[${i}].${f}`));\n const numeric = (f: string, code: ErrorCode, opt: string) =>\n scan(f, (v, p) => {\n if (v == null || (typeof v === \"number\" && Number.isFinite(v))) return;\n fail(\n code,\n p,\n `spec.${p} is ${show(v)} (a ${ty(v)}), but spec.${opt} requires numbers.`,\n typeof v === \"string\" && v.trim() && Number.isFinite(Number(v))\n ? `Convert first: data.map(r => ({ ...r, ${f}: Number(r.${f}) }))`\n : \"Use null for a gap in the data.\",\n );\n });\n for (const f of ys) numeric(f, \"non-numeric-y\", \"y\");\n if (typeof s.size === \"string\") numeric(s.size, \"non-numeric-field\", \"size\");\n if (typeof s.y2 === \"string\") numeric(s.y2, \"non-numeric-field\", \"y2\");\n if (t === \"dumbbell\" && typeof s.series === \"string\") {\n const n = new Set(rows.map((r) => String(r[s.series as string]))).size;\n if (n !== 2)\n fail(\n \"invalid-option\",\n \"series\",\n `spec.series on \"dumbbell\" needs exactly 2 values, found ${n}.`,\n \"The first value seen is the start of each bar, the second the end, e.g. last year and this year.\",\n );\n }\n if (t === \"scatter\" && typeof s.x === \"string\") numeric(s.x, \"non-numeric-field\", \"x\");\n if (typeof colorBy === \"string\" && colorBy !== \"sign\")\n numeric(colorBy, \"non-numeric-field\", \"colorBy\");\n if (isPath)\n for (const f of ys)\n scan(f, (v, p) => {\n if (typeof v === \"number\" && v <= 0)\n fail(\n \"non-positive-value\",\n p,\n `spec.${p} is ${v}, but ${t} sizes must be positive.`,\n `Filter first: data.filter(r => r.${f} > 0), or chart the signed values with \"bar\".`,\n );\n });\n }\n MODULES.get(t)?.check?.(spec as unknown as ChartSpec, fail);\n}\n\nexport function validateOptions(opts: unknown): asserts opts is RenderOptions {\n if (opts === undefined) return;\n if (!isObj(opts))\n fail(\"invalid-option\", \"options\", `options must be a plain object, received ${ty(opts)}.`);\n const o = opts as Record<string, unknown>;\n const unknown = (p: string, k: string, keys: string[]) =>\n fail(\n \"unknown-option\",\n `${p}.${k}`,\n `${p}.${k} is not a known render option.`,\n dym(k, keys),\n `Known options: ${keys.join(\", \")}.`,\n );\n const keys = w(\"width height view selected nonce\");\n for (const k of Object.keys(o)) if (!keys.includes(k)) unknown(\"options\", k, keys);\n const inv = (p: string, v: unknown, want: string) =>\n fail(\"invalid-option\", `options.${p}`, `options.${p} must be ${want}, received ${show(v)}.`);\n for (const k of [\"width\", \"height\"]) {\n const v = o[k];\n if (v !== undefined && !(typeof v === \"number\" && Number.isFinite(v) && v > 0))\n fail(\n \"invalid-size\",\n `options.${k}`,\n `options.${k} = ${show(v)} is not a valid size.`,\n \"Size must be a finite number greater than 0.\",\n );\n }\n const { view: v, selected: sel, nonce } = o;\n if (v !== undefined) {\n if (!isObj(v)) inv(\"view\", v, \"an object\");\n const vk = w(\"measure drill window hidden\");\n for (const k of Object.keys(v as object)) if (!vk.includes(k)) unknown(\"options.view\", k, vk);\n const { measure, drill, window: win, hidden } = v as Record<string, unknown>;\n if (measure !== undefined && !(Number.isInteger(measure) && (measure as number) >= 0))\n inv(\"view.measure\", measure, \"an index (integer >= 0)\");\n if (drill !== undefined && !strs(drill)) inv(\"view.drill\", drill, \"an array of strings\");\n if (hidden !== undefined && !strs(hidden)) inv(\"view.hidden\", hidden, \"an array of strings\");\n if (\n win !== undefined &&\n !(Array.isArray(win) && (win.length === 2 || win.length === 4) && win.every(Number.isFinite))\n )\n inv(\"view.window\", win, \"[i0, i1] or [x0, x1, y0, y1] of finite numbers\");\n }\n if (\n sel !== undefined &&\n !(\n Array.isArray(sel) &&\n sel.every((e) => isObj(e) && Object.keys(e).every((k) => [\"x\", \"series\", \"name\"].includes(k)))\n )\n )\n inv(\"selected\", sel, \"an array of { x?, series?, name? }\");\n if (nonce !== undefined && !(typeof nonce === \"string\" && /^[\\w+/=-]+$/.test(nonce)))\n inv(\"nonce\", nonce, \"a base64 nonce string\");\n}\n\n/**\n * Apply defaults plus the view's measure and drill. Assumes `spec` passed validateSpec.\n * Drill keeps rows whose path[i] equals drill[i], then advances: bar/line/area take the next\n * level as x; path types keep the remaining levels.\n */\nexport function resolve(spec: ChartSpec, view: View = {}): ResolvedSpec {\n const measures = typeof spec.y === \"string\" ? [spec.y] : [...spec.y];\n const measure = Math.min(view.measure ?? 0, measures.length - 1);\n const full = [...(spec.path ?? [])];\n const drilled = spec.drill ? (view.drill ?? []).slice(0, Math.max(0, full.length - 1)) : [];\n const path = full.slice(drilled.length);\n const f = spec.format;\n const entries = <T>(o: Readonly<Partial<Record<string, T>>> | undefined) =>\n Object.entries(o ?? {}).filter((e): e is [string, T] => e[1] !== undefined);\n return {\n type: spec.type,\n data: drilled.length\n ? spec.data.filter((r) => drilled.every((d, i) => String(r[full[i]!]) === d))\n : spec.data,\n x: spec.x ?? (CART.includes(spec.type) ? (path[0] ?? \"\") : \"\"),\n y: measures[measure]!,\n measures,\n measure,\n series: spec.series ?? null,\n y2: spec.y2 ?? null,\n path,\n drilled,\n window: view.window && view.window.length === 4 ? view.window : null,\n size: spec.size ?? null,\n name: spec.name ?? null,\n totals: [...(spec.totals ?? [])],\n stack: spec.stack ?? false,\n horizontal: spec.horizontal ?? false,\n aggregate: spec.aggregate ?? \"sum\",\n sort: spec.sort ?? null,\n limit: spec.limit ?? null,\n format: new Map(typeof f === \"string\" ? measures.map((m) => [m, f]) : entries<FieldFormat>(f)),\n titles: new Map(entries<string>(spec.titles)),\n labels: spec.labels ?? null,\n text: { ...spec.text },\n title: spec.title ?? null,\n description: spec.description ?? null,\n legend: spec.legend ?? (spec.series !== undefined || spec.y2 !== undefined),\n tooltip: spec.tooltip ?? true,\n drill: spec.drill ?? false,\n select: spec.select ?? false,\n zoom: spec.zoom ?? false,\n grid: spec.grid ?? true,\n xAxis: spec.xAxis ?? true,\n yAxis: spec.yAxis ?? true,\n locale: spec.locale ?? \"en-US\",\n currency: spec.currency ?? \"USD\",\n yDomain: spec.yDomain ?? null,\n xDomain: spec.xDomain ?? null,\n table: spec.table ?? true,\n animate: spec.animate ?? true,\n colors: Array.isArray(spec.colors)\n ? spec.colors\n : spec.colors\n ? new Map(Object.entries(spec.colors))\n : null,\n colorBy: spec.colorBy ?? null,\n theme: spec.theme ?? {},\n };\n}\n","/*\n * Public signatures take `ChartSpec<R> | ChartSpec`: R is inferred from `data` so typed rows\n * get field autocomplete, while spreading a Row-typed spec with new rows still compiles.\n *\n * mayaCharts core — design note (the contract every module and the element layer follow)\n * =====================================================================================\n *\n * Pipeline: validateSpec -> resolve(spec, view) -> shape -> niceTicks -> format -> layout\n * -> scales -> Mark.draw(ctx) -> assemble. Pure, synchronous, deterministic (same\n * input, same bytes). `src/core/**` never imports `src/element/**` and never\n * touches window/document (a test deletes globalThis.window and imports it).\n *\n * State: interaction state is not in the spec. RenderOptions.view = { measure, drill, window,\n * hidden } and RenderOptions.selected = Sel[] (raw values). resolve() applies measure\n * (active y, measures[] kept for the control) and drill (filter rows, advance x/path).\n * shape() applies, in order: aggregate -> sort -> limit -> window -> hidden. SSR can\n * therefore render any state.\n *\n * Marks: `CORE[type] ?? MODULES.get(type)`. CORE is the static map below; modules\n * (hierarchy, flow, geo) call registry.register() on import. A Mark is\n * { noun, axes?(spec, shaped): [bottom, left], check?(spec, fail), draw(ctx) }.\n * MarkCtx closures: fmt(field, v, step?), label(x, y, text, place), tone(v), agg(kind),\n * fail(code, path, headline, ...details), t(key, ...args); plus spec, shaped, width,\n * height, plot, x (bottom-axis scale), y (left-axis scale). Modules import only\n * registry.ts, svg.ts, scale.ts, ticks.ts and types.\n *\n * Outputs\n * render(spec, opts) standalone `<svg class=\"maya-root\">` with an embedded <style>.\n * Works as a file, in <img>, or rasterized by the hosted API.\n * renderShell(spec, opts) `<maya-chart>` with Declarative Shadow DOM + JSON spec child.\n * The JSON child is the spec with rows projected to referenced\n * fields only (x y series size name path colorBy, format and\n * titles keys). `opts.nonce` lands on the shell's <style>.\n * renderParts(spec, opts) the pieces (svg without <style>, legend, controls, crumbs, table,\n * title, override style + vars, warnings).\n *\n * Shadow content (identical from renderShell and the element, built by `shellInner`).\n * Slot order is fixed:\n * <style>CSS</style>\n * <div class=\"maya\" style=\"OVERRIDES\">\n * TITLE CONTROLS LEGEND CRUMBS\n * <div class=\"maya-box\">SVG</div>\n * TABLE\n * <div class=\"maya-sr\" data-maya=\"live\" aria-live=\"polite\"></div> static, never replaced\n * <div class=\"maya-probe\" data-maya=\"probe\"></div>\n * <div class=\"maya-tip\" popover=\"manual\" role=\"tooltip\"></div>\n * </div>\n *\n * SVG structure (render/renderParts):\n * <svg class=\"maya-svg\" viewBox=\"0 0 W H\" width=\"W\" height=\"H\" role=\"img\"\n * aria-labelledby=\"maya-t\" aria-describedby=\"maya-d\" [tabindex=\"0\" in parts only]\n * data-plot=\"x y w h\" data-n=\"categories\" [data-xd=\"lo hi\" data-yd=\"lo hi\" for\n * linear-x types instead of data-n] [data-dir=\"h\" when horizontal]>\n * <title id=\"maya-t\"> <desc id=\"maya-d\">\n * <g data-maya=\"grid\"> lines perpendicular to the value axis\n * <g data-maya=\"axis-y\"> tick labels (text-anchor end), axis title when titles has it\n * <g data-maya=\"axis-x\"> category labels (thinned to fit), axis title\n * <g data-maya=\"marks\"> only [data-key] children, one tag per key\n * <g data-maya=\"labels\"> value labels (text), from ctx.label\n * <g data-maya=\"cross\"> crosshair (line/area), moved via CSSOM transform\n * <g data-maya=\"hits\"> invisible enlarged targets (see below)\n * Empty data: grid/axes/groups omitted, `<text data-maya=\"empty\">` (text.noData) centered.\n * Marks group attributes are synced on patch.\n *\n * Hydration contract — the ONLY selectors the element layer may rely on:\n * [data-maya=\"mark\"] attrs: data-key, data-c (category index; unique per mark for non-band\n * types), data-s (palette slot = series index % 8), data-x (formatted\n * category), data-y (raw value), data-series (series key, \"\" when\n * none), data-f (formatted value). data-neg when value < 0.\n * Optional: data-tone=\"good|bad\", data-q (ramp step), data-other\n * (limit roll-up), data-depth, data-selected.\n * bar + y2: one `path[data-maya=line]` plus a point circle mark per\n * non-null category, data-s = series count % 8, data-series = the\n * y2 title; hits are 24px squares round each point.\n * Line: point circles are marks (hidden until active) plus one\n * keyless full-height band hit per category.\n * [data-maya=\"hit\"] same payload as its mark (incl. data-key). Emitted only when the\n * mark is narrower or shorter than 24px: the mark's rect grown to\n * >= 24px in that dimension, centered. fill=\"transparent\".\n * [data-maya=\"probe\"] / .maya-tip tooltip anchor probe + popover (shell only).\n * [data-maya=\"live\"] the static polite live region; written via textContent only.\n * [data-maya=\"legend\"] buttons: <button type=\"button\" data-si=\"i\" data-s=\"i%8\"\n * data-key=\"KEY\" aria-pressed=\"true|false\"><i></i>KEY</button>\n * With y2 the legend also holds non-button <span data-s data-line>\n * entries (the line; the bar measure too when there is no series).\n * Ramp/tone legends are non-button <div data-maya=\"ramp|tone\">.\n * The tooltip reads its content from these attributes; the element never sees rows.\n *\n * Key grammar (svg.ts key(...parts)): each part encodeURIComponent'ed with `~` -> %7E,\n * joined by `~`. Band `S~C`; line/area `l~S`/`a~S`; scatter `S~name(#n)` or index;\n * bar y2 line `l~\\u0000y2`, its points `\\u0000y2~C` (NUL cannot be a series key prefix);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap\n * `g~CODE`; limit roll-up category is the sentinel OTHER (\"\\u0000other\").\n * The element diffs marks by data-key (and tagName), never by index.\n *\n * CSS hooks theme.ts styles (interaction modules never touch theme.ts):\n * .maya-ctl [role=radio][aria-checked] .maya-crumbs .maya-reset .maya-err\n * [data-maya=brush] [data-maya=cross] [data-maya=link] [data-depth] [data-selected]\n * [data-tone] [data-q] [data-other] [data-dir=h] [data-maya=line|area] (path marks)\n * .maya-ctl carries data-n (option count, 2..4) and data-i (checked index) for the sliding\n * indicator; line point circles are hidden until active under `svg[data-n]`.\n *\n * Keyboard (one keydown dispatcher in maya-chart.ts; handlers return \"handled\"):\n * Escape priority: pinned tooltip -> brush in progress -> selection -> zoom window -> drill\n * pop. Enter activates drill, else select, on the tooltip's active mark; Space pins.\n *\n * Colors: never inline. CSS rules `[data-s=\"0\"]..[data-s=\"7\"]` map to --maya-series-1..8;\n * --maya-series-1 defaults to var(--maya-accent) so single-series charts use the\n * accent. spec.colors / spec.theme become custom properties in `Parts.vars` (applied\n * with style.setProperty by the element) and `Parts.style` (style attribute in render()\n * and renderShell() output only). Every value passes the CSS allowlist in validate.ts.\n *\n * Animation contract (element/animate.ts): marks get\n * `transform-box: fill-box; transform-origin: 0 0` from CSS. The element commits new\n * geometry attributes immediately and animates ONLY transform/opacity:\n * update: from translate(oldX-newX, oldY-newY) scale(oldW/newW, oldH/newH) to none\n * enter: positive bar from translate(0, h) scale(1, 0); negative from scale(1, 0);\n * plus opacity 0 -> 1\n * exit: reverse of enter, then remove on finish\n * Guard zero sizes (use 1e-6). Skip entirely under prefers-reduced-motion or\n * spec.animate === false.\n *\n * Layout (layout.ts frame()): no text measurement exists in Node, so axis label widths are\n * estimated as 0.6 em per code point (1 em for East-Asian-wide) * 12 + 8, value labels\n * (ctx.label) as chars * 7.2 + 4. Labels are never rotated; band axes draw every nth label\n * (bottom: by width, left: 14 px per step); left band labels are cut at 40% of the width.\n * Coordinates are rounded to 2 decimals (`r()` in svg.ts).\n *\n * Legend and title are HTML, not SVG (free wrapping and font metrics). render() — the\n * bare SVG — therefore has no legend; renderShell() is the full-fidelity output.\n */\nimport { dataTable, describe, titleText } from \"./a11y.ts\";\nimport { formatter } from \"./format.ts\";\nimport { frame } from \"./layout.ts\";\nimport { bar } from \"./marks/bar.ts\";\nimport { dumbbell } from \"./marks/dumbbell.ts\";\nimport { heatmap } from \"./marks/heatmap.ts\";\nimport { kpi } from \"./marks/kpi.ts\";\nimport { area, line } from \"./marks/line.ts\";\nimport { scatter } from \"./marks/scatter.ts\";\nimport { MODULES } from \"./registry.ts\";\nimport { agg, shape } from \"./shape.ts\";\nimport { t } from \"./strings.ts\";\nimport { css } from \"../styles/theme.ts\";\nimport { el, esc, OTHER, r } from \"./svg.ts\";\nimport { fail, MAX_MARKS, resolve, validateOptions, validateSpec } from \"./validate.ts\";\nimport type {\n Aggregate,\n ChartSpec,\n LabelPlace,\n Mark,\n MarkCtx,\n Parts,\n RenderOptions,\n Row,\n} from \"./types.ts\";\n\nconst CORE: Readonly<Record<string, Mark>> = {\n bar,\n waterfall: bar,\n line,\n area,\n scatter,\n heatmap,\n kpi,\n dumbbell,\n};\n\nconst kebab = (s: string) => s.replace(/[A-Z]|\\d+/g, (c) => \"-\" + c.toLowerCase());\n\nfunction build(spec: ChartSpec, opts: RenderOptions | undefined, sheet: string | null): Parts {\n validateSpec(spec);\n if (opts !== undefined) validateOptions(opts);\n // validateSpec guarantees the type is core or registered.\n const mark = (Object.hasOwn(CORE, spec.type) ? CORE[spec.type] : MODULES.get(spec.type))!;\n const s = resolve(spec, opts?.view);\n const W = opts?.width ?? 640;\n const H = opts?.height ?? 320;\n const shaped = shape(s, opts?.view ?? {});\n const cap = (n: number) =>\n n > MAX_MARKS &&\n fail(\n \"too-many-marks\",\n \"data\",\n `${n} marks exceed the limit of ${MAX_MARKS}.`,\n \"Use spec.limit to keep the top N categories, or aggregate the rows first.\",\n );\n cap(shaped.cells.length);\n\n // Formatters are cached per (field, step): marks call fmt once per value.\n const fmts = new Map<string, (v: unknown) => string>();\n const fmt = (field: string, v: unknown, step?: number) => {\n if (v === OTHER) return t(s, \"other\");\n const k = field + \"\\0\" + step;\n let f = fmts.get(k);\n if (!f) fmts.set(k, (f = formatter(s, field, step)));\n return f(v);\n };\n\n // colorBy: sign/target give tone; a numeric field gives a 0..9 bucket over its extent.\n const cb = s.colorBy;\n let lo = Infinity;\n let hi = -Infinity;\n if (typeof cb === \"string\" && cb !== \"sign\")\n for (const row of s.data) {\n const v = row[cb];\n if (typeof v === \"number\") ((lo = Math.min(lo, v)), (hi = Math.max(hi, v)));\n }\n const tone = (v: number): \"good\" | \"bad\" | null =>\n cb === \"sign\"\n ? v < 0\n ? \"bad\"\n : \"good\"\n : cb && typeof cb === \"object\"\n ? v >= cb.target\n ? \"good\"\n : \"bad\"\n : null;\n const toneText = (v: number) => {\n const n = tone(v);\n return n === null\n ? null\n : t(\n s,\n cb === \"sign\"\n ? n === \"good\"\n ? \"positive\"\n : \"negative\"\n : n === \"good\"\n ? \"above\"\n : \"below\",\n );\n };\n\n // Value labels: estimated boxes, a later label that overlaps a placed one (or leaves the svg) is dropped.\n const boxes: number[][] = [];\n let labels = \"\";\n const label = (x: number, y: number, text: string, place: LabelPlace) => {\n const w = text.length * 7.2 + 4;\n const l = place === \"start\" ? x : place === \"end\" ? x - w : x - w / 2;\n const tp = place === \"above\" ? y - 16 : place === \"below\" ? y + 2 : y - 7;\n // ponytail: O(n^2) overlap scan; MAX_MARKS bounds it.\n if (\n l < 0 ||\n tp < 0 ||\n l + w > W ||\n tp + 14 > H ||\n boxes.some((b) => l < b[2]! && l + w > b[0]! && tp < b[3]! && tp + 14 > b[1]!)\n )\n return false;\n boxes.push([l, tp, l + w, tp + 14]);\n labels += el(\n \"text\",\n {\n x: r(x),\n y: r(place === \"above\" ? y - 4 : place === \"below\" ? y + 13 : y),\n \"text-anchor\": place === \"start\" || place === \"end\" ? place : \"middle\",\n \"dominant-baseline\": place === \"above\" || place === \"below\" ? null : \"middle\",\n \"data-in\": place === \"center\", // sits on a mark: no halo\n },\n esc(text),\n );\n return true;\n };\n\n const f = mark.axes ? frame(s, mark.axes(s, shaped), { width: W, height: H }, fmt) : null;\n const plot = f?.plot ?? { x: 0, y: 0, w: W, h: H };\n const ctx: MarkCtx = {\n spec: s,\n shaped,\n width: W,\n height: H,\n plot,\n x: f?.x ?? null,\n y: f?.y ?? null,\n y2: f?.y2 ?? null,\n fmt,\n label,\n tone,\n // Ramp bucket 0..9 over the colorBy field's extent (ctx.q; types.ts MarkCtx has no slot yet).\n q: (v) => (hi > lo ? Math.min(9, Math.max(0, Math.floor(((v - lo) / (hi - lo)) * 10))) : 9),\n agg: (kind: Aggregate) => (vs) => {\n const a = agg(kind);\n for (const v of vs) if (typeof v === \"number\") a.add(v);\n return a.value();\n },\n fail,\n t: (k, ...a) => t(s, k, ...a),\n };\n mark.check?.(spec, fail);\n\n let markLegend: string | null = null;\n let body = \"\";\n if (s.data.length === 0) {\n body = el(\n \"text\",\n {\n \"data-maya\": \"empty\",\n x: W / 2,\n y: H / 2,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n },\n esc(t(s, \"noData\")),\n );\n } else {\n const g = (name: string, c: string) => el(\"g\", { \"data-maya\": name }, c);\n const m = mark.draw(ctx);\n cap(m.marks.split(' data-maya=\"mark\"').length - 1); // scatter and modules draw per row/node\n markLegend = m.legend ?? null;\n body =\n g(\"grid\", m.grid ?? f?.grid ?? \"\") +\n g(\"axis-y\", f?.ay ?? \"\") +\n g(\"axis-x\", f?.ax ?? \"\") +\n g(\"marks\", m.marks) +\n g(\"labels\", (m.labels ?? \"\") + labels) +\n g(\"cross\", m.cross ?? \"\") +\n g(\"hits\", m.hits);\n }\n\n const vars: [string, string][] = [];\n if (Array.isArray(s.colors))\n (s.colors as readonly string[]).forEach((c, i) => vars.push([`--maya-series-${i + 1}`, c]));\n else if (s.colors)\n // ponytail: slot = the series' first-appearance index, so reordered rows move colours.\n for (const [k, c] of s.colors as ReadonlyMap<string, string>) {\n const j = shaped.series.indexOf(k);\n if (j >= 0) vars.push([`--maya-series-${(j % 8) + 1}`, c]);\n }\n for (const k in s.theme) vars.push([`--maya-${kebab(k)}`, s.theme[k as keyof typeof s.theme]!]);\n const style = vars.map(([k, v]) => `${k}:${v};`).join(\"\");\n\n const svg = el(\n \"svg\",\n {\n class: sheet === null ? \"maya-svg\" : \"maya-root maya-svg\",\n viewBox: `0 0 ${W} ${H}`,\n width: W,\n height: H,\n role: \"img\",\n // Standalone SVGs may share a page, so they can't use fixed ids; shadow roots scope them.\n \"aria-label\": sheet === null ? null : titleText(s),\n \"aria-labelledby\": sheet === null ? \"maya-t\" : null,\n \"aria-describedby\": sheet === null ? \"maya-d\" : null,\n tabindex: sheet === null ? \"0\" : null,\n style: sheet === null ? null : style || null,\n \"data-plot\": `${r(plot.x)} ${r(plot.y)} ${r(plot.w)} ${r(plot.h)}`,\n ...f?.attrs,\n \"data-dir\": s.horizontal ? \"h\" : null,\n },\n (sheet ? `<style>${sheet}</style>` : \"\") +\n el(\"title\", { id: sheet === null ? \"maya-t\" : null }, esc(titleText(s))) +\n el(\n \"desc\",\n { id: sheet === null ? \"maya-d\" : null },\n esc(describe(s, shaped, fmt, mark.noun)),\n ) +\n body,\n );\n\n let legend = \"\";\n if (markLegend !== null && s.legend) legend = markLegend;\n else if ((s.series !== null || s.y2 !== null) && s.legend)\n legend =\n `<div class=\"maya-legend\" data-maya=\"legend\">` +\n (s.series === null && s.y2 !== null\n ? `<span data-s=\"0\"><i></i>${esc(s.titles.get(s.y) ?? s.y)}</span>`\n : \"\") +\n (s.series === null ? [] : shaped.series)\n .map((k, i) =>\n el(\n \"button\",\n {\n type: \"button\",\n \"data-si\": i,\n \"data-s\": i % 8,\n \"data-key\": k,\n \"aria-pressed\": String(shaped.visible.includes(i)),\n },\n `<i></i>${esc(k)}`,\n ),\n )\n .join(\"\") +\n (s.y2 === null\n ? \"\"\n : `<span data-s=\"${shaped.series.length % 8}\" data-line><i></i>${esc(s.titles.get(s.y2) ?? s.y2)}</span>`) +\n `</div>`;\n else if (spec.legend !== false && cb !== null && s.series === null && s.type !== \"kpi\")\n legend =\n cb === \"sign\" || typeof cb === \"object\"\n ? `<div class=\"maya-legend\" data-maya=\"tone\">` +\n ([\"good\", \"bad\"] as const)\n .map(\n (n) =>\n `<span data-tone=\"${n}\"><i></i>${esc(t(s, cb === \"sign\" ? (n === \"good\" ? \"positive\" : \"negative\") : n === \"good\" ? \"above\" : \"below\"))}</span>`,\n )\n .join(\"\") +\n `</div>`\n : hi > lo\n ? `<div class=\"maya-legend\" data-maya=\"ramp\"><span>${esc(fmt(cb, lo))}</span><i></i><span>${esc(fmt(cb, hi))}</span></div>`\n : \"\";\n return {\n svg,\n legend,\n controls:\n s.measures.length > 1\n ? `<div class=\"maya-ctl\" role=\"radiogroup\" aria-label=\"${esc(t(s, \"measures\"))}\" data-n=\"${s.measures.length}\" data-i=\"${s.measure}\">` +\n s.measures\n .map(\n (m, i) =>\n `<button type=\"button\" role=\"radio\" aria-checked=\"${i === s.measure}\" data-i=\"${i}\" tabindex=\"${i === s.measure ? 0 : -1}\">${esc(s.titles.get(m) ?? m)}</button>`,\n )\n .join(\"\") +\n `</div>`\n : \"\",\n crumbs:\n s.drilled.length > 0\n ? `<nav class=\"maya-crumbs\" aria-label=\"${esc(t(s, \"crumbs\"))}\"><button type=\"button\" data-depth=\"0\">${esc(t(s, \"back\"))}</button>` +\n s.drilled\n .map(\n (v, i) =>\n `<span aria-hidden=\"true\">›</span><button type=\"button\" data-depth=\"${i + 1}\"${i === s.drilled.length - 1 ? ' aria-current=\"page\"' : \"\"}>${esc(String(v))}</button>`,\n )\n .join(\"\") +\n `</nav>`\n : s.drill\n ? `<div class=\"maya-crumbs\" aria-hidden=\"true\"></div>` // holds the row: no shift on drill\n : \"\",\n table: s.table ? dataTable(s, shaped, fmt, toneText) : \"\",\n title: s.title === null ? \"\" : `<div class=\"maya-title\">${esc(s.title)}</div>`,\n style,\n vars,\n warnings: [],\n };\n}\n\nexport function renderParts<R extends object = Row>(\n spec: ChartSpec<R> | ChartSpec,\n opts?: RenderOptions,\n): Parts {\n return build(spec as unknown as ChartSpec, opts, null);\n}\n\n/** Standalone SVG string with an embedded stylesheet. */\nexport function render<R extends object = Row>(\n spec: ChartSpec<R> | ChartSpec,\n opts?: RenderOptions,\n): string {\n return build(spec as unknown as ChartSpec, opts, css).svg;\n}\n\n/** Inner shadow-root markup, shared by renderShell and the element. Fixed slot order. */\nexport function shellInner(parts: Parts, css: string, nonce?: string): string {\n const st = parts.style ? ` style=\"${esc(parts.style)}\"` : \"\";\n const n = nonce ? ` nonce=\"${esc(nonce)}\"` : \"\";\n return (\n `${css ? `<style${n}>${css}</style>` : \"\"}<div class=\"maya\"${st}>${parts.title}${parts.controls}${parts.legend}${parts.crumbs}` +\n `<div class=\"maya-box\">${parts.svg}</div>${parts.table}` +\n `<div class=\"maya-sr\" data-maya=\"live\" aria-live=\"polite\"></div>` +\n `<div class=\"maya-probe\" data-maya=\"probe\"></div><div class=\"maya-tip\" popover=\"manual\" role=\"tooltip\"></div></div>`\n );\n}\n\n/** Rows cut to the fields the spec references (no data leakage into SSR HTML). */\nfunction project(spec: ChartSpec): ChartSpec {\n const keep = (o: object | string | undefined) => (typeof o === \"object\" ? Object.keys(o) : []);\n const fields = new Set<unknown>([\n spec.x,\n ...(typeof spec.y === \"string\" ? [spec.y] : spec.y),\n spec.series,\n spec.y2,\n spec.size,\n spec.name,\n ...(spec.path ?? []),\n typeof spec.colorBy === \"string\" ? spec.colorBy : undefined,\n ...keep(spec.format),\n ...keep(spec.titles),\n ]);\n return {\n ...spec,\n data: spec.data.map((row) =>\n Object.fromEntries(Object.entries(row).filter(([k]) => fields.has(k))),\n ),\n };\n}\n\n/** `<maya-chart>` with Declarative Shadow DOM. JSON child escapes `<` as <. */\nexport function renderShell<R extends object = Row>(\n spec: ChartSpec<R> | ChartSpec,\n opts?: RenderOptions,\n): string {\n const p = renderParts(spec, opts);\n const json = JSON.stringify(project(spec as unknown as ChartSpec)).replace(/</g, \"\\\\u003c\");\n return `<maya-chart><template shadowrootmode=\"open\">${shellInner(p, css, opts?.nonce)}</template><script type=\"application/json\">${json}</script></maya-chart>`;\n}\n"],"mappings":"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"}
|